-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[X86][MC] Add alias for {evex} cmp
and {evex} test
.
#99277
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-mc @llvm/pr-subscribers-backend-x86 Author: Freddy Ye (FreddyLeaf) Changesrelate gas patch: https://sourceware.org/pipermail/binutils/2024-June/134478.html Full diff: https://github.com/llvm/llvm-project/pull/99277.diff 5 Files Affected:
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index e49e96ceef6a4..8e5f713054b14 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -83,6 +83,13 @@ static const char OpPrecedence[] = {
3 // IC_GE
};
+static bool ifCmpOrTestOpcode(std::string &Opcode) {
+ return Opcode == "cmp" || Opcode == "cmpb" || Opcode == "cmpw" ||
+ Opcode == "cmpl" || Opcode == "cmpq" || Opcode == "test" ||
+ Opcode == "testb" || Opcode == "testw" || Opcode == "testl" ||
+ Opcode == "testq";
+}
+
class X86AsmParser : public MCTargetAsmParser {
ParseInstructionInfo *InstInfo;
bool Code16GCC;
@@ -96,6 +103,7 @@ class X86AsmParser : public MCTargetAsmParser {
OpcodePrefix_VEX2,
OpcodePrefix_VEX3,
OpcodePrefix_EVEX,
+ OpcodePrefix_EVEX_CMP_TEST,
};
OpcodePrefix ForcedOpcodePrefix = OpcodePrefix_Default;
@@ -3202,6 +3210,7 @@ bool X86AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
if (getLexer().isNot(AsmToken::RCurly))
return Error(Parser.getTok().getLoc(), "Expected '}'");
Parser.Lex(); // Eat curly.
+ std::string Opcode = Parser.getTok().getString().lower();
if (Prefix == "rex")
ForcedOpcodePrefix = OpcodePrefix_REX;
@@ -3214,7 +3223,9 @@ bool X86AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
else if (Prefix == "vex3")
ForcedOpcodePrefix = OpcodePrefix_VEX3;
else if (Prefix == "evex")
- ForcedOpcodePrefix = OpcodePrefix_EVEX;
+ ForcedOpcodePrefix = is64BitMode() && ifCmpOrTestOpcode(Opcode)
+ ? OpcodePrefix_EVEX_CMP_TEST
+ : OpcodePrefix_EVEX;
else if (Prefix == "disp8")
ForcedDispEncoding = DispEncoding_Disp8;
else if (Prefix == "disp32")
@@ -3784,6 +3795,66 @@ bool X86AsmParser::processInstruction(MCInst &Inst, const OperandVector &Ops) {
Inst.setOpcode(X86::INT3);
return true;
}
+#define FROM_TO(FROM, TO) \
+ case X86::FROM: { \
+ if (ForcedOpcodePrefix == OpcodePrefix_EVEX_CMP_TEST) { \
+ Inst.setOpcode(X86::TO); \
+ Inst.addOperand(MCOperand::createImm(15)); \
+ Inst.addOperand(MCOperand::createImm(4)); \
+ return true; \
+ } \
+ return false; \
+ }
+ FROM_TO(CMP64rr, CCMP64rr)
+ FROM_TO(CMP64mi32, CCMP64mi32)
+ FROM_TO(CMP64mi8, CCMP64mi8)
+ FROM_TO(CMP64mr, CCMP64mr)
+ FROM_TO(CMP64ri32, CCMP64ri32)
+ FROM_TO(CMP64ri8, CCMP64ri8)
+ FROM_TO(CMP64rm, CCMP64rm)
+
+ FROM_TO(CMP32rr, CCMP32rr)
+ FROM_TO(CMP32mi, CCMP32mi)
+ FROM_TO(CMP32mi8, CCMP32mi8)
+ FROM_TO(CMP32mr, CCMP32mr)
+ FROM_TO(CMP32ri, CCMP32ri)
+ FROM_TO(CMP32ri8, CCMP32ri8)
+ FROM_TO(CMP32rm, CCMP32rm)
+
+ FROM_TO(CMP16rr, CCMP16rr)
+ FROM_TO(CMP16mi, CCMP16mi)
+ FROM_TO(CMP16mi8, CCMP16mi8)
+ FROM_TO(CMP16mr, CCMP16mr)
+ FROM_TO(CMP16ri, CCMP16ri)
+ FROM_TO(CMP16ri8, CCMP16ri8)
+ FROM_TO(CMP16rm, CCMP16rm)
+
+ FROM_TO(CMP8rr, CCMP8rr)
+ FROM_TO(CMP8mi, CCMP8mi)
+ FROM_TO(CMP8mr, CCMP8mr)
+ FROM_TO(CMP8ri, CCMP8ri)
+ FROM_TO(CMP8rm, CCMP8rm)
+
+ FROM_TO(TEST64rr, CTEST64rr)
+ FROM_TO(TEST64mi32, CTEST64mi32)
+ FROM_TO(TEST64mr, CTEST64mr)
+ FROM_TO(TEST64ri32, CTEST64ri32)
+
+ FROM_TO(TEST32rr, CTEST32rr)
+ FROM_TO(TEST32mi, CTEST32mi)
+ FROM_TO(TEST32mr, CTEST32mr)
+ FROM_TO(TEST32ri, CTEST32ri)
+
+ FROM_TO(TEST16rr, CTEST16rr)
+ FROM_TO(TEST16mi, CTEST16mi)
+ FROM_TO(TEST16mr, CTEST16mr)
+ FROM_TO(TEST16ri, CTEST16ri)
+
+ FROM_TO(TEST8rr, CTEST8rr)
+ FROM_TO(TEST8mi, CTEST8mi)
+ FROM_TO(TEST8mr, CTEST8mr)
+ FROM_TO(TEST8ri, CTEST8ri)
+#undef FROM_TO
}
}
@@ -4122,6 +4193,7 @@ unsigned X86AsmParser::checkTargetMatchPredicate(MCInst &Inst) {
switch (ForcedOpcodePrefix) {
case OpcodePrefix_Default:
+ case OpcodePrefix_EVEX_CMP_TEST:
break;
case OpcodePrefix_REX:
case OpcodePrefix_REX2:
diff --git a/llvm/test/MC/X86/apx/ccmp-att.s b/llvm/test/MC/X86/apx/ccmp-att.s
index 405071b0f4310..10b81d2f2555d 100644
--- a/llvm/test/MC/X86/apx/ccmp-att.s
+++ b/llvm/test/MC/X86/apx/ccmp-att.s
@@ -1,7 +1,7 @@
# RUN: llvm-mc -triple x86_64 -show-encoding %s | FileCheck %s
# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR
-# ERROR-COUNT-402: error:
+# ERROR-COUNT-428: error:
# ERROR-NOT: error:
## Condition flags
@@ -1217,3 +1217,109 @@
# CHECK: ccmpoq {dfv=of,sf,zf,cf} %rax, %rbx
# CHECK: encoding: [0x62,0xf4,0xfc,0x00,0x39,0xc3]
ccmpoq {dFV=Cf,zF,SF,of} %rax, %rbx
+
+## "{evex} cmp*" are alias for "ccmpe* {dfv=of,sf,zf,cf}"
+
+# CHECK: ccmpeb {dfv=of,sf,zf,cf} $123, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x80,0x7c,0x80,0x7b,0x7b]
+{evex} cmpb $123, 123(%r8,%rax,4)
+
+# CHECK: ccmpew {dfv=of,sf,zf,cf} $123, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x83,0x7c,0x80,0x7b,0x7b]
+{evex} cmpw $123, 123(%r8,%rax,4)
+
+# CHECK: ccmpew {dfv=of,sf,zf,cf} $1234, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x81,0x7c,0x80,0x7b,0xd2,0x04]
+{evex} cmpw $1234, 123(%r8,%rax,4)
+
+# CHECK: ccmpel {dfv=of,sf,zf,cf} $123, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x83,0x7c,0x80,0x7b,0x7b]
+{evex} cmpl $123, 123(%r8,%rax,4)
+
+# CHECK: ccmpel {dfv=of,sf,zf,cf} $123456, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x81,0x7c,0x80,0x7b,0x40,0xe2,0x01,0x00]
+{evex} cmpl $123456, 123(%r8,%rax,4)
+
+# CHECK: ccmpeq {dfv=of,sf,zf,cf} $123, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0x83,0x7c,0x80,0x7b,0x7b]
+{evex} cmpq $123, 123(%r8,%rax,4)
+
+# CHECK: ccmpeq {dfv=of,sf,zf,cf} $123456, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0x81,0x7c,0x80,0x7b,0x40,0xe2,0x01,0x00]
+{evex} cmpq $123456, 123(%r8,%rax,4)
+
+# CHECK: ccmpeb {dfv=of,sf,zf,cf} %bl, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x38,0x5c,0x80,0x7b]
+{evex} cmpb %bl, 123(%r8,%rax,4)
+
+# CHECK: ccmpew {dfv=of,sf,zf,cf} %dx, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x39,0x54,0x80,0x7b]
+{evex} cmpw %dx, 123(%r8,%rax,4)
+
+# CHECK: ccmpel {dfv=of,sf,zf,cf} %ecx, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x39,0x4c,0x80,0x7b]
+{evex} cmpl %ecx, 123(%r8,%rax,4)
+
+# CHECK: ccmpeq {dfv=of,sf,zf,cf} %r9, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x39,0x4c,0x80,0x7b]
+{evex} cmpq %r9, 123(%r8,%rax,4)
+
+# CHECK: ccmpeb {dfv=of,sf,zf,cf} 123(%r8,%rax,4), %bl
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x3a,0x5c,0x80,0x7b]
+{evex} cmpb 123(%r8,%rax,4), %bl
+
+# CHECK: ccmpew {dfv=of,sf,zf,cf} 123(%r8,%rax,4), %dx
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x3b,0x54,0x80,0x7b]
+{evex} cmpw 123(%r8,%rax,4), %dx
+
+# CHECK: ccmpel {dfv=of,sf,zf,cf} 123(%r8,%rax,4), %ecx
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x3b,0x4c,0x80,0x7b]
+{evex} cmpl 123(%r8,%rax,4), %ecx
+
+# CHECK: ccmpeq {dfv=of,sf,zf,cf} 123(%r8,%rax,4), %r9
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x3b,0x4c,0x80,0x7b]
+{evex} cmpq 123(%r8,%rax,4), %r9
+
+# CHECK: ccmpeb {dfv=of,sf,zf,cf} $123, %bl
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x80,0xfb,0x7b]
+{evex} cmpb $123, %bl
+
+# CHECK: ccmpew {dfv=of,sf,zf,cf} $123, %dx
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0x83,0xfa,0x7b]
+{evex} cmpw $123, %dx
+
+# CHECK: ccmpel {dfv=of,sf,zf,cf} $123, %ecx
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x83,0xf9,0x7b]
+{evex} cmpl $123, %ecx
+
+# CHECK: ccmpeq {dfv=of,sf,zf,cf} $123, %r9
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0x83,0xf9,0x7b]
+{evex} cmpq $123, %r9
+
+# CHECK: ccmpew {dfv=of,sf,zf,cf} $1234, %dx
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0x81,0xfa,0xd2,0x04]
+{evex} cmpw $1234, %dx
+
+# CHECK: ccmpel {dfv=of,sf,zf,cf} $123456, %ecx
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x81,0xf9,0x40,0xe2,0x01,0x00]
+{evex} cmpl $123456, %ecx
+
+# CHECK: ccmpeq {dfv=of,sf,zf,cf} $123456, %r9
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0x81,0xf9,0x40,0xe2,0x01,0x00]
+{evex} cmpq $123456, %r9
+
+# CHECK: ccmpeb {dfv=of,sf,zf,cf} %bl, %dl
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x38,0xda]
+{evex} cmpb %bl, %dl
+
+# CHECK: ccmpew {dfv=of,sf,zf,cf} %dx, %ax
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0x39,0xd0]
+{evex} cmpw %dx, %ax
+
+# CHECK: ccmpel {dfv=of,sf,zf,cf} %ecx, %edx
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x39,0xca]
+{evex} cmpl %ecx, %edx
+
+# CHECK: ccmpeq {dfv=of,sf,zf,cf} %r9, %r15
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x39,0xcf]
+{evex} cmpq %r9, %r15
diff --git a/llvm/test/MC/X86/apx/ccmp-intel.s b/llvm/test/MC/X86/apx/ccmp-intel.s
index 2d446b053d94e..9123a2e6940f0 100644
--- a/llvm/test/MC/X86/apx/ccmp-intel.s
+++ b/llvm/test/MC/X86/apx/ccmp-intel.s
@@ -1214,3 +1214,84 @@
# CHECK: ccmpo {dfv=of,sf,zf,cf} rbx, rax
# CHECK: encoding: [0x62,0xf4,0xfc,0x00,0x39,0xc3]
ccmpo {DFv=Cf,zF,SF,of} rbx, rax
+
+## "{evex} cmp*" are alias for "ccmpe* {dfv=of,sf,zf,cf}"
+
+# CHECK: ccmpe {dfv=of,sf,zf,cf} byte ptr [r8 + 4*rax + 123], 123
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x80,0x7c,0x80,0x7b,0x7b]
+ {evex} cmp byte ptr [r8 + 4*rax + 123], 123
+# CHECK: ccmpe {dfv=of,sf,zf,cf} word ptr [r8 + 4*rax + 123], 123
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x83,0x7c,0x80,0x7b,0x7b]
+ {evex} cmp word ptr [r8 + 4*rax + 123], 123
+# CHECK: ccmpe {dfv=of,sf,zf,cf} word ptr [r8 + 4*rax + 123], 1234
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x81,0x7c,0x80,0x7b,0xd2,0x04]
+ {evex} cmp word ptr [r8 + 4*rax + 123], 1234
+# CHECK: ccmpe {dfv=of,sf,zf,cf} dword ptr [r8 + 4*rax + 123], 123
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x83,0x7c,0x80,0x7b,0x7b]
+ {evex} cmp dword ptr [r8 + 4*rax + 123], 123
+# CHECK: ccmpe {dfv=of,sf,zf,cf} dword ptr [r8 + 4*rax + 123], 123456
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x81,0x7c,0x80,0x7b,0x40,0xe2,0x01,0x00]
+ {evex} cmp dword ptr [r8 + 4*rax + 123], 123456
+# CHECK: ccmpe {dfv=of,sf,zf,cf} qword ptr [r8 + 4*rax + 123], 123
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0x83,0x7c,0x80,0x7b,0x7b]
+ {evex} cmp qword ptr [r8 + 4*rax + 123], 123
+# CHECK: ccmpe {dfv=of,sf,zf,cf} qword ptr [r8 + 4*rax + 123], 123456
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0x81,0x7c,0x80,0x7b,0x40,0xe2,0x01,0x00]
+ {evex} cmp qword ptr [r8 + 4*rax + 123], 123456
+# CHECK: ccmpe {dfv=of,sf,zf,cf} byte ptr [r8 + 4*rax + 123], bl
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x38,0x5c,0x80,0x7b]
+ {evex} cmp byte ptr [r8 + 4*rax + 123], bl
+# CHECK: ccmpe {dfv=of,sf,zf,cf} word ptr [r8 + 4*rax + 123], dx
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x39,0x54,0x80,0x7b]
+ {evex} cmp word ptr [r8 + 4*rax + 123], dx
+# CHECK: ccmpe {dfv=of,sf,zf,cf} dword ptr [r8 + 4*rax + 123], ecx
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x39,0x4c,0x80,0x7b]
+ {evex} cmp dword ptr [r8 + 4*rax + 123], ecx
+# CHECK: ccmpe {dfv=of,sf,zf,cf} qword ptr [r8 + 4*rax + 123], r9
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x39,0x4c,0x80,0x7b]
+ {evex} cmp qword ptr [r8 + 4*rax + 123], r9
+# CHECK: ccmpe {dfv=of,sf,zf,cf} bl, byte ptr [r8 + 4*rax + 123]
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x3a,0x5c,0x80,0x7b]
+ {evex} cmp bl, byte ptr [r8 + 4*rax + 123]
+# CHECK: ccmpe {dfv=of,sf,zf,cf} dx, word ptr [r8 + 4*rax + 123]
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x3b,0x54,0x80,0x7b]
+ {evex} cmp dx, word ptr [r8 + 4*rax + 123]
+# CHECK: ccmpe {dfv=of,sf,zf,cf} ecx, dword ptr [r8 + 4*rax + 123]
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x3b,0x4c,0x80,0x7b]
+ {evex} cmp ecx, dword ptr [r8 + 4*rax + 123]
+# CHECK: ccmpe {dfv=of,sf,zf,cf} r9, qword ptr [r8 + 4*rax + 123]
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x3b,0x4c,0x80,0x7b]
+ {evex} cmp r9, qword ptr [r8 + 4*rax + 123]
+# CHECK: ccmpe {dfv=of,sf,zf,cf} bl, 123
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x80,0xfb,0x7b]
+ {evex} cmp bl, 123
+# CHECK: ccmpe {dfv=of,sf,zf,cf} dx, 123
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0x83,0xfa,0x7b]
+ {evex} cmp dx, 123
+# CHECK: ccmpe {dfv=of,sf,zf,cf} ecx, 123
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x83,0xf9,0x7b]
+ {evex} cmp ecx, 123
+# CHECK: ccmpe {dfv=of,sf,zf,cf} r9, 123
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0x83,0xf9,0x7b]
+ {evex} cmp r9, 123
+# CHECK: ccmpe {dfv=of,sf,zf,cf} dx, 1234
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0x81,0xfa,0xd2,0x04]
+ {evex} cmp dx, 1234
+# CHECK: ccmpe {dfv=of,sf,zf,cf} ecx, 123456
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x81,0xf9,0x40,0xe2,0x01,0x00]
+ {evex} cmp ecx, 123456
+# CHECK: ccmpe {dfv=of,sf,zf,cf} r9, 123456
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0x81,0xf9,0x40,0xe2,0x01,0x00]
+ {evex} cmp r9, 123456
+# CHECK: ccmpe {dfv=of,sf,zf,cf} dl, bl
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x38,0xda]
+ {evex} cmp dl, bl
+# CHECK: ccmpe {dfv=of,sf,zf,cf} ax, dx
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0x39,0xd0]
+ {evex} cmp ax, dx
+# CHECK: ccmpe {dfv=of,sf,zf,cf} edx, ecx
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x39,0xca]
+ {evex} cmp edx, ecx
+# CHECK: ccmpe {dfv=of,sf,zf,cf} r15, r9
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x39,0xcf]
+ {evex} cmp r15, r9
diff --git a/llvm/test/MC/X86/apx/ctest-att.s b/llvm/test/MC/X86/apx/ctest-att.s
index b9e98adc9841b..fa510f2c8fec5 100644
--- a/llvm/test/MC/X86/apx/ctest-att.s
+++ b/llvm/test/MC/X86/apx/ctest-att.s
@@ -1,7 +1,7 @@
# RUN: llvm-mc -triple x86_64 -show-encoding %s | FileCheck %s
# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR
-# ERROR-COUNT-256: error:
+# ERROR-COUNT-272: error:
# ERROR-NOT: error:
# CHECK: ctestbb {dfv=of} $123, 123(%r8,%rax,4)
# CHECK: encoding: [0x62,0xd4,0x44,0x02,0xf6,0x44,0x80,0x7b,0x7b]
@@ -771,3 +771,54 @@
# CHECK: ctesteq {dfv=of} %r9, %r15
# CHECK: encoding: [0x62,0x54,0xc4,0x04,0x85,0xcf]
ctesteq {dfv=of} %r9, %r15
+
+## "{evex} test*" are alias for "cteste* {dfv=of,sf,zf,cf}"
+
+# CHECK: ctesteb {dfv=of,sf,zf,cf} $123, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0xf6,0x44,0x80,0x7b,0x7b]
+ {evex} testb $123, 123(%r8,%rax,4)
+# CHECK: ctestew {dfv=of,sf,zf,cf} $1234, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0xf7,0x44,0x80,0x7b,0xd2,0x04]
+ {evex} testw $1234, 123(%r8,%rax,4)
+# CHECK: ctestel {dfv=of,sf,zf,cf} $123456, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0xf7,0x44,0x80,0x7b,0x40,0xe2,0x01,0x00]
+ {evex} testl $123456, 123(%r8,%rax,4)
+# CHECK: ctesteq {dfv=of,sf,zf,cf} $123456, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0xf7,0x44,0x80,0x7b,0x40,0xe2,0x01,0x00]
+ {evex} testq $123456, 123(%r8,%rax,4)
+# CHECK: ctesteb {dfv=of,sf,zf,cf} %bl, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x84,0x5c,0x80,0x7b]
+ {evex} testb %bl, 123(%r8,%rax,4)
+# CHECK: ctestew {dfv=of,sf,zf,cf} %dx, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x85,0x54,0x80,0x7b]
+ {evex} testw %dx, 123(%r8,%rax,4)
+# CHECK: ctestel {dfv=of,sf,zf,cf} %ecx, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x85,0x4c,0x80,0x7b]
+ {evex} testl %ecx, 123(%r8,%rax,4)
+# CHECK: ctesteq {dfv=of,sf,zf,cf} %r9, 123(%r8,%rax,4)
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x85,0x4c,0x80,0x7b]
+ {evex} testq %r9, 123(%r8,%rax,4)
+# CHECK: ctesteb {dfv=of,sf,zf,cf} $123, %bl
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0xf6,0xc3,0x7b]
+ {evex} testb $123, %bl
+# CHECK: ctestew {dfv=of,sf,zf,cf} $1234, %dx
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0xf7,0xc2,0xd2,0x04]
+ {evex} testw $1234, %dx
+# CHECK: ctestel {dfv=of,sf,zf,cf} $123456, %ecx
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0xf7,0xc1,0x40,0xe2,0x01,0x00]
+ {evex} testl $123456, %ecx
+# CHECK: ctesteq {dfv=of,sf,zf,cf} $123456, %r9
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0xf7,0xc1,0x40,0xe2,0x01,0x00]
+ {evex} testq $123456, %r9
+# CHECK: ctesteb {dfv=of,sf,zf,cf} %bl, %dl
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x84,0xda]
+ {evex} testb %bl, %dl
+# CHECK: ctestew {dfv=of,sf,zf,cf} %dx, %ax
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0x85,0xd0]
+ {evex} testw %dx, %ax
+# CHECK: ctestel {dfv=of,sf,zf,cf} %ecx, %edx
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x85,0xca]
+ {evex} testl %ecx, %edx
+# CHECK: ctesteq {dfv=of,sf,zf,cf} %r9, %r15
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x85,0xcf]
+ {evex} testq %r9, %r15
diff --git a/llvm/test/MC/X86/apx/ctest-intel.s b/llvm/test/MC/X86/apx/ctest-intel.s
index 17cea489b4765..23210bd75fe15 100644
--- a/llvm/test/MC/X86/apx/ctest-intel.s
+++ b/llvm/test/MC/X86/apx/ctest-intel.s
@@ -768,3 +768,54 @@
# CHECK: cteste {dfv=of} r15, r9
# CHECK: encoding: [0x62,0x54,0xc4,0x04,0x85,0xcf]
cteste {dfv=of} r15, r9
+
+## "{evex} test*" are alias for "cteste* {dfv=of,sf,zf,cf}"
+
+# CHECK: cteste {dfv=of,sf,zf,cf} byte ptr [r8 + 4*rax + 123], 123
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0xf6,0x44,0x80,0x7b,0x7b]
+ {evex} test byte ptr [r8 + 4*rax + 123], 123
+# CHECK: cteste {dfv=of,sf,zf,cf} word ptr [r8 + 4*rax + 123], 1234
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0xf7,0x44,0x80,0x7b,0xd2,0x04]
+ {evex} test word ptr [r8 + 4*rax + 123], 1234
+# CHECK: cteste {dfv=of,sf,zf,cf} dword ptr [r8 + 4*rax + 123], 123456
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0xf7,0x44,0x80,0x7b,0x40,0xe2,0x01,0x00]
+ {evex} test dword ptr [r8 + 4*rax + 123], 123456
+# CHECK: cteste {dfv=of,sf,zf,cf} qword ptr [r8 + 4*rax + 123], 123456
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0xf7,0x44,0x80,0x7b,0x40,0xe2,0x01,0x00]
+ {evex} test qword ptr [r8 + 4*rax + 123], 123456
+# CHECK: cteste {dfv=of,sf,zf,cf} byte ptr [r8 + 4*rax + 123], bl
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x84,0x5c,0x80,0x7b]
+ {evex} test byte ptr [r8 + 4*rax + 123], bl
+# CHECK: cteste {dfv=of,sf,zf,cf} word ptr [r8 + 4*rax + 123], dx
+# CHECK: encoding: [0x62,0xd4,0x7d,0x04,0x85,0x54,0x80,0x7b]
+ {evex} test word ptr [r8 + 4*rax + 123], dx
+# CHECK: cteste {dfv=of,sf,zf,cf} dword ptr [r8 + 4*rax + 123], ecx
+# CHECK: encoding: [0x62,0xd4,0x7c,0x04,0x85,0x4c,0x80,0x7b]
+ {evex} test dword ptr [r8 + 4*rax + 123], ecx
+# CHECK: cteste {dfv=of,sf,zf,cf} qword ptr [r8 + 4*rax + 123], r9
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x85,0x4c,0x80,0x7b]
+ {evex} test qword ptr [r8 + 4*rax + 123], r9
+# CHECK: cteste {dfv=of,sf,zf,cf} bl, 123
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0xf6,0xc3,0x7b]
+ {evex} test bl, 123
+# CHECK: cteste {dfv=of,sf,zf,cf} dx, 1234
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0xf7,0xc2,0xd2,0x04]
+ {evex} test dx, 1234
+# CHECK: cteste {dfv=of,sf,zf,cf} ecx, 123456
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0xf7,0xc1,0x40,0xe2,0x01,0x00]
+ {evex} test ecx, 123456
+# CHECK: cteste {dfv=of,sf,zf,cf} r9, 123456
+# CHECK: encoding: [0x62,0xd4,0xfc,0x04,0xf7,0xc1,0x40,0xe2,0x01,0x00]
+ {evex} test r9, 123456
+# CHECK: cteste {dfv=of,sf,zf,cf} dl, bl
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x84,0xda]
+ {evex} test dl, bl
+# CHECK: cteste {dfv=of,sf,zf,cf} ax, dx
+# CHECK: encoding: [0x62,0xf4,0x7d,0x04,0x85,0xd0]
+ {evex} test ax, dx
+# CHECK: cteste {dfv=of,sf,zf,cf} edx, ecx
+# CHECK: encoding: [0x62,0xf4,0x7c,0x04,0x85,0xca]
+ {evex} test edx, ecx
+# CHECK: cteste {dfv=of,sf,zf,cf} r15, r9
+# CHECK: encoding: [0x62,0x54,0xfc,0x04,0x85,0xcf]
+ {evex} test r15, r9
|
ping |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
✅ With the latest revision this PR passed the C/C++ code formatter. |
Related gas patch: https://sourceware.org/pipermail/binutils/2024-June/134478.html