(
fgen: &mut FunctionGenerator,
builder: &mut FunctionBuilder,
_: Opcode,
_: &[Type],
rets: &[Type],
)
| 361 | } |
| 362 | |
| 363 | fn insert_atomic_cas( |
| 364 | fgen: &mut FunctionGenerator, |
| 365 | builder: &mut FunctionBuilder, |
| 366 | _: Opcode, |
| 367 | _: &[Type], |
| 368 | rets: &[Type], |
| 369 | ) -> Result<()> { |
| 370 | let ctrl_type = *rets.first().unwrap(); |
| 371 | let type_size = ctrl_type.bytes(); |
| 372 | |
| 373 | let (address, flags, offset) = fgen.generate_address_and_memflags(builder, type_size, true)?; |
| 374 | |
| 375 | // AtomicCas does not directly support offsets, so add the offset to the address separately. |
| 376 | let address = builder.ins().iadd_imm(address, i64::from(offset)); |
| 377 | |
| 378 | // Source and Target variables |
| 379 | let expected_var = fgen.get_variable_of_type(ctrl_type)?; |
| 380 | let store_var = fgen.get_variable_of_type(ctrl_type)?; |
| 381 | let loaded_var = fgen.get_variable_of_type(ctrl_type)?; |
| 382 | |
| 383 | let expected_val = builder.use_var(expected_var); |
| 384 | let store_val = builder.use_var(store_var); |
| 385 | let new_val = builder |
| 386 | .ins() |
| 387 | .atomic_cas(flags, address, expected_val, store_val); |
| 388 | |
| 389 | builder.def_var(loaded_var, new_val); |
| 390 | Ok(()) |
| 391 | } |
| 392 | |
| 393 | fn insert_shuffle( |
| 394 | fgen: &mut FunctionGenerator, |
nothing calls this directly
no test coverage detected