From: Brendan Hansen Date: Wed, 16 Dec 2020 02:27:59 +0000 (-0600) Subject: moved intrinsics files to own folder; X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=bdea2cbfb792d1ffe125c790106b956828751fc1;p=onyx.git moved intrinsics files to own folder; --- diff --git a/core/alloc.onyx b/core/alloc.onyx index c8574c23..53321a34 100644 --- a/core/alloc.onyx +++ b/core/alloc.onyx @@ -1,9 +1,9 @@ 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; diff --git a/core/intrinsics.onyx b/core/intrinsics.onyx deleted file mode 100644 index 6aee93e9..00000000 --- a/core/intrinsics.onyx +++ /dev/null @@ -1,48 +0,0 @@ -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 --- diff --git a/core/intrinsics/simd_intrinsics.onyx b/core/intrinsics/simd_intrinsics.onyx new file mode 100644 index 00000000..1e5033bd --- /dev/null +++ b/core/intrinsics/simd_intrinsics.onyx @@ -0,0 +1,205 @@ +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 --- diff --git a/core/intrinsics/wasm.onyx b/core/intrinsics/wasm.onyx new file mode 100644 index 00000000..9aafb617 --- /dev/null +++ b/core/intrinsics/wasm.onyx @@ -0,0 +1,48 @@ +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 --- diff --git a/core/math.onyx b/core/math.onyx index b0bf248b..f2999bc3 100644 --- a/core/math.onyx +++ b/core/math.onyx @@ -1,6 +1,6 @@ package core.math -use package core { +use package core.intrinsics.wasm { sqrt_f32, sqrt_f64, abs_f32, abs_f64 } diff --git a/core/simd_intrinsics.onyx b/core/simd_intrinsics.onyx deleted file mode 100644 index bbd88a76..00000000 --- a/core/simd_intrinsics.onyx +++ /dev/null @@ -1,205 +0,0 @@ -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 --- diff --git a/core/std/js.onyx b/core/std/js.onyx index 459ea86b..dfde7615 100644 --- a/core/std/js.onyx +++ b/core/std/js.onyx @@ -5,7 +5,7 @@ package core #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" diff --git a/core/std/wasi.onyx b/core/std/wasi.onyx index 2a19f1d9..7d8e73a9 100644 --- a/core/std/wasi.onyx +++ b/core/std/wasi.onyx @@ -6,7 +6,7 @@ package core #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" diff --git a/core/stdio.onyx b/core/stdio.onyx index c48ffb2f..8ebd94ca 100644 --- a/core/stdio.onyx +++ b/core/stdio.onyx @@ -1,4 +1,11 @@ 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 diff --git a/onyx b/onyx index 07ed65dd..51cdf8ea 100755 Binary files a/onyx and b/onyx differ diff --git a/progs/simd_test.onyx b/progs/simd_test.onyx index 02f59567..e4d31604 100644 --- a/progs/simd_test.onyx +++ b/progs/simd_test.onyx @@ -1,10 +1,10 @@ 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); diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 26f14bd5..9b9b35c5 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -2920,13 +2920,26 @@ static void emit_raw_data(OnyxWasmModule* mod, ptr data, AstTyped* node) { 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: