xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.i1.ll (revision 30ee3f4ec767f2f183d74eb949afa80b8b6261e2)
1*30ee3f4eSMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2*30ee3f4eSMatt Arsenault; RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefix=WAVE64 %s
3*30ee3f4eSMatt Arsenault; RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck -check-prefix=WAVE32 %s
4*30ee3f4eSMatt Arsenault
5*30ee3f4eSMatt Arsenaultdefine i32 @s_andn2_i1_vcc(i32 %arg0, i32 %arg1) {
6*30ee3f4eSMatt Arsenault; WAVE64-LABEL: s_andn2_i1_vcc:
7*30ee3f4eSMatt Arsenault; WAVE64:       ; %bb.0:
8*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
9*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
10*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, v1
11*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
12*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
13*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
14*30ee3f4eSMatt Arsenault;
15*30ee3f4eSMatt Arsenault; WAVE32-LABEL: s_andn2_i1_vcc:
16*30ee3f4eSMatt Arsenault; WAVE32:       ; %bb.0:
17*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
18*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 0, v0
19*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_ne_u32_e64 s4, 0, v1
20*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, vcc_lo, s4
21*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
22*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
23*30ee3f4eSMatt Arsenault  %src0 = icmp eq i32 %arg0, 0
24*30ee3f4eSMatt Arsenault  %src1 = icmp eq i32 %arg1, 0
25*30ee3f4eSMatt Arsenault  %not.src1 = xor i1 %src1, true
26*30ee3f4eSMatt Arsenault  %and = and i1 %src0, %not.src1
27*30ee3f4eSMatt Arsenault  %select = select i1 %and, i32 1, i32 0
28*30ee3f4eSMatt Arsenault  ret i32 %select
29*30ee3f4eSMatt Arsenault}
30*30ee3f4eSMatt Arsenault
31*30ee3f4eSMatt Arsenaultdefine i32 @s_andn2_i1_vcc_commute(i32 %arg0, i32 %arg1) {
32*30ee3f4eSMatt Arsenault; WAVE64-LABEL: s_andn2_i1_vcc_commute:
33*30ee3f4eSMatt Arsenault; WAVE64:       ; %bb.0:
34*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
35*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
36*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, v1
37*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
38*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
39*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
40*30ee3f4eSMatt Arsenault;
41*30ee3f4eSMatt Arsenault; WAVE32-LABEL: s_andn2_i1_vcc_commute:
42*30ee3f4eSMatt Arsenault; WAVE32:       ; %bb.0:
43*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
44*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 0, v0
45*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_ne_u32_e64 s4, 0, v1
46*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, s4, vcc_lo
47*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
48*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
49*30ee3f4eSMatt Arsenault  %src0 = icmp eq i32 %arg0, 0
50*30ee3f4eSMatt Arsenault  %src1 = icmp eq i32 %arg1, 0
51*30ee3f4eSMatt Arsenault  %not.src1 = xor i1 %src1, true
52*30ee3f4eSMatt Arsenault  %and = and i1 %not.src1, %src0
53*30ee3f4eSMatt Arsenault  %select = select i1 %and, i32 1, i32 0
54*30ee3f4eSMatt Arsenault  ret i32 %select
55*30ee3f4eSMatt Arsenault}
56*30ee3f4eSMatt Arsenault
57*30ee3f4eSMatt Arsenaultdefine i32 @s_andn2_i1_vcc_multi_use(i32 %arg0, i32 %arg1) {
58*30ee3f4eSMatt Arsenault; WAVE64-LABEL: s_andn2_i1_vcc_multi_use:
59*30ee3f4eSMatt Arsenault; WAVE64:       ; %bb.0:
60*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
61*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, v1
62*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
63*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
64*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
65*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cndmask_b32_e64 v0, v0, 1, s[4:5]
66*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
67*30ee3f4eSMatt Arsenault;
68*30ee3f4eSMatt Arsenault; WAVE32-LABEL: s_andn2_i1_vcc_multi_use:
69*30ee3f4eSMatt Arsenault; WAVE32:       ; %bb.0:
70*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
71*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_ne_u32_e64 s4, 0, v1
72*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 0, v0
73*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
74*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, vcc_lo, s4
75*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cndmask_b32_e64 v0, v0, 1, s4
76*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
77*30ee3f4eSMatt Arsenault  %src0 = icmp eq i32 %arg0, 0
78*30ee3f4eSMatt Arsenault  %src1 = icmp eq i32 %arg1, 0
79*30ee3f4eSMatt Arsenault  %not.src1 = xor i1 %src1, -1
80*30ee3f4eSMatt Arsenault  %user = zext i1 %not.src1 to i32
81*30ee3f4eSMatt Arsenault  %and = and i1 %src0, %not.src1
82*30ee3f4eSMatt Arsenault  %select = select i1 %and, i32 1, i32 %user
83*30ee3f4eSMatt Arsenault  ret i32 %select
84*30ee3f4eSMatt Arsenault}
85*30ee3f4eSMatt Arsenault
86*30ee3f4eSMatt Arsenaultdefine <2 x i32> @s_andn2_v2i1_vcc(<2 x i32> %arg0, <2 x i32> %arg1) {
87*30ee3f4eSMatt Arsenault; WAVE64-LABEL: s_andn2_v2i1_vcc:
88*30ee3f4eSMatt Arsenault; WAVE64:       ; %bb.0:
89*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
90*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
91*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, v2
92*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_eq_u32_e64 s[6:7], 0, v1
93*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_ne_u32_e64 s[8:9], 0, v3
94*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_and_b64 s[4:5], vcc, s[4:5]
95*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
96*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_and_b64 s[4:5], s[6:7], s[8:9]
97*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[4:5]
98*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
99*30ee3f4eSMatt Arsenault;
100*30ee3f4eSMatt Arsenault; WAVE32-LABEL: s_andn2_v2i1_vcc:
101*30ee3f4eSMatt Arsenault; WAVE32:       ; %bb.0:
102*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
103*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 0, v0
104*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_ne_u32_e64 s4, 0, v2
105*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_eq_u32_e64 s5, 0, v1
106*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_ne_u32_e64 s6, 0, v3
107*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, vcc_lo, s4
108*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
109*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, s5, s6
110*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s4
111*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
112*30ee3f4eSMatt Arsenault  %src0 = icmp eq <2 x i32> %arg0, zeroinitializer
113*30ee3f4eSMatt Arsenault  %src1 = icmp eq <2 x i32> %arg1, zeroinitializer
114*30ee3f4eSMatt Arsenault  %not.src1 = xor <2 x i1> %src1, <i1 true, i1 true>
115*30ee3f4eSMatt Arsenault  %and = and <2 x i1> %src0, %not.src1
116*30ee3f4eSMatt Arsenault  %select = select <2 x i1> %and, <2 x i32> <i32 1, i32 1>, <2 x i32> zeroinitializer
117*30ee3f4eSMatt Arsenault  ret <2 x i32> %select
118*30ee3f4eSMatt Arsenault}
119*30ee3f4eSMatt Arsenault
120*30ee3f4eSMatt Arsenaultdefine <2 x i32> @s_andn2_v2i1_vcc_commute(<2 x i32> %arg0, <2 x i32> %arg1) {
121*30ee3f4eSMatt Arsenault; WAVE64-LABEL: s_andn2_v2i1_vcc_commute:
122*30ee3f4eSMatt Arsenault; WAVE64:       ; %bb.0:
123*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
124*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
125*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, v2
126*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_eq_u32_e64 s[6:7], 0, v1
127*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cmp_ne_u32_e64 s[8:9], 0, v3
128*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_and_b64 s[4:5], s[4:5], vcc
129*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
130*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_and_b64 s[4:5], s[8:9], s[6:7]
131*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[4:5]
132*30ee3f4eSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
133*30ee3f4eSMatt Arsenault;
134*30ee3f4eSMatt Arsenault; WAVE32-LABEL: s_andn2_v2i1_vcc_commute:
135*30ee3f4eSMatt Arsenault; WAVE32:       ; %bb.0:
136*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
137*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 0, v0
138*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_ne_u32_e64 s4, 0, v2
139*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_eq_u32_e64 s5, 0, v1
140*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cmp_ne_u32_e64 s6, 0, v3
141*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, s4, vcc_lo
142*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s4
143*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, s6, s5
144*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s4
145*30ee3f4eSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
146*30ee3f4eSMatt Arsenault  %src0 = icmp eq <2 x i32> %arg0, zeroinitializer
147*30ee3f4eSMatt Arsenault  %src1 = icmp eq <2 x i32> %arg1, zeroinitializer
148*30ee3f4eSMatt Arsenault  %not.src1 = xor <2 x i1> %src1, <i1 true, i1 true>
149*30ee3f4eSMatt Arsenault  %and = and <2 x i1> %not.src1, %src0
150*30ee3f4eSMatt Arsenault  %select = select <2 x i1> %and, <2 x i32> <i32 1, i32 1>, <2 x i32> zeroinitializer
151*30ee3f4eSMatt Arsenault  ret <2 x i32> %select
152*30ee3f4eSMatt Arsenault}
153*30ee3f4eSMatt Arsenault
154