@@ -11,11 +11,33 @@ namespace cmcpp
1111
1212 namespace float_
1313 {
14- int32_t encode_float_as_i32 (float32_t f);
15- int64_t encode_float_as_i64 (float64_t f);
16- float32_t decode_i32_as_float (int32_t i);
17- float64_t decode_i64_as_float (int64_t i);
18- float32_t core_f32_reinterpret_i32 (int32_t i);
14+ inline int32_t encode_float_as_i32 (float32_t f)
15+
16+ {
17+ return *reinterpret_cast <int32_t *>(&f);
18+ }
19+
20+ inline int64_t encode_float_as_i64 (float64_t f)
21+ {
22+ return *reinterpret_cast <int64_t *>(&f);
23+ }
24+
25+ inline float32_t decode_i32_as_float (int32_t i)
26+ {
27+ return *reinterpret_cast <float32_t *>(&i);
28+ }
29+
30+ inline float64_t decode_i64_as_float (int64_t i)
31+ {
32+ return *reinterpret_cast <float64_t *>(&i);
33+ }
34+
35+ inline float32_t core_f32_reinterpret_i32 (int32_t i)
36+ {
37+ float f;
38+ std::memcpy (&f, &i, sizeof f);
39+ return f;
40+ }
1941
2042 template <Float T>
2143 T canonicalize_nan (T f)
@@ -78,11 +100,24 @@ namespace cmcpp
78100 float_::store<T>(cx, v, ptr);
79101 }
80102
103+ template <Float T>
104+ inline WasmValVector lower_flat (CallContext &cx, const T &v)
105+ {
106+ return {float_::lower_flat<T>(v)};
107+ }
108+
81109 template <Float T>
82110 inline T load (const CallContext &cx, uint32_t ptr)
83111 {
84112 return float_::load<T>(cx, ptr);
85113 }
114+
115+ template <Float T>
116+ inline T lift_flat (const CallContext &cx, const CoreValueIter &vi)
117+ {
118+ using WasmValType = WasmValTypeTrait<ValTrait<T>::flat_types[0 ]>::type;
119+ return float_::canonicalize_nan<T>(std::get<WasmValType>(vi.next (ValTrait<T>::flat_types[0 ])));
120+ }
86121}
87122
88123#endif
0 commit comments