mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-30 07:00:57 +00:00
Create a new register class for the set of all GPRs except the PC. Use it to tighten our decoding of BFI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137168 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
18deb04e9c
commit
51c9805c4b
@ -3131,10 +3131,10 @@ def BFC : I<(outs GPR:$Rd), (ins GPR:$src, bf_inv_mask_imm:$imm),
|
||||
}
|
||||
|
||||
// A8.6.18 BFI - Bitfield insert (Encoding A1)
|
||||
def BFI : I<(outs GPR:$Rd), (ins GPR:$src, GPR:$Rn, bf_inv_mask_imm:$imm),
|
||||
def BFI : I<(outs GPRnopc:$Rd), (ins GPRnopc:$src, GPR:$Rn, bf_inv_mask_imm:$imm),
|
||||
AddrMode1, 4, IndexModeNone, DPFrm, IIC_iUNAsi,
|
||||
"bfi", "\t$Rd, $Rn, $imm", "$src = $Rd",
|
||||
[(set GPR:$Rd, (ARMbfi GPR:$src, GPR:$Rn,
|
||||
[(set GPRnopc:$Rd, (ARMbfi GPRnopc:$src, GPR:$Rn,
|
||||
bf_inv_mask_imm:$imm))]>,
|
||||
Requires<[IsARM, HasV6T2]> {
|
||||
bits<4> Rd;
|
||||
@ -3150,7 +3150,7 @@ def BFI : I<(outs GPR:$Rd), (ins GPR:$src, GPR:$Rn, bf_inv_mask_imm:$imm),
|
||||
|
||||
// GNU as only supports this form of bfi (w/ 4 arguments)
|
||||
let isAsmParserOnly = 1 in
|
||||
def BFI4p : I<(outs GPR:$Rd), (ins GPR:$src, GPR:$Rn,
|
||||
def BFI4p : I<(outs GPRnopc:$Rd), (ins GPRnopc:$src, GPR:$Rn,
|
||||
lsb_pos_imm:$lsb, width_imm:$width),
|
||||
AddrMode1, 4, IndexModeNone, DPFrm, IIC_iUNAsi,
|
||||
"bfi", "\t$Rd, $Rn, $lsb, $width", "$src = $Rd",
|
||||
|
@ -215,6 +215,16 @@ def GPR : RegisterClass<"ARM", [i32], 32, (add (sequence "R%u", 0, 12),
|
||||
}];
|
||||
}
|
||||
|
||||
// GPRs without the PC. Some ARM instructions do not allow the PC in
|
||||
// certain operand slots, particularly as the destination. Primarily
|
||||
// useful for disassembly.
|
||||
def GPRnopc : RegisterClass<"ARM", [i32], 32, (sub GPR, PC)> {
|
||||
let AltOrders = [(add LR, GPRnopc), (trunc GPRnopc, 8)];
|
||||
let AltOrderSelect = [{
|
||||
return 1 + MF.getTarget().getSubtarget<ARMSubtarget>().isThumb1Only();
|
||||
}];
|
||||
}
|
||||
|
||||
// restricted GPR register class. Many Thumb2 instructions allow the full
|
||||
// register range for operands, but have undefined behaviours when PC
|
||||
// or SP (R13 or R15) are used. The ARM ISA refers to these operands
|
||||
|
@ -28,6 +28,8 @@
|
||||
// Definitions are further down.
|
||||
static bool DecodeGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
|
||||
uint64_t Address, const void *Decoder);
|
||||
static bool DecodeGPRnopcRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
|
||||
uint64_t Address, const void *Decoder);
|
||||
static bool DecodetGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
|
||||
uint64_t Address, const void *Decoder);
|
||||
static bool DecodetcGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
|
||||
@ -471,6 +473,12 @@ static bool DecodeGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool DecodeGPRnopcRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
if (RegNo == 15) return false;
|
||||
return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
|
||||
}
|
||||
|
||||
static bool DecodetGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
|
||||
uint64_t Address, const void *Decoder) {
|
||||
if (RegNo > 7)
|
||||
|
@ -1,5 +1,4 @@
|
||||
# RUN: llvm-mc --disassemble %s -triple=arm-apple-darwin9 |& grep {invalid instruction encoding}
|
||||
# XFAIL: *
|
||||
|
||||
# Opcode=60 Name=BFI Format=ARM_FORMAT_DPFRM(4)
|
||||
# 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
||||
|
@ -555,6 +555,7 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type,
|
||||
const std::string &name) {
|
||||
REG("GPR");
|
||||
REG("rGPR");
|
||||
REG("GPRnopc");
|
||||
REG("tcGPR");
|
||||
REG("cc_out");
|
||||
REG("s_cc_out");
|
||||
|
Loading…
Reference in New Issue
Block a user