Skip to content

Commit 0d334d8

Browse files
authored
[X86][APX] Fix wrong encoding of promoted KMOV instructions due to missing NoCD8 (#109579)
Promoted KMOV* was encoded with CD8 incorrectly, see https://godbolt.org/z/cax513hG1
1 parent 1429204 commit 0d334d8

File tree

4 files changed

+55
-14
lines changed

4 files changed

+55
-14
lines changed

llvm/lib/Target/X86/X86InstrAVX512.td

+14-13
Original file line numberDiff line numberDiff line change
@@ -2617,19 +2617,20 @@ defm VFPCLASS : avx512_fp_fpclass_all<"vfpclass", 0x66, 0x67, SchedWriteFCmp>, E
26172617
multiclass avx512_mask_mov<bits<8> opc_kk, bits<8> opc_km, bits<8> opc_mk,
26182618
string OpcodeStr, RegisterClass KRC, ValueType vvt,
26192619
X86MemOperand x86memop, string Suffix = ""> {
2620-
let isMoveReg = 1, hasSideEffects = 0, SchedRW = [WriteMove],
2621-
explicitOpPrefix = !if(!eq(Suffix, ""), NoExplicitOpPrefix, ExplicitEVEX) in
2622-
def kk#Suffix : I<opc_kk, MRMSrcReg, (outs KRC:$dst), (ins KRC:$src),
2623-
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), []>,
2624-
Sched<[WriteMove]>;
2625-
def km#Suffix : I<opc_km, MRMSrcMem, (outs KRC:$dst), (ins x86memop:$src),
2626-
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
2627-
[(set KRC:$dst, (vvt (load addr:$src)))]>,
2628-
Sched<[WriteLoad]>;
2629-
def mk#Suffix : I<opc_mk, MRMDestMem, (outs), (ins x86memop:$dst, KRC:$src),
2630-
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
2631-
[(store KRC:$src, addr:$dst)]>,
2632-
Sched<[WriteStore]>;
2620+
let explicitOpPrefix = !if(!eq(Suffix, ""), NoExplicitOpPrefix, ExplicitEVEX) in {
2621+
let isMoveReg = 1, hasSideEffects = 0, SchedRW = [WriteMove] in
2622+
def kk#Suffix : I<opc_kk, MRMSrcReg, (outs KRC:$dst), (ins KRC:$src),
2623+
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), []>,
2624+
Sched<[WriteMove]>;
2625+
def km#Suffix : I<opc_km, MRMSrcMem, (outs KRC:$dst), (ins x86memop:$src),
2626+
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
2627+
[(set KRC:$dst, (vvt (load addr:$src)))]>,
2628+
Sched<[WriteLoad]>, NoCD8;
2629+
def mk#Suffix : I<opc_mk, MRMDestMem, (outs), (ins x86memop:$dst, KRC:$src),
2630+
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
2631+
[(store KRC:$src, addr:$dst)]>,
2632+
Sched<[WriteStore]>, NoCD8;
2633+
}
26332634
}
26342635

26352636
multiclass avx512_mask_mov_gpr<bits<8> opc_kr, bits<8> opc_rk,

llvm/test/MC/Disassembler/X86/apx/kmov.txt

+16
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,22 @@
1717
# INTEL: {evex} kmovq k2, k1
1818
0x62,0xf1,0xfc,0x08,0x90,0xd1
1919

20+
# ATT: {evex} kmovb -16(%rax), %k0
21+
# INTEL: {evex} kmovb k0, byte ptr [rax - 16]
22+
0x62,0xf1,0x7d,0x08,0x90,0x40,0xf0
23+
24+
# ATT: {evex} kmovw -16(%rax), %k0
25+
# INTEL: {evex} kmovw k0, word ptr [rax - 16]
26+
0x62,0xf1,0x7c,0x08,0x90,0x40,0xf0
27+
28+
# ATT: {evex} kmovd -16(%rax), %k0
29+
# INTEL: {evex} kmovd k0, dword ptr [rax - 16]
30+
0x62,0xf1,0xfd,0x08,0x90,0x40,0xf0
31+
32+
# ATT: {evex} kmovq -16(%rax), %k0
33+
# INTEL: {evex} kmovq k0, qword ptr [rax - 16]
34+
0x62,0xf1,0xfc,0x08,0x90,0x40,0xf0
35+
2036
# ATT-NOT: {evex}
2137
# INTEL-NOT: {evex}
2238

llvm/test/MC/X86/apx/kmov-att.s

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# RUN: llvm-mc -triple x86_64 -show-encoding %s | FileCheck %s
22
# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR
33

4-
# ERROR-COUNT-20: error:
4+
# ERROR-COUNT-24: error:
55
# ERROR-NOT: error:
66
# CHECK: {evex} kmovb %k1, %k2
77
# CHECK: encoding: [0x62,0xf1,0x7d,0x08,0x90,0xd1]
@@ -15,6 +15,18 @@
1515
# CHECK: {evex} kmovq %k1, %k2
1616
# CHECK: encoding: [0x62,0xf1,0xfc,0x08,0x90,0xd1]
1717
{evex} kmovq %k1, %k2
18+
# CHECK: {evex} kmovb -16(%rax), %k0
19+
# CHECK: encoding: [0x62,0xf1,0x7d,0x08,0x90,0x40,0xf0]
20+
{evex} kmovb -0x10(%rax), %k0
21+
# CHECK: {evex} kmovw -16(%rax), %k0
22+
# CHECK: encoding: [0x62,0xf1,0x7c,0x08,0x90,0x40,0xf0]
23+
{evex} kmovw -0x10(%rax), %k0
24+
# CHECK: {evex} kmovd -16(%rax), %k0
25+
# CHECK: encoding: [0x62,0xf1,0xfd,0x08,0x90,0x40,0xf0]
26+
{evex} kmovd -0x10(%rax), %k0
27+
# CHECK: {evex} kmovq -16(%rax), %k0
28+
# CHECK: encoding: [0x62,0xf1,0xfc,0x08,0x90,0x40,0xf0]
29+
{evex} kmovq -0x10(%rax), %k0
1830

1931
# CHECK-NOT: {evex}
2032

llvm/test/MC/X86/apx/kmov-intel.s

+12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@
1212
# CHECK: {evex} kmovq k2, k1
1313
# CHECK: encoding: [0x62,0xf1,0xfc,0x08,0x90,0xd1]
1414
{evex} kmovq k2, k1
15+
# CHECK: {evex} kmovb k0, byte ptr [rax - 16]
16+
# CHECK: encoding: [0x62,0xf1,0x7d,0x08,0x90,0x40,0xf0]
17+
{evex} kmovb k0, byte ptr [rax - 0x10]
18+
# CHECK: {evex} kmovw k0, word ptr [rax - 16]
19+
# CHECK: encoding: [0x62,0xf1,0x7c,0x08,0x90,0x40,0xf0]
20+
{evex} kmovw k0, word ptr [rax - 0x10]
21+
# CHECK: {evex} kmovd k0, dword ptr [rax - 16]
22+
# CHECK: encoding: [0x62,0xf1,0xfd,0x08,0x90,0x40,0xf0]
23+
{evex} kmovd k0, dword ptr [rax - 0x10]
24+
# CHECK: {evex} kmovq k0, qword ptr [rax - 16]
25+
# CHECK: encoding: [0x62,0xf1,0xfc,0x08,0x90,0x40,0xf0]
26+
{evex} kmovq k0, qword ptr [rax - 0x10]
1527

1628
# CHECK-NOT: {evex}
1729

0 commit comments

Comments
 (0)