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;FUNC-LABEL: {{^}}test1: 6*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 [[REG:v[0-9]+]], vcc, {{v[0-9]+, v[0-9]+}} 9*9880d681SAndroid Build Coastguard Worker;SI-NOT: [[REG]] 10*9880d681SAndroid Build Coastguard Worker;SI: buffer_store_dword [[REG]], 11*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 12*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 13*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %in 14*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %b_ptr 15*9880d681SAndroid Build Coastguard Worker %result = add i32 %a, %b 16*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 17*9880d681SAndroid Build Coastguard Worker ret void 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker;FUNC-LABEL: {{^}}test2: 21*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 22*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}} 25*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine void @test2(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) { 28*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1 29*9880d681SAndroid Build Coastguard Worker %a = load <2 x i32>, <2 x i32> addrspace(1)* %in 30*9880d681SAndroid Build Coastguard Worker %b = load <2 x i32>, <2 x i32> addrspace(1)* %b_ptr 31*9880d681SAndroid Build Coastguard Worker %result = add <2 x i32> %a, %b 32*9880d681SAndroid Build Coastguard Worker store <2 x i32> %result, <2 x 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: {{^}}test4: 37*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 38*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 39*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 40*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}} 43*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}} 44*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}} 45*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine void @test4(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { 48*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1 49*9880d681SAndroid Build Coastguard Worker %a = load <4 x i32>, <4 x i32> addrspace(1)* %in 50*9880d681SAndroid Build Coastguard Worker %b = load <4 x i32>, <4 x i32> addrspace(1)* %b_ptr 51*9880d681SAndroid Build Coastguard Worker %result = add <4 x i32> %a, %b 52*9880d681SAndroid Build Coastguard Worker store <4 x i32> %result, <4 x i32> addrspace(1)* %out 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test8: 57*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 58*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 59*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 60*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 61*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 62*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 63*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 64*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 67*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 68*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 69*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 70*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 71*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 72*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 73*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 74*9880d681SAndroid Build Coastguard Workerdefine void @test8(<8 x i32> addrspace(1)* %out, <8 x i32> %a, <8 x i32> %b) { 75*9880d681SAndroid Build Coastguard Workerentry: 76*9880d681SAndroid Build Coastguard Worker %0 = add <8 x i32> %a, %b 77*9880d681SAndroid Build Coastguard Worker store <8 x i32> %0, <8 x i32> addrspace(1)* %out 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test16: 82*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 83*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 84*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 85*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 86*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 87*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 88*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 89*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 90*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 91*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 92*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 93*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 94*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 95*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 96*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 97*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 100*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 101*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 102*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 103*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 104*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 105*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 106*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 107*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 108*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 109*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 110*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 111*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 112*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 113*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 114*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 115*9880d681SAndroid Build Coastguard Workerdefine void @test16(<16 x i32> addrspace(1)* %out, <16 x i32> %a, <16 x i32> %b) { 116*9880d681SAndroid Build Coastguard Workerentry: 117*9880d681SAndroid Build Coastguard Worker %0 = add <16 x i32> %a, %b 118*9880d681SAndroid Build Coastguard Worker store <16 x i32> %0, <16 x i32> addrspace(1)* %out 119*9880d681SAndroid Build Coastguard Worker ret void 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}add64: 123*9880d681SAndroid Build Coastguard Worker; SI: s_add_u32 124*9880d681SAndroid Build Coastguard Worker; SI: s_addc_u32 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]] 127*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}} 128*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADDC_UINT 129*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT 130*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}} 131*9880d681SAndroid Build Coastguard Worker; EG-NOT: SUB 132*9880d681SAndroid Build Coastguard Workerdefine void @add64(i64 addrspace(1)* %out, i64 %a, i64 %b) { 133*9880d681SAndroid Build Coastguard Workerentry: 134*9880d681SAndroid Build Coastguard Worker %0 = add i64 %a, %b 135*9880d681SAndroid Build Coastguard Worker store i64 %0, i64 addrspace(1)* %out 136*9880d681SAndroid Build Coastguard Worker ret void 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; The v_addc_u32 and v_add_i32 instruction can't read SGPRs, because they 140*9880d681SAndroid Build Coastguard Worker; use VCC. The test is designed so that %a will be stored in an SGPR and 141*9880d681SAndroid Build Coastguard Worker; %0 will be stored in a VGPR, so the comiler will be forced to copy %a 142*9880d681SAndroid Build Coastguard Worker; to a VGPR before doing the add. 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}add64_sgpr_vgpr: 145*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_addc_u32_e32 s 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]] 148*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}} 149*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADDC_UINT 150*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT 151*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}} 152*9880d681SAndroid Build Coastguard Worker; EG-NOT: SUB 153*9880d681SAndroid Build Coastguard Workerdefine void @add64_sgpr_vgpr(i64 addrspace(1)* %out, i64 %a, i64 addrspace(1)* %in) { 154*9880d681SAndroid Build Coastguard Workerentry: 155*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64 addrspace(1)* %in 156*9880d681SAndroid Build Coastguard Worker %1 = add i64 %a, %0 157*9880d681SAndroid Build Coastguard Worker store i64 %1, i64 addrspace(1)* %out 158*9880d681SAndroid Build Coastguard Worker ret void 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker; Test i64 add inside a branch. 162*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}add64_in_branch: 163*9880d681SAndroid Build Coastguard Worker; SI: s_add_u32 164*9880d681SAndroid Build Coastguard Worker; SI: s_addc_u32 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]] 167*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}} 168*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADDC_UINT 169*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT 170*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}} 171*9880d681SAndroid Build Coastguard Worker; EG-NOT: SUB 172*9880d681SAndroid Build Coastguard Workerdefine void @add64_in_branch(i64 addrspace(1)* %out, i64 addrspace(1)* %in, i64 %a, i64 %b, i64 %c) { 173*9880d681SAndroid Build Coastguard Workerentry: 174*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i64 %a, 0 175*9880d681SAndroid Build Coastguard Worker br i1 %0, label %if, label %else 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerif: 178*9880d681SAndroid Build Coastguard Worker %1 = load i64, i64 addrspace(1)* %in 179*9880d681SAndroid Build Coastguard Worker br label %endif 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerelse: 182*9880d681SAndroid Build Coastguard Worker %2 = add i64 %a, %b 183*9880d681SAndroid Build Coastguard Worker br label %endif 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerendif: 186*9880d681SAndroid Build Coastguard Worker %3 = phi i64 [%1, %if], [%2, %else] 187*9880d681SAndroid Build Coastguard Worker store i64 %3, i64 addrspace(1)* %out 188*9880d681SAndroid Build Coastguard Worker ret void 189*9880d681SAndroid Build Coastguard Worker} 190