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

Commit 30a0912

Browse files
authored
Add f64x2 add sub mul div neg sqrt (#246)
This passes f64x2_arith.wast
1 parent 64b67f8 commit 30a0912

File tree

3 files changed

+24
-20
lines changed

3 files changed

+24
-20
lines changed

interpreter/exec/eval_numeric.ml

+6
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ struct
133133
| F32x4 Neg -> to_value (SXX.F32x4.neg (of_value 1 v))
134134
| F32x4 Sqrt -> to_value (SXX.F32x4.sqrt (of_value 1 v))
135135
| F64x2 Abs -> to_value (SXX.F64x2.abs (of_value 1 v))
136+
| F64x2 Neg -> to_value (SXX.F64x2.neg (of_value 1 v))
137+
| F64x2 Sqrt -> to_value (SXX.F64x2.sqrt (of_value 1 v))
136138
| _ -> failwith "TODO v128 unimplemented unop"
137139

138140
let binop (op : binop) =
@@ -150,6 +152,10 @@ struct
150152
| F32x4 Div -> SXX.F32x4.div
151153
| F32x4 Min -> SXX.F32x4.min
152154
| F32x4 Max -> SXX.F32x4.max
155+
| F64x2 Add -> SXX.F64x2.add
156+
| F64x2 Sub -> SXX.F64x2.sub
157+
| F64x2 Mul -> SXX.F64x2.mul
158+
| F64x2 Div -> SXX.F64x2.div
153159
| F64x2 Min -> SXX.F64x2.min
154160
| F64x2 Max -> SXX.F64x2.max
155161
| _ -> failwith "TODO v128 unimplemented binop"

interpreter/syntax/operators.ml

+6
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@ let f32x4_div = Binary (V128 (V128Op.F32x4 V128Op.Div))
226226
let f32x4_min = Binary (V128 (V128Op.F32x4 V128Op.Min))
227227
let f32x4_max = Binary (V128 (V128Op.F32x4 V128Op.Max))
228228

229+
let f64x2_neg = Unary (V128 (V128Op.F64x2 V128Op.Neg))
230+
let f64x2_sqrt = Unary (V128 (V128Op.F64x2 V128Op.Sqrt))
231+
let f64x2_add = Binary (V128 (V128Op.F64x2 V128Op.Add))
232+
let f64x2_sub = Binary (V128 (V128Op.F64x2 V128Op.Sub))
233+
let f64x2_mul = Binary (V128 (V128Op.F64x2 V128Op.Mul))
234+
let f64x2_div = Binary (V128 (V128Op.F64x2 V128Op.Div))
229235
let f64x2_min = Binary (V128 (V128Op.F64x2 V128Op.Min))
230236
let f64x2_max = Binary (V128 (V128Op.F64x2 V128Op.Max))
231237
let f64x2_abs = Unary (V128 (V128Op.F64x2 V128Op.Abs))

interpreter/text/lexer.mll

+12-20
Original file line numberDiff line numberDiff line change
@@ -389,17 +389,15 @@ rule token = parse
389389
| "output" { OUTPUT }
390390

391391
| (simd_shape as s)".neg"
392-
{ if s <> "i32x4" && s <> "f32x4" then error lexbuf "unknown operator";
393-
UNARY (simdop s unreachable unreachable i32x4_neg unreachable f32x4_neg unreachable) }
394-
| (simd_float_shape as s)".sqrt"
395-
{ if s <> "f32x4" then error lexbuf "unknown operator";
396-
UNARY (simd_float_op s f32x4_sqrt unreachable) }
392+
{ if s <> "i32x4" && s <> "f32x4" && s <> "f64x2" then error lexbuf "unknown operator";
393+
UNARY (simdop s unreachable unreachable i32x4_neg unreachable f32x4_neg f64x2_neg) }
394+
| (simd_float_shape as s)".sqrt" { UNARY (simd_float_op s f32x4_sqrt f64x2_sqrt) }
397395
| (simd_shape as s)".add"
398-
{ if s <> "i32x4" && s <> "f32x4" then error lexbuf "unknown operator";
399-
BINARY (simdop s unreachable unreachable i32x4_add unreachable f32x4_add unreachable) }
396+
{ if s <> "i32x4" && s <> "f32x4" && s <> "f64x2" then error lexbuf "unknown operator";
397+
BINARY (simdop s unreachable unreachable i32x4_add unreachable f32x4_add f64x2_add) }
400398
| (simd_shape as s)".sub"
401-
{ if s <> "i32x4" && s <> "f32x4" then error lexbuf "unknown operator";
402-
BINARY (simdop s unreachable unreachable i32x4_sub unreachable f32x4_sub unreachable) }
399+
{ if s <> "i32x4" && s <> "f32x4" && s <> "f64x2" then error lexbuf "unknown operator";
400+
BINARY (simdop s unreachable unreachable i32x4_sub unreachable f32x4_sub f64x2_sub) }
403401
| (simd_shape as s)".min_s"
404402
{ if s <> "i32x4" then error lexbuf "unknown operator";
405403
BINARY (simdop s unreachable unreachable i32x4_min_s unreachable unreachable unreachable) }
@@ -413,17 +411,11 @@ rule token = parse
413411
{ if s <> "i32x4" then error lexbuf "unknown operator";
414412
BINARY (simdop s unreachable unreachable i32x4_max_u unreachable unreachable unreachable) }
415413
| (simd_shape as s)".mul"
416-
{ if s <> "i32x4" && s <> "f32x4" then error lexbuf "unknown operator";
417-
BINARY (simdop s unreachable unreachable i32x4_mul unreachable f32x4_mul unreachable) }
418-
| (simd_float_shape as s)".div"
419-
{ if s <> "f32x4" then error lexbuf "unknown operator";
420-
BINARY (simd_float_op s f32x4_div unreachable) }
421-
| (simd_shape as s)".min"
422-
{ if s <> "f32x4" && s <> "f64x2" then error lexbuf "unknown operator";
423-
BINARY (simdop s unreachable unreachable unreachable unreachable f32x4_min f64x2_min) }
424-
| (simd_shape as s)".max"
425-
{ if s <> "f32x4" && s <> "f64x2" then error lexbuf "unknown operator";
426-
BINARY (simdop s unreachable unreachable unreachable unreachable f32x4_max f64x2_max) }
414+
{ if s <> "i32x4" && s <> "f32x4" && s <> "f64x2" then error lexbuf "unknown operator";
415+
BINARY (simdop s unreachable unreachable i32x4_mul unreachable f32x4_mul f64x2_mul) }
416+
| (simd_float_shape as s)".div" { BINARY (simd_float_op s f32x4_div f64x2_div) }
417+
| (simd_float_shape as s)".min" { BINARY (simd_float_op s f32x4_min f64x2_min) }
418+
| (simd_float_shape as s)".max" { BINARY (simd_float_op s f32x4_max f64x2_max) }
427419
| (simd_shape as s)".abs"
428420
{ if s <> "i32x4" && s <> "f32x4" && s <> "f64x2" then error lexbuf "unknown operator";
429421
UNARY (simdop s unreachable unreachable i32x4_abs unreachable f32x4_abs f64x2_abs) }

0 commit comments

Comments
 (0)