package core.allocator
#include_file "core/memory"
-#include_file "core/intrinsics"
+#include_file "core/intrinsics/wasm"
-use package core { memory_size, memory_grow }
+use package core.intrinsics.wasm { memory_size, memory_grow }
use package core.memory as memory
heap_allocator : Allocator;
+++ /dev/null
-package core
-
-memory_size :: proc () -> i32 #intrinsic ---
-memory_grow :: proc (val: i32) -> i32 #intrinsic ---
-
-clz_i32 :: proc (val: i32) -> i32 #intrinsic ---
-ctz_i32 :: proc (val: i32) -> i32 #intrinsic ---
-popcnt_i32 :: proc (val: i32) -> i32 #intrinsic ---
-and_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
-or_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
-xor_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
-shl_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
-slr_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
-sar_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
-rotl_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
-rotr_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
-
-clz_i64 :: proc (val: i64) -> i64 #intrinsic ---
-ctz_i64 :: proc (val: i64) -> i64 #intrinsic ---
-popcnt_i64 :: proc (val: i64) -> i64 #intrinsic ---
-and_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
-or_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
-xor_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
-shl_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
-slr_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
-sar_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
-rotl_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
-rotr_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
-
-abs_f32 :: proc (val: f32) -> f32 #intrinsic ---
-ceil_f32 :: proc (val: f32) -> f32 #intrinsic ---
-floor_f32 :: proc (val: f32) -> f32 #intrinsic ---
-trunc_f32 :: proc (val: f32) -> f32 #intrinsic ---
-nearest_f32 :: proc (val: f32) -> f32 #intrinsic ---
-sqrt_f32 :: proc (val: f32) -> f32 #intrinsic ---
-min_f32 :: proc (lhs: f32, rhs: f32) -> f32 #intrinsic ---
-max_f32 :: proc (lhs: f32, rhs: f32) -> f32 #intrinsic ---
-copysign_f32 :: proc (lhs: f32, rhs: f32) -> f32 #intrinsic ---
-
-abs_f64 :: proc (val: f64) -> f64 #intrinsic ---
-ceil_f64 :: proc (val: f64) -> f64 #intrinsic ---
-floor_f64 :: proc (val: f64) -> f64 #intrinsic ---
-trunc_f64 :: proc (val: f64) -> f64 #intrinsic ---
-nearest_f64 :: proc (val: f64) -> f64 #intrinsic ---
-sqrt_f64 :: proc (val: f64) -> f64 #intrinsic ---
-min_f64 :: proc (lhs: f64, rhs: f64) -> f64 #intrinsic ---
-max_f64 :: proc (lhs: f64, rhs: f64) -> f64 #intrinsic ---
-copysign_f64 :: proc (lhs: f64, rhs: f64) -> f64 #intrinsic ---
--- /dev/null
+package core.intrinsics.simd
+
+// NOTE: These u8 values must be compile time known values.
+v128_const :: proc (b1: u8, b2: u8, b3: u8, b4: u8,
+ b5: u8, b6: u8, b7: u8, b8: u8,
+ b9: u8, b10: u8, b11: u8, b12: u8,
+ b13: u8, b14: u8, b15: u8, b16: u8) -> v128 #intrinsic ---
+
+i8x16_const :: proc (b1: i8, b2: i8, b3: i8, b4: i8,
+ b5: i8, b6: i8, b7: i8, b8: i8,
+ b9: i8, b10: i8, b11: i8, b12: i8,
+ b13: i8, b14: i8, b15: i8, b16: i8) -> i8x16 #intrinsic ---
+i16x8_const :: proc (b1: i16, b2: i16, b3: i16, b4: i16,
+ b5: i16, b6: i16, b7: i16, b8: i16) -> i16x8 #intrinsic ---
+i32x4_const :: proc (b1: i32, b2: i32, b3: i32, b4: i32) -> i32x4 #intrinsic ---
+i64x2_const :: proc (b1: i64, b2: i64) -> i64x2 #intrinsic ---
+f32x4_const :: proc (b1: f32, b2: f32, b3: f32, b4: f32) -> f32x4 #intrinsic ---
+f64x2_const :: proc (b1: f64, b2: f64) -> f64x2 #intrinsic ---
+
+// NOTE: These u8 values must be compile time known values.
+i8x16_shuffle :: proc (a: v128, b: v128,
+ b1: u8, b2: u8, b3: u8, b4: u8,
+ b5: u8, b6: u8, b7: u8, b8: u8,
+ b9: u8, b10: u8, b11: u8, b12: u8,
+ b13: u8, b14: u8, b15: u8, b16: u8) -> v128 #intrinsic ---
+
+i8x16_extract_lane_s :: proc (v: i8x16, l: u32) -> i8 #intrinsic ---
+i8x16_extract_lane_u :: proc (v: i8x16, l: u32) -> u8 #intrinsic ---
+i8x16_replace_lane :: proc (v: i8x16, l: u32, val: i8) -> i8x16 #intrinsic ---
+i16x8_extract_lane_s :: proc (v: i16x8, l: u32) -> i16 #intrinsic ---
+i16x8_extract_lane_u :: proc (v: i16x8, l: u32) -> u16 #intrinsic ---
+i16x8_replace_lane :: proc (v: i16x8, l: u32, val: i16) -> i16x8 #intrinsic ---
+i32x4_extract_lane :: proc (v: i32x4, l: u32) -> i32 #intrinsic ---
+i32x4_replace_lane :: proc (v: i32x4, l: u32, val: i32) -> i32x4 #intrinsic ---
+i64x2_extract_lane :: proc (v: i64x2, l: u32) -> i64 #intrinsic ---
+i64x2_replace_lane :: proc (v: i64x2, l: u32, val: i64) -> i64x2 #intrinsic ---
+f32x4_extract_lane :: proc (v: f32x4, l: u32) -> f32 #intrinsic ---
+f32x4_replace_lane :: proc (v: f32x4, l: u32, val: f32) -> f32x4 #intrinsic ---
+f64x2_extract_lane :: proc (v: f64x2, l: u32) -> f64 #intrinsic ---
+f64x2_replace_lane :: proc (v: f64x2, l: u32, val: f64) -> f64x2 #intrinsic ---
+
+i8x16_swizzle :: proc (v: v128, s: v128) -> v128 #intrinsic ---
+i8x16_splat :: proc (val: i8) -> i8x16 #intrinsic ---
+i16x8_splat :: proc (val: i16) -> i16x8 #intrinsic ---
+i32x4_splat :: proc (val: i32) -> i32x4 #intrinsic ---
+i64x2_splat :: proc (val: i64) -> i64x2 #intrinsic ---
+f32x4_splat :: proc (val: f32) -> f32x4 #intrinsic ---
+f64x2_splat :: proc (val: f64) -> f64x2 #intrinsic ---
+
+i8x16_eq :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_neq :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_lt_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_lt_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_gt_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_gt_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_le_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_le_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_ge_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_ge_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+
+i16x8_eq :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_neq :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_lt_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_lt_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_gt_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_gt_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_le_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_le_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_ge_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_ge_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+
+i32x4_eq :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_neq :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_lt_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_lt_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_gt_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_gt_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_le_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_le_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_ge_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_ge_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+
+f32x4_eq :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
+f32x4_neq :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
+f32x4_lt :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
+f32x4_gt :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
+f32x4_le :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
+f32x4_ge :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
+
+f64x2_eq :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_neq :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_lt :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_gt :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_le :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_ge :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+
+v128_not :: proc (v: v128) -> v128 #intrinsic ---
+v128_and :: proc (a: v128, b: v128) -> v128 #intrinsic ---
+v128_andnot :: proc (a: v128, b: v128) -> v128 #intrinsic ---
+v128_or :: proc (a: v128, b: v128) -> v128 #intrinsic ---
+v128_xor :: proc (a: v128, b: v128) -> v128 #intrinsic ---
+v128_bitselect :: proc (a: v128, b: v128, c: v128) -> v128 #intrinsic ---
+
+i8x16_abs :: proc (a: i8x16) -> i8x16 #intrinsic ---
+i8x16_neg :: proc (a: i8x16) -> i8x16 #intrinsic ---
+i8x16_any_true :: proc (a: i8x16) -> bool #intrinsic ---
+i8x16_all_true :: proc (a: i8x16) -> bool #intrinsic ---
+i8x16_bitmask :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_narrow_i16x8_s :: proc (a: i16x8) -> i8x16 #intrinsic ---
+i8x16_narrow_i16x8_u :: proc (a: i16x8) -> i8x16 #intrinsic ---
+i8x16_shl :: proc (a: i8x16, s: i32) -> i8x16 #intrinsic ---
+i8x16_shr_s :: proc (a: i8x16, s: i32) -> i8x16 #intrinsic ---
+i8x16_shr_u :: proc (a: i8x16, s: i32) -> i8x16 #intrinsic ---
+i8x16_add :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_add_sat_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_add_sat_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_sub :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_sub_sat_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_sub_sat_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_min_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_min_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_max_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_max_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
+i8x16_avgr_u :: proc (a: i8x16) -> i8x16 #intrinsic ---
+
+i16x8_abs :: proc (a: i16x8) -> i16x8 #intrinsic ---
+i16x8_neg :: proc (a: i16x8) -> i16x8 #intrinsic ---
+i16x8_any_true :: proc (a: i16x8) -> bool #intrinsic ---
+i16x8_all_true :: proc (a: i16x8) -> bool #intrinsic ---
+i16x8_bitmask :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_narrow_i32x4_s :: proc (a: i32x4) -> i16x8 #intrinsic ---
+i16x8_narrow_i32x4_u :: proc (a: i32x4) -> i16x8 #intrinsic ---
+i16x8_widen_low_i8x16_s :: proc (a: i8x16) -> i16x8 #intrinsic ---
+i16x8_widen_high_i8x16_s :: proc (a: i8x16) -> i16x8 #intrinsic ---
+i16x8_widen_low_i8x16_u :: proc (a: i8x16) -> i16x8 #intrinsic ---
+i16x8_widen_high_i8x16_u :: proc (a: i8x16) -> i16x8 #intrinsic ---
+i16x8_shl :: proc (a: i16x8, s: i32) -> i16x8 #intrinsic ---
+i16x8_shr_s :: proc (a: i16x8, s: i32) -> i16x8 #intrinsic ---
+i16x8_shr_u :: proc (a: i16x8, s: i32) -> i16x8 #intrinsic ---
+i16x8_add :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_add_sat_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_add_sat_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_sub :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_sub_sat_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_sub_sat_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_mul :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_min_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_min_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_max_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_max_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
+i16x8_avgr_u :: proc (a: i16x8) -> i16x8 #intrinsic ---
+
+i32x4_abs :: proc (a: i32x4) -> i32x4 #intrinsic ---
+i32x4_neg :: proc (a: i32x4) -> i32x4 #intrinsic ---
+i32x4_any_true :: proc (a: i32x4) -> bool #intrinsic ---
+i32x4_all_true :: proc (a: i32x4) -> bool #intrinsic ---
+i32x4_bitmask :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_widen_low_i16x8_s :: proc (a: i16x8) -> i32x4 #intrinsic ---
+i32x4_widen_high_i16x8_s :: proc (a: i16x8) -> i32x4 #intrinsic ---
+i32x4_widen_low_i16x8_u :: proc (a: i16x8) -> i32x4 #intrinsic ---
+i32x4_widen_high_i16x8_u :: proc (a: i16x8) -> i32x4 #intrinsic ---
+i32x4_shl :: proc (a: i32x4, s: i32) -> i32x4 #intrinsic ---
+i32x4_shr_s :: proc (a: i32x4, s: i32) -> i32x4 #intrinsic ---
+i32x4_shl_u :: proc (a: i32x4, s: i32) -> i32x4 #intrinsic ---
+i32x4_add :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_sub :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_mul :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_min_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_min_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_max_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+i32x4_max_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
+
+i64x2_neg :: proc (a: i64x2) -> i64x2 #intrinsic ---
+i64x2_shl :: proc (a: i64x2, s: i32) -> i64x2 #intrinsic ---
+i64x2_shr_s :: proc (a: i64x2, s: i32) -> i64x2 #intrinsic ---
+i64x2_shr_u :: proc (a: i64x2, s: i32) -> i64x2 #intrinsic ---
+i64x2_add :: proc (a: i64x2, b: i64x2) -> i64x2 #intrinsic ---
+i64x2_sub :: proc (a: i64x2, b: i64x2) -> i64x2 #intrinsic ---
+i64x2_mul :: proc (a: i64x2, b: i64x2) -> i64x2 #intrinsic ---
+
+f32x4_abs :: proc (a: f32x4) -> f32x4 #intrinsic ---
+f32x4_neg :: proc (a: f32x4) -> f32x4 #intrinsic ---
+f32x4_sqrt :: proc (a: f32x4) -> f32x4 #intrinsic ---
+f32x4_add :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
+f32x4_sub :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
+f32x4_mul :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
+f32x4_div :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
+f32x4_min :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
+f32x4_max :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
+
+f64x2_abs :: proc (a: f64x2) -> f64x2 #intrinsic ---
+f64x2_neg :: proc (a: f64x2) -> f64x2 #intrinsic ---
+f64x2_sqrt :: proc (a: f64x2) -> f64x2 #intrinsic ---
+f64x2_add :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_sub :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_mul :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_div :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_min :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+f64x2_max :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
+
+// NOTE: These may be backwards
+i32x4_trunc_sat_f32x4_s :: proc (v: f32x4) -> i32x4 #intrinsic ---
+i32x4_trunc_sat_f32x4_u :: proc (v: f32x4) -> i32x4 #intrinsic ---
+f32x4_convert_i32x4_s :: proc (v: i32x4) -> f32x4 #intrinsic ---
+f32x4_convert_i32x4_u :: proc (v: i32x4) -> f32x4 #intrinsic ---
--- /dev/null
+package core.intrinsics.wasm
+
+memory_size :: proc () -> i32 #intrinsic ---
+memory_grow :: proc (val: i32) -> i32 #intrinsic ---
+
+clz_i32 :: proc (val: i32) -> i32 #intrinsic ---
+ctz_i32 :: proc (val: i32) -> i32 #intrinsic ---
+popcnt_i32 :: proc (val: i32) -> i32 #intrinsic ---
+and_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
+or_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
+xor_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
+shl_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
+slr_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
+sar_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
+rotl_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
+rotr_i32 :: proc (lhs: i32, rhs: i32) -> i32 #intrinsic ---
+
+clz_i64 :: proc (val: i64) -> i64 #intrinsic ---
+ctz_i64 :: proc (val: i64) -> i64 #intrinsic ---
+popcnt_i64 :: proc (val: i64) -> i64 #intrinsic ---
+and_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
+or_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
+xor_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
+shl_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
+slr_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
+sar_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
+rotl_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
+rotr_i64 :: proc (lhs: i64, rhs: i64) -> i64 #intrinsic ---
+
+abs_f32 :: proc (val: f32) -> f32 #intrinsic ---
+ceil_f32 :: proc (val: f32) -> f32 #intrinsic ---
+floor_f32 :: proc (val: f32) -> f32 #intrinsic ---
+trunc_f32 :: proc (val: f32) -> f32 #intrinsic ---
+nearest_f32 :: proc (val: f32) -> f32 #intrinsic ---
+sqrt_f32 :: proc (val: f32) -> f32 #intrinsic ---
+min_f32 :: proc (lhs: f32, rhs: f32) -> f32 #intrinsic ---
+max_f32 :: proc (lhs: f32, rhs: f32) -> f32 #intrinsic ---
+copysign_f32 :: proc (lhs: f32, rhs: f32) -> f32 #intrinsic ---
+
+abs_f64 :: proc (val: f64) -> f64 #intrinsic ---
+ceil_f64 :: proc (val: f64) -> f64 #intrinsic ---
+floor_f64 :: proc (val: f64) -> f64 #intrinsic ---
+trunc_f64 :: proc (val: f64) -> f64 #intrinsic ---
+nearest_f64 :: proc (val: f64) -> f64 #intrinsic ---
+sqrt_f64 :: proc (val: f64) -> f64 #intrinsic ---
+min_f64 :: proc (lhs: f64, rhs: f64) -> f64 #intrinsic ---
+max_f64 :: proc (lhs: f64, rhs: f64) -> f64 #intrinsic ---
+copysign_f64 :: proc (lhs: f64, rhs: f64) -> f64 #intrinsic ---
package core.math
-use package core {
+use package core.intrinsics.wasm {
sqrt_f32, sqrt_f64,
abs_f32, abs_f64
}
+++ /dev/null
-package simd
-
-// NOTE: These u8 values must be compile time known values.
-v128_const :: proc (b1: u8, b2: u8, b3: u8, b4: u8,
- b5: u8, b6: u8, b7: u8, b8: u8,
- b9: u8, b10: u8, b11: u8, b12: u8,
- b13: u8, b14: u8, b15: u8, b16: u8) -> v128 #intrinsic ---
-
-i8x16_const :: proc (b1: i8, b2: i8, b3: i8, b4: i8,
- b5: i8, b6: i8, b7: i8, b8: i8,
- b9: i8, b10: i8, b11: i8, b12: i8,
- b13: i8, b14: i8, b15: i8, b16: i8) -> i8x16 #intrinsic ---
-i16x8_const :: proc (b1: i16, b2: i16, b3: i16, b4: i16,
- b5: i16, b6: i16, b7: i16, b8: i16) -> i16x8 #intrinsic ---
-i32x4_const :: proc (b1: i32, b2: i32, b3: i32, b4: i32) -> i32x4 #intrinsic ---
-i64x2_const :: proc (b1: i64, b2: i64) -> i64x2 #intrinsic ---
-f32x4_const :: proc (b1: f32, b2: f32, b3: f32, b4: f32) -> f32x4 #intrinsic ---
-f64x2_const :: proc (b1: f64, b2: f64) -> f64x2 #intrinsic ---
-
-// NOTE: These u8 values must be compile time known values.
-i8x16_shuffle :: proc (a: v128, b: v128,
- b1: u8, b2: u8, b3: u8, b4: u8,
- b5: u8, b6: u8, b7: u8, b8: u8,
- b9: u8, b10: u8, b11: u8, b12: u8,
- b13: u8, b14: u8, b15: u8, b16: u8) -> v128 #intrinsic ---
-
-i8x16_extract_lane_s :: proc (v: i8x16, l: u32) -> i8 #intrinsic ---
-i8x16_extract_lane_u :: proc (v: i8x16, l: u32) -> u8 #intrinsic ---
-i8x16_replace_lane :: proc (v: i8x16, l: u32, val: i8) -> i8x16 #intrinsic ---
-i16x8_extract_lane_s :: proc (v: i16x8, l: u32) -> i16 #intrinsic ---
-i16x8_extract_lane_u :: proc (v: i16x8, l: u32) -> u16 #intrinsic ---
-i16x8_replace_lane :: proc (v: i16x8, l: u32, val: i16) -> i16x8 #intrinsic ---
-i32x4_extract_lane :: proc (v: i32x4, l: u32) -> i32 #intrinsic ---
-i32x4_replace_lane :: proc (v: i32x4, l: u32, val: i32) -> i32x4 #intrinsic ---
-i64x2_extract_lane :: proc (v: i64x2, l: u32) -> i64 #intrinsic ---
-i64x2_replace_lane :: proc (v: i64x2, l: u32, val: i64) -> i64x2 #intrinsic ---
-f32x4_extract_lane :: proc (v: f32x4, l: u32) -> f32 #intrinsic ---
-f32x4_replace_lane :: proc (v: f32x4, l: u32, val: f32) -> f32x4 #intrinsic ---
-f64x2_extract_lane :: proc (v: f64x2, l: u32) -> f64 #intrinsic ---
-f64x2_replace_lane :: proc (v: f64x2, l: u32, val: f64) -> f64x2 #intrinsic ---
-
-i8x16_swizzle :: proc (v: v128, s: v128) -> v128 #intrinsic ---
-i8x16_splat :: proc (val: i8) -> i8x16 #intrinsic ---
-i16x8_splat :: proc (val: i16) -> i16x8 #intrinsic ---
-i32x4_splat :: proc (val: i32) -> i32x4 #intrinsic ---
-i64x2_splat :: proc (val: i64) -> i64x2 #intrinsic ---
-f32x4_splat :: proc (val: f32) -> f32x4 #intrinsic ---
-f64x2_splat :: proc (val: f64) -> f64x2 #intrinsic ---
-
-i8x16_eq :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_neq :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_lt_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_lt_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_gt_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_gt_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_le_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_le_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_ge_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_ge_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-
-i16x8_eq :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_neq :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_lt_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_lt_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_gt_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_gt_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_le_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_le_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_ge_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_ge_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-
-i32x4_eq :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_neq :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_lt_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_lt_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_gt_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_gt_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_le_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_le_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_ge_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_ge_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-
-f32x4_eq :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
-f32x4_neq :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
-f32x4_lt :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
-f32x4_gt :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
-f32x4_le :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
-f32x4_ge :: proc (a: f32x4, b: f32x4) -> i32x4 #intrinsic ---
-
-f64x2_eq :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_neq :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_lt :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_gt :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_le :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_ge :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-
-v128_not :: proc (v: v128) -> v128 #intrinsic ---
-v128_and :: proc (a: v128, b: v128) -> v128 #intrinsic ---
-v128_andnot :: proc (a: v128, b: v128) -> v128 #intrinsic ---
-v128_or :: proc (a: v128, b: v128) -> v128 #intrinsic ---
-v128_xor :: proc (a: v128, b: v128) -> v128 #intrinsic ---
-v128_bitselect :: proc (a: v128, b: v128, c: v128) -> v128 #intrinsic ---
-
-i8x16_abs :: proc (a: i8x16) -> i8x16 #intrinsic ---
-i8x16_neg :: proc (a: i8x16) -> i8x16 #intrinsic ---
-i8x16_any_true :: proc (a: i8x16) -> bool #intrinsic ---
-i8x16_all_true :: proc (a: i8x16) -> bool #intrinsic ---
-i8x16_bitmask :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_narrow_i16x8_s :: proc (a: i16x8) -> i8x16 #intrinsic ---
-i8x16_narrow_i16x8_u :: proc (a: i16x8) -> i8x16 #intrinsic ---
-i8x16_shl :: proc (a: i8x16, s: i32) -> i8x16 #intrinsic ---
-i8x16_shr_s :: proc (a: i8x16, s: i32) -> i8x16 #intrinsic ---
-i8x16_shr_u :: proc (a: i8x16, s: i32) -> i8x16 #intrinsic ---
-i8x16_add :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_add_sat_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_add_sat_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_sub :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_sub_sat_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_sub_sat_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_min_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_min_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_max_s :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_max_u :: proc (a: i8x16, b: i8x16) -> i8x16 #intrinsic ---
-i8x16_avgr_u :: proc (a: i8x16) -> i8x16 #intrinsic ---
-
-i16x8_abs :: proc (a: i16x8) -> i16x8 #intrinsic ---
-i16x8_neg :: proc (a: i16x8) -> i16x8 #intrinsic ---
-i16x8_any_true :: proc (a: i16x8) -> bool #intrinsic ---
-i16x8_all_true :: proc (a: i16x8) -> bool #intrinsic ---
-i16x8_bitmask :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_narrow_i32x4_s :: proc (a: i32x4) -> i16x8 #intrinsic ---
-i16x8_narrow_i32x4_u :: proc (a: i32x4) -> i16x8 #intrinsic ---
-i16x8_widen_low_i8x16_s :: proc (a: i8x16) -> i16x8 #intrinsic ---
-i16x8_widen_high_i8x16_s :: proc (a: i8x16) -> i16x8 #intrinsic ---
-i16x8_widen_low_i8x16_u :: proc (a: i8x16) -> i16x8 #intrinsic ---
-i16x8_widen_high_i8x16_u :: proc (a: i8x16) -> i16x8 #intrinsic ---
-i16x8_shl :: proc (a: i16x8, s: i32) -> i16x8 #intrinsic ---
-i16x8_shr_s :: proc (a: i16x8, s: i32) -> i16x8 #intrinsic ---
-i16x8_shr_u :: proc (a: i16x8, s: i32) -> i16x8 #intrinsic ---
-i16x8_add :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_add_sat_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_add_sat_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_sub :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_sub_sat_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_sub_sat_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_mul :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_min_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_min_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_max_s :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_max_u :: proc (a: i16x8, b: i16x8) -> i16x8 #intrinsic ---
-i16x8_avgr_u :: proc (a: i16x8) -> i16x8 #intrinsic ---
-
-i32x4_abs :: proc (a: i32x4) -> i32x4 #intrinsic ---
-i32x4_neg :: proc (a: i32x4) -> i32x4 #intrinsic ---
-i32x4_any_true :: proc (a: i32x4) -> bool #intrinsic ---
-i32x4_all_true :: proc (a: i32x4) -> bool #intrinsic ---
-i32x4_bitmask :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_widen_low_i16x8_s :: proc (a: i16x8) -> i32x4 #intrinsic ---
-i32x4_widen_high_i16x8_s :: proc (a: i16x8) -> i32x4 #intrinsic ---
-i32x4_widen_low_i16x8_u :: proc (a: i16x8) -> i32x4 #intrinsic ---
-i32x4_widen_high_i16x8_u :: proc (a: i16x8) -> i32x4 #intrinsic ---
-i32x4_shl :: proc (a: i32x4, s: i32) -> i32x4 #intrinsic ---
-i32x4_shr_s :: proc (a: i32x4, s: i32) -> i32x4 #intrinsic ---
-i32x4_shl_u :: proc (a: i32x4, s: i32) -> i32x4 #intrinsic ---
-i32x4_add :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_sub :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_mul :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_min_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_min_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_max_s :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-i32x4_max_u :: proc (a: i32x4, b: i32x4) -> i32x4 #intrinsic ---
-
-i64x2_neg :: proc (a: i64x2) -> i64x2 #intrinsic ---
-i64x2_shl :: proc (a: i64x2, s: i32) -> i64x2 #intrinsic ---
-i64x2_shr_s :: proc (a: i64x2, s: i32) -> i64x2 #intrinsic ---
-i64x2_shr_u :: proc (a: i64x2, s: i32) -> i64x2 #intrinsic ---
-i64x2_add :: proc (a: i64x2, b: i64x2) -> i64x2 #intrinsic ---
-i64x2_sub :: proc (a: i64x2, b: i64x2) -> i64x2 #intrinsic ---
-i64x2_mul :: proc (a: i64x2, b: i64x2) -> i64x2 #intrinsic ---
-
-f32x4_abs :: proc (a: f32x4) -> f32x4 #intrinsic ---
-f32x4_neg :: proc (a: f32x4) -> f32x4 #intrinsic ---
-f32x4_sqrt :: proc (a: f32x4) -> f32x4 #intrinsic ---
-f32x4_add :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
-f32x4_sub :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
-f32x4_mul :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
-f32x4_div :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
-f32x4_min :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
-f32x4_max :: proc (a: f32x4, b: f32x4) -> f32x4 #intrinsic ---
-
-f64x2_abs :: proc (a: f64x2) -> f64x2 #intrinsic ---
-f64x2_neg :: proc (a: f64x2) -> f64x2 #intrinsic ---
-f64x2_sqrt :: proc (a: f64x2) -> f64x2 #intrinsic ---
-f64x2_add :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_sub :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_mul :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_div :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_min :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-f64x2_max :: proc (a: f64x2, b: f64x2) -> f64x2 #intrinsic ---
-
-// NOTE: These may be backwards
-i32x4_trunc_sat_f32x4_s :: proc (v: f32x4) -> i32x4 #intrinsic ---
-i32x4_trunc_sat_f32x4_u :: proc (v: f32x4) -> i32x4 #intrinsic ---
-f32x4_convert_i32x4_s :: proc (v: i32x4) -> f32x4 #intrinsic ---
-f32x4_convert_i32x4_u :: proc (v: i32x4) -> f32x4 #intrinsic ---
#include_file "core/alloc"
#include_file "core/array"
#include_file "core/conv"
-#include_file "core/intrinsics"
+#include_file "core/intrinsics/wasm"
#include_file "core/map"
#include_file "core/math"
#include_file "core/memory"
#include_file "core/array"
#include_file "core/conv"
#include_file "core/file"
-#include_file "core/intrinsics"
+#include_file "core/intrinsics/wasm"
#include_file "core/map"
#include_file "core/math"
#include_file "core/memory"
package core
+// Currently, these symbols are dumped in the 'core' namespace, which means
+// most programs that just 'use package core' can access all of them, which
+// is convenient; However, it doesn't hurt to wonder if they should be the
+// 'core.io' package so these would become like 'io.printf(...)'. Of course,
+// you could always still do 'use package core.io', which would bring these
+// in anyway.
+
// It is expected that a file will be included that will be part
// of the system package
package main
#include_file "core/std/wasi"
-#include_file "core/simd_intrinsics"
+#include_file "core/intrinsics/simd"
use package core
-use package simd
+use package core.intrinsics.simd
main :: proc (args: [] cstr) {
x := f32x4_const(10.0f, 20.0f, 30.0f, 40.0f);
sdata[1] = sl->length;
break;
}
+
case Ast_Kind_NumLit: {
+ // NOTE: This makes a big assumption that we are running on a
+ // little endian machine, since WebAssembly is little endian
+ // by specification. This is probably a safe assumption, but
+ // should probably be fixed at some point.
+ // - brendanfh 2020/12/15
+
switch (node->type->Basic.kind) {
case Basic_Kind_Bool:
case Basic_Kind_I8:
case Basic_Kind_U8:
+ *((i8 *) data) = (i8) ((AstNumLit *) node)->value.i;
+ return;
+
case Basic_Kind_I16:
case Basic_Kind_U16:
+ *((i16 *) data) = (i16) ((AstNumLit *) node)->value.i;
+ return;
+
case Basic_Kind_I32:
case Basic_Kind_U32:
case Basic_Kind_Rawptr: