aboutsummaryrefslogtreecommitdiffstats
path: root/x86/SelectOp.vp
diff options
context:
space:
mode:
Diffstat (limited to 'x86/SelectOp.vp')
-rw-r--r--x86/SelectOp.vp12
1 files changed, 9 insertions, 3 deletions
diff --git a/x86/SelectOp.vp b/x86/SelectOp.vp
index df9c5394..701e8e0d 100644
--- a/x86/SelectOp.vp
+++ b/x86/SelectOp.vp
@@ -500,11 +500,17 @@ Nondetfunction floatofint (e: expr) :=
Parameter favor_branchless: unit -> bool.
Definition intuoffloat (e: expr) :=
+ let e1 := intoffloat (Eletvar 1%nat) in
+ let e2 := addimm Float.ox8000_0000
+ (intoffloat (subf (Eletvar 1%nat) (Eletvar 0%nat))) in
Elet e
(Elet (Eop (Ofloatconst (Float.of_intu Float.ox8000_0000)) Enil)
- (Econdition (CEcond (Ccompf Clt) (Eletvar 1 ::: Eletvar 0 ::: Enil))
- (intoffloat (Eletvar 1))
- (addimm Float.ox8000_0000 (intoffloat (subf (Eletvar 1) (Eletvar 0))))))%nat.
+ (if favor_branchless tt then
+ Eop (Osel (Ccompf Clt) Tint)
+ (e1 ::: e2 ::: Eletvar 1 ::: Eletvar 0 ::: Enil)
+ else
+ Econdition (CEcond (Ccompf Clt) (Eletvar 1 ::: Eletvar 0 ::: Enil))
+ e1 e2))%nat.
Nondetfunction floatofintu (e: expr) :=
match e with