5 #include "src/builtins/builtins-utils-gen.h" 6 #include "src/builtins/builtins.h" 7 #include "src/code-stub-assembler.h" 8 #include "src/objects.h" 15 using TNode = compiler::TNode<T>;
28 void ValidateSharedTypedArray(
Node* tagged,
Node* context,
29 Node** out_instance_type,
30 Node** out_backing_store);
31 Node* ConvertTaggedAtomicIndexToWord32(
Node* tagged,
Node* context,
33 void ValidateAtomicIndex(
Node* array,
Node* index_word,
Node* context);
35 void DebugSanityCheckAtomicIndex(
Node* array,
Node* index_word,
38 void AtomicBinopBuiltinCommon(
Node* array,
Node* index,
Node* value,
39 Node* context, AssemblerFunction
function,
40 Runtime::FunctionId runtime_function);
48 void SharedArrayBufferBuiltinsAssembler::ValidateSharedTypedArray(
50 Node** out_backing_store) {
51 Label not_float_or_clamped(
this), invalid(
this);
54 GotoIf(TaggedIsSmi(tagged), &invalid);
57 GotoIfNot(InstanceTypeEqual(LoadInstanceType(tagged), JS_TYPED_ARRAY_TYPE),
63 GotoIfNot(IsSetWord32<JSArrayBuffer::IsSharedBit>(bitfield), &invalid);
66 Node* elements_instance_type = LoadInstanceType(LoadElements(tagged));
67 STATIC_ASSERT(FIXED_INT8_ARRAY_TYPE < FIXED_FLOAT32_ARRAY_TYPE);
68 STATIC_ASSERT(FIXED_INT16_ARRAY_TYPE < FIXED_FLOAT32_ARRAY_TYPE);
69 STATIC_ASSERT(FIXED_INT32_ARRAY_TYPE < FIXED_FLOAT32_ARRAY_TYPE);
70 STATIC_ASSERT(FIXED_UINT8_ARRAY_TYPE < FIXED_FLOAT32_ARRAY_TYPE);
71 STATIC_ASSERT(FIXED_UINT16_ARRAY_TYPE < FIXED_FLOAT32_ARRAY_TYPE);
72 STATIC_ASSERT(FIXED_UINT32_ARRAY_TYPE < FIXED_FLOAT32_ARRAY_TYPE);
73 GotoIf(Int32LessThan(elements_instance_type,
74 Int32Constant(FIXED_FLOAT32_ARRAY_TYPE)),
75 ¬_float_or_clamped);
76 STATIC_ASSERT(FIXED_BIGINT64_ARRAY_TYPE > FIXED_UINT8_CLAMPED_ARRAY_TYPE);
77 STATIC_ASSERT(FIXED_BIGUINT64_ARRAY_TYPE > FIXED_UINT8_CLAMPED_ARRAY_TYPE);
78 Branch(Int32GreaterThan(elements_instance_type,
79 Int32Constant(FIXED_UINT8_CLAMPED_ARRAY_TYPE)),
80 ¬_float_or_clamped, &invalid);
84 ThrowTypeError(context, MessageTemplate::kNotIntegerSharedTypedArray,
88 BIND(¬_float_or_clamped);
89 *out_instance_type = elements_instance_type;
91 TNode<RawPtrT> backing_store = LoadJSArrayBufferBackingStore(array_buffer);
92 TNode<UintPtrT> byte_offset = LoadJSArrayBufferViewByteOffset(CAST(tagged));
93 *out_backing_store = IntPtrAdd(backing_store, byte_offset);
97 Node* SharedArrayBufferBuiltinsAssembler::ConvertTaggedAtomicIndexToWord32(
98 Node* tagged, Node* context, Node** number_index) {
99 VARIABLE(var_result, MachineRepresentation::kWord32);
100 Label done(
this), range_error(
this);
107 *number_index = ToSmiIndex(CAST(tagged), CAST(context), &range_error);
108 var_result.Bind(SmiToInt32(*number_index));
112 { ThrowRangeError(context, MessageTemplate::kInvalidAtomicAccessIndex); }
115 return var_result.value();
118 void SharedArrayBufferBuiltinsAssembler::ValidateAtomicIndex(Node* array,
122 Label check_passed(
this);
123 Node* array_length_word32 =
124 TruncateTaggedToWord32(context, LoadJSTypedArrayLength(CAST(array)));
125 GotoIf(Uint32LessThan(index_word, array_length_word32), &check_passed);
127 ThrowRangeError(context, MessageTemplate::kInvalidAtomicAccessIndex);
133 void SharedArrayBufferBuiltinsAssembler::DebugSanityCheckAtomicIndex(
134 Node* array, Node* index_word, Node* context) {
140 Uint32LessThan(index_word,
141 TruncateTaggedToWord32(
142 context, LoadJSTypedArrayLength(CAST(array)))));
146 TNode<BigInt> SharedArrayBufferBuiltinsAssembler::BigIntFromSigned64(
149 return BigIntFromInt64(UncheckedCast<IntPtrT>(signed64));
151 TNode<IntPtrT> low = UncheckedCast<IntPtrT>(Projection(0, signed64));
152 TNode<IntPtrT> high = UncheckedCast<IntPtrT>(Projection(1, signed64));
153 return BigIntFromInt32Pair(low, high);
157 TNode<BigInt> SharedArrayBufferBuiltinsAssembler::BigIntFromUnsigned64(
160 return BigIntFromUint64(UncheckedCast<UintPtrT>(unsigned64));
162 TNode<UintPtrT> low = UncheckedCast<UintPtrT>(Projection(0, unsigned64));
163 TNode<UintPtrT> high = UncheckedCast<UintPtrT>(Projection(1, unsigned64));
164 return BigIntFromUint32Pair(low, high);
168 TF_BUILTIN(AtomicsLoad, SharedArrayBufferBuiltinsAssembler) {
169 Node* array = Parameter(Descriptor::kArray);
170 Node* index = Parameter(Descriptor::kIndex);
171 Node* context = Parameter(Descriptor::kContext);
175 ValidateSharedTypedArray(array, context, &instance_type, &backing_store);
179 ConvertTaggedAtomicIndexToWord32(index, context, &index_integer);
180 ValidateAtomicIndex(array, index_word32, context);
181 Node* index_word = ChangeUint32ToWord(index_word32);
183 Label i8(
this), u8(
this), i16(
this), u16(
this), i32(
this), u32(
this),
184 i64(
this), u64(
this), other(
this);
185 int32_t case_values[] = {
186 FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE,
187 FIXED_INT16_ARRAY_TYPE, FIXED_UINT16_ARRAY_TYPE,
188 FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE,
189 FIXED_BIGINT64_ARRAY_TYPE, FIXED_BIGUINT64_ARRAY_TYPE,
191 Label* case_labels[] = {&i8, &u8, &i16, &u16, &i32, &u32, &i64, &u64};
192 Switch(instance_type, &other, case_values, case_labels,
193 arraysize(case_labels));
197 SmiFromInt32(AtomicLoad(MachineType::Int8(), backing_store, index_word)));
201 AtomicLoad(MachineType::Uint8(), backing_store, index_word)));
205 AtomicLoad(MachineType::Int16(), backing_store, WordShl(index_word, 1))));
208 Return(SmiFromInt32(AtomicLoad(MachineType::Uint16(), backing_store,
209 WordShl(index_word, 1))));
212 Return(ChangeInt32ToTagged(
213 AtomicLoad(MachineType::Int32(), backing_store, WordShl(index_word, 2))));
216 Return(ChangeUint32ToTagged(AtomicLoad(MachineType::Uint32(), backing_store,
217 WordShl(index_word, 2))));
218 #if V8_TARGET_ARCH_MIPS && !_MIPS_ARCH_MIPS32R6 220 Return(CallRuntime(Runtime::kAtomicsLoad64, context, array, index_integer));
223 Return(CallRuntime(Runtime::kAtomicsLoad64, context, array, index_integer));
229 Return(BigIntFromSigned64(AtomicLoad(MachineType::Uint64(), backing_store,
230 WordShl(index_word, 3))));
233 Return(BigIntFromUnsigned64(AtomicLoad(MachineType::Uint64(), backing_store,
234 WordShl(index_word, 3))));
241 TF_BUILTIN(AtomicsStore, SharedArrayBufferBuiltinsAssembler) {
242 Node* array = Parameter(Descriptor::kArray);
243 Node* index = Parameter(Descriptor::kIndex);
244 Node* value = Parameter(Descriptor::kValue);
245 Node* context = Parameter(Descriptor::kContext);
249 ValidateSharedTypedArray(array, context, &instance_type, &backing_store);
253 ConvertTaggedAtomicIndexToWord32(index, context, &index_integer);
254 ValidateAtomicIndex(array, index_word32, context);
255 Node* index_word = ChangeUint32ToWord(index_word32);
257 Label u8(
this), u16(
this), u32(
this), u64(
this), other(
this);
258 STATIC_ASSERT(FIXED_BIGINT64_ARRAY_TYPE > FIXED_UINT32_ARRAY_TYPE);
259 STATIC_ASSERT(FIXED_BIGUINT64_ARRAY_TYPE > FIXED_UINT32_ARRAY_TYPE);
261 Int32GreaterThan(instance_type, Int32Constant(FIXED_UINT32_ARRAY_TYPE)),
264 Node* value_integer = ToInteger_Inline(CAST(context), CAST(value));
265 Node* value_word32 = TruncateTaggedToWord32(context, value_integer);
268 DebugSanityCheckAtomicIndex(array, index_word32, context);
271 int32_t case_values[] = {
272 FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE, FIXED_INT16_ARRAY_TYPE,
273 FIXED_UINT16_ARRAY_TYPE, FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE,
275 Label* case_labels[] = {&u8, &u8, &u16, &u16, &u32, &u32};
276 Switch(instance_type, &other, case_values, case_labels,
277 arraysize(case_labels));
280 AtomicStore(MachineRepresentation::kWord8, backing_store, index_word,
282 Return(value_integer);
285 AtomicStore(MachineRepresentation::kWord16, backing_store,
286 WordShl(index_word, 1), value_word32);
287 Return(value_integer);
290 AtomicStore(MachineRepresentation::kWord32, backing_store,
291 WordShl(index_word, 2), value_word32);
292 Return(value_integer);
295 #if V8_TARGET_ARCH_MIPS && !_MIPS_ARCH_MIPS32R6 296 Return(CallRuntime(Runtime::kAtomicsStore64, context, array, index_integer,
299 TNode<BigInt> value_bigint = ToBigInt(CAST(context), CAST(value));
301 DebugSanityCheckAtomicIndex(array, index_word32, context);
303 TVARIABLE(UintPtrT, var_low);
304 TVARIABLE(UintPtrT, var_high);
305 BigIntToRawBytes(value_bigint, &var_low, &var_high);
306 Node* high = Is64() ? nullptr :
static_cast<Node*
>(var_high.value());
307 AtomicStore(MachineRepresentation::kWord64, backing_store,
308 WordShl(index_word, 3), var_low.value(), high);
309 Return(value_bigint);
317 TF_BUILTIN(AtomicsExchange, SharedArrayBufferBuiltinsAssembler) {
318 Node* array = Parameter(Descriptor::kArray);
319 Node* index = Parameter(Descriptor::kIndex);
320 Node* value = Parameter(Descriptor::kValue);
321 Node* context = Parameter(Descriptor::kContext);
325 ValidateSharedTypedArray(array, context, &instance_type, &backing_store);
329 ConvertTaggedAtomicIndexToWord32(index, context, &index_integer);
330 ValidateAtomicIndex(array, index_word32, context);
332 #if V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 333 Return(CallRuntime(Runtime::kAtomicsExchange, context, array, index_integer,
336 Node* index_word = ChangeUint32ToWord(index_word32);
338 Label i8(
this), u8(
this), i16(
this), u16(
this), i32(
this), u32(
this),
339 i64(
this), u64(
this), big(
this), other(
this);
340 STATIC_ASSERT(FIXED_BIGINT64_ARRAY_TYPE > FIXED_UINT32_ARRAY_TYPE);
341 STATIC_ASSERT(FIXED_BIGUINT64_ARRAY_TYPE > FIXED_UINT32_ARRAY_TYPE);
343 Int32GreaterThan(instance_type, Int32Constant(FIXED_UINT32_ARRAY_TYPE)),
346 Node* value_integer = ToInteger_Inline(CAST(context), CAST(value));
348 DebugSanityCheckAtomicIndex(array, index_word32, context);
350 Node* value_word32 = TruncateTaggedToWord32(context, value_integer);
352 int32_t case_values[] = {
353 FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE, FIXED_INT16_ARRAY_TYPE,
354 FIXED_UINT16_ARRAY_TYPE, FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE,
356 Label* case_labels[] = {
357 &i8, &u8, &i16, &u16, &i32, &u32,
359 Switch(instance_type, &other, case_values, case_labels,
360 arraysize(case_labels));
363 Return(SmiFromInt32(AtomicExchange(MachineType::Int8(), backing_store,
364 index_word, value_word32)));
367 Return(SmiFromInt32(AtomicExchange(MachineType::Uint8(), backing_store,
368 index_word, value_word32)));
371 Return(SmiFromInt32(AtomicExchange(MachineType::Int16(), backing_store,
372 WordShl(index_word, 1), value_word32)));
375 Return(SmiFromInt32(AtomicExchange(MachineType::Uint16(), backing_store,
376 WordShl(index_word, 1), value_word32)));
379 Return(ChangeInt32ToTagged(AtomicExchange(MachineType::Int32(), backing_store,
380 WordShl(index_word, 2),
384 Return(ChangeUint32ToTagged(
385 AtomicExchange(MachineType::Uint32(), backing_store,
386 WordShl(index_word, 2), value_word32)));
389 TNode<BigInt> value_bigint = ToBigInt(CAST(context), CAST(value));
391 DebugSanityCheckAtomicIndex(array, index_word32, context);
393 TVARIABLE(UintPtrT, var_low);
394 TVARIABLE(UintPtrT, var_high);
395 BigIntToRawBytes(value_bigint, &var_low, &var_high);
396 Node* high = Is64() ? nullptr :
static_cast<Node*
>(var_high.value());
397 GotoIf(Word32Equal(instance_type, Int32Constant(FIXED_BIGINT64_ARRAY_TYPE)),
399 GotoIf(Word32Equal(instance_type, Int32Constant(FIXED_BIGUINT64_ARRAY_TYPE)),
407 Return(BigIntFromSigned64(AtomicExchange(MachineType::Uint64(), backing_store,
408 WordShl(index_word, 3),
409 var_low.value(), high)));
412 Return(BigIntFromUnsigned64(
413 AtomicExchange(MachineType::Uint64(), backing_store,
414 WordShl(index_word, 3), var_low.value(), high)));
419 #endif // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 422 TF_BUILTIN(AtomicsCompareExchange, SharedArrayBufferBuiltinsAssembler) {
423 Node* array = Parameter(Descriptor::kArray);
424 Node* index = Parameter(Descriptor::kIndex);
425 Node* old_value = Parameter(Descriptor::kOldValue);
426 Node* new_value = Parameter(Descriptor::kNewValue);
427 Node* context = Parameter(Descriptor::kContext);
431 ValidateSharedTypedArray(array, context, &instance_type, &backing_store);
435 ConvertTaggedAtomicIndexToWord32(index, context, &index_integer);
436 ValidateAtomicIndex(array, index_word32, context);
438 #if V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC64 || \ 439 V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_S390 || V8_TARGET_ARCH_S390X 440 Return(CallRuntime(Runtime::kAtomicsCompareExchange, context, array,
441 index_integer, old_value, new_value));
443 Node* index_word = ChangeUint32ToWord(index_word32);
445 Label i8(
this), u8(
this), i16(
this), u16(
this), i32(
this), u32(
this),
446 i64(
this), u64(
this), big(
this), other(
this);
447 STATIC_ASSERT(FIXED_BIGINT64_ARRAY_TYPE > FIXED_UINT32_ARRAY_TYPE);
448 STATIC_ASSERT(FIXED_BIGUINT64_ARRAY_TYPE > FIXED_UINT32_ARRAY_TYPE);
450 Int32GreaterThan(instance_type, Int32Constant(FIXED_UINT32_ARRAY_TYPE)),
453 Node* old_value_integer = ToInteger_Inline(CAST(context), CAST(old_value));
454 Node* new_value_integer = ToInteger_Inline(CAST(context), CAST(new_value));
456 DebugSanityCheckAtomicIndex(array, index_word32, context);
458 Node* old_value_word32 = TruncateTaggedToWord32(context, old_value_integer);
459 Node* new_value_word32 = TruncateTaggedToWord32(context, new_value_integer);
461 int32_t case_values[] = {
462 FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE, FIXED_INT16_ARRAY_TYPE,
463 FIXED_UINT16_ARRAY_TYPE, FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE,
465 Label* case_labels[] = {
466 &i8, &u8, &i16, &u16, &i32, &u32,
468 Switch(instance_type, &other, case_values, case_labels,
469 arraysize(case_labels));
472 Return(SmiFromInt32(AtomicCompareExchange(MachineType::Int8(), backing_store,
473 index_word, old_value_word32,
477 Return(SmiFromInt32(AtomicCompareExchange(MachineType::Uint8(), backing_store,
478 index_word, old_value_word32,
482 Return(SmiFromInt32(AtomicCompareExchange(
483 MachineType::Int16(), backing_store, WordShl(index_word, 1),
484 old_value_word32, new_value_word32)));
487 Return(SmiFromInt32(AtomicCompareExchange(
488 MachineType::Uint16(), backing_store, WordShl(index_word, 1),
489 old_value_word32, new_value_word32)));
492 Return(ChangeInt32ToTagged(AtomicCompareExchange(
493 MachineType::Int32(), backing_store, WordShl(index_word, 2),
494 old_value_word32, new_value_word32)));
497 Return(ChangeUint32ToTagged(AtomicCompareExchange(
498 MachineType::Uint32(), backing_store, WordShl(index_word, 2),
499 old_value_word32, new_value_word32)));
502 TNode<BigInt> old_value_bigint = ToBigInt(CAST(context), CAST(old_value));
503 TNode<BigInt> new_value_bigint = ToBigInt(CAST(context), CAST(new_value));
505 DebugSanityCheckAtomicIndex(array, index_word32, context);
507 TVARIABLE(UintPtrT, var_old_low);
508 TVARIABLE(UintPtrT, var_old_high);
509 TVARIABLE(UintPtrT, var_new_low);
510 TVARIABLE(UintPtrT, var_new_high);
511 BigIntToRawBytes(old_value_bigint, &var_old_low, &var_old_high);
512 BigIntToRawBytes(new_value_bigint, &var_new_low, &var_new_high);
513 Node* old_high = Is64() ? nullptr :
static_cast<Node*
>(var_old_high.value());
514 Node* new_high = Is64() ? nullptr :
static_cast<Node*
>(var_new_high.value());
515 GotoIf(Word32Equal(instance_type, Int32Constant(FIXED_BIGINT64_ARRAY_TYPE)),
517 GotoIf(Word32Equal(instance_type, Int32Constant(FIXED_BIGUINT64_ARRAY_TYPE)),
525 Return(BigIntFromSigned64(AtomicCompareExchange(
526 MachineType::Uint64(), backing_store, WordShl(index_word, 3),
527 var_old_low.value(), var_new_low.value(), old_high, new_high)));
530 Return(BigIntFromUnsigned64(AtomicCompareExchange(
531 MachineType::Uint64(), backing_store, WordShl(index_word, 3),
532 var_old_low.value(), var_new_low.value(), old_high, new_high)));
537 #endif // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC64 541 #define BINOP_BUILTIN(op) \ 542 TF_BUILTIN(Atomics##op, SharedArrayBufferBuiltinsAssembler) { \ 543 Node* array = Parameter(Descriptor::kArray); \ 544 Node* index = Parameter(Descriptor::kIndex); \ 545 Node* value = Parameter(Descriptor::kValue); \ 546 Node* context = Parameter(Descriptor::kContext); \ 547 AtomicBinopBuiltinCommon(array, index, value, context, \ 548 &CodeAssembler::Atomic##op, \ 549 Runtime::kAtomics##op); \ 558 void SharedArrayBufferBuiltinsAssembler::AtomicBinopBuiltinCommon(
559 Node* array, Node* index, Node* value, Node* context,
560 AssemblerFunction
function, Runtime::FunctionId runtime_function) {
563 ValidateSharedTypedArray(array, context, &instance_type, &backing_store);
567 ConvertTaggedAtomicIndexToWord32(index, context, &index_integer);
568 ValidateAtomicIndex(array, index_word32, context);
570 #if V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC64 || \ 571 V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_S390 || V8_TARGET_ARCH_S390X 572 Return(CallRuntime(runtime_function, context, array, index_integer, value));
574 Node* index_word = ChangeUint32ToWord(index_word32);
576 Label i8(
this), u8(
this), i16(
this), u16(
this), i32(
this), u32(
this),
577 i64(
this), u64(
this), big(
this), other(
this);
579 STATIC_ASSERT(FIXED_BIGINT64_ARRAY_TYPE > FIXED_UINT32_ARRAY_TYPE);
580 STATIC_ASSERT(FIXED_BIGUINT64_ARRAY_TYPE > FIXED_UINT32_ARRAY_TYPE);
582 Int32GreaterThan(instance_type, Int32Constant(FIXED_UINT32_ARRAY_TYPE)),
585 Node* value_integer = ToInteger_Inline(CAST(context), CAST(value));
587 DebugSanityCheckAtomicIndex(array, index_word32, context);
589 Node* value_word32 = TruncateTaggedToWord32(context, value_integer);
591 int32_t case_values[] = {
592 FIXED_INT8_ARRAY_TYPE, FIXED_UINT8_ARRAY_TYPE, FIXED_INT16_ARRAY_TYPE,
593 FIXED_UINT16_ARRAY_TYPE, FIXED_INT32_ARRAY_TYPE, FIXED_UINT32_ARRAY_TYPE,
595 Label* case_labels[] = {
596 &i8, &u8, &i16, &u16, &i32, &u32,
598 Switch(instance_type, &other, case_values, case_labels,
599 arraysize(case_labels));
602 Return(SmiFromInt32((this->*
function)(MachineType::Int8(), backing_store,
603 index_word, value_word32,
nullptr)));
606 Return(SmiFromInt32((this->*
function)(MachineType::Uint8(), backing_store,
607 index_word, value_word32,
nullptr)));
610 Return(SmiFromInt32((this->*
function)(MachineType::Int16(), backing_store,
611 WordShl(index_word, 1), value_word32,
615 Return(SmiFromInt32((this->*
function)(MachineType::Uint16(), backing_store,
616 WordShl(index_word, 1), value_word32,
620 Return(ChangeInt32ToTagged(
621 (this->*
function)(MachineType::Int32(), backing_store,
622 WordShl(index_word, 2), value_word32,
nullptr)));
625 Return(ChangeUint32ToTagged(
626 (this->*
function)(MachineType::Uint32(), backing_store,
627 WordShl(index_word, 2), value_word32,
nullptr)));
630 TNode<BigInt> value_bigint = ToBigInt(CAST(context), CAST(value));
632 DebugSanityCheckAtomicIndex(array, index_word32, context);
634 TVARIABLE(UintPtrT, var_low);
635 TVARIABLE(UintPtrT, var_high);
636 BigIntToRawBytes(value_bigint, &var_low, &var_high);
637 Node* high = Is64() ? nullptr :
static_cast<Node*
>(var_high.value());
638 GotoIf(Word32Equal(instance_type, Int32Constant(FIXED_BIGINT64_ARRAY_TYPE)),
640 GotoIf(Word32Equal(instance_type, Int32Constant(FIXED_BIGUINT64_ARRAY_TYPE)),
648 Return(BigIntFromSigned64(
649 (this->*
function)(MachineType::Uint64(), backing_store,
650 WordShl(index_word, 3), var_low.value(), high)));
653 Return(BigIntFromUnsigned64(
654 (this->*
function)(MachineType::Uint64(), backing_store,
655 WordShl(index_word, 3), var_low.value(), high)));
660 #endif // V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC64