[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / RISCV / calling-conv-lp64.ll
blobfaa68185a9f8887bdac948f78c2ee5972fdaeb65
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck -check-prefix=RV64I-FPELIM %s
4 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs -frame-pointer=all < %s \
5 ; RUN:   | FileCheck -check-prefix=RV64I-WITHFP %s
7 ; As well as calling convention details, we check that ra and fp are
8 ; consistently stored to fp-8 and fp-16.
10 ; Any tests that would have identical output for some combination of the lp64*
11 ; ABIs belong in calling-conv-*-common.ll. This file contains tests that will
12 ; have different output across those ABIs. i.e. where some arguments would be
13 ; passed according to the floating point ABI.
15 ; TODO: softened float values can be passed anyext.
17 define i64 @callee_float_in_regs(i64 %a, float %b) nounwind {
18 ; RV64I-FPELIM-LABEL: callee_float_in_regs:
19 ; RV64I-FPELIM:       # %bb.0:
20 ; RV64I-FPELIM-NEXT:    addi sp, sp, -16
21 ; RV64I-FPELIM-NEXT:    sd ra, 8(sp)
22 ; RV64I-FPELIM-NEXT:    sd s0, 0(sp)
23 ; RV64I-FPELIM-NEXT:    mv s0, a0
24 ; RV64I-FPELIM-NEXT:    slli a0, a1, 32
25 ; RV64I-FPELIM-NEXT:    srli a0, a0, 32
26 ; RV64I-FPELIM-NEXT:    call __fixsfdi
27 ; RV64I-FPELIM-NEXT:    add a0, s0, a0
28 ; RV64I-FPELIM-NEXT:    ld s0, 0(sp)
29 ; RV64I-FPELIM-NEXT:    ld ra, 8(sp)
30 ; RV64I-FPELIM-NEXT:    addi sp, sp, 16
31 ; RV64I-FPELIM-NEXT:    ret
33 ; RV64I-WITHFP-LABEL: callee_float_in_regs:
34 ; RV64I-WITHFP:       # %bb.0:
35 ; RV64I-WITHFP-NEXT:    addi sp, sp, -32
36 ; RV64I-WITHFP-NEXT:    sd ra, 24(sp)
37 ; RV64I-WITHFP-NEXT:    sd s0, 16(sp)
38 ; RV64I-WITHFP-NEXT:    sd s1, 8(sp)
39 ; RV64I-WITHFP-NEXT:    addi s0, sp, 32
40 ; RV64I-WITHFP-NEXT:    mv s1, a0
41 ; RV64I-WITHFP-NEXT:    slli a0, a1, 32
42 ; RV64I-WITHFP-NEXT:    srli a0, a0, 32
43 ; RV64I-WITHFP-NEXT:    call __fixsfdi
44 ; RV64I-WITHFP-NEXT:    add a0, s1, a0
45 ; RV64I-WITHFP-NEXT:    ld s1, 8(sp)
46 ; RV64I-WITHFP-NEXT:    ld s0, 16(sp)
47 ; RV64I-WITHFP-NEXT:    ld ra, 24(sp)
48 ; RV64I-WITHFP-NEXT:    addi sp, sp, 32
49 ; RV64I-WITHFP-NEXT:    ret
50   %b_fptosi = fptosi float %b to i64
51   %1 = add i64 %a, %b_fptosi
52   ret i64 %1
55 define i64 @caller_float_in_regs() nounwind {
56 ; RV64I-FPELIM-LABEL: caller_float_in_regs:
57 ; RV64I-FPELIM:       # %bb.0:
58 ; RV64I-FPELIM-NEXT:    addi sp, sp, -16
59 ; RV64I-FPELIM-NEXT:    sd ra, 8(sp)
60 ; RV64I-FPELIM-NEXT:    addi a0, zero, 1
61 ; RV64I-FPELIM-NEXT:    lui a1, 262144
62 ; RV64I-FPELIM-NEXT:    call callee_float_in_regs
63 ; RV64I-FPELIM-NEXT:    ld ra, 8(sp)
64 ; RV64I-FPELIM-NEXT:    addi sp, sp, 16
65 ; RV64I-FPELIM-NEXT:    ret
67 ; RV64I-WITHFP-LABEL: caller_float_in_regs:
68 ; RV64I-WITHFP:       # %bb.0:
69 ; RV64I-WITHFP-NEXT:    addi sp, sp, -16
70 ; RV64I-WITHFP-NEXT:    sd ra, 8(sp)
71 ; RV64I-WITHFP-NEXT:    sd s0, 0(sp)
72 ; RV64I-WITHFP-NEXT:    addi s0, sp, 16
73 ; RV64I-WITHFP-NEXT:    addi a0, zero, 1
74 ; RV64I-WITHFP-NEXT:    lui a1, 262144
75 ; RV64I-WITHFP-NEXT:    call callee_float_in_regs
76 ; RV64I-WITHFP-NEXT:    ld s0, 0(sp)
77 ; RV64I-WITHFP-NEXT:    ld ra, 8(sp)
78 ; RV64I-WITHFP-NEXT:    addi sp, sp, 16
79 ; RV64I-WITHFP-NEXT:    ret
80   %1 = call i64 @callee_float_in_regs(i64 1, float 2.0)
81   ret i64 %1
84 define i64 @callee_float_on_stack(i128 %a, i128 %b, i128 %c, i128 %d, float %e) nounwind {
85 ; RV64I-FPELIM-LABEL: callee_float_on_stack:
86 ; RV64I-FPELIM:       # %bb.0:
87 ; RV64I-FPELIM-NEXT:    lw a0, 0(sp)
88 ; RV64I-FPELIM-NEXT:    ret
90 ; RV64I-WITHFP-LABEL: callee_float_on_stack:
91 ; RV64I-WITHFP:       # %bb.0:
92 ; RV64I-WITHFP-NEXT:    addi sp, sp, -16
93 ; RV64I-WITHFP-NEXT:    sd ra, 8(sp)
94 ; RV64I-WITHFP-NEXT:    sd s0, 0(sp)
95 ; RV64I-WITHFP-NEXT:    addi s0, sp, 16
96 ; RV64I-WITHFP-NEXT:    lw a0, 0(s0)
97 ; RV64I-WITHFP-NEXT:    ld s0, 0(sp)
98 ; RV64I-WITHFP-NEXT:    ld ra, 8(sp)
99 ; RV64I-WITHFP-NEXT:    addi sp, sp, 16
100 ; RV64I-WITHFP-NEXT:    ret
101   %1 = trunc i128 %d to i64
102   %2 = bitcast float %e to i32
103   %3 = sext i32 %2 to i64
104   %4 = add i64 %1, %3
105   ret i64 %3
108 define i64 @caller_float_on_stack() nounwind {
109 ; RV64I-FPELIM-LABEL: caller_float_on_stack:
110 ; RV64I-FPELIM:       # %bb.0:
111 ; RV64I-FPELIM-NEXT:    addi sp, sp, -16
112 ; RV64I-FPELIM-NEXT:    sd ra, 8(sp)
113 ; RV64I-FPELIM-NEXT:    lui a0, 264704
114 ; RV64I-FPELIM-NEXT:    sd a0, 0(sp)
115 ; RV64I-FPELIM-NEXT:    addi a0, zero, 1
116 ; RV64I-FPELIM-NEXT:    mv a1, zero
117 ; RV64I-FPELIM-NEXT:    addi a2, zero, 2
118 ; RV64I-FPELIM-NEXT:    mv a3, zero
119 ; RV64I-FPELIM-NEXT:    addi a4, zero, 3
120 ; RV64I-FPELIM-NEXT:    mv a5, zero
121 ; RV64I-FPELIM-NEXT:    addi a6, zero, 4
122 ; RV64I-FPELIM-NEXT:    mv a7, zero
123 ; RV64I-FPELIM-NEXT:    call callee_float_on_stack
124 ; RV64I-FPELIM-NEXT:    ld ra, 8(sp)
125 ; RV64I-FPELIM-NEXT:    addi sp, sp, 16
126 ; RV64I-FPELIM-NEXT:    ret
128 ; RV64I-WITHFP-LABEL: caller_float_on_stack:
129 ; RV64I-WITHFP:       # %bb.0:
130 ; RV64I-WITHFP-NEXT:    addi sp, sp, -32
131 ; RV64I-WITHFP-NEXT:    sd ra, 24(sp)
132 ; RV64I-WITHFP-NEXT:    sd s0, 16(sp)
133 ; RV64I-WITHFP-NEXT:    addi s0, sp, 32
134 ; RV64I-WITHFP-NEXT:    lui a0, 264704
135 ; RV64I-WITHFP-NEXT:    sd a0, 0(sp)
136 ; RV64I-WITHFP-NEXT:    addi a0, zero, 1
137 ; RV64I-WITHFP-NEXT:    mv a1, zero
138 ; RV64I-WITHFP-NEXT:    addi a2, zero, 2
139 ; RV64I-WITHFP-NEXT:    mv a3, zero
140 ; RV64I-WITHFP-NEXT:    addi a4, zero, 3
141 ; RV64I-WITHFP-NEXT:    mv a5, zero
142 ; RV64I-WITHFP-NEXT:    addi a6, zero, 4
143 ; RV64I-WITHFP-NEXT:    mv a7, zero
144 ; RV64I-WITHFP-NEXT:    call callee_float_on_stack
145 ; RV64I-WITHFP-NEXT:    ld s0, 16(sp)
146 ; RV64I-WITHFP-NEXT:    ld ra, 24(sp)
147 ; RV64I-WITHFP-NEXT:    addi sp, sp, 32
148 ; RV64I-WITHFP-NEXT:    ret
149   %1 = call i64 @callee_float_on_stack(i128 1, i128 2, i128 3, i128 4, float 5.0)
150   ret i64 %1
153 define float @callee_tiny_scalar_ret() nounwind {
154 ; RV64I-FPELIM-LABEL: callee_tiny_scalar_ret:
155 ; RV64I-FPELIM:       # %bb.0:
156 ; RV64I-FPELIM-NEXT:    lui a0, 260096
157 ; RV64I-FPELIM-NEXT:    ret
159 ; RV64I-WITHFP-LABEL: callee_tiny_scalar_ret:
160 ; RV64I-WITHFP:       # %bb.0:
161 ; RV64I-WITHFP-NEXT:    addi sp, sp, -16
162 ; RV64I-WITHFP-NEXT:    sd ra, 8(sp)
163 ; RV64I-WITHFP-NEXT:    sd s0, 0(sp)
164 ; RV64I-WITHFP-NEXT:    addi s0, sp, 16
165 ; RV64I-WITHFP-NEXT:    lui a0, 260096
166 ; RV64I-WITHFP-NEXT:    ld s0, 0(sp)
167 ; RV64I-WITHFP-NEXT:    ld ra, 8(sp)
168 ; RV64I-WITHFP-NEXT:    addi sp, sp, 16
169 ; RV64I-WITHFP-NEXT:    ret
170   ret float 1.0
173 ; The sign extension of the float return is necessary, as softened floats are
174 ; passed anyext.
176 define i64 @caller_tiny_scalar_ret() nounwind {
177 ; RV64I-FPELIM-LABEL: caller_tiny_scalar_ret:
178 ; RV64I-FPELIM:       # %bb.0:
179 ; RV64I-FPELIM-NEXT:    addi sp, sp, -16
180 ; RV64I-FPELIM-NEXT:    sd ra, 8(sp)
181 ; RV64I-FPELIM-NEXT:    call callee_tiny_scalar_ret
182 ; RV64I-FPELIM-NEXT:    sext.w a0, a0
183 ; RV64I-FPELIM-NEXT:    ld ra, 8(sp)
184 ; RV64I-FPELIM-NEXT:    addi sp, sp, 16
185 ; RV64I-FPELIM-NEXT:    ret
187 ; RV64I-WITHFP-LABEL: caller_tiny_scalar_ret:
188 ; RV64I-WITHFP:       # %bb.0:
189 ; RV64I-WITHFP-NEXT:    addi sp, sp, -16
190 ; RV64I-WITHFP-NEXT:    sd ra, 8(sp)
191 ; RV64I-WITHFP-NEXT:    sd s0, 0(sp)
192 ; RV64I-WITHFP-NEXT:    addi s0, sp, 16
193 ; RV64I-WITHFP-NEXT:    call callee_tiny_scalar_ret
194 ; RV64I-WITHFP-NEXT:    sext.w a0, a0
195 ; RV64I-WITHFP-NEXT:    ld s0, 0(sp)
196 ; RV64I-WITHFP-NEXT:    ld ra, 8(sp)
197 ; RV64I-WITHFP-NEXT:    addi sp, sp, 16
198 ; RV64I-WITHFP-NEXT:    ret
199   %1 = call float @callee_tiny_scalar_ret()
200   %2 = bitcast float %1 to i32
201   %3 = sext i32 %2 to i64
202   ret i64 %3