Make not a no-op for condition codes, only emit constants once
This commit is contained in:
@@ -565,7 +565,22 @@ impl<'module, M> CodeGenSession<'module, M> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_translated_code_section(self) -> Result<TranslatedCodeSection, Error> {
|
fn finalize(&mut self) {
|
||||||
|
let mut values = self.labels.values_mut().collect::<Vec<_>>();
|
||||||
|
values.sort_unstable_by_key(|(_, align, _)| *align);
|
||||||
|
for (label, align, func) in values {
|
||||||
|
if let Some(mut func) = func.take() {
|
||||||
|
dynasm!(self.assembler
|
||||||
|
; .align *align as usize
|
||||||
|
);
|
||||||
|
self.assembler.dynamic_label(label.0);
|
||||||
|
func(&mut self.assembler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn into_translated_code_section(mut self) -> Result<TranslatedCodeSection, Error> {
|
||||||
|
self.finalize();
|
||||||
let exec_buf = self
|
let exec_buf = self
|
||||||
.assembler
|
.assembler
|
||||||
.finalize()
|
.finalize()
|
||||||
@@ -2150,6 +2165,11 @@ impl<'this, M: ModuleContext> Context<'this, M> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let ValueLocation::Cond(loc) = val {
|
||||||
|
self.push(ValueLocation::Cond(!loc));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let reg = self.into_reg(I32, val).unwrap();
|
let reg = self.into_reg(I32, val).unwrap();
|
||||||
let out = self.take_reg(I32).unwrap();
|
let out = self.take_reg(I32).unwrap();
|
||||||
|
|
||||||
@@ -2174,6 +2194,11 @@ impl<'this, M: ModuleContext> Context<'this, M> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let ValueLocation::Cond(loc) = val {
|
||||||
|
self.push(ValueLocation::Cond(!loc));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let reg = self.into_reg(I64, val).unwrap();
|
let reg = self.into_reg(I64, val).unwrap();
|
||||||
let out = self.take_reg(I64).unwrap();
|
let out = self.take_reg(I64).unwrap();
|
||||||
|
|
||||||
@@ -5352,20 +5377,7 @@ impl<'this, M: ModuleContext> Context<'this, M> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Writes the function epilogue (right now all this does is add the trap label that the
|
|
||||||
/// conditional traps in `call_indirect` use)
|
|
||||||
pub fn epilogue(&mut self) {
|
pub fn epilogue(&mut self) {
|
||||||
let mut values = self.labels.values_mut().collect::<Vec<_>>();
|
|
||||||
values.sort_unstable_by_key(|(_, align, _)| *align);
|
|
||||||
for (label, align, func) in values {
|
|
||||||
if let Some(mut func) = func.take() {
|
|
||||||
dynasm!(self.asm
|
|
||||||
; .align *align as usize
|
|
||||||
);
|
|
||||||
self.asm.dynamic_label(label.0);
|
|
||||||
func(&mut self.asm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn trap(&mut self) {
|
pub fn trap(&mut self) {
|
||||||
|
|||||||
@@ -458,8 +458,8 @@ pub enum Operator<Label> {
|
|||||||
/// Returning from the function is just calling the "return" block
|
/// Returning from the function is just calling the "return" block
|
||||||
target: BrTarget<Label>,
|
target: BrTarget<Label>,
|
||||||
},
|
},
|
||||||
/// Pop a value off the top of the stack, jump to the `then` label if this value is `true`
|
/// Pop a value off the top of the stack, jump to the `else_` label if this value is `true`
|
||||||
/// and the `else_` label otherwise. The `then` and `else_` blocks must have the same parameters.
|
/// and the `then` label otherwise. The `then` and `else_` blocks must have the same parameters.
|
||||||
BrIf {
|
BrIf {
|
||||||
/// Label to jump to if the value at the top of the stack is true
|
/// Label to jump to if the value at the top of the stack is true
|
||||||
then: BrTargetDrop<Label>,
|
then: BrTargetDrop<Label>,
|
||||||
|
|||||||
Reference in New Issue
Block a user