added: reinterpret intrinsics
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 8 Apr 2023 18:06:25 +0000 (13:06 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 8 Apr 2023 18:06:25 +0000 (13:06 -0500)
compiler/include/astnodes.h
compiler/src/builtins.c
compiler/src/wasm_emit.c
core/intrinsics/wasm.onyx
core/random/random.onyx

index 7bf74752b7ebe884dbbe52fbfc5604743ba469a8..db91ff4e3bc3004a4a0f0d73bc63c3b0d915f961 100644 (file)
@@ -391,6 +391,10 @@ typedef enum OnyxIntrinsic {
     ONYX_INTRINSIC_F64_MIN,   ONYX_INTRINSIC_F64_MAX,
     ONYX_INTRINSIC_F64_COPYSIGN,
 
+    ONYX_INTRINSIC_I32_REINTERPRET_F32,
+    ONYX_INTRINSIC_I64_REINTERPRET_F64,
+    ONYX_INTRINSIC_F32_REINTERPRET_I32,
+    ONYX_INTRINSIC_F64_REINTERPRET_I64,
 
 
     ONYX_INTRINSIC_V128_CONST,
index 417240100b20224271174900cae4b600f045efcf..6491f3850e4a3e14c6d38d7af1d6240baef90b1b 100644 (file)
@@ -160,6 +160,11 @@ static IntrinsicMap builtin_intrinsics[] = {
     { "max_f64",      ONYX_INTRINSIC_F64_MAX },
     { "copysign_f64", ONYX_INTRINSIC_F64_COPYSIGN },
 
+    { "reinterpret_f32", ONYX_INTRINSIC_I32_REINTERPRET_F32 },
+    { "reinterpret_f64", ONYX_INTRINSIC_I64_REINTERPRET_F64 },
+    { "reinterpret_i32", ONYX_INTRINSIC_F32_REINTERPRET_I32 },
+    { "reinterpret_i64", ONYX_INTRINSIC_F64_REINTERPRET_I64 },
+
 
     // SIMD Intrinsics
     { "v128_const", ONYX_INTRINSIC_V128_CONST },
index f94c0f923f919991329e4dd4a125349f06d524e0..463e7b7e434950b6b1ebcf96778558c5d441f6c5 100644 (file)
@@ -2337,6 +2337,11 @@ EMIT_FUNC(intrinsic_call, AstCall* call) {
         case ONYX_INTRINSIC_F64_MAX:      WI(call->token, WI_F64_MAX); break;
         case ONYX_INTRINSIC_F64_COPYSIGN: WI(call->token, WI_F64_COPYSIGN); break;
 
+        case ONYX_INTRINSIC_I32_REINTERPRET_F32: WI(call->token, WI_I32_REINTERPRET_F32); break;
+        case ONYX_INTRINSIC_I64_REINTERPRET_F64: WI(call->token, WI_I64_REINTERPRET_F64); break;
+        case ONYX_INTRINSIC_F32_REINTERPRET_I32: WI(call->token, WI_F32_REINTERPRET_I32); break;
+        case ONYX_INTRINSIC_F64_REINTERPRET_I64: WI(call->token, WI_F64_REINTERPRET_I64); break;
+
         case ONYX_INTRINSIC_I8X16_CONST:
         case ONYX_INTRINSIC_V128_CONST:   SIMD_INT_CONST_INTRINSIC(u8, 16);   break;
         case ONYX_INTRINSIC_I16X8_CONST:  SIMD_INT_CONST_INTRINSIC(u16, 8);   break;
index cab1716d041cb52b366417ad3c172d60ca561fd6..596083093b0d630470ac4f85591da56c53aa2f10 100644 (file)
@@ -51,3 +51,8 @@ sqrt_f64     :: (val: f64) -> f64 #intrinsic ---
 min_f64      :: (lhs: f64, rhs: f64) -> f64 #intrinsic ---
 max_f64      :: (lhs: f64, rhs: f64) -> f64 #intrinsic ---
 copysign_f64 :: (lhs: f64, rhs: f64) -> f64 #intrinsic ---
+
+reinterpret_f32 :: (val: f32) -> i32 #intrinsic ---
+reinterpret_f64 :: (val: f64) -> i64 #intrinsic ---
+reinterpret_i32 :: (val: i32) -> f32 #intrinsic ---
+reinterpret_i64 :: (val: i64) -> f64 #intrinsic ---
index 07092cfe7539177cc9efecadd4d58342d60a111c..400df811b5db7e80312035ca021661996c870fdd 100644 (file)
@@ -37,7 +37,7 @@ Random :: struct {
 
     #doc "Generates a random floating point number between `lo` and `hi`."
     float :: (self: &Random, lo := 0.0f, hi := 1.0f) -> f32 {
-        return (cast(f32) (self->int() % (1 << 20)) / cast(f32) (1 << 20)) * (hi - lo) + lo;
+        return (cast(f32) (self->int() % (1 << 23)) / cast(f32) (1 << 23)) * (hi - lo) + lo;
     }
 
     #doc "Returns a random element from a slice."