@@ -671,8 +671,17 @@ static void vm_exec(bvm *vm)
671
671
if (var_isint (a ) && var_isint (b )) {
672
672
var_setint (dst , ibinop (- , a , b ));
673
673
} else if (var_isnumber (a ) && var_isnumber (b )) {
674
+ #if CONFIG_IDF_TARGET_ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */
675
+ union bvaldata x , y ; // TASMOTA workaround for ESP32 rev0 bug
676
+ x .i = a -> v .i ;
677
+ if (var_isint (a )) { x .r = (breal ) x .i ; }
678
+ y .i = b -> v .i ;
679
+ if (var_isint (b )) { y .r = (breal ) y .i ; }
680
+ var_setreal (dst , x .r - y .r );
681
+ #else // CONFIG_IDF_TARGET_ESP32
674
682
breal x = var2real (a ), y = var2real (b );
675
683
var_setreal (dst , x - y );
684
+ #endif // CONFIG_IDF_TARGET_ESP32
676
685
} else if (var_isinstance (a )) {
677
686
ins_binop (vm , "-" , ins );
678
687
} else {
@@ -685,8 +694,17 @@ static void vm_exec(bvm *vm)
685
694
if (var_isint (a ) && var_isint (b )) {
686
695
var_setint (dst , ibinop (* , a , b ));
687
696
} else if (var_isnumber (a ) && var_isnumber (b )) {
697
+ #if CONFIG_IDF_TARGET_ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */
698
+ union bvaldata x , y ; // TASMOTA workaround for ESP32 rev0 bug
699
+ x .i = a -> v .i ;
700
+ if (var_isint (a )) { x .r = (breal ) x .i ; }
701
+ y .i = b -> v .i ;
702
+ if (var_isint (b )) { y .r = (breal ) y .i ; }
703
+ var_setreal (dst , x .r * y .r );
704
+ #else // CONFIG_IDF_TARGET_ESP32
688
705
breal x = var2real (a ), y = var2real (b );
689
706
var_setreal (dst , x * y );
707
+ #endif // CONFIG_IDF_TARGET_ESP32
690
708
} else if (var_isinstance (a )) {
691
709
ins_binop (vm , "*" , ins );
692
710
} else {
@@ -704,11 +722,23 @@ static void vm_exec(bvm *vm)
704
722
var_setint (dst , x / y );
705
723
}
706
724
} else if (var_isnumber (a ) && var_isnumber (b )) {
725
+ #if CONFIG_IDF_TARGET_ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */
726
+ union bvaldata x , y ; // TASMOTA workaround for ESP32 rev0 bug
727
+ x .i = a -> v .i ;
728
+ if (var_isint (a )) { x .r = (breal ) x .i ; }
729
+ y .i = b -> v .i ;
730
+ if (var_isint (b )) { y .r = (breal ) y .i ; }
731
+ if (y .r == cast (breal , 0 )) {
732
+ vm_error (vm , "divzero_error" , "division by zero" );
733
+ }
734
+ var_setreal (dst , x .r / y .r );
735
+ #else // CONFIG_IDF_TARGET_ESP32
707
736
breal x = var2real (a ), y = var2real (b );
708
737
if (y == cast (breal , 0 )) {
709
738
vm_error (vm , "divzero_error" , "division by zero" );
710
739
}
711
740
var_setreal (dst , x / y );
741
+ #endif // CONFIG_IDF_TARGET_ESP32
712
742
} else if (var_isinstance (a )) {
713
743
ins_binop (vm , "/" , ins );
714
744
} else {
@@ -721,7 +751,16 @@ static void vm_exec(bvm *vm)
721
751
if (var_isint (a ) && var_isint (b )) {
722
752
var_setint (dst , ibinop (%, a , b ));
723
753
} else if (var_isnumber (a ) && var_isnumber (b )) {
754
+ #if CONFIG_IDF_TARGET_ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */
755
+ union bvaldata x , y ; // TASMOTA workaround for ESP32 rev0 bug
756
+ x .i = a -> v .i ;
757
+ if (var_isint (a )) { x .r = (breal ) x .i ; }
758
+ y .i = b -> v .i ;
759
+ if (var_isint (b )) { y .r = (breal ) y .i ; }
760
+ var_setreal (dst , mathfunc (fmod )(x .r , y .r ));
761
+ #else // CONFIG_IDF_TARGET_ESP32
724
762
var_setreal (dst , mathfunc (fmod )(var_toreal (a ), var_toreal (b )));
763
+ #endif // CONFIG_IDF_TARGET_ESP32
725
764
} else if (var_isinstance (a )) {
726
765
ins_binop (vm , "%" , ins );
727
766
} else {
0 commit comments