1 ; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s 2 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s 3 ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s 4 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s 5 6 ;; These tests should run for all targets 7 8 ;;===-- Basic instruction selection tests ---------------------------------===;; 9 10 11 ;;; i64 12 13 define i64 @icmp_eq_i64(i64 %a, i64 %b) { 14 ; CHECK: setp.eq.s64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 15 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 16 ; CHECK: ret 17 %cmp = icmp eq i64 %a, %b 18 %ret = zext i1 %cmp to i64 19 ret i64 %ret 20 } 21 22 define i64 @icmp_ne_i64(i64 %a, i64 %b) { 23 ; CHECK: setp.ne.s64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 24 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 25 ; CHECK: ret 26 %cmp = icmp ne i64 %a, %b 27 %ret = zext i1 %cmp to i64 28 ret i64 %ret 29 } 30 31 define i64 @icmp_ugt_i64(i64 %a, i64 %b) { 32 ; CHECK: setp.gt.u64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 33 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 34 ; CHECK: ret 35 %cmp = icmp ugt i64 %a, %b 36 %ret = zext i1 %cmp to i64 37 ret i64 %ret 38 } 39 40 define i64 @icmp_uge_i64(i64 %a, i64 %b) { 41 ; CHECK: setp.ge.u64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 42 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 43 ; CHECK: ret 44 %cmp = icmp uge i64 %a, %b 45 %ret = zext i1 %cmp to i64 46 ret i64 %ret 47 } 48 49 define i64 @icmp_ult_i64(i64 %a, i64 %b) { 50 ; CHECK: setp.lt.u64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 51 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 52 ; CHECK: ret 53 %cmp = icmp ult i64 %a, %b 54 %ret = zext i1 %cmp to i64 55 ret i64 %ret 56 } 57 58 define i64 @icmp_ule_i64(i64 %a, i64 %b) { 59 ; CHECK: setp.le.u64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 60 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 61 ; CHECK: ret 62 %cmp = icmp ule i64 %a, %b 63 %ret = zext i1 %cmp to i64 64 ret i64 %ret 65 } 66 67 define i64 @icmp_sgt_i64(i64 %a, i64 %b) { 68 ; CHECK: setp.gt.s64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 69 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 70 ; CHECK: ret 71 %cmp = icmp sgt i64 %a, %b 72 %ret = zext i1 %cmp to i64 73 ret i64 %ret 74 } 75 76 define i64 @icmp_sge_i64(i64 %a, i64 %b) { 77 ; CHECK: setp.ge.s64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 78 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 79 ; CHECK: ret 80 %cmp = icmp sge i64 %a, %b 81 %ret = zext i1 %cmp to i64 82 ret i64 %ret 83 } 84 85 define i64 @icmp_slt_i64(i64 %a, i64 %b) { 86 ; CHECK: setp.lt.s64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 87 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 88 ; CHECK: ret 89 %cmp = icmp slt i64 %a, %b 90 %ret = zext i1 %cmp to i64 91 ret i64 %ret 92 } 93 94 define i64 @icmp_sle_i64(i64 %a, i64 %b) { 95 ; CHECK: setp.le.s64 %p[[P0:[0-9]+]], %rl{{[0-9]+}}, %rl{{[0-9]+}} 96 ; CHECK: selp.u64 %rl{{[0-9]+}}, 1, 0, %p[[P0]] 97 ; CHECK: ret 98 %cmp = icmp sle i64 %a, %b 99 %ret = zext i1 %cmp to i64 100 ret i64 %ret 101 } 102 103 ;;; i32 104 105 define i32 @icmp_eq_i32(i32 %a, i32 %b) { 106 ; CHECK: setp.eq.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 107 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 108 ; CHECK: ret 109 %cmp = icmp eq i32 %a, %b 110 %ret = zext i1 %cmp to i32 111 ret i32 %ret 112 } 113 114 define i32 @icmp_ne_i32(i32 %a, i32 %b) { 115 ; CHECK: setp.ne.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 116 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 117 ; CHECK: ret 118 %cmp = icmp ne i32 %a, %b 119 %ret = zext i1 %cmp to i32 120 ret i32 %ret 121 } 122 123 define i32 @icmp_ugt_i32(i32 %a, i32 %b) { 124 ; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 125 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 126 ; CHECK: ret 127 %cmp = icmp ugt i32 %a, %b 128 %ret = zext i1 %cmp to i32 129 ret i32 %ret 130 } 131 132 define i32 @icmp_uge_i32(i32 %a, i32 %b) { 133 ; CHECK: setp.ge.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 134 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 135 ; CHECK: ret 136 %cmp = icmp uge i32 %a, %b 137 %ret = zext i1 %cmp to i32 138 ret i32 %ret 139 } 140 141 define i32 @icmp_ult_i32(i32 %a, i32 %b) { 142 ; CHECK: setp.lt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 143 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 144 ; CHECK: ret 145 %cmp = icmp ult i32 %a, %b 146 %ret = zext i1 %cmp to i32 147 ret i32 %ret 148 } 149 150 define i32 @icmp_ule_i32(i32 %a, i32 %b) { 151 ; CHECK: setp.le.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 152 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 153 ; CHECK: ret 154 %cmp = icmp ule i32 %a, %b 155 %ret = zext i1 %cmp to i32 156 ret i32 %ret 157 } 158 159 define i32 @icmp_sgt_i32(i32 %a, i32 %b) { 160 ; CHECK: setp.gt.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 161 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 162 ; CHECK: ret 163 %cmp = icmp sgt i32 %a, %b 164 %ret = zext i1 %cmp to i32 165 ret i32 %ret 166 } 167 168 define i32 @icmp_sge_i32(i32 %a, i32 %b) { 169 ; CHECK: setp.ge.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 170 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 171 ; CHECK: ret 172 %cmp = icmp sge i32 %a, %b 173 %ret = zext i1 %cmp to i32 174 ret i32 %ret 175 } 176 177 define i32 @icmp_slt_i32(i32 %a, i32 %b) { 178 ; CHECK: setp.lt.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 179 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 180 ; CHECK: ret 181 %cmp = icmp slt i32 %a, %b 182 %ret = zext i1 %cmp to i32 183 ret i32 %ret 184 } 185 186 define i32 @icmp_sle_i32(i32 %a, i32 %b) { 187 ; CHECK: setp.le.s32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, %r{{[0-9]+}} 188 ; CHECK: selp.u32 %r{{[0-9]+}}, 1, 0, %p[[P0]] 189 ; CHECK: ret 190 %cmp = icmp sle i32 %a, %b 191 %ret = zext i1 %cmp to i32 192 ret i32 %ret 193 } 194 195 196 ;;; i16 197 198 define i16 @icmp_eq_i16(i16 %a, i16 %b) { 199 ; CHECK: setp.eq.s16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 200 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 201 ; CHECK: ret 202 %cmp = icmp eq i16 %a, %b 203 %ret = zext i1 %cmp to i16 204 ret i16 %ret 205 } 206 207 define i16 @icmp_ne_i16(i16 %a, i16 %b) { 208 ; CHECK: setp.ne.s16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 209 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 210 ; CHECK: ret 211 %cmp = icmp ne i16 %a, %b 212 %ret = zext i1 %cmp to i16 213 ret i16 %ret 214 } 215 216 define i16 @icmp_ugt_i16(i16 %a, i16 %b) { 217 ; CHECK: setp.gt.u16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 218 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 219 ; CHECK: ret 220 %cmp = icmp ugt i16 %a, %b 221 %ret = zext i1 %cmp to i16 222 ret i16 %ret 223 } 224 225 define i16 @icmp_uge_i16(i16 %a, i16 %b) { 226 ; CHECK: setp.ge.u16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 227 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 228 ; CHECK: ret 229 %cmp = icmp uge i16 %a, %b 230 %ret = zext i1 %cmp to i16 231 ret i16 %ret 232 } 233 234 define i16 @icmp_ult_i16(i16 %a, i16 %b) { 235 ; CHECK: setp.lt.u16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 236 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 237 ; CHECK: ret 238 %cmp = icmp ult i16 %a, %b 239 %ret = zext i1 %cmp to i16 240 ret i16 %ret 241 } 242 243 define i16 @icmp_ule_i16(i16 %a, i16 %b) { 244 ; CHECK: setp.le.u16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 245 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 246 ; CHECK: ret 247 %cmp = icmp ule i16 %a, %b 248 %ret = zext i1 %cmp to i16 249 ret i16 %ret 250 } 251 252 define i16 @icmp_sgt_i16(i16 %a, i16 %b) { 253 ; CHECK: setp.gt.s16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 254 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 255 ; CHECK: ret 256 %cmp = icmp sgt i16 %a, %b 257 %ret = zext i1 %cmp to i16 258 ret i16 %ret 259 } 260 261 define i16 @icmp_sge_i16(i16 %a, i16 %b) { 262 ; CHECK: setp.ge.s16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 263 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 264 ; CHECK: ret 265 %cmp = icmp sge i16 %a, %b 266 %ret = zext i1 %cmp to i16 267 ret i16 %ret 268 } 269 270 define i16 @icmp_slt_i16(i16 %a, i16 %b) { 271 ; CHECK: setp.lt.s16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 272 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 273 ; CHECK: ret 274 %cmp = icmp slt i16 %a, %b 275 %ret = zext i1 %cmp to i16 276 ret i16 %ret 277 } 278 279 define i16 @icmp_sle_i16(i16 %a, i16 %b) { 280 ; CHECK: setp.le.s16 %p[[P0:[0-9]+]], %rs{{[0-9]+}}, %rs{{[0-9]+}} 281 ; CHECK: selp.u16 %rs{{[0-9]+}}, 1, 0, %p[[P0]] 282 ; CHECK: ret 283 %cmp = icmp sle i16 %a, %b 284 %ret = zext i1 %cmp to i16 285 ret i16 %ret 286 } 287 288 289 ;;; i8 290 291 define i8 @icmp_eq_i8(i8 %a, i8 %b) { 292 ; Comparison happens in 16-bit 293 ; CHECK: setp.eq.s16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 294 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 295 ; CHECK: ret 296 %cmp = icmp eq i8 %a, %b 297 %ret = zext i1 %cmp to i8 298 ret i8 %ret 299 } 300 301 define i8 @icmp_ne_i8(i8 %a, i8 %b) { 302 ; Comparison happens in 16-bit 303 ; CHECK: setp.ne.s16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 304 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 305 ; CHECK: ret 306 %cmp = icmp ne i8 %a, %b 307 %ret = zext i1 %cmp to i8 308 ret i8 %ret 309 } 310 311 define i8 @icmp_ugt_i8(i8 %a, i8 %b) { 312 ; Comparison happens in 16-bit 313 ; CHECK: setp.gt.u16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 314 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 315 ; CHECK: ret 316 %cmp = icmp ugt i8 %a, %b 317 %ret = zext i1 %cmp to i8 318 ret i8 %ret 319 } 320 321 define i8 @icmp_uge_i8(i8 %a, i8 %b) { 322 ; Comparison happens in 16-bit 323 ; CHECK: setp.ge.u16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 324 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 325 ; CHECK: ret 326 %cmp = icmp uge i8 %a, %b 327 %ret = zext i1 %cmp to i8 328 ret i8 %ret 329 } 330 331 define i8 @icmp_ult_i8(i8 %a, i8 %b) { 332 ; Comparison happens in 16-bit 333 ; CHECK: setp.lt.u16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 334 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 335 ; CHECK: ret 336 %cmp = icmp ult i8 %a, %b 337 %ret = zext i1 %cmp to i8 338 ret i8 %ret 339 } 340 341 define i8 @icmp_ule_i8(i8 %a, i8 %b) { 342 ; Comparison happens in 16-bit 343 ; CHECK: setp.le.u16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 344 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 345 ; CHECK: ret 346 %cmp = icmp ule i8 %a, %b 347 %ret = zext i1 %cmp to i8 348 ret i8 %ret 349 } 350 351 define i8 @icmp_sgt_i8(i8 %a, i8 %b) { 352 ; Comparison happens in 16-bit 353 ; CHECK: setp.gt.s16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 354 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 355 ; CHECK: ret 356 %cmp = icmp sgt i8 %a, %b 357 %ret = zext i1 %cmp to i8 358 ret i8 %ret 359 } 360 361 define i8 @icmp_sge_i8(i8 %a, i8 %b) { 362 ; Comparison happens in 16-bit 363 ; CHECK: setp.ge.s16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 364 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 365 ; CHECK: ret 366 %cmp = icmp sge i8 %a, %b 367 %ret = zext i1 %cmp to i8 368 ret i8 %ret 369 } 370 371 define i8 @icmp_slt_i8(i8 %a, i8 %b) { 372 ; Comparison happens in 16-bit 373 ; CHECK: setp.lt.s16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 374 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 375 ; CHECK: ret 376 %cmp = icmp slt i8 %a, %b 377 %ret = zext i1 %cmp to i8 378 ret i8 %ret 379 } 380 381 define i8 @icmp_sle_i8(i8 %a, i8 %b) { 382 ; Comparison happens in 16-bit 383 ; CHECK: setp.le.s16 %p[[P0:[0-9]+]], %temp{{[0-9]+}}, %temp{{[0-9]+}} 384 ; CHECK: selp.u16 %rc{{[0-9]+}}, 1, 0, %p[[P0]] 385 ; CHECK: ret 386 %cmp = icmp sle i8 %a, %b 387 %ret = zext i1 %cmp to i8 388 ret i8 %ret 389 } 390