Skip to content

Commit db7d243

Browse files
authored
[X86][MC] Support enc/dec for IMULZU. (#86653)
apx-spec: https://cdrdv2.intel.com/v1/dl/getContent/784266 apx-syntax-recommendation: https://cdrdv2.intel.com/v1/dl/getContent/817241
1 parent 28760b6 commit db7d243

File tree

6 files changed

+175
-0
lines changed

6 files changed

+175
-0
lines changed

llvm/lib/Target/X86/X86InstrArithmetic.td

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,44 @@ let Predicates = [In64BitMode] in {
334334
def IMUL32rmi_EVEX : IMulOpMI_RF<Xi32, WriteIMul32Imm>, PL;
335335
def IMUL64rmi32_EVEX : IMulOpMI_RF<Xi64, WriteIMul64Imm>, PL;
336336
}
337+
338+
// IMULZU instructions
339+
class IMulZUOpRI8_R<X86TypeInfo t, X86FoldableSchedWrite sched>
340+
: BinOpRI8<0x6B, "imulzu", binop_ndd_args, t, MRMSrcReg,
341+
(outs t.RegClass:$dst)> {
342+
let SchedRW = [sched];
343+
}
344+
class IMulZUOpRI_R<X86TypeInfo t, X86FoldableSchedWrite sched>
345+
: BinOpRI<0x69, "imulzu", binop_ndd_args, t, MRMSrcReg,
346+
(outs t.RegClass:$dst), []> {
347+
let SchedRW = [sched];
348+
}
349+
class IMulZUOpMI8_R<X86TypeInfo t, X86FoldableSchedWrite sched>
350+
: BinOpMI8<"imulzu", binop_ndd_args, t, MRMSrcMem, (outs t.RegClass:$dst)> {
351+
let Opcode = 0x6B;
352+
let SchedRW = [sched.Folded];
353+
}
354+
class IMulZUOpMI_R<X86TypeInfo t, X86FoldableSchedWrite sched>
355+
: BinOpMI<0x69, "imulzu", binop_ndd_args, t, MRMSrcMem,
356+
(outs t.RegClass:$dst), []> {
357+
let SchedRW = [sched.Folded];
358+
}
359+
360+
let Defs = [EFLAGS], Predicates = [HasEGPR, In64BitMode] in {
361+
def IMULZU16rri8 : IMulZUOpRI8_R<Xi16, WriteIMul16Imm>, ZU, PD;
362+
def IMULZU16rmi8 : IMulZUOpMI8_R<Xi16, WriteIMul16Imm>, ZU, PD;
363+
def IMULZU16rri : IMulZUOpRI_R<Xi16, WriteIMul16Imm>, ZU, PD;
364+
def IMULZU16rmi : IMulZUOpMI_R<Xi16, WriteIMul16Imm>, ZU, PD;
365+
def IMULZU32rri8 : IMulZUOpRI8_R<Xi32, WriteIMul32Imm>, ZU;
366+
def IMULZU32rmi8 : IMulZUOpMI8_R<Xi32, WriteIMul32Imm>, ZU;
367+
def IMULZU32rri : IMulZUOpRI_R<Xi32, WriteIMul32Imm>, ZU;
368+
def IMULZU32rmi : IMulZUOpMI_R<Xi32, WriteIMul32Imm>, ZU;
369+
def IMULZU64rri8 : IMulZUOpRI8_R<Xi64, WriteIMul64Imm>, ZU;
370+
def IMULZU64rmi8 : IMulZUOpMI8_R<Xi64, WriteIMul64Imm>, ZU;
371+
def IMULZU64rri32 : IMulZUOpRI_R<Xi64, WriteIMul64Imm>, ZU;
372+
def IMULZU64rmi32 : IMulZUOpMI_R<Xi64, WriteIMul64Imm>, ZU;
373+
}
374+
337375
//===----------------------------------------------------------------------===//
338376
// INC and DEC Instructions
339377
//

llvm/lib/Target/X86/X86InstrUtils.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ class NDD<bit ndd> {
119119
class NF: T_MAP4, EVEX, EVEX_NF;
120120
// PL - Helper for promoted legacy instructions
121121
class PL: T_MAP4, EVEX, ExplicitEVEXPrefix;
122+
// ZU - Helper for Zero Upper instructions
123+
class ZU: T_MAP4, EVEX, EVEX_B;
122124

123125
//===----------------------------------------------------------------------===//
124126
// X86 Type infomation definitions
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# RUN: llvm-mc -triple x86_64 -disassemble %s | FileCheck %s --check-prefix=ATT
2+
# RUN: llvm-mc -triple x86_64 -disassemble -output-asm-variant=1 %s | FileCheck %s --check-prefix=INTEL
3+
4+
# ATT: imulzuw $123, %dx, %dx
5+
# INTEL: imulzu dx, dx, 123
6+
0x62,0xf4,0x7d,0x18,0x6b,0xd2,0x7b
7+
8+
# ATT: imulzul $123, %ecx, %ecx
9+
# INTEL: imulzu ecx, ecx, 123
10+
0x62,0xf4,0x7c,0x18,0x6b,0xc9,0x7b
11+
12+
# ATT: imulzuq $123, %r9, %r9
13+
# INTEL: imulzu r9, r9, 123
14+
0x62,0x54,0xfc,0x18,0x6b,0xc9,0x7b
15+
16+
# ATT: imulzuw $123, 291(%r8,%rax,4), %dx
17+
# INTEL: imulzu dx, word ptr [r8 + 4*rax + 291], 123
18+
0x62,0xd4,0x7d,0x18,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b
19+
20+
# ATT: imulzul $123, 291(%r8,%rax,4), %ecx
21+
# INTEL: imulzu ecx, dword ptr [r8 + 4*rax + 291], 123
22+
0x62,0xd4,0x7c,0x18,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b
23+
24+
# ATT: imulzuq $123, 291(%r8,%rax,4), %r9
25+
# INTEL: imulzu r9, qword ptr [r8 + 4*rax + 291], 123
26+
0x62,0x54,0xfc,0x18,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b
27+
28+
# ATT: imulzuw $1234, %dx, %dx
29+
# INTEL: imulzu dx, dx, 1234
30+
0x62,0xf4,0x7d,0x18,0x69,0xd2,0xd2,0x04
31+
32+
# ATT: imulzuw $1234, 291(%r8,%rax,4), %dx
33+
# INTEL: imulzu dx, word ptr [r8 + 4*rax + 291], 1234
34+
0x62,0xd4,0x7d,0x18,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04
35+
36+
# ATT: imulzul $123456, %ecx, %ecx
37+
# INTEL: imulzu ecx, ecx, 123456
38+
0x62,0xf4,0x7c,0x18,0x69,0xc9,0x40,0xe2,0x01,0x00
39+
40+
# ATT: imulzuq $123456, %r9, %r9
41+
# INTEL: imulzu r9, r9, 123456
42+
0x62,0x54,0xfc,0x18,0x69,0xc9,0x40,0xe2,0x01,0x00
43+
44+
# ATT: imulzul $123456, 291(%r8,%rax,4), %ecx
45+
# INTEL: imulzu ecx, dword ptr [r8 + 4*rax + 291], 123456
46+
0x62,0xd4,0x7c,0x18,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00
47+
48+
# ATT: imulzuq $123456, 291(%r8,%rax,4), %r9
49+
# INTEL: imulzu r9, qword ptr [r8 + 4*rax + 291], 123456
50+
0x62,0x54,0xfc,0x18,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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-12: error:
5+
# ERROR-NOT: error:
6+
# CHECK: imulzuw $123, %dx, %dx
7+
# CHECK: encoding: [0x62,0xf4,0x7d,0x18,0x6b,0xd2,0x7b]
8+
imulzuw $123, %dx, %dx
9+
# CHECK: imulzul $123, %ecx, %ecx
10+
# CHECK: encoding: [0x62,0xf4,0x7c,0x18,0x6b,0xc9,0x7b]
11+
imulzul $123, %ecx, %ecx
12+
# CHECK: imulzuq $123, %r9, %r9
13+
# CHECK: encoding: [0x62,0x54,0xfc,0x18,0x6b,0xc9,0x7b]
14+
imulzuq $123, %r9, %r9
15+
# CHECK: imulzuw $123, 291(%r8,%rax,4), %dx
16+
# CHECK: encoding: [0x62,0xd4,0x7d,0x18,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b]
17+
imulzuw $123, 291(%r8,%rax,4), %dx
18+
# CHECK: imulzul $123, 291(%r8,%rax,4), %ecx
19+
# CHECK: encoding: [0x62,0xd4,0x7c,0x18,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b]
20+
imulzul $123, 291(%r8,%rax,4), %ecx
21+
# CHECK: imulzuq $123, 291(%r8,%rax,4), %r9
22+
# CHECK: encoding: [0x62,0x54,0xfc,0x18,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b]
23+
imulzuq $123, 291(%r8,%rax,4), %r9
24+
# CHECK: imulzuw $1234, %dx, %dx
25+
# CHECK: encoding: [0x62,0xf4,0x7d,0x18,0x69,0xd2,0xd2,0x04]
26+
imulzuw $1234, %dx, %dx
27+
# CHECK: imulzuw $1234, 291(%r8,%rax,4), %dx
28+
# CHECK: encoding: [0x62,0xd4,0x7d,0x18,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04]
29+
imulzuw $1234, 291(%r8,%rax,4), %dx
30+
# CHECK: imulzul $123456, %ecx, %ecx
31+
# CHECK: encoding: [0x62,0xf4,0x7c,0x18,0x69,0xc9,0x40,0xe2,0x01,0x00]
32+
imulzul $123456, %ecx, %ecx
33+
# CHECK: imulzuq $123456, %r9, %r9
34+
# CHECK: encoding: [0x62,0x54,0xfc,0x18,0x69,0xc9,0x40,0xe2,0x01,0x00]
35+
imulzuq $123456, %r9, %r9
36+
# CHECK: imulzul $123456, 291(%r8,%rax,4), %ecx
37+
# CHECK: encoding: [0x62,0xd4,0x7c,0x18,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00]
38+
imulzul $123456, 291(%r8,%rax,4), %ecx
39+
# CHECK: imulzuq $123456, 291(%r8,%rax,4), %r9
40+
# CHECK: encoding: [0x62,0x54,0xfc,0x18,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00]
41+
imulzuq $123456, 291(%r8,%rax,4), %r9

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# RUN: llvm-mc -triple x86_64 -show-encoding -x86-asm-syntax=intel -output-asm-variant=1 %s | FileCheck %s
2+
3+
# CHECK: imulzu dx, dx, 123
4+
# CHECK: encoding: [0x62,0xf4,0x7d,0x18,0x6b,0xd2,0x7b]
5+
imulzu dx, dx, 123
6+
# CHECK: imulzu ecx, ecx, 123
7+
# CHECK: encoding: [0x62,0xf4,0x7c,0x18,0x6b,0xc9,0x7b]
8+
imulzu ecx, ecx, 123
9+
# CHECK: imulzu r9, r9, 123
10+
# CHECK: encoding: [0x62,0x54,0xfc,0x18,0x6b,0xc9,0x7b]
11+
imulzu r9, r9, 123
12+
# CHECK: imulzu dx, word ptr [r8 + 4*rax + 291], 123
13+
# CHECK: encoding: [0x62,0xd4,0x7d,0x18,0x6b,0x94,0x80,0x23,0x01,0x00,0x00,0x7b]
14+
imulzu dx, word ptr [r8 + 4*rax + 291], 123
15+
# CHECK: imulzu ecx, dword ptr [r8 + 4*rax + 291], 123
16+
# CHECK: encoding: [0x62,0xd4,0x7c,0x18,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b]
17+
imulzu ecx, dword ptr [r8 + 4*rax + 291], 123
18+
# CHECK: imulzu r9, qword ptr [r8 + 4*rax + 291], 123
19+
# CHECK: encoding: [0x62,0x54,0xfc,0x18,0x6b,0x8c,0x80,0x23,0x01,0x00,0x00,0x7b]
20+
imulzu r9, qword ptr [r8 + 4*rax + 291], 123
21+
# CHECK: imulzu dx, dx, 1234
22+
# CHECK: encoding: [0x62,0xf4,0x7d,0x18,0x69,0xd2,0xd2,0x04]
23+
imulzu dx, dx, 1234
24+
# CHECK: imulzu dx, word ptr [r8 + 4*rax + 291], 1234
25+
# CHECK: encoding: [0x62,0xd4,0x7d,0x18,0x69,0x94,0x80,0x23,0x01,0x00,0x00,0xd2,0x04]
26+
imulzu dx, word ptr [r8 + 4*rax + 291], 1234
27+
# CHECK: imulzu ecx, ecx, 123456
28+
# CHECK: encoding: [0x62,0xf4,0x7c,0x18,0x69,0xc9,0x40,0xe2,0x01,0x00]
29+
imulzu ecx, ecx, 123456
30+
# CHECK: imulzu r9, r9, 123456
31+
# CHECK: encoding: [0x62,0x54,0xfc,0x18,0x69,0xc9,0x40,0xe2,0x01,0x00]
32+
imulzu r9, r9, 123456
33+
# CHECK: imulzu ecx, dword ptr [r8 + 4*rax + 291], 123456
34+
# CHECK: encoding: [0x62,0xd4,0x7c,0x18,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00]
35+
imulzu ecx, dword ptr [r8 + 4*rax + 291], 123456
36+
# CHECK: imulzu r9, qword ptr [r8 + 4*rax + 291], 123456
37+
# CHECK: encoding: [0x62,0x54,0xfc,0x18,0x69,0x8c,0x80,0x23,0x01,0x00,0x00,0x40,0xe2,0x01,0x00]
38+
imulzu r9, qword ptr [r8 + 4*rax + 291], 123456

llvm/test/TableGen/x86-fold-tables.inc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,12 @@ static const X86FoldTableEntry Table1[] = {
756756
{X86::IMUL64rri32_NF, X86::IMUL64rmi32_NF, 0},
757757
{X86::IMUL64rri8, X86::IMUL64rmi8, 0},
758758
{X86::IMUL64rri8_NF, X86::IMUL64rmi8_NF, 0},
759+
{X86::IMULZU16rri, X86::IMULZU16rmi, 0},
760+
{X86::IMULZU16rri8, X86::IMULZU16rmi8, 0},
761+
{X86::IMULZU32rri, X86::IMULZU32rmi, 0},
762+
{X86::IMULZU32rri8, X86::IMULZU32rmi8, 0},
763+
{X86::IMULZU64rri32, X86::IMULZU64rmi32, 0},
764+
{X86::IMULZU64rri8, X86::IMULZU64rmi8, 0},
759765
{X86::INC16r_ND, X86::INC16m_ND, 0},
760766
{X86::INC16r_NF_ND, X86::INC16m_NF_ND, 0},
761767
{X86::INC32r_ND, X86::INC32m_ND, 0},

0 commit comments

Comments
 (0)