xref: /llvm-project/llvm/test/CodeGen/PowerPC/fp128-bitcast-after-operation.ll (revision db9252b115ce699a98b3a0ab80504da1364cc311)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=PPC64-P8,PPC64-P8-LE
3; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=PPC64,PPC64-LE
4; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=PPC64-P8,PPC64-P8-BE
5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=PPC64,PPC64-BE
6; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s -check-prefix=PPC32
7
8define i128 @test_abs(ppc_fp128 %x) nounwind  {
9; PPC64-P8-LABEL: test_abs:
10; PPC64-P8:       # %bb.0: # %entry
11; PPC64-P8-NEXT:    mffprd 3, 1
12; PPC64-P8-NEXT:    mffprd 4, 2
13; PPC64-P8-NEXT:    rldicr 5, 3, 0, 0
14; PPC64-P8-NEXT:    xor 3, 3, 5
15; PPC64-P8-NEXT:    xor 4, 4, 5
16; PPC64-P8-NEXT:    blr
17;
18; PPC64-LABEL: test_abs:
19; PPC64:       # %bb.0: # %entry
20; PPC64-NEXT:    stfd 1, -16(1)
21; PPC64-NEXT:    stfd 2, -8(1)
22; PPC64-NEXT:    ld 3, -16(1)
23; PPC64-NEXT:    ld 4, -8(1)
24; PPC64-NEXT:    rldicr 5, 3, 0, 0
25; PPC64-NEXT:    xor 3, 3, 5
26; PPC64-NEXT:    xor 4, 4, 5
27; PPC64-NEXT:    blr
28;
29; PPC32-LABEL: test_abs:
30; PPC32:       # %bb.0: # %entry
31; PPC32-NEXT:    stwu 1, -32(1)
32; PPC32-NEXT:    stfd 1, 24(1)
33; PPC32-NEXT:    stfd 2, 16(1)
34; PPC32-NEXT:    lwz 3, 24(1)
35; PPC32-NEXT:    lwz 5, 16(1)
36; PPC32-NEXT:    rlwinm 7, 3, 0, 0, 0
37; PPC32-NEXT:    lwz 4, 28(1)
38; PPC32-NEXT:    xor 3, 3, 7
39; PPC32-NEXT:    lwz 6, 20(1)
40; PPC32-NEXT:    xor 5, 5, 7
41; PPC32-NEXT:    addi 1, 1, 32
42; PPC32-NEXT:    blr
43entry:
44	%0 = tail call ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128 %x)
45	%1 = bitcast ppc_fp128 %0 to i128
46	ret i128 %1
47}
48
49define i128 @test_neg(ppc_fp128 %x) nounwind  {
50; PPC64-P8-LABEL: test_neg:
51; PPC64-P8:       # %bb.0: # %entry
52; PPC64-P8-NEXT:    mffprd 4, 2
53; PPC64-P8-NEXT:    mffprd 3, 1
54; PPC64-P8-NEXT:    li 5, 1
55; PPC64-P8-NEXT:    rldic 5, 5, 63, 0
56; PPC64-P8-NEXT:    xor 3, 3, 5
57; PPC64-P8-NEXT:    xor 4, 4, 5
58; PPC64-P8-NEXT:    blr
59;
60; PPC64-LABEL: test_neg:
61; PPC64:       # %bb.0: # %entry
62; PPC64-NEXT:    stfd 2, -8(1)
63; PPC64-NEXT:    stfd 1, -16(1)
64; PPC64-NEXT:    li 5, 1
65; PPC64-NEXT:    ld 4, -8(1)
66; PPC64-NEXT:    ld 3, -16(1)
67; PPC64-NEXT:    rldic 5, 5, 63, 0
68; PPC64-NEXT:    xor 3, 3, 5
69; PPC64-NEXT:    xor 4, 4, 5
70; PPC64-NEXT:    blr
71;
72; PPC32-LABEL: test_neg:
73; PPC32:       # %bb.0: # %entry
74; PPC32-NEXT:    stwu 1, -32(1)
75; PPC32-NEXT:    stfd 1, 24(1)
76; PPC32-NEXT:    stfd 2, 16(1)
77; PPC32-NEXT:    lwz 5, 16(1)
78; PPC32-NEXT:    lwz 3, 24(1)
79; PPC32-NEXT:    lwz 4, 28(1)
80; PPC32-NEXT:    xoris 5, 5, 32768
81; PPC32-NEXT:    lwz 6, 20(1)
82; PPC32-NEXT:    xoris 3, 3, 32768
83; PPC32-NEXT:    addi 1, 1, 32
84; PPC32-NEXT:    blr
85entry:
86	%0 = fsub ppc_fp128 0xM80000000000000000000000000000000, %x
87	%1 = bitcast ppc_fp128 %0 to i128
88	ret i128 %1
89}
90
91define i128 @test_copysign(ppc_fp128 %x, ppc_fp128 %y) nounwind  {
92; PPC64-P8-LE-LABEL: test_copysign:
93; PPC64-P8-LE:       # %bb.0: # %entry
94; PPC64-P8-LE-NEXT:    mflr 0
95; PPC64-P8-LE-NEXT:    stdu 1, -32(1)
96; PPC64-P8-LE-NEXT:    std 0, 48(1)
97; PPC64-P8-LE-NEXT:    bl copysignl
98; PPC64-P8-LE-NEXT:    nop
99; PPC64-P8-LE-NEXT:    mffprd 3, 1
100; PPC64-P8-LE-NEXT:    mffprd 4, 2
101; PPC64-P8-LE-NEXT:    addi 1, 1, 32
102; PPC64-P8-LE-NEXT:    ld 0, 16(1)
103; PPC64-P8-LE-NEXT:    mtlr 0
104; PPC64-P8-LE-NEXT:    blr
105;
106; PPC64-LE-LABEL: test_copysign:
107; PPC64-LE:       # %bb.0: # %entry
108; PPC64-LE-NEXT:    mflr 0
109; PPC64-LE-NEXT:    stdu 1, -48(1)
110; PPC64-LE-NEXT:    std 0, 64(1)
111; PPC64-LE-NEXT:    bl copysignl
112; PPC64-LE-NEXT:    nop
113; PPC64-LE-NEXT:    stfd 1, 32(1)
114; PPC64-LE-NEXT:    stfd 2, 40(1)
115; PPC64-LE-NEXT:    ld 3, 32(1)
116; PPC64-LE-NEXT:    ld 4, 40(1)
117; PPC64-LE-NEXT:    addi 1, 1, 48
118; PPC64-LE-NEXT:    ld 0, 16(1)
119; PPC64-LE-NEXT:    mtlr 0
120; PPC64-LE-NEXT:    blr
121;
122; PPC64-P8-BE-LABEL: test_copysign:
123; PPC64-P8-BE:       # %bb.0: # %entry
124; PPC64-P8-BE-NEXT:    mflr 0
125; PPC64-P8-BE-NEXT:    stdu 1, -112(1)
126; PPC64-P8-BE-NEXT:    std 0, 128(1)
127; PPC64-P8-BE-NEXT:    bl copysignl
128; PPC64-P8-BE-NEXT:    nop
129; PPC64-P8-BE-NEXT:    mffprd 3, 1
130; PPC64-P8-BE-NEXT:    mffprd 4, 2
131; PPC64-P8-BE-NEXT:    addi 1, 1, 112
132; PPC64-P8-BE-NEXT:    ld 0, 16(1)
133; PPC64-P8-BE-NEXT:    mtlr 0
134; PPC64-P8-BE-NEXT:    blr
135;
136; PPC64-BE-LABEL: test_copysign:
137; PPC64-BE:       # %bb.0: # %entry
138; PPC64-BE-NEXT:    mflr 0
139; PPC64-BE-NEXT:    stdu 1, -128(1)
140; PPC64-BE-NEXT:    std 0, 144(1)
141; PPC64-BE-NEXT:    bl copysignl
142; PPC64-BE-NEXT:    nop
143; PPC64-BE-NEXT:    stfd 1, 112(1)
144; PPC64-BE-NEXT:    stfd 2, 120(1)
145; PPC64-BE-NEXT:    ld 3, 112(1)
146; PPC64-BE-NEXT:    ld 4, 120(1)
147; PPC64-BE-NEXT:    addi 1, 1, 128
148; PPC64-BE-NEXT:    ld 0, 16(1)
149; PPC64-BE-NEXT:    mtlr 0
150; PPC64-BE-NEXT:    blr
151;
152; PPC32-LABEL: test_copysign:
153; PPC32:       # %bb.0: # %entry
154; PPC32-NEXT:    mflr 0
155; PPC32-NEXT:    stwu 1, -80(1)
156; PPC32-NEXT:    stw 0, 84(1)
157; PPC32-NEXT:    stfd 1, 32(1)
158; PPC32-NEXT:    lwz 3, 36(1)
159; PPC32-NEXT:    stfd 2, 24(1)
160; PPC32-NEXT:    stw 3, 52(1)
161; PPC32-NEXT:    lwz 3, 32(1)
162; PPC32-NEXT:    stfd 3, 56(1)
163; PPC32-NEXT:    stw 3, 48(1)
164; PPC32-NEXT:    lwz 3, 28(1)
165; PPC32-NEXT:    lfd 4, 64(1)
166; PPC32-NEXT:    stw 3, 44(1)
167; PPC32-NEXT:    lwz 3, 24(1)
168; PPC32-NEXT:    lfd 1, 48(1)
169; PPC32-NEXT:    stw 3, 40(1)
170; PPC32-NEXT:    lwz 3, 60(1)
171; PPC32-NEXT:    lfd 2, 40(1)
172; PPC32-NEXT:    stw 3, 76(1)
173; PPC32-NEXT:    lwz 3, 56(1)
174; PPC32-NEXT:    stw 3, 72(1)
175; PPC32-NEXT:    lfd 3, 72(1)
176; PPC32-NEXT:    bl copysignl
177; PPC32-NEXT:    stfd 1, 8(1)
178; PPC32-NEXT:    stfd 2, 16(1)
179; PPC32-NEXT:    lwz 3, 8(1)
180; PPC32-NEXT:    lwz 4, 12(1)
181; PPC32-NEXT:    lwz 5, 16(1)
182; PPC32-NEXT:    lwz 6, 20(1)
183; PPC32-NEXT:    lwz 0, 84(1)
184; PPC32-NEXT:    addi 1, 1, 80
185; PPC32-NEXT:    mtlr 0
186; PPC32-NEXT:    blr
187entry:
188	%0 = tail call ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128 %x, ppc_fp128 %y)
189	%1 = bitcast ppc_fp128 %0 to i128
190	ret i128 %1
191}
192
193define i128 @test_copysign_const(ppc_fp128 %x) nounwind  {
194; PPC64-P8-LABEL: test_copysign_const:
195; PPC64-P8:       # %bb.0: # %entry
196; PPC64-P8-NEXT:    mffprd 3, 1
197; PPC64-P8-NEXT:    li 5, 3019
198; PPC64-P8-NEXT:    rldic 5, 5, 52, 0
199; PPC64-P8-NEXT:    rldicr 4, 3, 0, 0
200; PPC64-P8-NEXT:    li 3, 16399
201; PPC64-P8-NEXT:    rldic 3, 3, 48, 1
202; PPC64-P8-NEXT:    or 3, 4, 3
203; PPC64-P8-NEXT:    xor 4, 4, 5
204; PPC64-P8-NEXT:    blr
205;
206; PPC64-LABEL: test_copysign_const:
207; PPC64:       # %bb.0: # %entry
208; PPC64-NEXT:    stfd 1, -8(1)
209; PPC64-NEXT:    li 5, 3019
210; PPC64-NEXT:    ld 3, -8(1)
211; PPC64-NEXT:    rldic 5, 5, 52, 0
212; PPC64-NEXT:    rldicr 4, 3, 0, 0
213; PPC64-NEXT:    li 3, 16399
214; PPC64-NEXT:    rldic 3, 3, 48, 1
215; PPC64-NEXT:    or 3, 4, 3
216; PPC64-NEXT:    xor 4, 4, 5
217; PPC64-NEXT:    blr
218;
219; PPC32-LABEL: test_copysign_const:
220; PPC32:       # %bb.0: # %entry
221; PPC32-NEXT:    stwu 1, -32(1)
222; PPC32-NEXT:    stfd 1, 24(1)
223; PPC32-NEXT:    li 6, 0
224; PPC32-NEXT:    lwz 3, 24(1)
225; PPC32-NEXT:    rlwinm 4, 3, 0, 0, 0
226; PPC32-NEXT:    oris 3, 4, 16399
227; PPC32-NEXT:    xoris 5, 4, 48304
228; PPC32-NEXT:    li 4, 0
229; PPC32-NEXT:    addi 1, 1, 32
230; PPC32-NEXT:    blr
231entry:
232	%0 = tail call ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128 0xM400F000000000000BCB0000000000000, ppc_fp128 %x)
233	%1 = bitcast ppc_fp128 %0 to i128
234	ret i128 %1
235}
236
237declare ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128)
238declare ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128, ppc_fp128)
239