diff options
author | Léo Gourdin <leo.gourdin@univ-grenoble-alpes.fr> | 2021-06-01 11:18:59 +0200 |
---|---|---|
committer | Léo Gourdin <leo.gourdin@univ-grenoble-alpes.fr> | 2021-06-01 11:18:59 +0200 |
commit | c44fc24eb6111c177d1d6fc973a366ebf646202b (patch) | |
tree | 8e4bfb9c5d31f767b6f09b8bde02e6212f67d62e /riscV | |
parent | 3bf9a4fc0606c94d743b0fb7c0b59143c0417f17 (diff) | |
download | compcert-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.ml | 38 |
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; |