fuzzgen: Add atomic_cas instruction (#5886)
This commit is contained in:
@@ -290,6 +290,36 @@ fn insert_atomic_rmw(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn insert_atomic_cas(
|
||||||
|
fgen: &mut FunctionGenerator,
|
||||||
|
builder: &mut FunctionBuilder,
|
||||||
|
_: Opcode,
|
||||||
|
_: &'static [Type],
|
||||||
|
rets: &'static [Type],
|
||||||
|
) -> Result<()> {
|
||||||
|
let ctrl_type = *rets.first().unwrap();
|
||||||
|
let type_size = ctrl_type.bytes();
|
||||||
|
|
||||||
|
let (address, flags, offset) = fgen.generate_address_and_memflags(builder, type_size, true)?;
|
||||||
|
|
||||||
|
// AtomicCas does not directly support offsets, so add the offset to the address separately.
|
||||||
|
let address = builder.ins().iadd_imm(address, i64::from(offset));
|
||||||
|
|
||||||
|
// Source and Target variables
|
||||||
|
let expected_var = fgen.get_variable_of_type(ctrl_type)?;
|
||||||
|
let store_var = fgen.get_variable_of_type(ctrl_type)?;
|
||||||
|
let loaded_var = fgen.get_variable_of_type(ctrl_type)?;
|
||||||
|
|
||||||
|
let expected_val = builder.use_var(expected_var);
|
||||||
|
let store_val = builder.use_var(store_var);
|
||||||
|
let new_val = builder
|
||||||
|
.ins()
|
||||||
|
.atomic_cas(flags, address, expected_val, store_val);
|
||||||
|
|
||||||
|
builder.def_var(loaded_var, new_val);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
type OpcodeInserter = fn(
|
type OpcodeInserter = fn(
|
||||||
fgen: &mut FunctionGenerator,
|
fgen: &mut FunctionGenerator,
|
||||||
builder: &mut FunctionBuilder,
|
builder: &mut FunctionBuilder,
|
||||||
@@ -1272,6 +1302,11 @@ const OPCODE_SIGNATURES: &[OpcodeSignature] = &[
|
|||||||
(Opcode::AtomicRmw, &[I16, I16], &[I16], insert_atomic_rmw),
|
(Opcode::AtomicRmw, &[I16, I16], &[I16], insert_atomic_rmw),
|
||||||
(Opcode::AtomicRmw, &[I32, I32], &[I32], insert_atomic_rmw),
|
(Opcode::AtomicRmw, &[I32, I32], &[I32], insert_atomic_rmw),
|
||||||
(Opcode::AtomicRmw, &[I64, I64], &[I64], insert_atomic_rmw),
|
(Opcode::AtomicRmw, &[I64, I64], &[I64], insert_atomic_rmw),
|
||||||
|
// AtomicCas
|
||||||
|
(Opcode::AtomicCas, &[I8, I8], &[I8], insert_atomic_cas),
|
||||||
|
(Opcode::AtomicCas, &[I16, I16], &[I16], insert_atomic_cas),
|
||||||
|
(Opcode::AtomicCas, &[I32, I32], &[I32], insert_atomic_cas),
|
||||||
|
(Opcode::AtomicCas, &[I64, I64], &[I64], insert_atomic_cas),
|
||||||
// Bitcast
|
// Bitcast
|
||||||
(Opcode::Bitcast, &[F32], &[I32], insert_bitcast),
|
(Opcode::Bitcast, &[F32], &[I32], insert_bitcast),
|
||||||
(Opcode::Bitcast, &[I32], &[F32], insert_bitcast),
|
(Opcode::Bitcast, &[I32], &[F32], insert_bitcast),
|
||||||
|
|||||||
Reference in New Issue
Block a user