Disable NaN canonicalizing on aarch64.

This commit is contained in:
losfair
2019-11-13 11:35:44 +08:00
parent f1339b4033
commit c552514fd2
3 changed files with 418 additions and 378 deletions

View File

@@ -3108,6 +3108,14 @@ impl FunctionCodeGenerator<CodegenError> for X64FunctionCode {
Assembler::emit_vdivss,
),
Operator::F32Max => {
if !a.arch_supports_canonicalize_nan() {
Self::emit_fp_binop_avx(
a,
&mut self.machine,
&mut self.value_stack,
Assembler::emit_vmaxss,
);
} else {
let src2 =
get_location_released(a, &mut self.machine, self.value_stack.pop().unwrap());
let src1 =
@@ -3204,7 +3212,16 @@ impl FunctionCodeGenerator<CodegenError> for X64FunctionCode {
self.machine.release_temp_xmm(tmp2);
self.machine.release_temp_xmm(tmp1);
}
}
Operator::F32Min => {
if !a.arch_supports_canonicalize_nan() {
Self::emit_fp_binop_avx(
a,
&mut self.machine,
&mut self.value_stack,
Assembler::emit_vminss,
);
} else {
let src2 =
get_location_released(a, &mut self.machine, self.value_stack.pop().unwrap());
let src1 =
@@ -3312,6 +3329,7 @@ impl FunctionCodeGenerator<CodegenError> for X64FunctionCode {
self.machine.release_temp_xmm(tmp2);
self.machine.release_temp_xmm(tmp1);
}
}
Operator::F32Eq => Self::emit_fp_cmpop_avx(
a,
&mut self.machine,
@@ -3502,6 +3520,14 @@ impl FunctionCodeGenerator<CodegenError> for X64FunctionCode {
Assembler::emit_vdivsd,
),
Operator::F64Max => {
if !a.arch_supports_canonicalize_nan() {
Self::emit_fp_binop_avx(
a,
&mut self.machine,
&mut self.value_stack,
Assembler::emit_vmaxsd,
);
} else {
let src2 =
get_location_released(a, &mut self.machine, self.value_stack.pop().unwrap());
let src1 =
@@ -3598,7 +3624,16 @@ impl FunctionCodeGenerator<CodegenError> for X64FunctionCode {
self.machine.release_temp_xmm(tmp2);
self.machine.release_temp_xmm(tmp1);
}
}
Operator::F64Min => {
if !a.arch_supports_canonicalize_nan() {
Self::emit_fp_binop_avx(
a,
&mut self.machine,
&mut self.value_stack,
Assembler::emit_vminsd,
);
} else {
let src2 =
get_location_released(a, &mut self.machine, self.value_stack.pop().unwrap());
let src1 =
@@ -3706,6 +3741,7 @@ impl FunctionCodeGenerator<CodegenError> for X64FunctionCode {
self.machine.release_temp_xmm(tmp2);
self.machine.release_temp_xmm(tmp1);
}
}
Operator::F64Eq => Self::emit_fp_cmpop_avx(
a,
&mut self.machine,

View File

@@ -267,6 +267,8 @@ pub trait Emitter {
fn arch_emit_tzcnt(&mut self, _sz: Size, _src: Location, _dst: Location) {
unimplemented!()
}
fn arch_supports_canonicalize_nan(&self) -> bool { true }
}
fn _dummy(a: &mut Assembler) {

View File

@@ -1709,6 +1709,8 @@ impl Emitter for Assembler {
; .dword (ty as u8 as i32)
);
}
fn arch_supports_canonicalize_nan(&self) -> bool { false }
}
fn emit_clz_variant(