diff options
Diffstat (limited to 'deps/v8/src/arm')
-rw-r--r-- | deps/v8/src/arm/assembler-arm.cc | 27 | ||||
-rw-r--r-- | deps/v8/src/arm/assembler-arm.h | 11 | ||||
-rw-r--r-- | deps/v8/src/arm/code-stubs-arm.cc | 10 | ||||
-rw-r--r-- | deps/v8/src/arm/codegen-arm.cc | 46 | ||||
-rw-r--r-- | deps/v8/src/arm/interface-descriptors-arm.cc | 14 | ||||
-rw-r--r-- | deps/v8/src/arm/macro-assembler-arm.cc | 17 | ||||
-rw-r--r-- | deps/v8/src/arm/macro-assembler-arm.h | 21 | ||||
-rw-r--r-- | deps/v8/src/arm/simulator-arm.cc | 10 |
8 files changed, 85 insertions, 71 deletions
diff --git a/deps/v8/src/arm/assembler-arm.cc b/deps/v8/src/arm/assembler-arm.cc index 163fa4c219..758fcd1a68 100644 --- a/deps/v8/src/arm/assembler-arm.cc +++ b/deps/v8/src/arm/assembler-arm.cc @@ -46,6 +46,7 @@ #include "src/deoptimizer.h" #include "src/macro-assembler.h" #include "src/objects-inl.h" +#include "src/string-constants.h" namespace v8 { namespace internal { @@ -417,6 +418,13 @@ Operand Operand::EmbeddedCode(CodeStub* stub) { return result; } +Operand Operand::EmbeddedStringConstant(const StringConstantBase* str) { + Operand result(0, RelocInfo::EMBEDDED_OBJECT); + result.is_heap_object_request_ = true; + result.value_.heap_object_request = HeapObjectRequest(str); + return result; +} + MemOperand::MemOperand(Register rn, int32_t offset, AddrMode am) : rn_(rn), rm_(no_reg), offset_(offset), am_(am) { // Accesses below the stack pointer are not safe, and are prohibited by the @@ -472,6 +480,7 @@ void NeonMemOperand::SetAlignment(int align) { } void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) { + DCHECK_IMPLIES(isolate == nullptr, heap_object_requests_.empty()); for (auto& request : heap_object_requests_) { Handle<HeapObject> object; switch (request.kind()) { @@ -483,6 +492,12 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) { request.code_stub()->set_isolate(isolate); object = request.code_stub()->GetCode(); break; + case HeapObjectRequest::kStringConstant: { + const StringConstantBase* str = request.string(); + CHECK_NOT_NULL(str); + object = str->AllocateStringConstant(isolate); + break; + } } Address pc = reinterpret_cast<Address>(buffer_) + request.offset(); Memory<Address>(constant_pool_entry_address(pc, 0 /* unused */)) = @@ -1418,7 +1433,7 @@ int Assembler::branch_offset(Label* L) { // Branch instructions. void Assembler::b(int branch_offset, Condition cond, RelocInfo::Mode rmode) { - RecordRelocInfo(rmode); + if (!RelocInfo::IsNone(rmode)) RecordRelocInfo(rmode); DCHECK_EQ(branch_offset & 3, 0); int imm24 = branch_offset >> 2; const bool b_imm_check = is_int24(imm24); @@ -1432,7 +1447,7 @@ void Assembler::b(int branch_offset, Condition cond, RelocInfo::Mode rmode) { } void Assembler::bl(int branch_offset, Condition cond, RelocInfo::Mode rmode) { - RecordRelocInfo(rmode); + if (!RelocInfo::IsNone(rmode)) RecordRelocInfo(rmode); DCHECK_EQ(branch_offset & 3, 0); int imm24 = branch_offset >> 2; const bool bl_imm_check = is_int24(imm24); @@ -5103,13 +5118,7 @@ void Assembler::dq(uint64_t value) { } void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { - if (options().disable_reloc_info_for_patching) return; - if (RelocInfo::IsNone(rmode) || - // Don't record external references unless the heap will be serialized. - (RelocInfo::IsOnlyForSerializer(rmode) && - !options().record_reloc_info_for_serialization && !emit_debug_code())) { - return; - } + if (!ShouldRecordRelocInfo(rmode)) return; DCHECK_GE(buffer_space(), kMaxRelocSize); // too late to grow buffer here RelocInfo rinfo(reinterpret_cast<Address>(pc_), rmode, data, nullptr); reloc_info_writer.Write(&rinfo); diff --git a/deps/v8/src/arm/assembler-arm.h b/deps/v8/src/arm/assembler-arm.h index fb36702882..1bfa58b853 100644 --- a/deps/v8/src/arm/assembler-arm.h +++ b/deps/v8/src/arm/assembler-arm.h @@ -393,7 +393,7 @@ enum Coprocessor { // Machine instruction Operands // Class Operand represents a shifter operand in data processing instructions -class Operand BASE_EMBEDDED { +class Operand { public: // immediate V8_INLINE explicit Operand(int32_t immediate, @@ -425,6 +425,7 @@ class Operand BASE_EMBEDDED { static Operand EmbeddedNumber(double number); // Smi or HeapNumber. static Operand EmbeddedCode(CodeStub* stub); + static Operand EmbeddedStringConstant(const StringConstantBase* str); // Return true if this is a register operand. bool IsRegister() const { @@ -498,7 +499,7 @@ class Operand BASE_EMBEDDED { // Class MemOperand represents a memory operand in load and store instructions -class MemOperand BASE_EMBEDDED { +class MemOperand { public: // [rn +/- offset] Offset/NegOffset // [rn +/- offset]! PreIndex/NegPreIndex @@ -557,7 +558,7 @@ class MemOperand BASE_EMBEDDED { // Class NeonMemOperand represents a memory operand in load and // store NEON instructions -class NeonMemOperand BASE_EMBEDDED { +class NeonMemOperand { public: // [rn {:align}] Offset // [rn {:align}]! PostIndex @@ -580,7 +581,7 @@ class NeonMemOperand BASE_EMBEDDED { // Class NeonListOperand represents a list of NEON registers -class NeonListOperand BASE_EMBEDDED { +class NeonListOperand { public: explicit NeonListOperand(DoubleRegister base, int register_count = 1) : base_(base), register_count_(register_count) {} @@ -1693,7 +1694,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase { friend class UseScratchRegisterScope; }; -class EnsureSpace BASE_EMBEDDED { +class EnsureSpace { public: V8_INLINE explicit EnsureSpace(Assembler* assembler); }; diff --git a/deps/v8/src/arm/code-stubs-arm.cc b/deps/v8/src/arm/code-stubs-arm.cc index bb5becefb8..c7eaef1325 100644 --- a/deps/v8/src/arm/code-stubs-arm.cc +++ b/deps/v8/src/arm/code-stubs-arm.cc @@ -131,7 +131,7 @@ void JSEntryStub::Generate(MacroAssembler* masm) { IsolateAddressId::kPendingExceptionAddress, isolate()))); } __ str(r0, MemOperand(scratch)); - __ LoadRoot(r0, Heap::kExceptionRootIndex); + __ LoadRoot(r0, RootIndex::kException); __ b(&exit); // Invoke: Link this frame into the handler chain. @@ -418,7 +418,7 @@ static void CallApiFunctionAndReturn(MacroAssembler* masm, __ LeaveExitFrame(false, r4, stack_space_operand != nullptr); // Check if the function scheduled an exception. - __ LoadRoot(r4, Heap::kTheHoleValueRootIndex); + __ LoadRoot(r4, RootIndex::kTheHoleValue); __ Move(r6, ExternalReference::scheduled_exception_address(isolate)); __ ldr(r5, MemOperand(r6)); __ cmp(r4, r5); @@ -469,14 +469,14 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { STATIC_ASSERT(FCA::kHolderIndex == 0); // new target - __ PushRoot(Heap::kUndefinedValueRootIndex); + __ PushRoot(RootIndex::kUndefinedValue); // call data __ push(call_data); Register scratch0 = call_data; Register scratch1 = r5; - __ LoadRoot(scratch0, Heap::kUndefinedValueRootIndex); + __ LoadRoot(scratch0, RootIndex::kUndefinedValue); // return value __ push(scratch0); // return value default @@ -549,7 +549,7 @@ void CallApiGetterStub::Generate(MacroAssembler* masm) { // Push data from AccessorInfo. __ ldr(scratch, FieldMemOperand(callback, AccessorInfo::kDataOffset)); __ push(scratch); - __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); + __ LoadRoot(scratch, RootIndex::kUndefinedValue); __ Push(scratch, scratch); __ Move(scratch, ExternalReference::isolate_address(isolate())); __ Push(scratch, holder); diff --git a/deps/v8/src/arm/codegen-arm.cc b/deps/v8/src/arm/codegen-arm.cc index 39f756d152..7dc4ced321 100644 --- a/deps/v8/src/arm/codegen-arm.cc +++ b/deps/v8/src/arm/codegen-arm.cc @@ -9,7 +9,6 @@ #include "src/arm/assembler-arm-inl.h" #include "src/arm/simulator-arm.h" #include "src/codegen.h" -#include "src/isolate.h" #include "src/macro-assembler.h" namespace v8 { @@ -19,17 +18,17 @@ namespace internal { #if defined(V8_HOST_ARCH_ARM) -MemCopyUint8Function CreateMemCopyUint8Function(Isolate* isolate, - MemCopyUint8Function stub) { +MemCopyUint8Function CreateMemCopyUint8Function(MemCopyUint8Function stub) { #if defined(USE_SIMULATOR) return stub; #else + v8::PageAllocator* page_allocator = GetPlatformPageAllocator(); size_t allocated = 0; - byte* buffer = AllocatePage(isolate->heap()->GetRandomMmapAddr(), &allocated); + byte* buffer = AllocatePage(page_allocator, + page_allocator->GetRandomMmapAddr(), &allocated); if (buffer == nullptr) return stub; - MacroAssembler masm(isolate, buffer, static_cast<int>(allocated), - CodeObjectRequired::kNo); + MacroAssembler masm(AssemblerOptions{}, buffer, static_cast<int>(allocated)); Register dest = r0; Register src = r1; @@ -166,11 +165,12 @@ MemCopyUint8Function CreateMemCopyUint8Function(Isolate* isolate, __ Ret(); CodeDesc desc; - masm.GetCode(isolate, &desc); + masm.GetCode(nullptr, &desc); DCHECK(!RelocInfo::RequiresRelocationAfterCodegen(desc)); Assembler::FlushICache(buffer, allocated); - CHECK(SetPermissions(buffer, allocated, PageAllocator::kReadExecute)); + CHECK(SetPermissions(page_allocator, buffer, allocated, + PageAllocator::kReadExecute)); return FUNCTION_CAST<MemCopyUint8Function>(buffer); #endif } @@ -178,16 +178,17 @@ MemCopyUint8Function CreateMemCopyUint8Function(Isolate* isolate, // Convert 8 to 16. The number of character to copy must be at least 8. MemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( - Isolate* isolate, MemCopyUint16Uint8Function stub) { + MemCopyUint16Uint8Function stub) { #if defined(USE_SIMULATOR) return stub; #else + v8::PageAllocator* page_allocator = GetPlatformPageAllocator(); size_t allocated = 0; - byte* buffer = AllocatePage(isolate->heap()->GetRandomMmapAddr(), &allocated); + byte* buffer = AllocatePage(page_allocator, + page_allocator->GetRandomMmapAddr(), &allocated); if (buffer == nullptr) return stub; - MacroAssembler masm(isolate, buffer, static_cast<int>(allocated), - CodeObjectRequired::kNo); + MacroAssembler masm(AssemblerOptions{}, buffer, static_cast<int>(allocated)); Register dest = r0; Register src = r1; @@ -256,25 +257,27 @@ MemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( } CodeDesc desc; - masm.GetCode(isolate, &desc); + masm.GetCode(nullptr, &desc); Assembler::FlushICache(buffer, allocated); - CHECK(SetPermissions(buffer, allocated, PageAllocator::kReadExecute)); + CHECK(SetPermissions(page_allocator, buffer, allocated, + PageAllocator::kReadExecute)); return FUNCTION_CAST<MemCopyUint16Uint8Function>(buffer); #endif } #endif -UnaryMathFunctionWithIsolate CreateSqrtFunction(Isolate* isolate) { +UnaryMathFunction CreateSqrtFunction() { #if defined(USE_SIMULATOR) return nullptr; #else + v8::PageAllocator* page_allocator = GetPlatformPageAllocator(); size_t allocated = 0; - byte* buffer = AllocatePage(isolate->heap()->GetRandomMmapAddr(), &allocated); + byte* buffer = AllocatePage(page_allocator, + page_allocator->GetRandomMmapAddr(), &allocated); if (buffer == nullptr) return nullptr; - MacroAssembler masm(isolate, buffer, static_cast<int>(allocated), - CodeObjectRequired::kNo); + MacroAssembler masm(AssemblerOptions{}, buffer, static_cast<int>(allocated)); __ MovFromFloatParameter(d0); __ vsqrt(d0, d0); @@ -282,12 +285,13 @@ UnaryMathFunctionWithIsolate CreateSqrtFunction(Isolate* isolate) { __ Ret(); CodeDesc desc; - masm.GetCode(isolate, &desc); + masm.GetCode(nullptr, &desc); DCHECK(!RelocInfo::RequiresRelocationAfterCodegen(desc)); Assembler::FlushICache(buffer, allocated); - CHECK(SetPermissions(buffer, allocated, PageAllocator::kReadExecute)); - return FUNCTION_CAST<UnaryMathFunctionWithIsolate>(buffer); + CHECK(SetPermissions(page_allocator, buffer, allocated, + PageAllocator::kReadExecute)); + return FUNCTION_CAST<UnaryMathFunction>(buffer); #endif } diff --git a/deps/v8/src/arm/interface-descriptors-arm.cc b/deps/v8/src/arm/interface-descriptors-arm.cc index 8af455fc6e..f3be7a7c4a 100644 --- a/deps/v8/src/arm/interface-descriptors-arm.cc +++ b/deps/v8/src/arm/interface-descriptors-arm.cc @@ -88,9 +88,9 @@ void CallVarargsDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { // r0 : number of arguments (on the stack, not including receiver) // r1 : the target to call - // r2 : arguments list (FixedArray) // r4 : arguments list length (untagged) - Register registers[] = {r1, r0, r2, r4}; + // r2 : arguments list (FixedArray) + Register registers[] = {r1, r0, r4, r2}; data->InitializePlatformSpecific(arraysize(registers), registers); } @@ -125,9 +125,9 @@ void ConstructVarargsDescriptor::InitializePlatformSpecific( // r0 : number of arguments (on the stack, not including receiver) // r1 : the target to call // r3 : the new target - // r2 : arguments list (FixedArray) // r4 : arguments list length (untagged) - Register registers[] = {r1, r3, r0, r2, r4}; + // r2 : arguments list (FixedArray) + Register registers[] = {r1, r3, r0, r4, r2}; data->InitializePlatformSpecific(arraysize(registers), registers); } @@ -193,7 +193,7 @@ void BinaryOpDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -void ArgumentAdaptorDescriptor::InitializePlatformSpecific( +void ArgumentsAdaptorDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = { r1, // JSFunction @@ -237,10 +237,10 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = { r0, // argument count (not including receiver) - r3, // new target + r4, // address of the first argument r1, // constructor to call + r3, // new target r2, // allocation site feedback if available, undefined otherwise - r4 // address of the first argument }; data->InitializePlatformSpecific(arraysize(registers), registers); } diff --git a/deps/v8/src/arm/macro-assembler-arm.cc b/deps/v8/src/arm/macro-assembler-arm.cc index 09db465d59..cdf9dad1d9 100644 --- a/deps/v8/src/arm/macro-assembler-arm.cc +++ b/deps/v8/src/arm/macro-assembler-arm.cc @@ -130,7 +130,7 @@ int TurboAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1, void TurboAssembler::LoadFromConstantsTable(Register destination, int constant_index) { DCHECK(isolate()->heap()->RootCanBeTreatedAsConstant( - Heap::kBuiltinsConstantsTableRootIndex)); + RootIndex::kBuiltinsConstantsTable)); // The ldr call below could end up clobbering ip when the offset does not fit // into 12 bits (and thus needs to be loaded from the constant pool). In that @@ -147,7 +147,7 @@ void TurboAssembler::LoadFromConstantsTable(Register destination, reg = r7; } - LoadRoot(reg, Heap::kBuiltinsConstantsTableRootIndex); + LoadRoot(reg, RootIndex::kBuiltinsConstantsTable); ldr(destination, MemOperand(reg, offset)); if (could_clobber_ip) { @@ -527,7 +527,7 @@ void MacroAssembler::Store(Register src, } } -void TurboAssembler::LoadRoot(Register destination, Heap::RootListIndex index, +void TurboAssembler::LoadRoot(Register destination, RootIndex index, Condition cond) { ldr(destination, MemOperand(kRootRegister, RootRegisterOffset(index)), cond); } @@ -615,8 +615,6 @@ void TurboAssembler::CallRecordWriteStub( RecordWriteDescriptor::kObject)); Register slot_parameter( callable.descriptor().GetRegisterParameter(RecordWriteDescriptor::kSlot)); - Register isolate_parameter(callable.descriptor().GetRegisterParameter( - RecordWriteDescriptor::kIsolate)); Register remembered_set_parameter(callable.descriptor().GetRegisterParameter( RecordWriteDescriptor::kRememberedSet)); Register fp_mode_parameter(callable.descriptor().GetRegisterParameter( @@ -628,7 +626,6 @@ void TurboAssembler::CallRecordWriteStub( Pop(slot_parameter); Pop(object_parameter); - Move(isolate_parameter, ExternalReference::isolate_address(isolate())); Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action)); Move(fp_mode_parameter, Smi::FromEnum(fp_mode)); Call(callable.code(), RelocInfo::CODE_TARGET); @@ -1520,7 +1517,7 @@ void MacroAssembler::InvokeFunctionCode(Register function, Register new_target, // Clear the new.target register if not given. if (!new_target.is_valid()) { - LoadRoot(r3, Heap::kUndefinedValueRootIndex); + LoadRoot(r3, RootIndex::kUndefinedValue); } Label done; @@ -1642,9 +1639,7 @@ void MacroAssembler::CompareInstanceType(Register map, cmp(type_reg, Operand(type)); } - -void MacroAssembler::CompareRoot(Register obj, - Heap::RootListIndex index) { +void MacroAssembler::CompareRoot(Register obj, RootIndex index) { UseScratchRegisterScope temps(this); Register scratch = temps.Acquire(); DCHECK(obj != scratch); @@ -2053,7 +2048,7 @@ void MacroAssembler::AssertUndefinedOrAllocationSite(Register object, if (emit_debug_code()) { Label done_checking; AssertNotSmi(object); - CompareRoot(object, Heap::kUndefinedValueRootIndex); + CompareRoot(object, RootIndex::kUndefinedValue); b(eq, &done_checking); ldr(scratch, FieldMemOperand(object, HeapObject::kMapOffset)); CompareInstanceType(scratch, scratch, ALLOCATION_SITE_TYPE); diff --git a/deps/v8/src/arm/macro-assembler-arm.h b/deps/v8/src/arm/macro-assembler-arm.h index 055b6e6fbc..ef75c3fe4c 100644 --- a/deps/v8/src/arm/macro-assembler-arm.h +++ b/deps/v8/src/arm/macro-assembler-arm.h @@ -71,6 +71,9 @@ enum TargetAddressStorageMode { class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { public: + TurboAssembler(const AssemblerOptions& options, void* buffer, int buffer_size) + : TurboAssemblerBase(options, buffer, buffer_size) {} + TurboAssembler(Isolate* isolate, const AssemblerOptions& options, void* buffer, int buffer_size, CodeObjectRequired create_code_object) @@ -481,11 +484,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { } // Load an object from the root table. - void LoadRoot(Register destination, Heap::RootListIndex index) override { + void LoadRoot(Register destination, RootIndex index) override { LoadRoot(destination, index, al); } - void LoadRoot(Register destination, Heap::RootListIndex index, - Condition cond); + void LoadRoot(Register destination, RootIndex index, Condition cond); // Jump if the register contains a smi. void JumpIfSmi(Register value, Label* smi_label); @@ -566,10 +568,14 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { // MacroAssembler implements a collection of frequently used macros. class MacroAssembler : public TurboAssembler { public: + MacroAssembler(const AssemblerOptions& options, void* buffer, int size) + : TurboAssembler(options, buffer, size) {} + MacroAssembler(Isolate* isolate, void* buffer, int size, CodeObjectRequired create_code_object) : MacroAssembler(isolate, AssemblerOptions::Default(isolate), buffer, size, create_code_object) {} + MacroAssembler(Isolate* isolate, const AssemblerOptions& options, void* buffer, int size, CodeObjectRequired create_code_object); @@ -713,8 +719,8 @@ class MacroAssembler : public TurboAssembler { // Compare the object in a register to a value from the root list. // Acquires a scratch register. - void CompareRoot(Register obj, Heap::RootListIndex index); - void PushRoot(Heap::RootListIndex index) { + void CompareRoot(Register obj, RootIndex index); + void PushRoot(RootIndex index) { UseScratchRegisterScope temps(this); Register scratch = temps.Acquire(); LoadRoot(scratch, index); @@ -722,14 +728,13 @@ class MacroAssembler : public TurboAssembler { } // Compare the object in a register to a value and jump if they are equal. - void JumpIfRoot(Register with, Heap::RootListIndex index, Label* if_equal) { + void JumpIfRoot(Register with, RootIndex index, Label* if_equal) { CompareRoot(with, index); b(eq, if_equal); } // Compare the object in a register to a value and jump if they are not equal. - void JumpIfNotRoot(Register with, Heap::RootListIndex index, - Label* if_not_equal) { + void JumpIfNotRoot(Register with, RootIndex index, Label* if_not_equal) { CompareRoot(with, index); b(ne, if_not_equal); } diff --git a/deps/v8/src/arm/simulator-arm.cc b/deps/v8/src/arm/simulator-arm.cc index b1e8421876..e9d74104d3 100644 --- a/deps/v8/src/arm/simulator-arm.cc +++ b/deps/v8/src/arm/simulator-arm.cc @@ -3212,15 +3212,15 @@ void Simulator::DecodeTypeVFP(Instruction* instr) { DecodeVCMP(instr); } else if (((instr->Opc2Value() == 0x1)) && (instr->Opc3Value() == 0x3)) { // vsqrt - lazily_initialize_fast_sqrt(isolate_); + lazily_initialize_fast_sqrt(); if (instr->SzValue() == 0x1) { double dm_value = get_double_from_d_register(vm).get_scalar(); - double dd_value = fast_sqrt(dm_value, isolate_); + double dd_value = fast_sqrt(dm_value); dd_value = canonicalizeNaN(dd_value); set_d_register_from_double(vd, dd_value); } else { float sm_value = get_float_from_s_register(m).get_scalar(); - float sd_value = fast_sqrt(sm_value, isolate_); + float sd_value = fast_sqrt(sm_value); sd_value = canonicalizeNaN(sd_value); set_s_register_from_float(d, sd_value); } @@ -5282,10 +5282,10 @@ void Simulator::DecodeSpecialCondition(Instruction* instr) { src[i] = bit_cast<uint32_t>(result); } } else { - lazily_initialize_fast_sqrt(isolate_); + lazily_initialize_fast_sqrt(); for (int i = 0; i < 4; i++) { float radicand = bit_cast<float>(src[i]); - float result = 1.0f / fast_sqrt(radicand, isolate_); + float result = 1.0f / fast_sqrt(radicand); result = canonicalizeNaN(result); src[i] = bit_cast<uint32_t>(result); } |