1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=verde -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; 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; The code generated by urem is long and complex and may frequently 6*9880d681SAndroid Build Coastguard Worker; change. The goal of this test is to make sure the ISel doesn't fail 7*9880d681SAndroid Build Coastguard Worker; when it gets a v2i32/v4i32 urem 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_urem_i32: 10*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 11*9880d681SAndroid Build Coastguard Worker; EG: CF_END 12*9880d681SAndroid Build Coastguard Workerdefine void @test_urem_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 13*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 14*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %in 15*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %b_ptr 16*9880d681SAndroid Build Coastguard Worker %result = urem i32 %a, %b 17*9880d681SAndroid Build Coastguard Worker store i32 %result, 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: {{^}}test_urem_i32_7: 22*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MAGIC:v[0-9]+]], 0x24924925 23*9880d681SAndroid Build Coastguard Worker; SI: v_mul_hi_u32 {{v[0-9]+}}, [[MAGIC]] 24*9880d681SAndroid Build Coastguard Worker; SI: v_subrev_i32 25*9880d681SAndroid Build Coastguard Worker; SI: v_mul_lo_i32 26*9880d681SAndroid Build Coastguard Worker; SI: v_sub_i32 27*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword 28*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 29*9880d681SAndroid Build Coastguard Workerdefine void @test_urem_i32_7(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 30*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in 31*9880d681SAndroid Build Coastguard Worker %result = urem i32 %num, 7 32*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_urem_v2i32: 37*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 38*9880d681SAndroid Build Coastguard Worker; EG: CF_END 39*9880d681SAndroid Build Coastguard Workerdefine void @test_urem_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) { 40*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1 41*9880d681SAndroid Build Coastguard Worker %a = load <2 x i32>, <2 x i32> addrspace(1)* %in 42*9880d681SAndroid Build Coastguard Worker %b = load <2 x i32>, <2 x i32> addrspace(1)* %b_ptr 43*9880d681SAndroid Build Coastguard Worker %result = urem <2 x i32> %a, %b 44*9880d681SAndroid Build Coastguard Worker store <2 x i32> %result, <2 x 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: {{^}}test_urem_v4i32: 49*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 50*9880d681SAndroid Build Coastguard Worker; EG: CF_END 51*9880d681SAndroid Build Coastguard Workerdefine void @test_urem_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { 52*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1 53*9880d681SAndroid Build Coastguard Worker %a = load <4 x i32>, <4 x i32> addrspace(1)* %in 54*9880d681SAndroid Build Coastguard Worker %b = load <4 x i32>, <4 x i32> addrspace(1)* %b_ptr 55*9880d681SAndroid Build Coastguard Worker %result = urem <4 x i32> %a, %b 56*9880d681SAndroid Build Coastguard Worker store <4 x i32> %result, <4 x i32> addrspace(1)* %out 57*9880d681SAndroid Build Coastguard Worker ret void 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_urem_i64: 61*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 62*9880d681SAndroid Build Coastguard Worker; EG: CF_END 63*9880d681SAndroid Build Coastguard Workerdefine void @test_urem_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) { 64*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr i64, i64 addrspace(1)* %in, i64 1 65*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %in 66*9880d681SAndroid Build Coastguard Worker %b = load i64, i64 addrspace(1)* %b_ptr 67*9880d681SAndroid Build Coastguard Worker %result = urem i64 %a, %b 68*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_urem_v2i64: 73*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 74*9880d681SAndroid Build Coastguard Worker; EG: CF_END 75*9880d681SAndroid Build Coastguard Workerdefine void @test_urem_v2i64(<2 x i64> addrspace(1)* %out, <2 x i64> addrspace(1)* %in) { 76*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <2 x i64>, <2 x i64> addrspace(1)* %in, i64 1 77*9880d681SAndroid Build Coastguard Worker %a = load <2 x i64>, <2 x i64> addrspace(1)* %in 78*9880d681SAndroid Build Coastguard Worker %b = load <2 x i64>, <2 x i64> addrspace(1)* %b_ptr 79*9880d681SAndroid Build Coastguard Worker %result = urem <2 x i64> %a, %b 80*9880d681SAndroid Build Coastguard Worker store <2 x i64> %result, <2 x i64> addrspace(1)* %out 81*9880d681SAndroid Build Coastguard Worker ret void 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_urem_v4i64: 85*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 86*9880d681SAndroid Build Coastguard Worker; EG: CF_END 87*9880d681SAndroid Build Coastguard Workerdefine void @test_urem_v4i64(<4 x i64> addrspace(1)* %out, <4 x i64> addrspace(1)* %in) { 88*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <4 x i64>, <4 x i64> addrspace(1)* %in, i64 1 89*9880d681SAndroid Build Coastguard Worker %a = load <4 x i64>, <4 x i64> addrspace(1)* %in 90*9880d681SAndroid Build Coastguard Worker %b = load <4 x i64>, <4 x i64> addrspace(1)* %b_ptr 91*9880d681SAndroid Build Coastguard Worker %result = urem <4 x i64> %a, %b 92*9880d681SAndroid Build Coastguard Worker store <4 x i64> %result, <4 x i64> addrspace(1)* %out 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker} 95