Skip to content

Commit

Permalink
[simd/jit]: Implement simple f64x2 arithmetic operations
Browse files Browse the repository at this point in the history
  • Loading branch information
haoyu-zc committed Jul 19, 2023
1 parent 48cd90f commit 7e83dfe
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 71 deletions.
7 changes: 7 additions & 0 deletions src/engine/x86-64/X86_64SinglePassCompiler.v3
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,13 @@ class X86_64SinglePassCompiler extends SinglePassCompiler {
def visit_F32X4_NEG() { visit_V128_F_NEG_ABS(mmasm.emit_v128_negps); }
def visit_F32X4_SQRT() { do_op1_x_x(ValueKind.V128, asm.sqrtps_s_s); }

def visit_F64X2_ADD() { do_op2_x_x(ValueKind.V128, asm.addpd_s_s); }
def visit_F64X2_SUB() { do_op2_x_x(ValueKind.V128, asm.subpd_s_s); }
def visit_F64X2_MUL() { do_op2_x_x(ValueKind.V128, asm.mulpd_s_s); }
def visit_F64X2_DIV() { do_op2_x_x(ValueKind.V128, asm.divpd_s_s); }
def visit_F64X2_NEG() { visit_V128_F_NEG_ABS(mmasm.emit_v128_negpd); }
def visit_F64X2_SQRT() { do_op1_x_x(ValueKind.V128, asm.sqrtpd_s_s); }

def visit_V128_BITSELECT() {
var c = popReg();
var b = popReg();
Expand Down
51 changes: 0 additions & 51 deletions test/regress/simd/simd_f64x2_arith.bin.wast
Original file line number Diff line number Diff line change
Expand Up @@ -12349,57 +12349,6 @@
)
(v128.const f64x2 -0x1.2345_6789_abcd_fp+61 -0x1.2345_6789_abcd_fp+61)
)
(module binary
"\00\61\73\6d\01\00\00\00\01\85\80\80\80\00\01\60"
"\00\01\7b\03\87\80\80\80\00\06\00\00\00\00\00\00"
"\07\ee\80\80\80\00\06\0f\66\36\34\78\32\5f\61\64"
"\64\5f\61\72\69\74\68\00\00\0f\66\36\34\78\32\5f"
"\64\69\76\5f\6d\69\78\65\64\00\01\0f\66\36\34\78"
"\32\5f\6d\75\6c\5f\6d\69\78\65\64\00\02\0f\66\36"
"\34\78\32\5f\6e\65\67\5f\63\61\6e\6f\6e\00\03\10"
"\66\36\34\78\32\5f\73\71\72\74\5f\63\61\6e\6f\6e"
"\00\04\0f\66\36\34\78\32\5f\73\75\62\5f\61\72\69"
"\74\68\00\05\0a\f1\81\80\80\00\06\a9\80\80\80\00"
"\00\fd\0c\00\00\00\00\00\00\f8\7f\00\00\00\00\00"
"\00\f0\3f\fd\0c\00\00\00\00\00\00\f8\7f\00\00\00"
"\00\00\00\f0\3f\fd\f0\01\0b\a9\80\80\80\00\00\fd"
"\0c\00\00\00\00\00\00\f8\7f\00\00\00\00\00\00\f0"
"\3f\fd\0c\00\00\00\00\00\00\00\40\00\00\00\00\00"
"\00\f8\ff\fd\f3\01\0b\a9\80\80\80\00\00\fd\0c\00"
"\00\00\00\00\00\f8\7f\00\00\00\00\00\00\f0\3f\fd"
"\0c\00\00\00\00\00\00\00\40\00\00\00\00\00\00\f8"
"\7f\fd\f2\01\0b\97\80\80\80\00\00\fd\0c\00\00\00"
"\00\00\00\f8\7f\00\00\00\00\00\00\f0\3f\fd\ed\01"
"\0b\97\80\80\80\00\00\fd\0c\00\00\00\00\00\00\10"
"\40\00\00\00\00\00\00\f8\ff\fd\ef\01\0b\a9\80\80"
"\80\00\00\fd\0c\00\00\00\00\00\00\f0\3f\00\00\00"
"\00\00\00\f0\bf\fd\0c\00\00\00\00\00\00\f8\ff\00"
"\00\00\00\00\00\f0\3f\fd\f1\01\0b"
)
(assert_return
(invoke "f64x2_add_arith")
(v128.const f64x2 nan:arithmetic 0x1p+1)
)
(assert_return
(invoke "f64x2_div_mixed")
(v128.const f64x2 nan:canonical nan:arithmetic)
)
(assert_return
(invoke "f64x2_mul_mixed")
(v128.const f64x2 nan:arithmetic nan:canonical)
)
(assert_return
(invoke "f64x2_neg_canon")
(v128.const f64x2 nan:canonical -0x1p+0)
)
(assert_return
(invoke "f64x2_sqrt_canon")
(v128.const f64x2 0x1p+1 nan:canonical)
)
(assert_return
(invoke "f64x2_sub_arith")
(v128.const f64x2 nan:canonical -0x1p+1)
)
(assert_invalid
(module binary
"\00\61\73\6d\01\00\00\00\01\85\80\80\80\00\01\60"
Expand Down
41 changes: 21 additions & 20 deletions test/regress/simd/simd_f64x2_arith.wast
Original file line number Diff line number Diff line change
Expand Up @@ -5276,27 +5276,28 @@
(v128.const f64x2 -0x1.23456789abcdfp+61 -0x1.23456789abcdfp+61))

;; Mixed f64x2 tests when some lanes are NaNs
(module
(func (export "f64x2_add_arith") (result v128)
(f64x2.add (v128.const f64x2 nan:0x8000000000000 1.0) (v128.const f64x2 nan 1.0)))
(func (export "f64x2_div_mixed") (result v128)
(f64x2.div (v128.const f64x2 nan 1.0) (v128.const f64x2 2.0 -nan:0x8000000000000)))
(func (export "f64x2_mul_mixed") (result v128)
(f64x2.mul (v128.const f64x2 nan:0x8000000000000 1.0) (v128.const f64x2 2.0 nan)))
(func (export "f64x2_neg_canon") (result v128)
(f64x2.neg (v128.const f64x2 nan 1.0)))
(func (export "f64x2_sqrt_canon") (result v128)
(f64x2.sqrt (v128.const f64x2 4.0 -nan)))
(func (export "f64x2_sub_arith") (result v128)
(f64x2.sub (v128.const f64x2 1.0 -1.0) (v128.const f64x2 -nan 1.0)))
)
;; todo: uncomment this after jit:v128.const is implemented
;; (module
;; (func (export "f64x2_add_arith") (result v128)
;; (f64x2.add (v128.const f64x2 nan:0x8000000000000 1.0) (v128.const f64x2 nan 1.0)))
;; (func (export "f64x2_div_mixed") (result v128)
;; (f64x2.div (v128.const f64x2 nan 1.0) (v128.const f64x2 2.0 -nan:0x8000000000000)))
;; (func (export "f64x2_mul_mixed") (result v128)
;; (f64x2.mul (v128.const f64x2 nan:0x8000000000000 1.0) (v128.const f64x2 2.0 nan)))
;; (func (export "f64x2_neg_canon") (result v128)
;; (f64x2.neg (v128.const f64x2 nan 1.0)))
;; (func (export "f64x2_sqrt_canon") (result v128)
;; (f64x2.sqrt (v128.const f64x2 4.0 -nan)))
;; (func (export "f64x2_sub_arith") (result v128)
;; (f64x2.sub (v128.const f64x2 1.0 -1.0) (v128.const f64x2 -nan 1.0)))
;; )

(assert_return (invoke "f64x2_add_arith") (v128.const f64x2 nan:arithmetic 2.0))
(assert_return (invoke "f64x2_div_mixed") (v128.const f64x2 nan:canonical nan:arithmetic))
(assert_return (invoke "f64x2_mul_mixed") (v128.const f64x2 nan:arithmetic nan:canonical))
(assert_return (invoke "f64x2_neg_canon") (v128.const f64x2 nan:canonical -1.0))
(assert_return (invoke "f64x2_sqrt_canon") (v128.const f64x2 2.0 nan:canonical))
(assert_return (invoke "f64x2_sub_arith") (v128.const f64x2 nan:canonical -2.0))
;; (assert_return (invoke "f64x2_add_arith") (v128.const f64x2 nan:arithmetic 2.0))
;; (assert_return (invoke "f64x2_div_mixed") (v128.const f64x2 nan:canonical nan:arithmetic))
;; (assert_return (invoke "f64x2_mul_mixed") (v128.const f64x2 nan:arithmetic nan:canonical))
;; (assert_return (invoke "f64x2_neg_canon") (v128.const f64x2 nan:canonical -1.0))
;; (assert_return (invoke "f64x2_sqrt_canon") (v128.const f64x2 2.0 nan:canonical))
;; (assert_return (invoke "f64x2_sub_arith") (v128.const f64x2 nan:canonical -2.0))

;; type check
(assert_invalid (module (func (result v128) (f64x2.neg (i64.const 0)))) "type mismatch")
Expand Down

0 comments on commit 7e83dfe

Please sign in to comment.