mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-14 15:28:20 +00:00
The Mips64InstrInfo.td definitions DynAlloc64 LEA_ADDiu64
were using a class defined for 32 bit instructions and thus the instruction was for addiu instead of daddiu. This was corrected by adding the instruction opcode as a field in the base class to be filled in by the defs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161359 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -208,13 +208,11 @@ def DCLO : CountLeading1<0x25, "dclo", CPU64Regs>;
|
|||||||
def DSBH : SubwordSwap<0x24, 0x2, "dsbh", CPU64Regs>;
|
def DSBH : SubwordSwap<0x24, 0x2, "dsbh", CPU64Regs>;
|
||||||
def DSHD : SubwordSwap<0x24, 0x5, "dshd", CPU64Regs>;
|
def DSHD : SubwordSwap<0x24, 0x5, "dshd", CPU64Regs>;
|
||||||
|
|
||||||
def LEA_ADDiu64 : EffectiveAddress<"daddiu\t$rt, $addr", CPU64Regs, mem_ea_64>;
|
def LEA_ADDiu64 : EffectiveAddress<0x19,"daddiu\t$rt, $addr", CPU64Regs, mem_ea_64>;
|
||||||
}
|
}
|
||||||
let Uses = [SP_64], DecoderNamespace = "Mips64" in
|
let Uses = [SP_64], DecoderNamespace = "Mips64" in
|
||||||
def DynAlloc64 : EffectiveAddress<"daddiu\t$rt, $addr", CPU64Regs, mem_ea_64>,
|
def DynAlloc64 : EffectiveAddress<0x19,"daddiu\t$rt, $addr", CPU64Regs, mem_ea_64>,
|
||||||
Requires<[IsN64, HasStandardEncoding]> {
|
Requires<[IsN64, HasStandardEncoding]>;
|
||||||
let isCodeGenOnly = 1;
|
|
||||||
}
|
|
||||||
let DecoderNamespace = "Mips64" in {
|
let DecoderNamespace = "Mips64" in {
|
||||||
def RDHWR64 : ReadHardware<CPU64Regs, HWRegs64>;
|
def RDHWR64 : ReadHardware<CPU64Regs, HWRegs64>;
|
||||||
|
|
||||||
|
@@ -722,9 +722,11 @@ class MoveToLOHI<bits<6> func, string instr_asm, RegisterClass RC,
|
|||||||
let neverHasSideEffects = 1;
|
let neverHasSideEffects = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
class EffectiveAddress<string instr_asm, RegisterClass RC, Operand Mem> :
|
class EffectiveAddress<bits<6> opc, string instr_asm, RegisterClass RC, Operand Mem> :
|
||||||
FMem<0x09, (outs RC:$rt), (ins Mem:$addr),
|
FMem<opc, (outs RC:$rt), (ins Mem:$addr),
|
||||||
instr_asm, [(set RC:$rt, addr:$addr)], IIAlu>;
|
instr_asm, [(set RC:$rt, addr:$addr)], IIAlu> {
|
||||||
|
let isCodeGenOnly = 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Count Leading Ones/Zeros in Word
|
// Count Leading Ones/Zeros in Word
|
||||||
class CountLeading0<bits<6> func, string instr_asm, RegisterClass RC>:
|
class CountLeading0<bits<6> func, string instr_asm, RegisterClass RC>:
|
||||||
@@ -1045,17 +1047,13 @@ let addr=0 in
|
|||||||
// instructions. The same not happens for stack address copies, so an
|
// instructions. The same not happens for stack address copies, so an
|
||||||
// add op with mem ComplexPattern is used and the stack address copy
|
// add op with mem ComplexPattern is used and the stack address copy
|
||||||
// can be matched. It's similar to Sparc LEA_ADDRi
|
// can be matched. It's similar to Sparc LEA_ADDRi
|
||||||
def LEA_ADDiu : EffectiveAddress<"addiu\t$rt, $addr", CPURegs, mem_ea> {
|
def LEA_ADDiu : EffectiveAddress<0x09,"addiu\t$rt, $addr", CPURegs, mem_ea>;
|
||||||
let isCodeGenOnly = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// DynAlloc node points to dynamically allocated stack space.
|
// DynAlloc node points to dynamically allocated stack space.
|
||||||
// $sp is added to the list of implicitly used registers to prevent dead code
|
// $sp is added to the list of implicitly used registers to prevent dead code
|
||||||
// elimination from removing instructions that modify $sp.
|
// elimination from removing instructions that modify $sp.
|
||||||
let Uses = [SP] in
|
let Uses = [SP] in
|
||||||
def DynAlloc : EffectiveAddress<"addiu\t$rt, $addr", CPURegs, mem_ea> {
|
def DynAlloc : EffectiveAddress<0x09,"addiu\t$rt, $addr", CPURegs, mem_ea>;
|
||||||
let isCodeGenOnly = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// MADD*/MSUB*
|
// MADD*/MSUB*
|
||||||
def MADD : MArithR<0, "madd", MipsMAdd, 1>;
|
def MADD : MArithR<0, "madd", MipsMAdd, 1>;
|
||||||
|
18
test/MC/Mips/lea_64.ll
Normal file
18
test/MC/Mips/lea_64.ll
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
; RUN: llc -march=mips64el -filetype=obj -mcpu=mips64r2 %s -o - \
|
||||||
|
; RUN: | llvm-objdump -disassemble -triple mips64el - \
|
||||||
|
; RUN: | FileCheck %s
|
||||||
|
|
||||||
|
@p = external global i32*
|
||||||
|
|
||||||
|
define void @f1() nounwind {
|
||||||
|
entry:
|
||||||
|
; CHECK: .text:
|
||||||
|
; CHECK-NOT: addiu {{[0-9,a-f]+}}, {{[0-9,a-f]+}}, {{[0-9]+}}
|
||||||
|
|
||||||
|
%a = alloca [10 x i32], align 4
|
||||||
|
%arraydecay = getelementptr inbounds [10 x i32]* %a, i64 0, i64 0
|
||||||
|
store i32* %arraydecay, i32** @p, align 8
|
||||||
|
ret void
|
||||||
|
|
||||||
|
; CHECK: jr $ra
|
||||||
|
}
|
Reference in New Issue
Block a user