Skip to content

Commit 703027f

Browse files
committed
Code cleanup as a follow up to the previous commit
1 parent 894468a commit 703027f

File tree

1 file changed

+44
-41
lines changed

1 file changed

+44
-41
lines changed

src/inline_asm.rs

Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ pub(crate) fn codegen_inline_asm<'tcx>(
103103
crate::trap::trap_unimplemented(fx, "Alloca is not supported");
104104
}
105105

106-
let mut clobbered_regs = Vec::new();
107106
let mut inputs = Vec::new();
108107
let mut outputs = Vec::new();
109108

@@ -122,40 +121,37 @@ pub(crate) fn codegen_inline_asm<'tcx>(
122121
asm_gen.allocate_registers();
123122
asm_gen.allocate_stack_slots();
124123

124+
let inline_asm_index = fx.inline_asm_index;
125+
fx.inline_asm_index += 1;
126+
let asm_name = format!("{}__inline_asm_{}", fx.symbol_name, inline_asm_index);
127+
128+
let generated_asm = asm_gen.generate_asm_wrapper(&asm_name);
129+
fx.cx.global_asm.push_str(&generated_asm);
130+
125131
// FIXME overlap input and output slots to save stack space
126132
for (i, operand) in operands.iter().enumerate() {
127133
match *operand {
128-
InlineAsmOperand::In { reg, ref value } => {
129-
let reg = asm_gen.registers[i].unwrap();
130-
clobbered_regs.push((reg, asm_gen.stack_slots_clobber[i].unwrap()));
134+
InlineAsmOperand::In { reg: _, ref value } => {
131135
inputs.push((
132-
reg,
133136
asm_gen.stack_slots_input[i].unwrap(),
134137
crate::base::codegen_operand(fx, value).load_scalar(fx),
135138
));
136139
}
137-
InlineAsmOperand::Out { reg, late: _, place } => {
138-
let reg = asm_gen.registers[i].unwrap();
139-
clobbered_regs.push((reg, asm_gen.stack_slots_clobber[i].unwrap()));
140+
InlineAsmOperand::Out { reg: _, late: _, place } => {
140141
if let Some(place) = place {
141142
outputs.push((
142-
reg,
143143
asm_gen.stack_slots_output[i].unwrap(),
144144
crate::base::codegen_place(fx, place),
145145
));
146146
}
147147
}
148-
InlineAsmOperand::InOut { reg, late: _, ref in_value, out_place } => {
149-
let reg = asm_gen.registers[i].unwrap();
150-
clobbered_regs.push((reg, asm_gen.stack_slots_clobber[i].unwrap()));
148+
InlineAsmOperand::InOut { reg: _, late: _, ref in_value, out_place } => {
151149
inputs.push((
152-
reg,
153150
asm_gen.stack_slots_input[i].unwrap(),
154151
crate::base::codegen_operand(fx, in_value).load_scalar(fx),
155152
));
156153
if let Some(out_place) = out_place {
157154
outputs.push((
158-
reg,
159155
asm_gen.stack_slots_output[i].unwrap(),
160156
crate::base::codegen_place(fx, out_place),
161157
));
@@ -167,13 +163,6 @@ pub(crate) fn codegen_inline_asm<'tcx>(
167163
}
168164
}
169165

170-
let inline_asm_index = fx.inline_asm_index;
171-
fx.inline_asm_index += 1;
172-
let asm_name = format!("{}__inline_asm_{}", fx.symbol_name, inline_asm_index);
173-
174-
let generated_asm = asm_gen.generate_asm_wrapper(&asm_name, clobbered_regs, &inputs, &outputs);
175-
fx.cx.global_asm.push_str(&generated_asm);
176-
177166
call_inline_asm(fx, &asm_name, asm_gen.stack_slot_size, inputs, outputs);
178167
}
179168

@@ -364,13 +353,7 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
364353
self.stack_slot_size = slot_size;
365354
}
366355

367-
fn generate_asm_wrapper(
368-
&self,
369-
asm_name: &str,
370-
clobbered_regs: Vec<(InlineAsmReg, Size)>,
371-
inputs: &[(InlineAsmReg, Size, Value)],
372-
outputs: &[(InlineAsmReg, Size, CPlace<'_>)],
373-
) -> String {
356+
fn generate_asm_wrapper(&self, asm_name: &str) -> String {
374357
let mut generated_asm = String::new();
375358
writeln!(generated_asm, ".globl {}", asm_name).unwrap();
376359
writeln!(generated_asm, ".type {},@function", asm_name).unwrap();
@@ -384,14 +367,24 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
384367
// Save clobbered registers
385368
if !self.options.contains(InlineAsmOptions::NORETURN) {
386369
// FIXME skip registers saved by the calling convention
387-
for &(reg, offset) in &clobbered_regs {
388-
save_register(&mut generated_asm, self.arch, reg, offset);
370+
for (reg, slot) in self
371+
.registers
372+
.iter()
373+
.zip(self.stack_slots_clobber.iter().copied())
374+
.filter_map(|(r, s)| r.zip(s))
375+
{
376+
save_register(&mut generated_asm, self.arch, reg, slot);
389377
}
390378
}
391379

392380
// Write input registers
393-
for &(reg, offset, _value) in inputs {
394-
restore_register(&mut generated_asm, self.arch, reg, offset);
381+
for (reg, slot) in self
382+
.registers
383+
.iter()
384+
.zip(self.stack_slots_input.iter().copied())
385+
.filter_map(|(r, s)| r.zip(s))
386+
{
387+
restore_register(&mut generated_asm, self.arch, reg, slot);
395388
}
396389

397390
if self.options.contains(InlineAsmOptions::ATT_SYNTAX) {
@@ -414,19 +407,29 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
414407
}
415408
generated_asm.push('\n');
416409

417-
if self.options.contains(InlineAsmOptions::ATT_SYNTAX) {
410+
if is_x86 && self.options.contains(InlineAsmOptions::ATT_SYNTAX) {
418411
generated_asm.push_str(".intel_syntax noprefix\n");
419412
}
420413

421414
if !self.options.contains(InlineAsmOptions::NORETURN) {
422415
// Read output registers
423-
for &(reg, offset, _place) in outputs {
424-
save_register(&mut generated_asm, self.arch, reg, offset);
416+
for (reg, slot) in self
417+
.registers
418+
.iter()
419+
.zip(self.stack_slots_output.iter().copied())
420+
.filter_map(|(r, s)| r.zip(s))
421+
{
422+
save_register(&mut generated_asm, self.arch, reg, slot);
425423
}
426424

427425
// Restore clobbered registers
428-
for &(reg, offset) in clobbered_regs.iter().rev() {
429-
restore_register(&mut generated_asm, self.arch, reg, offset);
426+
for (reg, slot) in self
427+
.registers
428+
.iter()
429+
.zip(self.stack_slots_clobber.iter().copied())
430+
.filter_map(|(r, s)| r.zip(s))
431+
{
432+
restore_register(&mut generated_asm, self.arch, reg, slot);
430433
}
431434

432435
generated_asm.push_str(" pop rbp\n");
@@ -448,8 +451,8 @@ fn call_inline_asm<'tcx>(
448451
fx: &mut FunctionCx<'_, '_, 'tcx>,
449452
asm_name: &str,
450453
slot_size: Size,
451-
inputs: Vec<(InlineAsmReg, Size, Value)>,
452-
outputs: Vec<(InlineAsmReg, Size, CPlace<'tcx>)>,
454+
inputs: Vec<(Size, Value)>,
455+
outputs: Vec<(Size, CPlace<'tcx>)>,
453456
) {
454457
let stack_slot = fx.bcx.func.create_stack_slot(StackSlotData {
455458
kind: StackSlotKind::ExplicitSlot,
@@ -476,14 +479,14 @@ fn call_inline_asm<'tcx>(
476479
fx.add_comment(inline_asm_func, asm_name);
477480
}
478481

479-
for (_reg, offset, value) in inputs {
482+
for (offset, value) in inputs {
480483
fx.bcx.ins().stack_store(value, stack_slot, i32::try_from(offset.bytes()).unwrap());
481484
}
482485

483486
let stack_slot_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0);
484487
fx.bcx.ins().call(inline_asm_func, &[stack_slot_addr]);
485488

486-
for (_reg, offset, place) in outputs {
489+
for (offset, place) in outputs {
487490
let ty = fx.clif_type(place.layout().ty).unwrap();
488491
let value = fx.bcx.ins().stack_load(ty, stack_slot, i32::try_from(offset.bytes()).unwrap());
489492
place.write_cvalue(fx, CValue::by_val(value, place.layout()));

0 commit comments

Comments
 (0)