@@ -616,22 +616,34 @@ fn codegen_stmt<'tcx>(
616
616
Rvalue :: UnaryOp ( un_op, ref operand) => {
617
617
let operand = codegen_operand ( fx, operand) ;
618
618
let layout = operand. layout ( ) ;
619
- let val = operand. load_scalar ( fx) ;
620
619
let res = match un_op {
621
- UnOp :: Not => match layout. ty . kind ( ) {
622
- ty:: Bool => {
623
- let res = fx. bcx . ins ( ) . icmp_imm ( IntCC :: Equal , val, 0 ) ;
624
- CValue :: by_val ( res, layout)
620
+ UnOp :: Not => {
621
+ let val = operand. load_scalar ( fx) ;
622
+ match layout. ty . kind ( ) {
623
+ ty:: Bool => {
624
+ let res = fx. bcx . ins ( ) . icmp_imm ( IntCC :: Equal , val, 0 ) ;
625
+ CValue :: by_val ( res, layout)
626
+ }
627
+ ty:: Uint ( _) | ty:: Int ( _) => {
628
+ CValue :: by_val ( fx. bcx . ins ( ) . bnot ( val) , layout)
629
+ }
630
+ _ => unreachable ! ( "un op Not for {:?}" , layout. ty) ,
625
631
}
626
- ty:: Uint ( _) | ty:: Int ( _) => {
627
- CValue :: by_val ( fx. bcx . ins ( ) . bnot ( val) , layout)
632
+ }
633
+ UnOp :: Neg => {
634
+ let val = operand. load_scalar ( fx) ;
635
+ match layout. ty . kind ( ) {
636
+ ty:: Int ( _) => CValue :: by_val ( fx. bcx . ins ( ) . ineg ( val) , layout) ,
637
+ ty:: Float ( _) => CValue :: by_val ( fx. bcx . ins ( ) . fneg ( val) , layout) ,
638
+ _ => unreachable ! ( "un op Neg for {:?}" , layout. ty) ,
628
639
}
629
- _ => unreachable ! ( "un op Not for {:?}" , layout. ty) ,
630
- } ,
631
- UnOp :: Neg => match layout. ty . kind ( ) {
632
- ty:: Int ( _) => CValue :: by_val ( fx. bcx . ins ( ) . ineg ( val) , layout) ,
633
- ty:: Float ( _) => CValue :: by_val ( fx. bcx . ins ( ) . fneg ( val) , layout) ,
634
- _ => unreachable ! ( "un op Neg for {:?}" , layout. ty) ,
640
+ }
641
+ UnOp :: PtrMetadata => match layout. abi {
642
+ Abi :: Scalar ( _) => CValue :: zst ( dest_layout) ,
643
+ Abi :: ScalarPair ( _, _) => {
644
+ CValue :: by_val ( operand. load_scalar_pair ( fx) . 1 , dest_layout)
645
+ }
646
+ _ => bug ! ( "Unexpected `PtrToMetadata` operand: {operand:?}" ) ,
635
647
} ,
636
648
} ;
637
649
lval. write_cvalue ( fx, res) ;
0 commit comments