Skip to content
This repository was archived by the owner on Dec 22, 2021. It is now read-only.

Commit b2e0c76

Browse files
committed
[interpreter] f64x2.promote_low_f32x4 and f32x4.demote_f64x2_zero
These 2 instructions were merged as part of #383. The test cases are add manually to simd_conversions.wast, using constants from test/core/conversions.wast.
1 parent 31efb15 commit b2e0c76

File tree

9 files changed

+179
-0
lines changed

9 files changed

+179
-0
lines changed

interpreter/binary/decode.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ let simd_prefix s =
306306
| 0x52l -> v128_bitselect
307307
| 0x55l -> i32x4_trunc_sat_f64x2_s_zero
308308
| 0x56l -> i32x4_trunc_sat_f64x2_u_zero
309+
| 0x57l -> f32x4_demote_f64x2_zero
309310
| 0x58l ->
310311
let a, o = memop s in
311312
let lane = u8 s in
@@ -348,6 +349,7 @@ let simd_prefix s =
348349
| 0x6dl -> i8x16_shr_u
349350
| 0x65l -> i8x16_narrow_i16x8_s
350351
| 0x66l -> i8x16_narrow_i16x8_u
352+
| 0x69l -> f64x2_promote_low_f32x4
351353
| 0x6el -> i8x16_add
352354
| 0x6fl -> i8x16_add_sat_s
353355
| 0x70l -> i8x16_add_sat_u

interpreter/binary/encode.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@ let encode m =
386386
| Unary (V128 V128Op.(I32x4 TruncSatF64x2UZero)) -> simd_op 0x56l
387387
| Unary (V128 V128Op.(F32x4 ConvertI32x4S)) -> simd_op 0xfal
388388
| Unary (V128 V128Op.(F32x4 ConvertI32x4U)) -> simd_op 0xfbl
389+
| Unary (V128 V128Op.(F32x4 DemoteF64x2Zero)) -> simd_op 0x57l
390+
| Unary (V128 V128Op.(F64x2 PromoteLowF32x4)) -> simd_op 0x69l
389391
| Unary (V128 _) -> failwith "unimplemented V128 Unary op"
390392

391393
| Binary (I32 I32Op.Add) -> op 0x6a

interpreter/exec/eval_simd.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,15 @@ module SimdOp (SXX : Simd.S) (Value : ValueType with type t = SXX.t) = struct
5050
| F32x4 Nearest -> to_value (SXX.F32x4.nearest (of_value 1 v))
5151
| F32x4 ConvertI32x4S -> to_value (SXX.F32x4_convert.convert_i32x4_s (of_value 1 v))
5252
| F32x4 ConvertI32x4U -> to_value (SXX.F32x4_convert.convert_i32x4_u (of_value 1 v))
53+
| F32x4 DemoteF64x2Zero -> to_value (SXX.F32x4_convert.demote_f64x2_zero (of_value 1 v))
5354
| F64x2 Abs -> to_value (SXX.F64x2.abs (of_value 1 v))
5455
| F64x2 Neg -> to_value (SXX.F64x2.neg (of_value 1 v))
5556
| F64x2 Sqrt -> to_value (SXX.F64x2.sqrt (of_value 1 v))
5657
| F64x2 Ceil -> to_value (SXX.F64x2.ceil (of_value 1 v))
5758
| F64x2 Floor -> to_value (SXX.F64x2.floor (of_value 1 v))
5859
| F64x2 Trunc -> to_value (SXX.F64x2.trunc (of_value 1 v))
5960
| F64x2 Nearest -> to_value (SXX.F64x2.nearest (of_value 1 v))
61+
| F64x2 PromoteLowF32x4 -> to_value (SXX.F64x2_convert.promote_low_f32x4 (of_value 1 v))
6062
| V128 Not -> to_value (SXX.V128.lognot (of_value 1 v))
6163
| _ -> assert false
6264

interpreter/exec/simd.ml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ sig
212212
module F32x4_convert : sig
213213
val convert_i32x4_s : t -> t
214214
val convert_i32x4_u : t -> t
215+
val demote_f64x2_zero : t -> t
216+
end
217+
218+
module F64x2_convert : sig
219+
val promote_low_f32x4 : t -> t
215220
end
216221
end
217222

@@ -499,5 +504,12 @@ struct
499504
let convert f v = Rep.of_f32x4 (List.map f (Rep.to_i32x4 v))
500505
let convert_i32x4_s = convert F32_convert.convert_i32_s
501506
let convert_i32x4_u = convert F32_convert.convert_i32_u
507+
let demote_f64x2_zero v =
508+
Rep.(of_f32x4 F32.(List.map F32_convert.demote_f64 (to_f64x2 v) @ [zero; zero]))
509+
end
510+
511+
module F64x2_convert = struct
512+
let promote_low_f32x4 v =
513+
Rep.(of_f64x2 (List.map F64_convert.promote_f32 (Lib.List.take 2 (to_f32x4 v))))
502514
end
503515
end

interpreter/syntax/ast.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ struct
6060
type funop = Abs | Neg | Sqrt
6161
| Ceil | Floor | Trunc | Nearest
6262
| ConvertI32x4S | ConvertI32x4U
63+
| DemoteF64x2Zero | PromoteLowF32x4
6364
type fbinop = Add | Sub | Mul | Div | Min | Max | Pmin | Pmax
6465
| Eq | Ne | Lt | Le | Gt | Ge
6566
type vunop = Not

interpreter/syntax/operators.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ let f32x4_convert_i32x4_s = Unary (V128 V128Op.(F32x4 ConvertI32x4S))
451451
let f32x4_convert_i32x4_u = Unary (V128 V128Op.(F32x4 ConvertI32x4U))
452452
let f32x4_pmin = Binary (V128 V128Op.(F32x4 Pmin))
453453
let f32x4_pmax = Binary (V128 V128Op.(F32x4 Pmax))
454+
let f32x4_demote_f64x2_zero = Unary (V128 V128Op.(F32x4 DemoteF64x2Zero))
454455

455456
let f64x2_splat = Convert (V128 V128Op.(F64x2 Splat))
456457
let f64x2_extract_lane imm = SimdExtract (V128Op.F64x2 (ZX, imm))
@@ -476,3 +477,4 @@ let f64x2_max = Binary (V128 V128Op.(F64x2 Max))
476477
let f64x2_abs = Unary (V128 V128Op.(F64x2 Abs))
477478
let f64x2_pmin = Binary (V128 V128Op.(F64x2 Pmin))
478479
let f64x2_pmax = Binary (V128 V128Op.(F64x2 Pmax))
480+
let f64x2_promote_low_f32x4 = Unary (V128 V128Op.(F64x2 PromoteLowF32x4))

interpreter/text/arrange.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ struct
230230
| F32x4 Floor -> "f32x4.floor"
231231
| F32x4 Trunc -> "f32x4.trunc"
232232
| F32x4 Nearest -> "f32x4.nearest"
233+
| F32x4 DemoteF64x2Zero -> "f32x4.demote_f64x2_zero"
233234
| F64x2 Ceil -> "f64x2.ceil"
234235
| F64x2 Floor -> "f64x2.floor"
235236
| F64x2 Trunc -> "f64x2.trunc"
@@ -242,6 +243,7 @@ struct
242243
| F64x2 Abs -> "f64x2.abs"
243244
| F64x2 Neg -> "f64x2.neg"
244245
| F64x2 Sqrt -> "f64x2.sqrt"
246+
| F64x2 PromoteLowF32x4 -> "f64x2.promote_low_f32x4"
245247
| V128 Not -> "v128.not"
246248
| _ -> failwith "Unimplemented v128 unop"
247249

interpreter/text/lexer.mll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,10 @@ rule token = parse
554554
{ UNARY (ext s i32x4_trunc_sat_f32x4_s i32x4_trunc_sat_f32x4_u) }
555555
| "i32x4.trunc_sat_f64x2_"(sign as s)"_zero"
556556
{ UNARY (ext s i32x4_trunc_sat_f64x2_s_zero i32x4_trunc_sat_f64x2_u_zero) }
557+
| "f64x2.promote_low_f32x4"
558+
{ UNARY f64x2_promote_low_f32x4 }
559+
| "f32x4.demote_f64x2_zero"
560+
{ UNARY f32x4_demote_f64x2_zero }
557561
| "f32x4.convert_i32x4_"(sign as s)
558562
{ UNARY (ext s f32x4_convert_i32x4_s f32x4_convert_i32x4_u) }
559563
| "i8x16.narrow_i16x8_"(sign as s)

test/core/simd/simd_conversions.wast

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,160 @@
1616
(i16x8.narrow_i32x4_s (local.get 0) (local.get 1)))
1717
(func (export "i16x8.narrow_i32x4_u") (param v128 v128) (result v128)
1818
(i16x8.narrow_i32x4_u (local.get 0)(local.get 1)))
19+
20+
;; Float to float promote/demote
21+
(func (export "f64x2.promote_low_f32x4") (param v128) (result v128)
22+
(f64x2.promote_low_f32x4 (local.get 0)))
23+
(func (export "f32x4.demote_f64x2_zero") (param v128) (result v128)
24+
(f32x4.demote_f64x2_zero (local.get 0)))
1925
)
2026

27+
;; f64x2.promote_low_f32x4
28+
;; Float constants copied from test/core/conversions.wast.
29+
30+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 0.0 0.0 0.0 0.0))
31+
(v128.const f64x2 0.0 0.0))
32+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 -0.0 -0.0 -0.0 -0.0))
33+
(v128.const f64x2 -0.0 -0.0))
34+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 0x1p-149 0x1p-149 0x1p-149 0x1p-149))
35+
(v128.const f64x2 0x1p-149 0x1p-149))
36+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 -0x1p-149 -0x1p-149 -0x1p-149 -0x1p-149))
37+
(v128.const f64x2 -0x1p-149 -0x1p-149))
38+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 1.0 1.0 1.0 1.0))
39+
(v128.const f64x2 1.0 1.0))
40+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 -1.0 -1.0 -1.0 -1.0))
41+
(v128.const f64x2 -1.0 -1.0))
42+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 -0x1.fffffep+127 -0x1.fffffep+127 -0x1.fffffep+127 -0x1.fffffep+127))
43+
(v128.const f64x2 -0x1.fffffep+127 -0x1.fffffep+127))
44+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 0x1.fffffep+127 0x1.fffffep+127 0x1.fffffep+127 0x1.fffffep+127))
45+
(v128.const f64x2 0x1.fffffep+127 0x1.fffffep+127))
46+
;; Generated randomly by picking a random int and reinterpret it to float.
47+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 0x1p-119 0x1p-119 0x1p-119 0x1p-119))
48+
(v128.const f64x2 0x1p-119 0x1p-119))
49+
;; Generated randomly by picking a random float.
50+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 0x1.8f867ep+125 0x1.8f867ep+125 0x1.8f867ep+125 0x1.8f867ep+125))
51+
(v128.const f64x2 6.6382536710104395e+37 6.6382536710104395e+37))
52+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 inf inf inf inf))
53+
(v128.const f64x2 inf inf))
54+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 -inf -inf -inf -inf))
55+
(v128.const f64x2 -inf -inf))
56+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 nan nan nan nan))
57+
(v128.const f64x2 nan:canonical nan:canonical))
58+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 nan:0x200000 nan:0x200000 nan:0x200000 nan:0x200000))
59+
(v128.const f64x2 nan:arithmetic nan:arithmetic))
60+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 -nan -nan -nan -nan))
61+
(v128.const f64x2 nan:canonical nan:canonical))
62+
(assert_return (invoke "f64x2.promote_low_f32x4" (v128.const f32x4 -nan:0x200000 -nan:0x200000 -nan:0x200000 -nan:0x200000))
63+
(v128.const f64x2 nan:arithmetic nan:arithmetic))
64+
65+
;; f32x4.demote_f64x2_zero
66+
;; Float constants copied from test/core/conversions.wast.
67+
68+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0.0 0.0))
69+
(v128.const f32x4 0.0 0.0 0 0))
70+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0.0 -0.0))
71+
(v128.const f32x4 -0.0 -0.0 0 0))
72+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x0.0000000000001p-1022 0x0.0000000000001p-1022))
73+
(v128.const f32x4 0.0 0.0 0 0))
74+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x0.0000000000001p-1022 -0x0.0000000000001p-1022))
75+
(v128.const f32x4 -0.0 -0.0 0 0))
76+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 1.0 1.0))
77+
(v128.const f32x4 1.0 1.0 0 0))
78+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -1.0 -1.0))
79+
(v128.const f32x4 -1.0 -1.0 0 0))
80+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.fffffe0000000p-127 0x1.fffffe0000000p-127))
81+
(v128.const f32x4 0x1p-126 0x1p-126 0 0))
82+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.fffffe0000000p-127 -0x1.fffffe0000000p-127))
83+
(v128.const f32x4 -0x1p-126 -0x1p-126 0 0))
84+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.fffffdfffffffp-127 0x1.fffffdfffffffp-127))
85+
(v128.const f32x4 0x1.fffffcp-127 0x1.fffffcp-127 0 0))
86+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.fffffdfffffffp-127 -0x1.fffffdfffffffp-127))
87+
(v128.const f32x4 -0x1.fffffcp-127 -0x1.fffffcp-127 0 0))
88+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1p-149 0x1p-149))
89+
(v128.const f32x4 0x1p-149 0x1p-149 0 0))
90+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1p-149 -0x1p-149))
91+
(v128.const f32x4 -0x1p-149 -0x1p-149 0 0))
92+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.fffffd0000000p+127 0x1.fffffd0000000p+127))
93+
(v128.const f32x4 0x1.fffffcp+127 0x1.fffffcp+127 0 0))
94+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.fffffd0000000p+127 -0x1.fffffd0000000p+127))
95+
(v128.const f32x4 -0x1.fffffcp+127 -0x1.fffffcp+127 0 0))
96+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.fffffd0000001p+127 0x1.fffffd0000001p+127))
97+
(v128.const f32x4 0x1.fffffep+127 0x1.fffffep+127 0 0))
98+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.fffffd0000001p+127 -0x1.fffffd0000001p+127))
99+
(v128.const f32x4 -0x1.fffffep+127 -0x1.fffffep+127 0 0))
100+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.fffffep+127 0x1.fffffep+127))
101+
(v128.const f32x4 0x1.fffffep+127 0x1.fffffep+127 0 0))
102+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.fffffep+127 -0x1.fffffep+127))
103+
(v128.const f32x4 -0x1.fffffep+127 -0x1.fffffep+127 0 0))
104+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.fffffefffffffp+127 0x1.fffffefffffffp+127))
105+
(v128.const f32x4 0x1.fffffep+127 0x1.fffffep+127 0 0))
106+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.fffffefffffffp+127 -0x1.fffffefffffffp+127))
107+
(v128.const f32x4 -0x1.fffffep+127 -0x1.fffffep+127 0 0))
108+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.ffffffp+127 0x1.ffffffp+127))
109+
(v128.const f32x4 inf inf 0 0))
110+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.ffffffp+127 -0x1.ffffffp+127))
111+
(v128.const f32x4 -inf -inf 0 0))
112+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1p-119 0x1p-119))
113+
(v128.const f32x4 0x1p-119 0x1p-119 0 0))
114+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.8f867ep+125 0x1.8f867ep+125))
115+
(v128.const f32x4 0x1.8f867ep+125 0x1.8f867ep+125 0 0))
116+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 inf inf))
117+
(v128.const f32x4 inf inf 0 0))
118+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -inf -inf))
119+
(v128.const f32x4 -inf -inf 0 0))
120+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000000000001p+0 0x1.0000000000001p+0))
121+
(v128.const f32x4 1.0 1.0 0 0))
122+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.fffffffffffffp-1 0x1.fffffffffffffp-1))
123+
(v128.const f32x4 1.0 1.0 0 0))
124+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000010000000p+0 0x1.0000010000000p+0))
125+
(v128.const f32x4 0x1.000000p+0 0x1.000000p+0 0 0))
126+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000010000001p+0 0x1.0000010000001p+0))
127+
(v128.const f32x4 0x1.000002p+0 0x1.000002p+0 0 0))
128+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.000002fffffffp+0 0x1.000002fffffffp+0))
129+
(v128.const f32x4 0x1.000002p+0 0x1.000002p+0 0 0))
130+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000030000000p+0 0x1.0000030000000p+0))
131+
(v128.const f32x4 0x1.000004p+0 0x1.000004p+0 0 0))
132+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000050000000p+0 0x1.0000050000000p+0))
133+
(v128.const f32x4 0x1.000004p+0 0x1.000004p+0 0 0))
134+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000010000000p+24 0x1.0000010000000p+24))
135+
(v128.const f32x4 0x1.0p+24 0x1.0p+24 0 0))
136+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000010000001p+24 0x1.0000010000001p+24))
137+
(v128.const f32x4 0x1.000002p+24 0x1.000002p+24 0 0))
138+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.000002fffffffp+24 0x1.000002fffffffp+24))
139+
(v128.const f32x4 0x1.000002p+24 0x1.000002p+24 0 0))
140+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000030000000p+24 0x1.0000030000000p+24))
141+
(v128.const f32x4 0x1.000004p+24 0x1.000004p+24 0 0))
142+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.4eae4f7024c7p+108 0x1.4eae4f7024c7p+108))
143+
(v128.const f32x4 0x1.4eae5p+108 0x1.4eae5p+108 0 0))
144+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.a12e71e358685p-113 0x1.a12e71e358685p-113))
145+
(v128.const f32x4 0x1.a12e72p-113 0x1.a12e72p-113 0 0))
146+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.cb98354d521ffp-127 0x1.cb98354d521ffp-127))
147+
(v128.const f32x4 0x1.cb9834p-127 0x1.cb9834p-127 0 0))
148+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.6972b30cfb562p+1 -0x1.6972b30cfb562p+1))
149+
(v128.const f32x4 -0x1.6972b4p+1 -0x1.6972b4p+1 0 0))
150+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.bedbe4819d4c4p+112 -0x1.bedbe4819d4c4p+112))
151+
(v128.const f32x4 -0x1.bedbe4p+112 -0x1.bedbe4p+112 0 0))
152+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 nan nan))
153+
(v128.const f32x4 nan:canonical nan:canonical 0 0))
154+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 nan:0x4000000000000 nan:0x4000000000000))
155+
(v128.const f32x4 nan:arithmetic nan:arithmetic 0 0))
156+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -nan -nan))
157+
(v128.const f32x4 nan:canonical nan:canonical 0 0))
158+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -nan:0x4000000000000 -nan:0x4000000000000))
159+
(v128.const f32x4 nan:arithmetic nan:arithmetic 0 0))
160+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1p-1022 0x1p-1022))
161+
(v128.const f32x4 0.0 0.0 0 0))
162+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1p-1022 -0x1p-1022))
163+
(v128.const f32x4 -0.0 -0.0 0 0))
164+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0p-150 0x1.0p-150))
165+
(v128.const f32x4 0.0 0.0 0 0))
166+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.0p-150 -0x1.0p-150))
167+
(v128.const f32x4 -0.0 -0.0 0 0))
168+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 0x1.0000000000001p-150 0x1.0000000000001p-150))
169+
(v128.const f32x4 0x1p-149 0x1p-149 0 0))
170+
(assert_return (invoke "f32x4.demote_f64x2_zero" (v128.const f64x2 -0x1.0000000000001p-150 -0x1.0000000000001p-150))
171+
(v128.const f32x4 -0x1p-149 -0x1p-149 0 0))
172+
21173

22174
;; Integer to floating point
23175
;; f32x4.convert_i32x4_s

0 commit comments

Comments
 (0)