From f2a2cca20b8ae576c603b4f119cb2a7c73515f18 Mon Sep 17 00:00:00 2001 From: David Monniaux Date: Fri, 11 Feb 2022 22:46:42 +0100 Subject: remove useless stuff --- kvx/Archi.v | 2 +- kvx/SelectLong.vp | 4 ---- kvx/SelectLongproof.v | 18 ++++++------------ 3 files changed, 7 insertions(+), 17 deletions(-) (limited to 'kvx') diff --git a/kvx/Archi.v b/kvx/Archi.v index 6d59a3d1..b1739421 100644 --- a/kvx/Archi.v +++ b/kvx/Archi.v @@ -16,7 +16,7 @@ (** Architecture-dependent parameters for MPPA KVX. Mostly copied from the Risc-V backend *) Require Import ZArith List. -Require Import Binary Bits. +From Flocq Require Import Binary Bits. Definition ptr64 := true. diff --git a/kvx/SelectLong.vp b/kvx/SelectLong.vp index b3638eca..16517aa5 100644 --- a/kvx/SelectLong.vp +++ b/kvx/SelectLong.vp @@ -433,19 +433,15 @@ Definition cmpl (c: comparison) (e1 e2: expr) := (** ** Floating-point conversions *) Definition longoffloat (e: expr) := - if Archi.splitlong then SplitLong.longoffloat e else Eop Olongoffloat (e:::Enil). Definition longuoffloat (e: expr) := - if Archi.splitlong then SplitLong.longuoffloat e else Eop Olonguoffloat (e:::Enil). Definition floatoflong (e: expr) := - if Archi.splitlong then SplitLong.floatoflong e else Eop Ofloatoflong (e:::Enil). Definition floatoflongu (e: expr) := - if Archi.splitlong then SplitLong.floatoflongu e else Eop Ofloatoflongu (e:::Enil). Definition longofsingle (e: expr) := longoffloat (floatofsingle e). diff --git a/kvx/SelectLongproof.v b/kvx/SelectLongproof.v index c3abdbc7..a88863b4 100644 --- a/kvx/SelectLongproof.v +++ b/kvx/SelectLongproof.v @@ -884,32 +884,28 @@ Qed. Theorem eval_longoffloat: partial_unary_constructor_sound longoffloat Val.longoffloat. Proof. - unfold longoffloat; red; intros. destruct Archi.splitlong eqn:SL. - eapply SplitLongproof.eval_longoffloat; eauto. + unfold longoffloat; red; intros. TrivialExists. simpl. rewrite H0. reflexivity. Qed. Theorem eval_longuoffloat: partial_unary_constructor_sound longuoffloat Val.longuoffloat. Proof. - unfold longuoffloat; red; intros. destruct Archi.splitlong eqn:SL. - eapply SplitLongproof.eval_longuoffloat; eauto. + unfold longuoffloat; red; intros. TrivialExists. simpl. rewrite H0. reflexivity. Qed. Theorem eval_floatoflong: partial_unary_constructor_sound floatoflong Val.floatoflong. Proof. - unfold floatoflong; red; intros. destruct Archi.splitlong eqn:SL. - eapply SplitLongproof.eval_floatoflong; eauto. + unfold floatoflong; red; intros. TrivialExists. simpl. rewrite H0. reflexivity. Qed. Theorem eval_floatoflongu: partial_unary_constructor_sound floatoflongu Val.floatoflongu. Proof. - unfold floatoflongu; red; intros. destruct Archi.splitlong eqn:SL. - eapply SplitLongproof.eval_floatoflongu; eauto. + unfold floatoflongu; red; intros. TrivialExists. simpl. rewrite H0. reflexivity. Qed. @@ -936,16 +932,14 @@ Qed. Theorem eval_singleoflong: partial_unary_constructor_sound singleoflong Val.singleoflong. Proof. - unfold singleoflong; red; intros. (* destruct Archi.splitlong eqn:SL. *) + unfold singleoflong; red; intros. eapply SplitLongproof.eval_singleoflong; eauto. -(* TrivialExists. *) Qed. Theorem eval_singleoflongu: partial_unary_constructor_sound singleoflongu Val.singleoflongu. Proof. - unfold singleoflongu; red; intros. (* destruct Archi.splitlong eqn:SL. *) + unfold singleoflongu; red; intros. eapply SplitLongproof.eval_singleoflongu; eauto. -(* TrivialExists. *) Qed. End CMCONSTR. -- cgit From 5ba8c76d3eaf78d1a57678af5d9b006e29c4a02f Mon Sep 17 00:00:00 2001 From: David Monniaux Date: Sat, 12 Feb 2022 11:37:43 +0100 Subject: extra FP code --- kvx/FPExtra.v | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 kvx/FPExtra.v (limited to 'kvx') diff --git a/kvx/FPExtra.v b/kvx/FPExtra.v new file mode 100644 index 00000000..05fd8842 --- /dev/null +++ b/kvx/FPExtra.v @@ -0,0 +1,60 @@ +Require Import Coqlib. +Require Import Compopts. +Require Import AST Integers Floats. +Require Import Op CminorSel. +Require Import OpHelpers. +Require Import SelectOp SplitLong. +Require Import Values ExtValues. +Require Import DecBoolOps. + +Local Open Scope cminorsel_scope. +Local Open Scope string_scope. + +Definition e_andl a b := Eop Oandl (a ::: b ::: Enil). +Definition e_addl a b := Eop Oaddl (a ::: b ::: Enil). +Definition e_orl a b := Eop Oorl (a ::: b ::: Enil). +Definition e_constl n := Eop (Olongconst (Int64.repr n)) Enil. +Definition e_float_of_longu a := Eop Ofloatoflongu (a ::: Enil). +Definition e_single_of_float a := Eop Osingleoffloat (a ::: Enil). +Definition e_ite ty c vc v1 v2 := Eop (Osel c ty) (v1 ::: v2 ::: vc ::: Enil). +Definition e_cmpluimm c v n := Eop (Ocmp (Ccompluimm c n)) (v ::: Enil). + +Definition a_var := Eletvar 0%nat. + +Definition e_single_of_longu a := + Elet a (e_single_of_float (e_float_of_longu + (e_ite Tlong (Ccompu0 Cne) (e_cmpluimm Cle a_var (Int64.repr (2^53))) a_var + (e_andl (e_orl a_var (e_addl (e_andl a_var (e_constl 2047)) + (e_constl 2047))) + (e_constl (-2048))))))%Z. + +Theorem e_single_of_longu_correct : + forall (ge : genv) (sp: val) cmenv memenv + (le : letenv) (expr_a : expr) (va : val) + (EVAL_a : eval_expr ge sp cmenv memenv le expr_a va), + eval_expr ge sp cmenv memenv le (e_single_of_longu expr_a) + (Val.maketotal (Val.singleoflongu va)). +Proof. + intros. + unfold e_single_of_longu. + repeat econstructor. eassumption. + cbn. + destruct va; cbn. + all: try reflexivity. + f_equal. + unfold Int64.ltu. + change (Int64.unsigned (Int64.repr 9007199254740992))%Z with 9007199254740992%Z. + destruct zlt as [LT | GE]; cbn. + { change (Int.eq Int.zero Int.zero) with true. cbn. + f_equal. + symmetry. + apply Float32.of_longu_double_2. + lia. + } + change (Int.eq Int.one Int.zero) with false. cbn. + f_equal. + symmetry. + apply Float32.of_longu_double_1. + lia. +Qed. + -- cgit From 50377ef4b9430fa019e26fac3028739f0308e9b1 Mon Sep 17 00:00:00 2001 From: David Monniaux Date: Sat, 12 Feb 2022 12:06:32 +0100 Subject: unsigned long -> float without function calls --- kvx/SelectLong.vp | 9 ++++++++- kvx/SelectLongproof.v | 5 ++++- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'kvx') diff --git a/kvx/SelectLong.vp b/kvx/SelectLong.vp index 16517aa5..3598025a 100644 --- a/kvx/SelectLong.vp +++ b/kvx/SelectLong.vp @@ -23,6 +23,7 @@ Require Import OpHelpers. Require Import SelectOp SplitLong. Require Import ExtValues. Require Import DecBoolOps. +Require FPExtra. Local Open Scope cminorsel_scope. Local Open Scope string_scope. @@ -448,9 +449,15 @@ Definition longofsingle (e: expr) := longoffloat (floatofsingle e). Definition longuofsingle (e: expr) := longuoffloat (floatofsingle e). +Definition use_inlined_fp_conversions := true. +Opaque use_inlined_fp_conversions. + Definition singleoflong (e: expr) := SplitLong.singleoflong e. -Definition singleoflongu (e: expr) := SplitLong.singleoflongu e. +Definition singleoflongu (e: expr) := + if use_inlined_fp_conversions + then FPExtra.e_single_of_longu e + else SplitLong.singleoflongu e. End SELECT. diff --git a/kvx/SelectLongproof.v b/kvx/SelectLongproof.v index a88863b4..b858158b 100644 --- a/kvx/SelectLongproof.v +++ b/kvx/SelectLongproof.v @@ -939,7 +939,10 @@ Qed. Theorem eval_singleoflongu: partial_unary_constructor_sound singleoflongu Val.singleoflongu. Proof. unfold singleoflongu; red; intros. - eapply SplitLongproof.eval_singleoflongu; eauto. + destruct use_inlined_fp_conversions. + - econstructor. split. apply FPExtra.e_single_of_longu_correct. + eassumption. rewrite H0. cbn. constructor. + - eapply SplitLongproof.eval_singleoflongu; eauto. Qed. End CMCONSTR. -- cgit From 337c490d12c437dcbb5941e204ec1b1c4efa992b Mon Sep 17 00:00:00 2001 From: David Monniaux Date: Sat, 12 Feb 2022 13:14:43 +0100 Subject: fix bad reservation table for finvw --- kvx/PostpassSchedulingOracle.ml | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'kvx') diff --git a/kvx/PostpassSchedulingOracle.ml b/kvx/PostpassSchedulingOracle.ml index 3f4520a6..e752624c 100644 --- a/kvx/PostpassSchedulingOracle.ml +++ b/kvx/PostpassSchedulingOracle.ml @@ -47,7 +47,8 @@ type real_instruction = | Faddd | Faddw | Fsbfd | Fsbfw | Fmuld | Fmulw | Fmind | Fminw | Fmaxd | Fmaxw | Finvw | Ffmaw | Ffmad | Ffmsw | Ffmsd - | Fnarrowdw | Fwidenlwd | Floatwz | Floatuwz | Floatdz | Floatudz | Fixedwz | Fixeduwz | Fixeddz | Fixedudz + | Fnarrowdw | Fwidenlwd | Floatwz | Floatuwz | Floatdz | Floatudz + | Fixedw | Fixeduw | Fixedd | Fixedud | Fcompw | Fcompd type ab_inst_rec = { @@ -86,12 +87,12 @@ let arith_rr_real = function | Pfloatuwrnsz -> Floatuwz | Pfloatudrnsz -> Floatudz | Pfloatdrnsz -> Floatdz - | Pfixedwrzz -> Fixedwz - | Pfixeduwrzz -> Fixeduwz - | Pfixeddrzz -> Fixeddz - | Pfixedudrzz -> Fixedudz - | Pfixeddrzz_i32 -> Fixeddz - | Pfixedudrzz_i32 -> Fixedudz + | Pfixedwrzz | Pfixedwrne -> Fixedw + | Pfixeduwrzz | Pfixeduwrne -> Fixeduw + | Pfixeddrzz | Pfixeddrne -> Fixedd + | Pfixedudrzz| Pfixedudrne -> Fixedud + | Pfixeddrzz_i32 -> Fixedd + | Pfixedudrzz_i32 -> Fixedud let arith_rrr_real = function | Pcompw it -> Compw @@ -643,7 +644,7 @@ let rec_to_usage r = (* TODO: check *) | Srsw | Srsd | Rorw -> (match encoding with None | Some U6 -> alu_lite | _ -> raise InvalidEncoding) | Extfz | Extfs | Insf -> (match encoding with None -> alu_lite | _ -> raise InvalidEncoding) - | Fixeduwz | Fixedwz | Floatwz | Floatuwz | Fixeddz | Fixedudz | Floatdz | Floatudz -> mau + | Fixeduw | Fixedw | Floatwz | Floatuwz | Fixedd | Fixedud | Floatdz | Floatudz -> mau | Lbs | Lbz | Lhs | Lhz | Lws | Ld | Lq | Lo -> (match encoding with None | Some U6 | Some S10 -> lsu_auxw | Some U27L5 | Some U27L10 -> lsu_auxw_x @@ -656,8 +657,8 @@ let rec_to_usage r = | Get -> bcu_tiny_tiny_mau_xnop | Fnegd | Fnegw | Fabsd | Fabsw | Fwidenlwd | Fmind | Fmaxd | Fminw | Fmaxw -> alu_lite - | Fnarrowdw -> alu_full - | Faddd | Faddw | Fsbfd | Fsbfw | Fmuld | Fmulw | Finvw + | Finvw | Fnarrowdw -> alu_full + | Faddd | Faddw | Fsbfd | Fsbfw | Fmuld | Fmulw | Ffmad | Ffmaw | Ffmsd | Ffmsw -> mau @@ -681,7 +682,7 @@ let real_inst_to_latency = function | Extfs | Extfz | Insf | Fcompw | Fcompd | Cmoved | Addxw | Addxd | Fmind | Fmaxd | Fminw | Fmaxw -> 1 - | Floatwz | Floatuwz | Fixeduwz | Fixedwz | Floatdz | Floatudz | Fixeddz | Fixedudz -> 4 + | Floatwz | Floatuwz | Fixeduw | Fixedw | Floatdz | Floatudz | Fixedd | Fixedud -> 4 | Mulw | Muld | Maddw | Maddd | Msbfw | Msbfd -> 2 (* FIXME - WORST CASE. If it's S10 then it's only 1 *) | Lbs | Lbz | Lhs | Lhz | Lws | Ld | Lq | Lo -> 3 | Sb | Sh | Sw | Sd | Sq | So -> 1 (* See kvx-Optimization.pdf page 19 *) -- cgit