Skip to content

Commit e710797

Browse files
authored
Recommit "[RISCV] Add Qualcomm uC Xqcisync (Sync Delay) extension (#132184)" (#132520)
With a minor fix for the build failures. Original message: This extension adds nine instructions, eight for non-memory-mapped devices synchronization and delay instruction. The current spec can be found at: https://github.com/quic/riscv-unified-db/releases/tag/Xqci-0.7.0 This patch adds assembler only support. Co-authored-by: Sudharsan Veeravalli [email protected]
1 parent 34f8012 commit e710797

File tree

14 files changed

+317
-13
lines changed

14 files changed

+317
-13
lines changed

clang/test/Driver/print-supported-extensions-riscv.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
// CHECK-NEXT: xqcilsm 0.2 'Xqcilsm' (Qualcomm uC Load Store Multiple Extension)
214214
// CHECK-NEXT: xqcisim 0.2 'Xqcisim' (Qualcomm uC Simulation Hint Extension)
215215
// CHECK-NEXT: xqcisls 0.2 'Xqcisls' (Qualcomm uC Scaled Load Store Extension)
216+
// CHECK-NEXT: xqcisync 0.2 'Xqcisync' (Qualcomm uC Sync Delay Extension)
216217
// CHECK-NEXT: xrivosvisni 0.1 'XRivosVisni' (Rivos Vector Integer Small New)
217218
// CHECK-NEXT: xrivosvizip 0.1 'XRivosVizip' (Rivos Vector Register Zips)
218219
// CHECK-EMPTY:

llvm/docs/RISCVUsage.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,9 @@ The current vendor extensions supported are:
485485
``experimental-Xqcisls``
486486
LLVM implements `version 0.2 of the Qualcomm uC Scaled Load Store extension specification <https://github.com/quic/riscv-unified-db/releases/latest>`__ by Qualcomm. All instructions are prefixed with `qc.` as described in the specification. These instructions are only available for riscv32.
487487

488+
``experimental-Xqcisync``
489+
LLVM implements `version 0.2 of the Qualcomm uC Sync Delay extension specification <https://github.com/quic/riscv-unified-db/releases/latest>`__ by Qualcomm. All instructions are prefixed with `qc.` as described in the specification. These instructions are only available for riscv32.
490+
488491
``Xmipscmove``
489492
LLVM implements conditional move for the `p8700 processor <https://mips.com/products/hardware/p8700/>` by MIPS.
490493

llvm/docs/ReleaseNotes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ Changes to the RISC-V Backend
140140
* Added non-quadratic ``log-vrgather`` cost model for ``vrgather.vv`` instruction
141141
* Adds experimental assembler support for the Qualcomm uC 'Xqcisim` (Simulation Hint)
142142
extension.
143+
* Adds experimental assembler support for the Qualcomm uC 'Xqcisync` (Sync Delay)
144+
extension.
143145
* Adds assembler support for the 'Zilsd` (Load/Store Pair Instructions)
144146
extension.
145147
* Adds assembler support for the 'Zclsd` (Compressed Load/Store Pair Instructions)

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,18 @@ struct RISCVOperand final : public MCParsedAsmOperand {
772772
VK == RISCVMCExpr::VK_None;
773773
}
774774

775+
bool isUImm5Slist() const {
776+
if (!isImm())
777+
return false;
778+
RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
779+
int64_t Imm;
780+
bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
781+
return IsConstantImm &&
782+
((Imm == 0) || (Imm == 1) || (Imm == 2) || (Imm == 4) ||
783+
(Imm == 8) || (Imm == 16) || (Imm == 15) || (Imm == 31)) &&
784+
VK == RISCVMCExpr::VK_None;
785+
}
786+
775787
bool isUImm8GE32() const {
776788
int64_t Imm;
777789
RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
@@ -1655,6 +1667,11 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
16551667
return generateImmOutOfRangeError(Operands, ErrorInfo, 1, (1 << 5));
16561668
case Match_InvalidUImm5GE6Plus1:
16571669
return generateImmOutOfRangeError(Operands, ErrorInfo, 6, (1 << 5));
1670+
case Match_InvalidUImm5Slist: {
1671+
SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc();
1672+
return Error(ErrorLoc,
1673+
"immediate must be one of: 0, 1, 2, 4, 8, 15, 16, 31");
1674+
}
16581675
case Match_InvalidUImm6:
16591676
return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 6) - 1);
16601677
case Match_InvalidUImm7:

llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,15 @@ static DecodeStatus decodeUImmPlus1OperandGE(MCInst &Inst, uint32_t Imm,
370370
return MCDisassembler::Success;
371371
}
372372

373+
static DecodeStatus decodeUImmSlistOperand(MCInst &Inst, uint32_t Imm,
374+
int64_t Address,
375+
const MCDisassembler *Decoder) {
376+
assert(isUInt<3>(Imm) && "Invalid Slist immediate");
377+
const uint8_t Slist[] = {0, 1, 2, 4, 8, 16, 15, 31};
378+
Inst.addOperand(MCOperand::createImm(Slist[Imm]));
379+
return MCDisassembler::Success;
380+
}
381+
373382
static DecodeStatus decodeUImmLog2XLenOperand(MCInst &Inst, uint32_t Imm,
374383
int64_t Address,
375384
const MCDisassembler *Decoder) {
@@ -663,14 +672,15 @@ static constexpr FeatureBitset XRivosFeatureGroup = {
663672
};
664673

665674
static constexpr FeatureBitset XqciFeatureGroup = {
666-
RISCV::FeatureVendorXqcia, RISCV::FeatureVendorXqciac,
667-
RISCV::FeatureVendorXqcibi, RISCV::FeatureVendorXqcibm,
668-
RISCV::FeatureVendorXqcicli, RISCV::FeatureVendorXqcicm,
669-
RISCV::FeatureVendorXqcics, RISCV::FeatureVendorXqcicsr,
670-
RISCV::FeatureVendorXqciint, RISCV::FeatureVendorXqcilb,
671-
RISCV::FeatureVendorXqcili, RISCV::FeatureVendorXqcilia,
672-
RISCV::FeatureVendorXqcilo, RISCV::FeatureVendorXqcilsm,
673-
RISCV::FeatureVendorXqcisim, RISCV::FeatureVendorXqcisls,
675+
RISCV::FeatureVendorXqcia, RISCV::FeatureVendorXqciac,
676+
RISCV::FeatureVendorXqcibi, RISCV::FeatureVendorXqcibm,
677+
RISCV::FeatureVendorXqcicli, RISCV::FeatureVendorXqcicm,
678+
RISCV::FeatureVendorXqcics, RISCV::FeatureVendorXqcicsr,
679+
RISCV::FeatureVendorXqciint, RISCV::FeatureVendorXqcilb,
680+
RISCV::FeatureVendorXqcili, RISCV::FeatureVendorXqcilia,
681+
RISCV::FeatureVendorXqcilo, RISCV::FeatureVendorXqcilsm,
682+
RISCV::FeatureVendorXqcisim, RISCV::FeatureVendorXqcisls,
683+
RISCV::FeatureVendorXqcisync,
674684
};
675685

676686
static constexpr FeatureBitset XSfVectorGroup = {

llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ enum OperandType : unsigned {
299299
OPERAND_UIMM5_PLUS1,
300300
OPERAND_UIMM5_GE6_PLUS1,
301301
OPERAND_UIMM5_LSB0,
302+
OPERAND_UIMM5_SLIST,
302303
OPERAND_UIMM6,
303304
OPERAND_UIMM6_LSB0,
304305
OPERAND_UIMM7,

llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ class RISCVMCCodeEmitter : public MCCodeEmitter {
8484
SmallVectorImpl<MCFixup> &Fixups,
8585
const MCSubtargetInfo &STI) const;
8686

87+
uint64_t getImmOpValueSlist(const MCInst &MI, unsigned OpNo,
88+
SmallVectorImpl<MCFixup> &Fixups,
89+
const MCSubtargetInfo &STI) const;
90+
8791
uint64_t getImmOpValueAsr1(const MCInst &MI, unsigned OpNo,
8892
SmallVectorImpl<MCFixup> &Fixups,
8993
const MCSubtargetInfo &STI) const;
@@ -404,6 +408,36 @@ RISCVMCCodeEmitter::getImmOpValueMinus1(const MCInst &MI, unsigned OpNo,
404408
return 0;
405409
}
406410

411+
uint64_t
412+
RISCVMCCodeEmitter::getImmOpValueSlist(const MCInst &MI, unsigned OpNo,
413+
SmallVectorImpl<MCFixup> &Fixups,
414+
const MCSubtargetInfo &STI) const {
415+
const MCOperand &MO = MI.getOperand(OpNo);
416+
assert(MO.isImm() && "Slist operand must be immediate");
417+
418+
uint64_t Res = MO.getImm();
419+
switch (Res) {
420+
case 0:
421+
return 0;
422+
case 1:
423+
return 1;
424+
case 2:
425+
return 2;
426+
case 4:
427+
return 3;
428+
case 8:
429+
return 4;
430+
case 16:
431+
return 5;
432+
case 15:
433+
return 6;
434+
case 31:
435+
return 7;
436+
default:
437+
llvm_unreachable("Unhandled Slist value!");
438+
}
439+
}
440+
407441
uint64_t
408442
RISCVMCCodeEmitter::getImmOpValueAsr1(const MCInst &MI, unsigned OpNo,
409443
SmallVectorImpl<MCFixup> &Fixups,

llvm/lib/Target/RISCV/RISCVFeatures.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1448,6 +1448,14 @@ def HasVendorXqcisim
14481448
AssemblerPredicate<(all_of FeatureVendorXqcisim),
14491449
"'Xqcisim' (Qualcomm uC Simulation Hint Extension)">;
14501450

1451+
def FeatureVendorXqcisync
1452+
: RISCVExperimentalExtension<0, 2, "Qualcomm uC Sync Delay Extension",
1453+
[FeatureStdExtZca]>;
1454+
def HasVendorXqcisync
1455+
: Predicate<"Subtarget->hasVendorXqcisync()">,
1456+
AssemblerPredicate<(all_of FeatureVendorXqcisync),
1457+
"'Xqcisync' (Qualcomm uC Sync Delay Extension)">;
1458+
14511459
// Rivos Extension(s)
14521460

14531461
def FeatureVendorXRivosVisni

llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ def uimm5ge6_plus1 : RISCVOp<XLenVT>, ImmLeaf<XLenVT,
5050
let OperandType = "OPERAND_UIMM5_GE6_PLUS1";
5151
}
5252

53+
def uimm5slist : RISCVOp<XLenVT>, ImmLeaf<XLenVT,
54+
[{return ((Imm == 0) ||
55+
(Imm == 1) ||
56+
(Imm == 2) ||
57+
(Imm == 4) ||
58+
(Imm == 8) ||
59+
(Imm == 16) ||
60+
(Imm == 15) ||
61+
(Imm == 31));}]> {
62+
let ParserMatchClass = UImmAsmOperand<5, "Slist">;
63+
let EncoderMethod = "getImmOpValueSlist";
64+
let DecoderMethod = "decodeUImmSlistOperand";
65+
let OperandType = "OPERAND_UIMM5_SLIST";
66+
}
67+
5368
def uimm10 : RISCVUImmLeafOp<10>;
5469

5570
def uimm11 : RISCVUImmLeafOp<11>;
@@ -364,6 +379,27 @@ class QCISim_RS1<bits<4> imm11_8, string opcodestr>
364379
let imm12 = {imm11_8, 0b00000000};
365380
}
366381

382+
let mayLoad = 0, mayStore = 0, hasSideEffects = 1 in
383+
class QCISync_UIMM5<bits<4> imm11_8, string opcodestr>
384+
: RVInstI<0b011, OPC_OP_IMM, (outs), (ins uimm5:$imm5), opcodestr, "$imm5">
385+
{
386+
bits<5> imm5;
387+
388+
let rs1 = 0;
389+
let rd = 0;
390+
let imm12 = {imm11_8, 0b000, imm5};
391+
}
392+
393+
let mayLoad = 0, mayStore = 0, hasSideEffects = 1 in
394+
class QCIRVInst16CBSYNC<bits<3> imm5_func2, string OpcodeStr>
395+
: RVInst16CB<0b100, 0b01, (outs), (ins uimm5slist:$slist), OpcodeStr, "$slist"> {
396+
bits<3> slist;
397+
398+
let Inst{6-2} = 0;
399+
let Inst{9-7} = slist;
400+
let Inst{12-10} = imm5_func2;
401+
}
402+
367403
class QCIRVInstEIBase<bits<3> funct3, bits<2> funct2, dag outs,
368404
dag ins, string opcodestr, string argstr>
369405
: RVInst48<outs, ins, opcodestr, argstr, [], InstFormatOther> {
@@ -753,6 +789,27 @@ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
753789
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
754790
} // Predicates = [HasVendorXqcilia, IsRV32]
755791

792+
let Predicates = [HasVendorXqcisync, IsRV32] in {
793+
def QC_SYNC : QCISync_UIMM5<0b0001, "qc.sync">;
794+
def QC_SYNCR : QCISync_UIMM5<0b0010, "qc.syncr">;
795+
def QC_SYNCWF : QCISync_UIMM5<0b0100, "qc.syncwf">;
796+
def QC_SYNCWL : QCISync_UIMM5<0b1000, "qc.syncwl">;
797+
798+
def QC_C_SYNC : QCIRVInst16CBSYNC<0b000, "qc.c.sync">;
799+
def QC_C_SYNCR : QCIRVInst16CBSYNC<0b001, "qc.c.syncr">;
800+
def QC_C_SYNCWF : QCIRVInst16CBSYNC<0b100, "qc.c.syncwf">;
801+
def QC_C_SYNCWL : QCIRVInst16CBSYNC<0b101, "qc.c.syncwl">;
802+
803+
let mayLoad = 0, mayStore = 0, hasSideEffects = 1 in
804+
def QC_C_DELAY : RVInst16CI<0b000, 0b10, (outs),
805+
(ins uimm5nonzero:$imm),
806+
"qc.c.delay", "$imm"> {
807+
let Inst{12} = 0;
808+
let Inst{11-7} = 0;
809+
let Inst{6-2} = imm{4-0};
810+
}
811+
} // Predicates = [HasVendorXqcisync, IsRV32]
812+
756813
let Predicates = [HasVendorXqcisim, IsRV32] in {
757814
let mayLoad = 0, mayStore = 0, hasSideEffects = 1 in {
758815
def QC_PSYSCALLI : RVInstI<0b010, OPC_OP_IMM, (outs), (ins uimm10:$imm10),

llvm/lib/TargetParser/RISCVISAInfo.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -744,10 +744,10 @@ Error RISCVISAInfo::checkDependency() {
744744
bool HasXqccmp = Exts.count("xqccmp") != 0;
745745

746746
static constexpr StringLiteral XqciExts[] = {
747-
{"xqcia"}, {"xqciac"}, {"xqcibi"}, {"xqcibm"},
748-
{"xqcicli"}, {"xqcicm"}, {"xqcics"}, {"xqcicsr"},
749-
{"xqciint"}, {"xqcilb"}, {"xqcili"}, {"xqcilia"},
750-
{"xqcilo"}, {"xqcilsm"}, {"xqcisim"}, {"xqcisls"}};
747+
{"xqcia"}, {"xqciac"}, {"xqcibi"}, {"xqcibm"}, {"xqcicli"},
748+
{"xqcicm"}, {"xqcics"}, {"xqcicsr"}, {"xqciint"}, {"xqcilb"},
749+
{"xqcili"}, {"xqcilia"}, {"xqcilo"}, {"xqcilsm"}, {"xqcisim"},
750+
{"xqcisls"}, {"xqcisync"}};
751751
static constexpr StringLiteral ZcdOverlaps[] = {
752752
{"zcmt"}, {"zcmp"}, {"xqccmp"}, {"xqciac"}, {"xqcicm"}};
753753

llvm/test/CodeGen/RISCV/attributes.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcilo %s -o - | FileCheck --check-prefix=RV32XQCILO %s
9898
; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcilsm %s -o - | FileCheck --check-prefix=RV32XQCILSM %s
9999
; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcisim %s -o - | FileCheck --check-prefix=RV32XQCISIM %s
100+
; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcisync %s -o - | FileCheck --check-prefix=RV32XQCISYNC %s
100101
; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcisls %s -o - | FileCheck --check-prefix=RV32XQCISLS %s
101102
; RUN: llc -mtriple=riscv32 -mattr=+zaamo %s -o - | FileCheck --check-prefix=RV32ZAAMO %s
102103
; RUN: llc -mtriple=riscv32 -mattr=+zalrsc %s -o - | FileCheck --check-prefix=RV32ZALRSC %s
@@ -427,6 +428,7 @@
427428
; RV32XQCILO: .attribute 5, "rv32i2p1_zca1p0_xqcilo0p2"
428429
; RV32XQCILSM: .attribute 5, "rv32i2p1_xqcilsm0p2"
429430
; RV32XQCISIM: attribute 5, "rv32i2p1_zca1p0_xqcisim0p2"
431+
; RV32XQCISYNC: attribute 5, "rv32i2p1_zca1p0_xqcisync0p2"
430432
; RV32XQCISLS: .attribute 5, "rv32i2p1_xqcisls0p2"
431433
; RV32ZAAMO: .attribute 5, "rv32i2p1_zaamo1p0"
432434
; RV32ZALRSC: .attribute 5, "rv32i2p1_zalrsc1p0"

llvm/test/MC/RISCV/xqcisync-invalid.s

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# Xqcisync - Qualcomm uC Sync Delay Extension
2+
# RUN: not llvm-mc -triple riscv32 -mattr=+experimental-xqcisync < %s 2>&1 \
3+
# RUN: | FileCheck -check-prefixes=CHECK,CHECK-PLUS %s
4+
# RUN: not llvm-mc -triple riscv32 -mattr=-experimental-xqcisync < %s 2>&1 \
5+
# RUN: | FileCheck -check-prefixes=CHECK,CHECK-MINUS %s
6+
7+
# CHECK-PLUS: :[[@LINE+1]]:12: error: immediate must be an integer in the range [1, 31]
8+
qc.c.delay 34
9+
10+
# CHECK: :[[@LINE+1]]:16: error: invalid operand for instruction
11+
qc.c.delay 11, 12
12+
13+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
14+
qc.c.delay
15+
16+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
17+
qc.c.delay 10
18+
19+
20+
# CHECK-PLUS: :[[@LINE+1]]:9: error: immediate must be an integer in the range [0, 31]
21+
qc.sync 45
22+
23+
# CHECK: :[[@LINE+1]]:13: error: invalid operand for instruction
24+
qc.sync 22, x4
25+
26+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
27+
qc.sync
28+
29+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
30+
qc.sync 8
31+
32+
33+
# CHECK-PLUS: :[[@LINE+1]]:10: error: immediate must be an integer in the range [0, 31]
34+
qc.syncr 56
35+
36+
# CHECK: :[[@LINE+1]]:14: error: invalid operand for instruction
37+
qc.syncr 31, 45
38+
39+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
40+
qc.syncr
41+
42+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
43+
qc.syncr 23
44+
45+
46+
# CHECK-PLUS: :[[@LINE+1]]:11: error: immediate must be an integer in the range [0, 31]
47+
qc.syncwf 88
48+
49+
# CHECK: :[[@LINE+1]]:14: error: invalid operand for instruction
50+
qc.syncwf 5, 44
51+
52+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
53+
qc.syncwf
54+
55+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
56+
qc.syncwf 31
57+
58+
59+
# CHECK-PLUS: :[[@LINE+1]]:11: error: immediate must be an integer in the range [0, 31]
60+
qc.syncwl 99
61+
62+
# CHECK: :[[@LINE+1]]:15: error: invalid operand for instruction
63+
qc.syncwl 11, x10
64+
65+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
66+
qc.syncwl
67+
68+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
69+
qc.syncwl 1
70+
71+
72+
# CHECK-PLUS: :[[@LINE+1]]:11: error: immediate must be one of: 0, 1, 2, 4, 8, 15, 16, 31
73+
qc.c.sync 45
74+
75+
# CHECK: :[[@LINE+1]]:15: error: invalid operand for instruction
76+
qc.c.sync 31, x4
77+
78+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
79+
qc.c.sync
80+
81+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
82+
qc.c.sync 8
83+
84+
85+
# CHECK-PLUS: :[[@LINE+1]]:12: error: immediate must be one of: 0, 1, 2, 4, 8, 15, 16, 31
86+
qc.c.syncr 56
87+
88+
# CHECK: :[[@LINE+1]]:16: error: invalid operand for instruction
89+
qc.c.syncr 31, 45
90+
91+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
92+
qc.c.syncr
93+
94+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
95+
qc.c.syncr 8
96+
97+
98+
# CHECK-PLUS: :[[@LINE+1]]:13: error: immediate must be one of: 0, 1, 2, 4, 8, 15, 16, 31
99+
qc.c.syncwf 88
100+
101+
# CHECK: :[[@LINE+1]]:16: error: invalid operand for instruction
102+
qc.c.syncwf 8, 44
103+
104+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
105+
qc.c.syncwf
106+
107+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
108+
qc.c.syncwf 31
109+
110+
111+
# CHECK-PLUS: :[[@LINE+1]]:13: error: immediate must be one of: 0, 1, 2, 4, 8, 15, 16, 31
112+
qc.c.syncwl 99
113+
114+
# CHECK: :[[@LINE+1]]:17: error: invalid operand for instruction
115+
qc.c.syncwl 15, x10
116+
117+
# CHECK: :[[@LINE+1]]:1: error: too few operands for instruction
118+
qc.c.syncwl
119+
120+
# CHECK-MINUS: :[[@LINE+1]]:1: error: instruction requires the following: 'Xqcisync' (Qualcomm uC Sync Delay Extension)
121+
qc.c.syncwl 1

0 commit comments

Comments
 (0)