@@ -759,25 +759,38 @@ impl Evaluator<'_> {
759
759
let size = self . size_of_sized ( & ty, locals, "operand of unary op" ) ?;
760
760
c = self . read_memory ( Address :: from_bytes ( c) ?, size) ?;
761
761
}
762
- let mut c = c. to_vec ( ) ;
763
- if ty. as_builtin ( ) == Some ( BuiltinType :: Bool ) {
764
- c[ 0 ] = 1 - c[ 0 ] ;
762
+ if let TyKind :: Scalar ( chalk_ir:: Scalar :: Float ( f) ) = ty. kind ( Interner ) {
763
+ match f {
764
+ chalk_ir:: FloatTy :: F32 => {
765
+ let c = -from_bytes ! ( f32 , c) ;
766
+ Owned ( c. to_le_bytes ( ) . into ( ) )
767
+ }
768
+ chalk_ir:: FloatTy :: F64 => {
769
+ let c = -from_bytes ! ( f32 , c) ;
770
+ Owned ( c. to_le_bytes ( ) . into ( ) )
771
+ }
772
+ }
765
773
} else {
766
- match op {
767
- UnOp :: Not => c. iter_mut ( ) . for_each ( |x| * x = !* x) ,
768
- UnOp :: Neg => {
769
- c. iter_mut ( ) . for_each ( |x| * x = !* x) ;
770
- for k in c. iter_mut ( ) {
771
- let o;
772
- ( * k, o) = k. overflowing_add ( 1 ) ;
773
- if !o {
774
- break ;
774
+ let mut c = c. to_vec ( ) ;
775
+ if ty. as_builtin ( ) == Some ( BuiltinType :: Bool ) {
776
+ c[ 0 ] = 1 - c[ 0 ] ;
777
+ } else {
778
+ match op {
779
+ UnOp :: Not => c. iter_mut ( ) . for_each ( |x| * x = !* x) ,
780
+ UnOp :: Neg => {
781
+ c. iter_mut ( ) . for_each ( |x| * x = !* x) ;
782
+ for k in c. iter_mut ( ) {
783
+ let o;
784
+ ( * k, o) = k. overflowing_add ( 1 ) ;
785
+ if !o {
786
+ break ;
787
+ }
775
788
}
776
789
}
777
790
}
778
791
}
792
+ Owned ( c)
779
793
}
780
- Owned ( c)
781
794
}
782
795
Rvalue :: CheckedBinaryOp ( op, lhs, rhs) => {
783
796
let lc = self . eval_operand ( lhs, locals) ?;
0 commit comments