mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
Fix a few typos, implement load/store
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4716 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e4ae94c367
commit
6fc3c52359
@ -6,16 +6,17 @@
|
|||||||
|
|
||||||
#include "X86.h"
|
#include "X86.h"
|
||||||
#include "X86InstrInfo.h"
|
#include "X86InstrInfo.h"
|
||||||
|
#include "X86InstrBuilder.h"
|
||||||
#include "llvm/Function.h"
|
#include "llvm/Function.h"
|
||||||
#include "llvm/iTerminators.h"
|
#include "llvm/iTerminators.h"
|
||||||
#include "llvm/iOperators.h"
|
#include "llvm/iOperators.h"
|
||||||
#include "llvm/iOther.h"
|
#include "llvm/iOther.h"
|
||||||
#include "llvm/iPHINode.h"
|
#include "llvm/iPHINode.h"
|
||||||
|
#include "llvm/iMemory.h"
|
||||||
#include "llvm/Type.h"
|
#include "llvm/Type.h"
|
||||||
#include "llvm/Constants.h"
|
#include "llvm/Constants.h"
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
#include "llvm/CodeGen/MachineFunction.h"
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
|
||||||
#include "llvm/Support/InstVisitor.h"
|
#include "llvm/Support/InstVisitor.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -74,10 +75,14 @@ namespace {
|
|||||||
void visitXor(BinaryOperator &B) { visitSimpleBinary(B, 4); }
|
void visitXor(BinaryOperator &B) { visitSimpleBinary(B, 4); }
|
||||||
|
|
||||||
// Binary comparison operators
|
// Binary comparison operators
|
||||||
|
void visitSetCondInst(SetCondInst &I);
|
||||||
|
|
||||||
|
// Memory Instructions
|
||||||
|
void visitLoadInst(LoadInst &I);
|
||||||
|
void visitStoreInst(StoreInst &I);
|
||||||
|
|
||||||
// Other operators
|
// Other operators
|
||||||
void visitShiftInst(ShiftInst &I);
|
void visitShiftInst(ShiftInst &I);
|
||||||
void visitSetCondInst(SetCondInst &I);
|
|
||||||
void visitPHINode(PHINode &I);
|
void visitPHINode(PHINode &I);
|
||||||
|
|
||||||
void visitInstruction(Instruction &I) {
|
void visitInstruction(Instruction &I) {
|
||||||
@ -325,7 +330,7 @@ ISel::visitSetCondInst (SetCondInst & I)
|
|||||||
/// ret long, ulong : Move value into EAX/EDX (?) and return
|
/// ret long, ulong : Move value into EAX/EDX (?) and return
|
||||||
/// ret float/double : ? Top of FP stack? XMM0?
|
/// ret float/double : ? Top of FP stack? XMM0?
|
||||||
///
|
///
|
||||||
void ISel::visitReturnInst (ReturnInst & I) {
|
void ISel::visitReturnInst (ReturnInst &I) {
|
||||||
if (I.getNumOperands() == 0) {
|
if (I.getNumOperands() == 0) {
|
||||||
// Emit a 'ret' instruction
|
// Emit a 'ret' instruction
|
||||||
BuildMI(BB, X86::RET, 0);
|
BuildMI(BB, X86::RET, 0);
|
||||||
@ -333,24 +338,22 @@ void ISel::visitReturnInst (ReturnInst & I) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned val = getReg(I.getOperand(0));
|
unsigned val = getReg(I.getOperand(0));
|
||||||
unsigned Class = getClass(I.getType());
|
unsigned Class = getClass(I.getOperand(0)->getType());
|
||||||
bool isUnsigned = I.getOperand(0)->getType()->isUnsigned();
|
bool isUnsigned = I.getOperand(0)->getType()->isUnsigned();
|
||||||
switch (Class) {
|
switch (Class) {
|
||||||
case cByte:
|
case cByte:
|
||||||
// ret sbyte, ubyte: Extend value into EAX and return
|
// ret sbyte, ubyte: Extend value into EAX and return
|
||||||
if (isUnsigned) {
|
if (isUnsigned)
|
||||||
BuildMI (BB, X86::MOVZXr32r8, 1, X86::EAX).addReg (val);
|
BuildMI (BB, X86::MOVZXr32r8, 1, X86::EAX).addReg (val);
|
||||||
} else {
|
else
|
||||||
BuildMI (BB, X86::MOVSXr32r8, 1, X86::EAX).addReg (val);
|
BuildMI (BB, X86::MOVSXr32r8, 1, X86::EAX).addReg (val);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case cShort:
|
case cShort:
|
||||||
// ret short, ushort: Extend value into EAX and return
|
// ret short, ushort: Extend value into EAX and return
|
||||||
if (unsignedReturnValue) {
|
if (isUnsigned)
|
||||||
BuildMI (BB, X86::MOVZXr32r16, 1, X86::EAX).addReg (val);
|
BuildMI (BB, X86::MOVZXr32r16, 1, X86::EAX).addReg (val);
|
||||||
} else {
|
else
|
||||||
BuildMI (BB, X86::MOVSXr32r16, 1, X86::EAX).addReg (val);
|
BuildMI (BB, X86::MOVSXr32r16, 1, X86::EAX).addReg (val);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case cInt:
|
case cInt:
|
||||||
// ret int, uint, ptr: Move value into EAX and return
|
// ret int, uint, ptr: Move value into EAX and return
|
||||||
@ -434,7 +437,7 @@ void ISel::visitMul(BinaryOperator &I) {
|
|||||||
static const unsigned MovOpcode[]={ X86::MOVrr8, X86::MOVrr16, X86::MOVrr32 };
|
static const unsigned MovOpcode[]={ X86::MOVrr8, X86::MOVrr16, X86::MOVrr32 };
|
||||||
|
|
||||||
unsigned Reg = Regs[Class];
|
unsigned Reg = Regs[Class];
|
||||||
unsigned Op0Reg = getReg(I.getOperand(1));
|
unsigned Op0Reg = getReg(I.getOperand(0));
|
||||||
unsigned Op1Reg = getReg(I.getOperand(1));
|
unsigned Op1Reg = getReg(I.getOperand(1));
|
||||||
|
|
||||||
// Put the first operand into one of the A registers...
|
// Put the first operand into one of the A registers...
|
||||||
@ -472,7 +475,7 @@ void ISel::visitDivRem(BinaryOperator &I) {
|
|||||||
bool isSigned = I.getType()->isSigned();
|
bool isSigned = I.getType()->isSigned();
|
||||||
unsigned Reg = Regs[Class];
|
unsigned Reg = Regs[Class];
|
||||||
unsigned ExtReg = ExtRegs[Class];
|
unsigned ExtReg = ExtRegs[Class];
|
||||||
unsigned Op0Reg = getReg(I.getOperand(1));
|
unsigned Op0Reg = getReg(I.getOperand(0));
|
||||||
unsigned Op1Reg = getReg(I.getOperand(1));
|
unsigned Op1Reg = getReg(I.getOperand(1));
|
||||||
|
|
||||||
// Put the first operand into one of the A registers...
|
// Put the first operand into one of the A registers...
|
||||||
@ -558,6 +561,36 @@ void ISel::visitShiftInst (ShiftInst &I) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// visitLoadInst - Implement LLVM load instructions in terms of the x86 'mov'
|
||||||
|
/// instruction.
|
||||||
|
///
|
||||||
|
void ISel::visitLoadInst(LoadInst &I) {
|
||||||
|
unsigned Class = getClass(I.getType());
|
||||||
|
if (Class > 2) // FIXME: Handle longs and others...
|
||||||
|
visitInstruction(I);
|
||||||
|
|
||||||
|
static const unsigned Opcode[] = { X86::MOVmr8, X86::MOVmr16, X86::MOVmr32 };
|
||||||
|
|
||||||
|
unsigned AddressReg = getReg(I.getOperand(0));
|
||||||
|
addDirectMem(BuildMI(BB, Opcode[Class], 4, getReg(I)), AddressReg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// visitStoreInst - Implement LLVM store instructions in terms of the x86 'mov'
|
||||||
|
/// instruction.
|
||||||
|
///
|
||||||
|
void ISel::visitStoreInst(StoreInst &I) {
|
||||||
|
unsigned Class = getClass(I.getOperand(0)->getType());
|
||||||
|
if (Class > 2) // FIXME: Handle longs and others...
|
||||||
|
visitInstruction(I);
|
||||||
|
|
||||||
|
static const unsigned Opcode[] = { X86::MOVrm8, X86::MOVrm16, X86::MOVrm32 };
|
||||||
|
|
||||||
|
unsigned ValReg = getReg(I.getOperand(0));
|
||||||
|
unsigned AddressReg = getReg(I.getOperand(1));
|
||||||
|
addDirectMem(BuildMI(BB, Opcode[Class], 1+4), AddressReg).addReg(ValReg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// visitPHINode - Turn an LLVM PHI node into an X86 PHI node...
|
/// visitPHINode - Turn an LLVM PHI node into an X86 PHI node...
|
||||||
///
|
///
|
||||||
void ISel::visitPHINode(PHINode &PN) {
|
void ISel::visitPHINode(PHINode &PN) {
|
||||||
|
@ -6,16 +6,17 @@
|
|||||||
|
|
||||||
#include "X86.h"
|
#include "X86.h"
|
||||||
#include "X86InstrInfo.h"
|
#include "X86InstrInfo.h"
|
||||||
|
#include "X86InstrBuilder.h"
|
||||||
#include "llvm/Function.h"
|
#include "llvm/Function.h"
|
||||||
#include "llvm/iTerminators.h"
|
#include "llvm/iTerminators.h"
|
||||||
#include "llvm/iOperators.h"
|
#include "llvm/iOperators.h"
|
||||||
#include "llvm/iOther.h"
|
#include "llvm/iOther.h"
|
||||||
#include "llvm/iPHINode.h"
|
#include "llvm/iPHINode.h"
|
||||||
|
#include "llvm/iMemory.h"
|
||||||
#include "llvm/Type.h"
|
#include "llvm/Type.h"
|
||||||
#include "llvm/Constants.h"
|
#include "llvm/Constants.h"
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
#include "llvm/CodeGen/MachineFunction.h"
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
|
||||||
#include "llvm/Support/InstVisitor.h"
|
#include "llvm/Support/InstVisitor.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -74,10 +75,14 @@ namespace {
|
|||||||
void visitXor(BinaryOperator &B) { visitSimpleBinary(B, 4); }
|
void visitXor(BinaryOperator &B) { visitSimpleBinary(B, 4); }
|
||||||
|
|
||||||
// Binary comparison operators
|
// Binary comparison operators
|
||||||
|
void visitSetCondInst(SetCondInst &I);
|
||||||
|
|
||||||
|
// Memory Instructions
|
||||||
|
void visitLoadInst(LoadInst &I);
|
||||||
|
void visitStoreInst(StoreInst &I);
|
||||||
|
|
||||||
// Other operators
|
// Other operators
|
||||||
void visitShiftInst(ShiftInst &I);
|
void visitShiftInst(ShiftInst &I);
|
||||||
void visitSetCondInst(SetCondInst &I);
|
|
||||||
void visitPHINode(PHINode &I);
|
void visitPHINode(PHINode &I);
|
||||||
|
|
||||||
void visitInstruction(Instruction &I) {
|
void visitInstruction(Instruction &I) {
|
||||||
@ -325,7 +330,7 @@ ISel::visitSetCondInst (SetCondInst & I)
|
|||||||
/// ret long, ulong : Move value into EAX/EDX (?) and return
|
/// ret long, ulong : Move value into EAX/EDX (?) and return
|
||||||
/// ret float/double : ? Top of FP stack? XMM0?
|
/// ret float/double : ? Top of FP stack? XMM0?
|
||||||
///
|
///
|
||||||
void ISel::visitReturnInst (ReturnInst & I) {
|
void ISel::visitReturnInst (ReturnInst &I) {
|
||||||
if (I.getNumOperands() == 0) {
|
if (I.getNumOperands() == 0) {
|
||||||
// Emit a 'ret' instruction
|
// Emit a 'ret' instruction
|
||||||
BuildMI(BB, X86::RET, 0);
|
BuildMI(BB, X86::RET, 0);
|
||||||
@ -333,24 +338,22 @@ void ISel::visitReturnInst (ReturnInst & I) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned val = getReg(I.getOperand(0));
|
unsigned val = getReg(I.getOperand(0));
|
||||||
unsigned Class = getClass(I.getType());
|
unsigned Class = getClass(I.getOperand(0)->getType());
|
||||||
bool isUnsigned = I.getOperand(0)->getType()->isUnsigned();
|
bool isUnsigned = I.getOperand(0)->getType()->isUnsigned();
|
||||||
switch (Class) {
|
switch (Class) {
|
||||||
case cByte:
|
case cByte:
|
||||||
// ret sbyte, ubyte: Extend value into EAX and return
|
// ret sbyte, ubyte: Extend value into EAX and return
|
||||||
if (isUnsigned) {
|
if (isUnsigned)
|
||||||
BuildMI (BB, X86::MOVZXr32r8, 1, X86::EAX).addReg (val);
|
BuildMI (BB, X86::MOVZXr32r8, 1, X86::EAX).addReg (val);
|
||||||
} else {
|
else
|
||||||
BuildMI (BB, X86::MOVSXr32r8, 1, X86::EAX).addReg (val);
|
BuildMI (BB, X86::MOVSXr32r8, 1, X86::EAX).addReg (val);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case cShort:
|
case cShort:
|
||||||
// ret short, ushort: Extend value into EAX and return
|
// ret short, ushort: Extend value into EAX and return
|
||||||
if (unsignedReturnValue) {
|
if (isUnsigned)
|
||||||
BuildMI (BB, X86::MOVZXr32r16, 1, X86::EAX).addReg (val);
|
BuildMI (BB, X86::MOVZXr32r16, 1, X86::EAX).addReg (val);
|
||||||
} else {
|
else
|
||||||
BuildMI (BB, X86::MOVSXr32r16, 1, X86::EAX).addReg (val);
|
BuildMI (BB, X86::MOVSXr32r16, 1, X86::EAX).addReg (val);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case cInt:
|
case cInt:
|
||||||
// ret int, uint, ptr: Move value into EAX and return
|
// ret int, uint, ptr: Move value into EAX and return
|
||||||
@ -434,7 +437,7 @@ void ISel::visitMul(BinaryOperator &I) {
|
|||||||
static const unsigned MovOpcode[]={ X86::MOVrr8, X86::MOVrr16, X86::MOVrr32 };
|
static const unsigned MovOpcode[]={ X86::MOVrr8, X86::MOVrr16, X86::MOVrr32 };
|
||||||
|
|
||||||
unsigned Reg = Regs[Class];
|
unsigned Reg = Regs[Class];
|
||||||
unsigned Op0Reg = getReg(I.getOperand(1));
|
unsigned Op0Reg = getReg(I.getOperand(0));
|
||||||
unsigned Op1Reg = getReg(I.getOperand(1));
|
unsigned Op1Reg = getReg(I.getOperand(1));
|
||||||
|
|
||||||
// Put the first operand into one of the A registers...
|
// Put the first operand into one of the A registers...
|
||||||
@ -472,7 +475,7 @@ void ISel::visitDivRem(BinaryOperator &I) {
|
|||||||
bool isSigned = I.getType()->isSigned();
|
bool isSigned = I.getType()->isSigned();
|
||||||
unsigned Reg = Regs[Class];
|
unsigned Reg = Regs[Class];
|
||||||
unsigned ExtReg = ExtRegs[Class];
|
unsigned ExtReg = ExtRegs[Class];
|
||||||
unsigned Op0Reg = getReg(I.getOperand(1));
|
unsigned Op0Reg = getReg(I.getOperand(0));
|
||||||
unsigned Op1Reg = getReg(I.getOperand(1));
|
unsigned Op1Reg = getReg(I.getOperand(1));
|
||||||
|
|
||||||
// Put the first operand into one of the A registers...
|
// Put the first operand into one of the A registers...
|
||||||
@ -558,6 +561,36 @@ void ISel::visitShiftInst (ShiftInst &I) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// visitLoadInst - Implement LLVM load instructions in terms of the x86 'mov'
|
||||||
|
/// instruction.
|
||||||
|
///
|
||||||
|
void ISel::visitLoadInst(LoadInst &I) {
|
||||||
|
unsigned Class = getClass(I.getType());
|
||||||
|
if (Class > 2) // FIXME: Handle longs and others...
|
||||||
|
visitInstruction(I);
|
||||||
|
|
||||||
|
static const unsigned Opcode[] = { X86::MOVmr8, X86::MOVmr16, X86::MOVmr32 };
|
||||||
|
|
||||||
|
unsigned AddressReg = getReg(I.getOperand(0));
|
||||||
|
addDirectMem(BuildMI(BB, Opcode[Class], 4, getReg(I)), AddressReg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// visitStoreInst - Implement LLVM store instructions in terms of the x86 'mov'
|
||||||
|
/// instruction.
|
||||||
|
///
|
||||||
|
void ISel::visitStoreInst(StoreInst &I) {
|
||||||
|
unsigned Class = getClass(I.getOperand(0)->getType());
|
||||||
|
if (Class > 2) // FIXME: Handle longs and others...
|
||||||
|
visitInstruction(I);
|
||||||
|
|
||||||
|
static const unsigned Opcode[] = { X86::MOVrm8, X86::MOVrm16, X86::MOVrm32 };
|
||||||
|
|
||||||
|
unsigned ValReg = getReg(I.getOperand(0));
|
||||||
|
unsigned AddressReg = getReg(I.getOperand(1));
|
||||||
|
addDirectMem(BuildMI(BB, Opcode[Class], 1+4), AddressReg).addReg(ValReg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// visitPHINode - Turn an LLVM PHI node into an X86 PHI node...
|
/// visitPHINode - Turn an LLVM PHI node into an X86 PHI node...
|
||||||
///
|
///
|
||||||
void ISel::visitPHINode(PHINode &PN) {
|
void ISel::visitPHINode(PHINode &PN) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user