1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i1 @llvm.amdgcn.class.f32(float, i32) #1 4*9880d681SAndroid Build Coastguard Workerdeclare i1 @llvm.amdgcn.class.f64(double, i32) #1 5*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #1 6*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float) #1 7*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fabs.f64(double) #1 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_f32: 10*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 11*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc 12*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]] 13*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[SA]], [[VB]] 14*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 15*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 16*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 17*9880d681SAndroid Build Coastguard Workerdefine void @test_class_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 { 18*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 %b) #1 19*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 20*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fabs_f32: 25*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 26*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc 27*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]] 28*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], |[[SA]]|, [[VB]] 29*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]] 30*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 31*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 32*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fabs_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 { 33*9880d681SAndroid Build Coastguard Worker %a.fabs = call float @llvm.fabs.f32(float %a) #1 34*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a.fabs, i32 %b) #1 35*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 36*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fneg_f32: 41*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 42*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc 43*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]] 44*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -[[SA]], [[VB]] 45*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]] 46*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 47*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 48*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fneg_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 { 49*9880d681SAndroid Build Coastguard Worker %a.fneg = fsub float -0.0, %a 50*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a.fneg, i32 %b) #1 51*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 52*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fneg_fabs_f32: 57*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 58*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc 59*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]] 60*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -|[[SA]]|, [[VB]] 61*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]] 62*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 63*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 64*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fneg_fabs_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 { 65*9880d681SAndroid Build Coastguard Worker %a.fabs = call float @llvm.fabs.f32(float %a) #1 66*9880d681SAndroid Build Coastguard Worker %a.fneg.fabs = fsub float -0.0, %a.fabs 67*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a.fneg.fabs, i32 %b) #1 68*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 69*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 70*9880d681SAndroid Build Coastguard Worker ret void 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_1_f32: 74*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 75*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[COND:s\[[0-9]+:[0-9]+\]]], [[SA]], 1{{$}} 76*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[COND]] 77*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 78*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 79*9880d681SAndroid Build Coastguard Workerdefine void @test_class_1_f32(i32 addrspace(1)* %out, float %a) #0 { 80*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 1) #1 81*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 82*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_64_f32: 87*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 88*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 [[COND:s\[[0-9]+:[0-9]+\]]], [[SA]], 64{{$}} 89*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[COND]] 90*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 91*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 92*9880d681SAndroid Build Coastguard Workerdefine void @test_class_64_f32(i32 addrspace(1)* %out, float %a) #0 { 93*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 64) #1 94*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 95*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 96*9880d681SAndroid Build Coastguard Worker ret void 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; Set all 10 bits of mask 100*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_full_mask_f32: 101*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 102*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x3ff{{$}} 103*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[SA]], [[MASK]] 104*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 105*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 106*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 107*9880d681SAndroid Build Coastguard Workerdefine void @test_class_full_mask_f32(i32 addrspace(1)* %out, float %a) #0 { 108*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 1023) #1 109*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 110*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 111*9880d681SAndroid Build Coastguard Worker ret void 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_9bit_mask_f32: 115*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 116*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1ff{{$}} 117*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[SA]], [[MASK]] 118*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 119*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 120*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 121*9880d681SAndroid Build Coastguard Workerdefine void @test_class_9bit_mask_f32(i32 addrspace(1)* %out, float %a) #0 { 122*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 511) #1 123*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 124*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 125*9880d681SAndroid Build Coastguard Worker ret void 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}v_test_class_full_mask_f32: 129*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[VA:v[0-9]+]] 130*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1ff{{$}} 131*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[VA]], [[MASK]] 132*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 133*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]] 134*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 135*9880d681SAndroid Build Coastguard Workerdefine void @v_test_class_full_mask_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 { 136*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 137*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid 138*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 139*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.in 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 511) #1 142*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 143*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %gep.out, align 4 144*9880d681SAndroid Build Coastguard Worker ret void 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_inline_imm_constant_dynamic_mask_f32: 148*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[VB:v[0-9]+]] 149*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, 1.0, [[VB]] 150*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 151*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]] 152*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 153*9880d681SAndroid Build Coastguard Workerdefine void @test_class_inline_imm_constant_dynamic_mask_f32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 { 154*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 155*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid 156*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 157*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %gep.in 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float 1.0, i32 %b) #1 160*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 161*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %gep.out, align 4 162*9880d681SAndroid Build Coastguard Worker ret void 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; FIXME: Why isn't this using a literal constant operand? 166*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_lit_constant_dynamic_mask_f32: 167*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[VB:v[0-9]+]] 168*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VK:v[0-9]+]], 0x44800000 169*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, [[VK]], [[VB]] 170*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 171*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]] 172*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 173*9880d681SAndroid Build Coastguard Workerdefine void @test_class_lit_constant_dynamic_mask_f32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 { 174*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 175*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid 176*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 177*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %gep.in 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float 1024.0, i32 %b) #1 180*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 181*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %gep.out, align 4 182*9880d681SAndroid Build Coastguard Worker ret void 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_f64: 186*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 187*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd 188*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]] 189*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, [[SA]], [[VB]] 190*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 191*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 192*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 193*9880d681SAndroid Build Coastguard Workerdefine void @test_class_f64(i32 addrspace(1)* %out, double %a, i32 %b) #0 { 194*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 %b) #1 195*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 196*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 197*9880d681SAndroid Build Coastguard Worker ret void 198*9880d681SAndroid Build Coastguard Worker} 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fabs_f64: 201*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 202*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd 203*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]] 204*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], |[[SA]]|, [[VB]] 205*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]] 206*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 207*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 208*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fabs_f64(i32 addrspace(1)* %out, double %a, i32 %b) #0 { 209*9880d681SAndroid Build Coastguard Worker %a.fabs = call double @llvm.fabs.f64(double %a) #1 210*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a.fabs, i32 %b) #1 211*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 212*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 213*9880d681SAndroid Build Coastguard Worker ret void 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fneg_f64: 217*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 218*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd 219*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]] 220*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -[[SA]], [[VB]] 221*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]] 222*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 223*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 224*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fneg_f64(i32 addrspace(1)* %out, double %a, i32 %b) #0 { 225*9880d681SAndroid Build Coastguard Worker %a.fneg = fsub double -0.0, %a 226*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a.fneg, i32 %b) #1 227*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 228*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 229*9880d681SAndroid Build Coastguard Worker ret void 230*9880d681SAndroid Build Coastguard Worker} 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_fneg_fabs_f64: 233*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 234*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd 235*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]] 236*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -|[[SA]]|, [[VB]] 237*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, [[CMP]] 238*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 239*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 240*9880d681SAndroid Build Coastguard Workerdefine void @test_class_fneg_fabs_f64(i32 addrspace(1)* %out, double %a, i32 %b) #0 { 241*9880d681SAndroid Build Coastguard Worker %a.fabs = call double @llvm.fabs.f64(double %a) #1 242*9880d681SAndroid Build Coastguard Worker %a.fneg.fabs = fsub double -0.0, %a.fabs 243*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a.fneg.fabs, i32 %b) #1 244*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 245*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 246*9880d681SAndroid Build Coastguard Worker ret void 247*9880d681SAndroid Build Coastguard Worker} 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_1_f64: 250*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 1{{$}} 251*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 252*9880d681SAndroid Build Coastguard Workerdefine void @test_class_1_f64(i32 addrspace(1)* %out, double %a) #0 { 253*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 1) #1 254*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 255*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 256*9880d681SAndroid Build Coastguard Worker ret void 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_64_f64: 260*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e64 {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 64{{$}} 261*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 262*9880d681SAndroid Build Coastguard Workerdefine void @test_class_64_f64(i32 addrspace(1)* %out, double %a) #0 { 263*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 64) #1 264*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 265*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 266*9880d681SAndroid Build Coastguard Worker ret void 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; Set all 9 bits of mask 270*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_full_mask_f64: 271*9880d681SAndroid Build Coastguard Worker; SI: s_load_dwordx2 [[SA:s\[[0-9]+:[0-9]+\]]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 272*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1ff{{$}} 273*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, [[SA]], [[MASK]] 274*9880d681SAndroid Build Coastguard Worker; SI-NOT: vcc 275*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 276*9880d681SAndroid Build Coastguard Worker; SI-NEXT: buffer_store_dword [[RESULT]] 277*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 278*9880d681SAndroid Build Coastguard Workerdefine void @test_class_full_mask_f64(i32 addrspace(1)* %out, double %a) #0 { 279*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 511) #1 280*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 281*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 282*9880d681SAndroid Build Coastguard Worker ret void 283*9880d681SAndroid Build Coastguard Worker} 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}v_test_class_full_mask_f64: 286*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[VA:v\[[0-9]+:[0-9]+\]]] 287*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1ff{{$}} 288*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, [[VA]], [[MASK]] 289*9880d681SAndroid Build Coastguard Worker; SI-NOT: vcc 290*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, -1, vcc 291*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]] 292*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 293*9880d681SAndroid Build Coastguard Workerdefine void @v_test_class_full_mask_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #0 { 294*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 295*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid 296*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 297*9880d681SAndroid Build Coastguard Worker %a = load double, double addrspace(1)* %in 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 511) #1 300*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 301*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %gep.out, align 4 302*9880d681SAndroid Build Coastguard Worker ret void 303*9880d681SAndroid Build Coastguard Worker} 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_inline_imm_constant_dynamic_mask_f64: 306*9880d681SAndroid Build Coastguard Worker; XSI: v_cmp_class_f64_e32 vcc, 1.0, 307*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, 308*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 309*9880d681SAndroid Build Coastguard Workerdefine void @test_class_inline_imm_constant_dynamic_mask_f64(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 { 310*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 311*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid 312*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 313*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %gep.in 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double 1.0, i32 %b) #1 316*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 317*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %gep.out, align 4 318*9880d681SAndroid Build Coastguard Worker ret void 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_lit_constant_dynamic_mask_f64: 322*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f64_e32 vcc, s{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} 323*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 324*9880d681SAndroid Build Coastguard Workerdefine void @test_class_lit_constant_dynamic_mask_f64(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 { 325*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 326*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid 327*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 328*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %gep.in 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double 1024.0, i32 %b) #1 331*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 332*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %gep.out, align 4 333*9880d681SAndroid Build Coastguard Worker ret void 334*9880d681SAndroid Build Coastguard Worker} 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or_class_f32_0: 337*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 338*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 3{{$}} 339*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 340*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 341*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or_class_f32_0(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 { 342*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 343*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid 344*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 345*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.in 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Worker %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 1) #1 348*9880d681SAndroid Build Coastguard Worker %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 3) #1 349*9880d681SAndroid Build Coastguard Worker %or = or i1 %class0, %class1 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %or to i32 352*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 353*9880d681SAndroid Build Coastguard Worker ret void 354*9880d681SAndroid Build Coastguard Worker} 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or3_class_f32_0: 357*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 358*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 s{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 7{{$}} 359*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 360*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 361*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or3_class_f32_0(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 { 362*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 363*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid 364*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 365*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.in 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Worker %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 1) #1 368*9880d681SAndroid Build Coastguard Worker %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 2) #1 369*9880d681SAndroid Build Coastguard Worker %class2 = call i1 @llvm.amdgcn.class.f32(float %a, i32 4) #1 370*9880d681SAndroid Build Coastguard Worker %or.0 = or i1 %class0, %class1 371*9880d681SAndroid Build Coastguard Worker %or.1 = or i1 %or.0, %class2 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %or.1 to i32 374*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 375*9880d681SAndroid Build Coastguard Worker ret void 376*9880d681SAndroid Build Coastguard Worker} 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or_all_tests_class_f32_0: 379*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 380*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x3ff{{$}} 381*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e32 vcc, v{{[0-9]+}}, [[MASK]]{{$}} 382*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 383*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 384*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or_all_tests_class_f32_0(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 { 385*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 386*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid 387*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 388*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.in 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Worker %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 1) #1 391*9880d681SAndroid Build Coastguard Worker %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 2) #1 392*9880d681SAndroid Build Coastguard Worker %class2 = call i1 @llvm.amdgcn.class.f32(float %a, i32 4) #1 393*9880d681SAndroid Build Coastguard Worker %class3 = call i1 @llvm.amdgcn.class.f32(float %a, i32 8) #1 394*9880d681SAndroid Build Coastguard Worker %class4 = call i1 @llvm.amdgcn.class.f32(float %a, i32 16) #1 395*9880d681SAndroid Build Coastguard Worker %class5 = call i1 @llvm.amdgcn.class.f32(float %a, i32 32) #1 396*9880d681SAndroid Build Coastguard Worker %class6 = call i1 @llvm.amdgcn.class.f32(float %a, i32 64) #1 397*9880d681SAndroid Build Coastguard Worker %class7 = call i1 @llvm.amdgcn.class.f32(float %a, i32 128) #1 398*9880d681SAndroid Build Coastguard Worker %class8 = call i1 @llvm.amdgcn.class.f32(float %a, i32 256) #1 399*9880d681SAndroid Build Coastguard Worker %class9 = call i1 @llvm.amdgcn.class.f32(float %a, i32 512) #1 400*9880d681SAndroid Build Coastguard Worker %or.0 = or i1 %class0, %class1 401*9880d681SAndroid Build Coastguard Worker %or.1 = or i1 %or.0, %class2 402*9880d681SAndroid Build Coastguard Worker %or.2 = or i1 %or.1, %class3 403*9880d681SAndroid Build Coastguard Worker %or.3 = or i1 %or.2, %class4 404*9880d681SAndroid Build Coastguard Worker %or.4 = or i1 %or.3, %class5 405*9880d681SAndroid Build Coastguard Worker %or.5 = or i1 %or.4, %class6 406*9880d681SAndroid Build Coastguard Worker %or.6 = or i1 %or.5, %class7 407*9880d681SAndroid Build Coastguard Worker %or.7 = or i1 %or.6, %class8 408*9880d681SAndroid Build Coastguard Worker %or.8 = or i1 %or.7, %class9 409*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %or.8 to i32 410*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 411*9880d681SAndroid Build Coastguard Worker ret void 412*9880d681SAndroid Build Coastguard Worker} 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or_class_f32_1: 415*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 416*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 12{{$}} 417*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 418*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 419*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or_class_f32_1(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 { 420*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 421*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid 422*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 423*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.in 424*9880d681SAndroid Build Coastguard Worker 425*9880d681SAndroid Build Coastguard Worker %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 4) #1 426*9880d681SAndroid Build Coastguard Worker %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 8) #1 427*9880d681SAndroid Build Coastguard Worker %or = or i1 %class0, %class1 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %or to i32 430*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 431*9880d681SAndroid Build Coastguard Worker ret void 432*9880d681SAndroid Build Coastguard Worker} 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_fold_or_class_f32_2: 435*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 436*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 7{{$}} 437*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 438*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 439*9880d681SAndroid Build Coastguard Workerdefine void @test_fold_or_class_f32_2(i32 addrspace(1)* %out, float addrspace(1)* %in) #0 { 440*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 441*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid 442*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 443*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.in 444*9880d681SAndroid Build Coastguard Worker 445*9880d681SAndroid Build Coastguard Worker %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 7) #1 446*9880d681SAndroid Build Coastguard Worker %class1 = call i1 @llvm.amdgcn.class.f32(float %a, i32 7) #1 447*9880d681SAndroid Build Coastguard Worker %or = or i1 %class0, %class1 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %or to i32 450*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 451*9880d681SAndroid Build Coastguard Worker ret void 452*9880d681SAndroid Build Coastguard Worker} 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_no_fold_or_class_f32_0: 455*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, 4{{$}} 456*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_class_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, s{{[0-9]+}}, 8{{$}} 457*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 458*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 459*9880d681SAndroid Build Coastguard Workerdefine void @test_no_fold_or_class_f32_0(i32 addrspace(1)* %out, float addrspace(1)* %in, float %b) #0 { 460*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 461*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid 462*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 463*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.in 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker %class0 = call i1 @llvm.amdgcn.class.f32(float %a, i32 4) #1 466*9880d681SAndroid Build Coastguard Worker %class1 = call i1 @llvm.amdgcn.class.f32(float %b, i32 8) #1 467*9880d681SAndroid Build Coastguard Worker %or = or i1 %class0, %class1 468*9880d681SAndroid Build Coastguard Worker 469*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %or to i32 470*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 471*9880d681SAndroid Build Coastguard Worker ret void 472*9880d681SAndroid Build Coastguard Worker} 473*9880d681SAndroid Build Coastguard Worker 474*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_0_f32: 475*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 476*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}} 477*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]] 478*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 479*9880d681SAndroid Build Coastguard Workerdefine void @test_class_0_f32(i32 addrspace(1)* %out, float %a) #0 { 480*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float %a, i32 0) #1 481*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 482*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 483*9880d681SAndroid Build Coastguard Worker ret void 484*9880d681SAndroid Build Coastguard Worker} 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_0_f64: 487*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 488*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}} 489*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]] 490*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 491*9880d681SAndroid Build Coastguard Workerdefine void @test_class_0_f64(i32 addrspace(1)* %out, double %a) #0 { 492*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f64(double %a, i32 0) #1 493*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 494*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 495*9880d681SAndroid Build Coastguard Worker ret void 496*9880d681SAndroid Build Coastguard Worker} 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard Worker; FIXME: Why is the extension still here? 499*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_class_undef_f32: 500*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cmp_class 501*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 v{{[0-9]+}}, 0, -1, 502*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword 503*9880d681SAndroid Build Coastguard Workerdefine void @test_class_undef_f32(i32 addrspace(1)* %out, float %a, i32 %b) #0 { 504*9880d681SAndroid Build Coastguard Worker %result = call i1 @llvm.amdgcn.class.f32(float undef, i32 %b) #1 505*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %result to i32 506*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out, align 4 507*9880d681SAndroid Build Coastguard Worker ret void 508*9880d681SAndroid Build Coastguard Worker} 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 511*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone } 512