1*c41e856fSPablo Barrio; RUN: llc -mtriple armv7 -target-abi aapcs -float-abi soft -O0 -o - < %s \ 2*c41e856fSPablo Barrio; RUN: | FileCheck %s -check-prefix CHECK-SOFT -check-prefix CHECK 3*c41e856fSPablo Barrio; RUN: llc -mtriple armv7 -target-abi aapcs -float-abi hard -O0 -o - < %s \ 4*c41e856fSPablo Barrio; RUN: | FileCheck %s -check-prefix CHECK-HARD -check-prefix CHECK 5*c41e856fSPablo Barrio 6*c41e856fSPablo Barrio; Tests for passing floating-point regs. Variadic functions will always use 7*c41e856fSPablo Barrio; general-purpose registers. Standard functions will use the floating-point 8*c41e856fSPablo Barrio; registers if there is hardware FP available. 9*c41e856fSPablo Barrio 10*c41e856fSPablo Barriodeclare i1 @non_variadic(float, float, float, float) 11*c41e856fSPablo Barriodeclare i1 @non_variadic_big(float, float, float, float, float, float) 12*c41e856fSPablo Barriodeclare i1 @variadic(float, ...) 13*c41e856fSPablo Barrio 14*c41e856fSPablo Barriodefine void @non_variadic_fp(float %x, float %y) { 15*c41e856fSPablo Barrio; CHECK-LABEL: non_variadic_fp: 16*c41e856fSPablo Barrio; CHECK: b non_variadic 17*c41e856fSPablo Barrioentry: 18*c41e856fSPablo Barrio %call = tail call i1 (float, float, float, float) @non_variadic(float %y, float %x, float %x, float %y) 19*c41e856fSPablo Barrio ret void 20*c41e856fSPablo Barrio} 21*c41e856fSPablo Barrio 22*c41e856fSPablo Barriodefine void @variadic_fp(float %x, float %y) { 23*c41e856fSPablo Barrio; CHECK-LABEL: variadic_fp: 24*c41e856fSPablo Barrio; CHECK: b variadic 25*c41e856fSPablo Barrioentry: 26*c41e856fSPablo Barrio %call = tail call i1 (float, ...) @variadic(float %y, float %x, float %x, float %y) 27*c41e856fSPablo Barrio ret void 28*c41e856fSPablo Barrio} 29*c41e856fSPablo Barrio 30*c41e856fSPablo Barrio; With soft-float, general-purpose registers are used and there are not enough 31*c41e856fSPablo Barrio; of them to handle the 6 arguments. With hard-float, we have plenty of regs 32*c41e856fSPablo Barrio; (s0-s15) to pass FP arguments. 33*c41e856fSPablo Barriodefine void @non_variadic_fp_big(float %x, float %y) { 34*c41e856fSPablo Barrio; CHECK-LABEL: non_variadic_fp_big: 35*c41e856fSPablo Barrio; CHECK-SOFT: bl non_variadic_big 36*c41e856fSPablo Barrio; CHECK-HARD: b non_variadic_big 37*c41e856fSPablo Barrioentry: 38*c41e856fSPablo Barrio %call = tail call i1 (float, float, float, float, float, float) @non_variadic_big(float %y, float %x, float %x, float %y, float %x, float %y) 39*c41e856fSPablo Barrio ret void 40*c41e856fSPablo Barrio} 41*c41e856fSPablo Barrio 42*c41e856fSPablo Barrio; Variadic functions cannot use FP regs to pass arguments; only GP regs. 43*c41e856fSPablo Barriodefine void @variadic_fp_big(float %x, float %y) { 44*c41e856fSPablo Barrio; CHECK-LABEL: variadic_fp_big: 45*c41e856fSPablo Barrio; CHECK: bl variadic 46*c41e856fSPablo Barrioentry: 47*c41e856fSPablo Barrio %call = tail call i1 (float, ...) @variadic(float %y, float %x, float %x, float %y, float %x, float %y) 48*c41e856fSPablo Barrio ret void 49*c41e856fSPablo Barrio} 50