forked from OSchip/llvm-project
Changes to compile with GCC 2.96
Changes to support configurable pointer size and endianness llvm-svn: 5130
This commit is contained in:
parent
ccc2c7e8a7
commit
cfcd0603d0
|
|
@ -37,7 +37,7 @@ inline static MachineInstrBuilder BMI(MachineBasicBlock *MBB,
|
||||||
unsigned DestReg) {
|
unsigned DestReg) {
|
||||||
assert(I >= MBB->begin() && I <= MBB->end() && "Bad iterator!");
|
assert(I >= MBB->begin() && I <= MBB->end() && "Bad iterator!");
|
||||||
MachineInstr *MI = new MachineInstr(Opcode, NumOperands+1, true, true);
|
MachineInstr *MI = new MachineInstr(Opcode, NumOperands+1, true, true);
|
||||||
I = ++MBB->insert(I, MI);
|
I = MBB->insert(I, MI)+1;
|
||||||
return MachineInstrBuilder(MI).addReg(DestReg, MOTy::Def);
|
return MachineInstrBuilder(MI).addReg(DestReg, MOTy::Def);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,7 +49,7 @@ inline static MachineInstrBuilder BMI(MachineBasicBlock *MBB,
|
||||||
unsigned NumOperands) {
|
unsigned NumOperands) {
|
||||||
assert(I > MBB->begin() && I <= MBB->end() && "Bad iterator!");
|
assert(I > MBB->begin() && I <= MBB->end() && "Bad iterator!");
|
||||||
MachineInstr *MI = new MachineInstr(Opcode, NumOperands, true, true);
|
MachineInstr *MI = new MachineInstr(Opcode, NumOperands, true, true);
|
||||||
I = ++MBB->insert(I, MI);
|
I = MBB->insert(I, MI)+1;
|
||||||
return MachineInstrBuilder(MI);
|
return MachineInstrBuilder(MI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -816,17 +816,43 @@ void ISel::visitShiftInst (ShiftInst &I) {
|
||||||
|
|
||||||
|
|
||||||
/// visitLoadInst - Implement LLVM load instructions in terms of the x86 'mov'
|
/// visitLoadInst - Implement LLVM load instructions in terms of the x86 'mov'
|
||||||
/// instruction.
|
/// instruction. The load and store instructions are the only place where we
|
||||||
|
/// need to worry about the memory layout of the target machine.
|
||||||
///
|
///
|
||||||
void ISel::visitLoadInst(LoadInst &I) {
|
void ISel::visitLoadInst(LoadInst &I) {
|
||||||
|
bool isLittleEndian = TM.getTargetData().isLittleEndian();
|
||||||
|
bool hasLongPointers = TM.getTargetData().getPointerSize() == 8;
|
||||||
|
|
||||||
unsigned Class = getClass(I.getType());
|
unsigned Class = getClass(I.getType());
|
||||||
if (Class > 2) // FIXME: Handle longs and others...
|
if (Class > 2) // FIXME: Handle longs and others...
|
||||||
visitInstruction(I);
|
visitInstruction(I);
|
||||||
|
|
||||||
static const unsigned Opcode[] = { X86::MOVmr8, X86::MOVmr16, X86::MOVmr32 };
|
static const unsigned Opcode[] = { X86::MOVmr8, X86::MOVmr16, X86::MOVmr32 };
|
||||||
|
unsigned SrcAddrReg = getReg(I.getOperand(0));
|
||||||
|
|
||||||
unsigned AddressReg = getReg(I.getOperand(0));
|
// We need to adjust the input pointer if we are emulating a big-endian
|
||||||
addDirectMem(BuildMI(BB, Opcode[Class], 4, getReg(I)), AddressReg);
|
// long-pointer target. On these systems, the pointer that we are interested
|
||||||
|
// in is in the upper part of the eight byte memory image of the pointer. It
|
||||||
|
// also happens to be byte-swapped, but this will be handled later.
|
||||||
|
//
|
||||||
|
if (!isLittleEndian && hasLongPointers && isa<PointerType>(I.getType())) {
|
||||||
|
unsigned R = makeAnotherReg(Type::UIntTy);
|
||||||
|
BuildMI(BB, X86::ADDri32, 2, R).addReg(SrcAddrReg).addZImm(4);
|
||||||
|
SrcAddrReg = R;
|
||||||
|
}
|
||||||
|
unsigned DestReg = getReg(I);
|
||||||
|
unsigned IReg = DestReg;
|
||||||
|
if (!isLittleEndian) { // If big endian we need an intermediate stage
|
||||||
|
IReg = makeAnotherReg(I.getType());
|
||||||
|
std::swap(IReg, DestReg);
|
||||||
|
}
|
||||||
|
addDirectMem(BuildMI(BB, Opcode[Class], 4, DestReg), SrcAddrReg);
|
||||||
|
|
||||||
|
if (!isLittleEndian) {
|
||||||
|
// Emit the byte swap instruction...
|
||||||
|
static const unsigned BSWAPOpcode[] = { X86::MOVrr8, X86::BSWAPr16, X86::BSWAPr32 };
|
||||||
|
BuildMI(BB, BSWAPOpcode[Class], 1, IReg).addReg(DestReg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -834,6 +860,8 @@ void ISel::visitLoadInst(LoadInst &I) {
|
||||||
/// instruction.
|
/// instruction.
|
||||||
///
|
///
|
||||||
void ISel::visitStoreInst(StoreInst &I) {
|
void ISel::visitStoreInst(StoreInst &I) {
|
||||||
|
bool isLittleEndian = TM.getTargetData().isLittleEndian();
|
||||||
|
bool hasLongPointers = TM.getTargetData().getPointerSize() == 8;
|
||||||
unsigned Class = getClass(I.getOperand(0)->getType());
|
unsigned Class = getClass(I.getOperand(0)->getType());
|
||||||
if (Class > 2) // FIXME: Handle longs and others...
|
if (Class > 2) // FIXME: Handle longs and others...
|
||||||
visitInstruction(I);
|
visitInstruction(I);
|
||||||
|
|
@ -842,6 +870,21 @@ void ISel::visitStoreInst(StoreInst &I) {
|
||||||
|
|
||||||
unsigned ValReg = getReg(I.getOperand(0));
|
unsigned ValReg = getReg(I.getOperand(0));
|
||||||
unsigned AddressReg = getReg(I.getOperand(1));
|
unsigned AddressReg = getReg(I.getOperand(1));
|
||||||
|
|
||||||
|
if (!isLittleEndian && hasLongPointers && isa<PointerType>(I.getOperand(0)->getType())) {
|
||||||
|
unsigned R = makeAnotherReg(Type::UIntTy);
|
||||||
|
BuildMI(BB, X86::ADDri32, 2, R).addReg(AddressReg).addZImm(4);
|
||||||
|
AddressReg = R;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isLittleEndian && Class) {
|
||||||
|
// Emit the byte swap instruction...
|
||||||
|
static const unsigned BSWAPOpcode[] = { X86::MOVrr8, X86::BSWAPr16, X86::BSWAPr32 };
|
||||||
|
unsigned R = makeAnotherReg(I.getOperand(0)->getType());
|
||||||
|
BuildMI(BB, BSWAPOpcode[Class], 1, R).addReg(ValReg);
|
||||||
|
ValReg = R;
|
||||||
|
}
|
||||||
|
|
||||||
addDirectMem(BuildMI(BB, Opcode[Class], 1+4), AddressReg).addReg(ValReg);
|
addDirectMem(BuildMI(BB, Opcode[Class], 1+4), AddressReg).addReg(ValReg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -983,7 +1026,7 @@ void ISel::emitGEPOperation(MachineBasicBlock *MBB,
|
||||||
// be constant, we can get its value and use it to find the
|
// be constant, we can get its value and use it to find the
|
||||||
// right byte offset from the StructLayout class's list of
|
// right byte offset from the StructLayout class's list of
|
||||||
// structure member offsets.
|
// structure member offsets.
|
||||||
unsigned idxValue = CUI->getValue ();
|
unsigned idxValue = CUI->getValue();
|
||||||
unsigned memberOffset =
|
unsigned memberOffset =
|
||||||
TD.getStructLayout (StTy)->MemberOffsets[idxValue];
|
TD.getStructLayout (StTy)->MemberOffsets[idxValue];
|
||||||
// Emit an ADD to add memberOffset to the basePtr.
|
// Emit an ADD to add memberOffset to the basePtr.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue