Browse Source

Merge `intrinsics.simd_sqrt` with `intrinsics.sqrt`

gingerBill 3 years ago
parent
commit
1f438d4e6c

+ 1 - 2
core/intrinsics/intrinsics.odin

@@ -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_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))) ---
 
@@ -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 ---
 
 // 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_floor   :: proc(a: #simd[N]any_float) -> #simd[N]any_float ---
 simd_trunc   :: proc(a: #simd[N]any_float) -> #simd[N]any_float ---

+ 1 - 1
core/simd/simd.odin

@@ -91,7 +91,7 @@ shuffle :: intrinsics.simd_shuffle
 select :: intrinsics.simd_select
 
 
-sqrt    :: intrinsics.simd_sqrt
+sqrt    :: intrinsics.sqrt
 ceil    :: intrinsics.simd_ceil
 floor   :: intrinsics.simd_floor
 trunc   :: intrinsics.simd_trunc

+ 17 - 4
src/check_builtin.cpp

@@ -894,7 +894,6 @@ bool check_builtin_simd_operation(CheckerContext *c, Operand *operand, Ast *call
 			return true;
 		}
 
-	case BuiltinProc_simd_sqrt:
 	case BuiltinProc_simd_ceil:
 	case BuiltinProc_simd_floor:
 	case BuiltinProc_simd_trunc:
@@ -3661,14 +3660,28 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
 			if (x.mode == Addressing_Invalid) {
 				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)) {
 				gbString xts = type_to_string(x.type);
 				error(x.expr, "Expected a floating point value for '%.*s', got %s", LIT(builtin_name), xts);
 				gb_string_free(xts);
 				return false;
-			}
-
-			if (x.mode == Addressing_Constant) {
+			} else if (x.mode == Addressing_Constant) {
 				f64 v = exact_value_to_f64(x.value);
 
 				operand->mode = Addressing_Constant;

+ 0 - 2
src/checker_builtin_procs.hpp

@@ -166,7 +166,6 @@ BuiltinProc__simd_begin,
 	BuiltinProc_simd_shuffle,
 	BuiltinProc_simd_select,
 
-	BuiltinProc_simd_sqrt,
 	BuiltinProc_simd_ceil,
 	BuiltinProc_simd_floor,
 	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_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_floor"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("simd_trunc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},

+ 0 - 2
src/llvm_backend_proc.cpp

@@ -1315,7 +1315,6 @@ lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAndValue const
 			return res;
 		}
 
-	case BuiltinProc_simd_sqrt:
 	case BuiltinProc_simd_ceil:
 	case BuiltinProc_simd_floor:
 	case BuiltinProc_simd_trunc:
@@ -1323,7 +1322,6 @@ lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAndValue const
 		{
 			char const *name = nullptr;
 			switch (builtin_id) {
-			case BuiltinProc_simd_sqrt:    name = "llvm.sqrt"; break;
 			case BuiltinProc_simd_ceil:    name = "llvm.ceil"; break;
 			case BuiltinProc_simd_floor:   name = "llvm.floor"; break;
 			case BuiltinProc_simd_trunc:   name = "llvm.trunc"; break;