aboutsummaryrefslogtreecommitdiffstats
path: root/riscV
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@college-de-france.fr>2021-01-10 14:34:58 +0100
committerXavier Leroy <xavier.leroy@college-de-france.fr>2021-01-10 15:58:46 +0100
commite81d015e3cc2cb0c352792d0cac12f1594281bc2 (patch)
tree27a114153d1af7ba2771422780d452e5cb776daa /riscV
parent35e2b11db8d5b79a09e6d69dd68b54d3a51ba2d5 (diff)
downloadcompcert-e81d015e3cc2cb0c352792d0cac12f1594281bc2.tar.gz
compcert-e81d015e3cc2cb0c352792d0cac12f1594281bc2.zip
RISC-V: wrong fixup code generated for vararg calls with fixed FP args
This is a follow-up to 2076a3bb3. Integer registers were wrongly reserved for fixed FP arguments, causing variadic FP arguments to end up in the wrong integer registers. Added regression test in test/regression/varargs2.c
Diffstat (limited to 'riscV')
-rw-r--r--riscV/Asmexpand.ml30
1 files changed, 18 insertions, 12 deletions
diff --git a/riscV/Asmexpand.ml b/riscV/Asmexpand.ml
index f01ecb23..da97c4a8 100644
--- a/riscV/Asmexpand.ml
+++ b/riscV/Asmexpand.ml
@@ -72,27 +72,33 @@ let rec fixup_variadic_call fixed ri rf tyl =
| (Tint | Tany32) :: tyl ->
fixup_variadic_call (fixed - 1) (ri + 1) rf tyl
| Tsingle :: tyl ->
- if fixed <= 0 then begin
+ if fixed > 0 then
+ fixup_variadic_call (fixed - 1) ri (rf + 1) tyl
+ else begin
let rs = float_param_regs.(rf)
and rd = int_param_regs.(ri) in
- emit (Pfmvxs(rd, rs))
- end;
- fixup_variadic_call (fixed - 1) (ri + 1) (rf + 1) tyl
+ emit (Pfmvxs(rd, rs));
+ fixup_variadic_call (fixed - 1) (ri + 1) (rf + 1) tyl
+ end
| Tlong :: tyl ->
let ri' = if Archi.ptr64 then ri + 1 else align ri 2 + 2 in
fixup_variadic_call (fixed - 1) ri' rf tyl
| (Tfloat | Tany64) :: tyl ->
if Archi.ptr64 then begin
- if fixed <= 0 then begin
+ if fixed > 0 then
+ fixup_variadic_call (fixed - 1) ri (rf + 1) tyl
+ else begin
let rs = float_param_regs.(rf)
and rd = int_param_regs.(ri) in
- emit (Pfmvxd(rd, rs))
- end;
- fixup_variadic_call (fixed - 1) (ri + 1) (rf + 1) tyl
+ emit (Pfmvxd(rd, rs));
+ fixup_variadic_call (fixed - 1) (ri + 1) (rf + 1) tyl
+ end
end else begin
let ri = align ri 2 in
if ri < 8 then begin
- if fixed <= 0 then begin
+ if fixed > 0 then
+ fixup_variadic_call (fixed - 1) ri (rf + 1) tyl
+ else begin
let rs = float_param_regs.(rf)
and rd1 = int_param_regs.(ri)
and rd2 = int_param_regs.(ri + 1) in
@@ -100,9 +106,9 @@ let rec fixup_variadic_call fixed ri rf tyl =
emit (Pfsd(rs, X2, Ofsimm _0));
emit (Plw(rd1, X2, Ofsimm _0));
emit (Plw(rd2, X2, Ofsimm _4));
- emit (Paddiw(X2, X X2, _16))
- end;
- fixup_variadic_call (fixed - 1) (ri + 2) (rf + 1) tyl
+ emit (Paddiw(X2, X X2, _16));
+ fixup_variadic_call (fixed - 1) (ri + 2) (rf + 1) tyl
+ end
end
end