Home | History | Annotate | Download | only in llvm2ice_tests
      1 ; Simple test of signed and unsigned integer conversions.
      2 
      3 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
      4 ; RUN:   --target x8632 -i %s --args -O2 \
      5 ; RUN:   | %if --need=target_X8632 --command FileCheck %s
      6 
      7 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
      8 ; RUN:   --target x8632 -i %s --args -Om1 \
      9 ; RUN:   | %if --need=target_X8632 --command FileCheck %s
     10 
     11 ; RUN: %if --need=target_ARM32 \
     12 ; RUN:   --command %p2i --filetype=obj \
     13 ; RUN:   --disassemble --target arm32 -i %s --args -O2 \
     14 ; RUN:   | %if --need=target_ARM32 \
     15 ; RUN:   --command FileCheck --check-prefix ARM32 %s
     16 
     17 ; RUN: %if --need=target_ARM32 \
     18 ; RUN:   --command %p2i --filetype=obj \
     19 ; RUN:   --disassemble --target arm32 -i %s --args -Om1 \
     20 ; RUN:   | %if --need=target_ARM32 \
     21 ; RUN:   --command FileCheck --check-prefix ARM32 %s
     22 
     23 ; RUN: %if --need=target_MIPS32 --need=allow_dump \
     24 ; RUN:   --command %p2i --filetype=asm --assemble --disassemble --target \
     25 ; RUN:   mips32 -i %s --args -O2 -allow-externally-defined-symbols \
     26 ; RUN:   | %if --need=target_MIPS32 --need=allow_dump \
     27 ; RUN:   --command FileCheck --check-prefix MIPS32 %s
     28 
     29 @i8v = internal global [1 x i8] zeroinitializer, align 1
     30 @i16v = internal global [2 x i8] zeroinitializer, align 2
     31 @i32v = internal global [4 x i8] zeroinitializer, align 4
     32 @i64v = internal global [8 x i8] zeroinitializer, align 8
     33 @u8v = internal global [1 x i8] zeroinitializer, align 1
     34 @u16v = internal global [2 x i8] zeroinitializer, align 2
     35 @u32v = internal global [4 x i8] zeroinitializer, align 4
     36 @u64v = internal global [8 x i8] zeroinitializer, align 8
     37 
     38 define internal void @from_int8() {
     39 entry:
     40   %__0 = bitcast [1 x i8]* @i8v to i8*
     41   %v0 = load i8, i8* %__0, align 1
     42   %v1 = sext i8 %v0 to i16
     43   %__3 = bitcast [2 x i8]* @i16v to i16*
     44   store i16 %v1, i16* %__3, align 1
     45   %v2 = sext i8 %v0 to i32
     46   %__5 = bitcast [4 x i8]* @i32v to i32*
     47   store i32 %v2, i32* %__5, align 1
     48   %v3 = sext i8 %v0 to i64
     49   %__7 = bitcast [8 x i8]* @i64v to i64*
     50   store i64 %v3, i64* %__7, align 1
     51   ret void
     52 }
     53 ; CHECK-LABEL: from_int8
     54 ; CHECK: mov {{.*}},{{(BYTE PTR)?}}
     55 ; CHECK: movsx {{.*}},{{[a-d]l|BYTE PTR}}
     56 ; CHECK: mov {{(WORD PTR)?}}
     57 ; CHECK: movsx
     58 ; CHECK: mov {{(DWORD PTR)?}}
     59 ; CHECK: movsx
     60 ; CHECK: sar {{.*}},0x1f
     61 ; CHECK-DAG: ds:0x{{.}},{{.*}}{{i64v|.bss}}
     62 ; CHECK-DAG: ds:0x{{.}},{{.*}}{{i64v|.bss}}
     63 
     64 ; ARM32-LABEL: from_int8
     65 ; ARM32: movw {{.*}}i8v
     66 ; ARM32: ldrb
     67 ; ARM32: sxtb
     68 ; ARM32: movw {{.*}}i16v
     69 ; ARM32: strh
     70 ; ARM32: sxtb
     71 ; ARM32: movw {{.*}}i32v
     72 ; ARM32: str r
     73 ; ARM32: sxtb
     74 ; ARM32: asr
     75 ; ARM32: movw {{.*}}i64v
     76 ; ARM32-DAG: str r{{.*}}, [r{{[0-9]+}}]
     77 ; ARM32-DAG: str r{{.*}}, [{{.*}}, #4]
     78 
     79 ; MIPS32-LABEL: from_int8
     80 ; MIPS32: 	lui	{{.*}}	i8v
     81 ; MIPS32: 	addiu	{{.*}}	i8v
     82 ; MIPS32: 	lb
     83 ; MIPS32: 	move
     84 ; MIPS32: 	sll	{{.*}},0x18
     85 ; MIPS32: 	sra	{{.*}},0x18
     86 ; MIPS32: 	lui	{{.*}}	i16v
     87 ; MIPS32: 	addiu	{{.*}}	i16v
     88 ; MIPS32: 	sh
     89 ; MIPS32: 	move
     90 ; MIPS32: 	sll	{{.*}},0x18
     91 ; MIPS32: 	sra	{{.*}},0x18
     92 ; MIPS32: 	lui	{{.*}}	i32v
     93 ; MIPS32: 	addiu	{{.*}}	i32v
     94 ; MIPS32: 	sw
     95 ; MIPS32: 	sll	{{.*}},0x18
     96 ; MIPS32: 	sra	{{.*}},0x18
     97 ; MIPS32: 	sra	{{.*}},0x1f
     98 ; MIPS32: 	lui	{{.*}}	i64v
     99 ; MIPS32: 	addiu	{{.*}}	i64v
    100 
    101 define internal void @from_int16() {
    102 entry:
    103   %__0 = bitcast [2 x i8]* @i16v to i16*
    104   %v0 = load i16, i16* %__0, align 1
    105   %v1 = trunc i16 %v0 to i8
    106   %__3 = bitcast [1 x i8]* @i8v to i8*
    107   store i8 %v1, i8* %__3, align 1
    108   %v2 = sext i16 %v0 to i32
    109   %__5 = bitcast [4 x i8]* @i32v to i32*
    110   store i32 %v2, i32* %__5, align 1
    111   %v3 = sext i16 %v0 to i64
    112   %__7 = bitcast [8 x i8]* @i64v to i64*
    113   store i64 %v3, i64* %__7, align 1
    114   ret void
    115 }
    116 ; CHECK-LABEL: from_int16
    117 ; CHECK: mov {{.*}},{{(WORD PTR)?}}
    118 ; CHECK: 0x{{.}} {{.*}}{{i16v|.bss}}
    119 ; CHECK: movsx e{{.*}},{{.*x|[ds]i|bp|WORD PTR}}
    120 ; CHECK: 0x{{.}},{{.*}}{{i32v|.bss}}
    121 ; CHECK: movsx e{{.*}},{{.*x|[ds]i|bp|WORD PTR}}
    122 ; CHECK: sar {{.*}},0x1f
    123 ; CHECK: 0x{{.}},{{.*}}{{i64v|.bss}}
    124 
    125 ; ARM32-LABEL: from_int16
    126 ; ARM32: movw {{.*}}i16v
    127 ; ARM32: ldrh
    128 ; ARM32: movw {{.*}}i8v
    129 ; ARM32: strb
    130 ; ARM32: sxth
    131 ; ARM32: movw {{.*}}i32v
    132 ; ARM32: str r
    133 ; ARM32: sxth
    134 ; ARM32: asr
    135 ; ARM32: movw {{.*}}i64v
    136 ; ARM32: str r
    137 
    138 ; MIPS32-LABEL: from_int16
    139 ; MIPS32: 	lui	{{.*}}	i16v
    140 ; MIPS32: 	addiu	{{.*}}	i16v
    141 ; MIPS32: 	lh
    142 ; MIPS32: 	move
    143 ; MIPS32: 	lui	{{.*}}	i8v
    144 ; MIPS32: 	addiu	{{.*}}	i8v
    145 ; MIPS32: 	sb
    146 ; MIPS32: 	move
    147 ; MIPS32: 	sll	{{.*}},0x10
    148 ; MIPS32: 	sra	{{.*}},0x10
    149 ; MIPS32: 	lui	{{.*}}	i32v
    150 ; MIPS32: 	addiu	{{.*}}	i32v
    151 ; MIPS32: 	sw
    152 ; MIPS32: 	sll	{{.*}},0x10
    153 ; MIPS32: 	sra	{{.*}},0x10
    154 ; MIPS32: 	sra	{{.*}},0x1f
    155 ; MIPS32: 	lui	{{.*}}	i64v
    156 ; MIPS32: 	addiu	{{.*}}	i64v
    157 
    158 define internal void @from_int32() {
    159 entry:
    160   %__0 = bitcast [4 x i8]* @i32v to i32*
    161   %v0 = load i32, i32* %__0, align 1
    162   %v1 = trunc i32 %v0 to i8
    163   %__3 = bitcast [1 x i8]* @i8v to i8*
    164   store i8 %v1, i8* %__3, align 1
    165   %v2 = trunc i32 %v0 to i16
    166   %__5 = bitcast [2 x i8]* @i16v to i16*
    167   store i16 %v2, i16* %__5, align 1
    168   %v3 = sext i32 %v0 to i64
    169   %__7 = bitcast [8 x i8]* @i64v to i64*
    170   store i64 %v3, i64* %__7, align 1
    171   ret void
    172 }
    173 ; CHECK-LABEL: from_int32
    174 ; CHECK: 0x{{.}} {{.*}} {{i32v|.bss}}
    175 ; CHECK: 0x{{.}},{{.*}} {{i8v|.bss}}
    176 ; CHECK: 0x{{.}},{{.*}} {{i16v|.bss}}
    177 ; CHECK: sar {{.*}},0x1f
    178 ; CHECK: 0x{{.}},{{.*}} {{i64v|.bss}}
    179 
    180 ; ARM32-LABEL: from_int32
    181 ; ARM32: movw {{.*}}i32v
    182 ; ARM32: ldr r
    183 ; ARM32: movw {{.*}}i8v
    184 ; ARM32: strb
    185 ; ARM32: movw {{.*}}i16v
    186 ; ARM32: strh
    187 ; ARM32: asr
    188 ; ARM32: movw {{.*}}i64v
    189 ; ARM32: str r
    190 
    191 ; MIPS32-LABEL: from_int32
    192 ; MIPS32: 	lui	{{.*}}	i32v
    193 ; MIPS32: 	addiu	{{.*}}	i32v
    194 ; MIPS32: 	lw
    195 ; MIPS32: 	move
    196 ; MIPS32: 	lui	{{.*}}	i8v
    197 ; MIPS32: 	addiu	{{.*}}	i8v
    198 ; MIPS32: 	sb
    199 ; MIPS32: 	move
    200 ; MIPS32: 	lui	{{.*}}	i16v
    201 ; MIPS32: 	addiu	{{.*}}	i16v
    202 ; MIPS32: 	sh
    203 ; MIPS32: 	sra	{{.*}},0x1f
    204 ; MIPS32: 	lui	{{.*}}	i64v
    205 ; MIPS32: 	addiu	{{.*}}	i64v
    206 
    207 define internal void @from_int64() {
    208 entry:
    209   %__0 = bitcast [8 x i8]* @i64v to i64*
    210   %v0 = load i64, i64* %__0, align 1
    211   %v1 = trunc i64 %v0 to i8
    212   %__3 = bitcast [1 x i8]* @i8v to i8*
    213   store i8 %v1, i8* %__3, align 1
    214   %v2 = trunc i64 %v0 to i16
    215   %__5 = bitcast [2 x i8]* @i16v to i16*
    216   store i16 %v2, i16* %__5, align 1
    217   %v3 = trunc i64 %v0 to i32
    218   %__7 = bitcast [4 x i8]* @i32v to i32*
    219   store i32 %v3, i32* %__7, align 1
    220   ret void
    221 }
    222 ; CHECK-LABEL: from_int64
    223 ; CHECK: 0x{{.}} {{.*}} {{i64v|.bss}}
    224 ; CHECK: 0x{{.}},{{.*}} {{i8v|.bss}}
    225 ; CHECK: 0x{{.}},{{.*}} {{i16v|.bss}}
    226 ; CHECK: 0x{{.}},{{.*}} {{i32v|.bss}}
    227 
    228 ; ARM32-LABEL: from_int64
    229 ; ARM32: movw {{.*}}i64v
    230 ; ARM32: ldr r
    231 ; ARM32: movw {{.*}}i8v
    232 ; ARM32: strb
    233 ; ARM32: movw {{.*}}i16v
    234 ; ARM32: strh
    235 ; ARM32: movw {{.*}}i32v
    236 ; ARM32: str r
    237 
    238 ; MIPS32-LABEL: from_int64
    239 ; MIPS32: 	lui	{{.*}}	i64v
    240 ; MIPS32: 	addiu	{{.*}}	i64v
    241 ; MIPS32: 	lw
    242 ; MIPS32: 	move
    243 ; MIPS32: 	lui	{{.*}}	i8v
    244 ; MIPS32: 	addiu	{{.*}}	i8v
    245 ; MIPS32: 	sb
    246 ; MIPS32: 	move
    247 ; MIPS32: 	lui	{{.*}}	i16v
    248 ; MIPS32: 	addiu	{{.*}}	i16v
    249 ; MIPS32: 	sh
    250 ; MIPS32: 	lui	{{.*}}	i32v
    251 ; MIPS32: 	addiu	{{.*}}	i32v
    252 
    253 define internal void @from_uint8() {
    254 entry:
    255   %__0 = bitcast [1 x i8]* @u8v to i8*
    256   %v0 = load i8, i8* %__0, align 1
    257   %v1 = zext i8 %v0 to i16
    258   %__3 = bitcast [2 x i8]* @i16v to i16*
    259   store i16 %v1, i16* %__3, align 1
    260   %v2 = zext i8 %v0 to i32
    261   %__5 = bitcast [4 x i8]* @i32v to i32*
    262   store i32 %v2, i32* %__5, align 1
    263   %v3 = zext i8 %v0 to i64
    264   %__7 = bitcast [8 x i8]* @i64v to i64*
    265   store i64 %v3, i64* %__7, align 1
    266   ret void
    267 }
    268 ; CHECK-LABEL: from_uint8
    269 ; CHECK: 0x{{.*}} {{.*}} {{u8v|.bss}}
    270 ; CHECK: movzx {{.*}},{{[a-d]l|BYTE PTR}}
    271 ; CHECK: 0x{{.}},{{.*}} {{i16v|.bss}}
    272 ; CHECK: movzx
    273 ; CHECK: 0x{{.}},{{.*}} {{i32v|.bss}}
    274 ; CHECK: movzx
    275 ; CHECK: mov {{.*}},0x0
    276 ; CHECK: 0x{{.}},{{.*}} {{i64v|.bss}}
    277 
    278 ; ARM32-LABEL: from_uint8
    279 ; ARM32: movw {{.*}}u8v
    280 ; ARM32: ldrb
    281 ; ARM32: uxtb
    282 ; ARM32: movw {{.*}}i16v
    283 ; ARM32: strh
    284 ; ARM32: uxtb
    285 ; ARM32: movw {{.*}}i32v
    286 ; ARM32: str r
    287 ; ARM32: uxtb
    288 ; ARM32: mov {{.*}}, #0
    289 ; ARM32: movw {{.*}}i64v
    290 ; ARM32: str r
    291 
    292 ; MIPS32-LABEL: from_uint8
    293 ; MIPS32: 	lui	{{.*}}	u8v
    294 ; MIPS32: 	addiu	{{.*}}	u8v
    295 ; MIPS32: 	lb
    296 ; MIPS32: 	move
    297 ; MIPS32: 	andi	{{.*}},0xff
    298 ; MIPS32: 	lui	{{.*}}	i16v
    299 ; MIPS32: 	addiu	{{.*}}	i16v
    300 ; MIPS32: 	sh
    301 ; MIPS32: 	move
    302 ; MIPS32: 	andi	{{.*}},0xff
    303 ; MIPS32: 	lui	{{.*}}	i32v
    304 ; MIPS32: 	addiu	{{.*}}	i32v
    305 ; MIPS32: 	sw
    306 ; MIPS32: 	andi	{{.*}},0xff
    307 ; MIPS32: 	li	{{.*}},0
    308 ; MIPS32: 	lui	{{.*}}	i64v
    309 ; MIPS32: 	addiu	{{.*}}	i64v
    310 
    311 define internal void @from_uint16() {
    312 entry:
    313   %__0 = bitcast [2 x i8]* @u16v to i16*
    314   %v0 = load i16, i16* %__0, align 1
    315   %v1 = trunc i16 %v0 to i8
    316   %__3 = bitcast [1 x i8]* @i8v to i8*
    317   store i8 %v1, i8* %__3, align 1
    318   %v2 = zext i16 %v0 to i32
    319   %__5 = bitcast [4 x i8]* @i32v to i32*
    320   store i32 %v2, i32* %__5, align 1
    321   %v3 = zext i16 %v0 to i64
    322   %__7 = bitcast [8 x i8]* @i64v to i64*
    323   store i64 %v3, i64* %__7, align 1
    324   ret void
    325 }
    326 ; CHECK-LABEL: from_uint16
    327 ; CHECK: 0x{{.*}} {{.*}} {{u16v|.bss}}
    328 ; CHECK: 0x{{.}},{{.*}} {{i8v|.bss}}
    329 ; CHECK: movzx e{{.*}},{{.*x|[ds]i|bp|WORD PTR}}
    330 ; CHECK: 0x{{.}},{{.*}} {{i32v|.bss}}
    331 ; CHECK: movzx e{{.*}},{{.*x|[ds]i|bp|WORD PTR}}
    332 ; CHECK: mov {{.*}},0x0
    333 ; CHECK: 0x{{.}},{{.*}} {{i64v|.bss}}
    334 
    335 ; ARM32-LABEL: from_uint16
    336 ; ARM32: movw {{.*}}u16v
    337 ; ARM32: ldrh
    338 ; ARM32: movw {{.*}}i8v
    339 ; ARM32: strb
    340 ; ARM32: uxth
    341 ; ARM32: movw {{.*}}i32v
    342 ; ARM32: str r
    343 ; ARM32: uxth
    344 ; ARM32: mov {{.*}}, #0
    345 ; ARM32: movw {{.*}}i64v
    346 ; ARM32: str r
    347 
    348 ; MIPS32-LABEL: from_uint16
    349 ; MIPS32: 	lui	{{.*}}	u16v
    350 ; MIPS32: 	addiu	{{.*}}	u16v
    351 ; MIPS32: 	lh
    352 ; MIPS32: 	move
    353 ; MIPS32: 	lui	{{.*}}	i8v
    354 ; MIPS32: 	addiu	{{.*}}	i8v
    355 ; MIPS32: 	sb
    356 ; MIPS32: 	move
    357 ; MIPS32: 	andi	{{.*}},0xffff
    358 ; MIPS32: 	lui	{{.*}}	i32v
    359 ; MIPS32: 	addiu	{{.*}}	i32v
    360 ; MIPS32: 	sw
    361 ; MIPS32: 	andi	{{.*}},0xffff
    362 ; MIPS32: 	li	{{.*}},0
    363 ; MIPS32: 	lui	{{.*}}	i64v
    364 ; MIPS32: 	addiu	{{.*}}	i64v
    365 
    366 define internal void @from_uint32() {
    367 entry:
    368   %__0 = bitcast [4 x i8]* @u32v to i32*
    369   %v0 = load i32, i32* %__0, align 1
    370   %v1 = trunc i32 %v0 to i8
    371   %__3 = bitcast [1 x i8]* @i8v to i8*
    372   store i8 %v1, i8* %__3, align 1
    373   %v2 = trunc i32 %v0 to i16
    374   %__5 = bitcast [2 x i8]* @i16v to i16*
    375   store i16 %v2, i16* %__5, align 1
    376   %v3 = zext i32 %v0 to i64
    377   %__7 = bitcast [8 x i8]* @i64v to i64*
    378   store i64 %v3, i64* %__7, align 1
    379   ret void
    380 }
    381 ; CHECK-LABEL: from_uint32
    382 ; CHECK: 0x{{.*}} {{.*}} {{u32v|.bss}}
    383 ; CHECK: 0x{{.}},{{.*}} {{i8v|.bss}}
    384 ; CHECK: 0x{{.}},{{.*}} {{i16v|.bss}}
    385 ; CHECK: mov {{.*}},0x0
    386 ; CHECK: 0x{{.}},{{.*}} {{i64v|.bss}}
    387 
    388 ; ARM32-LABEL: from_uint32
    389 ; ARM32: movw {{.*}}u32v
    390 ; ARM32: ldr r
    391 ; ARM32: movw {{.*}}i8v
    392 ; ARM32: strb
    393 ; ARM32: movw {{.*}}i16v
    394 ; ARM32: strh
    395 ; ARM32: mov {{.*}}, #0
    396 ; ARM32: movw {{.*}}i64v
    397 ; ARM32: str r
    398 
    399 ; MIPS32-LABEL: from_uint32
    400 ; MIPS32: 	lui	{{.*}}	u32v
    401 ; MIPS32: 	addiu	{{.*}}	u32v
    402 ; MIPS32: 	lw
    403 ; MIPS32: 	move
    404 ; MIPS32: 	lui	{{.*}}	i8v
    405 ; MIPS32: 	addiu	{{.*}}	i8v
    406 ; MIPS32: 	sb
    407 ; MIPS32: 	move
    408 ; MIPS32: 	lui	{{.*}}	i16v
    409 ; MIPS32: 	addiu	{{.*}}	i16v
    410 ; MIPS32: 	sh
    411 ; MIPS32: 	li	{{.*}},0
    412 ; MIPS32: 	lui	{{.*}}	i64v
    413 ; MIPS32: 	addiu	{{.*}}	i64v
    414 
    415 define internal void @from_uint64() {
    416 entry:
    417   %__0 = bitcast [8 x i8]* @u64v to i64*
    418   %v0 = load i64, i64* %__0, align 1
    419   %v1 = trunc i64 %v0 to i8
    420   %__3 = bitcast [1 x i8]* @i8v to i8*
    421   store i8 %v1, i8* %__3, align 1
    422   %v2 = trunc i64 %v0 to i16
    423   %__5 = bitcast [2 x i8]* @i16v to i16*
    424   store i16 %v2, i16* %__5, align 1
    425   %v3 = trunc i64 %v0 to i32
    426   %__7 = bitcast [4 x i8]* @i32v to i32*
    427   store i32 %v3, i32* %__7, align 1
    428   ret void
    429 }
    430 ; CHECK-LABEL: from_uint64
    431 ; CHECK: 0x{{.*}} {{.*}} {{u64v|.bss}}
    432 ; CHECK: 0x{{.}},{{.*}} {{i8v|.bss}}
    433 ; CHECK: 0x{{.}},{{.*}} {{i16v|.bss}}
    434 ; CHECK: 0x{{.}},{{.*}} {{i32v|.bss}}
    435 
    436 ; ARM32-LABEL: from_uint64
    437 ; ARM32: movw {{.*}}u64v
    438 ; ARM32: ldr r
    439 ; ARM32: movw {{.*}}i8v
    440 ; ARM32: strb
    441 ; ARM32: movw {{.*}}i16v
    442 ; ARM32: strh
    443 ; ARM32: movw {{.*}}i32v
    444 ; ARM32: str r
    445 
    446 ; MIPS32-LABEL: from_uint64
    447 ; MIPS32: 	lui	{{.*}}	u64v
    448 ; MIPS32: 	addiu	{{.*}}	u64v
    449 ; MIPS32: 	lw
    450 ; MIPS32: 	move
    451 ; MIPS32: 	lui	{{.*}}	i8v
    452 ; MIPS32: 	addiu	{{.*}}	i8v
    453 ; MIPS32: 	sb
    454 ; MIPS32: 	move
    455 ; MIPS32: 	lui	{{.*}}	i16v
    456 ; MIPS32: 	addiu	{{.*}}	i16v
    457 ; MIPS32: 	sh
    458 ; MIPS32: 	lui	{{.*}}	i32v
    459 ; MIPS32: 	addiu	{{.*}}	i32v
    460