@@ -105,27 +105,27 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
105105 }
106106
107107 "or" => {
108- let ord = get_ord_at ( 1 ) ;
108+ let ord = get_ord_at ( 2 ) ;
109109 this. atomic_rmw_op ( args, dest, AtomicOp :: MirOp ( BinOp :: BitOr , false ) , rw_ord ( ord) ) ?;
110110 }
111111 "xor" => {
112- let ord = get_ord_at ( 1 ) ;
112+ let ord = get_ord_at ( 2 ) ;
113113 this. atomic_rmw_op ( args, dest, AtomicOp :: MirOp ( BinOp :: BitXor , false ) , rw_ord ( ord) ) ?;
114114 }
115115 "and" => {
116- let ord = get_ord_at ( 1 ) ;
116+ let ord = get_ord_at ( 2 ) ;
117117 this. atomic_rmw_op ( args, dest, AtomicOp :: MirOp ( BinOp :: BitAnd , false ) , rw_ord ( ord) ) ?;
118118 }
119119 "nand" => {
120- let ord = get_ord_at ( 1 ) ;
120+ let ord = get_ord_at ( 2 ) ;
121121 this. atomic_rmw_op ( args, dest, AtomicOp :: MirOp ( BinOp :: BitAnd , true ) , rw_ord ( ord) ) ?;
122122 }
123123 "xadd" => {
124- let ord = get_ord_at ( 1 ) ;
124+ let ord = get_ord_at ( 2 ) ;
125125 this. atomic_rmw_op ( args, dest, AtomicOp :: MirOp ( BinOp :: Add , false ) , rw_ord ( ord) ) ?;
126126 }
127127 "xsub" => {
128- let ord = get_ord_at ( 1 ) ;
128+ let ord = get_ord_at ( 2 ) ;
129129 this. atomic_rmw_op ( args, dest, AtomicOp :: MirOp ( BinOp :: Sub , false ) , rw_ord ( ord) ) ?;
130130 }
131131 "min" => {
@@ -231,15 +231,14 @@ trait EvalContextPrivExt<'tcx>: MiriInterpCxExt<'tcx> {
231231 let place = this. deref_pointer ( place) ?;
232232 let rhs = this. read_immediate ( rhs) ?;
233233
234- if !place. layout . ty . is_integral ( ) && !place. layout . ty . is_raw_ptr ( ) {
234+ if !( place. layout . ty . is_integral ( ) || place. layout . ty . is_raw_ptr ( ) )
235+ || !( rhs. layout . ty . is_integral ( ) || rhs. layout . ty . is_raw_ptr ( ) )
236+ {
235237 span_bug ! (
236238 this. cur_span( ) ,
237239 "atomic arithmetic operations only work on integer and raw pointer types" ,
238240 ) ;
239241 }
240- if rhs. layout . ty != place. layout . ty {
241- span_bug ! ( this. cur_span( ) , "atomic arithmetic operation type mismatch" ) ;
242- }
243242
244243 let old = match atomic_op {
245244 AtomicOp :: Min =>
0 commit comments