cranelift: Add atomic_cas to interpreter (#5875)

As per issue #5818, atomic_cas was implemented without specific regard for thread safety.
This commit is contained in:
Jan-Justin van Tonder
2023-02-25 15:36:49 +01:00
committed by GitHub
parent e9095050be
commit 66cb13cb4b
2 changed files with 19 additions and 1 deletions

View File

@@ -1,3 +1,4 @@
test interpret
test run
target s390x

View File

@@ -1269,7 +1269,24 @@ where
Address::try_from(addr).and_then(|addr| state.checked_store(addr, replace));
assign_or_memtrap(stored.map(|_| prev_val_to_assign))
}
Opcode::AtomicCas => unimplemented!("AtomicCas"),
Opcode::AtomicCas => {
let addr = arg(0)?.into_int()? as u64;
let loaded = Address::try_from(addr).and_then(|addr| state.checked_load(addr, ctrl_ty));
let loaded_val = match loaded {
Ok(v) => v,
Err(e) => return Ok(ControlFlow::Trap(CraneliftTrap::User(memerror_to_trap(e)))),
};
let expected_val = arg(1)?;
let val_to_assign = if Value::eq(&loaded_val, &expected_val)? {
let val_to_store = arg(2)?;
Address::try_from(addr)
.and_then(|addr| state.checked_store(addr, val_to_store))
.map(|_| loaded_val)
} else {
Ok(loaded_val)
};
assign_or_memtrap(val_to_assign)
}
Opcode::AtomicLoad => {
let load_ty = inst_context.controlling_type().unwrap();
let addr = arg(0)?.into_int()? as u64;