The tests for the SIMD floating-point maximum and minimum operations require particular care because the handling of the NaN values is non-deterministic and may vary between platforms. There is no way to match several NaN values in a test, so the solution is to extract the non-deterministic test cases into a separate file that is subsequently replicated for every backend under test, with adjustments made to the expected results. Copyright (c) 2021, Arm Limited.
204 lines
3.5 KiB
Plaintext
204 lines
3.5 KiB
Plaintext
; Test code generation for WebAssembly type conversion operators.
|
|
test compile
|
|
|
|
target aarch64
|
|
target x86_64 haswell
|
|
|
|
function %i32_wrap_i64(i64) -> i32 {
|
|
block0(v0: i64):
|
|
v1 = ireduce.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_extend_s_i32(i32) -> i64 {
|
|
block0(v0: i32):
|
|
v1 = sextend.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_extend_u_i32(i32) -> i64 {
|
|
block0(v0: i32):
|
|
v1 = uextend.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_trunc_s_f32(f32) -> i32 {
|
|
block0(v0: f32):
|
|
v1 = fcvt_to_sint.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_trunc_u_f32(f32) -> i32 {
|
|
block0(v0: f32):
|
|
v1 = fcvt_to_uint.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_trunc_s_f64(f64) -> i32 {
|
|
block0(v0: f64):
|
|
v1 = fcvt_to_sint.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_trunc_u_f64(f64) -> i32 {
|
|
block0(v0: f64):
|
|
v1 = fcvt_to_uint.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_trunc_s_f32(f32) -> i64 {
|
|
block0(v0: f32):
|
|
v1 = fcvt_to_sint.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_trunc_u_f32(f32) -> i64 {
|
|
block0(v0: f32):
|
|
v1 = fcvt_to_uint.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_trunc_s_f64(f64) -> i64 {
|
|
block0(v0: f64):
|
|
v1 = fcvt_to_sint.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_trunc_u_f64(f64) -> i64 {
|
|
block0(v0: f64):
|
|
v1 = fcvt_to_uint.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_trunc_s_sat_f32(f32) -> i32 {
|
|
block0(v0: f32):
|
|
v1 = fcvt_to_sint_sat.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_trunc_u_sat_f32(f32) -> i32 {
|
|
block0(v0: f32):
|
|
v1 = fcvt_to_uint_sat.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_trunc_s_sat_f64(f64) -> i32 {
|
|
block0(v0: f64):
|
|
v1 = fcvt_to_sint_sat.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_trunc_u_sat_f64(f64) -> i32 {
|
|
block0(v0: f64):
|
|
v1 = fcvt_to_uint_sat.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_trunc_s_sat_f32(f32) -> i64 {
|
|
block0(v0: f32):
|
|
v1 = fcvt_to_sint_sat.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_trunc_u_sat_f32(f32) -> i64 {
|
|
block0(v0: f32):
|
|
v1 = fcvt_to_uint_sat.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_trunc_s_sat_f64(f64) -> i64 {
|
|
block0(v0: f64):
|
|
v1 = fcvt_to_sint_sat.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_trunc_u_sat_f64(f64) -> i64 {
|
|
block0(v0: f64):
|
|
v1 = fcvt_to_uint_sat.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %f32_trunc_f64(f64) -> f32 {
|
|
block0(v0: f64):
|
|
v1 = fdemote.f32 v0
|
|
return v1
|
|
}
|
|
|
|
function %f64_promote_f32(f32) -> f64 {
|
|
block0(v0: f32):
|
|
v1 = fpromote.f64 v0
|
|
return v1
|
|
}
|
|
|
|
function %f32_convert_s_i32(i32) -> f32 {
|
|
block0(v0: i32):
|
|
v1 = fcvt_from_sint.f32 v0
|
|
return v1
|
|
}
|
|
|
|
function %f32_convert_u_i32(i32) -> f32 {
|
|
block0(v0: i32):
|
|
v1 = fcvt_from_uint.f32 v0
|
|
return v1
|
|
}
|
|
|
|
function %f64_convert_s_i32(i32) -> f64 {
|
|
block0(v0: i32):
|
|
v1 = fcvt_from_sint.f64 v0
|
|
return v1
|
|
}
|
|
|
|
function %f64_convert_u_i32(i32) -> f64 {
|
|
block0(v0: i32):
|
|
v1 = fcvt_from_uint.f64 v0
|
|
return v1
|
|
}
|
|
|
|
function %f32_convert_s_i64(i64) -> f32 {
|
|
block0(v0: i64):
|
|
v1 = fcvt_from_sint.f32 v0
|
|
return v1
|
|
}
|
|
|
|
function %f32_convert_u_i64(i64) -> f32 {
|
|
block0(v0: i64):
|
|
v1 = fcvt_from_uint.f32 v0
|
|
return v1
|
|
}
|
|
|
|
function %f64_convert_s_i64(i64) -> f64 {
|
|
block0(v0: i64):
|
|
v1 = fcvt_from_sint.f64 v0
|
|
return v1
|
|
}
|
|
|
|
function %f64_convert_u_i64(i64) -> f64 {
|
|
block0(v0: i64):
|
|
v1 = fcvt_from_uint.f64 v0
|
|
return v1
|
|
}
|
|
|
|
function %i32_reinterpret_f32(f32) -> i32 {
|
|
block0(v0: f32):
|
|
v1 = bitcast.i32 v0
|
|
return v1
|
|
}
|
|
|
|
function %f32_reinterpret_i32(i32) -> f32 {
|
|
block0(v0: i32):
|
|
v1 = bitcast.f32 v0
|
|
return v1
|
|
}
|
|
|
|
function %i64_reinterpret_f64(f64) -> i64 {
|
|
block0(v0: f64):
|
|
v1 = bitcast.i64 v0
|
|
return v1
|
|
}
|
|
|
|
function %f64_reinterpret_i64(i64) -> f64 {
|
|
block0(v0: i64):
|
|
v1 = bitcast.f64 v0
|
|
return v1
|
|
}
|