• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; This is a test of C-level conversion operations that clang lowers
2; into pairs of shifts.
3
4; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
5; RUN:   --target x8632 -i %s --args -O2 \
6; RUN:   | %if --need=target_X8632 --command FileCheck %s
7
8; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
9; RUN:   --target x8632 -i %s --args -Om1 \
10; RUN:   | %if --need=target_X8632 --command FileCheck %s
11
12; RUN: %if --need=target_ARM32 \
13; RUN:   --command %p2i --filetype=obj \
14; RUN:   --disassemble --target arm32 -i %s --args -O2 \
15; RUN:   | %if --need=target_ARM32 \
16; RUN:   --command FileCheck --check-prefix ARM32 %s
17
18; RUN: %if --need=target_ARM32 \
19; RUN:   --command %p2i --filetype=obj \
20; RUN:   --disassemble --target arm32 -i %s --args -Om1 \
21; RUN:   | %if --need=target_ARM32 \
22; RUN:   --command FileCheck --check-prefix ARM32 %s
23
24; RUN: %if --need=target_MIPS32 --need=allow_dump \
25; RUN:   --command %p2i --filetype=asm --assemble \
26; RUN:   --disassemble --target mips32 -i %s --args -O2 \
27; RUN:   | %if --need=target_MIPS32 --need=allow_dump \
28; RUN:   --command FileCheck --check-prefix MIPS32-O2 --check-prefix MIPS32 %s
29
30; RUN: %if --need=target_MIPS32 --need=allow_dump \
31; RUN:   --command %p2i --filetype=asm --assemble \
32; RUN:   --disassemble --target mips32 -i %s --args -Om1 \
33; RUN:   | %if --need=target_MIPS32 --need=allow_dump \
34; RUN:   --command FileCheck --check-prefix MIPS32-OM1 --check-prefix MIPS32 %s
35
36@i1 = internal global [4 x i8] zeroinitializer, align 4
37@i2 = internal global [4 x i8] zeroinitializer, align 4
38@u1 = internal global [4 x i8] zeroinitializer, align 4
39
40define internal void @conv1() {
41entry:
42  %__0 = bitcast [4 x i8]* @u1 to i32*
43  %v0 = load i32, i32* %__0, align 1
44  %sext = shl i32 %v0, 24
45  %v1 = ashr i32 %sext, 24
46  %__4 = bitcast [4 x i8]* @i1 to i32*
47  store i32 %v1, i32* %__4, align 1
48  ret void
49}
50; CHECK-LABEL: conv1
51; CHECK: shl {{.*}},0x18
52; CHECK: sar {{.*}},0x18
53
54; ARM32-LABEL: conv1
55; ARM32: lsl {{.*}}, #24
56; ARM32: asr {{.*}}, #24
57
58define internal void @conv2() {
59entry:
60  %__0 = bitcast [4 x i8]* @u1 to i32*
61  %v0 = load i32, i32* %__0, align 1
62  %sext1 = shl i32 %v0, 16
63  %v1 = lshr i32 %sext1, 16
64  %__4 = bitcast [4 x i8]* @i2 to i32*
65  store i32 %v1, i32* %__4, align 1
66  ret void
67}
68; CHECK-LABEL: conv2
69; CHECK: shl {{.*}},0x10
70; CHECK: shr {{.*}},0x10
71
72; ARM32-LABEL: conv2
73; ARM32: lsl {{.*}}, #16
74; ARM32: lsr {{.*}}, #16
75
76define internal i32 @shlImmLarge(i32 %val) {
77entry:
78  %result = shl i32 %val, 257
79  ret i32 %result
80}
81; CHECK-LABEL: shlImmLarge
82; CHECK: shl {{.*}},0x1
83
84; MIPS32-LABEL: shlImmLarge
85; MIPS32: sll
86
87define internal i32 @shlImmNeg(i32 %val) {
88entry:
89  %result = shl i32 %val, -1
90  ret i32 %result
91}
92; CHECK-LABEL: shlImmNeg
93; CHECK: shl {{.*}},0xff
94
95; MIPS32-LABEL: shlImmNeg
96; MIPS32: sll
97
98define internal i32 @lshrImmLarge(i32 %val) {
99entry:
100  %result = lshr i32 %val, 257
101  ret i32 %result
102}
103; CHECK-LABEL: lshrImmLarge
104; CHECK: shr {{.*}},0x1
105
106; MIPS32-LABEL: lshrImmLarge
107; MIPS32: srl
108
109define internal i32 @lshrImmNeg(i32 %val) {
110entry:
111  %result = lshr i32 %val, -1
112  ret i32 %result
113}
114; CHECK-LABEL: lshrImmNeg
115; CHECK: shr {{.*}},0xff
116
117; MIPS32-LABEL: lshrImmNeg
118; MIPS32: srl
119
120define internal i32 @ashrImmLarge(i32 %val) {
121entry:
122  %result = ashr i32 %val, 257
123  ret i32 %result
124}
125; CHECK-LABEL: ashrImmLarge
126; CHECK: sar {{.*}},0x1
127
128; MIPS32-LABEL: ashrImmLarge
129; MIPS32: sra
130
131define internal i32 @ashrImmNeg(i32 %val) {
132entry:
133  %result = ashr i32 %val, -1
134  ret i32 %result
135}
136; CHECK-LABEL: ashrImmNeg
137; CHECK: sar {{.*}},0xff
138
139; MIPS32-LABEL: ashrImmNeg
140; MIPS32: sra
141
142define internal i64 @shlImm64One(i64 %val) {
143entry:
144  %result = shl i64 %val, 1
145  ret i64 %result
146}
147; CHECK-LABEL: shlImm64One
148; CHECK: shl {{.*}},1
149; MIPS32-LABEL: shlImm64One
150; MIPS32: addu	[[T_LO:.*]],[[VAL_LO:.*]],[[VAL_LO]]
151; MIPS32: sltu	[[T1:.*]],[[T_LO]],[[VAL_LO]]
152; MIPS32: addu	[[T2:.*]],[[T1]],[[VAL_HI:.*]]
153; MIPS32: addu	{{.*}},[[VAL_HI]],[[T2]]
154
155define internal i64 @shlImm64LessThan32(i64 %val) {
156entry:
157  %result = shl i64 %val, 4
158  ret i64 %result
159}
160; CHECK-LABEL: shlImm64LessThan32
161; CHECK: shl {{.*}},0x4
162; MIPS32-LABEL: shlImm64LessThan32
163; MIPS32: srl	[[T1:.*]],[[VAL_LO:.*]],0x1c
164; MIPS32: sll	[[T2:.*]],{{.*}},0x4
165; MIPS32: or	{{.*}},[[T1]],[[T2]]
166; MIPS32: sll	{{.*}},[[VAL_LO]],0x4
167
168define internal i64 @shlImm64Equal32(i64 %val) {
169entry:
170  %result = shl i64 %val, 32
171  ret i64 %result
172}
173; CHECK-LABEL: shlImm64Equal32
174; CHECK-NOT: shl
175; MIPS32-LABEL: shlImm64Equal32
176; MIPS32: li	{{.*}},0
177; MIPS32-O2:	move
178; MIPS32-OM1:	sw
179; MIPS32-OM1:	lw
180
181define internal i64 @shlImm64GreaterThan32(i64 %val) {
182entry:
183  %result = shl i64 %val, 40
184  ret i64 %result
185}
186; CHECK-LABEL: shlImm64GreaterThan32
187; CHECK: shl {{.*}},0x8
188; MIPS32-LABEL: shlImm64GreaterThan32
189; MIPS32: sll	{{.*}},{{.*}},0x8
190; MIPS32: li	{{.*}},0
191
192define internal i64 @lshrImm64One(i64 %val) {
193entry:
194  %result = lshr i64 %val, 1
195  ret i64 %result
196}
197; CHECK-LABEL: lshrImm64One
198; CHECK: shr {{.*}},1
199; MIPS32-LABEL: lshrImm64One
200; MIPS32: sll	[[T1:.*]],[[VAL_HI:.*]],0x1f
201; MIPS32: srl	[[T2:.*]],{{.*}},0x1
202; MIPS32: or	{{.*}},[[T1]],[[T2]]
203; MIPS32: srl	{{.*}},[[VAL_HI]],0x1
204
205define internal i64 @lshrImm64LessThan32(i64 %val) {
206entry:
207  %result = lshr i64 %val, 4
208  ret i64 %result
209}
210; CHECK-LABEL: lshrImm64LessThan32
211; CHECK: shrd {{.*}},0x4
212; CHECK: shr {{.*}},0x4
213; MIPS32-LABEL: lshrImm64LessThan32
214; MIPS32: sll	[[T1:.*]],[[VAL_HI:.*]],0x1c
215; MIPS32: srl	[[T2:.*]],{{.*}},0x4
216; MIPS32: or	{{.*}},[[T1]],[[T2]]
217; MIPS32: srl	{{.*}},[[VAL_HI]],0x4
218
219define internal i64 @lshrImm64Equal32(i64 %val) {
220entry:
221  %result = lshr i64 %val, 32
222  ret i64 %result
223}
224; CHECK-LABEL: lshrImm64Equal32
225; CHECK-NOT: shr
226; MIPS32-LABEL: lshrImm64Equal32
227; MIPS32: li	{{.*}},0
228; MIPS32-O2: move
229; MIPS32-OM1: sw
230; MIPS32-OM1: lw
231
232define internal i64 @lshrImm64GreaterThan32(i64 %val) {
233entry:
234  %result = lshr i64 %val, 40
235  ret i64 %result
236}
237; CHECK-LABEL: lshrImm64GreaterThan32
238; CHECK-NOT: shrd
239; CHECK: shr {{.*}},0x8
240; MIPS32-LABEL: lshrImm64GreaterThan32
241; MIPS32: srl	{{.*}},{{.*}},0x8
242; MIPS32: li	{{.*}},0
243
244define internal i64 @ashrImm64One(i64 %val) {
245entry:
246  %result = ashr i64 %val, 1
247  ret i64 %result
248}
249; CHECK-LABEL: ashrImm64One
250; CHECK: shrd {{.*}},0x1
251; CHECK: sar {{.*}},1
252; MIPS32-LABEL: ashrImm64One
253; MIPS32: sll	[[T1:.*]],[[VAL_HI:.*]],0x1f
254; MIPS32: srl	[[T2:.*]],{{.*}},0x1
255; MIPS32: or	{{.*}},[[T1]],[[T2]]
256; MIPS32: sra	{{.*}},[[VAL_HI]],0x1
257
258define internal i64 @ashrImm64LessThan32(i64 %val) {
259entry:
260  %result = ashr i64 %val, 4
261  ret i64 %result
262}
263; CHECK-LABEL: ashrImm64LessThan32
264; CHECK: shrd {{.*}},0x4
265; CHECK: sar {{.*}},0x4
266; MIPS32-LABEL: ashrImm64LessThan32
267; MIPS32: sll   [[T1:.*]],[[VAL_HI:.*]],0x1c
268; MIPS32: srl   [[T2:.*]],{{.*}},0x4
269; MIPS32: or    {{.*}},[[T1]],[[T2]]
270; MIPS32: sra   {{.*}},[[VAL_HI]],0x4
271
272define internal i64 @ashrImm64Equal32(i64 %val) {
273entry:
274  %result = ashr i64 %val, 32
275  ret i64 %result
276}
277; CHECK-LABEL: ashrImm64Equal32
278; CHECK: sar {{.*}},0x1f
279; CHECK-NOT: shrd
280; MIPS32-LABEL: ashrImm64Equal32
281; MIPS32: sra	{{.*}},[[VAL_HI:.*]],0x1f
282; MIPS32-O2: move	{{.*}},[[VAL_HI]]
283; MIPS32-OM1:	sw [[VAL_HI]],{{.*}}
284; MIPS32-OM1:   lw {{.*}},{{.*}}
285
286define internal i64 @ashrImm64GreaterThan32(i64 %val) {
287entry:
288  %result = ashr i64 %val, 40
289  ret i64 %result
290}
291; CHECK-LABEL: ashrImm64GreaterThan32
292; CHECK: sar {{.*}},0x1f
293; CHECK: shrd {{.*}},0x8
294; MIPS32-LABEL: ashrImm64GreaterThan32
295; MIPS32: sra	{{.*}},[[VAL_HI:.*]],0x8
296; MIPS32: sra	{{.*}},[[VAL_HI]],0x1f
297