mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-03 18:32:50 +00:00
Move the Thumb2 SSAT and USAT optional shift operator out of the
instruction opcode. This fixes part of PR7792. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111047 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0ad2c7ace8
commit
38aa2871fc
@ -1510,24 +1510,13 @@ def t2USADA8 : T2I_mac<0, 0b111, 0b0000, (outs rGPR:$dst),
|
||||
|
||||
// Signed/Unsigned saturate -- for disassembly only
|
||||
|
||||
def t2SSATlsl:T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos,rGPR:$a,i32imm:$shamt),
|
||||
NoItinerary, "ssat", "\t$dst, $bit_pos, $a, lsl $shamt",
|
||||
[/* For disassembly only; pattern left blank */]> {
|
||||
def t2SSAT: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a, sat_shift:$sh),
|
||||
NoItinerary, "ssat", "\t$dst, $bit_pos, $a$sh",
|
||||
[/* For disassembly only; pattern left blank */]> {
|
||||
let Inst{31-27} = 0b11110;
|
||||
let Inst{25-22} = 0b1100;
|
||||
let Inst{20} = 0;
|
||||
let Inst{15} = 0;
|
||||
let Inst{21} = 0; // sh = '0'
|
||||
}
|
||||
|
||||
def t2SSATasr:T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos,rGPR:$a,i32imm:$shamt),
|
||||
NoItinerary, "ssat", "\t$dst, $bit_pos, $a, asr $shamt",
|
||||
[/* For disassembly only; pattern left blank */]> {
|
||||
let Inst{31-27} = 0b11110;
|
||||
let Inst{25-22} = 0b1100;
|
||||
let Inst{20} = 0;
|
||||
let Inst{15} = 0;
|
||||
let Inst{21} = 1; // sh = '1'
|
||||
}
|
||||
|
||||
def t2SSAT16: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a), NoItinerary,
|
||||
@ -1542,24 +1531,13 @@ def t2SSAT16: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a), NoItinerary,
|
||||
let Inst{7-6} = 0b00; // imm2 = '00'
|
||||
}
|
||||
|
||||
def t2USATlsl:T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos,rGPR:$a,i32imm:$shamt),
|
||||
NoItinerary, "usat", "\t$dst, $bit_pos, $a, lsl $shamt",
|
||||
[/* For disassembly only; pattern left blank */]> {
|
||||
def t2USAT: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a, sat_shift:$sh),
|
||||
NoItinerary, "usat", "\t$dst, $bit_pos, $a$sh",
|
||||
[/* For disassembly only; pattern left blank */]> {
|
||||
let Inst{31-27} = 0b11110;
|
||||
let Inst{25-22} = 0b1110;
|
||||
let Inst{20} = 0;
|
||||
let Inst{15} = 0;
|
||||
let Inst{21} = 0; // sh = '0'
|
||||
}
|
||||
|
||||
def t2USATasr:T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos,rGPR:$a,i32imm:$shamt),
|
||||
NoItinerary, "usat", "\t$dst, $bit_pos, $a, asr $shamt",
|
||||
[/* For disassembly only; pattern left blank */]> {
|
||||
let Inst{31-27} = 0b11110;
|
||||
let Inst{25-22} = 0b1110;
|
||||
let Inst{20} = 0;
|
||||
let Inst{15} = 0;
|
||||
let Inst{21} = 1; // sh = '1'
|
||||
}
|
||||
|
||||
def t2USAT16: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a), NoItinerary,
|
||||
@ -1574,8 +1552,8 @@ def t2USAT16: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a), NoItinerary,
|
||||
let Inst{7-6} = 0b00; // imm2 = '00'
|
||||
}
|
||||
|
||||
def : T2Pat<(int_arm_ssat GPR:$a, imm:$pos), (t2SSATlsl imm:$pos, GPR:$a, 0)>;
|
||||
def : T2Pat<(int_arm_usat GPR:$a, imm:$pos), (t2USATlsl imm:$pos, GPR:$a, 0)>;
|
||||
def : T2Pat<(int_arm_ssat GPR:$a, imm:$pos), (t2SSAT imm:$pos, GPR:$a, 0)>;
|
||||
def : T2Pat<(int_arm_usat GPR:$a, imm:$pos), (t2USAT imm:$pos, GPR:$a, 0)>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Shift and rotate Instructions.
|
||||
|
@ -1462,8 +1462,8 @@ static bool DisassembleThumb2DPModImm(MCInst &MI, unsigned Opcode,
|
||||
|
||||
static inline bool Thumb2SaturateOpcode(unsigned Opcode) {
|
||||
switch (Opcode) {
|
||||
case ARM::t2SSATlsl: case ARM::t2SSATasr: case ARM::t2SSAT16:
|
||||
case ARM::t2USATlsl: case ARM::t2USATasr: case ARM::t2USAT16:
|
||||
case ARM::t2SSAT: case ARM::t2SSAT16:
|
||||
case ARM::t2USAT: case ARM::t2USAT16:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@ -1471,7 +1471,7 @@ static inline bool Thumb2SaturateOpcode(unsigned Opcode) {
|
||||
}
|
||||
|
||||
/// DisassembleThumb2Sat - Disassemble Thumb2 saturate instructions:
|
||||
/// o t2SSAT[lsl|asr], t2USAT[lsl|asr]: Rs sat_pos Rn shamt
|
||||
/// o t2SSAT, t2USAT: Rs sat_pos Rn shamt
|
||||
/// o t2SSAT16, t2USAT16: Rs sat_pos Rn
|
||||
static bool DisassembleThumb2Sat(MCInst &MI, unsigned Opcode, uint32_t insn,
|
||||
unsigned &NumOpsAdded, BO B) {
|
||||
@ -1483,9 +1483,7 @@ static bool DisassembleThumb2Sat(MCInst &MI, unsigned Opcode, uint32_t insn,
|
||||
decodeRs(insn))));
|
||||
|
||||
unsigned Pos = slice(insn, 4, 0);
|
||||
if (Opcode == ARM::t2SSATlsl ||
|
||||
Opcode == ARM::t2SSATasr ||
|
||||
Opcode == ARM::t2SSAT16)
|
||||
if (Opcode == ARM::t2SSAT || Opcode == ARM::t2SSAT16)
|
||||
Pos += 1;
|
||||
MI.addOperand(MCOperand::CreateImm(Pos));
|
||||
|
||||
@ -1493,11 +1491,17 @@ static bool DisassembleThumb2Sat(MCInst &MI, unsigned Opcode, uint32_t insn,
|
||||
decodeRn(insn))));
|
||||
|
||||
if (NumOpsAdded == 4) {
|
||||
ARM_AM::ShiftOpc Opc = (slice(insn, 21, 21) != 0 ?
|
||||
ARM_AM::asr : ARM_AM::lsl);
|
||||
// Inst{14-12:7-6} encodes the imm5 shift amount.
|
||||
unsigned ShAmt = slice(insn, 14, 12) << 2 | slice(insn, 7, 6);
|
||||
if ((Opcode == ARM::t2SSATasr || Opcode == ARM::t2USATasr) && ShAmt == 0)
|
||||
ShAmt = 32;
|
||||
MI.addOperand(MCOperand::CreateImm(ShAmt));
|
||||
if (ShAmt == 0) {
|
||||
if (Opc == ARM_AM::asr)
|
||||
ShAmt = 32;
|
||||
else
|
||||
Opc = ARM_AM::no_shift;
|
||||
}
|
||||
MI.addOperand(MCOperand::CreateImm(ARM_AM::getSORegOpc(Opc, ShAmt)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -51,6 +51,10 @@
|
||||
# CHECK: rsbs r0, r0, #0
|
||||
0x40 0x42
|
||||
|
||||
# CHECK-NOT: ssat r0, #17, r12, lsl #0
|
||||
# CHECK: ssat r0, #17, r12
|
||||
0x0c 0xf3 0x10 0x00
|
||||
|
||||
# CHECK: strd r0, [r7, #64]
|
||||
0xc7 0xe9 0x10 0x01
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user