(
fgen: &mut FunctionGenerator,
builder: &mut FunctionBuilder,
opcode: Opcode,
args: &[Type],
rets: &[Type],
)
| 271 | } |
| 272 | |
| 273 | fn insert_load_store( |
| 274 | fgen: &mut FunctionGenerator, |
| 275 | builder: &mut FunctionBuilder, |
| 276 | opcode: Opcode, |
| 277 | args: &[Type], |
| 278 | rets: &[Type], |
| 279 | ) -> Result<()> { |
| 280 | if opcode == Opcode::Bitcast { |
| 281 | return insert_bitcast(fgen, builder, args, rets); |
| 282 | } |
| 283 | |
| 284 | let ctrl_type = *rets.first().or(args.first()).unwrap(); |
| 285 | let type_size = ctrl_type.bytes(); |
| 286 | |
| 287 | let is_atomic = [Opcode::AtomicLoad, Opcode::AtomicStore].contains(&opcode); |
| 288 | let (address, flags_data, offset) = |
| 289 | fgen.generate_address_and_memflags(builder, type_size, is_atomic)?; |
| 290 | |
| 291 | // The variable being loaded or stored into |
| 292 | let var = fgen.get_variable_of_type(ctrl_type)?; |
| 293 | |
| 294 | let flags = builder.func.dfg.mem_flags.insert(flags_data).unwrap(); |
| 295 | |
| 296 | match opcode.format() { |
| 297 | InstructionFormat::LoadNoOffset => { |
| 298 | let (inst, dfg) = builder |
| 299 | .ins() |
| 300 | .LoadNoOffset(opcode, ctrl_type, flags, address); |
| 301 | |
| 302 | let new_val = dfg.first_result(inst); |
| 303 | builder.def_var(var, new_val); |
| 304 | } |
| 305 | InstructionFormat::StoreNoOffset => { |
| 306 | let val = builder.use_var(var); |
| 307 | |
| 308 | builder |
| 309 | .ins() |
| 310 | .StoreNoOffset(opcode, ctrl_type, flags, val, address); |
| 311 | } |
| 312 | InstructionFormat::Store => { |
| 313 | let val = builder.use_var(var); |
| 314 | |
| 315 | builder |
| 316 | .ins() |
| 317 | .Store(opcode, ctrl_type, flags, offset, val, address); |
| 318 | } |
| 319 | InstructionFormat::Load => { |
| 320 | let (inst, dfg) = builder |
| 321 | .ins() |
| 322 | .Load(opcode, ctrl_type, flags, offset, address); |
| 323 | |
| 324 | let new_val = dfg.first_result(inst); |
| 325 | builder.def_var(var, new_val); |
| 326 | } |
| 327 | _ => unimplemented!(), |
| 328 | } |
| 329 | |
| 330 | Ok(()) |
nothing calls this directly
no test coverage detected