Browse Source

Remove `simd_rem`; Disallow `simd_div` for integers

gingerBill 3 years ago
parent
commit
bb7f291f5f
4 changed files with 15 additions and 6 deletions
  1. 1 2
      core/intrinsics/intrinsics.odin
  2. 1 2
      core/simd/simd.odin
  3. 7 2
      src/check_builtin.cpp
  4. 6 0
      src/check_expr.cpp

+ 1 - 2
core/intrinsics/intrinsics.odin

@@ -194,8 +194,7 @@ constant_utf16_cstring :: proc($literal: string) -> [^]u16 ---
 simd_add  :: proc(a, b: #simd[N]T) -> #simd[N]T ---
 simd_sub  :: proc(a, b: #simd[N]T) -> #simd[N]T ---
 simd_mul  :: proc(a, b: #simd[N]T) -> #simd[N]T ---
-simd_div  :: proc(a, b: #simd[N]T) -> #simd[N]T ---
-simd_rem  :: proc(a, b: #simd[N]T) -> #simd[N]T ---
+simd_div  :: proc(a, b: #simd[N]T) -> #simd[N]T where type_is_float(T) ---
 
 // Keeps Odin's Behaviour
 // (x << y) if y <= mask else 0

+ 1 - 2
core/simd/simd.odin

@@ -61,8 +61,7 @@ b64x8   :: #simd[8]b64
 add :: intrinsics.simd_add
 sub :: intrinsics.simd_sub
 mul :: intrinsics.simd_mul
-div :: intrinsics.simd_div
-rem :: intrinsics.simd_rem // integers only
+div :: intrinsics.simd_div // floats only
 
 // Keeps Odin's Behaviour
 // (x << y) if y <= mask else 0

+ 7 - 2
src/check_builtin.cpp

@@ -452,6 +452,13 @@ bool check_builtin_simd_operation(CheckerContext *c, Operand *operand, Ast *call
 				return false;
 			}
 
+			if (id == BuiltinProc_simd_div && is_type_integer(elem)) {
+				gbString xs = type_to_string(x.type);
+				error(x.expr, "'%.*s' is not supported for integer elements, got '%s'", LIT(builtin_name), xs);
+				gb_string_free(xs);
+				// don't return
+			}
+
 			operand->mode = Addressing_Value;
 			operand->type = x.type;
 			return true;
@@ -460,7 +467,6 @@ bool check_builtin_simd_operation(CheckerContext *c, Operand *operand, Ast *call
 	// Integer only
 	case BuiltinProc_simd_add_sat:
 	case BuiltinProc_simd_sub_sat:
-	case BuiltinProc_simd_rem:
 	case BuiltinProc_simd_and:
 	case BuiltinProc_simd_or:
 	case BuiltinProc_simd_xor:
@@ -492,7 +498,6 @@ bool check_builtin_simd_operation(CheckerContext *c, Operand *operand, Ast *call
 			switch (id) {
 			case BuiltinProc_simd_add_sat:
 			case BuiltinProc_simd_sub_sat:
-			case BuiltinProc_simd_rem:
 				if (!is_type_integer(elem)) {
 					gbString xs = type_to_string(x.type);
 					error(x.expr, "'%.*s' expected a #simd type with an integer element, got '%s'", LIT(builtin_name), xs);

+ 6 - 0
src/check_expr.cpp

@@ -1618,6 +1618,9 @@ bool check_binary_op(CheckerContext *c, Operand *o, Token op) {
 		if (is_type_matrix(main_type)) {
 			error(op, "Operator '%.*s' is only allowed with matrix types", LIT(op.string));
 			return false;
+		} else if (is_type_simd_vector(main_type) && is_type_integer(type)) {
+			error(op, "Operator '%.*s' is only allowed with #simd types with integer elements", LIT(op.string));
+			return false;
 		}
 		/*fallthrough*/
 	case Token_Mul:
@@ -1669,6 +1672,9 @@ bool check_binary_op(CheckerContext *c, Operand *o, Token op) {
 		if (!is_type_integer(type)) {
 			error(op, "Operator '%.*s' is only allowed with integers", LIT(op.string));
 			return false;
+		} else if (is_type_simd_vector(main_type)) {
+			error(op, "Operator '%.*s' is only allowed with #simd types with integer elements", LIT(op.string));
+			return false;
 		}
 		break;