1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mattr=+amx-transpose,+amx-movrs | FileCheck %s --check-prefixes=CHECK,O0
3 ; RUN: llc < %s -O2 -mtriple=x86_64-unknown-unknown -mattr=+amx-transpose,+amx-movrs | FileCheck %s --check-prefixes=CHECK,O2
5 define void @test_amx(i64 %stride, i8* %addr1) #0 {
6 ; CHECK-LABEL: test_amx:
8 ; CHECK-NEXT: t2rpntlvwz0rs (%rsi,%rdi), %tmm0
9 ; CHECK-NEXT: t2rpntlvwz0rst1 (%rsi,%rdi), %tmm2
10 ; CHECK-NEXT: t2rpntlvwz1rs (%rsi,%rdi), %tmm0
11 ; CHECK-NEXT: t2rpntlvwz1rst1 (%rsi,%rdi), %tmm2
13 call void @llvm.x86.t2rpntlvwz0rs(i8 1, i8* %addr1, i64 %stride)
14 call void @llvm.x86.t2rpntlvwz0rst1(i8 2, i8* %addr1, i64 %stride)
15 call void @llvm.x86.t2rpntlvwz1rs(i8 1, i8* %addr1, i64 %stride)
16 call void @llvm.x86.t2rpntlvwz1rst1(i8 2, i8* %addr1, i64 %stride)
19 declare void @llvm.x86.t2rpntlvwz0rs(i8 , i8* , i64 )
20 declare void @llvm.x86.t2rpntlvwz0rst1(i8 , i8* , i64 )
21 declare void @llvm.x86.t2rpntlvwz1rs(i8 , i8* , i64 )
22 declare void @llvm.x86.t2rpntlvwz1rst1(i8 , i8* , i64 )
24 define void @test_amx2(i8* %base, i64 %stride) #0 {
25 ; O0-LABEL: test_amx2:
27 ; O0-NEXT: xorps %xmm0, %xmm0
28 ; O0-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
29 ; O0-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
30 ; O0-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
31 ; O0-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
32 ; O0-NEXT: movb $1, -{{[0-9]+}}(%rsp)
33 ; O0-NEXT: movw $8, %ax
34 ; O0-NEXT: # implicit-def: $al
35 ; O0-NEXT: movb %al, -{{[0-9]+}}(%rsp)
36 ; O0-NEXT: movw %ax, -{{[0-9]+}}(%rsp)
37 ; O0-NEXT: # implicit-def: $al
38 ; O0-NEXT: movb %al, -{{[0-9]+}}(%rsp)
39 ; O0-NEXT: movw %ax, -{{[0-9]+}}(%rsp)
40 ; O0-NEXT: ldtilecfg -{{[0-9]+}}(%rsp)
41 ; O0-NEXT: t2rpntlvwz0rst1 (%rdi,%rsi), %tmm4
42 ; O0-NEXT: movw $8, %ax
43 ; O0-NEXT: # implicit-def: $al
44 ; O0-NEXT: movb %al, -{{[0-9]+}}(%rsp)
45 ; O0-NEXT: movw %ax, -{{[0-9]+}}(%rsp)
46 ; O0-NEXT: # implicit-def: $al
47 ; O0-NEXT: movb %al, -{{[0-9]+}}(%rsp)
48 ; O0-NEXT: movw %ax, -{{[0-9]+}}(%rsp)
49 ; O0-NEXT: ldtilecfg -{{[0-9]+}}(%rsp)
50 ; O0-NEXT: t2rpntlvwz1rs (%rdi,%rsi), %tmm4
51 ; O0-NEXT: movw $8, %ax
52 ; O0-NEXT: # implicit-def: $al
53 ; O0-NEXT: movb %al, -{{[0-9]+}}(%rsp)
54 ; O0-NEXT: movw %ax, -{{[0-9]+}}(%rsp)
55 ; O0-NEXT: # implicit-def: $al
56 ; O0-NEXT: movb %al, -{{[0-9]+}}(%rsp)
57 ; O0-NEXT: movw %ax, -{{[0-9]+}}(%rsp)
58 ; O0-NEXT: ldtilecfg -{{[0-9]+}}(%rsp)
59 ; O0-NEXT: t2rpntlvwz1rst1 (%rdi,%rsi), %tmm4
60 ; O0-NEXT: tilerelease
63 ; O2-LABEL: test_amx2:
65 ; O2-NEXT: xorps %xmm0, %xmm0
66 ; O2-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
67 ; O2-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
68 ; O2-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
69 ; O2-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
70 ; O2-NEXT: movb $1, -{{[0-9]+}}(%rsp)
71 ; O2-NEXT: movb $8, -{{[0-9]+}}(%rsp)
72 ; O2-NEXT: movw $8, -{{[0-9]+}}(%rsp)
73 ; O2-NEXT: movb $8, -{{[0-9]+}}(%rsp)
74 ; O2-NEXT: movw $8, -{{[0-9]+}}(%rsp)
75 ; O2-NEXT: ldtilecfg -{{[0-9]+}}(%rsp)
76 ; O2-NEXT: movw $8, %ax
77 ; O2-NEXT: t2rpntlvwz0rs (%rdi,%rsi), %tmm4
78 ; O2-NEXT: t2rpntlvwz0rst1 (%rdi,%rsi), %tmm4
79 ; O2-NEXT: t2rpntlvwz1rs (%rdi,%rsi), %tmm4
80 ; O2-NEXT: t2rpntlvwz1rst1 (%rdi,%rsi), %tmm4
81 ; O2-NEXT: tilerelease
83 call { x86_amx, x86_amx } @llvm.x86.t2rpntlvwz0rs.internal(i16 8, i16 8, i16 8, i8* %base, i64 %stride)
84 call { x86_amx, x86_amx } @llvm.x86.t2rpntlvwz0rst1.internal(i16 8, i16 8, i16 8, i8* %base, i64 %stride)
85 call { x86_amx, x86_amx } @llvm.x86.t2rpntlvwz1rs.internal(i16 8, i16 8, i16 8, i8* %base, i64 %stride)
86 call { x86_amx, x86_amx } @llvm.x86.t2rpntlvwz1rst1.internal(i16 8, i16 8, i16 8, i8* %base, i64 %stride)
89 declare { x86_amx, x86_amx } @llvm.x86.t2rpntlvwz0rs.internal(i16, i16, i16, i8*, i64)
90 declare { x86_amx, x86_amx } @llvm.x86.t2rpntlvwz0rst1.internal(i16, i16, i16, i8*, i64)
91 declare { x86_amx, x86_amx } @llvm.x86.t2rpntlvwz1rs.internal(i16, i16, i16, i8*, i64)
92 declare { x86_amx, x86_amx } @llvm.x86.t2rpntlvwz1rst1.internal(i16, i16, i16, i8*, i64)