Reviewers: ulan, jochen,
Description:
ARM64: Fix some stub-cache TODOs
BUG=
Please review this at https://codereview.chromium.org/208023002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+18, -21 lines):
M src/arm64/stub-cache-arm64.cc
Index: src/arm64/stub-cache-arm64.cc
diff --git a/src/arm64/stub-cache-arm64.cc b/src/arm64/stub-cache-arm64.cc
index
528e7ebe067e5ec169c02a71bf02d9dfd162df5f..0711acae0b9fd7668f182a2916bc94a72ca608e1
100644
--- a/src/arm64/stub-cache-arm64.cc
+++ b/src/arm64/stub-cache-arm64.cc
@@ -394,22 +394,21 @@ void
StoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm,
} else if (representation.IsHeapObject()) {
__ JumpIfSmi(value_reg, miss_label);
} else if (representation.IsDouble()) {
+ UseScratchRegisterScope temps(masm);
+ Register temp_double = temps.AcquireD();
+ __ SmiUntagToDouble(temp_double, value_reg, kSpeculativeUntag);
+
Label do_store, heap_number;
__ AllocateHeapNumber(storage_reg, slow, scratch1, scratch2);
- // TODO(jbramley): Is fp_scratch the most appropriate FP scratch
register?
- // It's only used in Fcmp, but it's not really safe to use it like
this.
- __ JumpIfNotSmi(value_reg, &heap_number);
- __ SmiUntagToDouble(fp_scratch, value_reg);
- __ B(&do_store);
+ __ JumpIfSmi(value_reg, &do_store);
- __ Bind(&heap_number);
__ CheckMap(value_reg, scratch1, Heap::kHeapNumberMapRootIndex,
miss_label, DONT_DO_SMI_CHECK);
- __ Ldr(fp_scratch, FieldMemOperand(value_reg,
HeapNumber::kValueOffset));
+ __ Ldr(temp_double, FieldMemOperand(value_reg,
HeapNumber::kValueOffset));
__ Bind(&do_store);
- __ Str(fp_scratch, FieldMemOperand(storage_reg,
HeapNumber::kValueOffset));
+ __ Str(temp_double, FieldMemOperand(storage_reg,
HeapNumber::kValueOffset));
}
// Stub never generated for non-global objects that require access
checks.
@@ -546,6 +545,11 @@ void
StoreStubCompiler::GenerateStoreField(MacroAssembler* masm,
} else if (representation.IsHeapObject()) {
__ JumpIfSmi(value_reg, miss_label);
} else if (representation.IsDouble()) {
+ UseScratchRegisterScope temps(masm);
+ Register temp_double = temps.AcquireD();
+
+ __ SmiUntagToDouble(temp_double, value_reg, kSpeculativeUntag);
+
// Load the double storage.
if (index < 0) {
int offset = (index * kPointerSize) + object->map()->instance_size();
@@ -559,19 +563,15 @@ void
StoreStubCompiler::GenerateStoreField(MacroAssembler* masm,
// Store the value into the storage.
Label do_store, heap_number;
- // TODO(jbramley): Is fp_scratch the most appropriate FP scratch
register?
- // It's only used in Fcmp, but it's not really safe to use it like
this.
- __ JumpIfNotSmi(value_reg, &heap_number);
- __ SmiUntagToDouble(fp_scratch, value_reg);
- __ B(&do_store);
- __ Bind(&heap_number);
+ __ JumpIfSmi(value_reg, &do_store);
+
__ CheckMap(value_reg, scratch2, Heap::kHeapNumberMapRootIndex,
miss_label, DONT_DO_SMI_CHECK);
- __ Ldr(fp_scratch, FieldMemOperand(value_reg,
HeapNumber::kValueOffset));
+ __ Ldr(temp_double, FieldMemOperand(value_reg,
HeapNumber::kValueOffset));
__ Bind(&do_store);
- __ Str(fp_scratch, FieldMemOperand(scratch1,
HeapNumber::kValueOffset));
+ __ Str(temp_double, FieldMemOperand(scratch1,
HeapNumber::kValueOffset));
// Return the value (register x0).
ASSERT(value_reg.is(x0));
@@ -1009,12 +1009,9 @@ void LoadStubCompiler::GenerateLoadCallback(
} else {
__ Mov(scratch3(), Operand(Handle<Object>(callback->data(),
isolate())));
}
- // TODO(jbramley): Find another scratch register and combine the pushes
- // together. Can we use scratch1() here?
__ LoadRoot(scratch4(), Heap::kUndefinedValueRootIndex);
- __ Push(scratch3(), scratch4());
- __ Mov(scratch3(), ExternalReference::isolate_address(isolate()));
- __ Push(scratch4(), scratch3(), reg, name());
+ __ Mov(scratch2(),
Operand(ExternalReference::isolate_address(isolate())));
+ __ Push(scratch3(), scratch4(), scratch4(), scratch2(), reg, name());
Register args_addr = scratch2();
__ Add(args_addr, __ StackPointer(), kPointerSize);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.