Index: src/ic/s390/handler-compiler-s390.cc |
diff --git a/src/ic/ppc/handler-compiler-ppc.cc b/src/ic/s390/handler-compiler-s390.cc |
similarity index 92% |
copy from src/ic/ppc/handler-compiler-ppc.cc |
copy to src/ic/s390/handler-compiler-s390.cc |
index 6e7d78afd3ef315a75899cc95339680d9be31751..3e25080d9df30b0c3ba75acfd584b2612eff431a 100644 |
--- a/src/ic/ppc/handler-compiler-ppc.cc |
+++ b/src/ic/s390/handler-compiler-s390.cc |
@@ -1,8 +1,8 @@ |
-// Copyright 2014 the V8 project authors. All rights reserved. |
+// Copyright 2015 the V8 project authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#if V8_TARGET_ARCH_PPC |
+#if V8_TARGET_ARCH_S390 |
#include "src/ic/handler-compiler.h" |
@@ -16,17 +16,16 @@ namespace internal { |
#define __ ACCESS_MASM(masm) |
- |
void NamedLoadHandlerCompiler::GenerateLoadViaGetter( |
MacroAssembler* masm, Handle<Map> map, Register receiver, Register holder, |
int accessor_index, int expected_arguments, Register scratch) { |
// ----------- S t a t e ------------- |
- // -- r3 : receiver |
- // -- r5 : name |
+ // -- r2 : receiver |
+ // -- r4 : name |
// -- lr : return address |
// ----------------------------------- |
{ |
- FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
if (accessor_index >= 0) { |
DCHECK(!holder.is(scratch)); |
@@ -38,11 +37,11 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter( |
FieldMemOperand(receiver, JSGlobalObject::kGlobalProxyOffset)); |
receiver = scratch; |
} |
- __ push(receiver); |
+ __ Push(receiver); |
ParameterCount actual(0); |
ParameterCount expected(expected_arguments); |
- __ LoadAccessor(r4, holder, accessor_index, ACCESSOR_GETTER); |
- __ InvokeFunction(r4, expected, actual, CALL_FUNCTION, |
+ __ LoadAccessor(r3, holder, accessor_index, ACCESSOR_GETTER); |
+ __ InvokeFunction(r3, expected, actual, CALL_FUNCTION, |
CheckDebugStepCallWrapper()); |
} else { |
// If we generate a global code snippet for deoptimization only, remember |
@@ -56,7 +55,6 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter( |
__ Ret(); |
} |
- |
void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
MacroAssembler* masm, Handle<Map> map, Register receiver, Register holder, |
int accessor_index, int expected_arguments, Register scratch) { |
@@ -64,10 +62,10 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
// -- lr : return address |
// ----------------------------------- |
{ |
- FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
// Save value register, so we can restore it later. |
- __ push(value()); |
+ __ Push(value()); |
if (accessor_index >= 0) { |
DCHECK(!holder.is(scratch)); |
@@ -83,8 +81,8 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
__ Push(receiver, value()); |
ParameterCount actual(1); |
ParameterCount expected(expected_arguments); |
- __ LoadAccessor(r4, holder, accessor_index, ACCESSOR_SETTER); |
- __ InvokeFunction(r4, expected, actual, CALL_FUNCTION, |
+ __ LoadAccessor(r3, holder, accessor_index, ACCESSOR_SETTER); |
+ __ InvokeFunction(r3, expected, actual, CALL_FUNCTION, |
CheckDebugStepCallWrapper()); |
} else { |
// If we generate a global code snippet for deoptimization only, remember |
@@ -93,7 +91,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
} |
// We have to return the passed value, not the return value of the setter. |
- __ pop(r3); |
+ __ Pop(r2); |
// Restore context register. |
__ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
@@ -101,27 +99,23 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
__ Ret(); |
} |
- |
void PropertyHandlerCompiler::PushVectorAndSlot(Register vector, |
Register slot) { |
MacroAssembler* masm = this->masm(); |
__ Push(vector, slot); |
} |
- |
void PropertyHandlerCompiler::PopVectorAndSlot(Register vector, Register slot) { |
MacroAssembler* masm = this->masm(); |
__ Pop(vector, slot); |
} |
- |
void PropertyHandlerCompiler::DiscardVectorAndSlot() { |
MacroAssembler* masm = this->masm(); |
// Remove vector and slot. |
- __ addi(sp, sp, Operand(2 * kPointerSize)); |
+ __ la(sp, MemOperand(sp, 2 * kPointerSize)); |
} |
- |
void PropertyHandlerCompiler::GenerateDictionaryNegativeLookup( |
MacroAssembler* masm, Label* miss_label, Register receiver, |
Handle<Name> name, Register scratch0, Register scratch1) { |
@@ -139,13 +133,14 @@ void PropertyHandlerCompiler::GenerateDictionaryNegativeLookup( |
// Bail out if the receiver has a named interceptor or requires access checks. |
Register map = scratch1; |
__ LoadP(map, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
- __ lbz(scratch0, FieldMemOperand(map, Map::kBitFieldOffset)); |
- __ andi(r0, scratch0, Operand(kInterceptorOrAccessCheckNeededMask)); |
- __ bne(miss_label, cr0); |
+ __ LoadlB(scratch0, FieldMemOperand(map, Map::kBitFieldOffset)); |
+ __ AndP(r0, scratch0, Operand(kInterceptorOrAccessCheckNeededMask)); |
+ __ bne(miss_label); |
// Check that receiver is a JSObject. |
- __ lbz(scratch0, FieldMemOperand(map, Map::kInstanceTypeOffset)); |
- __ cmpi(scratch0, Operand(FIRST_JS_RECEIVER_TYPE)); |
+ // TODO(joransiu): Merge into SI compare |
+ __ LoadlB(scratch0, FieldMemOperand(map, Map::kInstanceTypeOffset)); |
+ __ CmpP(scratch0, Operand(FIRST_JS_RECEIVER_TYPE)); |
__ blt(miss_label); |
// Load properties array. |
@@ -153,22 +148,18 @@ void PropertyHandlerCompiler::GenerateDictionaryNegativeLookup( |
__ LoadP(properties, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); |
// Check that the properties array is a dictionary. |
__ LoadP(map, FieldMemOperand(properties, HeapObject::kMapOffset)); |
- Register tmp = properties; |
- __ LoadRoot(tmp, Heap::kHashTableMapRootIndex); |
- __ cmp(map, tmp); |
+ __ CompareRoot(map, Heap::kHashTableMapRootIndex); |
__ bne(miss_label); |
// Restore the temporarily used register. |
__ LoadP(properties, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); |
- |
NameDictionaryLookupStub::GenerateNegativeLookup( |
masm, miss_label, &done, receiver, properties, name, scratch1); |
__ bind(&done); |
__ DecrementCounter(counters->negative_lookups_miss(), 1, scratch0, scratch1); |
} |
- |
void NamedLoadHandlerCompiler::GenerateDirectLoadGlobalFunctionPrototype( |
MacroAssembler* masm, int index, Register result, Label* miss) { |
__ LoadNativeContextSlot(index, result); |
@@ -179,16 +170,14 @@ void NamedLoadHandlerCompiler::GenerateDirectLoadGlobalFunctionPrototype( |
__ LoadP(result, FieldMemOperand(result, Map::kPrototypeOffset)); |
} |
- |
void NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype( |
MacroAssembler* masm, Register receiver, Register scratch1, |
Register scratch2, Label* miss_label) { |
__ TryGetFunctionPrototype(receiver, scratch1, scratch2, miss_label); |
- __ mr(r3, scratch1); |
+ __ LoadRR(r2, scratch1); |
__ Ret(); |
} |
- |
// Generate code to check that a global property cell is empty. Create |
// the property cell at compilation time if no cell exists for the |
// property. |
@@ -200,12 +189,10 @@ void PropertyHandlerCompiler::GenerateCheckPropertyCell( |
Handle<WeakCell> weak_cell = masm->isolate()->factory()->NewWeakCell(cell); |
__ LoadWeakValue(scratch, weak_cell, miss); |
__ LoadP(scratch, FieldMemOperand(scratch, PropertyCell::kValueOffset)); |
- __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
- __ cmp(scratch, ip); |
+ __ CompareRoot(scratch, Heap::kTheHoleValueRootIndex); |
__ bne(miss); |
} |
- |
static void PushInterceptorArguments(MacroAssembler* masm, Register receiver, |
Register holder, Register name, |
Handle<JSObject> holder_obj) { |
@@ -213,12 +200,11 @@ static void PushInterceptorArguments(MacroAssembler* masm, Register receiver, |
STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex == 1); |
STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex == 2); |
STATIC_ASSERT(NamedLoadHandlerCompiler::kInterceptorArgsLength == 3); |
- __ push(name); |
- __ push(receiver); |
- __ push(holder); |
+ __ Push(name); |
+ __ Push(receiver); |
+ __ Push(holder); |
} |
- |
static void CompileCallLoadPropertyWithInterceptor( |
MacroAssembler* masm, Register receiver, Register holder, Register name, |
Handle<JSObject> holder_obj, Runtime::FunctionId id) { |
@@ -228,7 +214,6 @@ static void CompileCallLoadPropertyWithInterceptor( |
__ CallRuntime(id); |
} |
- |
// Generate call to api function. |
void PropertyHandlerCompiler::GenerateApiAccessorCall( |
MacroAssembler* masm, const CallOptimization& optimization, |
@@ -237,20 +222,20 @@ void PropertyHandlerCompiler::GenerateApiAccessorCall( |
int accessor_index) { |
DCHECK(!accessor_holder.is(scratch_in)); |
DCHECK(!receiver.is(scratch_in)); |
- __ push(receiver); |
+ __ Push(receiver); |
// Write the arguments to stack frame. |
if (is_store) { |
DCHECK(!receiver.is(store_parameter)); |
DCHECK(!scratch_in.is(store_parameter)); |
- __ push(store_parameter); |
+ __ Push(store_parameter); |
} |
DCHECK(optimization.is_simple_api_call()); |
// Abi for CallApiFunctionStub. |
- Register callee = r3; |
- Register data = r7; |
- Register holder = r5; |
- Register api_function_address = r4; |
+ Register callee = r2; |
+ Register data = r6; |
+ Register holder = r4; |
+ Register api_function_address = r3; |
// Put callee in place. |
__ LoadAccessor(callee, accessor_holder, accessor_index, |
@@ -320,7 +305,6 @@ void PropertyHandlerCompiler::GenerateApiAccessorCall( |
__ TailCallStub(&stub); |
} |
- |
static void StoreIC_PushArgs(MacroAssembler* masm) { |
__ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
StoreDescriptor::ValueRegister(), |
@@ -328,7 +312,6 @@ static void StoreIC_PushArgs(MacroAssembler* masm) { |
VectorStoreICDescriptor::VectorRegister()); |
} |
- |
void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) { |
StoreIC_PushArgs(masm); |
@@ -337,7 +320,6 @@ void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) { |
__ TailCallRuntime(Runtime::kStoreIC_Slow); |
} |
- |
void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) { |
StoreIC_PushArgs(masm); |
@@ -346,11 +328,9 @@ void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) { |
__ TailCallRuntime(Runtime::kKeyedStoreIC_Slow); |
} |
- |
#undef __ |
#define __ ACCESS_MASM(masm()) |
- |
void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label, |
Handle<Name> name) { |
if (!label->is_unused()) { |
@@ -359,18 +339,15 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label, |
} |
} |
- |
void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) { |
__ mov(this->name(), Operand(name)); |
} |
- |
void NamedStoreHandlerCompiler::RearrangeVectorAndSlot( |
Register current_map, Register destination_map) { |
DCHECK(false); // Not implemented. |
} |
- |
void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition, |
Register map_reg, |
Register scratch, |
@@ -379,13 +356,12 @@ void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition, |
DCHECK(!map_reg.is(scratch)); |
__ LoadWeakValue(map_reg, cell, miss); |
if (transition->CanBeDeprecated()) { |
- __ lwz(scratch, FieldMemOperand(map_reg, Map::kBitField3Offset)); |
- __ DecodeField<Map::Deprecated>(r0, scratch, SetRC); |
- __ bne(miss, cr0); |
+ __ LoadlW(scratch, FieldMemOperand(map_reg, Map::kBitField3Offset)); |
+ __ DecodeField<Map::Deprecated>(r0, scratch); |
+ __ bne(miss); |
} |
} |
- |
void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg, |
int descriptor, |
Register value_reg, |
@@ -395,9 +371,8 @@ void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg, |
DCHECK(!map_reg.is(value_reg)); |
DCHECK(!value_reg.is(scratch)); |
__ LoadInstanceDescriptors(map_reg, scratch); |
- __ LoadP(scratch, FieldMemOperand( |
- scratch, DescriptorArray::GetValueOffset(descriptor))); |
- __ cmp(value_reg, scratch); |
+ __ CmpP(value_reg, FieldMemOperand( |
+ scratch, DescriptorArray::GetValueOffset(descriptor))); |
__ bne(miss_label); |
} |
@@ -417,7 +392,6 @@ void NamedStoreHandlerCompiler::GenerateFieldTypeChecks(FieldType* field_type, |
} |
} |
- |
Register PropertyHandlerCompiler::CheckPrototypes( |
Register object_reg, Register holder_reg, Register scratch1, |
Register scratch2, Handle<Name> name, Label* miss, PrototypeCheckType check, |
@@ -554,7 +528,6 @@ Register PropertyHandlerCompiler::CheckPrototypes( |
return return_holder ? reg : no_reg; |
} |
- |
void NamedLoadHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
if (!miss->is_unused()) { |
Label success; |
@@ -569,7 +542,6 @@ void NamedLoadHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
} |
} |
- |
void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
if (!miss->is_unused()) { |
Label success; |
@@ -581,14 +553,12 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
} |
} |
- |
void NamedLoadHandlerCompiler::GenerateLoadConstant(Handle<Object> value) { |
// Return the constant value. |
- __ Move(r3, value); |
+ __ Move(r2, value); |
__ Ret(); |
} |
- |
void NamedLoadHandlerCompiler::GenerateLoadCallback( |
Register reg, Handle<AccessorInfo> callback) { |
DCHECK(!AreAliased(scratch2(), scratch3(), scratch4(), receiver())); |
@@ -605,7 +575,7 @@ void NamedLoadHandlerCompiler::GenerateLoadCallback( |
STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 6); |
STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 7); |
- __ push(receiver()); |
+ __ Push(receiver()); |
// Push data from AccessorInfo. |
Handle<Object> data(callback->data(), isolate()); |
if (data->IsUndefined() || data->IsSmi()) { |
@@ -638,7 +608,6 @@ void NamedLoadHandlerCompiler::GenerateLoadCallback( |
__ TailCallStub(&stub); |
} |
- |
void NamedLoadHandlerCompiler::GenerateLoadInterceptorWithFollowup( |
LookupIterator* it, Register holder_reg) { |
DCHECK(holder()->HasNamedInterceptor()); |
@@ -662,7 +631,7 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptorWithFollowup( |
// Save necessary data before invoking an interceptor. |
// Requires a frame to make GC aware of pushed pointers. |
{ |
- FrameAndConstantPoolScope frame_scope(masm(), StackFrame::INTERNAL); |
+ FrameScope frame_scope(masm(), StackFrame::INTERNAL); |
if (must_preserve_receiver_reg) { |
__ Push(receiver(), holder_reg, this->name()); |
} else { |
@@ -679,18 +648,17 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptorWithFollowup( |
// Check if interceptor provided a value for property. If it's |
// the case, return immediately. |
Label interceptor_failed; |
- __ LoadRoot(scratch1(), Heap::kNoInterceptorResultSentinelRootIndex); |
- __ cmp(r3, scratch1()); |
- __ beq(&interceptor_failed); |
+ __ CompareRoot(r2, Heap::kNoInterceptorResultSentinelRootIndex); |
+ __ beq(&interceptor_failed, Label::kNear); |
frame_scope.GenerateLeaveFrame(); |
__ Ret(); |
__ bind(&interceptor_failed); |
InterceptorVectorSlotPop(holder_reg); |
- __ pop(this->name()); |
- __ pop(holder_reg); |
+ __ Pop(this->name()); |
+ __ Pop(holder_reg); |
if (must_preserve_receiver_reg) { |
- __ pop(receiver()); |
+ __ Pop(receiver()); |
} |
// Leave the internal frame. |
} |
@@ -698,7 +666,6 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptorWithFollowup( |
GenerateLoadPostInterceptor(it, holder_reg); |
} |
- |
void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) { |
// Call the runtime system to load the interceptor. |
DCHECK(holder()->HasNamedInterceptor()); |
@@ -709,7 +676,6 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) { |
__ TailCallRuntime(Runtime::kLoadPropertyWithInterceptor); |
} |
- |
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( |
Handle<JSObject> object, Handle<Name> name, Handle<AccessorInfo> callback, |
LanguageMode language_mode) { |
@@ -725,7 +691,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( |
Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(callback); |
__ mov(ip, Operand(cell)); |
} |
- __ push(ip); |
+ __ Push(ip); |
__ mov(ip, Operand(name)); |
__ Push(ip, value()); |
__ Push(Smi::FromInt(language_mode)); |
@@ -737,7 +703,6 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( |
return GetCode(kind(), Code::FAST, name); |
} |
- |
Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor( |
Handle<Name> name) { |
__ Push(receiver(), this->name(), value()); |
@@ -749,12 +714,10 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor( |
return GetCode(kind(), Code::FAST, name); |
} |
- |
Register NamedStoreHandlerCompiler::value() { |
return StoreDescriptor::ValueRegister(); |
} |
- |
Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( |
Handle<PropertyCell> cell, Handle<Name> name, bool is_configurable) { |
Label miss; |
@@ -771,13 +734,12 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( |
// Check for deleted property if property can actually be deleted. |
if (is_configurable) { |
- __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
- __ cmp(result, ip); |
+ __ CompareRoot(result, Heap::kTheHoleValueRootIndex); |
__ beq(&miss); |
} |
Counters* counters = isolate()->counters(); |
- __ IncrementCounter(counters->ic_named_load_global_stub(), 1, r4, r6); |
+ __ IncrementCounter(counters->ic_named_load_global_stub(), 1, r3, r5); |
if (IC::ICUseVector(kind())) { |
DiscardVectorAndSlot(); |
} |
@@ -789,7 +751,6 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( |
return GetCode(kind(), Code::NORMAL, name); |
} |
- |
#undef __ |
} // namespace internal |
} // namespace v8 |