1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}or_v2i32: 7*9880d681SAndroid Build Coastguard Worker; EG: OR_INT {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 8*9880d681SAndroid Build Coastguard Worker; EG: OR_INT {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}} 11*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}} 12*9880d681SAndroid Build Coastguard Workerdefine void @or_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) { 13*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1 14*9880d681SAndroid Build Coastguard Worker %a = load <2 x i32>, <2 x i32> addrspace(1) * %in 15*9880d681SAndroid Build Coastguard Worker %b = load <2 x i32>, <2 x i32> addrspace(1) * %b_ptr 16*9880d681SAndroid Build Coastguard Worker %result = or <2 x i32> %a, %b 17*9880d681SAndroid Build Coastguard Worker store <2 x i32> %result, <2 x i32> addrspace(1)* %out 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}or_v4i32: 22*9880d681SAndroid Build Coastguard Worker; EG: OR_INT {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 23*9880d681SAndroid Build Coastguard Worker; EG: OR_INT {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 24*9880d681SAndroid Build Coastguard Worker; EG: OR_INT {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 25*9880d681SAndroid Build Coastguard Worker; EG: OR_INT {{\*? *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}} 28*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}} 29*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}} 30*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}} 31*9880d681SAndroid Build Coastguard Workerdefine void @or_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { 32*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1 33*9880d681SAndroid Build Coastguard Worker %a = load <4 x i32>, <4 x i32> addrspace(1) * %in 34*9880d681SAndroid Build Coastguard Worker %b = load <4 x i32>, <4 x i32> addrspace(1) * %b_ptr 35*9880d681SAndroid Build Coastguard Worker %result = or <4 x i32> %a, %b 36*9880d681SAndroid Build Coastguard Worker store <4 x i32> %result, <4 x i32> addrspace(1)* %out 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}scalar_or_i32: 41*9880d681SAndroid Build Coastguard Worker; SI: s_or_b32 42*9880d681SAndroid Build Coastguard Workerdefine void @scalar_or_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) { 43*9880d681SAndroid Build Coastguard Worker %or = or i32 %a, %b 44*9880d681SAndroid Build Coastguard Worker store i32 %or, i32 addrspace(1)* %out 45*9880d681SAndroid Build Coastguard Worker ret void 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_or_i32: 49*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]}} 50*9880d681SAndroid Build Coastguard Workerdefine void @vector_or_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %a, i32 %b) { 51*9880d681SAndroid Build Coastguard Worker %loada = load i32, i32 addrspace(1)* %a 52*9880d681SAndroid Build Coastguard Worker %or = or i32 %loada, %b 53*9880d681SAndroid Build Coastguard Worker store i32 %or, i32 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: {{^}}scalar_or_literal_i32: 58*9880d681SAndroid Build Coastguard Worker; SI: s_or_b32 s{{[0-9]+}}, s{{[0-9]+}}, 0x1869f 59*9880d681SAndroid Build Coastguard Workerdefine void @scalar_or_literal_i32(i32 addrspace(1)* %out, i32 %a) { 60*9880d681SAndroid Build Coastguard Worker %or = or i32 %a, 99999 61*9880d681SAndroid Build Coastguard Worker store i32 %or, i32 addrspace(1)* %out, align 4 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_or_literal_i32: 66*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]+}}, 0xffff, v{{[0-9]+}} 67*9880d681SAndroid Build Coastguard Workerdefine void @vector_or_literal_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %a, i32 addrspace(1)* %b) { 68*9880d681SAndroid Build Coastguard Worker %loada = load i32, i32 addrspace(1)* %a, align 4 69*9880d681SAndroid Build Coastguard Worker %or = or i32 %loada, 65535 70*9880d681SAndroid Build Coastguard Worker store i32 %or, i32 addrspace(1)* %out, align 4 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_or_inline_immediate_i32: 75*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]+}}, 4, v{{[0-9]+}} 76*9880d681SAndroid Build Coastguard Workerdefine void @vector_or_inline_immediate_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %a, i32 addrspace(1)* %b) { 77*9880d681SAndroid Build Coastguard Worker %loada = load i32, i32 addrspace(1)* %a, align 4 78*9880d681SAndroid Build Coastguard Worker %or = or i32 %loada, 4 79*9880d681SAndroid Build Coastguard Worker store i32 %or, i32 addrspace(1)* %out, align 4 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}scalar_or_i64: 84*9880d681SAndroid Build Coastguard Worker; EG-DAG: OR_INT * T{{[0-9]\.[XYZW]}}, KC0[2].W, KC0[3].Y 85*9880d681SAndroid Build Coastguard Worker; EG-DAG: OR_INT * T{{[0-9]\.[XYZW]}}, KC0[3].X, KC0[3].Z 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 88*9880d681SAndroid Build Coastguard Workerdefine void @scalar_or_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) { 89*9880d681SAndroid Build Coastguard Worker %or = or i64 %a, %b 90*9880d681SAndroid Build Coastguard Worker store i64 %or, i64 addrspace(1)* %out 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_or_i64: 95*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]}} 96*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]}} 97*9880d681SAndroid Build Coastguard Workerdefine void @vector_or_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) { 98*9880d681SAndroid Build Coastguard Worker %loada = load i64, i64 addrspace(1)* %a, align 8 99*9880d681SAndroid Build Coastguard Worker %loadb = load i64, i64 addrspace(1)* %b, align 8 100*9880d681SAndroid Build Coastguard Worker %or = or i64 %loada, %loadb 101*9880d681SAndroid Build Coastguard Worker store i64 %or, i64 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: {{^}}scalar_vector_or_i64: 106*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]}} 107*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 v{{[0-9]}} 108*9880d681SAndroid Build Coastguard Workerdefine void @scalar_vector_or_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 %b) { 109*9880d681SAndroid Build Coastguard Worker %loada = load i64, i64 addrspace(1)* %a 110*9880d681SAndroid Build Coastguard Worker %or = or i64 %loada, %b 111*9880d681SAndroid Build Coastguard Worker store i64 %or, i64 addrspace(1)* %out 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_or_i64_loadimm: 116*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 [[LO_S_IMM:s[0-9]+]], 0xdf77987f 117*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_movk_i32 [[HI_S_IMM:s[0-9]+]], 0x146f 118*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}}, 119*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]] 120*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[HI_S_IMM]], v[[HI_VREG]] 121*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 122*9880d681SAndroid Build Coastguard Workerdefine void @vector_or_i64_loadimm(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) { 123*9880d681SAndroid Build Coastguard Worker %loada = load i64, i64 addrspace(1)* %a, align 8 124*9880d681SAndroid Build Coastguard Worker %or = or i64 %loada, 22470723082367 125*9880d681SAndroid Build Coastguard Worker store i64 %or, i64 addrspace(1)* %out 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; FIXME: The or 0 should really be removed. 130*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_or_i64_imm: 131*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}}, 132*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 {{v[0-9]+}}, 8, v[[LO_VREG]] 133*9880d681SAndroid Build Coastguard Worker; SI: v_or_b32_e32 {{v[0-9]+}}, 0, {{.*}} 134*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 135*9880d681SAndroid Build Coastguard Workerdefine void @vector_or_i64_imm(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) { 136*9880d681SAndroid Build Coastguard Worker %loada = load i64, i64 addrspace(1)* %a, align 8 137*9880d681SAndroid Build Coastguard Worker %or = or i64 %loada, 8 138*9880d681SAndroid Build Coastguard Worker store i64 %or, i64 addrspace(1)* %out 139*9880d681SAndroid Build Coastguard Worker ret void 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}trunc_i64_or_to_i32: 143*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s[[SREG0:[0-9]+]] 144*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s[[SREG1:[0-9]+]] 145*9880d681SAndroid Build Coastguard Worker; SI: s_or_b32 s[[SRESULT:[0-9]+]], s[[SREG1]], s[[SREG0]] 146*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VRESULT:v[0-9]+]], s[[SRESULT]] 147*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VRESULT]], 148*9880d681SAndroid Build Coastguard Workerdefine void @trunc_i64_or_to_i32(i32 addrspace(1)* %out, i64 %a, i64 %b) { 149*9880d681SAndroid Build Coastguard Worker %add = or i64 %b, %a 150*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %add to i32 151*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32 addrspace(1)* %out, align 8 152*9880d681SAndroid Build Coastguard Worker ret void 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}or_i1: 156*9880d681SAndroid Build Coastguard Worker; EG: OR_INT * {{\** *}}T{{[0-9]+\.[XYZW], PS, PV\.[XYZW]}} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 s[{{[0-9]+:[0-9]+}}], vcc, s[{{[0-9]+:[0-9]+}}] 159*9880d681SAndroid Build Coastguard Workerdefine void @or_i1(i32 addrspace(1)* %out, float addrspace(1)* %in0, float addrspace(1)* %in1) { 160*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in0 161*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %in1 162*9880d681SAndroid Build Coastguard Worker %acmp = fcmp oge float %a, 0.000000e+00 163*9880d681SAndroid Build Coastguard Worker %bcmp = fcmp oge float %b, 0.000000e+00 164*9880d681SAndroid Build Coastguard Worker %or = or i1 %acmp, %bcmp 165*9880d681SAndroid Build Coastguard Worker %result = zext i1 %or to i32 166*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 167*9880d681SAndroid Build Coastguard Worker ret void 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_or_i1: 171*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 s[{{[0-9]+:[0-9]+}}], vcc, s[{{[0-9]+:[0-9]+}}] 172*9880d681SAndroid Build Coastguard Workerdefine void @s_or_i1(i1 addrspace(1)* %out, i32 %a, i32 %b, i32 %c, i32 %d) { 173*9880d681SAndroid Build Coastguard Worker %cmp0 = icmp eq i32 %a, %b 174*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %c, %d 175*9880d681SAndroid Build Coastguard Worker %or = or i1 %cmp0, %cmp1 176*9880d681SAndroid Build Coastguard Worker store i1 %or, i1 addrspace(1)* %out 177*9880d681SAndroid Build Coastguard Worker ret void 178*9880d681SAndroid Build Coastguard Worker} 179