@@ -598,8 +598,9 @@ void FpBinOp::print(ostream &os) const {
598598 case FMinimum: str = " fminimum " ; break ;
599599 case CopySign: str = " copysign " ; break ;
600600 }
601- os << getName () << " = " << str << fmath << *lhs << " , " << rhs->getName ()
602- << " , rounding=" << rm;
601+ os << getName () << " = " << str << fmath << *lhs << " , " << rhs->getName ();
602+ if (!rm.isDefault ())
603+ os << " , rounding=" << rm;
603604}
604605
605606static expr any_fp_zero (State &s, const expr &v) {
@@ -701,25 +702,22 @@ static StateValue fm_poison(State &s, const expr &a, const expr &ap,
701702
702703static StateValue round_value (const function<StateValue(FpRoundingMode)> &fn,
703704 const State &s, FpRoundingMode rm) {
704- if (! rm.isDynamic ())
705- return fn (rm );
705+ if (rm.isDefault ())
706+ return fn (FpRoundingMode::RNE );
706707
707708 auto &var = s.getFpRoundingMode ();
709+ if (!rm.isDynamic ()) {
710+ auto [v, np] = fn (rm);
711+ return { move (v), np && var == rm.getMode () };
712+ }
713+
708714 return StateValue::mkIf (var == FpRoundingMode::RNE, fn (FpRoundingMode::RNE),
709715 StateValue::mkIf (var == FpRoundingMode::RNA, fn (FpRoundingMode::RNA),
710716 StateValue::mkIf (var == FpRoundingMode::RTP, fn (FpRoundingMode::RTP),
711717 StateValue::mkIf (var == FpRoundingMode::RTN, fn (FpRoundingMode::RTN),
712718 fn (FpRoundingMode::RTZ)))));
713719}
714720
715- static expr get_fp_rounding (const State &s) {
716- auto &var = s.getFpRoundingMode ();
717- return expr::mkIf (var == FpRoundingMode::RNE, expr::rne (),
718- expr::mkIf (var == FpRoundingMode::RNA, expr::rna (),
719- expr::mkIf (var == FpRoundingMode::RTP, expr::rtp (),
720- expr::mkIf (var == FpRoundingMode::RTN, expr::rtn (), expr::rtz ()))));
721- }
722-
723721StateValue FpBinOp::toSMT (State &s) const {
724722 function<StateValue (const expr&, const expr&, const expr&, const expr&,
725723 FpRoundingMode)> fn;
@@ -989,7 +987,9 @@ void FpUnaryOp::print(ostream &os) const {
989987 case Sqrt: str = " sqrt " ; break ;
990988 }
991989
992- os << getName () << " = " << str << fmath << *val << " , rounding=" << rm;
990+ os << getName () << " = " << str << fmath << *val;
991+ if (!rm.isDefault ())
992+ os << " , rounding=" << rm;
993993}
994994
995995StateValue FpUnaryOp::toSMT (State &s) const {
@@ -1260,8 +1260,9 @@ void FpTernaryOp::print(ostream &os) const {
12601260 case MulAdd: str = " fmuladd " ; break ;
12611261 }
12621262
1263- os << getName () << " = " << str << fmath << *a << " , " << *b << " , " << *c
1264- << " , rounding=" << rm;
1263+ os << getName () << " = " << str << fmath << *a << " , " << *b << " , " << *c;
1264+ if (!rm.isDefault ())
1265+ os << " , rounding=" << rm;
12651266}
12661267
12671268StateValue FpTernaryOp::toSMT (State &s) const {
@@ -1492,8 +1493,9 @@ void FpConversionOp::print(ostream &os) const {
14921493 case LRound: str = " lround " ; break ;
14931494 }
14941495
1495- os << getName () << " = " << str << *val << print_type (getType (), " to " , " " )
1496- << " , rounding=" << rm;
1496+ os << getName () << " = " << str << *val << print_type (getType (), " to " , " " );
1497+ if (!rm.isDefault ())
1498+ os << " , rounding=" << rm;
14971499}
14981500
14991501StateValue FpConversionOp::toSMT (State &s) const {
@@ -1516,14 +1518,14 @@ StateValue FpConversionOp::toSMT(State &s) const {
15161518 case FPToSInt:
15171519 case LRInt:
15181520 case LRound:
1519- fn = [&](auto &val, auto &to_type, auto rm_ ) -> StateValue {
1521+ fn = [&](auto &val, auto &to_type, auto rm_in ) -> StateValue {
15201522 expr rm;
15211523 switch (op) {
15221524 case FPToSInt:
15231525 rm = expr::rtz ();
15241526 break ;
15251527 case LRInt:
1526- rm = get_fp_rounding (s );
1528+ rm = rm_in. toSMT ( );
15271529 break ;
15281530 case LRound:
15291531 rm = expr::rna ();
0 commit comments