aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kvx/SelectOp.vp10
1 files changed, 9 insertions, 1 deletions
diff --git a/kvx/SelectOp.vp b/kvx/SelectOp.vp
index 295506b9..5ddd2ca7 100644
--- a/kvx/SelectOp.vp
+++ b/kvx/SelectOp.vp
@@ -435,10 +435,18 @@ Nondetfunction or (e1: expr) (e2: expr) :=
(Int.eq_dec nmask (Int.not mask'))
then Eop (Oinsf zstop zstart) (prev:::fld:::Enil)
else Eop Oor (e1:::e2:::Enil)
+ else let zstart := 0 in
+ let zstop := int_highest_bit mask in
+ if is_bitfield zstop zstart
+ then
+ let mask' := Int.repr (zbitfield_mask zstop zstart) in
+ if and_dec (Int.eq_dec mask mask')
+ (Int.eq_dec nmask (Int.not mask'))
+ then Eop (Oinsf zstop zstart) (prev:::fld:::Enil)
+ else Eop Oor (e1:::e2:::Enil)
else Eop Oor (e1:::e2:::Enil)
| _, _ => Eop Oor (e1:::e2:::Enil)
end.
-(* TODO traiter le cas pas de shift *)
Nondetfunction xorimm (n1: int) (e2: expr) :=
if Int.eq n1 Int.zero