xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-uminv.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -asm-verbose=false | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @vmin_u8x8(<8 x i8> %a) nounwind ssp {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vmin_u8x8:
5*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8b        b[[REG:[0-9]+]], v0
6*9880d681SAndroid Build Coastguard Worker; CHECK: fmov    [[REG2:w[0-9]+]], s[[REG]]
7*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and
8*9880d681SAndroid Build Coastguard Worker; CHECK: cbz     [[REG2]],
9*9880d681SAndroid Build Coastguard Workerentry:
10*9880d681SAndroid Build Coastguard Worker  %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %a) nounwind
11*9880d681SAndroid Build Coastguard Worker  %tmp = trunc i32 %vminv.i to i8
12*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %tmp, 0
13*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %return, label %if.then
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerif.then:
16*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() nounwind
17*9880d681SAndroid Build Coastguard Worker  br label %return
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerreturn:
20*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
21*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdeclare i32 @bar(...)
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdefine i32 @vmin_u4x16(<4 x i16> %a) nounwind ssp {
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vmin_u4x16:
28*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.4h        h[[REG:[0-9]+]], v0
29*9880d681SAndroid Build Coastguard Worker; CHECK: fmov    [[REG2:w[0-9]+]], s[[REG]]
30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and
31*9880d681SAndroid Build Coastguard Worker; CHECK: cbz     [[REG2]],
32*9880d681SAndroid Build Coastguard Workerentry:
33*9880d681SAndroid Build Coastguard Worker  %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v4i16(<4 x i16> %a) nounwind
34*9880d681SAndroid Build Coastguard Worker  %tmp = trunc i32 %vminv.i to i16
35*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i16 %tmp, 0
36*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %return, label %if.then
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerif.then:
39*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() nounwind
40*9880d681SAndroid Build Coastguard Worker  br label %return
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerreturn:
43*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
44*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine i32 @vmin_u8x16(<8 x i16> %a) nounwind ssp {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vmin_u8x16:
49*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8h        h[[REG:[0-9]+]], v0
50*9880d681SAndroid Build Coastguard Worker; CHECK: fmov    [[REG2:w[0-9]+]], s[[REG]]
51*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and
52*9880d681SAndroid Build Coastguard Worker; CHECK: cbz     [[REG2]],
53*9880d681SAndroid Build Coastguard Workerentry:
54*9880d681SAndroid Build Coastguard Worker  %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i16(<8 x i16> %a) nounwind
55*9880d681SAndroid Build Coastguard Worker  %tmp = trunc i32 %vminv.i to i16
56*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i16 %tmp, 0
57*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %return, label %if.then
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerif.then:
60*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() nounwind
61*9880d681SAndroid Build Coastguard Worker  br label %return
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerreturn:
64*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
65*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine i32 @vmin_u16x8(<16 x i8> %a) nounwind ssp {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vmin_u16x8:
70*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.16b        b[[REG:[0-9]+]], v0
71*9880d681SAndroid Build Coastguard Worker; CHECK: fmov     [[REG2:w[0-9]+]], s[[REG]]
72*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and
73*9880d681SAndroid Build Coastguard Worker; CHECK: cbz     [[REG2]],
74*9880d681SAndroid Build Coastguard Workerentry:
75*9880d681SAndroid Build Coastguard Worker  %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %a) nounwind
76*9880d681SAndroid Build Coastguard Worker  %tmp = trunc i32 %vminv.i to i8
77*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %tmp, 0
78*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %return, label %if.then
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerif.then:
81*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() nounwind
82*9880d681SAndroid Build Coastguard Worker  br label %return
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerreturn:
85*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
86*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vminv_u8_used_by_laneop(<8 x i8> %a1, <8 x i8> %a2) {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_u8_used_by_laneop:
91*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8b b[[REGNUM:[0-9]+]], v1
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0]
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
94*9880d681SAndroid Build Coastguard Workerentry:
95*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %a2)
96*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i8
97*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <8 x i8> %a1, i8 %1, i32 3
98*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %2
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vminv_u16_used_by_laneop(<4 x i16> %a1, <4 x i16> %a2) {
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_u16_used_by_laneop:
103*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.4h h[[REGNUM:[0-9]+]], v1
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0]
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
106*9880d681SAndroid Build Coastguard Workerentry:
107*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v4i16(<4 x i16> %a2)
108*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i16
109*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <4 x i16> %a1, i16 %1, i32 3
110*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %2
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vminv_u32_used_by_laneop(<2 x i32> %a1, <2 x i32> %a2) {
114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_u32_used_by_laneop:
115*9880d681SAndroid Build Coastguard Worker; CHECK: uminp.2s v[[REGNUM:[0-9]+]], v1, v1
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], v[[REGNUM]][0]
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
118*9880d681SAndroid Build Coastguard Workerentry:
119*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v2i32(<2 x i32> %a2)
120*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x i32> %a1, i32 %0, i32 1
121*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %1
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vminvq_u8_used_by_laneop(<16 x i8> %a1, <16 x i8> %a2) {
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_u8_used_by_laneop:
126*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.16b b[[REGNUM:[0-9]+]], v1
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0]
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
129*9880d681SAndroid Build Coastguard Workerentry:
130*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %a2)
131*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i8
132*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <16 x i8> %a1, i8 %1, i32 3
133*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vminvq_u16_used_by_laneop(<8 x i16> %a1, <8 x i16> %a2) {
137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_u16_used_by_laneop:
138*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8h h[[REGNUM:[0-9]+]], v1
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0]
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
141*9880d681SAndroid Build Coastguard Workerentry:
142*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i16(<8 x i16> %a2)
143*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i16
144*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <8 x i16> %a1, i16 %1, i32 3
145*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vminvq_u32_used_by_laneop(<4 x i32> %a1, <4 x i32> %a2) {
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_u32_used_by_laneop:
150*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.4s s[[REGNUM:[0-9]+]], v1
151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], v[[REGNUM]][0]
152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
153*9880d681SAndroid Build Coastguard Workerentry:
154*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v4i32(<4 x i32> %a2)
155*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x i32> %a1, i32 %0, i32 3
156*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %1
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8>) nounwind readnone
159*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v8i16(<8 x i16>) nounwind readnone
160*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v4i16(<4 x i16>) nounwind readnone
161*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8>) nounwind readnone
162*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v2i32(<2 x i32>) nounwind readnone
163*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v4i32(<4 x i32>) nounwind readnone
164