macros -> Inline functions

Lauros's patch


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32656 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2006-12-18 11:07:09 +00:00
parent 1bd82a5c65
commit 3ef39ca6a1

View File

@ -35,9 +35,13 @@ static bool hasFP(const MachineFunction &MF) {
return NoFramePointerElim || MFI->hasVarSizedObjects(); return NoFramePointerElim || MFI->hasVarSizedObjects();
} }
#define ROTATE32L(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) static inline unsigned rotateL(unsigned x, unsigned n){
return ((x << n) | (x >> (32 - n)));
}
#define ROTATE32R(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) static inline unsigned rotateR(unsigned x, unsigned n){
return ((x >> n) | (x << (32 - n)));
}
// finds the end position of largest sequence of zeros in binary representation // finds the end position of largest sequence of zeros in binary representation
// of 'immediate'. // of 'immediate'.
@ -50,19 +54,19 @@ static int findLargestZeroSequence(unsigned immediate){
int end_pos; int end_pos;
while ((immediate & 0x3) == 0) { while ((immediate & 0x3) == 0) {
immediate = ROTATE32R(immediate, 2); immediate = rotateR(immediate, 2);
pos+=2; pos+=2;
} }
end_pos = pos+32; end_pos = pos+32;
while (pos<end_pos){ while (pos<end_pos){
while ((immediate & 0x3) != 0) { while ((immediate & 0x3) != 0) {
immediate = ROTATE32R(immediate, 2); immediate = rotateR(immediate, 2);
pos+=2; pos+=2;
} }
zero_pos = pos; zero_pos = pos;
while ((immediate & 0x3) == 0) { while ((immediate & 0x3) == 0) {
immediate = ROTATE32R(immediate, 2); immediate = rotateR(immediate, 2);
pos+=2; pos+=2;
} }
zero_length = pos - zero_pos; zero_length = pos - zero_pos;
@ -90,19 +94,19 @@ static void splitInstructionWithImmediate(MachineBasicBlock &BB,
} }
int start_pos = findLargestZeroSequence(immediate); int start_pos = findLargestZeroSequence(immediate);
unsigned immediate_tmp = ROTATE32R(immediate, start_pos); unsigned immediate_tmp = rotateR(immediate, start_pos);
int pos = 0; int pos = 0;
while (pos < 32){ while (pos < 32){
while(((immediate_tmp&0x3) == 0)&&(pos<32)){ while(((immediate_tmp&0x3) == 0)&&(pos<32)){
immediate_tmp = ROTATE32R(immediate_tmp,2); immediate_tmp = rotateR(immediate_tmp,2);
pos+=2; pos+=2;
} }
if (pos < 32){ if (pos < 32){
BuildMI(BB, I, TID, DestReg).addReg(OrigReg) BuildMI(BB, I, TID, DestReg).addReg(OrigReg)
.addImm(ROTATE32L(immediate_tmp&0xFF, (start_pos + pos) % 32 )) .addImm(rotateL(immediate_tmp&0xFF, (start_pos + pos) % 32 ))
.addImm(0).addImm(ARMShift::LSL); .addImm(0).addImm(ARMShift::LSL);
immediate_tmp = ROTATE32R(immediate_tmp,8); immediate_tmp = rotateR(immediate_tmp,8);
pos+=8; pos+=8;
} }
} }