mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-17 06:33:21 +00:00
When using a 4 byte jump table on a 64 bit machine,
do an extending load of the 4 bytes rather than a potentially illegal (type) i32 load followed by a sign extend. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60945 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8c0f244c3e
commit
712f7b3f54
@ -1951,23 +1951,15 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
unsigned EntrySize = MF.getJumpTableInfo()->getEntrySize();
|
||||
Index= DAG.getNode(ISD::MUL, PTy, Index, DAG.getConstant(EntrySize, PTy));
|
||||
SDValue Addr = DAG.getNode(ISD::ADD, PTy, Index, Table);
|
||||
|
||||
SDValue LD;
|
||||
switch (EntrySize) {
|
||||
default: assert(0 && "Size of jump table not supported yet."); break;
|
||||
case 4: LD = DAG.getLoad(MVT::i32, Chain, Addr,
|
||||
PseudoSourceValue::getJumpTable(), 0); break;
|
||||
case 8: LD = DAG.getLoad(MVT::i64, Chain, Addr,
|
||||
PseudoSourceValue::getJumpTable(), 0); break;
|
||||
}
|
||||
|
||||
MVT MemVT = MVT::getIntegerVT(EntrySize * 8);
|
||||
SDValue LD = DAG.getExtLoad(ISD::SEXTLOAD, PTy, Chain, Addr,
|
||||
PseudoSourceValue::getJumpTable(), 0, MemVT);
|
||||
Addr = LD;
|
||||
if (TLI.getTargetMachine().getRelocationModel() == Reloc::PIC_) {
|
||||
// For PIC, the sequence is:
|
||||
// BRIND(load(Jumptable + index) + RelocBase)
|
||||
// RelocBase can be JumpTable, GOT or some sort of global base.
|
||||
if (PTy != MVT::i32)
|
||||
Addr = DAG.getNode(ISD::SIGN_EXTEND, PTy, Addr);
|
||||
Addr = DAG.getNode(ISD::ADD, PTy, Addr,
|
||||
TLI.getPICJumpTableRelocBase(Table, DAG));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user