xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/vector-rem.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @foo(<4 x i32> %t, <4 x i32> %u) {
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo:
6*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,1,2,3]
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm2, %eax
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,1,2,3]
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm2, %ecx
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    cltd
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    idivl %ecx
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %edx, %xmm2
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3]
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm3, %eax
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm3, %ecx
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    cltd
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    idivl %ecx
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %edx, %xmm3
21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm0, %eax
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm1, %ecx
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    cltd
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    idivl %ecx
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %edx, %xmm2
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm0, %eax
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm0, %ecx
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    cltd
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    idivl %ecx
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %edx, %xmm0
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm2, %xmm0
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
38*9880d681SAndroid Build Coastguard Worker;
39*9880d681SAndroid Build Coastguard Worker  %m = srem <4 x i32> %t, %u
40*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %m
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @bar(<4 x i32> %t, <4 x i32> %u) {
44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bar:
45*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,1,2,3]
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm2, %eax
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,1,2,3]
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm2, %ecx
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    xorl %edx, %edx
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    divl %ecx
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %edx, %xmm2
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3]
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm3, %eax
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm3, %ecx
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    xorl %edx, %edx
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    divl %ecx
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %edx, %xmm3
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm0, %eax
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm1, %ecx
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    xorl %edx, %edx
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    divl %ecx
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %edx, %xmm2
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm0, %eax
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %xmm0, %ecx
70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    xorl %edx, %edx
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    divl %ecx
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movd %edx, %xmm0
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm2, %xmm0
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
77*9880d681SAndroid Build Coastguard Worker;
78*9880d681SAndroid Build Coastguard Worker  %m = urem <4 x i32> %t, %u
79*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %m
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @qux(<4 x float> %t, <4 x float> %u) {
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qux:
84*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    subq $72, %rsp
86*9880d681SAndroid Build Coastguard Worker; CHECK:         movaps %xmm1, {{[0-9]+}}(%rsp)
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp)
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    callq fmodf
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movaps %xmm0, (%rsp)
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm0
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm1
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,2,3]
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    callq fmodf
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    unpcklps (%rsp), %xmm0
98*9880d681SAndroid Build Coastguard Worker; CHECK:         movaps %xmm0, (%rsp)
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm0
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm1
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    callq fmodf
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp)
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movapd {{[0-9]+}}(%rsp), %xmm0
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movapd {{[0-9]+}}(%rsp), %xmm1
106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1,0]
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    callq fmodf
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm1
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    unpcklps (%rsp), %xmm1
111*9880d681SAndroid Build Coastguard Worker; CHECK:         movaps %xmm1, %xmm0
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    addq $72, %rsp
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
114*9880d681SAndroid Build Coastguard Worker;
115*9880d681SAndroid Build Coastguard Worker  %m = frem <4 x float> %t, %u
116*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %m
117*9880d681SAndroid Build Coastguard Worker}
118