diff options
author | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2019-04-24 22:20:13 +0200 |
---|---|---|
committer | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2019-04-24 22:20:13 +0200 |
commit | 59089e5d11428dd224b3239bc7f5db602df9b177 (patch) | |
tree | d317db6712c80bc4dc45d3ef20bfa1cfb7b57213 | |
parent | aa3ac1afb0b05a2d80f697c2179b59f8c73c83fb (diff) | |
download | compcert-kvx-59089e5d11428dd224b3239bc7f5db602df9b177.tar.gz compcert-kvx-59089e5d11428dd224b3239bc7f5db602df9b177.zip |
begin bitfields
-rw-r--r-- | common/Values.v | 15 | ||||
-rw-r--r-- | mppa_k1c/Asm.v | 3 | ||||
-rw-r--r-- | mppa_k1c/Asmblockdeps.v | 1 | ||||
-rw-r--r-- | mppa_k1c/Asmvliw.v | 5 | ||||
-rw-r--r-- | mppa_k1c/PostpassSchedulingOracle.ml | 1 | ||||
-rw-r--r-- | mppa_k1c/TargetPrinter.ml | 2 |
6 files changed, 26 insertions, 1 deletions
diff --git a/common/Values.v b/common/Values.v index a20dd567..ae8d31f3 100644 --- a/common/Values.v +++ b/common/Values.v @@ -766,6 +766,21 @@ Definition rolml (v: val) (amount: int) (mask: int64): val := | _ => Vundef end. + +Definition extfz stop start v := + if (Int.cmp Cle start stop) + && (Int.cmp Cge start Int.zero) + && (Int.cmp Clt stop Int.iwordsize) + then + let stop' := Int.add stop Int.one in + match v with + | Vint w => + Vint (Int.shr (Int.shl w (Int.sub Int.iwordsize stop')) (Int.sub Int.iwordsize (Int.sub stop' start))) + | _ => Vundef + end + else Vundef. + + (** Comparisons *) Section COMPARISONS. diff --git a/mppa_k1c/Asm.v b/mppa_k1c/Asm.v index f679335c..2c3eef1f 100644 --- a/mppa_k1c/Asm.v +++ b/mppa_k1c/Asm.v @@ -129,6 +129,8 @@ Inductive instruction : Type := | Pcvtl2w (rd rs: ireg) (**r Convert Long to Word *)
| Psxwd (rd rs: ireg) (**r Sign Extend Word to Double Word *)
| Pzxwd (rd rs: ireg) (**r Zero Extend Word to Double Word *)
+
+ | Pextfz (rd : ireg) (rs : ireg) (stop : int) (start : int) (**r extract bitfields unsigned *)
| Pfabsd (rd rs: ireg) (**r float absolute double *)
| Pfabsw (rd rs: ireg) (**r float absolute word *)
| Pfnegd (rd rs: ireg) (**r float negate double *)
@@ -280,6 +282,7 @@ Definition basic_to_instruction (b: basic) := | PArithRR Asmvliw.Pcvtl2w rd rs => Pcvtl2w rd rs
| PArithRR Asmvliw.Psxwd rd rs => Psxwd rd rs
| PArithRR Asmvliw.Pzxwd rd rs => Pzxwd rd rs
+ | PArithRR (Asmvliw.Pextfz stop start) rd rs => Pextfz rd rs stop start
| PArithRR Asmvliw.Pfabsd rd rs => Pfabsd rd rs
| PArithRR Asmvliw.Pfabsw rd rs => Pfabsw rd rs
| PArithRR Asmvliw.Pfnegd rd rs => Pfnegd rd rs
diff --git a/mppa_k1c/Asmblockdeps.v b/mppa_k1c/Asmblockdeps.v index 4559dd62..b9db7760 100644 --- a/mppa_k1c/Asmblockdeps.v +++ b/mppa_k1c/Asmblockdeps.v @@ -1213,6 +1213,7 @@ Definition string_of_name_rr (n: arith_name_rr): pstring := | Pcvtl2w => "Pcvtl2w" | Psxwd => "Psxwd" | Pzxwd => "Pzxwd" + | Pextfz _ _ => "Pextfz" | Pfabsd => "Pfabsd" | Pfabsw => "Pfabsw" | Pfnegd => "Pfnegd" diff --git a/mppa_k1c/Asmvliw.v b/mppa_k1c/Asmvliw.v index 7177d5fe..a347b6fc 100644 --- a/mppa_k1c/Asmvliw.v +++ b/mppa_k1c/Asmvliw.v @@ -306,7 +306,9 @@ Inductive arith_name_rr : Type := | Pcvtl2w (**r Convert Long to Word *) | Psxwd (**r Sign Extend Word to Double Word *) | Pzxwd (**r Zero Extend Word to Double Word *) - +(* | Pextfs (stop : int) (start : int) (**r extract bit field, signed *) *) + | Pextfz (stop : int) (start : int) (**r extract bit field, unsigned *) + | Pfabsd (**r float absolute double *) | Pfabsw (**r float absolute word *) | Pfnegd (**r float negate double *) @@ -878,6 +880,7 @@ Definition arith_eval_rr n v := | Pcvtl2w => Val.loword v | Psxwd => Val.longofint v | Pzxwd => Val.longofintu v + | Pextfz stop start => Val.extfz stop start v | Pfnegd => Val.negf v | Pfnegw => Val.negfs v | Pfabsd => Val.absf v diff --git a/mppa_k1c/PostpassSchedulingOracle.ml b/mppa_k1c/PostpassSchedulingOracle.ml index 9a26425a..8f6484d6 100644 --- a/mppa_k1c/PostpassSchedulingOracle.ml +++ b/mppa_k1c/PostpassSchedulingOracle.ml @@ -34,6 +34,7 @@ let arith_rr_str = function | Pnegl -> "Pnegl" | Psxwd -> "Psxwd" | Pzxwd -> "Pzxwd" + | Pextfz(_,_) -> "Pextfz" | Pfabsw -> "Pfabsw" | Pfabsd -> "Pfabsd" | Pfnegw -> "Pfnegw" diff --git a/mppa_k1c/TargetPrinter.ml b/mppa_k1c/TargetPrinter.ml index 5aedd557..dc207dc8 100644 --- a/mppa_k1c/TargetPrinter.ml +++ b/mppa_k1c/TargetPrinter.ml @@ -377,6 +377,8 @@ module Target (*: TARGET*) = fprintf oc " sxwd %a = %a\n" ireg rd ireg rs | Pzxwd(rd, rs) -> fprintf oc " zxwd %a = %a\n" ireg rd ireg rs + | Pextfz(rd, rs, stop, start) -> + fprintf oc " extfz %a = %a, %ld, %ld\n" ireg rd ireg rs (camlint_of_coqint stop) (camlint_of_coqint start) | Pfabsd(rd, rs) -> fprintf oc " fabsd %a = %a\n" ireg rd ireg rs | Pfabsw(rd, rs) -> |