mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-18 00:41:26 -07:00
Merge intrinsics.simd_sqrt with intrinsics.sqrt
This commit is contained in:
@@ -33,7 +33,7 @@ overflow_add :: proc(lhs, rhs: $T) -> (T, bool) #optional_ok ---
|
|||||||
overflow_sub :: proc(lhs, rhs: $T) -> (T, bool) #optional_ok ---
|
overflow_sub :: proc(lhs, rhs: $T) -> (T, bool) #optional_ok ---
|
||||||
overflow_mul :: proc(lhs, rhs: $T) -> (T, bool) #optional_ok ---
|
overflow_mul :: proc(lhs, rhs: $T) -> (T, bool) #optional_ok ---
|
||||||
|
|
||||||
sqrt :: proc(x: $T) -> T where type_is_float(T) ---
|
sqrt :: proc(x: $T) -> T where type_is_float(T) || (type_is_simd_vector(T) && type_is_float(type_elem_type(T))) ---
|
||||||
|
|
||||||
fused_mul_add :: proc(a, b, c: $T) -> T where type_is_float(T) || (type_is_simd_vector(T) && type_is_float(type_elem_type(T))) ---
|
fused_mul_add :: proc(a, b, c: $T) -> T where type_is_float(T) || (type_is_simd_vector(T) && type_is_float(type_elem_type(T))) ---
|
||||||
|
|
||||||
@@ -247,7 +247,6 @@ simd_shuffle :: proc(a, b: #simd[N]T, indices: ..int) -> #simd[len(indices)]T --
|
|||||||
simd_select :: proc(cond: #simd[N]boolean_or_integer, true, false: #simd[N]T) -> #simd[N]T ---
|
simd_select :: proc(cond: #simd[N]boolean_or_integer, true, false: #simd[N]T) -> #simd[N]T ---
|
||||||
|
|
||||||
// Lane-wise operations
|
// Lane-wise operations
|
||||||
simd_sqrt :: proc(a: #simd[N]any_float) -> #simd[N]any_float --- // IEEE sqrt
|
|
||||||
simd_ceil :: proc(a: #simd[N]any_float) -> #simd[N]any_float ---
|
simd_ceil :: proc(a: #simd[N]any_float) -> #simd[N]any_float ---
|
||||||
simd_floor :: proc(a: #simd[N]any_float) -> #simd[N]any_float ---
|
simd_floor :: proc(a: #simd[N]any_float) -> #simd[N]any_float ---
|
||||||
simd_trunc :: proc(a: #simd[N]any_float) -> #simd[N]any_float ---
|
simd_trunc :: proc(a: #simd[N]any_float) -> #simd[N]any_float ---
|
||||||
|
|||||||
+1
-1
@@ -91,7 +91,7 @@ shuffle :: intrinsics.simd_shuffle
|
|||||||
select :: intrinsics.simd_select
|
select :: intrinsics.simd_select
|
||||||
|
|
||||||
|
|
||||||
sqrt :: intrinsics.simd_sqrt
|
sqrt :: intrinsics.sqrt
|
||||||
ceil :: intrinsics.simd_ceil
|
ceil :: intrinsics.simd_ceil
|
||||||
floor :: intrinsics.simd_floor
|
floor :: intrinsics.simd_floor
|
||||||
trunc :: intrinsics.simd_trunc
|
trunc :: intrinsics.simd_trunc
|
||||||
|
|||||||
+17
-4
@@ -894,7 +894,6 @@ bool check_builtin_simd_operation(CheckerContext *c, Operand *operand, Ast *call
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
case BuiltinProc_simd_sqrt:
|
|
||||||
case BuiltinProc_simd_ceil:
|
case BuiltinProc_simd_ceil:
|
||||||
case BuiltinProc_simd_floor:
|
case BuiltinProc_simd_floor:
|
||||||
case BuiltinProc_simd_trunc:
|
case BuiltinProc_simd_trunc:
|
||||||
@@ -3661,14 +3660,28 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
|
|||||||
if (x.mode == Addressing_Invalid) {
|
if (x.mode == Addressing_Invalid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Type *elem = core_array_type(x.type);
|
||||||
|
if (!is_type_float(x.type) && !(is_type_simd_vector(x.type) && is_type_float(elem))) {
|
||||||
|
gbString xts = type_to_string(x.type);
|
||||||
|
error(x.expr, "Expected a floating point or #simd vector value for '%.*s', got %s", LIT(builtin_name), xts);
|
||||||
|
gb_string_free(xts);
|
||||||
|
return false;
|
||||||
|
} else if (is_type_different_to_arch_endianness(elem)) {
|
||||||
|
GB_ASSERT(elem->kind == Type_Basic);
|
||||||
|
if (elem->Basic.flags & (BasicFlag_EndianLittle|BasicFlag_EndianBig)) {
|
||||||
|
gbString xts = type_to_string(x.type);
|
||||||
|
error(x.expr, "Expected a float which does not specify the explicit endianness for '%.*s', got %s", LIT(builtin_name), xts);
|
||||||
|
gb_string_free(xts);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!is_type_float(x.type)) {
|
if (!is_type_float(x.type)) {
|
||||||
gbString xts = type_to_string(x.type);
|
gbString xts = type_to_string(x.type);
|
||||||
error(x.expr, "Expected a floating point value for '%.*s', got %s", LIT(builtin_name), xts);
|
error(x.expr, "Expected a floating point value for '%.*s', got %s", LIT(builtin_name), xts);
|
||||||
gb_string_free(xts);
|
gb_string_free(xts);
|
||||||
return false;
|
return false;
|
||||||
}
|
} else if (x.mode == Addressing_Constant) {
|
||||||
|
|
||||||
if (x.mode == Addressing_Constant) {
|
|
||||||
f64 v = exact_value_to_f64(x.value);
|
f64 v = exact_value_to_f64(x.value);
|
||||||
|
|
||||||
operand->mode = Addressing_Constant;
|
operand->mode = Addressing_Constant;
|
||||||
|
|||||||
@@ -166,7 +166,6 @@ BuiltinProc__simd_begin,
|
|||||||
BuiltinProc_simd_shuffle,
|
BuiltinProc_simd_shuffle,
|
||||||
BuiltinProc_simd_select,
|
BuiltinProc_simd_select,
|
||||||
|
|
||||||
BuiltinProc_simd_sqrt,
|
|
||||||
BuiltinProc_simd_ceil,
|
BuiltinProc_simd_ceil,
|
||||||
BuiltinProc_simd_floor,
|
BuiltinProc_simd_floor,
|
||||||
BuiltinProc_simd_trunc,
|
BuiltinProc_simd_trunc,
|
||||||
@@ -451,7 +450,6 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
|
|||||||
{STR_LIT("simd_shuffle"), 2, true, Expr_Expr, BuiltinProcPkg_intrinsics},
|
{STR_LIT("simd_shuffle"), 2, true, Expr_Expr, BuiltinProcPkg_intrinsics},
|
||||||
{STR_LIT("simd_select"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
{STR_LIT("simd_select"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
||||||
|
|
||||||
{STR_LIT("simd_sqrt") , 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
|
||||||
{STR_LIT("simd_ceil") , 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
{STR_LIT("simd_ceil") , 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
||||||
{STR_LIT("simd_floor"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
{STR_LIT("simd_floor"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
||||||
{STR_LIT("simd_trunc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
{STR_LIT("simd_trunc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
|
||||||
|
|||||||
@@ -1315,7 +1315,6 @@ lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAndValue const
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
case BuiltinProc_simd_sqrt:
|
|
||||||
case BuiltinProc_simd_ceil:
|
case BuiltinProc_simd_ceil:
|
||||||
case BuiltinProc_simd_floor:
|
case BuiltinProc_simd_floor:
|
||||||
case BuiltinProc_simd_trunc:
|
case BuiltinProc_simd_trunc:
|
||||||
@@ -1323,7 +1322,6 @@ lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAndValue const
|
|||||||
{
|
{
|
||||||
char const *name = nullptr;
|
char const *name = nullptr;
|
||||||
switch (builtin_id) {
|
switch (builtin_id) {
|
||||||
case BuiltinProc_simd_sqrt: name = "llvm.sqrt"; break;
|
|
||||||
case BuiltinProc_simd_ceil: name = "llvm.ceil"; break;
|
case BuiltinProc_simd_ceil: name = "llvm.ceil"; break;
|
||||||
case BuiltinProc_simd_floor: name = "llvm.floor"; break;
|
case BuiltinProc_simd_floor: name = "llvm.floor"; break;
|
||||||
case BuiltinProc_simd_trunc: name = "llvm.trunc"; break;
|
case BuiltinProc_simd_trunc: name = "llvm.trunc"; break;
|
||||||
|
|||||||
Reference in New Issue
Block a user