@@ -434,10 +434,10 @@ bool ConcolicInterpreter::i_instr_math_f32(Module *m, uint8_t opcode) {
434
434
m->sp -= 1 ;
435
435
switch (opcode) {
436
436
case 0x5b :
437
- c = z3::ite (z3::fp_eq (a, b) , m->ctx .bv_val (1 , 32 ), m->ctx .bv_val (0 , 32 ));
437
+ c = z3::ite (a == b , m->ctx .bv_val (1 , 32 ), m->ctx .bv_val (0 , 32 ));
438
438
break ; // f32.eq
439
439
case 0x5c :
440
- c = z3::ite (! z3::fp_eq (a, b) , m->ctx .bv_val (1 , 32 ), m->ctx .bv_val (0 , 32 ));
440
+ c = z3::ite (a != b , m->ctx .bv_val (1 , 32 ), m->ctx .bv_val (0 , 32 ));
441
441
break ; // f32.ne
442
442
case 0x5d :
443
443
c = z3::ite (a < b, m->ctx .bv_val (1 , 32 ), m->ctx .bv_val (0 , 32 ));
@@ -695,7 +695,6 @@ bool ConcolicInterpreter::i_instr_binary_i64(Module *m, uint8_t opcode) {
695
695
}
696
696
697
697
bool ConcolicInterpreter::i_instr_binary_f32 (Module *m, uint8_t opcode) {
698
- // TODO: Maybe reduce duplication since this is the same as i32?
699
698
int original_sp = m->sp ;
700
699
Interpreter::i_instr_binary_i64 (m, opcode);
701
700
m->sp = original_sp;
@@ -705,53 +704,28 @@ bool ConcolicInterpreter::i_instr_binary_f32(Module *m, uint8_t opcode) {
705
704
std::optional<z3::expr> c;
706
705
m->sp -= 1 ;
707
706
switch (opcode) {
708
- case 0x7c :
707
+ case 0x92 :
709
708
c = a + b;
710
709
break ; // f32.add
711
- case 0x7d :
710
+ case 0x93 :
712
711
c = a - b;
713
712
break ; // f32.sub
714
- case 0x7e :
713
+ case 0x94 :
715
714
c = a * b;
716
715
break ; // f32.mul
717
- case 0x7f :
716
+ case 0x95 :
718
717
c = a / b;
719
- break ; // f32.div_s
720
- case 0x80 :
721
- c = z3::udiv (a, b);
722
- break ; // f32.div_u
723
- case 0x81 :
724
- c = z3::srem (a, b);
725
- break ; // f32.rem_s
726
- case 0x82 :
727
- c = z3::urem (a, b);
728
- break ; // f32.rem_u
729
- case 0x83 :
730
- c = a & b;
731
- break ; // f32.and
732
- case 0x84 :
733
- c = a | b;
734
- break ; // f32.or
735
- case 0x85 :
736
- c = a ^ b;
737
- break ; // f32.xor
738
- case 0x86 :
739
- c = z3::shl (a, b);
740
- break ; // f32.shl
741
- case 0x87 :
742
- c = z3::ashr (a, b);
743
- break ; // f32.shr_s
744
- case 0x88 :
745
- c = z3::lshr (a, b);
746
- break ; // f32.shr_u
747
- case 0x89 :
748
- // TODO: Symbolic semantics
749
- c = z3::shl (a, b) | z3::lshr (a, 32 - b);
750
- break ; // f32.rotl
751
- case 0x8a :
718
+ break ; // f32.div
719
+ case 0x96 :
720
+ c = z3::min (a, b);
721
+ break ; // f32.min
722
+ case 0x97 :
723
+ c = z3::max (a, b);
724
+ break ; // f32.max
725
+ case 0x98 :
752
726
// TODO: Symbolic semantics
753
727
assert (false );
754
- break ; // f32.rotr
728
+ break ; // f32.copysign
755
729
default :
756
730
return false ;
757
731
}
0 commit comments