Skip to content

Add float conversion tests #81

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 23, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 167 additions & 11 deletions ml-proto/test/conversions.wasm
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,63 @@
;; i64.trunc_u/f32
(func $i64_trunc_u_f32 (param $x f32) (result i64) (i64.trunc_u/f32 (get_local $x)))
(export "$i64_trunc_u_f32" $i64_trunc_u_f32)

;; f32.convert_s/i32
(func $f32_convert_s_i32 (param $x i32) (result f32) (f32.convert_s/i32 (get_local $x)))
(export "$f32_convert_s_i32" $f32_convert_s_i32)

;; f32.convert_s/i64
(func $f32_convert_s_i64 (param $x i64) (result f32) (f32.convert_s/i64 (get_local $x)))
(export "$f32_convert_s_i64" $f32_convert_s_i64)

;; f64.convert_s/i32
(func $f64_convert_s_i32 (param $x i32) (result f64) (f64.convert_s/i32 (get_local $x)))
(export "$f64_convert_s_i32" $f64_convert_s_i32)

;; f64.convert_s/i64
(func $f64_convert_s_i64 (param $x i64) (result f64) (f64.convert_s/i64 (get_local $x)))
(export "$f64_convert_s_i64" $f64_convert_s_i64)

;; f32.convert_u/i32
(func $f32_convert_u_i32 (param $x i32) (result f32) (f32.convert_u/i32 (get_local $x)))
(export "$f32_convert_u_i32" $f32_convert_u_i32)

;; f32.convert_u/i64
(func $f32_convert_u_i64 (param $x i64) (result f32) (f32.convert_u/i64 (get_local $x)))
(export "$f32_convert_u_i64" $f32_convert_u_i64)

;; f64.convert_u/i32
(func $f64_convert_u_i32 (param $x i32) (result f64) (f64.convert_u/i32 (get_local $x)))
(export "$f64_convert_u_i32" $f64_convert_u_i32)

;; f64.convert_u/i64
(func $f64_convert_u_i64 (param $x i64) (result f64) (f64.convert_u/i64 (get_local $x)))
(export "$f64_convert_u_i64" $f64_convert_u_i64)

;; f64.promote/f32
(func $f64_promote_f32 (param $x f32) (result f64) (f64.promote/f32 (get_local $x)))
(export "$f64_promote_f32" $f64_promote_f32)

;; f32.demote/f64
(func $f32_demote_f64 (param $x f64) (result f32) (f32.demote/f64 (get_local $x)))
(export "$f32_demote_f64" $f32_demote_f64)

;; f32.reinterpret/i32
(func $f32_reinterpret_i32 (param $x i32) (result f32) (f32.reinterpret/i32 (get_local $x)))
(export "$f32_reinterpret_i32" $f32_reinterpret_i32)

;; f64.reinterpret/i64
(func $f64_reinterpret_i64 (param $x i64) (result f64) (f64.reinterpret/i64 (get_local $x)))
(export "$f64_reinterpret_i64" $f64_reinterpret_i64)

;; i32.reinterpret/f32
(func $i32_reinterpret_f32 (param $x f32) (result i32) (i32.reinterpret/f32 (get_local $x)))
(export "$i32_reinterpret_f32" $i32_reinterpret_f32)

;; i64.reinterpret/f64
(func $i64_reinterpret_f64 (param $x f64) (result i64) (i64.reinterpret/f64 (get_local $x)))
(export "$i64_reinterpret_f64" $i64_reinterpret_f64)

)

;; i64.extend_s/i32
Expand Down Expand Up @@ -89,14 +146,113 @@
(assert_eq (invoke "$i64_trunc_u_f32" (f32.const 1.5)) (i64.const 1))
(assert_eq (invoke "$i64_trunc_u_f32" (f32.const 4294967296)) (i64.const 4294967296))

(;
todo:
fxx.convert_s/ixx
fxx.convert_u/ixx
f64.promote/f32
f32.demote/f64
f32.reinterpret/i32
f64.reinterpret/i64
i32.reinterpret/f32
i64.reinterpret/f64
;)
;; f32.convert_s/i32
(assert_eq (invoke "$f32_convert_s_i32" (i32.const 1)) (f32.const 1.0))
(assert_eq (invoke "$f32_convert_s_i32" (i32.const -1)) (f32.const -1.0))
(assert_eq (invoke "$f32_convert_s_i32" (i32.const 0)) (f32.const 0.0))
(assert_eq (invoke "$f32_convert_s_i32" (i32.const 2147483647)) (f32.const 2147483647))
(assert_eq (invoke "$f32_convert_s_i32" (i32.const -2147483648)) (f32.const -2147483648))
(assert_eq (invoke "$f32_convert_s_i32" (i32.const 1234567890)) (f32.const 1234567890))

;; f32.convert_s/i64
(assert_eq (invoke "$f32_convert_s_i64" (i64.const 1)) (f32.const 1.0))
(assert_eq (invoke "$f32_convert_s_i64" (i64.const -1)) (f32.const -1.0))
(assert_eq (invoke "$f32_convert_s_i64" (i64.const 0)) (f32.const 0.0))
(assert_eq (invoke "$f32_convert_s_i64" (i64.const 9223372036854775807)) (f32.const 9223372036854775807))
(assert_eq (invoke "$f32_convert_s_i64" (i64.const -9223372036854775808)) (f32.const -9223372036854775808))
(assert_eq (invoke "$f32_convert_s_i64" (i64.const 314159265358979)) (f32.const 314159265358979)) ;; PI

;; f64.convert_s/i32
(assert_eq (invoke "$f64_convert_s_i32" (i32.const 1)) (f64.const 1.0))
(assert_eq (invoke "$f64_convert_s_i32" (i32.const -1)) (f64.const -1.0))
(assert_eq (invoke "$f64_convert_s_i32" (i32.const 0)) (f64.const 0.0))
(assert_eq (invoke "$f64_convert_s_i32" (i32.const 2147483647)) (f64.const 2147483647))
(assert_eq (invoke "$f64_convert_s_i32" (i32.const -2147483648)) (f64.const -2147483648))
(assert_eq (invoke "$f64_convert_s_i32" (i32.const 987654321)) (f64.const 987654321))

;; f64.convert_s/i64
(assert_eq (invoke "$f64_convert_s_i64" (i64.const 1)) (f64.const 1.0))
(assert_eq (invoke "$f64_convert_s_i64" (i64.const -1)) (f64.const -1.0))
(assert_eq (invoke "$f64_convert_s_i64" (i64.const 0)) (f64.const 0.0))
(assert_eq (invoke "$f64_convert_s_i64" (i64.const 9223372036854775807)) (f64.const 9223372036854775807))
(assert_eq (invoke "$f64_convert_s_i64" (i64.const -9223372036854775808)) (f64.const -9223372036854775808))
(assert_eq (invoke "$f64_convert_s_i64" (i64.const 4669201609102990)) (f64.const 4669201609102990)) ;; Feigenbaum

;; f32.convert_u/i32
(assert_eq (invoke "$f32_convert_u_i32" (i32.const 1)) (f32.const 1.0))
(assert_eq (invoke "$f32_convert_u_i32" (i32.const 0)) (f32.const 0.0))
(assert_eq (invoke "$f32_convert_u_i32" (i32.const 2147483647)) (f32.const 2147483647))
(assert_eq (invoke "$f32_convert_u_i32" (i32.const -2147483648)) (f32.const 2147483648))
(assert_eq (invoke "$f32_convert_u_i32" (i32.const 305419896)) (f32.const 305419896)) ;; 0x12345678
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The wasm parser does recognize hexadecimal constants now, so you can write the constant directly now instead of writing it in decimal and having a comment :-).


;; f32.convert_u/i64
(assert_eq (invoke "$f32_convert_u_i64" (i64.const 1)) (f32.const 1.0))
(assert_eq (invoke "$f32_convert_u_i64" (i64.const 0)) (f32.const 0.0))
(assert_eq (invoke "$f32_convert_u_i64" (i64.const 9223372036854775807)) (f32.const 9223372036854775807))
(assert_eq (invoke "$f32_convert_u_i64" (i64.const -9223372036854775808)) (f32.const 9223372036854775808))

;; f64.convert_u/i32
(assert_eq (invoke "$f64_convert_u_i32" (i32.const 1)) (f64.const 1.0))
(assert_eq (invoke "$f64_convert_u_i32" (i32.const 0)) (f64.const 0.0))
(assert_eq (invoke "$f64_convert_u_i32" (i32.const 2147483647)) (f64.const 2147483647))
(assert_eq (invoke "$f64_convert_u_i32" (i32.const -2147483648)) (f64.const 2147483648))

;; f64.convert_u/i64
(assert_eq (invoke "$f64_convert_u_i64" (i64.const 1)) (f64.const 1.0))
(assert_eq (invoke "$f64_convert_u_i64" (i64.const 0)) (f64.const 0.0))
(assert_eq (invoke "$f64_convert_u_i64" (i64.const 9223372036854775807)) (f64.const 9223372036854775807))
(assert_eq (invoke "$f64_convert_u_i64" (i64.const -9223372036854775808)) (f64.const 9223372036854775808))

;; f64.promote/f32
(assert_eq (invoke "$f64_promote_f32" (f32.const 0.0)) (f64.const 0.0))
(assert_eq (invoke "$f64_promote_f32" (f32.const 1.0)) (f64.const 1.0))
(assert_eq (invoke "$f64_promote_f32" (f32.const -1.0)) (f64.const -1.0))
(assert_eq (invoke "$f64_promote_f32" (f32.const 1.4012985e-45)) (f64.const 1.401298464324817e-45))
(assert_eq (invoke "$f64_promote_f32" (f32.const -1.4012985e-45)) (f64.const -1.401298464324817e-45))
(assert_eq (invoke "$f64_promote_f32" (f32.const -3.4028235e+38)) (f64.const -3.4028234663852886e+38))
(assert_eq (invoke "$f64_promote_f32" (f32.const 3.4028235e+38)) (f64.const 3.4028234663852886e+38))
;; Generated randomly by picking a random int and reinterpret it to float.
(assert_eq (invoke "$f64_promote_f32" (f32.const 1.5046328e-36)) (f64.const 1.504632769052528e-36))
;; Generated randomly by picking a random float.
(assert_eq (invoke "$f64_promote_f32" (f32.const 6.6382537e+37)) (f64.const 6.6382536710104395e+37))

;; f32.demote/f64
(assert_eq (invoke "$f32_demote_f64" (f64.const 0.0)) (f32.const 0.0))
(assert_eq (invoke "$f32_demote_f64" (f64.const 1.0)) (f32.const 1.0))
(assert_eq (invoke "$f32_demote_f64" (f64.const -1.0)) (f32.const -1.0))
(assert_eq (invoke "$f32_demote_f64" (f64.const -1.401298464324817e-45)) (f32.const -1.4012985e-45))
(assert_eq (invoke "$f32_demote_f64" (f64.const 1.401298464324817e-45)) (f32.const 1.4012985e-45))
(assert_eq (invoke "$f32_demote_f64" (f64.const 3.402823466385289e+38)) (f32.const 3.4028235e+38))
(assert_eq (invoke "$f32_demote_f64" (f64.const -3.402823466385289e+38)) (f32.const -3.4028235e+38))
(assert_eq (invoke "$f32_demote_f64" (f64.const 1.504632769052528e-36)) (f32.const 1.5046328e-36))
(assert_eq (invoke "$f32_demote_f64" (f64.const 6.6382536710104395e+37)) (f32.const 6.6382537e+37))

;; f32.reinterpret/i32
(assert_eq (invoke "$f32_reinterpret_i32" (i32.const 0)) (f32.const 0.0))
(assert_eq (invoke "$f32_reinterpret_i32" (i32.const 1)) (f32.const 1.4012984e-45))
(assert_eq (invoke "$f32_reinterpret_i32" (i32.const 123456789)) (f32.const 1.6535997e-34))
(assert_eq (invoke "$f32_reinterpret_i32" (i32.const -2147483647)) (f32.const -1.4012984e-45))

;; f64.reinterpret/i64
(assert_eq (invoke "$f64_reinterpret_i64" (i64.const 0)) (f64.const 0.0))
(assert_eq (invoke "$f64_reinterpret_i64" (i64.const 1)) (f64.const 4.94066e-324))
(assert_eq (invoke "$f64_reinterpret_i64" (i64.const 1234567890)) (f64.const 6.099575819077150e-315))
(assert_eq (invoke "$f64_reinterpret_i64" (i64.const -9223372036854775807)) (f64.const -4.940656458412465e-324))

;; i32.reinterpret/f32
(assert_eq (invoke "$i32_reinterpret_f32" (f32.const 0.0)) (i32.const 0))
(assert_eq (invoke "$i32_reinterpret_f32" (f32.const 1.0)) (i32.const 1065353216))
(assert_eq (invoke "$i32_reinterpret_f32" (f32.const 3.1415926)) (i32.const 1078530010))
(assert_eq (invoke "$i32_reinterpret_f32" (f32.const 3.4028235e+38)) (i32.const 2139095039))
(assert_eq (invoke "$i32_reinterpret_f32" (f32.const -3.4028235e+38)) (i32.const -8388609))
(assert_eq (invoke "$i32_reinterpret_f32" (f32.const 1.4012984e-45)) (i32.const 1))
(assert_eq (invoke "$i32_reinterpret_f32" (f32.const -1.4012984e-45)) (i32.const -2147483647))

;; i64.reinterpret/f64
(assert_eq (invoke "$i64_reinterpret_f64" (f64.const 0.0)) (i64.const 0))
(assert_eq (invoke "$i64_reinterpret_f64" (f64.const 1.0)) (i64.const 4607182418800017408))
(assert_eq (invoke "$i64_reinterpret_f64" (f64.const 3.14159265358979)) (i64.const 4614256656552045841))
(assert_eq (invoke "$i64_reinterpret_f64" (f64.const 1.7976931348623157e+308)) (i64.const 9218868437227405311))
(assert_eq (invoke "$i64_reinterpret_f64" (f64.const -1.7976931348623157e+308)) (i64.const -4503599627370497))
(assert_eq (invoke "$i64_reinterpret_f64" (f64.const 4.9406565e-324)) (i64.const 1))
(assert_eq (invoke "$i64_reinterpret_f64" (f64.const -4.9406565e-324)) (i64.const -9223372036854775807))