aboutsummaryrefslogtreecommitdiffstats
path: root/riscV
diff options
context:
space:
mode:
authorLéo Gourdin <leo.gourdin@univ-grenoble-alpes.fr>2021-06-01 11:18:59 +0200
committerLéo Gourdin <leo.gourdin@univ-grenoble-alpes.fr>2021-06-01 11:18:59 +0200
commitc44fc24eb6111c177d1d6fc973a366ebf646202b (patch)
tree8e4bfb9c5d31f767b6f09b8bde02e6212f67d62e /riscV
parent3bf9a4fc0606c94d743b0fb7c0b59143c0417f17 (diff)
downloadcompcert-kvx-c44fc24eb6111c177d1d6fc973a366ebf646202b.tar.gz
compcert-kvx-c44fc24eb6111c177d1d6fc973a366ebf646202b.zip
removing some Expansion when loading float/single constants
Diffstat (limited to 'riscV')
-rw-r--r--riscV/ExpansionOracle.ml38
1 files changed, 22 insertions, 16 deletions
diff --git a/riscV/ExpansionOracle.ml b/riscV/ExpansionOracle.ml
index b3f1f8ce..68d4e4d2 100644
--- a/riscV/ExpansionOracle.ml
+++ b/riscV/ExpansionOracle.ml
@@ -825,22 +825,28 @@ let expanse (sb : superblock) code pm =
| _ -> ());
(if !Clflags.option_fexpanse_others && not !was_exp then
match inst with
- | Iop (Ofloatconst f, nil, dest, succ) ->
- debug "Iop/Ofloatconst\n";
- let r = r2pi () in
- let l = loadimm64 vn r (Floats.Float.to_bits f) in
- let r', l' = extract_arg l in
- exp := addinst vn Ofloat_of_bits [ r' ] dest :: l';
- exp := extract_final vn !exp dest succ;
- was_exp := true
- | Iop (Osingleconst f, nil, dest, succ) ->
- debug "Iop/Osingleconst\n";
- let r = r2pi () in
- let l = loadimm32 vn r (Floats.Float32.to_bits f) in
- let r', l' = extract_arg l in
- exp := addinst vn Osingle_of_bits [ r' ] dest :: l';
- exp := extract_final vn !exp dest succ;
- was_exp := true
+ | Iop (Ofloatconst f, nil, dest, succ) -> (
+ match make_immed64 (Floats.Float.to_bits f) with
+ | Imm64_single _ | Imm64_large _ -> ()
+ | Imm64_pair (hi, lo) ->
+ debug "Iop/Ofloatconst\n";
+ let r = r2pi () in
+ let l = load_hilo64 vn r hi lo in
+ let r', l' = extract_arg l in
+ exp := addinst vn Ofloat_of_bits [ r' ] dest :: l';
+ exp := extract_final vn !exp dest succ;
+ was_exp := true)
+ | Iop (Osingleconst f, nil, dest, succ) -> (
+ match make_immed32 (Floats.Float32.to_bits f) with
+ | Imm32_single imm -> ()
+ | Imm32_pair (hi, lo) ->
+ debug "Iop/Osingleconst\n";
+ let r = r2pi () in
+ let l = load_hilo32 vn r hi lo in
+ let r', l' = extract_arg l in
+ exp := addinst vn Osingle_of_bits [ r' ] dest :: l';
+ exp := extract_final vn !exp dest succ;
+ was_exp := true)
| Iop (Ointconst n, nil, dest, succ) ->
debug "Iop/Ointconst\n";
exp := loadimm32 vn dest n;