1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL {{^}}sextload_i1_to_i32_trunc_cmp_eq_0: 5*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[LOAD:v[0-9]+]] 6*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]] 7*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_eq_i32_e32 vcc, 0, [[TMP]]{{$}} 8*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 9*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte 10*9880d681SAndroid Build Coastguard Workerdefine void @sextload_i1_to_i32_trunc_cmp_eq_0(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 11*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 12*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %load to i32 13*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ext, 0 14*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 15*9880d681SAndroid Build Coastguard Worker ret void 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; FIXME: The negate should be inverting the compare. 19*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_eq_0: 20*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[LOAD:v[0-9]+]] 21*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]] 22*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_eq_i32_e32 vcc, 1, [[TMP]]{{$}} 23*9880d681SAndroid Build Coastguard Worker; SI-NEXT: s_xor_b64 [[NEG:s\[[0-9]+:[0-9]+\]]], vcc, -1 24*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[NEG]] 25*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 26*9880d681SAndroid Build Coastguard Workerdefine void @zextload_i1_to_i32_trunc_cmp_eq_0(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 27*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 28*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %load to i32 29*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ext, 0 30*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 31*9880d681SAndroid Build Coastguard Worker ret void 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sextload_i1_to_i32_trunc_cmp_eq_1: 35*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}} 36*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 37*9880d681SAndroid Build Coastguard Workerdefine void @sextload_i1_to_i32_trunc_cmp_eq_1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 38*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 39*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %load to i32 40*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ext, 1 41*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_eq_1: 46*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[LOAD:v[0-9]+]] 47*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[RESULT:v[0-9]+]], 1, [[LOAD]] 48*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 49*9880d681SAndroid Build Coastguard Workerdefine void @zextload_i1_to_i32_trunc_cmp_eq_1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 50*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 51*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %load to i32 52*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ext, 1 53*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sextload_i1_to_i32_trunc_cmp_eq_neg1: 58*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[LOAD:v[0-9]+]] 59*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[RESULT:v[0-9]+]], 1, [[LOAD]] 60*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 61*9880d681SAndroid Build Coastguard Workerdefine void @sextload_i1_to_i32_trunc_cmp_eq_neg1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 62*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 63*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %load to i32 64*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ext, -1 65*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 66*9880d681SAndroid Build Coastguard Worker ret void 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_eq_neg1: 70*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}} 71*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 72*9880d681SAndroid Build Coastguard Workerdefine void @zextload_i1_to_i32_trunc_cmp_eq_neg1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 73*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 74*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %load to i32 75*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %ext, -1 76*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 77*9880d681SAndroid Build Coastguard Worker ret void 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL {{^}}sextload_i1_to_i32_trunc_cmp_ne_0: 82*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[LOAD:v[0-9]+]] 83*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]] 84*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 85*9880d681SAndroid Build Coastguard Workerdefine void @sextload_i1_to_i32_trunc_cmp_ne_0(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 86*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 87*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %load to i32 88*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %ext, 0 89*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 90*9880d681SAndroid Build Coastguard Worker ret void 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_ne_0: 94*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[LOAD:v[0-9]+]] 95*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]] 96*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 97*9880d681SAndroid Build Coastguard Workerdefine void @zextload_i1_to_i32_trunc_cmp_ne_0(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 98*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 99*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %load to i32 100*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %ext, 0 101*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 102*9880d681SAndroid Build Coastguard Worker ret void 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sextload_i1_to_i32_trunc_cmp_ne_1: 106*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 1{{$}} 107*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 108*9880d681SAndroid Build Coastguard Workerdefine void @sextload_i1_to_i32_trunc_cmp_ne_1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 109*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 110*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %load to i32 111*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %ext, 1 112*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 113*9880d681SAndroid Build Coastguard Worker ret void 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_ne_1: 117*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[LOAD:v[0-9]+]] 118*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]] 119*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_eq_i32_e32 vcc, 1, [[TMP]]{{$}} 120*9880d681SAndroid Build Coastguard Worker; SI-NEXT: s_xor_b64 [[NEG:s\[[0-9]+:[0-9]+\]]], vcc, -1 121*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[NEG]] 122*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 123*9880d681SAndroid Build Coastguard Workerdefine void @zextload_i1_to_i32_trunc_cmp_ne_1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 124*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 125*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %load to i32 126*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %ext, 1 127*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 128*9880d681SAndroid Build Coastguard Worker ret void 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; FIXME: This should be one compare. 132*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sextload_i1_to_i32_trunc_cmp_ne_neg1: 133*9880d681SAndroid Build Coastguard Worker; XSI: buffer_load_ubyte [[LOAD:v[0-9]+]] 134*9880d681SAndroid Build Coastguard Worker; XSI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]] 135*9880d681SAndroid Build Coastguard Worker; XSI: v_cmp_eq_i32_e64 [[CMP0:s\[[0-9]+:[0-9]+\]]], [[TMP]], 0{{$}} 136*9880d681SAndroid Build Coastguard Worker; XSI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[CMP0]] 137*9880d681SAndroid Build Coastguard Worker; XSI-NEXT: buffer_store_byte [[RESULT]] 138*9880d681SAndroid Build Coastguard Workerdefine void @sextload_i1_to_i32_trunc_cmp_ne_neg1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 139*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 140*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %load to i32 141*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %ext, -1 142*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 143*9880d681SAndroid Build Coastguard Worker ret void 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_ne_neg1: 147*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 1{{$}} 148*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]] 149*9880d681SAndroid Build Coastguard Workerdefine void @zextload_i1_to_i32_trunc_cmp_ne_neg1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind { 150*9880d681SAndroid Build Coastguard Worker %load = load i1, i1 addrspace(1)* %in 151*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %load to i32 152*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %ext, -1 153*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 154*9880d681SAndroid Build Coastguard Worker ret void 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}masked_load_i1_to_i32_trunc_cmp_ne_neg1: 158*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte [[LOAD:v[0-9]+]] 159*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_ne_i32_e32 vcc, -1, [[LOAD]]{{$}} 160*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 161*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte 162*9880d681SAndroid Build Coastguard Workerdefine void @masked_load_i1_to_i32_trunc_cmp_ne_neg1(i1 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind { 163*9880d681SAndroid Build Coastguard Worker %load = load i8, i8 addrspace(1)* %in 164*9880d681SAndroid Build Coastguard Worker %masked = and i8 %load, 255 165*9880d681SAndroid Build Coastguard Worker %ext = sext i8 %masked to i32 166*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %ext, -1 167*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out 168*9880d681SAndroid Build Coastguard Worker ret void 169*9880d681SAndroid Build Coastguard Worker} 170