1 ; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s 2 3 ; These tests check that floating point comparisons which are used by select 4 ; to store integer true (-1) and false (0) values are lowered to one of the 5 ; SET*DX10 instructions. 6 7 ; CHECK: @fcmp_une_select_fptosi 8 ; CHECK: SETNE_DX10 * T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.x, 9 ; CHECK-NEXT: 1084227584(5.000000e+00) 10 define void @fcmp_une_select_fptosi(i32 addrspace(1)* %out, float %in) { 11 entry: 12 %0 = fcmp une float %in, 5.0 13 %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 14 %2 = fsub float -0.000000e+00, %1 15 %3 = fptosi float %2 to i32 16 store i32 %3, i32 addrspace(1)* %out 17 ret void 18 } 19 20 ; CHECK: @fcmp_une_select_i32 21 ; CHECK: SETNE_DX10 * T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.x, 22 ; CHECK-NEXT: 1084227584(5.000000e+00) 23 define void @fcmp_une_select_i32(i32 addrspace(1)* %out, float %in) { 24 entry: 25 %0 = fcmp une float %in, 5.0 26 %1 = select i1 %0, i32 -1, i32 0 27 store i32 %1, i32 addrspace(1)* %out 28 ret void 29 } 30 31 ; CHECK: @fcmp_ueq_select_fptosi 32 ; CHECK: SETE_DX10 * T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.x, 33 ; CHECK-NEXT: 1084227584(5.000000e+00) 34 define void @fcmp_ueq_select_fptosi(i32 addrspace(1)* %out, float %in) { 35 entry: 36 %0 = fcmp ueq float %in, 5.0 37 %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 38 %2 = fsub float -0.000000e+00, %1 39 %3 = fptosi float %2 to i32 40 store i32 %3, i32 addrspace(1)* %out 41 ret void 42 } 43 44 ; CHECK: @fcmp_ueq_select_i32 45 ; CHECK: SETE_DX10 * T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.x, 46 ; CHECK-NEXT: 1084227584(5.000000e+00) 47 define void @fcmp_ueq_select_i32(i32 addrspace(1)* %out, float %in) { 48 entry: 49 %0 = fcmp ueq float %in, 5.0 50 %1 = select i1 %0, i32 -1, i32 0 51 store i32 %1, i32 addrspace(1)* %out 52 ret void 53 } 54 55 ; CHECK: @fcmp_ugt_select_fptosi 56 ; CHECK: SETGT_DX10 * T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.x, 57 ; CHECK-NEXT: 1084227584(5.000000e+00) 58 define void @fcmp_ugt_select_fptosi(i32 addrspace(1)* %out, float %in) { 59 entry: 60 %0 = fcmp ugt float %in, 5.0 61 %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 62 %2 = fsub float -0.000000e+00, %1 63 %3 = fptosi float %2 to i32 64 store i32 %3, i32 addrspace(1)* %out 65 ret void 66 } 67 68 ; CHECK: @fcmp_ugt_select_i32 69 ; CHECK: SETGT_DX10 * T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.x, 70 ; CHECK-NEXT: 1084227584(5.000000e+00) 71 define void @fcmp_ugt_select_i32(i32 addrspace(1)* %out, float %in) { 72 entry: 73 %0 = fcmp ugt float %in, 5.0 74 %1 = select i1 %0, i32 -1, i32 0 75 store i32 %1, i32 addrspace(1)* %out 76 ret void 77 } 78 79 ; CHECK: @fcmp_uge_select_fptosi 80 ; CHECK: SETGE_DX10 * T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.x, 81 ; CHECK-NEXT: 1084227584(5.000000e+00) 82 define void @fcmp_uge_select_fptosi(i32 addrspace(1)* %out, float %in) { 83 entry: 84 %0 = fcmp uge float %in, 5.0 85 %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 86 %2 = fsub float -0.000000e+00, %1 87 %3 = fptosi float %2 to i32 88 store i32 %3, i32 addrspace(1)* %out 89 ret void 90 } 91 92 ; CHECK: @fcmp_uge_select_i32 93 ; CHECK: SETGE_DX10 * T{{[0-9]+\.[XYZW]}}, KC0[2].Z, literal.x, 94 ; CHECK-NEXT: 1084227584(5.000000e+00) 95 define void @fcmp_uge_select_i32(i32 addrspace(1)* %out, float %in) { 96 entry: 97 %0 = fcmp uge float %in, 5.0 98 %1 = select i1 %0, i32 -1, i32 0 99 store i32 %1, i32 addrspace(1)* %out 100 ret void 101 } 102 103 ; CHECK: @fcmp_ule_select_fptosi 104 ; CHECK: SETGE_DX10 * T{{[0-9]+\.[XYZW]}}, literal.x, KC0[2].Z, 105 ; CHECK-NEXT: 1084227584(5.000000e+00) 106 define void @fcmp_ule_select_fptosi(i32 addrspace(1)* %out, float %in) { 107 entry: 108 %0 = fcmp ule float %in, 5.0 109 %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 110 %2 = fsub float -0.000000e+00, %1 111 %3 = fptosi float %2 to i32 112 store i32 %3, i32 addrspace(1)* %out 113 ret void 114 } 115 116 ; CHECK: @fcmp_ule_select_i32 117 ; CHECK: SETGE_DX10 * T{{[0-9]+\.[XYZW]}}, literal.x, KC0[2].Z, 118 ; CHECK-NEXT: 1084227584(5.000000e+00) 119 define void @fcmp_ule_select_i32(i32 addrspace(1)* %out, float %in) { 120 entry: 121 %0 = fcmp ule float %in, 5.0 122 %1 = select i1 %0, i32 -1, i32 0 123 store i32 %1, i32 addrspace(1)* %out 124 ret void 125 } 126 127 ; CHECK: @fcmp_ult_select_fptosi 128 ; CHECK: SETGT_DX10 * T{{[0-9]+\.[XYZW]}}, literal.x, KC0[2].Z, 129 ; CHECK-NEXT: 1084227584(5.000000e+00) 130 define void @fcmp_ult_select_fptosi(i32 addrspace(1)* %out, float %in) { 131 entry: 132 %0 = fcmp ult float %in, 5.0 133 %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 134 %2 = fsub float -0.000000e+00, %1 135 %3 = fptosi float %2 to i32 136 store i32 %3, i32 addrspace(1)* %out 137 ret void 138 } 139 140 ; CHECK: @fcmp_ult_select_i32 141 ; CHECK: SETGT_DX10 * T{{[0-9]+\.[XYZW]}}, literal.x, KC0[2].Z, 142 ; CHECK-NEXT: 1084227584(5.000000e+00) 143 define void @fcmp_ult_select_i32(i32 addrspace(1)* %out, float %in) { 144 entry: 145 %0 = fcmp ult float %in, 5.0 146 %1 = select i1 %0, i32 -1, i32 0 147 store i32 %1, i32 addrspace(1)* %out 148 ret void 149 } 150