Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index d054916db0a700e330ea3aac6abf859d0ec4226a..af8b5fc87f46fedc00f7426e18fc3e3209645c6d 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -5148,7 +5148,8 @@ void Builtins::Generate_StackCheck(MacroAssembler* masm) { |
namespace { |
void ValidateSharedTypedArray(compiler::CodeStubAssembler* a, |
- compiler::Node* tagged, compiler::Node* context) { |
+ compiler::Node* tagged, compiler::Node* context, |
+ compiler::Node** out_instance_type) { |
using namespace compiler; |
CodeStubAssembler::Label is_smi(a), not_smi(a), is_typed_array(a), |
not_typed_array(a), is_shared(a), not_shared(a), is_float_or_clamped(a), |
@@ -5199,6 +5200,25 @@ void ValidateSharedTypedArray(compiler::CodeStubAssembler* a, |
a->Return(a->UndefinedConstant()); |
a->Bind(¬_float_or_clamped); |
+ *out_instance_type = elements_instance_type; |
+} |
+ |
+void BranchIfSharedTypedArrayIsSigned( |
+ compiler::CodeStubAssembler* a, compiler::Node* instance_type, |
+ compiler::CodeStubAssembler::Label* is_signed, |
+ compiler::CodeStubAssembler::Label* is_unsigned) { |
+ STATIC_ASSERT(((FIXED_INT8_ARRAY_TYPE - FIXED_INT8_ARRAY_TYPE) & 1) == 0); |
+ STATIC_ASSERT(((FIXED_UINT8_ARRAY_TYPE - FIXED_INT8_ARRAY_TYPE) & 1) == 1); |
+ STATIC_ASSERT(((FIXED_INT16_ARRAY_TYPE - FIXED_INT8_ARRAY_TYPE) & 1) == 0); |
+ STATIC_ASSERT(((FIXED_UINT16_ARRAY_TYPE - FIXED_INT8_ARRAY_TYPE) & 1) == 1); |
+ STATIC_ASSERT(((FIXED_INT32_ARRAY_TYPE - FIXED_INT8_ARRAY_TYPE) & 1) == 0); |
+ STATIC_ASSERT(((FIXED_UINT32_ARRAY_TYPE - FIXED_INT8_ARRAY_TYPE) & 1) == 1); |
+ a->Branch(a->WordEqual( |
+ a->WordAnd(a->Int32Sub(instance_type, |
+ a->Int32Constant(FIXED_INT8_ARRAY_TYPE)), |
+ a->Int32Constant(1)), |
+ a->Int32Constant(0)), |
+ is_signed, is_unsigned); |
} |
// https://tc39.github.io/ecmascript_sharedmem/shmem.html#Atomics.ValidateAtomicAccess |
@@ -5271,7 +5291,9 @@ void Builtins::Generate_AtomicsLoadCheck(compiler::CodeStubAssembler* a) { |
Node* array = a->Parameter(1); |
Node* index = a->Parameter(2); |
Node* context = a->Parameter(3 + 2); |
- ValidateSharedTypedArray(a, array, context); |
+ Node* array_instance_type; |
+ |
+ ValidateSharedTypedArray(a, array, context, &array_instance_type); |
Node* index_word = ConvertTaggedAtomicIndexToWord32(a, index, context); |
Node* array_length_word = a->TruncateTaggedToWord32( |
context, a->LoadObjectField(array, JSTypedArray::kLengthOffset)); |
@@ -5279,8 +5301,18 @@ void Builtins::Generate_AtomicsLoadCheck(compiler::CodeStubAssembler* a) { |
Callable atomics_load = CodeFactory::AtomicsLoad(isolate); |
Node* target = a->HeapConstant(atomics_load.code()); |
- a->Return(a->CallStub(atomics_load.descriptor(), target, context, array, |
- index_word)); |
+ Node* untagged_result = a->CallStub(atomics_load.descriptor(), target, |
Benedikt Meurer
2016/04/14 04:16:20
I think this is not safe, because the CallInterfac
|
+ context, array, index_word); |
+ |
+ CodeStubAssembler::Label is_signed(a), is_unsigned(a); |
+ BranchIfSharedTypedArrayIsSigned(a, array_instance_type, &is_signed, |
+ &is_unsigned); |
+ |
+ a->Bind(&is_signed); |
+ a->Return(a->ChangeInt32ToTagged(untagged_result)); |
+ |
+ a->Bind(&is_unsigned); |
+ a->Return(a->ChangeUint32ToTagged(untagged_result)); |
} |
#define DEFINE_BUILTIN_ACCESSOR_C(name, ignore) \ |