xref: /llvm-project/llvm/test/CodeGen/PowerPC/frounds.ll (revision a51712751c184ebe056718c938d2526693a31564)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- | FileCheck %s \
3; RUN:   -check-prefix=PPC32
4; RUN: llc -verify-machineinstrs < %s -mcpu=ppc -mtriple=powerpc64 | FileCheck %s \
5; RUN:   -check-prefix=PPC64
6; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le -mattr=-direct-move \
7; RUN:   | FileCheck %s -check-prefix=PPC64LE
8; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -mcpu=pwr9 \
9; RUN:   | FileCheck %s -check-prefix=P9_32
10; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le -mcpu=pwr9 \
11; RUN:   | FileCheck %s -check-prefix=P9
12; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le | FileCheck %s \
13; RUN:   -check-prefix=DM
14
15define i32 @foo() #0 {
16; PPC32-LABEL: foo:
17; PPC32:       # %bb.0: # %entry
18; PPC32-NEXT:    stwu 1, -32(1)
19; PPC32-NEXT:    mffs 0
20; PPC32-NEXT:    stfd 0, 16(1)
21; PPC32-NEXT:    lwz 3, 20(1)
22; PPC32-NEXT:    clrlwi 4, 3, 30
23; PPC32-NEXT:    not 3, 3
24; PPC32-NEXT:    rlwinm 3, 3, 31, 31, 31
25; PPC32-NEXT:    xor 3, 4, 3
26; PPC32-NEXT:    stw 3, 24(1)
27; PPC32-NEXT:    stw 3, 28(1)
28; PPC32-NEXT:    addi 1, 1, 32
29; PPC32-NEXT:    blr
30;
31; PPC64-LABEL: foo:
32; PPC64:       # %bb.0: # %entry
33; PPC64-NEXT:    mffs 0
34; PPC64-NEXT:    stfd 0, -16(1)
35; PPC64-NEXT:    lwz 3, -12(1)
36; PPC64-NEXT:    clrlwi 4, 3, 30
37; PPC64-NEXT:    not 3, 3
38; PPC64-NEXT:    rlwinm 3, 3, 31, 31, 31
39; PPC64-NEXT:    xor 3, 4, 3
40; PPC64-NEXT:    stw 3, -8(1)
41; PPC64-NEXT:    stw 3, -4(1)
42; PPC64-NEXT:    blr
43;
44; PPC64LE-LABEL: foo:
45; PPC64LE:       # %bb.0: # %entry
46; PPC64LE-NEXT:    mffs 0
47; PPC64LE-NEXT:    stfd 0, -16(1)
48; PPC64LE-NEXT:    lwz 3, -16(1)
49; PPC64LE-NEXT:    clrlwi 4, 3, 30
50; PPC64LE-NEXT:    not 3, 3
51; PPC64LE-NEXT:    rlwinm 3, 3, 31, 31, 31
52; PPC64LE-NEXT:    xor 3, 4, 3
53; PPC64LE-NEXT:    stw 3, -8(1)
54; PPC64LE-NEXT:    stw 3, -4(1)
55; PPC64LE-NEXT:    blr
56;
57; P9_32-LABEL: foo:
58; P9_32:       # %bb.0: # %entry
59; P9_32-NEXT:    stwu 1, -32(1)
60; P9_32-NEXT:    mffs 0
61; P9_32-NEXT:    stfd 0, 16(1)
62; P9_32-NEXT:    lwz 3, 20(1)
63; P9_32-NEXT:    clrlwi 4, 3, 30
64; P9_32-NEXT:    not 3, 3
65; P9_32-NEXT:    rlwinm 3, 3, 31, 31, 31
66; P9_32-NEXT:    xor 3, 4, 3
67; P9_32-NEXT:    stw 3, 24(1)
68; P9_32-NEXT:    stw 3, 28(1)
69; P9_32-NEXT:    addi 1, 1, 32
70; P9_32-NEXT:    blr
71;
72; P9-LABEL: foo:
73; P9:       # %bb.0: # %entry
74; P9-NEXT:    mffs 0
75; P9-NEXT:    mffprd 3, 0
76; P9-NEXT:    clrlwi 4, 3, 30
77; P9-NEXT:    not 3, 3
78; P9-NEXT:    rlwinm 3, 3, 31, 31, 31
79; P9-NEXT:    xor 3, 4, 3
80; P9-NEXT:    stw 3, -8(1)
81; P9-NEXT:    stw 3, -4(1)
82; P9-NEXT:    blr
83;
84; DM-LABEL: foo:
85; DM:       # %bb.0: # %entry
86; DM-NEXT:    mffs 0
87; DM-NEXT:    mffprd 3, 0
88; DM-NEXT:    clrlwi 4, 3, 30
89; DM-NEXT:    not 3, 3
90; DM-NEXT:    rlwinm 3, 3, 31, 31, 31
91; DM-NEXT:    xor 3, 4, 3
92; DM-NEXT:    stw 3, -8(1)
93; DM-NEXT:    stw 3, -4(1)
94; DM-NEXT:    blr
95entry:
96	%retval = alloca i32		; <ptr> [#uses=2]
97	%tmp = alloca i32		; <ptr> [#uses=2]
98	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
99	%tmp1 = call i32 @llvm.get.rounding( )		; <i32> [#uses=1]
100	store i32 %tmp1, ptr %tmp, align 4
101	%tmp2 = load i32, ptr %tmp, align 4		; <i32> [#uses=1]
102	store i32 %tmp2, ptr %retval, align 4
103	br label %return
104
105return:		; preds = %entry
106	%retval3 = load i32, ptr %retval		; <i32> [#uses=1]
107	ret i32 %retval3
108}
109
110define void @setrnd_tozero() #0 {
111; PPC32-LABEL: setrnd_tozero:
112; PPC32:       # %bb.0: # %entry
113; PPC32-NEXT:    mtfsb0 30
114; PPC32-NEXT:    mtfsb1 31
115; PPC32-NEXT:    blr
116;
117; PPC64-LABEL: setrnd_tozero:
118; PPC64:       # %bb.0: # %entry
119; PPC64-NEXT:    mtfsb0 30
120; PPC64-NEXT:    mtfsb1 31
121; PPC64-NEXT:    blr
122;
123; PPC64LE-LABEL: setrnd_tozero:
124; PPC64LE:       # %bb.0: # %entry
125; PPC64LE-NEXT:    mtfsb0 30
126; PPC64LE-NEXT:    mtfsb1 31
127; PPC64LE-NEXT:    blr
128;
129; P9_32-LABEL: setrnd_tozero:
130; P9_32:       # %bb.0: # %entry
131; P9_32-NEXT:    mffscrni 0, 1
132; P9_32-NEXT:    blr
133;
134; P9-LABEL: setrnd_tozero:
135; P9:       # %bb.0: # %entry
136; P9-NEXT:    mffscrni 0, 1
137; P9-NEXT:    blr
138;
139; DM-LABEL: setrnd_tozero:
140; DM:       # %bb.0: # %entry
141; DM-NEXT:    mtfsb0 30
142; DM-NEXT:    mtfsb1 31
143; DM-NEXT:    blr
144entry:
145  call void @llvm.set.rounding(i32 0)
146  ret void
147}
148
149define void @setrnd_tonearest_tieeven() #0 {
150; PPC32-LABEL: setrnd_tonearest_tieeven:
151; PPC32:       # %bb.0: # %entry
152; PPC32-NEXT:    mtfsb0 30
153; PPC32-NEXT:    mtfsb0 31
154; PPC32-NEXT:    blr
155;
156; PPC64-LABEL: setrnd_tonearest_tieeven:
157; PPC64:       # %bb.0: # %entry
158; PPC64-NEXT:    mtfsb0 30
159; PPC64-NEXT:    mtfsb0 31
160; PPC64-NEXT:    blr
161;
162; PPC64LE-LABEL: setrnd_tonearest_tieeven:
163; PPC64LE:       # %bb.0: # %entry
164; PPC64LE-NEXT:    mtfsb0 30
165; PPC64LE-NEXT:    mtfsb0 31
166; PPC64LE-NEXT:    blr
167;
168; P9_32-LABEL: setrnd_tonearest_tieeven:
169; P9_32:       # %bb.0: # %entry
170; P9_32-NEXT:    mffscrni 0, 0
171; P9_32-NEXT:    blr
172;
173; P9-LABEL: setrnd_tonearest_tieeven:
174; P9:       # %bb.0: # %entry
175; P9-NEXT:    mffscrni 0, 0
176; P9-NEXT:    blr
177;
178; DM-LABEL: setrnd_tonearest_tieeven:
179; DM:       # %bb.0: # %entry
180; DM-NEXT:    mtfsb0 30
181; DM-NEXT:    mtfsb0 31
182; DM-NEXT:    blr
183entry:
184  call void @llvm.set.rounding(i32 1)
185  ret void
186}
187
188define void @setrnd_toposinf() #0 {
189; PPC32-LABEL: setrnd_toposinf:
190; PPC32:       # %bb.0: # %entry
191; PPC32-NEXT:    mtfsb1 30
192; PPC32-NEXT:    mtfsb0 31
193; PPC32-NEXT:    blr
194;
195; PPC64-LABEL: setrnd_toposinf:
196; PPC64:       # %bb.0: # %entry
197; PPC64-NEXT:    mtfsb1 30
198; PPC64-NEXT:    mtfsb0 31
199; PPC64-NEXT:    blr
200;
201; PPC64LE-LABEL: setrnd_toposinf:
202; PPC64LE:       # %bb.0: # %entry
203; PPC64LE-NEXT:    mtfsb1 30
204; PPC64LE-NEXT:    mtfsb0 31
205; PPC64LE-NEXT:    blr
206;
207; P9_32-LABEL: setrnd_toposinf:
208; P9_32:       # %bb.0: # %entry
209; P9_32-NEXT:    mffscrni 0, 2
210; P9_32-NEXT:    blr
211;
212; P9-LABEL: setrnd_toposinf:
213; P9:       # %bb.0: # %entry
214; P9-NEXT:    mffscrni 0, 2
215; P9-NEXT:    blr
216;
217; DM-LABEL: setrnd_toposinf:
218; DM:       # %bb.0: # %entry
219; DM-NEXT:    mtfsb1 30
220; DM-NEXT:    mtfsb0 31
221; DM-NEXT:    blr
222entry:
223  call void @llvm.set.rounding(i32 2)
224  ret void
225}
226
227define void @setrnd_toneginf() #0 {
228; PPC32-LABEL: setrnd_toneginf:
229; PPC32:       # %bb.0: # %entry
230; PPC32-NEXT:    mtfsb1 30
231; PPC32-NEXT:    mtfsb1 31
232; PPC32-NEXT:    blr
233;
234; PPC64-LABEL: setrnd_toneginf:
235; PPC64:       # %bb.0: # %entry
236; PPC64-NEXT:    mtfsb1 30
237; PPC64-NEXT:    mtfsb1 31
238; PPC64-NEXT:    blr
239;
240; PPC64LE-LABEL: setrnd_toneginf:
241; PPC64LE:       # %bb.0: # %entry
242; PPC64LE-NEXT:    mtfsb1 30
243; PPC64LE-NEXT:    mtfsb1 31
244; PPC64LE-NEXT:    blr
245;
246; P9_32-LABEL: setrnd_toneginf:
247; P9_32:       # %bb.0: # %entry
248; P9_32-NEXT:    mffscrni 0, 3
249; P9_32-NEXT:    blr
250;
251; P9-LABEL: setrnd_toneginf:
252; P9:       # %bb.0: # %entry
253; P9-NEXT:    mffscrni 0, 3
254; P9-NEXT:    blr
255;
256; DM-LABEL: setrnd_toneginf:
257; DM:       # %bb.0: # %entry
258; DM-NEXT:    mtfsb1 30
259; DM-NEXT:    mtfsb1 31
260; DM-NEXT:    blr
261entry:
262  call void @llvm.set.rounding(i32 3)
263  ret void
264}
265
266define void @setrnd_var(i32 %x) #0 {
267; PPC32-LABEL: setrnd_var:
268; PPC32:       # %bb.0: # %entry
269; PPC32-NEXT:    stwu 1, -16(1)
270; PPC32-NEXT:    mffs 0
271; PPC32-NEXT:    stfd 0, 8(1)
272; PPC32-NEXT:    clrlwi 4, 3, 30
273; PPC32-NEXT:    lwz 5, 12(1)
274; PPC32-NEXT:    rlwinm 3, 3, 31, 31, 31
275; PPC32-NEXT:    xor 3, 3, 4
276; PPC32-NEXT:    xori 3, 3, 1
277; PPC32-NEXT:    rlwimi 5, 3, 0, 30, 31
278; PPC32-NEXT:    stw 5, 12(1)
279; PPC32-NEXT:    lfd 0, 8(1)
280; PPC32-NEXT:    mtfsf 255, 0
281; PPC32-NEXT:    addi 1, 1, 16
282; PPC32-NEXT:    blr
283;
284; PPC64-LABEL: setrnd_var:
285; PPC64:       # %bb.0: # %entry
286; PPC64-NEXT:    mffs 0
287; PPC64-NEXT:    stfd 0, -16(1)
288; PPC64-NEXT:    clrlwi 4, 3, 30
289; PPC64-NEXT:    rlwinm 3, 3, 31, 31, 31
290; PPC64-NEXT:    ld 5, -16(1)
291; PPC64-NEXT:    xor 3, 3, 4
292; PPC64-NEXT:    xori 3, 3, 1
293; PPC64-NEXT:    clrldi 3, 3, 32
294; PPC64-NEXT:    rldimi 5, 3, 0, 62
295; PPC64-NEXT:    std 5, -8(1)
296; PPC64-NEXT:    lfd 0, -8(1)
297; PPC64-NEXT:    mtfsf 255, 0
298; PPC64-NEXT:    blr
299;
300; PPC64LE-LABEL: setrnd_var:
301; PPC64LE:       # %bb.0: # %entry
302; PPC64LE-NEXT:    mffs 0
303; PPC64LE-NEXT:    clrlwi 4, 3, 30
304; PPC64LE-NEXT:    rlwinm 3, 3, 31, 31, 31
305; PPC64LE-NEXT:    stfd 0, -16(1)
306; PPC64LE-NEXT:    xor 3, 3, 4
307; PPC64LE-NEXT:    ld 4, -16(1)
308; PPC64LE-NEXT:    xori 3, 3, 1
309; PPC64LE-NEXT:    clrldi 3, 3, 32
310; PPC64LE-NEXT:    rldimi 4, 3, 0, 62
311; PPC64LE-NEXT:    std 4, -8(1)
312; PPC64LE-NEXT:    lfd 0, -8(1)
313; PPC64LE-NEXT:    mtfsf 255, 0
314; PPC64LE-NEXT:    blr
315;
316; P9_32-LABEL: setrnd_var:
317; P9_32:       # %bb.0: # %entry
318; P9_32-NEXT:    stwu 1, -16(1)
319; P9_32-NEXT:    clrlwi 4, 3, 30
320; P9_32-NEXT:    rlwinm 3, 3, 31, 31, 31
321; P9_32-NEXT:    xor 3, 3, 4
322; P9_32-NEXT:    xori 3, 3, 1
323; P9_32-NEXT:    stw 3, 12(1)
324; P9_32-NEXT:    lfd 0, 8(1)
325; P9_32-NEXT:    mffscrn 0, 0
326; P9_32-NEXT:    addi 1, 1, 16
327; P9_32-NEXT:    blr
328;
329; P9-LABEL: setrnd_var:
330; P9:       # %bb.0: # %entry
331; P9-NEXT:    clrlwi 4, 3, 30
332; P9-NEXT:    rlwinm 3, 3, 31, 31, 31
333; P9-NEXT:    xor 3, 3, 4
334; P9-NEXT:    xori 3, 3, 1
335; P9-NEXT:    mtfprd 0, 3
336; P9-NEXT:    mffscrn 0, 0
337; P9-NEXT:    blr
338;
339; DM-LABEL: setrnd_var:
340; DM:       # %bb.0: # %entry
341; DM-NEXT:    clrlwi 4, 3, 30
342; DM-NEXT:    rlwinm 3, 3, 31, 31, 31
343; DM-NEXT:    xor 3, 3, 4
344; DM-NEXT:    xori 3, 3, 1
345; DM-NEXT:    clrldi 3, 3, 32
346; DM-NEXT:    mffs 0
347; DM-NEXT:    mffprd 4, 0
348; DM-NEXT:    rldimi 4, 3, 0, 62
349; DM-NEXT:    mtfprd 0, 4
350; DM-NEXT:    mtfsf 255, 0
351; DM-NEXT:    blr
352entry:
353  call void @llvm.set.rounding(i32 %x)
354  ret void
355}
356
357declare i32 @llvm.get.rounding() #0
358declare void @llvm.set.rounding(i32) #0
359
360attributes #0 = { nounwind }
361