mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-22 21:21:33 +00:00
Merge branch 'master' into feature/llvm-mcg-no-builder
This commit is contained in:
@ -2,6 +2,7 @@
|
||||
|
||||
## **[Unreleased]**
|
||||
|
||||
- [#1303](https://github.com/wasmerio/wasmer/pull/1303) NaN canonicalization for singlepass backend.
|
||||
- [#1305](https://github.com/wasmerio/wasmer/pull/1305) Handle panics from DynamicFunc.
|
||||
- [#1301](https://github.com/wasmerio/wasmer/pull/1301) Update supported stable Rust version to 1.41.1.
|
||||
- [#1300](https://github.com/wasmerio/wasmer/pull/1300) Add support for multiple versions of WASI tests: wasitests now test all versions of WASI.
|
||||
|
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -2146,7 +2146,7 @@ dependencies = [
|
||||
name = "wasmer-win-exception-handler"
|
||||
version = "0.16.2"
|
||||
dependencies = [
|
||||
"cmake",
|
||||
"cc",
|
||||
"libc",
|
||||
"wasmer-runtime-core",
|
||||
"winapi",
|
||||
|
2
Makefile
2
Makefile
@ -322,7 +322,7 @@ ifeq ($(OS), Windows_NT)
|
||||
else
|
||||
ifeq ($(UNAME_S), Darwin)
|
||||
cp target/release/libwasmer_runtime_c_api.dylib ./capi/lib/libwasmer.dylib
|
||||
cp target/release/libwasmer_runtime_c_api.dylib ./capi/lib/libwasmer.a
|
||||
cp target/release/libwasmer_runtime_c_api.a ./capi/lib/libwasmer.a
|
||||
# Fix the rpath for the dylib
|
||||
install_name_tool -id "@rpath/libwasmer.dylib" ./capi/lib/libwasmer.dylib
|
||||
else
|
||||
|
@ -19,7 +19,7 @@ use std::mem;
|
||||
use std::sync::{Arc, RwLock};
|
||||
use wasmer_runtime_core::error::CompileError;
|
||||
use wasmer_runtime_core::{
|
||||
backend::{CacheGen, Token},
|
||||
backend::{CacheGen, CompilerConfig, Token},
|
||||
cache::{Artifact, Error as CacheError},
|
||||
codegen::*,
|
||||
memory::MemoryType,
|
||||
@ -36,7 +36,7 @@ use wasmparser::Type as WpType;
|
||||
static BACKEND_ID: &str = "cranelift";
|
||||
|
||||
pub struct CraneliftModuleCodeGenerator {
|
||||
isa: Box<dyn isa::TargetIsa>,
|
||||
isa: Option<Box<dyn isa::TargetIsa>>,
|
||||
signatures: Option<Arc<Map<SigIndex, FuncSig>>>,
|
||||
pub clif_signatures: Map<SigIndex, ir::Signature>,
|
||||
function_signatures: Option<Arc<Map<FuncIndex, SigIndex>>>,
|
||||
@ -47,9 +47,8 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
|
||||
for CraneliftModuleCodeGenerator
|
||||
{
|
||||
fn new() -> Self {
|
||||
let isa = get_isa();
|
||||
CraneliftModuleCodeGenerator {
|
||||
isa,
|
||||
isa: None,
|
||||
clif_signatures: Map::new(),
|
||||
functions: vec![],
|
||||
function_signatures: None,
|
||||
@ -100,7 +99,7 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
|
||||
position: Position::default(),
|
||||
func_env: FunctionEnvironment {
|
||||
module_info: Arc::clone(&module_info),
|
||||
target_config: self.isa.frontend_config().clone(),
|
||||
target_config: self.isa.as_ref().unwrap().frontend_config().clone(),
|
||||
clif_signatures: self.clif_signatures.clone(),
|
||||
},
|
||||
loc,
|
||||
@ -162,9 +161,9 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
|
||||
}
|
||||
|
||||
let (func_resolver_builder, debug_metadata, handler_data) =
|
||||
FuncResolverBuilder::new(&*self.isa, func_bodies, module_info)?;
|
||||
FuncResolverBuilder::new(&**self.isa.as_ref().unwrap(), func_bodies, module_info)?;
|
||||
|
||||
let trampolines = Arc::new(Trampolines::new(&*self.isa, module_info));
|
||||
let trampolines = Arc::new(Trampolines::new(&**self.isa.as_ref().unwrap(), module_info));
|
||||
|
||||
let signatures_empty = Map::new();
|
||||
let signatures = if self.signatures.is_some() {
|
||||
@ -191,9 +190,19 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
|
||||
))
|
||||
}
|
||||
|
||||
fn feed_compiler_config(&mut self, config: &CompilerConfig) -> Result<(), CodegenError> {
|
||||
self.isa = Some(get_isa(Some(config)));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn feed_signatures(&mut self, signatures: Map<SigIndex, FuncSig>) -> Result<(), CodegenError> {
|
||||
self.signatures = Some(Arc::new(signatures));
|
||||
let call_conv = self.isa.frontend_config().default_call_conv;
|
||||
let call_conv = self
|
||||
.isa
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.frontend_config()
|
||||
.default_call_conv;
|
||||
for (_sig_idx, func_sig) in self.signatures.as_ref().unwrap().iter() {
|
||||
self.clif_signatures
|
||||
.push(convert_func_sig(func_sig, call_conv));
|
||||
@ -1302,7 +1311,10 @@ fn generate_signature(
|
||||
}
|
||||
|
||||
fn pointer_type(mcg: &CraneliftModuleCodeGenerator) -> ir::Type {
|
||||
ir::Type::int(u16::from(mcg.isa.frontend_config().pointer_bits())).unwrap()
|
||||
ir::Type::int(u16::from(
|
||||
mcg.isa.as_ref().unwrap().frontend_config().pointer_bits(),
|
||||
))
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
/// Declare local variables for the signature parameters that correspond to WebAssembly locals.
|
||||
|
@ -29,6 +29,7 @@ use cranelift_codegen::{
|
||||
settings::{self, Configurable},
|
||||
};
|
||||
use target_lexicon::Triple;
|
||||
use wasmer_runtime_core::{backend::CompilerConfig, codegen::SimpleStreamingCompilerGen};
|
||||
|
||||
#[macro_use]
|
||||
extern crate serde_derive;
|
||||
@ -36,7 +37,7 @@ extern crate serde_derive;
|
||||
extern crate rayon;
|
||||
extern crate serde;
|
||||
|
||||
fn get_isa() -> Box<dyn isa::TargetIsa> {
|
||||
fn get_isa(config: Option<&CompilerConfig>) -> Box<dyn isa::TargetIsa> {
|
||||
let flags = {
|
||||
let mut builder = settings::builder();
|
||||
builder.set("opt_level", "speed_and_size").unwrap();
|
||||
@ -48,6 +49,12 @@ fn get_isa() -> Box<dyn isa::TargetIsa> {
|
||||
builder.set("enable_verifier", "false").unwrap();
|
||||
}
|
||||
|
||||
if let Some(config) = config {
|
||||
if config.nan_canonicalization {
|
||||
builder.set("enable_nan_canonicalization", "true").unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
let flags = settings::Flags::new(builder);
|
||||
debug_assert_eq!(flags.opt_level(), settings::OptLevel::SpeedAndSize);
|
||||
flags
|
||||
@ -58,8 +65,6 @@ fn get_isa() -> Box<dyn isa::TargetIsa> {
|
||||
/// The current version of this crate
|
||||
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||
|
||||
use wasmer_runtime_core::codegen::SimpleStreamingCompilerGen;
|
||||
|
||||
/// Streaming compiler implementation for the Cranelift backed. Compiles web assembly binary into
|
||||
/// machine code.
|
||||
pub type CraneliftCompiler = SimpleStreamingCompilerGen<
|
||||
|
@ -212,8 +212,7 @@ fn wasm_ty_to_clif(ty: Type) -> ir::types::Type {
|
||||
}
|
||||
|
||||
fn generate_trampoline_signature() -> ir::Signature {
|
||||
let isa = super::get_isa();
|
||||
let call_convention = isa.default_call_conv();
|
||||
let call_convention = super::get_isa(None).default_call_conv();
|
||||
let mut sig = ir::Signature::new(call_convention);
|
||||
|
||||
let ptr_param = ir::AbiParam {
|
||||
@ -229,8 +228,7 @@ fn generate_trampoline_signature() -> ir::Signature {
|
||||
}
|
||||
|
||||
fn generate_export_signature(func_sig: &FuncSig) -> ir::Signature {
|
||||
let isa = super::get_isa();
|
||||
let call_convention = isa.default_call_conv();
|
||||
let call_convention = super::get_isa(None).default_call_conv();
|
||||
let mut export_clif_sig = ir::Signature::new(call_convention);
|
||||
|
||||
let func_sig_iter = func_sig.params().iter().map(|wasm_ty| ir::AbiParam {
|
||||
|
@ -3700,7 +3700,7 @@ impl<'ctx> FunctionCodeGenerator<CodegenError> for LLVMFunctionCodeGenerator<'ct
|
||||
.try_as_basic_value()
|
||||
.left()
|
||||
.unwrap();
|
||||
state.push1_extra(res, i);
|
||||
state.push1_extra(res, i | ExtraInfo::pending_f32_nan());
|
||||
}
|
||||
Operator::F64Trunc => {
|
||||
let (v, i) = state.pop1_extra()?;
|
||||
@ -3713,7 +3713,7 @@ impl<'ctx> FunctionCodeGenerator<CodegenError> for LLVMFunctionCodeGenerator<'ct
|
||||
.try_as_basic_value()
|
||||
.left()
|
||||
.unwrap();
|
||||
state.push1_extra(res, i);
|
||||
state.push1_extra(res, i | ExtraInfo::pending_f64_nan());
|
||||
}
|
||||
Operator::F32Nearest => {
|
||||
let (v, i) = state.pop1_extra()?;
|
||||
@ -3726,7 +3726,7 @@ impl<'ctx> FunctionCodeGenerator<CodegenError> for LLVMFunctionCodeGenerator<'ct
|
||||
.try_as_basic_value()
|
||||
.left()
|
||||
.unwrap();
|
||||
state.push1_extra(res, i);
|
||||
state.push1_extra(res, i | ExtraInfo::pending_f32_nan());
|
||||
}
|
||||
Operator::F64Nearest => {
|
||||
let (v, i) = state.pop1_extra()?;
|
||||
@ -3739,7 +3739,7 @@ impl<'ctx> FunctionCodeGenerator<CodegenError> for LLVMFunctionCodeGenerator<'ct
|
||||
.try_as_basic_value()
|
||||
.left()
|
||||
.unwrap();
|
||||
state.push1_extra(res, i);
|
||||
state.push1_extra(res, i | ExtraInfo::pending_f64_nan());
|
||||
}
|
||||
Operator::F32Abs => {
|
||||
let (v, i) = state.pop1_extra()?;
|
||||
|
@ -132,6 +132,10 @@ pub struct CompilerConfig {
|
||||
/// When enabled there can be a small amount of runtime performance overhead.
|
||||
pub full_preemption: bool,
|
||||
|
||||
/// Always choose a unique bit representation for NaN.
|
||||
/// Enabling this makes execution deterministic but increases runtime overhead.
|
||||
pub nan_canonicalization: bool,
|
||||
|
||||
pub features: Features,
|
||||
|
||||
// Target info. Presently only supported by LLVM.
|
||||
|
File diff suppressed because it is too large
Load Diff
182
lib/spectests/spectests/wasmer.wast
vendored
182
lib/spectests/spectests/wasmer.wast
vendored
@ -3,15 +3,21 @@
|
||||
(module
|
||||
;; Auxiliary definitions
|
||||
(type $out-i32 (func (result i32)))
|
||||
(type $f32-id (func (param f32) (result f32)))
|
||||
(type $f64-id (func (param f64) (result f64)))
|
||||
|
||||
(func $const-i32 (type $out-i32) (i32.const 0x132))
|
||||
|
||||
(table funcref
|
||||
(elem
|
||||
$const-i32
|
||||
$nan-canonicalization-f32-func-call-target
|
||||
$nan-canonicalization-f64-func-call-target
|
||||
)
|
||||
)
|
||||
|
||||
(memory 1)
|
||||
|
||||
;; https://github.com/wasmerio/wasmer/pull/1191
|
||||
(func (export "call-indirect-from-spilled-stack") (result i32)
|
||||
(i64.add (i64.const 0) (i64.const 0))
|
||||
@ -28,6 +34,182 @@
|
||||
(call_indirect (type $out-i32))
|
||||
(return)
|
||||
)
|
||||
|
||||
;; NaN canonicalization tests.
|
||||
;; Things that are covered by spectests canonicalization (`fabs`, `fneg`, `fcopysign`, `reinterpret`, `const`) won't be duplicated here.
|
||||
|
||||
(func (export "nan-canonicalization-f32-add") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-sub") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.sub (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-mul") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.mul (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-div") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.div (f32.reinterpret_i32 (get_local 0)) (f32.const 1)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-max") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.max (f32.reinterpret_i32 (get_local 0)) (f32.const 1)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-min") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.min (f32.reinterpret_i32 (get_local 0)) (f32.const 1)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-nearest") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.nearest (f32.reinterpret_i32 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-floor") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.floor (f32.reinterpret_i32 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-ceil") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.ceil (f32.reinterpret_i32 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-trunc") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.trunc (f32.reinterpret_i32 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-sqrt") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (f32.sqrt (f32.reinterpret_i32 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-mem") (param i32) (result i32)
|
||||
(f32.store (i32.const 0) (f32.reinterpret_i32 (get_local 0)))
|
||||
(i32.reinterpret_f32 (f32.load (i32.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-mem-cncl") (param i32) (result i32)
|
||||
(f32.store (i32.const 0) (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
|
||||
(i32.reinterpret_f32 (f32.load (i32.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-local") (param i32) (result i32)
|
||||
(local f32)
|
||||
(set_local 1 (f32.reinterpret_i32 (get_local 0)))
|
||||
(i32.reinterpret_f32 (get_local 1))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-local-cncl") (param i32) (result i32)
|
||||
(local f32)
|
||||
(set_local 1 (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
|
||||
(i32.reinterpret_f32 (get_local 1))
|
||||
)
|
||||
(func $nan-canonicalization-f32-func-call-target (param f32) (result f32)
|
||||
(get_local 0)
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-func-call") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (call $nan-canonicalization-f32-func-call-target (f32.reinterpret_i32 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-func-call-cncl") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (call $nan-canonicalization-f32-func-call-target (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-func-call-indirect") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (call_indirect (type $f32-id) (f32.reinterpret_i32 (get_local 0)) (i32.const 1)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f32-func-call-indirect-cncl") (param i32) (result i32)
|
||||
(i32.reinterpret_f32 (call_indirect (type $f32-id) (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0)) (i32.const 1)))
|
||||
)
|
||||
|
||||
(func (export "nan-canonicalization-f64-add") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-sub") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.sub (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-mul") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.mul (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-div") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.div (f64.reinterpret_i64 (get_local 0)) (f64.const 1)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-max") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.max (f64.reinterpret_i64 (get_local 0)) (f64.const 1)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-min") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.min (f64.reinterpret_i64 (get_local 0)) (f64.const 1)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-nearest") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.nearest (f64.reinterpret_i64 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-floor") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.floor (f64.reinterpret_i64 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-ceil") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.ceil (f64.reinterpret_i64 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-trunc") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.trunc (f64.reinterpret_i64 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-sqrt") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (f64.sqrt (f64.reinterpret_i64 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-mem") (param i64) (result i64)
|
||||
(f64.store (i32.const 0) (f64.reinterpret_i64 (get_local 0)))
|
||||
(i64.reinterpret_f64 (f64.load (i32.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-mem-cncl") (param i64) (result i64)
|
||||
(f64.store (i32.const 0) (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
|
||||
(i64.reinterpret_f64 (f64.load (i32.const 0)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-local") (param i64) (result i64)
|
||||
(local f64)
|
||||
(set_local 1 (f64.reinterpret_i64 (get_local 0)))
|
||||
(i64.reinterpret_f64 (get_local 1))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-local-cncl") (param i64) (result i64)
|
||||
(local f64)
|
||||
(set_local 1 (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
|
||||
(i64.reinterpret_f64 (get_local 1))
|
||||
)
|
||||
(func $nan-canonicalization-f64-func-call-target (param f64) (result f64)
|
||||
(get_local 0)
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-func-call") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (call $nan-canonicalization-f64-func-call-target (f64.reinterpret_i64 (get_local 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-func-call-cncl") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (call $nan-canonicalization-f64-func-call-target (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0))))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-func-call-indirect") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (call_indirect (type $f64-id) (f64.reinterpret_i64 (get_local 0)) (i32.const 2)))
|
||||
)
|
||||
(func (export "nan-canonicalization-f64-func-call-indirect-cncl") (param i64) (result i64)
|
||||
(i64.reinterpret_f64 (call_indirect (type $f64-id) (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0)) (i32.const 2)))
|
||||
)
|
||||
)
|
||||
|
||||
(assert_return (invoke "call-indirect-from-spilled-stack") (i32.const 0x132))
|
||||
(assert_return (invoke "nan-canonicalization-f32-add" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-sub" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-mul" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-div" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-max" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-min" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-nearest" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-floor" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-ceil" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-trunc" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-sqrt" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-mem" (i32.const 0x7fc00001)) (i32.const 0x7fc00001))
|
||||
(assert_return (invoke "nan-canonicalization-f32-mem-cncl" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-local" (i32.const 0x7fc00001)) (i32.const 0x7fc00001))
|
||||
(assert_return (invoke "nan-canonicalization-f32-local-cncl" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-func-call" (i32.const 0x7fc00001)) (i32.const 0x7fc00001))
|
||||
(assert_return (invoke "nan-canonicalization-f32-func-call-cncl" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
(assert_return (invoke "nan-canonicalization-f32-func-call-indirect" (i32.const 0x7fc00001)) (i32.const 0x7fc00001))
|
||||
(assert_return (invoke "nan-canonicalization-f32-func-call-indirect-cncl" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
|
||||
|
||||
(assert_return (invoke "nan-canonicalization-f64-add" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-sub" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-mul" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-div" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-max" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-min" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-nearest" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-floor" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-ceil" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-trunc" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-sqrt" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-mem" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000001))
|
||||
(assert_return (invoke "nan-canonicalization-f64-mem-cncl" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-local" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000001))
|
||||
(assert_return (invoke "nan-canonicalization-f64-local-cncl" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-func-call" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000001))
|
||||
(assert_return (invoke "nan-canonicalization-f64-func-call-cncl" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
(assert_return (invoke "nan-canonicalization-f64-func-call-indirect" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000001))
|
||||
(assert_return (invoke "nan-canonicalization-f64-func-call-indirect-cncl" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
|
||||
|
@ -244,10 +244,6 @@ clif:fail:exports.wast:167:windows # Module - caught panic Any
|
||||
clif:fail:exports.wast:168:windows # Module - caught panic Any
|
||||
clif:fail:exports.wast:169:windows # Module - caught panic Any
|
||||
clif:fail:exports.wast:170:windows # Module - caught panic Any
|
||||
clif:fail:f32.wast:2496:windows # "AssertReturnArithmeticNan" - value is not arithmetic nan F32(NaN)
|
||||
clif:fail:f32.wast:2498:windows # "AssertReturnArithmeticNan" - value is not arithmetic nan F32(NaN)
|
||||
clif:fail:f64.wast:2496:windows # "AssertReturnArithmeticNan" - value is not arithmetic nan F64(NaN)
|
||||
clif:fail:f64.wast:2498:windows # "AssertReturnArithmeticNan" - value is not arithmetic nan F64(NaN)
|
||||
clif:fail:func.wast:289:windows # Module - caught panic Any
|
||||
clif:fail:memory.wast:3:windows # Module - caught panic Any
|
||||
clif:fail:memory.wast:4:windows # Module - caught panic Any
|
||||
@ -524,3 +520,35 @@ singlepass:fail:traps.wast:54:*:aarch64 # AssertTrap - expected trap, got []
|
||||
singlepass:fail:traps.wast:55:*:aarch64 # AssertTrap - expected trap, got []
|
||||
singlepass:fail:traps.wast:56:*:aarch64 # AssertTrap - expected trap, got []
|
||||
singlepass:fail:traps.wast:57:*:aarch64 # AssertTrap - expected trap, got []
|
||||
|
||||
# NaN canonicalization is not yet implemented for aarch64.
|
||||
singlepass:fail:wasmer.wast:177:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:178:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:179:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:180:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:181:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:182:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:183:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:184:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:185:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:186:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:187:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:189:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:191:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:193:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:195:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
|
||||
singlepass:fail:wasmer.wast:197:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:198:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:199:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:200:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:201:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:202:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:203:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:204:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:205:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:206:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:207:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:209:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:211:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:213:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
||||
singlepass:fail:wasmer.wast:215:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
|
@ -336,6 +336,7 @@ mod tests {
|
||||
simd: true,
|
||||
threads: true,
|
||||
},
|
||||
nan_canonicalization: true,
|
||||
..Default::default()
|
||||
};
|
||||
let module = compile_with_config(&module.into_vec(), config)
|
||||
@ -774,6 +775,7 @@ mod tests {
|
||||
simd: true,
|
||||
threads: true,
|
||||
},
|
||||
nan_canonicalization: true,
|
||||
..Default::default()
|
||||
};
|
||||
compile_with_config(&module.into_vec(), config)
|
||||
@ -826,6 +828,7 @@ mod tests {
|
||||
simd: true,
|
||||
threads: true,
|
||||
},
|
||||
nan_canonicalization: true,
|
||||
..Default::default()
|
||||
};
|
||||
compile_with_config(&module.into_vec(), config)
|
||||
@ -877,6 +880,7 @@ mod tests {
|
||||
simd: true,
|
||||
threads: true,
|
||||
},
|
||||
nan_canonicalization: true,
|
||||
..Default::default()
|
||||
};
|
||||
let module = compile_with_config(&module.into_vec(), config)
|
||||
@ -972,6 +976,7 @@ mod tests {
|
||||
simd: true,
|
||||
threads: true,
|
||||
},
|
||||
nan_canonicalization: true,
|
||||
..Default::default()
|
||||
};
|
||||
let module = compile_with_config(&module.into_vec(), config)
|
||||
|
@ -13,4 +13,4 @@ winapi = { version = "0.3.8", features = ["winbase", "errhandlingapi", "minwinde
|
||||
libc = "0.2.60"
|
||||
|
||||
[build-dependencies]
|
||||
cmake = "0.1"
|
||||
cc = "1.0"
|
||||
|
@ -1,10 +1,10 @@
|
||||
fn main() {
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
use cmake::Config;
|
||||
let project_name = "exception_handling";
|
||||
let dst = Config::new(project_name).build();
|
||||
println!("cargo:rustc-link-search=native={}", dst.display());
|
||||
println!("cargo:rustc-link-lib=static={}", project_name);
|
||||
if std::env::var("CARGO_CFG_TARGET_OS").expect("TARGET_OS not specified") != "windows" {
|
||||
return;
|
||||
}
|
||||
|
||||
cc::Build::new()
|
||||
.include("exception_handling")
|
||||
.file("exception_handling/exception_handling.c")
|
||||
.compile("exception_handling");
|
||||
}
|
||||
|
@ -1 +0,0 @@
|
||||
cmake-build-*
|
@ -1,6 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
project(exception_handling C)
|
||||
|
||||
add_library(exception_handling STATIC exception_handling.c)
|
||||
|
||||
install(TARGETS exception_handling DESTINATION .)
|
@ -1,5 +1,6 @@
|
||||
#include <windows.h>
|
||||
#include <setjmp.h>
|
||||
#include <intrin.h>
|
||||
#include "exception_handling.h"
|
||||
|
||||
#define CALL_FIRST 1
|
||||
|
Reference in New Issue
Block a user