Optimize shift code generation
This commit is contained in:
parent
6fe76e478f
commit
52db653ec1
|
@ -1,5 +1,8 @@
|
||||||
rem @echo off
|
rem @echo off
|
||||||
|
|
||||||
|
@call :test rolrortest.cpp
|
||||||
|
@if %errorlevel% neq 0 goto :error
|
||||||
|
|
||||||
@call :test bitfields.cpp
|
@call :test bitfields.cpp
|
||||||
@if %errorlevel% neq 0 goto :error
|
@if %errorlevel% neq 0 goto :error
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
__noinline unsigned long rollright32(unsigned long a) {
|
||||||
|
unsigned long tmp = a & 1;
|
||||||
|
return ( a >> 1) + (tmp << 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
__noinline unsigned rollright16(unsigned a) {
|
||||||
|
unsigned tmp = a & 1;
|
||||||
|
return ( a >> 1) + (tmp << 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
__noinline char rollright8(char a) {
|
||||||
|
char tmp = a & 1;
|
||||||
|
return ( a >> 1) + (tmp << 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
__noinline unsigned long rollleft32(unsigned long a) {
|
||||||
|
unsigned long tmp = (a >> 31) & 1;
|
||||||
|
return ( a << 1) + tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
__noinline unsigned rollleft16(unsigned a) {
|
||||||
|
unsigned tmp = (a >> 15) & 1;
|
||||||
|
return ( a << 1) + tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
__noinline char rollleft8(char a) {
|
||||||
|
char tmp = (a >> 7) & 1;
|
||||||
|
return ( a << 1) + tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
unsigned long lv = 0x12345678ul;
|
||||||
|
unsigned val = 0x1234;
|
||||||
|
char c=0x12;
|
||||||
|
|
||||||
|
unsigned long lvt[33];
|
||||||
|
unsigned valt[17];
|
||||||
|
char ct[9];
|
||||||
|
|
||||||
|
lvt[0] = lv;
|
||||||
|
valt[0] = val;
|
||||||
|
ct[0] = c;
|
||||||
|
|
||||||
|
assert(rollleft8(rollright8(c)) == c);
|
||||||
|
assert(rollleft16(rollright16(val)) == val);
|
||||||
|
assert(rollleft32(rollright32(lv)) == lv);
|
||||||
|
|
||||||
|
for(int i=0; i<32; i++)
|
||||||
|
lvt[i + 1] = rollright32(lvt[i]);
|
||||||
|
for(int i=0; i<16; i++)
|
||||||
|
valt[i + 1] = rollright16(valt[i]);
|
||||||
|
for(int i=0; i<8; i++)
|
||||||
|
ct[i + 1] = rollright8(ct[i]);
|
||||||
|
|
||||||
|
for(int i=0; i<=32; i++)
|
||||||
|
{
|
||||||
|
assert(lvt[32 - i] == lv);
|
||||||
|
lv = rollleft32(lv);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=0; i<=16; i++)
|
||||||
|
{
|
||||||
|
assert(valt[16 - i] == val);
|
||||||
|
val = rollleft16(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=0; i<=8; i++)
|
||||||
|
{
|
||||||
|
assert(ct[8 - i] == c);
|
||||||
|
c = rollleft8(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1065,7 +1065,10 @@ bool Compiler::GenerateCode(void)
|
||||||
for (int i = 0; i < mNativeCodeGenerator->mProcedures.Size(); i++)
|
for (int i = 0; i < mNativeCodeGenerator->mProcedures.Size(); i++)
|
||||||
{
|
{
|
||||||
if (mCompilerOptions & COPT_VERBOSE2)
|
if (mCompilerOptions & COPT_VERBOSE2)
|
||||||
printf("Assemble native code <%s>\n", mNativeCodeGenerator->mProcedures[i]->mInterProc->mIdent->mString);
|
{
|
||||||
|
if (mNativeCodeGenerator->mProcedures[i]->mInterProc)
|
||||||
|
printf("Assemble native code <%s>\n", mNativeCodeGenerator->mProcedures[i]->mInterProc->mIdent->mString);
|
||||||
|
}
|
||||||
mNativeCodeGenerator->mProcedures[i]->Assemble();
|
mNativeCodeGenerator->mProcedures[i]->Assemble();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue