Home | History | Annotate | Download | only in mips32
      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