mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
The MC code couldn't handle ARM LDR instructions with negative offsets:
vldr.64 d1, [r0, #-32] The problem was with how the addressing mode 5 encodes the offsets. This change makes sure that the way offsets are handled in addressing mode 5 is consistent throughout the MC code. It involves re-refactoring the "getAddrModeImmOpValue" method into an "Imm12" and "addressing mode 5" version. But not to worry! The majority of the duplicated code has been unified. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118144 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -51,25 +51,38 @@ def vfp_f64imm : Operand<f64>,
|
||||
//
|
||||
|
||||
let canFoldAsLoad = 1, isReMaterializable = 1 in {
|
||||
|
||||
def VLDRD : ADI5<0b1101, 0b01, (outs DPR:$Dd), (ins addrmode5:$addr),
|
||||
IIC_fpLoad64, "vldr", ".64\t$Dd, $addr",
|
||||
[(set DPR:$Dd, (f64 (load addrmode5:$addr)))]> {
|
||||
// Instruction operands.
|
||||
bits<5> Dd;
|
||||
bits<32> addr;
|
||||
bits<5> Dd;
|
||||
bits<13> addr;
|
||||
|
||||
// Encode instruction operands.
|
||||
let Inst{23} = addr{16}; // U (add = (U == '1'))
|
||||
let Inst{23} = addr{8}; // U (add = (U == '1'))
|
||||
let Inst{22} = Dd{4};
|
||||
let Inst{19-16} = addr{20-17}; // Rn
|
||||
let Inst{19-16} = addr{12-9}; // Rn
|
||||
let Inst{15-12} = Dd{3-0};
|
||||
let Inst{7-0} = addr{7-0}; // imm8
|
||||
}
|
||||
|
||||
def VLDRS : ASI5<0b1101, 0b01, (outs SPR:$dst), (ins addrmode5:$addr),
|
||||
IIC_fpLoad32, "vldr", ".32\t$dst, $addr",
|
||||
[(set SPR:$dst, (load addrmode5:$addr))]>;
|
||||
} // canFoldAsLoad
|
||||
def VLDRS : ASI5<0b1101, 0b01, (outs SPR:$Sd), (ins addrmode5:$addr),
|
||||
IIC_fpLoad32, "vldr", ".32\t$Sd, $addr",
|
||||
[(set SPR:$Sd, (load addrmode5:$addr))]> {
|
||||
// Instruction operands.
|
||||
bits<5> Sd;
|
||||
bits<13> addr;
|
||||
|
||||
// Encode instruction operands.
|
||||
let Inst{23} = addr{8}; // U (add = (U == '1'))
|
||||
let Inst{22} = Sd{0};
|
||||
let Inst{19-16} = addr{12-9}; // Rn
|
||||
let Inst{15-12} = Sd{4-1};
|
||||
let Inst{7-0} = addr{7-0}; // imm8
|
||||
}
|
||||
|
||||
} // End of 'let canFoldAsLoad = 1, isReMaterializable = 1 in'
|
||||
|
||||
def VSTRD : ADI5<0b1101, 0b00, (outs), (ins DPR:$src, addrmode5:$addr),
|
||||
IIC_fpStore64, "vstr", ".64\t$src, $addr",
|
||||
|
Reference in New Issue
Block a user