Skip to content

Commit

Permalink
[X86][APX] Fix wrong encoding of promoted KMOV instructions due to mi…
Browse files Browse the repository at this point in the history
…ssing NoCD8
  • Loading branch information
phoebewang committed Sep 22, 2024
1 parent c9e5c42 commit 8732f21
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 14 deletions.
27 changes: 14 additions & 13 deletions llvm/lib/Target/X86/X86InstrAVX512.td
Original file line number Diff line number Diff line change
Expand Up @@ -2617,19 +2617,20 @@ defm VFPCLASS : avx512_fp_fpclass_all<"vfpclass", 0x66, 0x67, SchedWriteFCmp>, E
multiclass avx512_mask_mov<bits<8> opc_kk, bits<8> opc_km, bits<8> opc_mk,
string OpcodeStr, RegisterClass KRC, ValueType vvt,
X86MemOperand x86memop, string Suffix = ""> {
let isMoveReg = 1, hasSideEffects = 0, SchedRW = [WriteMove],
explicitOpPrefix = !if(!eq(Suffix, ""), NoExplicitOpPrefix, ExplicitEVEX) in
def kk#Suffix : I<opc_kk, MRMSrcReg, (outs KRC:$dst), (ins KRC:$src),
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), []>,
Sched<[WriteMove]>;
def km#Suffix : I<opc_km, MRMSrcMem, (outs KRC:$dst), (ins x86memop:$src),
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
[(set KRC:$dst, (vvt (load addr:$src)))]>,
Sched<[WriteLoad]>;
def mk#Suffix : I<opc_mk, MRMDestMem, (outs), (ins x86memop:$dst, KRC:$src),
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
[(store KRC:$src, addr:$dst)]>,
Sched<[WriteStore]>;
let explicitOpPrefix = !if(!eq(Suffix, ""), NoExplicitOpPrefix, ExplicitEVEX) in {
let isMoveReg = 1, hasSideEffects = 0, SchedRW = [WriteMove] in
def kk#Suffix : I<opc_kk, MRMSrcReg, (outs KRC:$dst), (ins KRC:$src),
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"), []>,
Sched<[WriteMove]>;
def km#Suffix : I<opc_km, MRMSrcMem, (outs KRC:$dst), (ins x86memop:$src),
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
[(set KRC:$dst, (vvt (load addr:$src)))]>,
Sched<[WriteLoad]>, NoCD8;
def mk#Suffix : I<opc_mk, MRMDestMem, (outs), (ins x86memop:$dst, KRC:$src),
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
[(store KRC:$src, addr:$dst)]>,
Sched<[WriteStore]>, NoCD8;
}
}

multiclass avx512_mask_mov_gpr<bits<8> opc_kr, bits<8> opc_rk,
Expand Down
16 changes: 16 additions & 0 deletions llvm/test/MC/Disassembler/X86/apx/kmov.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,22 @@
# INTEL: {evex} kmovq k2, k1
0x62,0xf1,0xfc,0x08,0x90,0xd1

# ATT: {evex} kmovb -16(%rax), %k0
# INTEL: {evex} kmovb k0, byte ptr [rax - 16]
0x62,0xf1,0x7d,0x08,0x90,0x40,0xf0

# ATT: {evex} kmovw -16(%rax), %k0
# INTEL: {evex} kmovw k0, word ptr [rax - 16]
0x62,0xf1,0x7c,0x08,0x90,0x40,0xf0

# ATT: {evex} kmovd -16(%rax), %k0
# INTEL: {evex} kmovd k0, dword ptr [rax - 16]
0x62,0xf1,0xfd,0x08,0x90,0x40,0xf0

# ATT: {evex} kmovq -16(%rax), %k0
# INTEL: {evex} kmovq k0, qword ptr [rax - 16]
0x62,0xf1,0xfc,0x08,0x90,0x40,0xf0

# ATT-NOT: {evex}
# INTEL-NOT: {evex}

Expand Down
14 changes: 13 additions & 1 deletion llvm/test/MC/X86/apx/kmov-att.s
Original file line number Diff line number Diff line change
@@ -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-20: error:
# ERROR-COUNT-24: error:
# ERROR-NOT: error:
# CHECK: {evex} kmovb %k1, %k2
# CHECK: encoding: [0x62,0xf1,0x7d,0x08,0x90,0xd1]
Expand All @@ -15,6 +15,18 @@
# CHECK: {evex} kmovq %k1, %k2
# CHECK: encoding: [0x62,0xf1,0xfc,0x08,0x90,0xd1]
{evex} kmovq %k1, %k2
# CHECK: {evex} kmovb -16(%rax), %k0
# CHECK: encoding: [0x62,0xf1,0x7d,0x08,0x90,0x40,0xf0]
{evex} kmovb -0x10(%rax), %k0
# CHECK: {evex} kmovw -16(%rax), %k0
# CHECK: encoding: [0x62,0xf1,0x7c,0x08,0x90,0x40,0xf0]
{evex} kmovw -0x10(%rax), %k0
# CHECK: {evex} kmovd -16(%rax), %k0
# CHECK: encoding: [0x62,0xf1,0xfd,0x08,0x90,0x40,0xf0]
{evex} kmovd -0x10(%rax), %k0
# CHECK: {evex} kmovq -16(%rax), %k0
# CHECK: encoding: [0x62,0xf1,0xfc,0x08,0x90,0x40,0xf0]
{evex} kmovq -0x10(%rax), %k0

# CHECK-NOT: {evex}

Expand Down
12 changes: 12 additions & 0 deletions llvm/test/MC/X86/apx/kmov-intel.s
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,18 @@
# CHECK: {evex} kmovq k2, k1
# CHECK: encoding: [0x62,0xf1,0xfc,0x08,0x90,0xd1]
{evex} kmovq k2, k1
# CHECK: {evex} kmovb k0, byte ptr [rax - 16]
# CHECK: encoding: [0x62,0xf1,0x7d,0x08,0x90,0x40,0xf0]
{evex} kmovb k0, byte ptr [rax - 0x10]
# CHECK: {evex} kmovw k0, word ptr [rax - 16]
# CHECK: encoding: [0x62,0xf1,0x7c,0x08,0x90,0x40,0xf0]
{evex} kmovw k0, word ptr [rax - 0x10]
# CHECK: {evex} kmovd k0, dword ptr [rax - 16]
# CHECK: encoding: [0x62,0xf1,0xfd,0x08,0x90,0x40,0xf0]
{evex} kmovd k0, dword ptr [rax - 0x10]
# CHECK: {evex} kmovq k0, qword ptr [rax - 16]
# CHECK: encoding: [0x62,0xf1,0xfc,0x08,0x90,0x40,0xf0]
{evex} kmovq k0, qword ptr [rax - 0x10]

# CHECK-NOT: {evex}

Expand Down

0 comments on commit 8732f21

Please sign in to comment.