1*9880d681SAndroid Build Coastguard Worker;Check 5.5 Parameter Passing --> Stage C --> C.4 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. 5*9880d681SAndroid Build Coastguard Worker; 6*9880d681SAndroid Build Coastguard Worker;Co-Processor register candidates may be either in VFP or in stack, so after 7*9880d681SAndroid Build Coastguard Worker;all VFP are allocated, stack is used. We can use stack without GPR allocation 8*9880d681SAndroid Build Coastguard Worker;in that case, passing 9 f64 params, for example. 9*9880d681SAndroid Build Coastguard Worker;First eight params goes to d0-d7, ninth one goes to the stack. 10*9880d681SAndroid Build Coastguard Worker;Now, as 10th parameter, we pass i32, and it must go to R0. 11*9880d681SAndroid Build Coastguard Worker; 12*9880d681SAndroid Build Coastguard Worker;5.5 Parameter Passing, Stage C: 13*9880d681SAndroid Build Coastguard Worker; 14*9880d681SAndroid Build Coastguard Worker;C.2.cp If the argument is a CPRC then any co-processor registers in that class 15*9880d681SAndroid Build Coastguard Worker;that are unallocated are marked as unavailable. The NSAA is adjusted upwards 16*9880d681SAndroid Build Coastguard Worker;until it is correctly aligned for the argument and the argument is copied to 17*9880d681SAndroid Build Coastguard Worker;the memory at the adjusted NSAA. The NSAA is further incremented by the size 18*9880d681SAndroid Build Coastguard Worker;of the argument. The argument has now been allocated. 19*9880d681SAndroid Build Coastguard Worker;... 20*9880d681SAndroid Build Coastguard Worker;C.4 If the size in words of the argument is not more than r4 minus NCRN, the 21*9880d681SAndroid Build Coastguard Worker;argument is copied into core registers, starting at the NCRN. The NCRN is 22*9880d681SAndroid Build Coastguard Worker;incremented by the number of registers used. Successive registers hold the 23*9880d681SAndroid Build Coastguard Worker;parts of the argument they would hold if its value were loaded into those 24*9880d681SAndroid Build Coastguard Worker;registers from memory using an LDM instruction. The argument has now been 25*9880d681SAndroid Build Coastguard Worker;allocated. 26*9880d681SAndroid Build Coastguard Worker; 27*9880d681SAndroid Build Coastguard Worker;What is actually checked here: 28*9880d681SAndroid Build Coastguard Worker;Here we check that i32 param goes to r0. 29*9880d681SAndroid Build Coastguard Worker; 30*9880d681SAndroid Build Coastguard Worker;Current test-case was produced with command: 31*9880d681SAndroid Build Coastguard Worker;arm-linux-gnueabihf-clang -mcpu=cortex-a9 params-to-GPR.c -S -O1 -emit-llvm 32*9880d681SAndroid Build Coastguard Worker; 33*9880d681SAndroid Build Coastguard Worker;// params-to-GRP.c: 34*9880d681SAndroid Build Coastguard Worker; 35*9880d681SAndroid Build Coastguard Worker;void fooUseI32(unsigned); 36*9880d681SAndroid Build Coastguard Worker; 37*9880d681SAndroid Build Coastguard Worker;void foo(long double p0, 38*9880d681SAndroid Build Coastguard Worker; long double p1, 39*9880d681SAndroid Build Coastguard Worker; long double p2, 40*9880d681SAndroid Build Coastguard Worker; long double p3, 41*9880d681SAndroid Build Coastguard Worker; long double p4, 42*9880d681SAndroid Build Coastguard Worker; long double p5, 43*9880d681SAndroid Build Coastguard Worker; long double p6, 44*9880d681SAndroid Build Coastguard Worker; long double p7, 45*9880d681SAndroid Build Coastguard Worker; long double p8, 46*9880d681SAndroid Build Coastguard Worker; unsigned p9) { 47*9880d681SAndroid Build Coastguard Worker; fooUseI32(p9); 48*9880d681SAndroid Build Coastguard Worker;} 49*9880d681SAndroid Build Coastguard Worker; 50*9880d681SAndroid Build Coastguard Worker;void doFoo() { 51*9880d681SAndroid Build Coastguard Worker; foo( 1,2,3,4,5,6,7,8,9, 43 ); 52*9880d681SAndroid Build Coastguard Worker;} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker;RUN: llc -mtriple=thumbv7-linux-gnueabihf -float-abi=hard < %s | FileCheck %s 55*9880d681SAndroid Build Coastguard Worker; 56*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: foo: 57*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: mov r0 58*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: ldr r0 59*9880d681SAndroid Build Coastguard Worker;CHECK: bl fooUseI32 60*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: doFoo: 61*9880d681SAndroid Build Coastguard Worker;CHECK: movs r0, #43 62*9880d681SAndroid Build Coastguard Worker;CHECK: bl foo 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine void @foo(double %p0, ; --> D0 65*9880d681SAndroid Build Coastguard Worker double %p1, ; --> D1 66*9880d681SAndroid Build Coastguard Worker double %p2, ; --> D2 67*9880d681SAndroid Build Coastguard Worker double %p3, ; --> D3 68*9880d681SAndroid Build Coastguard Worker double %p4, ; --> D4 69*9880d681SAndroid Build Coastguard Worker double %p5, ; --> D5 70*9880d681SAndroid Build Coastguard Worker double %p6, ; --> D6 71*9880d681SAndroid Build Coastguard Worker double %p7, ; --> D7 72*9880d681SAndroid Build Coastguard Worker double %p8, ; --> Stack 73*9880d681SAndroid Build Coastguard Worker i32 %p9) #0 { ; --> R0, not Stack+8 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker call void @fooUseI32(i32 %p9) 76*9880d681SAndroid Build Coastguard Worker ret void 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdeclare void @fooUseI32(i32) 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine void @doFoo() { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker tail call void @foo(double 23.0, ; --> D0 84*9880d681SAndroid Build Coastguard Worker double 23.1, ; --> D1 85*9880d681SAndroid Build Coastguard Worker double 23.2, ; --> D2 86*9880d681SAndroid Build Coastguard Worker double 23.3, ; --> D3 87*9880d681SAndroid Build Coastguard Worker double 23.4, ; --> D4 88*9880d681SAndroid Build Coastguard Worker double 23.5, ; --> D5 89*9880d681SAndroid Build Coastguard Worker double 23.6, ; --> D6 90*9880d681SAndroid Build Coastguard Worker double 23.7, ; --> D7 91*9880d681SAndroid Build Coastguard Worker double 23.8, ; --> Stack 92*9880d681SAndroid Build Coastguard Worker i32 43) ; --> R0, not Stack+8 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96