474 changes: 474 additions & 0 deletions llvm/lib/Target/ARM/ARMInstrMVE.td

Large diffs are not rendered by default.

21 changes: 15 additions & 6 deletions llvm/lib/Target/ARM/ARMInstrThumb2.td
Original file line number Diff line number Diff line change
Expand Up @@ -212,31 +212,40 @@ def t2adrlabel : Operand<i32> {
}

// t2addrmode_posimm8 := reg + imm8
def MemPosImm8OffsetAsmOperand : AsmOperandClass {let Name="MemPosImm8Offset";}
def MemPosImm8OffsetAsmOperand : AsmOperandClass {
let Name="MemPosImm8Offset";
let RenderMethod = "addMemImmOffsetOperands";
}
def t2addrmode_posimm8 : MemOperand {
let PrintMethod = "printT2AddrModeImm8Operand<false>";
let EncoderMethod = "getT2AddrModeImm8OpValue";
let EncoderMethod = "getT2AddrModeImmOpValue<8,0>";
let DecoderMethod = "DecodeT2AddrModeImm8";
let ParserMatchClass = MemPosImm8OffsetAsmOperand;
let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
}

// t2addrmode_negimm8 := reg - imm8
def MemNegImm8OffsetAsmOperand : AsmOperandClass {let Name="MemNegImm8Offset";}
def MemNegImm8OffsetAsmOperand : AsmOperandClass {
let Name="MemNegImm8Offset";
let RenderMethod = "addMemImmOffsetOperands";
}
def t2addrmode_negimm8 : MemOperand,
ComplexPattern<i32, 2, "SelectT2AddrModeImm8", []> {
let PrintMethod = "printT2AddrModeImm8Operand<false>";
let EncoderMethod = "getT2AddrModeImm8OpValue";
let EncoderMethod = "getT2AddrModeImmOpValue<8,0>";
let DecoderMethod = "DecodeT2AddrModeImm8";
let ParserMatchClass = MemNegImm8OffsetAsmOperand;
let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
}

// t2addrmode_imm8 := reg +/- imm8
def MemImm8OffsetAsmOperand : AsmOperandClass { let Name = "MemImm8Offset"; }
def MemImm8OffsetAsmOperand : AsmOperandClass {
let Name = "MemImm8Offset";
let RenderMethod = "addMemImmOffsetOperands";
}
class T2AddrMode_Imm8 : MemOperand,
ComplexPattern<i32, 2, "SelectT2AddrModeImm8", []> {
let EncoderMethod = "getT2AddrModeImm8OpValue";
let EncoderMethod = "getT2AddrModeImmOpValue<8,0>";
let DecoderMethod = "DecodeT2AddrModeImm8";
let ParserMatchClass = MemImm8OffsetAsmOperand;
let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
Expand Down
291 changes: 253 additions & 38 deletions llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Large diffs are not rendered by default.

157 changes: 157 additions & 0 deletions llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,11 @@ static DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeMveAddrModeRQ(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder);
template<int shift>
static DecodeStatus DecodeMveAddrModeQ(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Insn,
Expand Down Expand Up @@ -428,8 +433,17 @@ static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
template<int shift>
static DecodeStatus DecodeT2Imm7(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
template<int shift>
static DecodeStatus DecodeTAddrModeImm7(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
template<int shift, int WriteBack>
static DecodeStatus DecodeT2AddrModeImm7(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Val,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn,
Expand Down Expand Up @@ -509,6 +523,15 @@ template<bool Writeback>
static DecodeStatus DecodeVSTRVLDR_SYSREG(MCInst &Inst, unsigned Insn,
uint64_t Address,
const void *Decoder);
template<int shift>
static DecodeStatus DecodeMVE_MEM_1_pre(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
template<int shift>
static DecodeStatus DecodeMVE_MEM_2_pre(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
template<int shift>
static DecodeStatus DecodeMVE_MEM_3_pre(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
template<unsigned MinLog, unsigned MaxLog>
static DecodeStatus DecodePowerTwoOperand(MCInst &Inst, unsigned Val,
uint64_t Address,
Expand Down Expand Up @@ -4138,6 +4161,21 @@ static DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val,
return MCDisassembler::Success;
}

template<int shift>
static DecodeStatus DecodeT2Imm7(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder) {
int imm = Val & 0x7F;
if (Val == 0)
imm = INT32_MIN;
else if (!(Val & 0x80))
imm *= -1;
if (imm != INT32_MIN)
imm <<= shift;
Inst.addOperand(MCOperand::createImm(imm));

return MCDisassembler::Success;
}

static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder) {
DecodeStatus S = MCDisassembler::Success;
Expand Down Expand Up @@ -4184,6 +4222,42 @@ static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
return S;
}

template<int shift>
static DecodeStatus DecodeTAddrModeImm7(MCInst &Inst, unsigned Val,
uint64_t Address,
const void *Decoder) {
DecodeStatus S = MCDisassembler::Success;

unsigned Rn = fieldFromInstruction(Val, 8, 3);
unsigned imm = fieldFromInstruction(Val, 0, 8);

if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
return MCDisassembler::Fail;
if (!Check(S, DecodeT2Imm7<shift>(Inst, imm, Address, Decoder)))
return MCDisassembler::Fail;

return S;
}

template<int shift, int WriteBack>
static DecodeStatus DecodeT2AddrModeImm7(MCInst &Inst, unsigned Val,
uint64_t Address,
const void *Decoder) {
DecodeStatus S = MCDisassembler::Success;

unsigned Rn = fieldFromInstruction(Val, 8, 4);
unsigned imm = fieldFromInstruction(Val, 0, 8);
if (WriteBack) {
if (!Check(S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
return MCDisassembler::Fail;
} else if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
return MCDisassembler::Fail;
if (!Check(S, DecodeT2Imm7<shift>(Inst, imm, Address, Decoder)))
return MCDisassembler::Fail;

return S;
}

static DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder) {
DecodeStatus S = MCDisassembler::Success;
Expand Down Expand Up @@ -4331,6 +4405,43 @@ static DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn,
return S;
}

static DecodeStatus DecodeMveAddrModeRQ(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder) {
DecodeStatus S = MCDisassembler::Success;
unsigned Rn = fieldFromInstruction(Insn, 3, 4);
unsigned Qm = fieldFromInstruction(Insn, 0, 3);

if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
return MCDisassembler::Fail;
if (!Check(S, DecodeMQPRRegisterClass(Inst, Qm, Address, Decoder)))
return MCDisassembler::Fail;

return S;
}

template<int shift>
static DecodeStatus DecodeMveAddrModeQ(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder) {
DecodeStatus S = MCDisassembler::Success;
unsigned Qm = fieldFromInstruction(Insn, 8, 3);
int imm = fieldFromInstruction(Insn, 0, 7);

if (!Check(S, DecodeMQPRRegisterClass(Inst, Qm, Address, Decoder)))
return MCDisassembler::Fail;

if(!fieldFromInstruction(Insn, 7, 1)) {
if (imm == 0)
imm = INT32_MIN; // indicate -0
else
imm *= -1;
}
if (imm != INT32_MIN)
imm <<= shift;
Inst.addOperand(MCOperand::createImm(imm));

return S;
}

static DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder) {
// Val is passed in as S:J1:J2:imm10H:imm10L:'0'
Expand Down Expand Up @@ -6175,6 +6286,52 @@ static DecodeStatus DecodeVSTRVLDR_SYSREG(MCInst &Inst, unsigned Val,
return S;
}

static inline DecodeStatus DecodeMVE_MEM_pre(
MCInst &Inst, unsigned Val, uint64_t Address, const void *Decoder,
unsigned Rn, OperandDecoder RnDecoder, OperandDecoder AddrDecoder) {
DecodeStatus S = MCDisassembler::Success;

unsigned Qd = fieldFromInstruction(Val, 13, 3);
unsigned addr = fieldFromInstruction(Val, 0, 7) |
(fieldFromInstruction(Val, 23, 1) << 7) | (Rn << 8);

if (!Check(S, RnDecoder(Inst, Rn, Address, Decoder)))
return MCDisassembler::Fail;
if (!Check(S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
return MCDisassembler::Fail;
if (!Check(S, AddrDecoder(Inst, addr, Address, Decoder)))
return MCDisassembler::Fail;

return S;
}

template <int shift>
static DecodeStatus DecodeMVE_MEM_1_pre(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder) {
return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder,
fieldFromInstruction(Val, 16, 3),
DecodetGPRRegisterClass,
DecodeTAddrModeImm7<shift>);
}

template <int shift>
static DecodeStatus DecodeMVE_MEM_2_pre(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder) {
return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder,
fieldFromInstruction(Val, 16, 4),
DecoderGPRRegisterClass,
DecodeT2AddrModeImm7<shift,1>);
}

template <int shift>
static DecodeStatus DecodeMVE_MEM_3_pre(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder) {
return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder,
fieldFromInstruction(Val, 17, 3),
DecodeMQPRRegisterClass,
DecodeMveAddrModeQ<shift>);
}

template<unsigned MinLog, unsigned MaxLog>
static DecodeStatus DecodePowerTwoOperand(MCInst &Inst, unsigned Val,
uint64_t Address,
Expand Down
4 changes: 3 additions & 1 deletion llvm/lib/Target/ARM/MCTargetDesc/ARMAddressingModes.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ namespace ARM_AM {
lsl,
lsr,
ror,
rrx
rrx,
uxtw
};

enum AddrOpc {
Expand All @@ -48,6 +49,7 @@ namespace ARM_AM {
case ARM_AM::lsr: return "lsr";
case ARM_AM::ror: return "ror";
case ARM_AM::rrx: return "rrx";
case ARM_AM::uxtw: return "uxtw";
}
}

Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ namespace ARMII {
AddrMode5FP16 = 17, // i8 * 2
AddrModeT2_ldrex = 18, // i8 * 4, with unscaled offset in MCInst
AddrModeT2_i7s4 = 19, // i7 * 4
AddrModeT2_i7s2 = 20, // i7 * 2
AddrModeT2_i7 = 21, // i7 * 1
};

inline static const char *AddrModeToString(AddrMode addrmode) {
Expand All @@ -227,6 +229,8 @@ namespace ARMII {
case AddrMode_i12: return "AddrMode_i12";
case AddrModeT2_ldrex:return "AddrModeT2_ldrex";
case AddrModeT2_i7s4: return "AddrModeT2_i7s4";
case AddrModeT2_i7s2: return "AddrModeT2_i7s2";
case AddrModeT2_i7: return "AddrModeT2_i7";
}
}

Expand Down
34 changes: 34 additions & 0 deletions llvm/lib/Target/ARM/MCTargetDesc/ARMInstPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,40 @@ void ARMInstPrinter::printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
<< markup(">");
}

template<int shift>
void ARMInstPrinter::printMveAddrModeRQOperand(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI,
raw_ostream &O) {
const MCOperand &MO1 = MI->getOperand(OpNum);
const MCOperand &MO2 = MI->getOperand(OpNum + 1);

O << markup("<mem:") << "[";
printRegName(O, MO1.getReg());
O << ", ";
printRegName(O, MO2.getReg());

if (shift > 0)
printRegImmShift(O, ARM_AM::uxtw, shift, UseMarkup);

O << "]" << markup(">");
}

void ARMInstPrinter::printMveAddrModeQOperand(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI,
raw_ostream &O) {
const MCOperand &MO1 = MI->getOperand(OpNum);
const MCOperand &MO2 = MI->getOperand(OpNum + 1);

O << markup("<mem:") << "[";
printRegName(O, MO1.getReg());

int64_t Imm = MO2.getImm();
if (Imm != 0)
O << ", " << markup("<imm:") << '#' << Imm << markup(">");

O << "]" << markup(">");
}

void ARMInstPrinter::printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI,
raw_ostream &O) {
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/Target/ARM/MCTargetDesc/ARMInstPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,11 @@ class ARMInstPrinter : public MCInstPrinter {
raw_ostream &O);
void printVPTMask(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI, raw_ostream &O);
template<int shift>
void printMveAddrModeRQOperand(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI, raw_ostream &O);
void printMveAddrModeQOperand(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI, raw_ostream &O);
void printExpandedImmOperand(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI, raw_ostream &O);

Expand Down
89 changes: 79 additions & 10 deletions llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,19 @@ class ARMMCCodeEmitter : public MCCodeEmitter {
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const;

/// getMveAddrModeRQOpValue - Return encoding info for 'reg, vreg'
/// operand.
uint32_t getMveAddrModeRQOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const;

/// getMveAddrModeQOpValue - Return encoding info for 'reg +/- imm7<<{shift}'
/// operand.
template<int shift>
uint32_t getMveAddrModeQOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const;

/// getLdStSORegOpValue - Return encoding info for 'reg +/- reg shop imm'
/// operand as needed by load/store instructions.
uint32_t getLdStSORegOpValue(const MCInst &MI, unsigned OpIdx,
Expand Down Expand Up @@ -238,8 +251,10 @@ class ARMMCCodeEmitter : public MCCodeEmitter {
case ARM_AM::asr: return 2;
case ARM_AM::ror:
case ARM_AM::rrx: return 3;
case ARM_AM::uxtw:
default:
llvm_unreachable("Invalid ShiftOpc!");
}
llvm_unreachable("Invalid ShiftOpc!");
}

/// getAddrMode2OffsetOpValue - Return encoding for am2offset operands.
Expand Down Expand Up @@ -338,7 +353,8 @@ class ARMMCCodeEmitter : public MCCodeEmitter {
unsigned getT2AddrModeSORegOpValue(const MCInst &MI, unsigned OpNum,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const;
unsigned getT2AddrModeImm8OpValue(const MCInst &MI, unsigned OpNum,
template<unsigned Bits, unsigned Shift>
unsigned getT2AddrModeImmOpValue(const MCInst &MI, unsigned OpNum,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const;
unsigned getT2AddrModeImm8OffsetOpValue(const MCInst &MI, unsigned OpNum,
Expand Down Expand Up @@ -1040,6 +1056,58 @@ getT2ScaledImmOpValue(const MCInst &MI, unsigned OpIdx,
Binary |= (1U << Bits);
return Binary;
}

/// getMveAddrModeRQOpValue - Return encoding info for 'reg, vreg'
/// operand.
uint32_t ARMMCCodeEmitter::
getMveAddrModeRQOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
// {6-3} Rn
// {2-0} Qm
const MCOperand &M0 = MI.getOperand(OpIdx);
const MCOperand &M1 = MI.getOperand(OpIdx + 1);

unsigned Rn = CTX.getRegisterInfo()->getEncodingValue(M0.getReg());
unsigned Qm = CTX.getRegisterInfo()->getEncodingValue(M1.getReg());

assert(Qm < 8 && "Qm is supposed to be encodable in 3 bits");

return (Rn << 3) | Qm;
}

/// getMveAddrModeRQOpValue - Return encoding info for 'reg, vreg'
/// operand.
template<int shift>
uint32_t ARMMCCodeEmitter::
getMveAddrModeQOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
// {10-8} Qm
// {7-0} Imm
const MCOperand &M0 = MI.getOperand(OpIdx);
const MCOperand &M1 = MI.getOperand(OpIdx + 1);

unsigned Qm = CTX.getRegisterInfo()->getEncodingValue(M0.getReg());
int32_t Imm = M1.getImm();

bool isAdd = Imm >= 0;

Imm >>= shift;

if (!isAdd)
Imm = -(uint32_t)Imm;

Imm &= 0x7f;

if (isAdd)
Imm |= 0x80;

assert(Qm < 8 && "Qm is supposed to be encodable in 3 bits");

return (Qm << 8) | Imm;
}

/// getT2AddrModeImm8s4OpValue - Return encoding info for
/// 'reg +/- imm8<<2' operand.
uint32_t ARMMCCodeEmitter::
Expand Down Expand Up @@ -1540,25 +1608,26 @@ getT2AddrModeSORegOpValue(const MCInst &MI, unsigned OpNum,
return Value;
}

template<unsigned Bits, unsigned Shift>
unsigned ARMMCCodeEmitter::
getT2AddrModeImm8OpValue(const MCInst &MI, unsigned OpNum,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
getT2AddrModeImmOpValue(const MCInst &MI, unsigned OpNum,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO1 = MI.getOperand(OpNum);
const MCOperand &MO2 = MI.getOperand(OpNum+1);

// FIXME: Needs fixup support.
unsigned Value = CTX.getRegisterInfo()->getEncodingValue(MO1.getReg());

// Even though the immediate is 8 bits long, we need 9 bits in order
// If the immediate is B bits long, we need B+1 bits in order
// to represent the (inverse of the) sign bit.
Value <<= 9;
int32_t tmp = (int32_t)MO2.getImm();
Value <<= (Bits + 1);
int32_t tmp = (int32_t)MO2.getImm() >> Shift;
if (tmp < 0)
tmp = abs(tmp);
else
Value |= 256; // Set the ADD bit
Value |= tmp & 255;
Value |= (1U << Bits); // Set the ADD bit
Value |= tmp & ((1U << Bits) - 1);
return Value;
}

Expand Down
14 changes: 10 additions & 4 deletions llvm/lib/Target/ARM/Thumb2InstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -610,17 +610,23 @@ bool llvm::rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
Offset = -Offset;
isSub = true;
}
} else if (AddrMode == ARMII::AddrModeT2_i7s4) {
} else if (AddrMode == ARMII::AddrModeT2_i7s4 ||
AddrMode == ARMII::AddrModeT2_i7s2 ||
AddrMode == ARMII::AddrModeT2_i7) {
Offset += MI.getOperand(FrameRegIdx + 1).getImm();
NumBits = 9; // 7 bits scaled by 4
unsigned OffsetMask = 0x3;
unsigned OffsetMask;
switch (AddrMode) {
case ARMII::AddrModeT2_i7s4: NumBits = 9; OffsetMask = 0x3; break;
case ARMII::AddrModeT2_i7s2: NumBits = 8; OffsetMask = 0x1; break;
default: NumBits = 7; OffsetMask = 0x0; break;
}
// MCInst operand expects already scaled value.
Scale = 1;
assert((Offset & OffsetMask) == 0 && "Can't encode this offset!");
(void)OffsetMask; // squash unused-variable warning at -NDEBUG
} else if (AddrMode == ARMII::AddrModeT2_i8s4) {
Offset += MI.getOperand(FrameRegIdx + 1).getImm() * 4;
NumBits = 10; // 8 bits scaled by 4
NumBits = 8 + 2;
// MCInst operand expects already scaled value.
Scale = 1;
assert((Offset & 3) == 0 && "Can't encode this offset!");
Expand Down
1,944 changes: 1,944 additions & 0 deletions llvm/test/MC/ARM/mve-load-store.s

Large diffs are not rendered by default.

1,378 changes: 1,378 additions & 0 deletions llvm/test/MC/Disassembler/ARM/mve-load-store.txt

Large diffs are not rendered by default.