1 ; Test encoding of MIPS32 instructions used in intrinsic calls 2 3 ; REQUIRES: allow_dump 4 5 ; Compile using standalone assembler. 6 ; RUN: %p2i --filetype=asm -i %s --target=mips32 --args -O2 \ 7 ; RUN: --allow-externally-defined-symbols \ 8 ; RUN: | FileCheck %s --check-prefix=ASM 9 10 ; Show bytes in assembled standalone code. 11 ; RUN: %p2i --filetype=asm -i %s --target=mips32 --assemble --disassemble \ 12 ; RUN: --args -O2 --allow-externally-defined-symbols \ 13 ; RUN: | FileCheck %s --check-prefix=DIS 14 15 ; Compile using integrated assembler. 16 ; RUN: %p2i --filetype=iasm -i %s --target=mips32 --args -O2 \ 17 ; RUN: --allow-externally-defined-symbols \ 18 ; RUN: | FileCheck %s --check-prefix=IASM 19 20 ; Show bytes in assembled integrated code. 21 ; RUN: %p2i --filetype=iasm -i %s --target=mips32 --assemble --disassemble \ 22 ; RUN: --args -O2 --allow-externally-defined-symbols \ 23 ; RUN: | FileCheck %s --check-prefix=DIS 24 25 declare i16 @llvm.bswap.i16(i16) 26 declare i32 @llvm.bswap.i32(i32) 27 declare i64 @llvm.bswap.i64(i64) 28 declare i32 @llvm.ctlz.i32(i32, i1) 29 declare i64 @llvm.ctlz.i64(i64, i1) 30 declare i32 @llvm.cttz.i32(i32, i1) 31 declare i64 @llvm.cttz.i64(i64, i1) 32 declare void @llvm.trap() 33 34 define internal i32 @encBswap16(i32 %x) { 35 entry: 36 %x_trunc = trunc i32 %x to i16 37 %r = call i16 @llvm.bswap.i16(i16 %x_trunc) 38 %r_zext = zext i16 %r to i32 39 ret i32 %r_zext 40 } 41 42 ; ASM-LABEL: encBswap16 43 ; ASM-NEXT: .LencBswap16$entry: 44 ; ASM-NEXT: andi $a0, $a0, 65535 45 ; ASM-NEXT: sll $v0, $a0, 8 46 ; ASM-NEXT: lui $v1, 255 47 ; ASM-NEXT: and $v0, $v0, $v1 48 ; ASM-NEXT: sll $a0, $a0, 24 49 ; ASM-NEXT: or $v0, $a0, $v0 50 ; ASM-NEXT: srl $v0, $v0, 16 51 ; ASM-NEXT: andi $v0, $v0, 65535 52 ; ASM-NEXT: jr $ra 53 54 ; DIS-LABEL: <encBswap16>: 55 ; DIS-NEXT: 3084ffff andi a0,a0,0xffff 56 ; DIS-NEXT: 00041200 sll v0,a0,0x8 57 ; DIS-NEXT: 3c0300ff lui v1,0xff 58 ; DIS-NEXT: 00431024 and v0,v0,v1 59 ; DIS-NEXT: 00042600 sll a0,a0,0x18 60 ; DIS-NEXT: 00821025 or v0,a0,v0 61 ; DIS-NEXT: 00021402 srl v0,v0,0x10 62 ; DIS-NEXT: 3042ffff andi v0,v0,0xffff 63 ; DIS-NEXT: 03e00008 jr ra 64 65 ; IASM-LABEL: encBswap16 66 ; IASM-NEXT: .LencBswap16$entry: 67 ; IASM-NEXT: .byte 0xff 68 ; IASM-NEXT: .byte 0xff 69 ; IASM-NEXT: .byte 0x84 70 ; IASM-NEXT: .byte 0x30 71 ; IASM-NEXT: .byte 0x0 72 ; IASM-NEXT: .byte 0x12 73 ; IASM-NEXT: .byte 0x4 74 ; IASM-NEXT: .byte 0x0 75 ; IASM-NEXT: .byte 0xff 76 ; IASM-NEXT: .byte 0x0 77 ; IASM-NEXT: .byte 0x3 78 ; IASM-NEXT: .byte 0x3c 79 ; IASM-NEXT: .byte 0x24 80 ; IASM-NEXT: .byte 0x10 81 ; IASM-NEXT: .byte 0x43 82 ; IASM-NEXT: .byte 0x0 83 ; IASM-NEXT: .byte 0x0 84 ; IASM-NEXT: .byte 0x26 85 ; IASM-NEXT: .byte 0x4 86 ; IASM-NEXT: .byte 0x0 87 ; IASM-NEXT: .byte 0x25 88 ; IASM-NEXT: .byte 0x10 89 ; IASM-NEXT: .byte 0x82 90 ; IASM-NEXT: .byte 0x0 91 ; IASM-NEXT: .byte 0x2 92 ; IASM-NEXT: .byte 0x14 93 ; IASM-NEXT: .byte 0x2 94 ; IASM-NEXT: .byte 0x0 95 ; IASM-NEXT: .byte 0xff 96 ; IASM-NEXT: .byte 0xff 97 ; IASM-NEXT: .byte 0x42 98 ; IASM-NEXT: .byte 0x30 99 ; IASM-NEXT: .byte 0x8 100 ; IASM-NEXT: .byte 0x0 101 ; IASM-NEXT: .byte 0xe0 102 ; IASM-NEXT: .byte 0x3 103 104 define internal i32 @encBswap32(i32 %x) { 105 entry: 106 %r = call i32 @llvm.bswap.i32(i32 %x) 107 ret i32 %r 108 } 109 110 ; ASM-LABEL: encBswap32 111 ; ASM-NEXT: .LencBswap32$entry: 112 ; ASM-NEXT: srl $v0, $a0, 24 113 ; ASM-NEXT: srl $v1, $a0, 8 114 ; ASM-NEXT: andi $v1, $v1, 65280 115 ; ASM-NEXT: or $v0, $v1, $v0 116 ; ASM-NEXT: sll $v1, $a0, 8 117 ; ASM-NEXT: lui $a1, 255 118 ; ASM-NEXT: and $v1, $v1, $a1 119 ; ASM-NEXT: sll $a0, $a0, 24 120 ; ASM-NEXT: or $v1, $a0, $v1 121 ; ASM-NEXT: or $v1, $v1, $v0 122 ; ASM-NEXT: move $v0, $v1 123 ; ASM-NEXT: jr $ra 124 125 ; DIS-LABEL: <encBswap32>: 126 ; DIS-NEXT: 00041602 srl v0,a0,0x18 127 ; DIS-NEXT: 00041a02 srl v1,a0,0x8 128 ; DIS-NEXT: 3063ff00 andi v1,v1,0xff00 129 ; DIS-NEXT: 00621025 or v0,v1,v0 130 ; DIS-NEXT: 00041a00 sll v1,a0,0x8 131 ; DIS-NEXT: 3c0500ff lui a1,0xff 132 ; DIS-NEXT: 00651824 and v1,v1,a1 133 ; DIS-NEXT: 00042600 sll a0,a0,0x18 134 ; DIS-NEXT: 00831825 or v1,a0,v1 135 ; DIS-NEXT: 00621825 or v1,v1,v0 136 ; DIS-NEXT: 00601021 move v0,v1 137 ; DIS-NEXT: 03e00008 jr ra 138 139 ; IASM-LABEL: encBswap32 140 ; IASM-NEXT: .LencBswap32$entry: 141 ; IASM-NEXT: .byte 0x2 142 ; IASM-NEXT: .byte 0x16 143 ; IASM-NEXT: .byte 0x4 144 ; IASM-NEXT: .byte 0x0 145 ; IASM-NEXT: .byte 0x2 146 ; IASM-NEXT: .byte 0x1a 147 ; IASM-NEXT: .byte 0x4 148 ; IASM-NEXT: .byte 0x0 149 ; IASM-NEXT: .byte 0x0 150 ; IASM-NEXT: .byte 0xff 151 ; IASM-NEXT: .byte 0x63 152 ; IASM-NEXT: .byte 0x30 153 ; IASM-NEXT: .byte 0x25 154 ; IASM-NEXT: .byte 0x10 155 ; IASM-NEXT: .byte 0x62 156 ; IASM-NEXT: .byte 0x0 157 ; IASM-NEXT: .byte 0x0 158 ; IASM-NEXT: .byte 0x1a 159 ; IASM-NEXT: .byte 0x4 160 ; IASM-NEXT: .byte 0x0 161 ; IASM-NEXT: .byte 0xff 162 ; IASM-NEXT: .byte 0x0 163 ; IASM-NEXT: .byte 0x5 164 ; IASM-NEXT: .byte 0x3c 165 ; IASM-NEXT: .byte 0x24 166 ; IASM-NEXT: .byte 0x18 167 ; IASM-NEXT: .byte 0x65 168 ; IASM-NEXT: .byte 0x0 169 ; IASM-NEXT: .byte 0x0 170 ; IASM-NEXT: .byte 0x26 171 ; IASM-NEXT: .byte 0x4 172 ; IASM-NEXT: .byte 0x0 173 ; IASM-NEXT: .byte 0x25 174 ; IASM-NEXT: .byte 0x18 175 ; IASM-NEXT: .byte 0x83 176 ; IASM-NEXT: .byte 0x0 177 ; IASM-NEXT: .byte 0x25 178 ; IASM-NEXT: .byte 0x18 179 ; IASM-NEXT: .byte 0x62 180 ; IASM-NEXT: .byte 0x0 181 ; IASM-NEXT: .byte 0x21 182 ; IASM-NEXT: .byte 0x10 183 ; IASM-NEXT: .byte 0x60 184 ; IASM-NEXT: .byte 0x0 185 ; IASM-NEXT: .byte 0x8 186 ; IASM-NEXT: .byte 0x0 187 ; IASM-NEXT: .byte 0xe0 188 ; IASM-NEXT: .byte 0x3 189 190 define internal i64 @encBswap64(i64 %x) { 191 entry: 192 %r = call i64 @llvm.bswap.i64(i64 %x) 193 ret i64 %r 194 } 195 196 ; ASM-LABEL: encBswap64 197 ; ASM-NEXT: .LencBswap64$entry: 198 ; ASM-NEXT: sll $v0, $a1, 8 199 ; ASM-NEXT: srl $v1, $a1, 24 200 ; ASM-NEXT: srl $a2, $a1, 8 201 ; ASM-NEXT: andi $a2, $a2, 65280 202 ; ASM-NEXT: lui $a3, 255 203 ; ASM-NEXT: or $a2, $a2, $v1 204 ; ASM-NEXT: and $v0, $v0, $a3 205 ; ASM-NEXT: sll $a1, $a1, 24 206 ; ASM-NEXT: or $a1, $a1, $v0 207 ; ASM-NEXT: srl $v0, $a0, 24 208 ; ASM-NEXT: srl $v1, $a0, 8 209 ; ASM-NEXT: andi $v1, $v1, 65280 210 ; ASM-NEXT: or $a1, $a1, $a2 211 ; ASM-NEXT: or $v1, $v1, $v0 212 ; ASM-NEXT: sll $v0, $a0, 8 213 ; ASM-NEXT: and $v0, $v0, $a3 214 ; ASM-NEXT: sll $a0, $a0, 24 215 ; ASM-NEXT: or $a0, $a0, $v0 216 ; ASM-NEXT: or $a0, $a0, $v1 217 ; ASM-NEXT: move $v0, $a1 218 ; ASM-NEXT: move $v1, $a0 219 ; ASM-NEXT: jr $ra 220 221 ; DIS-LABEL: <encBswap64>: 222 ; DIS-NEXT: 00051200 sll v0,a1,0x8 223 ; DIS-NEXT: 00051e02 srl v1,a1,0x18 224 ; DIS-NEXT: 00053202 srl a2,a1,0x8 225 ; DIS-NEXT: 30c6ff00 andi a2,a2,0xff00 226 ; DIS-NEXT: 3c0700ff lui a3,0xff 227 ; DIS-NEXT: 00c33025 or a2,a2,v1 228 ; DIS-NEXT: 00471024 and v0,v0,a3 229 ; DIS-NEXT: 00052e00 sll a1,a1,0x18 230 ; DIS-NEXT: 00a22825 or a1,a1,v0 231 ; DIS-NEXT: 00041602 srl v0,a0,0x18 232 ; DIS-NEXT: 00041a02 srl v1,a0,0x8 233 ; DIS-NEXT: 3063ff00 andi v1,v1,0xff00 234 ; DIS-NEXT: 00a62825 or a1,a1,a2 235 ; DIS-NEXT: 00621825 or v1,v1,v0 236 ; DIS-NEXT: 00041200 sll v0,a0,0x8 237 ; DIS-NEXT: 00471024 and v0,v0,a3 238 ; DIS-NEXT: 00042600 sll a0,a0,0x18 239 ; DIS-NEXT: 00822025 or a0,a0,v0 240 ; DIS-NEXT: 00832025 or a0,a0,v1 241 ; DIS-NEXT: 00a01021 move v0,a1 242 ; DIS-NEXT: 00801821 move v1,a0 243 ; DIS-NEXT: 03e00008 jr ra 244 245 246 ; IASM-LABEL: encBswap64 247 ; IASM-NEXT: .LencBswap64$entry: 248 ; IASM-NEXT: .byte 0x0 249 ; IASM-NEXT: .byte 0x12 250 ; IASM-NEXT: .byte 0x5 251 ; IASM-NEXT: .byte 0x0 252 ; IASM-NEXT: .byte 0x2 253 ; IASM-NEXT: .byte 0x1e 254 ; IASM-NEXT: .byte 0x5 255 ; IASM-NEXT: .byte 0x0 256 ; IASM-NEXT: .byte 0x2 257 ; IASM-NEXT: .byte 0x32 258 ; IASM-NEXT: .byte 0x5 259 ; IASM-NEXT: .byte 0x0 260 ; IASM-NEXT: .byte 0x0 261 ; IASM-NEXT: .byte 0xff 262 ; IASM-NEXT: .byte 0xc6 263 ; IASM-NEXT: .byte 0x30 264 ; IASM-NEXT: .byte 0xff 265 ; IASM-NEXT: .byte 0x0 266 ; IASM-NEXT: .byte 0x7 267 ; IASM-NEXT: .byte 0x3c 268 ; IASM-NEXT: .byte 0x25 269 ; IASM-NEXT: .byte 0x30 270 ; IASM-NEXT: .byte 0xc3 271 ; IASM-NEXT: .byte 0x0 272 ; IASM-NEXT: .byte 0x24 273 ; IASM-NEXT: .byte 0x10 274 ; IASM-NEXT: .byte 0x47 275 ; IASM-NEXT: .byte 0x0 276 ; IASM-NEXT: .byte 0x0 277 ; IASM-NEXT: .byte 0x2e 278 ; IASM-NEXT: .byte 0x5 279 ; IASM-NEXT: .byte 0x0 280 ; IASM-NEXT: .byte 0x25 281 ; IASM-NEXT: .byte 0x28 282 ; IASM-NEXT: .byte 0xa2 283 ; IASM-NEXT: .byte 0x0 284 ; IASM-NEXT: .byte 0x2 285 ; IASM-NEXT: .byte 0x16 286 ; IASM-NEXT: .byte 0x4 287 ; IASM-NEXT: .byte 0x0 288 ; IASM-NEXT: .byte 0x2 289 ; IASM-NEXT: .byte 0x1a 290 ; IASM-NEXT: .byte 0x4 291 ; IASM-NEXT: .byte 0x0 292 ; IASM-NEXT: .byte 0x0 293 ; IASM-NEXT: .byte 0xff 294 ; IASM-NEXT: .byte 0x63 295 ; IASM-NEXT: .byte 0x30 296 ; IASM-NEXT: .byte 0x25 297 ; IASM-NEXT: .byte 0x28 298 ; IASM-NEXT: .byte 0xa6 299 ; IASM-NEXT: .byte 0x0 300 ; IASM-NEXT: .byte 0x25 301 ; IASM-NEXT: .byte 0x18 302 ; IASM-NEXT: .byte 0x62 303 ; IASM-NEXT: .byte 0x0 304 ; IASM-NEXT: .byte 0x0 305 ; IASM-NEXT: .byte 0x12 306 ; IASM-NEXT: .byte 0x4 307 ; IASM-NEXT: .byte 0x0 308 ; IASM-NEXT: .byte 0x24 309 ; IASM-NEXT: .byte 0x10 310 ; IASM-NEXT: .byte 0x47 311 ; IASM-NEXT: .byte 0x0 312 ; IASM-NEXT: .byte 0x0 313 ; IASM-NEXT: .byte 0x26 314 ; IASM-NEXT: .byte 0x4 315 ; IASM-NEXT: .byte 0x0 316 ; IASM-NEXT: .byte 0x25 317 ; IASM-NEXT: .byte 0x20 318 ; IASM-NEXT: .byte 0x82 319 ; IASM-NEXT: .byte 0x0 320 ; IASM-NEXT: .byte 0x25 321 ; IASM-NEXT: .byte 0x20 322 ; IASM-NEXT: .byte 0x83 323 ; IASM-NEXT: .byte 0x0 324 ; IASM-NEXT: .byte 0x21 325 ; IASM-NEXT: .byte 0x10 326 ; IASM-NEXT: .byte 0xa0 327 ; IASM-NEXT: .byte 0x0 328 ; IASM-NEXT: .byte 0x21 329 ; IASM-NEXT: .byte 0x18 330 ; IASM-NEXT: .byte 0x80 331 ; IASM-NEXT: .byte 0x0 332 ; IASM-NEXT: .byte 0x8 333 ; IASM-NEXT: .byte 0x0 334 ; IASM-NEXT: .byte 0xe0 335 ; IASM-NEXT: .byte 0x3 336 337 define internal i64 @encBswap64Undef() { 338 entry: 339 %r = call i64 @llvm.bswap.i64(i64 undef) 340 ret i64 %r 341 } 342 343 ; ASM-LABEL: encBswap64Undef 344 ; ASM-NEXT: .LencBswap64Undef$entry: 345 ; ASM-NEXT: # $zero = def.pseudo 346 ; ASM-NEXT: addiu $v0, $zero, 0 347 ; ASM-NEXT: # $zero = def.pseudo 348 ; ASM-NEXT: addiu $v1, $zero, 0 349 ; ASM-NEXT: sll $a0, $v1, 8 350 ; ASM-NEXT: srl $a1, $v1, 24 351 ; ASM-NEXT: srl $a2, $v1, 8 352 ; ASM-NEXT: andi $a2, $a2, 65280 353 ; ASM-NEXT: lui $a3, 255 354 ; ASM-NEXT: or $a2, $a2, $a1 355 ; ASM-NEXT: and $a0, $a0, $a3 356 ; ASM-NEXT: sll $v1, $v1, 24 357 ; ASM-NEXT: or $v1, $v1, $a0 358 ; ASM-NEXT: srl $a0, $v0, 24 359 ; ASM-NEXT: srl $a1, $v0, 8 360 ; ASM-NEXT: andi $a1, $a1, 65280 361 ; ASM-NEXT: or $v1, $v1, $a2 362 ; ASM-NEXT: or $a1, $a1, $a0 363 ; ASM-NEXT: sll $a0, $v0, 8 364 ; ASM-NEXT: and $a0, $a0, $a3 365 ; ASM-NEXT: sll $v0, $v0, 24 366 ; ASM-NEXT: or $v0, $v0, $a0 367 ; ASM-NEXT: or $v0, $v0, $a1 368 ; ASM-NEXT: move $a0, $v0 369 ; ASM-NEXT: move $v0, $v1 370 ; ASM-NEXT: move $v1, $a0 371 ; ASM-NEXT: jr $ra 372 373 ; DIS-LABEL: <encBswap64Undef>: 374 ; DIS-NEXT: 24020000 li v0,0 375 ; DIS-NEXT: 24030000 li v1,0 376 ; DIS-NEXT: 00032200 sll a0,v1,0x8 377 ; DIS-NEXT: 00032e02 srl a1,v1,0x18 378 ; DIS-NEXT: 00033202 srl a2,v1,0x8 379 ; DIS-NEXT: 30c6ff00 andi a2,a2,0xff00 380 ; DIS-NEXT: 3c0700ff lui a3,0xff 381 ; DIS-NEXT: 00c53025 or a2,a2,a1 382 ; DIS-NEXT: 00872024 and a0,a0,a3 383 ; DIS-NEXT: 00031e00 sll v1,v1,0x18 384 ; DIS-NEXT: 00641825 or v1,v1,a0 385 ; DIS-NEXT: 00022602 srl a0,v0,0x18 386 ; DIS-NEXT: 00022a02 srl a1,v0,0x8 387 ; DIS-NEXT: 30a5ff00 andi a1,a1,0xff00 388 ; DIS-NEXT: 00661825 or v1,v1,a2 389 ; DIS-NEXT: 00a42825 or a1,a1,a0 390 ; DIS-NEXT: 00022200 sll a0,v0,0x8 391 ; DIS-NEXT: 00872024 and a0,a0,a3 392 ; DIS-NEXT: 00021600 sll v0,v0,0x18 393 ; DIS-NEXT: 00441025 or v0,v0,a0 394 ; DIS-NEXT: 00451025 or v0,v0,a1 395 ; DIS-NEXT: 00402021 move a0,v0 396 ; DIS-NEXT: 00601021 move v0,v1 397 ; DIS-NEXT: 00801821 move v1,a0 398 ; DIS-NEXT: 03e00008 jr ra 399 400 ; IASM-LABEL: encBswap64Undef 401 ; IASM-NEXT: .LencBswap64Undef$entry: 402 ; IASM-NEXT: .byte 0x0 403 ; IASM-NEXT: .byte 0x0 404 ; IASM-NEXT: .byte 0x2 405 ; IASM-NEXT: .byte 0x24 406 ; IASM-NEXT: .byte 0x0 407 ; IASM-NEXT: .byte 0x0 408 ; IASM-NEXT: .byte 0x3 409 ; IASM-NEXT: .byte 0x24 410 ; IASM-NEXT: .byte 0x0 411 ; IASM-NEXT: .byte 0x22 412 ; IASM-NEXT: .byte 0x3 413 ; IASM-NEXT: .byte 0x0 414 ; IASM-NEXT: .byte 0x2 415 ; IASM-NEXT: .byte 0x2e 416 ; IASM-NEXT: .byte 0x3 417 ; IASM-NEXT: .byte 0x0 418 ; IASM-NEXT: .byte 0x2 419 ; IASM-NEXT: .byte 0x32 420 ; IASM-NEXT: .byte 0x3 421 ; IASM-NEXT: .byte 0x0 422 ; IASM-NEXT: .byte 0x0 423 ; IASM-NEXT: .byte 0xff 424 ; IASM-NEXT: .byte 0xc6 425 ; IASM-NEXT: .byte 0x30 426 ; IASM-NEXT: .byte 0xff 427 ; IASM-NEXT: .byte 0x0 428 ; IASM-NEXT: .byte 0x7 429 ; IASM-NEXT: .byte 0x3c 430 ; IASM-NEXT: .byte 0x25 431 ; IASM-NEXT: .byte 0x30 432 ; IASM-NEXT: .byte 0xc5 433 ; IASM-NEXT: .byte 0x0 434 ; IASM-NEXT: .byte 0x24 435 ; IASM-NEXT: .byte 0x20 436 ; IASM-NEXT: .byte 0x87 437 ; IASM-NEXT: .byte 0x0 438 ; IASM-NEXT: .byte 0x0 439 ; IASM-NEXT: .byte 0x1e 440 ; IASM-NEXT: .byte 0x3 441 ; IASM-NEXT: .byte 0x0 442 ; IASM-NEXT: .byte 0x25 443 ; IASM-NEXT: .byte 0x18 444 ; IASM-NEXT: .byte 0x64 445 ; IASM-NEXT: .byte 0x0 446 ; IASM-NEXT: .byte 0x2 447 ; IASM-NEXT: .byte 0x26 448 ; IASM-NEXT: .byte 0x2 449 ; IASM-NEXT: .byte 0x0 450 ; IASM-NEXT: .byte 0x2 451 ; IASM-NEXT: .byte 0x2a 452 ; IASM-NEXT: .byte 0x2 453 ; IASM-NEXT: .byte 0x0 454 ; IASM-NEXT: .byte 0x0 455 ; IASM-NEXT: .byte 0xff 456 ; IASM-NEXT: .byte 0xa5 457 ; IASM-NEXT: .byte 0x30 458 ; IASM-NEXT: .byte 0x25 459 ; IASM-NEXT: .byte 0x18 460 ; IASM-NEXT: .byte 0x66 461 ; IASM-NEXT: .byte 0x0 462 ; IASM-NEXT: .byte 0x25 463 ; IASM-NEXT: .byte 0x28 464 ; IASM-NEXT: .byte 0xa4 465 ; IASM-NEXT: .byte 0x0 466 ; IASM-NEXT: .byte 0x0 467 ; IASM-NEXT: .byte 0x22 468 ; IASM-NEXT: .byte 0x2 469 ; IASM-NEXT: .byte 0x0 470 ; IASM-NEXT: .byte 0x24 471 ; IASM-NEXT: .byte 0x20 472 ; IASM-NEXT: .byte 0x87 473 ; IASM-NEXT: .byte 0x0 474 ; IASM-NEXT: .byte 0x0 475 ; IASM-NEXT: .byte 0x16 476 ; IASM-NEXT: .byte 0x2 477 ; IASM-NEXT: .byte 0x0 478 ; IASM-NEXT: .byte 0x25 479 ; IASM-NEXT: .byte 0x10 480 ; IASM-NEXT: .byte 0x44 481 ; IASM-NEXT: .byte 0x0 482 ; IASM-NEXT: .byte 0x25 483 ; IASM-NEXT: .byte 0x10 484 ; IASM-NEXT: .byte 0x45 485 ; IASM-NEXT: .byte 0x0 486 ; IASM-NEXT: .byte 0x21 487 ; IASM-NEXT: .byte 0x20 488 ; IASM-NEXT: .byte 0x40 489 ; IASM-NEXT: .byte 0x0 490 ; IASM-NEXT: .byte 0x21 491 ; IASM-NEXT: .byte 0x10 492 ; IASM-NEXT: .byte 0x60 493 ; IASM-NEXT: .byte 0x0 494 ; IASM-NEXT: .byte 0x21 495 ; IASM-NEXT: .byte 0x18 496 ; IASM-NEXT: .byte 0x80 497 ; IASM-NEXT: .byte 0x0 498 ; IASM-NEXT: .byte 0x8 499 ; IASM-NEXT: .byte 0x0 500 ; IASM-NEXT: .byte 0xe0 501 ; IASM-NEXT: .byte 0x3 502 503 define internal i32 @encCtlz32(i32 %x) { 504 entry: 505 %r = call i32 @llvm.ctlz.i32(i32 %x, i1 false) 506 ret i32 %r 507 } 508 509 ; ASM-LABEL: encCtlz32 510 ; ASM-NEXT: .LencCtlz32$entry: 511 ; ASM-NEXT: clz $a0, $a0 512 ; ASM-NEXT: move $v0, $a0 513 ; ASM-NEXT: jr $ra 514 515 ; DIS-LABEL: <encCtlz32>: 516 ; DIS-NEXT: 70842020 clz a0,a0 517 ; DIS-NEXT: 00801021 move v0,a0 518 ; DIS-NEXT: 03e00008 jr ra 519 520 ; IASM-LABEL: encCtlz32 521 ; IASM-NEXT: .LencCtlz32$entry: 522 ; IASM-NEXT: .byte 0x20 523 ; IASM-NEXT: .byte 0x20 524 ; IASM-NEXT: .byte 0x84 525 ; IASM-NEXT: .byte 0x70 526 ; IASM-NEXT: .byte 0x21 527 ; IASM-NEXT: .byte 0x10 528 ; IASM-NEXT: .byte 0x80 529 ; IASM-NEXT: .byte 0x0 530 ; IASM-NEXT: .byte 0x8 531 ; IASM-NEXT: .byte 0x0 532 ; IASM-NEXT: .byte 0xe0 533 ; IASM-NEXT: .byte 0x3 534 535 define internal i32 @encCtlz32Const() { 536 entry: 537 %r = call i32 @llvm.ctlz.i32(i32 123456, i1 false) 538 ret i32 %r 539 } 540 541 ; ASM-LABEL: encCtlz32Const 542 ; ASM-NEXT: .LencCtlz32Const$entry: 543 ; ASM-NEXT: lui $v0, 1 544 ; ASM-NEXT: ori $v0, $v0, 57920 545 ; ASM-NEXT: clz $v0, $v0 546 ; ASM-NEXT: jr $ra 547 548 ; DIS-LABEL: <encCtlz32Const>: 549 ; DIS-NEXT: 3c020001 lui v0,0x1 550 ; DIS-NEXT: 3442e240 ori v0,v0,0xe240 551 ; DIS-NEXT: 70421020 clz v0,v0 552 ; DIS-NEXT: 03e00008 jr ra 553 554 ; IASM-LABEL: encCtlz32Const 555 ; IASM-NEXT: .LencCtlz32Const$entry: 556 ; IASM-NEXT: .byte 0x1 557 ; IASM-NEXT: .byte 0x0 558 ; IASM-NEXT: .byte 0x2 559 ; IASM-NEXT: .byte 0x3c 560 ; IASM-NEXT: .byte 0x40 561 ; IASM-NEXT: .byte 0xe2 562 ; IASM-NEXT: .byte 0x42 563 ; IASM-NEXT: .byte 0x34 564 ; IASM-NEXT: .byte 0x20 565 ; IASM-NEXT: .byte 0x10 566 ; IASM-NEXT: .byte 0x42 567 ; IASM-NEXT: .byte 0x70 568 ; IASM-NEXT: .byte 0x8 569 ; IASM-NEXT: .byte 0x0 570 ; IASM-NEXT: .byte 0xe0 571 ; IASM-NEXT: .byte 0x3 572 573 define internal i64 @encCtlz64(i64 %x) { 574 entry: 575 %r = call i64 @llvm.ctlz.i64(i64 %x, i1 false) 576 ret i64 %r 577 } 578 579 ; ASM-LABEL: encCtlz64 580 ; ASM-NEXT: .LencCtlz64$entry: 581 ; ASM-NEXT: clz $v0, $a1 582 ; ASM-NEXT: clz $a0, $a0 583 ; ASM-NEXT: addiu $a0, $a0, 32 584 ; ASM-NEXT: movn $a0, $v0, $a1 585 ; ASM: addiu $v0, $zero, 0 586 ; ASM-NEXT: move $v1, $v0 587 ; ASM-NEXT: move $v0, $a0 588 ; ASM-NEXT: jr $ra 589 590 ; DIS-LABEL: <encCtlz64>: 591 ; DIS-NEXT: 70a21020 clz v0,a1 592 ; DIS-NEXT: 70842020 clz a0,a0 593 ; DIS-NEXT: 24840020 addiu a0,a0,32 594 ; DIS-NEXT: 0045200b movn a0,v0,a1 595 ; DIS-NEXT: 24020000 li v0,0 596 ; DIS-NEXT: 00401821 move v1,v0 597 ; DIS-NEXT: 00801021 move v0,a0 598 ; DIS-NEXT: 03e00008 jr ra 599 600 ; IASM-LABEL: encCtlz64 601 ; IASM-NEXT: .LencCtlz64$entry: 602 ; IASM-NEXT: .byte 0x20 603 ; IASM-NEXT: .byte 0x10 604 ; IASM-NEXT: .byte 0xa2 605 ; IASM-NEXT: .byte 0x70 606 ; IASM-NEXT: .byte 0x20 607 ; IASM-NEXT: .byte 0x20 608 ; IASM-NEXT: .byte 0x84 609 ; IASM-NEXT: .byte 0x70 610 ; IASM-NEXT: .byte 0x20 611 ; IASM-NEXT: .byte 0x0 612 ; IASM-NEXT: .byte 0x84 613 ; IASM-NEXT: .byte 0x24 614 ; IASM-NEXT: .byte 0xb 615 ; IASM-NEXT: .byte 0x20 616 ; IASM-NEXT: .byte 0x45 617 ; IASM-NEXT: .byte 0x0 618 ; IASM-NEXT: .byte 0x0 619 ; IASM-NEXT: .byte 0x0 620 ; IASM-NEXT: .byte 0x2 621 ; IASM-NEXT: .byte 0x24 622 ; IASM-NEXT: .byte 0x21 623 ; IASM-NEXT: .byte 0x18 624 ; IASM-NEXT: .byte 0x40 625 ; IASM-NEXT: .byte 0x0 626 ; IASM-NEXT: .byte 0x21 627 ; IASM-NEXT: .byte 0x10 628 ; IASM-NEXT: .byte 0x80 629 ; IASM-NEXT: .byte 0x0 630 ; IASM-NEXT: .byte 0x8 631 ; IASM-NEXT: .byte 0x0 632 ; IASM-NEXT: .byte 0xe0 633 ; IASM-NEXT: .byte 0x3 634 635 define internal i32 @encCtlz64Const(i64 %x) { 636 entry: 637 %r = call i64 @llvm.ctlz.i64(i64 123456789012, i1 false) 638 %r2 = trunc i64 %r to i32 639 ret i32 %r2 640 } 641 642 ; ASM-LABEL: encCtlz64Const 643 ; ASM-NEXT: .LencCtlz64Const$entry: 644 ; ASM-NEXT: # $zero = def.pseudo 645 ; ASM-NEXT: addiu $v0, $zero, 28 646 ; ASM-NEXT: lui $v1, 48793 647 ; ASM-NEXT: ori $v1, $v1, 6676 648 ; ASM-NEXT: clz $a0, $v0 649 ; ASM-NEXT: clz $v1, $v1 650 ; ASM-NEXT: addiu $v1, $v1, 32 651 ; ASM-NEXT: movn $v1, $a0, $v0 652 ; ASM-NEXT: move $v0, $v1 653 ; ASM-NEXT: jr $ra 654 655 ; DIS-LABEL: <encCtlz64Const>: 656 ; DIS-NEXT: 2402001c li v0,28 657 ; DIS-NEXT: 3c03be99 lui v1,0xbe99 658 ; DIS-NEXT: 34631a14 ori v1,v1,0x1a14 659 ; DIS-NEXT: 70442020 clz a0,v0 660 ; DIS-NEXT: 70631820 clz v1,v1 661 ; DIS-NEXT: 24630020 addiu v1,v1,32 662 ; DIS-NEXT: 0082180b movn v1,a0,v0 663 ; DIS-NEXT: 00601021 move v0,v1 664 ; DIS-NEXT: 03e00008 jr ra 665 666 ; IASM-LABEL: encCtlz64Const 667 ; IASM-NEXT: .LencCtlz64Const$entry: 668 ; IASM-NEXT: .byte 0x1c 669 ; IASM-NEXT: .byte 0x0 670 ; IASM-NEXT: .byte 0x2 671 ; IASM-NEXT: .byte 0x24 672 ; IASM-NEXT: .byte 0x99 673 ; IASM-NEXT: .byte 0xbe 674 ; IASM-NEXT: .byte 0x3 675 ; IASM-NEXT: .byte 0x3c 676 ; IASM-NEXT: .byte 0x14 677 ; IASM-NEXT: .byte 0x1a 678 ; IASM-NEXT: .byte 0x63 679 ; IASM-NEXT: .byte 0x34 680 ; IASM-NEXT: .byte 0x20 681 ; IASM-NEXT: .byte 0x20 682 ; IASM-NEXT: .byte 0x44 683 ; IASM-NEXT: .byte 0x70 684 ; IASM-NEXT: .byte 0x20 685 ; IASM-NEXT: .byte 0x18 686 ; IASM-NEXT: .byte 0x63 687 ; IASM-NEXT: .byte 0x70 688 ; IASM-NEXT: .byte 0x20 689 ; IASM-NEXT: .byte 0x0 690 ; IASM-NEXT: .byte 0x63 691 ; IASM-NEXT: .byte 0x24 692 ; IASM-NEXT: .byte 0xb 693 ; IASM-NEXT: .byte 0x18 694 ; IASM-NEXT: .byte 0x82 695 ; IASM-NEXT: .byte 0x0 696 ; IASM-NEXT: .byte 0x21 697 ; IASM-NEXT: .byte 0x10 698 ; IASM-NEXT: .byte 0x60 699 ; IASM-NEXT: .byte 0x0 700 ; IASM-NEXT: .byte 0x8 701 ; IASM-NEXT: .byte 0x0 702 ; IASM-NEXT: .byte 0xe0 703 ; IASM-NEXT: .byte 0x3 704 705 define internal i32 @encCttz32(i32 %x) { 706 entry: 707 %r = call i32 @llvm.cttz.i32(i32 %x, i1 false) 708 ret i32 %r 709 } 710 711 ; ASM-LABEL: encCttz32 712 ; ASM-NEXT: .LencCttz32$entry: 713 ; ASM-NEXT: addiu $v0, $a0, -1 714 ; ASM: nor $a0, $a0, $zero 715 ; ASM-NEXT: and $a0, $a0, $v0 716 ; ASM-NEXT: clz $a0, $a0 717 ; ASM: addiu $v0, $zero, 32 718 ; ASM-NEXT: subu $v0, $v0, $a0 719 ; ASM-NEXT: jr $ra 720 721 ; DIS-LABEL: <encCttz32>: 722 ; DIS-NEXT: 2482ffff addiu v0,a0,-1 723 ; DIS-NEXT: 00802027 nor a0,a0,zero 724 ; DIS-NEXT: 00822024 and a0,a0,v0 725 ; DIS-NEXT: 70842020 clz a0,a0 726 ; DIS-NEXT: 24020020 li v0,32 727 ; DIS-NEXT: 00441023 subu v0,v0,a0 728 ; DIS-NEXT: 03e00008 jr ra 729 730 ; IASM-LABEL: encCttz32 731 ; IASM-NEXT: .LencCttz32$entry: 732 ; IASM-NEXT: .byte 0xff 733 ; IASM-NEXT: .byte 0xff 734 ; IASM-NEXT: .byte 0x82 735 ; IASM-NEXT: .byte 0x24 736 ; IASM-NEXT: .byte 0x27 737 ; IASM-NEXT: .byte 0x20 738 ; IASM-NEXT: .byte 0x80 739 ; IASM-NEXT: .byte 0x0 740 ; IASM-NEXT: .byte 0x24 741 ; IASM-NEXT: .byte 0x20 742 ; IASM-NEXT: .byte 0x82 743 ; IASM-NEXT: .byte 0x0 744 ; IASM-NEXT: .byte 0x20 745 ; IASM-NEXT: .byte 0x20 746 ; IASM-NEXT: .byte 0x84 747 ; IASM-NEXT: .byte 0x70 748 ; IASM-NEXT: .byte 0x20 749 ; IASM-NEXT: .byte 0x0 750 ; IASM-NEXT: .byte 0x2 751 ; IASM-NEXT: .byte 0x24 752 ; IASM-NEXT: .byte 0x23 753 ; IASM-NEXT: .byte 0x10 754 ; IASM-NEXT: .byte 0x44 755 ; IASM-NEXT: .byte 0x0 756 ; IASM-NEXT: .byte 0x8 757 ; IASM-NEXT: .byte 0x0 758 ; IASM-NEXT: .byte 0xe0 759 ; IASM-NEXT: .byte 0x3 760 761 define internal i32 @encCttz32Const() { 762 entry: 763 %r = call i32 @llvm.cttz.i32(i32 123456, i1 false) 764 ret i32 %r 765 } 766 767 ; ASM-LABEL: encCttz32Const 768 ; ASM-NEXT: .LencCttz32Const$entry: 769 ; ASM-NEXT: lui $v0, 1 770 ; ASM-NEXT: ori $v0, $v0, 57920 771 ; ASM-NEXT: addiu $v1, $v0, -1 772 ; ASM: nor $v0, $v0, $zero 773 ; ASM-NEXT: and $v0, $v0, $v1 774 ; ASM-NEXT: clz $v0, $v0 775 ; ASM: addiu $v1, $zero, 32 776 ; ASM-NEXT: subu $v1, $v1, $v0 777 ; ASM-NEXT: move $v0, $v1 778 ; ASM-NEXT: jr $ra 779 780 ; DIS-LABEL: <encCttz32Const>: 781 ; DIS-NEXT: 3c020001 lui v0,0x1 782 ; DIS-NEXT: 3442e240 ori v0,v0,0xe240 783 ; DIS-NEXT: 2443ffff addiu v1,v0,-1 784 ; DIS-NEXT: 00401027 nor v0,v0,zero 785 ; DIS-NEXT: 00431024 and v0,v0,v1 786 ; DIS-NEXT: 70421020 clz v0,v0 787 ; DIS-NEXT: 24030020 li v1,32 788 ; DIS-NEXT: 00621823 subu v1,v1,v0 789 ; DIS-NEXT: 00601021 move v0,v1 790 ; DIS-NEXT: 03e00008 jr ra 791 792 ; IASM-LABEL: encCttz32Const: 793 ; IASM-NEXT: .LencCttz32Const$entry: 794 ; IASM-NEXT: .byte 0x1 795 ; IASM-NEXT: .byte 0x0 796 ; IASM-NEXT: .byte 0x2 797 ; IASM-NEXT: .byte 0x3c 798 ; IASM-NEXT: .byte 0x40 799 ; IASM-NEXT: .byte 0xe2 800 ; IASM-NEXT: .byte 0x42 801 ; IASM-NEXT: .byte 0x34 802 ; IASM-NEXT: .byte 0xff 803 ; IASM-NEXT: .byte 0xff 804 ; IASM-NEXT: .byte 0x43 805 ; IASM-NEXT: .byte 0x24 806 ; IASM-NEXT: .byte 0x27 807 ; IASM-NEXT: .byte 0x10 808 ; IASM-NEXT: .byte 0x40 809 ; IASM-NEXT: .byte 0x0 810 ; IASM-NEXT: .byte 0x24 811 ; IASM-NEXT: .byte 0x10 812 ; IASM-NEXT: .byte 0x43 813 ; IASM-NEXT: .byte 0x0 814 ; IASM-NEXT: .byte 0x20 815 ; IASM-NEXT: .byte 0x10 816 ; IASM-NEXT: .byte 0x42 817 ; IASM-NEXT: .byte 0x70 818 ; IASM-NEXT: .byte 0x20 819 ; IASM-NEXT: .byte 0x0 820 ; IASM-NEXT: .byte 0x3 821 ; IASM-NEXT: .byte 0x24 822 ; IASM-NEXT: .byte 0x23 823 ; IASM-NEXT: .byte 0x18 824 ; IASM-NEXT: .byte 0x62 825 ; IASM-NEXT: .byte 0x0 826 ; IASM-NEXT: .byte 0x21 827 ; IASM-NEXT: .byte 0x10 828 ; IASM-NEXT: .byte 0x60 829 ; IASM-NEXT: .byte 0x0 830 ; IASM-NEXT: .byte 0x8 831 ; IASM-NEXT: .byte 0x0 832 ; IASM-NEXT: .byte 0xe0 833 ; IASM-NEXT: .byte 0x3 834 835 define internal i64 @encCttz64(i64 %x) { 836 entry: 837 %r = call i64 @llvm.cttz.i64(i64 %x, i1 false) 838 ret i64 %r 839 } 840 841 ; ASM-LABEL: encCttz64 842 ; ASM-NEXT: .LencCttz64$entry: 843 ; ASM-NEXT: addiu $v0, $a1, -1 844 ; ASM: nor $a1, $a1, $zero 845 ; ASM-NEXT: and $a1, $a1, $v0 846 ; ASM-NEXT: clz $a1, $a1 847 ; ASM: addiu $v0, $zero, 64 848 ; ASM-NEXT: subu $v0, $v0, $a1 849 ; ASM-NEXT: addiu $v1, $a0, -1 850 ; ASM: nor $a1, $a0, $zero 851 ; ASM-NEXT: and $a1, $a1, $v1 852 ; ASM-NEXT: clz $a1, $a1 853 ; ASM: addiu $v1, $zero, 32 854 ; ASM-NEXT: subu $v1, $v1, $a1 855 ; ASM-NEXT: movn $v0, $v1, $a0 856 ; ASM: addiu $v1, $zero, 0 857 ; ASM-NEXT: jr $ra 858 859 ; DIS-LABEL: <encCttz64>: 860 ; DIS-NEXT: 24a2ffff addiu v0,a1,-1 861 ; DIS-NEXT: 00a02827 nor a1,a1,zero 862 ; DIS-NEXT: 00a22824 and a1,a1,v0 863 ; DIS-NEXT: 70a52820 clz a1,a1 864 ; DIS-NEXT: 24020040 li v0,64 865 ; DIS-NEXT: 00451023 subu v0,v0,a1 866 ; DIS-NEXT: 2483ffff addiu v1,a0,-1 867 ; DIS-NEXT: 00802827 nor a1,a0,zero 868 ; DIS-NEXT: 00a32824 and a1,a1,v1 869 ; DIS-NEXT: 70a52820 clz a1,a1 870 ; DIS-NEXT: 24030020 li v1,32 871 ; DIS-NEXT: 00651823 subu v1,v1,a1 872 ; DIS-NEXT: 0064100b movn v0,v1,a0 873 ; DIS-NEXT: 24030000 li v1,0 874 ; DIS-NEXT: 03e00008 jr ra 875 ; DIS-NEXT: 00000000 nop 876 877 ; IASM-LABEL: encCttz64: 878 ; IASM-NEXT: .LencCttz64$entry: 879 ; IASM-NEXT: .byte 0xff 880 ; IASM-NEXT: .byte 0xff 881 ; IASM-NEXT: .byte 0xa2 882 ; IASM-NEXT: .byte 0x24 883 ; IASM-NEXT: .byte 0x27 884 ; IASM-NEXT: .byte 0x28 885 ; IASM-NEXT: .byte 0xa0 886 ; IASM-NEXT: .byte 0x0 887 ; IASM-NEXT: .byte 0x24 888 ; IASM-NEXT: .byte 0x28 889 ; IASM-NEXT: .byte 0xa2 890 ; IASM-NEXT: .byte 0x0 891 ; IASM-NEXT: .byte 0x20 892 ; IASM-NEXT: .byte 0x28 893 ; IASM-NEXT: .byte 0xa5 894 ; IASM-NEXT: .byte 0x70 895 ; IASM-NEXT: .byte 0x40 896 ; IASM-NEXT: .byte 0x0 897 ; IASM-NEXT: .byte 0x2 898 ; IASM-NEXT: .byte 0x24 899 ; IASM-NEXT: .byte 0x23 900 ; IASM-NEXT: .byte 0x10 901 ; IASM-NEXT: .byte 0x45 902 ; IASM-NEXT: .byte 0x0 903 ; IASM-NEXT: .byte 0xff 904 ; IASM-NEXT: .byte 0xff 905 ; IASM-NEXT: .byte 0x83 906 ; IASM-NEXT: .byte 0x24 907 ; IASM-NEXT: .byte 0x27 908 ; IASM-NEXT: .byte 0x28 909 ; IASM-NEXT: .byte 0x80 910 ; IASM-NEXT: .byte 0x0 911 ; IASM-NEXT: .byte 0x24 912 ; IASM-NEXT: .byte 0x28 913 ; IASM-NEXT: .byte 0xa3 914 ; IASM-NEXT: .byte 0x0 915 ; IASM-NEXT: .byte 0x20 916 ; IASM-NEXT: .byte 0x28 917 ; IASM-NEXT: .byte 0xa5 918 ; IASM-NEXT: .byte 0x70 919 ; IASM-NEXT: .byte 0x20 920 ; IASM-NEXT: .byte 0x0 921 ; IASM-NEXT: .byte 0x3 922 ; IASM-NEXT: .byte 0x24 923 ; IASM-NEXT: .byte 0x23 924 ; IASM-NEXT: .byte 0x18 925 ; IASM-NEXT: .byte 0x65 926 ; IASM-NEXT: .byte 0x0 927 ; IASM-NEXT: .byte 0xb 928 ; IASM-NEXT: .byte 0x10 929 ; IASM-NEXT: .byte 0x64 930 ; IASM-NEXT: .byte 0x0 931 ; IASM-NEXT: .byte 0x0 932 ; IASM-NEXT: .byte 0x0 933 ; IASM-NEXT: .byte 0x3 934 ; IASM-NEXT: .byte 0x24 935 ; IASM-NEXT: .byte 0x8 936 ; IASM-NEXT: .byte 0x0 937 ; IASM-NEXT: .byte 0xe0 938 ; IASM-NEXT: .byte 0x3 939 940 define internal i64 @encCttz64Const(i64 %x) { 941 entry: 942 %r = call i64 @llvm.cttz.i64(i64 123456789012, i1 false) 943 ret i64 %r 944 } 945 946 ; ASM-LABEL: encCttz64Const 947 ; ASM-NEXT: .LencCttz64Const$entry: 948 ; ASM-NEXT: # $zero = def.pseudo 949 ; ASM-NEXT: addiu $v0, $zero, 28 950 ; ASM-NEXT: lui $v1, 48793 951 ; ASM-NEXT: ori $v1, $v1, 6676 952 ; ASM-NEXT: addiu $a0, $v0, -1 953 ; ASM: nor $v0, $v0, $zero 954 ; ASM-NEXT: and $v0, $v0, $a0 955 ; ASM-NEXT: clz $v0, $v0 956 ; ASM: addiu $a0, $zero, 64 957 ; ASM-NEXT: subu $a0, $a0, $v0 958 ; ASM-NEXT: addiu $v0, $v1, -1 959 ; ASM: nor $a1, $v1, $zero 960 ; ASM-NEXT: and $a1, $a1, $v0 961 ; ASM-NEXT: clz $a1, $a1 962 ; ASM: addiu $v0, $zero, 32 963 ; ASM-NEXT: subu $v0, $v0, $a1 964 ; ASM-NEXT: movn $a0, $v0, $v1 965 ; ASM: addiu $v0, $zero, 0 966 ; ASM-NEXT: move $v1, $v0 967 ; ASM-NEXT: move $v0, $a0 968 ; ASM-NEXT: jr $ra 969 970 ; DIS-LABEL: <encCttz64Const>: 971 ; DIS-NEXT: 2402001c li v0,28 972 ; DIS-NEXT: 3c03be99 lui v1,0xbe99 973 ; DIS-NEXT: 34631a14 ori v1,v1,0x1a14 974 ; DIS-NEXT: 2444ffff addiu a0,v0,-1 975 ; DIS-NEXT: 00401027 nor v0,v0,zero 976 ; DIS-NEXT: 00441024 and v0,v0,a0 977 ; DIS-NEXT: 70421020 clz v0,v0 978 ; DIS-NEXT: 24040040 li a0,64 979 ; DIS-NEXT: 00822023 subu a0,a0,v0 980 ; DIS-NEXT: 2462ffff addiu v0,v1,-1 981 ; DIS-NEXT: 00602827 nor a1,v1,zero 982 ; DIS-NEXT: 00a22824 and a1,a1,v0 983 ; DIS-NEXT: 70a52820 clz a1,a1 984 ; DIS-NEXT: 24020020 li v0,32 985 ; DIS-NEXT: 00451023 subu v0,v0,a1 986 ; DIS-NEXT: 0043200b movn a0,v0,v1 987 ; DIS-NEXT: 24020000 li v0,0 988 ; DIS-NEXT: 00401821 move v1,v0 989 ; DIS-NEXT: 00801021 move v0,a0 990 ; DIS-NEXT: 03e00008 jr ra 991 992 ; IASM-LABEL: encCttz64Const: 993 ; IASM-NEXT: .LencCttz64Const$entry: 994 ; IASM-NEXT: .byte 0x1c 995 ; IASM-NEXT: .byte 0x0 996 ; IASM-NEXT: .byte 0x2 997 ; IASM-NEXT: .byte 0x24 998 ; IASM-NEXT: .byte 0x99 999 ; IASM-NEXT: .byte 0xbe 1000 ; IASM-NEXT: .byte 0x3 1001 ; IASM-NEXT: .byte 0x3c 1002 ; IASM-NEXT: .byte 0x14 1003 ; IASM-NEXT: .byte 0x1a 1004 ; IASM-NEXT: .byte 0x63 1005 ; IASM-NEXT: .byte 0x34 1006 ; IASM-NEXT: .byte 0xff 1007 ; IASM-NEXT: .byte 0xff 1008 ; IASM-NEXT: .byte 0x44 1009 ; IASM-NEXT: .byte 0x24 1010 ; IASM-NEXT: .byte 0x27 1011 ; IASM-NEXT: .byte 0x10 1012 ; IASM-NEXT: .byte 0x40 1013 ; IASM-NEXT: .byte 0x0 1014 ; IASM-NEXT: .byte 0x24 1015 ; IASM-NEXT: .byte 0x10 1016 ; IASM-NEXT: .byte 0x44 1017 ; IASM-NEXT: .byte 0x0 1018 ; IASM-NEXT: .byte 0x20 1019 ; IASM-NEXT: .byte 0x10 1020 ; IASM-NEXT: .byte 0x42 1021 ; IASM-NEXT: .byte 0x70 1022 ; IASM-NEXT: .byte 0x40 1023 ; IASM-NEXT: .byte 0x0 1024 ; IASM-NEXT: .byte 0x4 1025 ; IASM-NEXT: .byte 0x24 1026 ; IASM-NEXT: .byte 0x23 1027 ; IASM-NEXT: .byte 0x20 1028 ; IASM-NEXT: .byte 0x82 1029 ; IASM-NEXT: .byte 0x0 1030 ; IASM-NEXT: .byte 0xff 1031 ; IASM-NEXT: .byte 0xff 1032 ; IASM-NEXT: .byte 0x62 1033 ; IASM-NEXT: .byte 0x24 1034 ; IASM-NEXT: .byte 0x27 1035 ; IASM-NEXT: .byte 0x28 1036 ; IASM-NEXT: .byte 0x60 1037 ; IASM-NEXT: .byte 0x0 1038 ; IASM-NEXT: .byte 0x24 1039 ; IASM-NEXT: .byte 0x28 1040 ; IASM-NEXT: .byte 0xa2 1041 ; IASM-NEXT: .byte 0x0 1042 ; IASM-NEXT: .byte 0x20 1043 ; IASM-NEXT: .byte 0x28 1044 ; IASM-NEXT: .byte 0xa5 1045 ; IASM-NEXT: .byte 0x70 1046 ; IASM-NEXT: .byte 0x20 1047 ; IASM-NEXT: .byte 0x0 1048 ; IASM-NEXT: .byte 0x2 1049 ; IASM-NEXT: .byte 0x24 1050 ; IASM-NEXT: .byte 0x23 1051 ; IASM-NEXT: .byte 0x10 1052 ; IASM-NEXT: .byte 0x45 1053 ; IASM-NEXT: .byte 0x0 1054 ; IASM-NEXT: .byte 0xb 1055 ; IASM-NEXT: .byte 0x20 1056 ; IASM-NEXT: .byte 0x43 1057 ; IASM-NEXT: .byte 0x0 1058 ; IASM-NEXT: .byte 0x0 1059 ; IASM-NEXT: .byte 0x0 1060 ; IASM-NEXT: .byte 0x2 1061 ; IASM-NEXT: .byte 0x24 1062 ; IASM-NEXT: .byte 0x21 1063 ; IASM-NEXT: .byte 0x18 1064 ; IASM-NEXT: .byte 0x40 1065 ; IASM-NEXT: .byte 0x0 1066 ; IASM-NEXT: .byte 0x21 1067 ; IASM-NEXT: .byte 0x10 1068 ; IASM-NEXT: .byte 0x80 1069 ; IASM-NEXT: .byte 0x0 1070 ; IASM-NEXT: .byte 0x8 1071 ; IASM-NEXT: .byte 0x0 1072 ; IASM-NEXT: .byte 0xe0 1073 ; IASM-NEXT: .byte 0x3 1074 1075 define internal void @encTrap() { 1076 unreachable 1077 } 1078 1079 ; ASM-LABEL: encTrap 1080 ; ASM-NEXT: .LencTrap$__0: 1081 ; ASM: teq $zero, $zero, 0 1082 1083 ; DIS-LABEL: <encTrap>: 1084 ; DIS-NEXT: 00000034 teq zero,zero 1085 1086 ; IASM-LABEL: encTrap: 1087 ; IASM-NEXT: .LencTrap$__0: 1088 ; IASM-NEXT: .byte 0x34 1089 ; IASM-NEXT: .byte 0x0 1090 ; IASM-NEXT: .byte 0x0 1091 ; IASM-NEXT: .byte 0x0 1092