Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 27 additions & 57 deletions lib/compiler-singlepass/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -973,7 +973,6 @@ impl<'a, M: Machine> FuncGen<'a, M> {
{
let dst = self.value_stack[value_stack_depth_after - i - 1].0;
if let Some(canonicalize_size) = canonicalize.to_size()
&& self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
{
self.machine
Expand Down Expand Up @@ -1132,9 +1131,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
};
let (loc, canonicalize) = self.pop_value_released()?;
if let Some(canonicalize_size) = canonicalize.to_size() {
if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
{
if self.config.enable_nan_canonicalization {
self.machine.canonicalize_nan(canonicalize_size, loc, dst)?;
} else {
self.machine.emit_relaxed_mov(Size::S64, loc, dst)?;
Expand All @@ -1158,9 +1155,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
if self.local_types[local_index].is_float()
&& let Some(canonicalize_size) = canonicalize.to_size()
{
if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
{
if self.config.enable_nan_canonicalization {
self.machine.canonicalize_nan(
canonicalize_size,
loc,
Expand All @@ -1182,9 +1177,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
if self.local_types[local_index].is_float()
&& let Some(canonicalize_size) = canonicalize.to_size()
{
if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
{
if self.config.enable_nan_canonicalization {
self.machine.canonicalize_nan(
canonicalize_size,
loc,
Expand Down Expand Up @@ -1722,9 +1715,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
let tmp1 = self.machine.acquire_temp_gpr().unwrap();
let tmp2 = self.machine.acquire_temp_gpr().unwrap();

if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
{
if self.config.enable_nan_canonicalization {
for ((loc, fp), tmp) in [(loc_a, tmp1), (loc_b, tmp2)] {
if fp.to_size().is_some() {
self.machine
Expand Down Expand Up @@ -1871,9 +1862,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
let tmp1 = self.machine.acquire_temp_gpr().unwrap();
let tmp2 = self.machine.acquire_temp_gpr().unwrap();

if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
{
if self.config.enable_nan_canonicalization {
for ((loc, fp), tmp) in [(loc_a, tmp1), (loc_b, tmp2)] {
if fp.to_size().is_some() {
self.machine
Expand Down Expand Up @@ -1931,8 +1920,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
let ret = self.acquire_location(&WpType::I32)?;
self.value_stack.push((ret, CanonicalizeType::None));

if !self.machine.arch_supports_canonicalize_nan()
|| !self.config.enable_nan_canonicalization
if !self.config.enable_nan_canonicalization
|| matches!(canonicalize, CanonicalizeType::None)
{
if loc != ret {
Expand All @@ -1957,8 +1945,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
let ret = self.acquire_location(&WpType::I64)?;
self.value_stack.push((ret, CanonicalizeType::None));

if !self.machine.arch_supports_canonicalize_nan()
|| !self.config.enable_nan_canonicalization
if !self.config.enable_nan_canonicalization
|| matches!(canonicalize, CanonicalizeType::None)
{
if loc != ret {
Expand Down Expand Up @@ -2185,9 +2172,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
//
// Canonicalization state will be lost across function calls, so early canonicalization
// is necessary here.
if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
{
if self.config.enable_nan_canonicalization {
for (loc, canonicalize) in params.iter() {
if let Some(size) = canonicalize.to_size() {
self.machine.canonicalize_nan(size, *loc, *loc)?;
Expand Down Expand Up @@ -2248,9 +2233,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
//
// Canonicalization state will be lost across function calls, so early canonicalization
// is necessary here.
if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
{
if self.config.enable_nan_canonicalization {
for (loc, canonicalize) in params.iter() {
if let Some(size) = canonicalize.to_size() {
self.machine.canonicalize_nan(size, *loc, *loc)?;
Expand Down Expand Up @@ -2381,35 +2364,24 @@ impl<'a, M: Machine> FuncGen<'a, M> {

self.emit_call_native(
|this| {
if this.machine.arch_requires_indirect_call_trampoline() {
let offset = this
.machine
.mark_instruction_with_trap_code(TrapCode::StackOverflow);

// We set the context pointer
this.machine.move_location(
Size::S64,
Location::Memory(gpr_for_call, vmcaller_checked_anyfunc_vmctx as i32),
this.machine
.arch_emit_indirect_call_with_trampoline(Location::Memory(
gpr_for_call,
vmcaller_checked_anyfunc_func_ptr as i32,
))
} else {
let offset = this
.machine
.mark_instruction_with_trap_code(TrapCode::StackOverflow);

// We set the context pointer
this.machine.move_location(
Size::S64,
Location::Memory(
gpr_for_call,
vmcaller_checked_anyfunc_vmctx as i32,
),
this.machine
.get_simple_param_location(0, calling_convention),
)?;
.get_simple_param_location(0, calling_convention),
)?;

this.machine.emit_call_location(Location::Memory(
gpr_for_call,
vmcaller_checked_anyfunc_func_ptr as i32,
))?;
this.machine.mark_instruction_address_end(offset);
Ok(())
}
this.machine.emit_call_location(Location::Memory(
gpr_for_call,
vmcaller_checked_anyfunc_func_ptr as i32,
))?;
this.machine.mark_instruction_address_end(offset);
Ok(())
},
params.iter().copied(),
param_types.iter().copied(),
Expand Down Expand Up @@ -2535,8 +2507,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
Location::Imm32(0),
zero_label,
)?;
if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
if self.config.enable_nan_canonicalization
&& let Some(size) = canonicalize_a.to_size()
{
self.machine.canonicalize_nan(size, v_a, ret)?;
Expand All @@ -2545,8 +2516,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
}
self.machine.jmp_unconditional(end_label)?;
self.machine.emit_label(zero_label)?;
if self.machine.arch_supports_canonicalize_nan()
&& self.config.enable_nan_canonicalization
if self.config.enable_nan_canonicalization
&& let Some(size) = canonicalize_b.to_size()
{
self.machine.canonicalize_nan(size, v_b, ret)?;
Expand Down
8 changes: 0 additions & 8 deletions lib/compiler-singlepass/src/emitter_arm64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -492,14 +492,6 @@ pub trait EmitterARM64 {
fn emit_read_fpsr(&mut self, reg: GPR) -> Result<(), CompileError>;
fn emit_write_fpsr(&mut self, reg: GPR) -> Result<(), CompileError>;

fn arch_supports_canonicalize_nan(&self) -> bool {
true
}

fn arch_requires_indirect_call_trampoline(&self) -> bool {
false
}

fn arch_emit_indirect_call_with_trampoline(
&mut self,
_loc: Location,
Expand Down
8 changes: 0 additions & 8 deletions lib/compiler-singlepass/src/emitter_x64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -444,14 +444,6 @@ pub trait EmitterX64 {
codegen_error!("singlepass arch_emit_tzcnt unimplemented")
}

fn arch_supports_canonicalize_nan(&self) -> bool {
true
}

fn arch_requires_indirect_call_trampoline(&self) -> bool {
false
}

fn arch_emit_indirect_call_with_trampoline(
&mut self,
_loc: Location,
Expand Down
4 changes: 0 additions & 4 deletions lib/compiler-singlepass/src/machine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -260,8 +260,6 @@ pub trait Machine {
fn emit_function_epilog(&mut self) -> Result<(), CompileError>;
/// Handle copy to SIMD register from ret value (if needed by the arch/calling convention)
fn emit_function_return_float(&mut self) -> Result<(), CompileError>;
/// Is NaN canonicalization supported
fn arch_supports_canonicalize_nan(&self) -> bool;
/// Cannonicalize a NaN (or panic if not supported)
fn canonicalize_nan(
&mut self,
Expand All @@ -283,8 +281,6 @@ pub trait Machine {
fn emit_call_register(&mut self, register: Self::GPR) -> Result<(), CompileError>;
/// Emit a call to a label
fn emit_call_label(&mut self, label: Label) -> Result<(), CompileError>;
/// Does an trampoline is neededfor indirect call
fn arch_requires_indirect_call_trampoline(&self) -> bool;
/// indirect call with trampoline
fn arch_emit_indirect_call_with_trampoline(
&mut self,
Expand Down
9 changes: 0 additions & 9 deletions lib/compiler-singlepass/src/machine_arm64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2247,9 +2247,6 @@ impl Machine for MachineARM64 {
.emit_mov(Size::S64, Location::GPR(GPR::X0), Location::SIMD(NEON::V0))
}

fn arch_supports_canonicalize_nan(&self) -> bool {
self.assembler.arch_supports_canonicalize_nan()
}
fn canonicalize_nan(
&mut self,
sz: Size,
Expand Down Expand Up @@ -2320,10 +2317,6 @@ impl Machine for MachineARM64 {
self.assembler.emit_call_label(label)
}

fn arch_requires_indirect_call_trampoline(&self) -> bool {
self.assembler.arch_requires_indirect_call_trampoline()
}

fn arch_emit_indirect_call_with_trampoline(
&mut self,
location: Location,
Expand Down Expand Up @@ -7378,7 +7371,6 @@ impl Machine for MachineARM64 {
heap_access_oob: Label,
unaligned_atomic: Label,
) -> Result<(), CompileError> {
let canonicalize = canonicalize && self.arch_supports_canonicalize_nan();
self.memory_op(
target_addr,
memarg,
Expand Down Expand Up @@ -7434,7 +7426,6 @@ impl Machine for MachineARM64 {
heap_access_oob: Label,
unaligned_atomic: Label,
) -> Result<(), CompileError> {
let canonicalize = canonicalize && self.arch_supports_canonicalize_nan();
self.memory_op(
target_addr,
memarg,
Expand Down
Loading
Loading