diff options
author | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2021-01-11 18:04:25 +0100 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2021-01-14 14:54:33 +0100 |
commit | 88567ce6d247562a9fa9151eaa32f7ad63ea37c0 (patch) | |
tree | af67d85428f969b60028999fba041156bf2c18bd /riscV/TargetPrinter.ml | |
parent | 522285d1163523b02a1972b99d71c08552cd9c7b (diff) | |
download | compcert-kvx-88567ce6d247562a9fa9151eaa32f7ad63ea37c0.tar.gz compcert-kvx-88567ce6d247562a9fa9151eaa32f7ad63ea37c0.zip |
RISC-V: fix FP calling conventions
This is a follow-up to e81d015e3.
In the RISC-V ABI, FP arguments to functions are passed in integer registers
(or pairs of integer registers) in two cases:
1- the FP argument is a variadic argument
2- the FP argument is a fixed argument but all 8 FP registers reserved for
parameter passing have been used already.
The previous implementation handled only case 1, with some problems.
This commit implements both 1 and 2. To this end, 8 extra FP
caller-save registers are used to hold the values of the FP arguments
that must be passed in integer registers. Fixup code moves these FP
registers to integer registers / register pairs. Symmetrically, at
function entry, the integer registers / register pairs are moved back
to the FP registers.
8 extra FP registers is enough because there are only 8 integer
registers used for parameter passing, so at most 8 FP arguments may
need to be moved to integer registers.
Diffstat (limited to 'riscV/TargetPrinter.ml')
-rw-r--r-- | riscV/TargetPrinter.ml | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/riscV/TargetPrinter.ml b/riscV/TargetPrinter.ml index 64bcea4c..5cd47b46 100644 --- a/riscV/TargetPrinter.ml +++ b/riscV/TargetPrinter.ml @@ -392,8 +392,12 @@ module Target : TARGET = fprintf oc " fmv.d %a, %a\n" freg fd freg fs | Pfmvxs (rd,fs) -> fprintf oc " fmv.x.s %a, %a\n" ireg rd freg fs + | Pfmvsx (fd,rs) -> + fprintf oc " fmv.s.x %a, %a\n" freg fd ireg rs | Pfmvxd (rd,fs) -> fprintf oc " fmv.x.d %a, %a\n" ireg rd freg fs + | Pfmvdx (fd,rs) -> + fprintf oc " fmv.d.x %a, %a\n" freg fd ireg rs (* 32-bit (single-precision) floating point *) | Pfls (fd, ra, ofs) -> |