Skip to content

Commit 7b3323f

Browse files
authored
[X86][MC] Support Enc/Dec for EGPR for promoted CET instruction (#76023)
R16-R31 was added into GPRs in #70958, This patch supports the encoding/decoding for promoted CET instruction in EVEX space. RFC: https://discourse.llvm.org/t/rfc-design-for-apx-feature-egpr-and-ndd-support/73031/4
1 parent 4d1cd38 commit 7b3323f

File tree

13 files changed

+93
-0
lines changed

13 files changed

+93
-0
lines changed

llvm/lib/Target/X86/X86InstrSystem.td

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,7 @@ let SchedRW = [WriteSystem] in {
520520
} // Defs SSP
521521
} // Uses SSP
522522

523+
let Predicates = [NoEGPR] in {
523524
def WRSSD : I<0xF6, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
524525
"wrssd\t{$src, $dst|$dst, $src}",
525526
[(int_x86_wrssd GR32:$src, addr:$dst)]>, T8PS;
@@ -532,6 +533,22 @@ let SchedRW = [WriteSystem] in {
532533
def WRUSSQ : RI<0xF5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
533534
"wrussq\t{$src, $dst|$dst, $src}",
534535
[(int_x86_wrussq GR64:$src, addr:$dst)]>, T8PD;
536+
}
537+
538+
let Predicates = [HasEGPR, In64BitMode] in {
539+
def WRSSD_EVEX : I<0x66, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
540+
"wrssd\t{$src, $dst|$dst, $src}",
541+
[(int_x86_wrssd GR32:$src, addr:$dst)]>, EVEX, NoCD8, T_MAP4PS;
542+
def WRSSQ_EVEX : RI<0x66, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
543+
"wrssq\t{$src, $dst|$dst, $src}",
544+
[(int_x86_wrssq GR64:$src, addr:$dst)]>, EVEX, NoCD8, T_MAP4PS;
545+
def WRUSSD_EVEX : I<0x65, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
546+
"wrussd\t{$src, $dst|$dst, $src}",
547+
[(int_x86_wrussd GR32:$src, addr:$dst)]>, EVEX, NoCD8, T_MAP4PD;
548+
def WRUSSQ_EVEX : RI<0x65, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
549+
"wrussq\t{$src, $dst|$dst, $src}",
550+
[(int_x86_wrussq GR64:$src, addr:$dst)]>, EVEX, NoCD8, T_MAP4PD;
551+
}
535552

536553
let Defs = [SSP] in {
537554
let Uses = [SSP] in {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# RUN: llvm-mc --disassemble %s -triple=x86_64 | FileCheck %s --check-prefixes=ATT
2+
# RUN: llvm-mc --disassemble %s -triple=x86_64 -x86-asm-syntax=intel --output-asm-variant=1 | FileCheck %s --check-prefixes=INTEL
3+
4+
# ATT: wrssd %r18d, 291(%r28,%r29,4)
5+
# INTEL: wrssd dword ptr [r28 + 4*r29 + 291], r18d
6+
0x62,0x8c,0x78,0x08,0x66,0x94,0xac,0x23,0x01,0x00,0x00
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# RUN: llvm-mc --disassemble %s -triple=x86_64 | FileCheck %s --check-prefixes=ATT
2+
# RUN: llvm-mc --disassemble %s -triple=x86_64 -x86-asm-syntax=intel --output-asm-variant=1 | FileCheck %s --check-prefixes=INTEL
3+
4+
# ATT: wrssq %r19, 291(%r28,%r29,4)
5+
# INTEL: wrssq qword ptr [r28 + 4*r29 + 291], r19
6+
0x62,0x8c,0xf8,0x08,0x66,0x9c,0xac,0x23,0x01,0x00,0x00
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# RUN: llvm-mc --disassemble %s -triple=x86_64 | FileCheck %s --check-prefixes=ATT
2+
# RUN: llvm-mc --disassemble %s -triple=x86_64 -x86-asm-syntax=intel --output-asm-variant=1 | FileCheck %s --check-prefixes=INTEL
3+
4+
# ATT: wrussd %r18d, 291(%r28,%r29,4)
5+
# INTEL: wrussd dword ptr [r28 + 4*r29 + 291], r18d
6+
0x62,0x8c,0x79,0x08,0x65,0x94,0xac,0x23,0x01,0x00,0x00
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# RUN: llvm-mc --disassemble %s -triple=x86_64 | FileCheck %s --check-prefixes=ATT
2+
# RUN: llvm-mc --disassemble %s -triple=x86_64 -x86-asm-syntax=intel --output-asm-variant=1 | FileCheck %s --check-prefixes=INTEL
3+
4+
# ATT: wrussq %r19, 291(%r28,%r29,4)
5+
# INTEL: wrussq qword ptr [r28 + 4*r29 + 291], r19
6+
0x62,0x8c,0xf9,0x08,0x65,0x9c,0xac,0x23,0x01,0x00,0x00

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# RUN: llvm-mc -triple x86_64 --show-encoding %s | FileCheck %s
2+
# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR
3+
4+
# ERROR-COUNT-1: error:
5+
# ERROR-NOT: error:
6+
# CHECK: wrssd %r18d, 291(%r28,%r29,4)
7+
# CHECK: encoding: [0x62,0x8c,0x78,0x08,0x66,0x94,0xac,0x23,0x01,0x00,0x00]
8+
wrssd %r18d, 291(%r28,%r29,4)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# RUN: llvm-mc -triple x86_64 -x86-asm-syntax=intel -output-asm-variant=1 --show-encoding %s | FileCheck %s
2+
3+
# CHECK: wrssd dword ptr [r28 + 4*r29 + 291], r18d
4+
# CHECK: encoding: [0x62,0x8c,0x78,0x08,0x66,0x94,0xac,0x23,0x01,0x00,0x00]
5+
wrssd dword ptr [r28 + 4*r29 + 291], r18d

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# RUN: llvm-mc -triple x86_64 --show-encoding %s | FileCheck %s
2+
# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR
3+
4+
# ERROR-COUNT-1: error:
5+
# ERROR-NOT: error:
6+
# CHECK: wrssq %r19, 291(%r28,%r29,4)
7+
# CHECK: encoding: [0x62,0x8c,0xf8,0x08,0x66,0x9c,0xac,0x23,0x01,0x00,0x00]
8+
wrssq %r19, 291(%r28,%r29,4)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# RUN: llvm-mc -triple x86_64 -x86-asm-syntax=intel -output-asm-variant=1 --show-encoding %s | FileCheck %s
2+
3+
# CHECK: wrssq qword ptr [r28 + 4*r29 + 291], r19
4+
# CHECK: encoding: [0x62,0x8c,0xf8,0x08,0x66,0x9c,0xac,0x23,0x01,0x00,0x00]
5+
wrssq qword ptr [r28 + 4*r29 + 291], r19

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# RUN: llvm-mc -triple x86_64 --show-encoding %s | FileCheck %s
2+
# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR
3+
4+
# ERROR-COUNT-1: error:
5+
# ERROR-NOT: error:
6+
# CHECK: wrussd %r18d, 291(%r28,%r29,4)
7+
# CHECK: encoding: [0x62,0x8c,0x79,0x08,0x65,0x94,0xac,0x23,0x01,0x00,0x00]
8+
wrussd %r18d, 291(%r28,%r29,4)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# RUN: llvm-mc -triple x86_64 -x86-asm-syntax=intel -output-asm-variant=1 --show-encoding %s | FileCheck %s
2+
3+
# CHECK: wrussd dword ptr [r28 + 4*r29 + 291], r18d
4+
# CHECK: encoding: [0x62,0x8c,0x79,0x08,0x65,0x94,0xac,0x23,0x01,0x00,0x00]
5+
wrussd dword ptr [r28 + 4*r29 + 291], r18d

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# RUN: llvm-mc -triple x86_64 --show-encoding %s | FileCheck %s
2+
# RUN: not llvm-mc -triple i386 -show-encoding %s 2>&1 | FileCheck %s --check-prefix=ERROR
3+
4+
# ERROR-COUNT-1: error:
5+
# ERROR-NOT: error:
6+
# CHECK: wrussq %r19, 291(%r28,%r29,4)
7+
# CHECK: encoding: [0x62,0x8c,0xf9,0x08,0x65,0x9c,0xac,0x23,0x01,0x00,0x00]
8+
wrussq %r19, 291(%r28,%r29,4)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# RUN: llvm-mc -triple x86_64 -x86-asm-syntax=intel -output-asm-variant=1 --show-encoding %s | FileCheck %s
2+
3+
# CHECK: wrussq qword ptr [r28 + 4*r29 + 291], r19
4+
# CHECK: encoding: [0x62,0x8c,0xf9,0x08,0x65,0x9c,0xac,0x23,0x01,0x00,0x00]
5+
wrussq qword ptr [r28 + 4*r29 + 291], r19

0 commit comments

Comments
 (0)