Index: src/runtime/runtime-simd.cc |
diff --git a/src/runtime/runtime-simd.cc b/src/runtime/runtime-simd.cc |
index 0a1034dfc253b21323faae8eb15ecfe5595a3903..59e4fa1edb7975b38387200f9e536341496ddb69 100644 |
--- a/src/runtime/runtime-simd.cc |
+++ b/src/runtime/runtime-simd.cc |
@@ -212,10 +212,19 @@ RUNTIME_FUNCTION(Runtime_SimdSameValueZero) { |
CONVERT_INT32_ARG_CHECKED(name, index); \ |
RUNTIME_ASSERT(name >= 0 && name < lanes); |
+#define CONVERT_SIMD_ARG_HANDLE_THROW(Type, name, index) \ |
+ Handle<Type> name; \ |
+ if (args[index]->Is##Type()) { \ |
+ name = args.at<Type>(index); \ |
+ } else { \ |
+ THROW_NEW_ERROR_RETURN_FAILURE( \ |
+ isolate, NewTypeError(MessageTemplate::kInvalidSimdOperation)); \ |
+ } |
+ |
#define SIMD_UNARY_OP(type, lane_type, lane_count, op, result) \ |
static const int kLaneCount = lane_count; \ |
DCHECK(args.length() == 1); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
lane_type lanes[kLaneCount]; \ |
for (int i = 0; i < kLaneCount; i++) { \ |
lanes[i] = op(a->get_lane(i)); \ |
@@ -225,8 +234,8 @@ RUNTIME_FUNCTION(Runtime_SimdSameValueZero) { |
#define SIMD_BINARY_OP(type, lane_type, lane_count, op, result) \ |
static const int kLaneCount = lane_count; \ |
DCHECK(args.length() == 2); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, b, 1); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, b, 1); \ |
lane_type lanes[kLaneCount]; \ |
for (int i = 0; i < kLaneCount; i++) { \ |
lanes[i] = op(a->get_lane(i), b->get_lane(i)); \ |
@@ -236,8 +245,8 @@ RUNTIME_FUNCTION(Runtime_SimdSameValueZero) { |
#define SIMD_RELATIONAL_OP(type, bool_type, lane_count, a, b, op, result) \ |
static const int kLaneCount = lane_count; \ |
DCHECK(args.length() == 2); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, b, 1); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, b, 1); \ |
bool lanes[kLaneCount]; \ |
for (int i = 0; i < kLaneCount; i++) { \ |
lanes[i] = a->get_lane(i) op b->get_lane(i); \ |
@@ -283,7 +292,7 @@ RUNTIME_FUNCTION(Runtime_SimdSameValueZero) { |
RUNTIME_FUNCTION(Runtime_##type##ExtractLane) { \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 2); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
CONVERT_SIMD_LANE_ARG_CHECKED(lane, 1, lane_count); \ |
return *isolate->factory()->extract(a->get_lane(lane)); \ |
} |
@@ -293,7 +302,7 @@ RUNTIME_FUNCTION(Runtime_SimdSameValueZero) { |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 3); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, simd, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, simd, 0); \ |
CONVERT_SIMD_LANE_ARG_CHECKED(lane, 1, kLaneCount); \ |
lane_type lanes[kLaneCount]; \ |
for (int i = 0; i < kLaneCount; i++) { \ |
@@ -307,7 +316,7 @@ RUNTIME_FUNCTION(Runtime_SimdSameValueZero) { |
#define SIMD_CHECK_FUNCTION(type, lane_type, lane_count, extract, replace) \ |
RUNTIME_FUNCTION(Runtime_##type##Check) { \ |
HandleScope scope(isolate); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
return *a; \ |
} |
@@ -316,7 +325,7 @@ RUNTIME_FUNCTION(Runtime_SimdSameValueZero) { |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 1 + kLaneCount); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
lane_type lanes[kLaneCount]; \ |
for (int i = 0; i < kLaneCount; i++) { \ |
CONVERT_SIMD_LANE_ARG_CHECKED(index, i + 1, kLaneCount); \ |
@@ -331,8 +340,8 @@ RUNTIME_FUNCTION(Runtime_SimdSameValueZero) { |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 2 + kLaneCount); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, b, 1); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, b, 1); \ |
lane_type lanes[kLaneCount]; \ |
for (int i = 0; i < kLaneCount; i++) { \ |
CONVERT_SIMD_LANE_ARG_CHECKED(index, i + 2, kLaneCount * 2); \ |
@@ -437,7 +446,7 @@ SIMD_MAXNUM_FUNCTION(Float32x4, float, 4) |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 2); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
CONVERT_SHIFT_ARG_CHECKED(shift, 1); \ |
lane_type lanes[kLaneCount] = {0}; \ |
if (shift < lane_bits) { \ |
@@ -454,7 +463,7 @@ SIMD_MAXNUM_FUNCTION(Float32x4, float, 4) |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 2); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
CONVERT_SHIFT_ARG_CHECKED(shift, 1); \ |
lane_type lanes[kLaneCount] = {0}; \ |
if (shift < lane_bits) { \ |
@@ -472,7 +481,7 @@ SIMD_MAXNUM_FUNCTION(Float32x4, float, 4) |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 2); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
CONVERT_SHIFT_ARG_CHECKED(shift, 1); \ |
if (shift >= lane_bits) shift = lane_bits - 1; \ |
lane_type lanes[kLaneCount]; \ |
@@ -502,7 +511,7 @@ SIMD_UINT_TYPES(SIMD_LSR_FUNCTION) |
RUNTIME_FUNCTION(Runtime_##type##AnyTrue) { \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 1); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
bool result = false; \ |
for (int i = 0; i < lane_count; i++) { \ |
if (a->get_lane(i)) { \ |
@@ -517,7 +526,7 @@ SIMD_UINT_TYPES(SIMD_LSR_FUNCTION) |
RUNTIME_FUNCTION(Runtime_##type##AllTrue) { \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 1); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 0); \ |
bool result = true; \ |
for (int i = 0; i < lane_count; i++) { \ |
if (!a->get_lane(i)) { \ |
@@ -759,9 +768,9 @@ SIMD_LOGICAL_TYPES(SIMD_NOT_FUNCTION) |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 3); \ |
- CONVERT_ARG_HANDLE_CHECKED(bool_type, mask, 0); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 1); \ |
- CONVERT_ARG_HANDLE_CHECKED(type, b, 2); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(bool_type, mask, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 1); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, b, 2); \ |
lane_type lanes[kLaneCount]; \ |
for (int i = 0; i < kLaneCount; i++) { \ |
lanes[i] = mask->get_lane(i) ? a->get_lane(i) : b->get_lane(i); \ |
@@ -812,7 +821,7 @@ SIMD_SIGNED_TYPES(SIMD_NEG_FUNCTION) |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 1); \ |
- CONVERT_ARG_HANDLE_CHECKED(from_type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(from_type, a, 0); \ |
lane_type lanes[kLaneCount]; \ |
for (int i = 0; i < kLaneCount; i++) { \ |
from_ctype a_value = a->get_lane(i); \ |
@@ -875,7 +884,7 @@ SIMD_FROM_TYPES(SIMD_FROM_FUNCTION) |
static const int kLaneCount = lane_count; \ |
HandleScope scope(isolate); \ |
DCHECK(args.length() == 1); \ |
- CONVERT_ARG_HANDLE_CHECKED(from_type, a, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(from_type, a, 0); \ |
lane_type lanes[kLaneCount]; \ |
a->CopyBits(lanes); \ |
Handle<type> result = isolate->factory()->New##type(lanes); \ |
@@ -900,7 +909,7 @@ SIMD_FROM_BITS_TYPES(SIMD_FROM_BITS_FUNCTION) |
#define SIMD_LOAD(type, lane_type, lane_count, count, result) \ |
static const int kLaneCount = lane_count; \ |
DCHECK(args.length() == 2); \ |
- CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, tarray, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(JSTypedArray, tarray, 0); \ |
CONVERT_INT32_ARG_CHECKED(index, 1) \ |
size_t bpe = tarray->element_size(); \ |
uint32_t bytes = count * sizeof(lane_type); \ |
@@ -918,9 +927,9 @@ SIMD_FROM_BITS_TYPES(SIMD_FROM_BITS_FUNCTION) |
#define SIMD_STORE(type, lane_type, lane_count, count, a) \ |
static const int kLaneCount = lane_count; \ |
DCHECK(args.length() == 3); \ |
- CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, tarray, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(JSTypedArray, tarray, 0); \ |
+ CONVERT_SIMD_ARG_HANDLE_THROW(type, a, 2); \ |
CONVERT_INT32_ARG_CHECKED(index, 1) \ |
- CONVERT_ARG_HANDLE_CHECKED(type, a, 2); \ |
size_t bpe = tarray->element_size(); \ |
uint32_t bytes = count * sizeof(lane_type); \ |
size_t byte_length = NumberToSize(isolate, tarray->byte_length()); \ |