mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Add basic support to code-gen the ARM/Thumb2 bit-field insert (BFI) instruction
and a combine pattern to use it for setting a bit-field to a constant value. More to come for non-constant stores. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108570 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1555,6 +1555,13 @@ static bool DisassembleThumb2DPBinImm(MCInst &MI, unsigned Opcode,
|
||||
++OpIdx;
|
||||
}
|
||||
|
||||
if (Opcode == ARM::t2BFI) {
|
||||
// Add val reg operand.
|
||||
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
|
||||
decodeRn(insn))));
|
||||
++OpIdx;
|
||||
}
|
||||
|
||||
assert(OpInfo[OpIdx].RegClass < 0 && !OpInfo[OpIdx].isPredicate()
|
||||
&& !OpInfo[OpIdx].isOptionalDef()
|
||||
&& "Pure imm operand expected");
|
||||
@@ -1567,7 +1574,7 @@ static bool DisassembleThumb2DPBinImm(MCInst &MI, unsigned Opcode,
|
||||
MI.addOperand(MCOperand::CreateImm(getIImm3Imm8(insn)));
|
||||
else if (Opcode == ARM::t2MOVi16 || Opcode == ARM::t2MOVTi16)
|
||||
MI.addOperand(MCOperand::CreateImm(getImm16(insn)));
|
||||
else if (Opcode == ARM::t2BFC) {
|
||||
else if (Opcode == ARM::t2BFC || Opcode == ARM::t2BFI) {
|
||||
uint32_t mask = 0;
|
||||
if (getBitfieldInvMask(insn, mask))
|
||||
MI.addOperand(MCOperand::CreateImm(mask));
|
||||
@@ -1575,17 +1582,10 @@ static bool DisassembleThumb2DPBinImm(MCInst &MI, unsigned Opcode,
|
||||
return false;
|
||||
} else {
|
||||
// Handle the case of: lsb width
|
||||
assert((Opcode == ARM::t2SBFX || Opcode == ARM::t2UBFX ||
|
||||
Opcode == ARM::t2BFI) && "Unexpected opcode");
|
||||
assert((Opcode == ARM::t2SBFX || Opcode == ARM::t2UBFX)
|
||||
&& "Unexpected opcode");
|
||||
MI.addOperand(MCOperand::CreateImm(getLsb(insn)));
|
||||
if (Opcode == ARM::t2BFI) {
|
||||
if (getMsb(insn) < getLsb(insn)) {
|
||||
DEBUG(errs() << "Encoding error: msb < lsb\n");
|
||||
return false;
|
||||
}
|
||||
MI.addOperand(MCOperand::CreateImm(getMsb(insn) - getLsb(insn) + 1));
|
||||
} else
|
||||
MI.addOperand(MCOperand::CreateImm(getWidthMinus1(insn) + 1));
|
||||
MI.addOperand(MCOperand::CreateImm(getWidthMinus1(insn) + 1));
|
||||
|
||||
++OpIdx;
|
||||
}
|
||||
|
Reference in New Issue
Block a user