blob: ecdb683338a626b3fd88647a72bff6451c27d2c1 [file] [log] [blame]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001; Simple test of signed and unsigned integer conversions.
2
Jan Voung66c3d5e2015-06-04 17:02:31 -07003; 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; TODO(jvoung): Stop skipping unimplemented parts (via --skip-unimplemented)
12; once enough infrastructure is in. Also, switch to --filetype=obj
13; when possible.
Jim Stichnothc8799682015-06-22 13:04:10 -070014; RUN: %if --need=target_ARM32 --need=allow_dump \
15; RUN: --command %p2i --filetype=asm --assemble \
Jan Voung66c3d5e2015-06-04 17:02:31 -070016; RUN: --disassemble --target arm32 -i %s --args -O2 --skip-unimplemented \
Jim Stichnothc8799682015-06-22 13:04:10 -070017; RUN: | %if --need=target_ARM32 --need=allow_dump \
18; RUN: --command FileCheck --check-prefix ARM32 %s
Jan Voung66c3d5e2015-06-04 17:02:31 -070019
Jim Stichnothc8799682015-06-22 13:04:10 -070020; RUN: %if --need=target_ARM32 --need=allow_dump \
21; RUN: --command %p2i --filetype=asm --assemble \
Jan Voung66c3d5e2015-06-04 17:02:31 -070022; RUN: --disassemble --target arm32 -i %s --args -Om1 --skip-unimplemented \
Jim Stichnothc8799682015-06-22 13:04:10 -070023; RUN: | %if --need=target_ARM32 --need=allow_dump \
24; RUN: --command FileCheck --check-prefix ARM32 %s
Jim Stichnothf7c9a142014-04-29 10:52:43 -070025
Jim Stichnothde4ca712014-06-29 08:13:48 -070026@i8v = internal global [1 x i8] zeroinitializer, align 1
27@i16v = internal global [2 x i8] zeroinitializer, align 2
28@i32v = internal global [4 x i8] zeroinitializer, align 4
29@i64v = internal global [8 x i8] zeroinitializer, align 8
30@u8v = internal global [1 x i8] zeroinitializer, align 1
31@u16v = internal global [2 x i8] zeroinitializer, align 2
32@u32v = internal global [4 x i8] zeroinitializer, align 4
33@u64v = internal global [8 x i8] zeroinitializer, align 8
Jim Stichnothf7c9a142014-04-29 10:52:43 -070034
35define void @from_int8() {
36entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -070037 %__0 = bitcast [1 x i8]* @i8v to i8*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070038 %v0 = load i8, i8* %__0, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -070039 %v1 = sext i8 %v0 to i16
Karl Schimpfa667fb82014-05-19 14:56:51 -070040 %__3 = bitcast [2 x i8]* @i16v to i16*
41 store i16 %v1, i16* %__3, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -070042 %v2 = sext i8 %v0 to i32
Karl Schimpfa667fb82014-05-19 14:56:51 -070043 %__5 = bitcast [4 x i8]* @i32v to i32*
44 store i32 %v2, i32* %__5, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -070045 %v3 = sext i8 %v0 to i64
Karl Schimpfa667fb82014-05-19 14:56:51 -070046 %__7 = bitcast [8 x i8]* @i64v to i64*
47 store i64 %v3, i64* %__7, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -070048 ret void
Jim Stichnothf7c9a142014-04-29 10:52:43 -070049}
Jan Voungdddc3062014-08-29 12:59:02 -070050; CHECK-LABEL: from_int8
Jan Vounga2703ae2015-02-19 11:27:44 -080051; CHECK: mov {{.*}},BYTE PTR
52; CHECK: movsx e{{.*}},{{[a-d]l|BYTE PTR}}
53; CHECK: mov WORD PTR
Jim Stichnothd97c7df2014-06-04 11:57:08 -070054; CHECK: movsx
Jan Vounga2703ae2015-02-19 11:27:44 -080055; CHECK: mov DWORD PTR
Jim Stichnothd97c7df2014-06-04 11:57:08 -070056; CHECK: movsx
Jan Vounga2703ae2015-02-19 11:27:44 -080057; CHECK: sar {{.*}},0x1f
Jim Stichnoth729dbd02015-02-25 14:48:43 -080058; CHECK-DAG: ds:0x0,{{.*}}i64v
59; CHECK-DAG: ds:0x4,{{.*}}i64v
Jim Stichnothf7c9a142014-04-29 10:52:43 -070060
Jan Voung66c3d5e2015-06-04 17:02:31 -070061; ARM32-LABEL: from_int8
62; ARM32: movw {{.*}}i8v
63; ARM32: ldrb
64; ARM32: sxtb
65; ARM32: movw {{.*}}i16v
66; ARM32: strh
67; ARM32: sxtb
68; ARM32: movw {{.*}}i32v
69; ARM32: str r
70; ARM32: sxtb
71; ARM32: asr
72; ARM32: movw {{.*}}i64v
73; ARM32-DAG: str r{{.*}}, [r{{[0-9]+}}]
74; ARM32-DAG: str r{{.*}}, [{{.*}}, #4]
75
Jim Stichnothf7c9a142014-04-29 10:52:43 -070076define void @from_int16() {
77entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -070078 %__0 = bitcast [2 x i8]* @i16v to i16*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070079 %v0 = load i16, i16* %__0, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -070080 %v1 = trunc i16 %v0 to i8
Karl Schimpfa667fb82014-05-19 14:56:51 -070081 %__3 = bitcast [1 x i8]* @i8v to i8*
82 store i8 %v1, i8* %__3, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -070083 %v2 = sext i16 %v0 to i32
Karl Schimpfa667fb82014-05-19 14:56:51 -070084 %__5 = bitcast [4 x i8]* @i32v to i32*
85 store i32 %v2, i32* %__5, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -070086 %v3 = sext i16 %v0 to i64
Karl Schimpfa667fb82014-05-19 14:56:51 -070087 %__7 = bitcast [8 x i8]* @i64v to i64*
88 store i64 %v3, i64* %__7, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -070089 ret void
Jim Stichnothf7c9a142014-04-29 10:52:43 -070090}
Jan Voungdddc3062014-08-29 12:59:02 -070091; CHECK-LABEL: from_int16
Jan Vounga2703ae2015-02-19 11:27:44 -080092; CHECK: mov {{.*}},WORD PTR
Jim Stichnoth729dbd02015-02-25 14:48:43 -080093; CHECK: 0x0 {{.*}}i16v
Jan Vounga2703ae2015-02-19 11:27:44 -080094; CHECK: movsx e{{.*}},{{.*x|[ds]i|bp|WORD PTR}}
Jim Stichnoth729dbd02015-02-25 14:48:43 -080095; CHECK: 0x0,{{.*}}i32v
Jan Vounga2703ae2015-02-19 11:27:44 -080096; CHECK: movsx e{{.*}},{{.*x|[ds]i|bp|WORD PTR}}
97; CHECK: sar {{.*}},0x1f
Jim Stichnoth729dbd02015-02-25 14:48:43 -080098; CHECK: 0x0,{{.*}}i64v
Jim Stichnothf7c9a142014-04-29 10:52:43 -070099
Jan Voung66c3d5e2015-06-04 17:02:31 -0700100; ARM32-LABEL: from_int16
101; ARM32: movw {{.*}}i16v
102; ARM32: ldrh
103; ARM32: movw {{.*}}i8v
104; ARM32: strb
105; ARM32: sxth
106; ARM32: movw {{.*}}i32v
107; ARM32: str r
108; ARM32: sxth
109; ARM32: asr
110; ARM32: movw {{.*}}i64v
111; ARM32: str r
112
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700113define void @from_int32() {
114entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -0700115 %__0 = bitcast [4 x i8]* @i32v to i32*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -0700116 %v0 = load i32, i32* %__0, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700117 %v1 = trunc i32 %v0 to i8
Karl Schimpfa667fb82014-05-19 14:56:51 -0700118 %__3 = bitcast [1 x i8]* @i8v to i8*
119 store i8 %v1, i8* %__3, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700120 %v2 = trunc i32 %v0 to i16
Karl Schimpfa667fb82014-05-19 14:56:51 -0700121 %__5 = bitcast [2 x i8]* @i16v to i16*
122 store i16 %v2, i16* %__5, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700123 %v3 = sext i32 %v0 to i64
Karl Schimpfa667fb82014-05-19 14:56:51 -0700124 %__7 = bitcast [8 x i8]* @i64v to i64*
125 store i64 %v3, i64* %__7, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700126 ret void
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700127}
Jan Voungdddc3062014-08-29 12:59:02 -0700128; CHECK-LABEL: from_int32
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800129; CHECK: 0x0 {{.*}} i32v
130; CHECK: 0x0,{{.*}} i8v
131; CHECK: 0x0,{{.*}} i16v
Jan Vounga2703ae2015-02-19 11:27:44 -0800132; CHECK: sar {{.*}},0x1f
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800133; CHECK: 0x0,{{.*}} i64v
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700134
Jan Voung66c3d5e2015-06-04 17:02:31 -0700135; ARM32-LABEL: from_int32
136; ARM32: movw {{.*}}i32v
137; ARM32: ldr r
138; ARM32: movw {{.*}}i8v
139; ARM32: strb
140; ARM32: movw {{.*}}i16v
141; ARM32: strh
142; ARM32: asr
143; ARM32: movw {{.*}}i64v
144; ARM32: str r
145
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700146define void @from_int64() {
147entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -0700148 %__0 = bitcast [8 x i8]* @i64v to i64*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -0700149 %v0 = load i64, i64* %__0, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700150 %v1 = trunc i64 %v0 to i8
Karl Schimpfa667fb82014-05-19 14:56:51 -0700151 %__3 = bitcast [1 x i8]* @i8v to i8*
152 store i8 %v1, i8* %__3, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700153 %v2 = trunc i64 %v0 to i16
Karl Schimpfa667fb82014-05-19 14:56:51 -0700154 %__5 = bitcast [2 x i8]* @i16v to i16*
155 store i16 %v2, i16* %__5, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700156 %v3 = trunc i64 %v0 to i32
Karl Schimpfa667fb82014-05-19 14:56:51 -0700157 %__7 = bitcast [4 x i8]* @i32v to i32*
158 store i32 %v3, i32* %__7, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700159 ret void
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700160}
Jan Voungdddc3062014-08-29 12:59:02 -0700161; CHECK-LABEL: from_int64
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800162; CHECK: 0x0 {{.*}} i64v
163; CHECK: 0x0,{{.*}} i8v
164; CHECK: 0x0,{{.*}} i16v
165; CHECK: 0x0,{{.*}} i32v
Jan Voungdddc3062014-08-29 12:59:02 -0700166
Jan Voung66c3d5e2015-06-04 17:02:31 -0700167; ARM32-LABEL: from_int64
168; ARM32: movw {{.*}}i64v
169; ARM32: ldr r
170; ARM32: movw {{.*}}i8v
171; ARM32: strb
172; ARM32: movw {{.*}}i16v
173; ARM32: strh
174; ARM32: movw {{.*}}i32v
175; ARM32: str r
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700176
177define void @from_uint8() {
178entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -0700179 %__0 = bitcast [1 x i8]* @u8v to i8*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -0700180 %v0 = load i8, i8* %__0, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700181 %v1 = zext i8 %v0 to i16
Karl Schimpfa667fb82014-05-19 14:56:51 -0700182 %__3 = bitcast [2 x i8]* @i16v to i16*
183 store i16 %v1, i16* %__3, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700184 %v2 = zext i8 %v0 to i32
Karl Schimpfa667fb82014-05-19 14:56:51 -0700185 %__5 = bitcast [4 x i8]* @i32v to i32*
186 store i32 %v2, i32* %__5, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700187 %v3 = zext i8 %v0 to i64
Karl Schimpfa667fb82014-05-19 14:56:51 -0700188 %__7 = bitcast [8 x i8]* @i64v to i64*
189 store i64 %v3, i64* %__7, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700190 ret void
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700191}
Jan Voungdddc3062014-08-29 12:59:02 -0700192; CHECK-LABEL: from_uint8
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800193; CHECK: 0x0 {{.*}} u8v
Jan Vounga2703ae2015-02-19 11:27:44 -0800194; CHECK: movzx e{{.*}},{{[a-d]l|BYTE PTR}}
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800195; CHECK: 0x0,{{.*}} i16v
Jim Stichnothd97c7df2014-06-04 11:57:08 -0700196; CHECK: movzx
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800197; CHECK: 0x0,{{.*}} i32v
Jim Stichnothd97c7df2014-06-04 11:57:08 -0700198; CHECK: movzx
Jan Vounga2703ae2015-02-19 11:27:44 -0800199; CHECK: mov {{.*}},0x0
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800200; CHECK: 0x0,{{.*}} i64v
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700201
Jan Voung66c3d5e2015-06-04 17:02:31 -0700202; ARM32-LABEL: from_uint8
203; ARM32: movw {{.*}}u8v
204; ARM32: ldrb
205; ARM32: uxtb
206; ARM32: movw {{.*}}i16v
207; ARM32: strh
208; ARM32: uxtb
209; ARM32: movw {{.*}}i32v
210; ARM32: str r
211; ARM32: uxtb
212; ARM32: mov {{.*}}, #0
213; ARM32: movw {{.*}}i64v
214; ARM32: str r
215
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700216define void @from_uint16() {
217entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -0700218 %__0 = bitcast [2 x i8]* @u16v to i16*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -0700219 %v0 = load i16, i16* %__0, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700220 %v1 = trunc i16 %v0 to i8
Karl Schimpfa667fb82014-05-19 14:56:51 -0700221 %__3 = bitcast [1 x i8]* @i8v to i8*
222 store i8 %v1, i8* %__3, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700223 %v2 = zext i16 %v0 to i32
Karl Schimpfa667fb82014-05-19 14:56:51 -0700224 %__5 = bitcast [4 x i8]* @i32v to i32*
225 store i32 %v2, i32* %__5, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700226 %v3 = zext i16 %v0 to i64
Karl Schimpfa667fb82014-05-19 14:56:51 -0700227 %__7 = bitcast [8 x i8]* @i64v to i64*
228 store i64 %v3, i64* %__7, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700229 ret void
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700230}
Jan Voungdddc3062014-08-29 12:59:02 -0700231; CHECK-LABEL: from_uint16
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800232; CHECK: 0x0 {{.*}} u16v
233; CHECK: 0x0,{{.*}} i8v
Jan Vounga2703ae2015-02-19 11:27:44 -0800234; CHECK: movzx e{{.*}},{{.*x|[ds]i|bp|WORD PTR}}
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800235; CHECK: 0x0,{{.*}} i32v
Jan Vounga2703ae2015-02-19 11:27:44 -0800236; CHECK: movzx e{{.*}},{{.*x|[ds]i|bp|WORD PTR}}
237; CHECK: mov {{.*}},0x0
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800238; CHECK: 0x0,{{.*}} i64v
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700239
Jan Voung66c3d5e2015-06-04 17:02:31 -0700240; ARM32-LABEL: from_uint16
241; ARM32: movw {{.*}}u16v
242; ARM32: ldrh
243; ARM32: movw {{.*}}i8v
244; ARM32: strb
245; ARM32: uxth
246; ARM32: movw {{.*}}i32v
247; ARM32: str r
248; ARM32: uxth
249; ARM32: mov {{.*}}, #0
250; ARM32: movw {{.*}}i64v
251; ARM32: str r
252
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700253define void @from_uint32() {
254entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -0700255 %__0 = bitcast [4 x i8]* @u32v to i32*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -0700256 %v0 = load i32, i32* %__0, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700257 %v1 = trunc i32 %v0 to i8
Karl Schimpfa667fb82014-05-19 14:56:51 -0700258 %__3 = bitcast [1 x i8]* @i8v to i8*
259 store i8 %v1, i8* %__3, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700260 %v2 = trunc i32 %v0 to i16
Karl Schimpfa667fb82014-05-19 14:56:51 -0700261 %__5 = bitcast [2 x i8]* @i16v to i16*
262 store i16 %v2, i16* %__5, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700263 %v3 = zext i32 %v0 to i64
Karl Schimpfa667fb82014-05-19 14:56:51 -0700264 %__7 = bitcast [8 x i8]* @i64v to i64*
265 store i64 %v3, i64* %__7, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700266 ret void
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700267}
Jan Voungdddc3062014-08-29 12:59:02 -0700268; CHECK-LABEL: from_uint32
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800269; CHECK: 0x0 {{.*}} u32v
270; CHECK: 0x0,{{.*}} i8v
271; CHECK: 0x0,{{.*}} i16v
Jan Vounga2703ae2015-02-19 11:27:44 -0800272; CHECK: mov {{.*}},0x0
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800273; CHECK: 0x0,{{.*}} i64v
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700274
Jan Voung66c3d5e2015-06-04 17:02:31 -0700275; ARM32-LABEL: from_uint32
276; ARM32: movw {{.*}}u32v
277; ARM32: ldr r
278; ARM32: movw {{.*}}i8v
279; ARM32: strb
280; ARM32: movw {{.*}}i16v
281; ARM32: strh
282; ARM32: mov {{.*}}, #0
283; ARM32: movw {{.*}}i64v
284; ARM32: str r
285
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700286define void @from_uint64() {
287entry:
Karl Schimpfa667fb82014-05-19 14:56:51 -0700288 %__0 = bitcast [8 x i8]* @u64v to i64*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -0700289 %v0 = load i64, i64* %__0, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700290 %v1 = trunc i64 %v0 to i8
Karl Schimpfa667fb82014-05-19 14:56:51 -0700291 %__3 = bitcast [1 x i8]* @i8v to i8*
292 store i8 %v1, i8* %__3, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700293 %v2 = trunc i64 %v0 to i16
Karl Schimpfa667fb82014-05-19 14:56:51 -0700294 %__5 = bitcast [2 x i8]* @i16v to i16*
295 store i16 %v2, i16* %__5, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700296 %v3 = trunc i64 %v0 to i32
Karl Schimpfa667fb82014-05-19 14:56:51 -0700297 %__7 = bitcast [4 x i8]* @i32v to i32*
298 store i32 %v3, i32* %__7, align 1
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700299 ret void
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700300}
Jan Voungdddc3062014-08-29 12:59:02 -0700301; CHECK-LABEL: from_uint64
Jim Stichnoth729dbd02015-02-25 14:48:43 -0800302; CHECK: 0x0 {{.*}} u64v
303; CHECK: 0x0,{{.*}} i8v
304; CHECK: 0x0,{{.*}} i16v
305; CHECK: 0x0,{{.*}} i32v
Jan Voung66c3d5e2015-06-04 17:02:31 -0700306
307; ARM32-LABEL: from_uint64
308; ARM32: movw {{.*}}u64v
309; ARM32: ldr r
310; ARM32: movw {{.*}}i8v
311; ARM32: strb
312; ARM32: movw {{.*}}i16v
313; ARM32: strh
314; ARM32: movw {{.*}}i32v
315; ARM32: str r