1 ; RUN: llc < %s -march=ptx32 | FileCheck %s 2 3 define ptx_device i32 @test_setp_eq_u32_rr(i32 %x, i32 %y) { 4 ; CHECK: setp.eq.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 5 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 6 ; CHECK: ret; 7 %p = icmp eq i32 %x, %y 8 %z = zext i1 %p to i32 9 ret i32 %z 10 } 11 12 define ptx_device i32 @test_setp_ne_u32_rr(i32 %x, i32 %y) { 13 ; CHECK: setp.ne.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 14 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 15 ; CHECK: ret; 16 %p = icmp ne i32 %x, %y 17 %z = zext i1 %p to i32 18 ret i32 %z 19 } 20 21 define ptx_device i32 @test_setp_lt_u32_rr(i32 %x, i32 %y) { 22 ; CHECK: setp.lt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 23 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 24 ; CHECK: ret; 25 %p = icmp ult i32 %x, %y 26 %z = zext i1 %p to i32 27 ret i32 %z 28 } 29 30 define ptx_device i32 @test_setp_le_u32_rr(i32 %x, i32 %y) { 31 ; CHECK: setp.le.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 32 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 33 ; CHECK: ret; 34 %p = icmp ule i32 %x, %y 35 %z = zext i1 %p to i32 36 ret i32 %z 37 } 38 39 define ptx_device i32 @test_setp_gt_u32_rr(i32 %x, i32 %y) { 40 ; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 41 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 42 ; CHECK: ret; 43 %p = icmp ugt i32 %x, %y 44 %z = zext i1 %p to i32 45 ret i32 %z 46 } 47 48 define ptx_device i32 @test_setp_ge_u32_rr(i32 %x, i32 %y) { 49 ; CHECK: setp.ge.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 50 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 51 ; CHECK: ret; 52 %p = icmp uge i32 %x, %y 53 %z = zext i1 %p to i32 54 ret i32 %z 55 } 56 57 define ptx_device i32 @test_setp_lt_s32_rr(i32 %x, i32 %y) { 58 ; CHECK: setp.lt.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 59 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 60 ; CHECK: ret; 61 %p = icmp slt i32 %x, %y 62 %z = zext i1 %p to i32 63 ret i32 %z 64 } 65 66 define ptx_device i32 @test_setp_le_s32_rr(i32 %x, i32 %y) { 67 ; CHECK: setp.le.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 68 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 69 ; CHECK: ret; 70 %p = icmp sle i32 %x, %y 71 %z = zext i1 %p to i32 72 ret i32 %z 73 } 74 75 define ptx_device i32 @test_setp_gt_s32_rr(i32 %x, i32 %y) { 76 ; CHECK: setp.gt.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 77 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 78 ; CHECK: ret; 79 %p = icmp sgt i32 %x, %y 80 %z = zext i1 %p to i32 81 ret i32 %z 82 } 83 84 define ptx_device i32 @test_setp_ge_s32_rr(i32 %x, i32 %y) { 85 ; CHECK: setp.ge.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 86 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 87 ; CHECK: ret; 88 %p = icmp sge i32 %x, %y 89 %z = zext i1 %p to i32 90 ret i32 %z 91 } 92 93 define ptx_device i32 @test_setp_eq_u32_ri(i32 %x) { 94 ; CHECK: setp.eq.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 1; 95 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 96 ; CHECK: ret; 97 %p = icmp eq i32 %x, 1 98 %z = zext i1 %p to i32 99 ret i32 %z 100 } 101 102 define ptx_device i32 @test_setp_ne_u32_ri(i32 %x) { 103 ; CHECK: setp.ne.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 1; 104 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 105 ; CHECK: ret; 106 %p = icmp ne i32 %x, 1 107 %z = zext i1 %p to i32 108 ret i32 %z 109 } 110 111 define ptx_device i32 @test_setp_lt_u32_ri(i32 %x) { 112 ; CHECK: setp.eq.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 0; 113 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 114 ; CHECK: ret; 115 %p = icmp ult i32 %x, 1 116 %z = zext i1 %p to i32 117 ret i32 %z 118 } 119 120 define ptx_device i32 @test_setp_le_u32_ri(i32 %x) { 121 ; CHECK: setp.lt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 2; 122 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 123 ; CHECK: ret; 124 %p = icmp ule i32 %x, 1 125 %z = zext i1 %p to i32 126 ret i32 %z 127 } 128 129 define ptx_device i32 @test_setp_gt_u32_ri(i32 %x) { 130 ; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 1; 131 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 132 ; CHECK: ret; 133 %p = icmp ugt i32 %x, 1 134 %z = zext i1 %p to i32 135 ret i32 %z 136 } 137 138 define ptx_device i32 @test_setp_ge_u32_ri(i32 %x) { 139 ; CHECK: setp.ne.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 0; 140 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 141 ; CHECK: ret; 142 %p = icmp uge i32 %x, 1 143 %z = zext i1 %p to i32 144 ret i32 %z 145 } 146 147 define ptx_device i32 @test_setp_lt_s32_ri(i32 %x) { 148 ; CHECK: setp.lt.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 1; 149 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 150 ; CHECK: ret; 151 %p = icmp slt i32 %x, 1 152 %z = zext i1 %p to i32 153 ret i32 %z 154 } 155 156 define ptx_device i32 @test_setp_le_s32_ri(i32 %x) { 157 ; CHECK: setp.lt.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 2; 158 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 159 ; CHECK: ret; 160 %p = icmp sle i32 %x, 1 161 %z = zext i1 %p to i32 162 ret i32 %z 163 } 164 165 define ptx_device i32 @test_setp_gt_s32_ri(i32 %x) { 166 ; CHECK: setp.gt.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 1; 167 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 168 ; CHECK: ret; 169 %p = icmp sgt i32 %x, 1 170 %z = zext i1 %p to i32 171 ret i32 %z 172 } 173 174 define ptx_device i32 @test_setp_ge_s32_ri(i32 %x) { 175 ; CHECK: setp.gt.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 0; 176 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0]]; 177 ; CHECK: ret; 178 %p = icmp sge i32 %x, 1 179 %z = zext i1 %p to i32 180 ret i32 %z 181 } 182 183 define ptx_device i32 @test_setp_4_op_format_1(i32 %x, i32 %y, i32 %u, i32 %v) { 184 ; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}}; 185 ; CHECK: setp.eq.and.u32 %p1, %r{{[0-9]+}}, %r{{[0-9]+}}, %p[[P0]]; 186 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p1; 187 ; CHECK: ret; 188 %c = icmp eq i32 %x, %y 189 %d = icmp ugt i32 %u, %v 190 %e = and i1 %c, %d 191 %z = zext i1 %e to i32 192 ret i32 %z 193 } 194 195 define ptx_device i32 @test_setp_4_op_format_2(i32 %x, i32 %y, i32 %w) { 196 ; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 0; 197 ; CHECK: setp.eq.and.u32 %p1, %r{{[0-9]+}}, %r{{[0-9]+}}, !%p[[P0]]; 198 ; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p1; 199 ; CHECK: ret; 200 %c = trunc i32 %w to i1 201 %d = icmp eq i32 %x, %y 202 %e = xor i1 %c, 1 203 %f = and i1 %d, %e 204 %z = zext i1 %f to i32 205 ret i32 %z 206 } 207