1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; These tests check that floating point comparisons which are used by select 4*9880d681SAndroid Build Coastguard Worker; to store integer true (-1) and false (0) values are lowered to one of the 5*9880d681SAndroid Build Coastguard Worker; SET*DX10 instructions. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_une_select_fptosi: 8*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETNE_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.y, 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 11*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_une_select_fptosi(i32 addrspace(1)* %out, float %in) { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker %0 = fcmp une float %in, 5.0 14*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 15*9880d681SAndroid Build Coastguard Worker %2 = fsub float -0.000000e+00, %1 16*9880d681SAndroid Build Coastguard Worker %3 = fptosi float %2 to i32 17*9880d681SAndroid Build Coastguard Worker store i32 %3, 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; CHECK: {{^}}fcmp_une_select_i32: 22*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETNE_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.y, 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 25*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_une_select_i32(i32 addrspace(1)* %out, float %in) { 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker %0 = fcmp une float %in, 5.0 28*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, i32 -1, i32 0 29*9880d681SAndroid Build Coastguard Worker store i32 %1, i32 addrspace(1)* %out 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_oeq_select_fptosi: 34*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETE_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.y, 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 37*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_oeq_select_fptosi(i32 addrspace(1)* %out, float %in) { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %0 = fcmp oeq float %in, 5.0 40*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 41*9880d681SAndroid Build Coastguard Worker %2 = fsub float -0.000000e+00, %1 42*9880d681SAndroid Build Coastguard Worker %3 = fptosi float %2 to i32 43*9880d681SAndroid Build Coastguard Worker store i32 %3, i32 addrspace(1)* %out 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_oeq_select_i32: 48*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETE_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.y, 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 51*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_oeq_select_i32(i32 addrspace(1)* %out, float %in) { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker %0 = fcmp oeq float %in, 5.0 54*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, i32 -1, i32 0 55*9880d681SAndroid Build Coastguard Worker store i32 %1, i32 addrspace(1)* %out 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_ogt_select_fptosi: 60*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETGT_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.y, 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 63*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_ogt_select_fptosi(i32 addrspace(1)* %out, float %in) { 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker %0 = fcmp ogt float %in, 5.0 66*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 67*9880d681SAndroid Build Coastguard Worker %2 = fsub float -0.000000e+00, %1 68*9880d681SAndroid Build Coastguard Worker %3 = fptosi float %2 to i32 69*9880d681SAndroid Build Coastguard Worker store i32 %3, i32 addrspace(1)* %out 70*9880d681SAndroid Build Coastguard Worker ret void 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_ogt_select_i32: 74*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETGT_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.y, 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 77*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_ogt_select_i32(i32 addrspace(1)* %out, float %in) { 78*9880d681SAndroid Build Coastguard Workerentry: 79*9880d681SAndroid Build Coastguard Worker %0 = fcmp ogt float %in, 5.0 80*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, i32 -1, i32 0 81*9880d681SAndroid Build Coastguard Worker store i32 %1, i32 addrspace(1)* %out 82*9880d681SAndroid Build Coastguard Worker ret void 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_oge_select_fptosi: 86*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETGE_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.y, 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 89*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_oge_select_fptosi(i32 addrspace(1)* %out, float %in) { 90*9880d681SAndroid Build Coastguard Workerentry: 91*9880d681SAndroid Build Coastguard Worker %0 = fcmp oge float %in, 5.0 92*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 93*9880d681SAndroid Build Coastguard Worker %2 = fsub float -0.000000e+00, %1 94*9880d681SAndroid Build Coastguard Worker %3 = fptosi float %2 to i32 95*9880d681SAndroid Build Coastguard Worker store i32 %3, i32 addrspace(1)* %out 96*9880d681SAndroid Build Coastguard Worker ret void 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_oge_select_i32: 100*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETGE_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.y, 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 103*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_oge_select_i32(i32 addrspace(1)* %out, float %in) { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker %0 = fcmp oge float %in, 5.0 106*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, i32 -1, i32 0 107*9880d681SAndroid Build Coastguard Worker store i32 %1, i32 addrspace(1)* %out 108*9880d681SAndroid Build Coastguard Worker ret void 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_ole_select_fptosi: 112*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETGE_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, literal.y, KC0[2].Z, 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 115*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_ole_select_fptosi(i32 addrspace(1)* %out, float %in) { 116*9880d681SAndroid Build Coastguard Workerentry: 117*9880d681SAndroid Build Coastguard Worker %0 = fcmp ole float %in, 5.0 118*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 119*9880d681SAndroid Build Coastguard Worker %2 = fsub float -0.000000e+00, %1 120*9880d681SAndroid Build Coastguard Worker %3 = fptosi float %2 to i32 121*9880d681SAndroid Build Coastguard Worker store i32 %3, i32 addrspace(1)* %out 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_ole_select_i32: 126*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETGE_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, literal.y, KC0[2].Z, 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 129*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_ole_select_i32(i32 addrspace(1)* %out, float %in) { 130*9880d681SAndroid Build Coastguard Workerentry: 131*9880d681SAndroid Build Coastguard Worker %0 = fcmp ole float %in, 5.0 132*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, i32 -1, i32 0 133*9880d681SAndroid Build Coastguard Worker store i32 %1, i32 addrspace(1)* %out 134*9880d681SAndroid Build Coastguard Worker ret void 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_olt_select_fptosi: 138*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETGT_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, literal.y, KC0[2].Z, 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 141*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_olt_select_fptosi(i32 addrspace(1)* %out, float %in) { 142*9880d681SAndroid Build Coastguard Workerentry: 143*9880d681SAndroid Build Coastguard Worker %0 = fcmp olt float %in, 5.0 144*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 145*9880d681SAndroid Build Coastguard Worker %2 = fsub float -0.000000e+00, %1 146*9880d681SAndroid Build Coastguard Worker %3 = fptosi float %2 to i32 147*9880d681SAndroid Build Coastguard Worker store i32 %3, i32 addrspace(1)* %out 148*9880d681SAndroid Build Coastguard Worker ret void 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}}fcmp_olt_select_i32: 152*9880d681SAndroid Build Coastguard Worker; CHECK: LSHR 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: SETGT_DX10 * {{\** *}}T{{[0-9]+\.[XYZW]}}, literal.y, KC0[2].Z, 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: 1084227584(5.000000e+00) 155*9880d681SAndroid Build Coastguard Workerdefine void @fcmp_olt_select_i32(i32 addrspace(1)* %out, float %in) { 156*9880d681SAndroid Build Coastguard Workerentry: 157*9880d681SAndroid Build Coastguard Worker %0 = fcmp olt float %in, 5.0 158*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, i32 -1, i32 0 159*9880d681SAndroid Build Coastguard Worker store i32 %1, i32 addrspace(1)* %out 160*9880d681SAndroid Build Coastguard Worker ret void 161*9880d681SAndroid Build Coastguard Worker} 162