;; f64, small exponent
(module (func (export "f") (result f64) (f64.const +0x1.000000000000080000000000p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000000p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000080000000000p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000000p-600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000080000000001p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000080000000001p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x1.0000000000000fffffffffffp-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x1.0000000000000fffffffffffp-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000100000000000p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000100000000000p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000100000000001p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000100000000001p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x1.00000000000017ffffffffffp-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x1.00000000000017ffffffffffp-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000180000000000p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000180000000000p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000180000000001p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000180000000001p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x1.0000000000001fffffffffffp-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x1.0000000000001fffffffffffp-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000200000000000p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000200000000000p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000200000000001p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000200000000001p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x1.00000000000027ffffffffffp-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x1.00000000000027ffffffffffp-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000280000000001p-600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000003p-600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000280000000001p-600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000003p-600))

(module (func (export "f") (result f64) (f64.const +0x8000000.000000400000000000p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000000p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000000400000000000p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000000p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000000400000000001p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000000400000000001p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.0000007fffffffffffp-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.0000007fffffffffffp-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000000800000000000p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000000800000000000p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000000800000000001p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000000800000000001p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000000bfffffffffffp-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000000bfffffffffffp-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000000c00000000000p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000000c00000000000p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000000c00000000001p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000000c00000000001p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000000ffffffffffffp-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000000ffffffffffffp-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000001000000000000p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000001000000000000p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000001000000000001p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000001000000000001p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.0000013fffffffffffp-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.0000013fffffffffffp-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600))
(module (func (export "f") (result f64) (f64.const +0x8000000.000001400000000001p-627)))
(assert_return (invoke "f") (f64.const +0x1.0000000000003p-600))
(module (func (export "f") (result f64) (f64.const -0x8000000.000001400000000001p-627)))
(assert_return (invoke "f") (f64.const -0x1.0000000000003p-600))

(module (func (export "f") (result f64) (f64.const +5.3575430359313371995e+300)))
(assert_return (invoke "f") (f64.const +0x1.0000000000000p+999))
(module (func (export "f") (result f64) (f64.const -5.3575430359313371995e+300)))
(assert_return (invoke "f") (f64.const -0x1.0000000000000p+999))
(module (func (export "f") (result f64) (f64.const +5.3575430359313371996e+300)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+999))
(module (func (export "f") (result f64) (f64.const -5.3575430359313371996e+300)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+999))
(module (func (export "f") (result f64) (f64.const +5.3575430359313383891e+300)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+999))
(module (func (export "f") (result f64) (f64.const -5.3575430359313383891e+300)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+999))
(module (func (export "f") (result f64) (f64.const +5.3575430359313383892e+300)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+999))
(module (func (export "f") (result f64) (f64.const -5.3575430359313383892e+300)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+999))

;; f64, large exponent
(module (func (export "f") (result f64) (f64.const +0x1.000000000000080000000000p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000000p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000080000000000p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000000p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000080000000001p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000080000000001p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const +0x1.0000000000000fffffffffffp+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const -0x1.0000000000000fffffffffffp+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000100000000000p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000100000000000p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000100000000001p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000100000000001p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const +0x1.00000000000017ffffffffffp+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const -0x1.00000000000017ffffffffffp+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000180000000000p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000180000000000p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000180000000001p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000180000000001p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const +0x1.0000000000001fffffffffffp+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const -0x1.0000000000001fffffffffffp+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000200000000000p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000200000000000p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000200000000001p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000200000000001p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const +0x1.00000000000027ffffffffffp+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const -0x1.00000000000027ffffffffffp+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000280000000000p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000280000000000p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000280000000001p+600)))
(assert_return (invoke "f") (f64.const +0x1.0000000000003p+600))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000280000000001p+600)))
(assert_return (invoke "f") (f64.const -0x1.0000000000003p+600))

(module (func (export "f") (result f64) (f64.const +0x2000000000000100000000000)))
(assert_return (invoke "f") (f64.const +0x1.0000000000000p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000100000000000)))
(assert_return (invoke "f") (f64.const -0x1.0000000000000p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000100000000001)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000100000000001)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const +0x20000000000001fffffffffff)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const -0x20000000000001fffffffffff)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000200000000000)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000200000000000)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000200000000001)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000200000000001)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const +0x20000000000002fffffffffff)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const -0x20000000000002fffffffffff)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000300000000000)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000300000000000)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000300000000001)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000300000000001)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const +0x20000000000003fffffffffff)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const -0x20000000000003fffffffffff)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000400000000000)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000400000000000)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000400000000001)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000400000000001)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const +0x20000000000004fffffffffff)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const -0x20000000000004fffffffffff)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000500000000000)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000500000000000)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97))
(module (func (export "f") (result f64) (f64.const +0x2000000000000500000000001)))
(assert_return (invoke "f") (f64.const +0x1.0000000000003p+97))
(module (func (export "f") (result f64) (f64.const -0x2000000000000500000000001)))
(assert_return (invoke "f") (f64.const -0x1.0000000000003p+97))

(module (func (export "f") (result f64) (f64.const +1152921504606847104)))
(assert_return (invoke "f") (f64.const +0x1.0000000000000p+60))
(module (func (export "f") (result f64) (f64.const -1152921504606847104)))
(assert_return (invoke "f") (f64.const -0x1.0000000000000p+60))
(module (func (export "f") (result f64) (f64.const +1152921504606847105)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+60))
(module (func (export "f") (result f64) (f64.const -1152921504606847105)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+60))
(module (func (export "f") (result f64) (f64.const +1152921504606847359)))
(assert_return (invoke "f") (f64.const +0x1.0000000000001p+60))
(module (func (export "f") (result f64) (f64.const -1152921504606847359)))
(assert_return (invoke "f") (f64.const -0x1.0000000000001p+60))
(module (func (export "f") (result f64) (f64.const +1152921504606847360)))
(assert_return (invoke "f") (f64.const +0x1.0000000000002p+60))
(module (func (export "f") (result f64) (f64.const -1152921504606847360)))
(assert_return (invoke "f") (f64.const -0x1.0000000000002p+60))

;; f64, subnormal
(module (func (export "f") (result f64) (f64.const +0x0.000000000000080000000000p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000000p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000080000000000p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000000p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.000000000000080000000001p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000080000000001p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.0000000000000fffffffffffp-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.0000000000000fffffffffffp-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.000000000000100000000000p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000100000000000p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.000000000000100000000001p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000100000000001p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.00000000000017ffffffffffp-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.00000000000017ffffffffffp-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.000000000000180000000000p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000180000000000p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.000000000000180000000001p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000180000000001p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.0000000000001fffffffffffp-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.0000000000001fffffffffffp-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.000000000000200000000000p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000200000000000p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.000000000000200000000001p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000200000000001p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.00000000000027ffffffffffp-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.00000000000027ffffffffffp-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const +0x0.000000000000280000000000p-1022)))
(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const -0x0.000000000000280000000000p-1022)))
(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022))
(module (func (export "f") (result f64) (f64.const +0x1.000000000000280000000001p-1022)))
(assert_return (invoke "f") (f64.const +0x1.0000000000003p-1022))
(module (func (export "f") (result f64) (f64.const -0x1.000000000000280000000001p-1022)))
(assert_return (invoke "f") (f64.const -0x1.0000000000003p-1022))

;; f64, round down at limit to infinity
(module (func (export "f") (result f64) (f64.const +0x1.fffffffffffff4p1023)))
(assert_return (invoke "f") (f64.const +0x1.fffffffffffffp1023))
(module (func (export "f") (result f64) (f64.const -0x1.fffffffffffff4p1023)))
(assert_return (invoke "f") (f64.const -0x1.fffffffffffffp1023))
(module (func (export "f") (result f64) (f64.const +0x1.fffffffffffff7ffffffp1023)))
(assert_return (invoke "f") (f64.const +0x1.fffffffffffffp1023))
(module (func (export "f") (result f64) (f64.const -0x1.fffffffffffff7ffffffp1023)))
(assert_return (invoke "f") (f64.const -0x1.fffffffffffffp1023))

(module
  (func $id-f64 (param f64) (result f64) (local.get 0))
  (func (export "type-first-f64") (result f64) (call $id-f64 (f64.const 1.64)))
)
(assert_return (invoke "type-first-f64") (f64.const 1.64))

(module
  (func (export "ceil") (param $x f64) (result f64) (f64.ceil (local.get $x)))
  (func (export "floor") (param $x f64) (result f64) (f64.floor (local.get $x)))
  (func (export "trunc") (param $x f64) (result f64) (f64.trunc (local.get $x)))
  (func (export "nearest") (param $x f64) (result f64) (f64.nearest (local.get $x)))
)

(assert_return (invoke "floor" (f64.const -0x0p+0)) (f64.const -0x0p+0))
(assert_return (invoke "floor" (f64.const 0x0p+0)) (f64.const 0x0p+0))
(assert_return (invoke "floor" (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+0))
(assert_return (invoke "floor" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0))
(assert_return (invoke "floor" (f64.const -0x1p-1022)) (f64.const -0x1p+0))
(assert_return (invoke "floor" (f64.const 0x1p-1022)) (f64.const 0x0p+0))
(assert_return (invoke "floor" (f64.const -0x1p-1)) (f64.const -0x1p+0))
(assert_return (invoke "floor" (f64.const 0x1p-1)) (f64.const 0x0p+0))
(assert_return (invoke "floor" (f64.const -0x1p+0)) (f64.const -0x1p+0))
(assert_return (invoke "floor" (f64.const 0x1p+0)) (f64.const 0x1p+0))
(assert_return (invoke "floor" (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.cp+2))
(assert_return (invoke "floor" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.8p+2))
(assert_return (invoke "floor" (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023))
(assert_return (invoke "floor" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023))
(assert_return (invoke "floor" (f64.const -inf)) (f64.const -inf))
(assert_return (invoke "floor" (f64.const inf)) (f64.const inf))
(assert_return (invoke "floor" (f64.const -nan)) (f64.const nan:canonical))
(assert_return (invoke "floor" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic))
(assert_return (invoke "floor" (f64.const nan)) (f64.const nan:canonical))
(assert_return (invoke "floor" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic))
(assert_return (invoke "ceil" (f64.const -0x0p+0)) (f64.const -0x0p+0))
(assert_return (invoke "ceil" (f64.const 0x0p+0)) (f64.const 0x0p+0))
(assert_return (invoke "ceil" (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0))
(assert_return (invoke "ceil" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+0))
(assert_return (invoke "ceil" (f64.const -0x1p-1022)) (f64.const -0x0p+0))
(assert_return (invoke "ceil" (f64.const 0x1p-1022)) (f64.const 0x1p+0))
(assert_return (invoke "ceil" (f64.const -0x1p-1)) (f64.const -0x0p+0))
(assert_return (invoke "ceil" (f64.const 0x1p-1)) (f64.const 0x1p+0))
(assert_return (invoke "ceil" (f64.const -0x1p+0)) (f64.const -0x1p+0))
(assert_return (invoke "ceil" (f64.const 0x1p+0)) (f64.const 0x1p+0))
(assert_return (invoke "ceil" (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.8p+2))
(assert_return (invoke "ceil" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.cp+2))
(assert_return (invoke "ceil" (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023))
(assert_return (invoke "ceil" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023))
(assert_return (invoke "ceil" (f64.const -inf)) (f64.const -inf))
(assert_return (invoke "ceil" (f64.const inf)) (f64.const inf))
(assert_return (invoke "ceil" (f64.const -nan)) (f64.const nan:canonical))
(assert_return (invoke "ceil" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic))
(assert_return (invoke "ceil" (f64.const nan)) (f64.const nan:canonical))
(assert_return (invoke "ceil" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic))
(assert_return (invoke "trunc" (f64.const -0x0p+0)) (f64.const -0x0p+0))
(assert_return (invoke "trunc" (f64.const 0x0p+0)) (f64.const 0x0p+0))
(assert_return (invoke "trunc" (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0))
(assert_return (invoke "trunc" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0))
(assert_return (invoke "trunc" (f64.const -0x1p-1022)) (f64.const -0x0p+0))
(assert_return (invoke "trunc" (f64.const 0x1p-1022)) (f64.const 0x0p+0))
(assert_return (invoke "trunc" (f64.const -0x1p-1)) (f64.const -0x0p+0))
(assert_return (invoke "trunc" (f64.const 0x1p-1)) (f64.const 0x0p+0))
(assert_return (invoke "trunc" (f64.const -0x1p+0)) (f64.const -0x1p+0))
(assert_return (invoke "trunc" (f64.const 0x1p+0)) (f64.const 0x1p+0))
(assert_return (invoke "trunc" (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.8p+2))
(assert_return (invoke "trunc" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.8p+2))
(assert_return (invoke "trunc" (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023))
(assert_return (invoke "trunc" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023))
(assert_return (invoke "trunc" (f64.const -inf)) (f64.const -inf))
(assert_return (invoke "trunc" (f64.const inf)) (f64.const inf))
(assert_return (invoke "trunc" (f64.const -nan)) (f64.const nan:canonical))
(assert_return (invoke "trunc" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic))
(assert_return (invoke "trunc" (f64.const nan)) (f64.const nan:canonical))
(assert_return (invoke "trunc" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic))
(assert_return (invoke "nearest" (f64.const -0x0p+0)) (f64.const -0x0p+0))
(assert_return (invoke "nearest" (f64.const 0x0p+0)) (f64.const 0x0p+0))
(assert_return (invoke "nearest" (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0))
(assert_return (invoke "nearest" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0))
(assert_return (invoke "nearest" (f64.const -0x1p-1022)) (f64.const -0x0p+0))
(assert_return (invoke "nearest" (f64.const 0x1p-1022)) (f64.const 0x0p+0))
(assert_return (invoke "nearest" (f64.const -0x1p-1)) (f64.const -0x0p+0))
(assert_return (invoke "nearest" (f64.const 0x1p-1)) (f64.const 0x0p+0))
(assert_return (invoke "nearest" (f64.const -0x1p+0)) (f64.const -0x1p+0))
(assert_return (invoke "nearest" (f64.const 0x1p+0)) (f64.const 0x1p+0))
(assert_return (invoke "nearest" (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.8p+2))
(assert_return (invoke "nearest" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.8p+2))
(assert_return (invoke "nearest" (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023))
(assert_return (invoke "nearest" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023))
(assert_return (invoke "nearest" (f64.const -inf)) (f64.const -inf))
(assert_return (invoke "nearest" (f64.const inf)) (f64.const inf))
(assert_return (invoke "nearest" (f64.const -nan)) (f64.const nan:canonical))
(assert_return (invoke "nearest" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic))
(assert_return (invoke "nearest" (f64.const nan)) (f64.const nan:canonical))
(assert_return (invoke "nearest" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic))
