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