Skip to content

Commit 3d598c3

Browse files
authored
[SPARC] Remove CCIfConsecutiveRegs for f128 returns (#170133)
It appears that using it will result in callers mistakenly thinking that complex f128 returns is done the sret-way, when it should be returned in registers.
1 parent 58dd3a4 commit 3d598c3

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

llvm/lib/Target/Sparc/SparcCallingConv.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def RetCC_Sparc32 : CallingConv<[
3737
CCIfType<[f32], CCAssignToReg<[F0, F1, F2, F3]>>,
3838
CCIfType<[f64], CCAssignToReg<[D0, D1]>>,
3939
// FIXME GCC in soft-float mode passes f128 as if 2xi64 values.
40-
CCIfType<[f128], CCIfInReg<CCIfConsecutiveRegs<CCAssignToReg<[Q0, Q1]>>>>,
40+
CCIfType<[f128], CCIfInReg<CCAssignToReg<[Q0, Q1]>>>,
4141
CCIfType<[v2i32], CCCustom<"CC_Sparc_Assign_Ret_Split_64">>
4242
]>;
4343

llvm/test/CodeGen/SPARC/fp128-abi.ll

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,78 @@ define fp128 @f128_direct_spill(i32 %o0, i32 %o1, i32 %o2, i32 %o3, i32 %o4, i32
8787
ret fp128 %ret
8888
}
8989
declare fp128 @f128_callee_spill(i32 %o0, i32 %o1, i32 %o2, i32 %o3, i32 %o4, i32 %o5, fp128 %a)
90+
91+
define inreg { fp128, fp128 } @f128_complex(fp128 %num) nounwind {
92+
; SPARC32-LABEL: f128_complex:
93+
; SPARC32: ! %bb.0:
94+
; SPARC32-NEXT: save %sp, -192, %sp
95+
; SPARC32-NEXT: ldd [%i0], %f0
96+
; SPARC32-NEXT: ldd [%i0+8], %f4
97+
; SPARC32-NEXT: std %f4, [%fp+-24]
98+
; SPARC32-NEXT: std %f0, [%fp+-32]
99+
; SPARC32-NEXT: std %f4, [%fp+-8]
100+
; SPARC32-NEXT: add %fp, -16, %o0
101+
; SPARC32-NEXT: add %fp, -32, %o1
102+
; SPARC32-NEXT: call f128_complex_callee
103+
; SPARC32-NEXT: std %f0, [%fp+-16]
104+
; SPARC32-NEXT: sethi %hi(.LCPI2_0), %i0
105+
; SPARC32-NEXT: ldd [%i0+%lo(.LCPI2_0)], %f8
106+
; SPARC32-NEXT: add %i0, %lo(.LCPI2_0), %i0
107+
; SPARC32-NEXT: ldd [%i0+8], %f12
108+
; SPARC32-NEXT: std %f4, [%fp+-96]
109+
; SPARC32-NEXT: std %f6, [%fp+-88] ! 16-byte Folded Spill
110+
; SPARC32-NEXT: std %f8, [%fp+-80]
111+
; SPARC32-NEXT: std %f12, [%fp+-72]
112+
; SPARC32-NEXT: std %f2, [%fp+-56]
113+
; SPARC32-NEXT: std %f0, [%fp+-64]
114+
; SPARC32-NEXT: add %fp, -48, %i0
115+
; SPARC32-NEXT: add %fp, -64, %o0
116+
; SPARC32-NEXT: add %fp, -80, %o1
117+
; SPARC32-NEXT: call _Q_add
118+
; SPARC32-NEXT: st %i0, [%sp+64]
119+
; SPARC32-NEXT: unimp 16
120+
; SPARC32-NEXT: ldd [%fp+-48], %f0
121+
; SPARC32-NEXT: ldd [%fp+-40], %f2
122+
; SPARC32-NEXT: ldd [%fp+-96], %f4
123+
; SPARC32-NEXT: ldd [%fp+-88], %f6 ! 16-byte Folded Reload
124+
; SPARC32-NEXT: ret
125+
; SPARC32-NEXT: restore
126+
;
127+
; SPARC64-LABEL: f128_complex:
128+
; SPARC64: ! %bb.0:
129+
; SPARC64-NEXT: save %sp, -240, %sp
130+
; SPARC64-NEXT: fmovd %f0, %f4
131+
; SPARC64-NEXT: fmovd %f2, %f6
132+
; SPARC64-NEXT: call f128_complex_callee
133+
; SPARC64-NEXT: nop
134+
; SPARC64-NEXT: std %f4, [%fp+1983]
135+
; SPARC64-NEXT: std %f6, [%fp+1991] ! 16-byte Folded Spill
136+
; SPARC64-NEXT: sethi %h44(.LCPI2_0), %i0
137+
; SPARC64-NEXT: add %i0, %m44(.LCPI2_0), %i0
138+
; SPARC64-NEXT: sllx %i0, 12, %i0
139+
; SPARC64-NEXT: ldd [%i0+%l44(.LCPI2_0)], %f4
140+
; SPARC64-NEXT: add %i0, %l44(.LCPI2_0), %i0
141+
; SPARC64-NEXT: ldd [%i0+8], %f8
142+
; SPARC64-NEXT: std %f2, [%fp+2023]
143+
; SPARC64-NEXT: std %f0, [%fp+2015]
144+
; SPARC64-NEXT: std %f4, [%fp+1999]
145+
; SPARC64-NEXT: std %f8, [%fp+2007]
146+
; SPARC64-NEXT: add %fp, 2031, %o0
147+
; SPARC64-NEXT: add %fp, 2015, %o1
148+
; SPARC64-NEXT: call _Qp_add
149+
; SPARC64-NEXT: add %fp, 1999, %o2
150+
; SPARC64-NEXT: ldd [%fp+2031], %f0
151+
; SPARC64-NEXT: ldd [%fp+2039], %f2
152+
; SPARC64-NEXT: ldd [%fp+1983], %f4
153+
; SPARC64-NEXT: ldd [%fp+1991], %f6 ! 16-byte Folded Reload
154+
; SPARC64-NEXT: ret
155+
; SPARC64-NEXT: restore
156+
%call = call inreg { fp128, fp128 } @f128_complex_callee(fp128 %num, fp128 %num)
157+
%real = extractvalue { fp128, fp128 } %call, 0
158+
%imag = extractvalue { fp128, fp128 } %call, 1
159+
%add = fadd fp128 %real, 0xL00000000000000003FFF000000000000
160+
%tmp = insertvalue { fp128, fp128 } poison, fp128 %add, 0
161+
%ret = insertvalue { fp128, fp128 } %tmp, fp128 %imag, 1
162+
ret { fp128, fp128 } %ret
163+
}
164+
declare inreg { fp128, fp128 } @f128_complex_callee(fp128 %a, fp128 %b)

0 commit comments

Comments
 (0)