xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/2013-04-16-AAPCS-C5-vs-VFP.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker;Check 5.5 Parameter Passing --> Stage C --> C.5 statement, when NSAA is not
2*9880d681SAndroid Build Coastguard Worker;equal to SP.
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; Our purpose: make NSAA != SP, and only after start to use GPRs, then pass
5*9880d681SAndroid Build Coastguard Worker;              byval parameter and check that it goes to stack only.
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Worker;Co-Processor register candidates may be either in VFP or in stack, so after
8*9880d681SAndroid Build Coastguard Worker;all VFP are allocated, stack is used. We can use stack without GPR allocation
9*9880d681SAndroid Build Coastguard Worker;in that case, passing 9 f64 params, for example.
10*9880d681SAndroid Build Coastguard Worker;First eight params goes to d0-d7, ninth one goes to the stack.
11*9880d681SAndroid Build Coastguard Worker;Now, as 10th parameter, we pass i32, and it must go to R0.
12*9880d681SAndroid Build Coastguard Worker;
13*9880d681SAndroid Build Coastguard Worker;For more information,
14*9880d681SAndroid Build Coastguard Worker;please, read 5.5 Parameter Passing, Stage C, stages C.2.cp, C.4 and C.5
15*9880d681SAndroid Build Coastguard Worker;
16*9880d681SAndroid Build Coastguard Worker;
17*9880d681SAndroid Build Coastguard Worker;RUN: llc -mtriple=thumbv7-linux-gnueabihf -float-abi=hard < %s | FileCheck %s
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker%struct_t = type { i32, i32, i32, i32 }
20*9880d681SAndroid Build Coastguard Worker@static_val = constant %struct_t { i32 777, i32 888, i32 999, i32 1000 }
21*9880d681SAndroid Build Coastguard Workerdeclare void @fooUseStruct(%struct_t*)
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine void @foo2(double %p0, ; --> D0
24*9880d681SAndroid Build Coastguard Worker                  double %p1, ; --> D1
25*9880d681SAndroid Build Coastguard Worker		  double %p2, ; --> D2
26*9880d681SAndroid Build Coastguard Worker		  double %p3, ; --> D3
27*9880d681SAndroid Build Coastguard Worker		  double %p4, ; --> D4
28*9880d681SAndroid Build Coastguard Worker		  double %p5, ; --> D5
29*9880d681SAndroid Build Coastguard Worker		  double %p6, ; --> D6
30*9880d681SAndroid Build Coastguard Worker		  double %p7, ; --> D7
31*9880d681SAndroid Build Coastguard Worker		  double %p8, ; --> Stack
32*9880d681SAndroid Build Coastguard Worker		  i32 %p9,    ; --> R0
33*9880d681SAndroid Build Coastguard Worker                  %struct_t* byval %p10) ; --> Stack+8
34*9880d681SAndroid Build Coastguard Worker{
35*9880d681SAndroid Build Coastguard Workerentry:
36*9880d681SAndroid Build Coastguard Worker;CHECK:     push {r7, lr}
37*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: stm
38*9880d681SAndroid Build Coastguard Worker;CHECK:     add r0, sp, #16
39*9880d681SAndroid Build Coastguard Worker;CHECK:     bl fooUseStruct
40*9880d681SAndroid Build Coastguard Worker  call void @fooUseStruct(%struct_t* %p10)
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker  ret void
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine void @doFoo2() {
46*9880d681SAndroid Build Coastguard Workerentry:
47*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: ldm
48*9880d681SAndroid Build Coastguard Worker  tail call void @foo2(double 23.0, ; --> D0
49*9880d681SAndroid Build Coastguard Worker                       double 23.1, ; --> D1
50*9880d681SAndroid Build Coastguard Worker		       double 23.2, ; --> D2
51*9880d681SAndroid Build Coastguard Worker                       double 23.3, ; --> D3
52*9880d681SAndroid Build Coastguard Worker                       double 23.4, ; --> D4
53*9880d681SAndroid Build Coastguard Worker                       double 23.5, ; --> D5
54*9880d681SAndroid Build Coastguard Worker                       double 23.6, ; --> D6
55*9880d681SAndroid Build Coastguard Worker                       double 23.7, ; --> D7
56*9880d681SAndroid Build Coastguard Worker                       double 23.8, ; --> Stack
57*9880d681SAndroid Build Coastguard Worker                       i32 43,      ; --> R0, not Stack+8
58*9880d681SAndroid Build Coastguard Worker                       %struct_t* byval @static_val) ; --> Stack+8, not R1
59*9880d681SAndroid Build Coastguard Worker  ret void
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62