Index: src/ppc/lithium-codegen-ppc.h |
diff --git a/src/arm/lithium-codegen-arm.h b/src/ppc/lithium-codegen-ppc.h |
similarity index 66% |
copy from src/arm/lithium-codegen-arm.h |
copy to src/ppc/lithium-codegen-ppc.h |
index 65cc213453b9ed581573225bf00a6c0b4e2b7cff..8ae3b3c5d37c071f1a933a0b5497bd5fad51597d 100644 |
--- a/src/arm/lithium-codegen-arm.h |
+++ b/src/ppc/lithium-codegen-ppc.h |
@@ -1,13 +1,13 @@ |
-// Copyright 2012 the V8 project authors. All rights reserved. |
+// Copyright 2014 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. |
-#ifndef V8_ARM_LITHIUM_CODEGEN_ARM_H_ |
-#define V8_ARM_LITHIUM_CODEGEN_ARM_H_ |
+#ifndef V8_PPC_LITHIUM_CODEGEN_PPC_H_ |
+#define V8_PPC_LITHIUM_CODEGEN_PPC_H_ |
-#include "src/arm/lithium-arm.h" |
+#include "src/ppc/lithium-ppc.h" |
-#include "src/arm/lithium-gap-resolver-arm.h" |
+#include "src/ppc/lithium-gap-resolver-ppc.h" |
#include "src/deoptimizer.h" |
#include "src/lithium-codegen.h" |
#include "src/safepoint-table.h" |
@@ -21,7 +21,7 @@ namespace internal { |
class LDeferredCode; |
class SafepointGenerator; |
-class LCodeGen: public LCodeGenBase { |
+class LCodeGen : public LCodeGenBase { |
public: |
LCodeGen(LChunk* chunk, MacroAssembler* assembler, CompilationInfo* info) |
: LCodeGenBase(chunk, assembler, info), |
@@ -50,10 +50,8 @@ class LCodeGen: public LCodeGenBase { |
} |
bool NeedsEagerFrame() const { |
- return GetStackSlotCount() > 0 || |
- info()->is_non_deferred_calling() || |
- !info()->IsStub() || |
- info()->requires_frame(); |
+ return GetStackSlotCount() > 0 || info()->is_non_deferred_calling() || |
+ !info()->IsStub() || info()->requires_frame(); |
} |
bool NeedsDeferredFrame() const { |
return !NeedsEagerFrame() && info()->is_deferred_calling(); |
@@ -70,14 +68,14 @@ class LCodeGen: public LCodeGenBase { |
// LOperand is loaded into scratch, unless already a register. |
Register EmitLoadRegister(LOperand* op, Register scratch); |
+ // LConstantOperand must be an Integer32 or Smi |
+ void EmitLoadIntegerConstant(LConstantOperand* const_op, Register dst); |
+ |
// LOperand must be a double register. |
- DwVfpRegister ToDoubleRegister(LOperand* op) const; |
+ DoubleRegister ToDoubleRegister(LOperand* op) const; |
- // LOperand is loaded into dbl_scratch, unless already a double register. |
- DwVfpRegister EmitLoadDoubleRegister(LOperand* op, |
- SwVfpRegister flt_scratch, |
- DwVfpRegister dbl_scratch); |
- int32_t ToRepresentation(LConstantOperand* op, const Representation& r) const; |
+ intptr_t ToRepresentation(LConstantOperand* op, |
+ const Representation& r) const; |
int32_t ToInteger32(LConstantOperand* op) const; |
Smi* ToSmi(LConstantOperand* op) const; |
double ToDouble(LConstantOperand* op) const; |
@@ -103,10 +101,8 @@ class LCodeGen: public LCodeGenBase { |
void DoDeferredNumberTagD(LNumberTagD* instr); |
enum IntegerSignedness { SIGNED_INT32, UNSIGNED_INT32 }; |
- void DoDeferredNumberTagIU(LInstruction* instr, |
- LOperand* value, |
- LOperand* temp1, |
- LOperand* temp2, |
+ void DoDeferredNumberTagIU(LInstruction* instr, LOperand* value, |
+ LOperand* temp1, LOperand* temp2, |
IntegerSignedness signedness); |
void DoDeferredTaggedToI(LTaggedToI* instr); |
@@ -116,29 +112,24 @@ class LCodeGen: public LCodeGenBase { |
void DoDeferredStringCharFromCode(LStringCharFromCode* instr); |
void DoDeferredAllocate(LAllocate* instr); |
void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, |
- Label* map_check, Label* bool_load); |
+ Label* map_check); |
void DoDeferredInstanceMigration(LCheckMaps* instr, Register object); |
- void DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, |
- Register result, |
- Register object, |
- Register index); |
+ void DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, Register result, |
+ Register object, Register index); |
// Parallel move support. |
void DoParallelMove(LParallelMove* move); |
void DoGap(LGap* instr); |
- MemOperand PrepareKeyedOperand(Register key, |
- Register base, |
- bool key_is_constant, |
- int constant_key, |
- int element_size, |
- int shift_size, |
+ MemOperand PrepareKeyedOperand(Register key, Register base, |
+ bool key_is_constant, bool key_is_tagged, |
+ int constant_key, int element_size_shift, |
int base_offset); |
// Emit frame translation commands for an environment. |
void WriteTranslation(LEnvironment* environment, Translation* translation); |
- // Declare methods that deal with the individual node types. |
+// Declare methods that deal with the individual node types. |
#define DECLARE_DO(type) void Do##type(L##type* node); |
LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_DO) |
#undef DECLARE_DO |
@@ -148,17 +139,14 @@ class LCodeGen: public LCodeGenBase { |
Scope* scope() const { return scope_; } |
- Register scratch0() { return r9; } |
- LowDwVfpRegister double_scratch0() { return kScratchDoubleReg; } |
+ Register scratch0() { return r11; } |
+ DoubleRegister double_scratch0() { return kScratchDoubleReg; } |
LInstruction* GetNextInstruction(); |
- void EmitClassOfTest(Label* if_true, |
- Label* if_false, |
- Handle<String> class_name, |
- Register input, |
- Register temporary, |
- Register temporary2); |
+ void EmitClassOfTest(Label* if_true, Label* if_false, |
+ Handle<String> class_name, Register input, |
+ Register temporary, Register temporary2); |
int GetStackSlotCount() const { return chunk()->spill_slot_count(); } |
@@ -183,51 +171,32 @@ class LCodeGen: public LCodeGenBase { |
RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS |
}; |
- int CallCodeSize(Handle<Code> code, RelocInfo::Mode mode); |
- |
- void CallCode( |
- Handle<Code> code, |
- RelocInfo::Mode mode, |
- LInstruction* instr, |
- TargetAddressStorageMode storage_mode = CAN_INLINE_TARGET_ADDRESS); |
+ void CallCode(Handle<Code> code, RelocInfo::Mode mode, LInstruction* instr); |
- void CallCodeGeneric( |
- Handle<Code> code, |
- RelocInfo::Mode mode, |
- LInstruction* instr, |
- SafepointMode safepoint_mode, |
- TargetAddressStorageMode storage_mode = CAN_INLINE_TARGET_ADDRESS); |
+ void CallCodeGeneric(Handle<Code> code, RelocInfo::Mode mode, |
+ LInstruction* instr, SafepointMode safepoint_mode); |
- void CallRuntime(const Runtime::Function* function, |
- int num_arguments, |
+ void CallRuntime(const Runtime::Function* function, int num_arguments, |
LInstruction* instr, |
SaveFPRegsMode save_doubles = kDontSaveFPRegs); |
- void CallRuntime(Runtime::FunctionId id, |
- int num_arguments, |
+ void CallRuntime(Runtime::FunctionId id, int num_arguments, |
LInstruction* instr) { |
const Runtime::Function* function = Runtime::FunctionForId(id); |
CallRuntime(function, num_arguments, instr); |
} |
void LoadContextFromDeferred(LOperand* context); |
- void CallRuntimeFromDeferred(Runtime::FunctionId id, |
- int argc, |
- LInstruction* instr, |
- LOperand* context); |
- |
- enum R1State { |
- R1_UNINITIALIZED, |
- R1_CONTAINS_TARGET |
- }; |
+ void CallRuntimeFromDeferred(Runtime::FunctionId id, int argc, |
+ LInstruction* instr, LOperand* context); |
+ |
+ enum R4State { R4_UNINITIALIZED, R4_CONTAINS_TARGET }; |
// Generate a direct call to a known function. Expects the function |
- // to be in r1. |
+ // to be in r4. |
void CallKnownFunction(Handle<JSFunction> function, |
- int formal_parameter_count, |
- int arity, |
- LInstruction* instr, |
- R1State r1_state); |
+ int formal_parameter_count, int arity, |
+ LInstruction* instr, R4State r4_state); |
void RecordSafepointWithLazyDeopt(LInstruction* instr, |
SafepointMode safepoint_mode); |
@@ -235,15 +204,13 @@ class LCodeGen: public LCodeGenBase { |
void RegisterEnvironmentForDeoptimization(LEnvironment* environment, |
Safepoint::DeoptMode mode); |
void DeoptimizeIf(Condition condition, LInstruction* instr, |
- const char* detail, Deoptimizer::BailoutType bailout_type); |
+ const char* detail, Deoptimizer::BailoutType bailout_type, |
+ CRegister cr = cr7); |
void DeoptimizeIf(Condition condition, LInstruction* instr, |
- const char* detail); |
+ const char* detail, CRegister cr = cr7); |
- void AddToTranslation(LEnvironment* environment, |
- Translation* translation, |
- LOperand* op, |
- bool is_tagged, |
- bool is_uint32, |
+ void AddToTranslation(LEnvironment* environment, Translation* translation, |
+ LOperand* op, bool is_tagged, bool is_uint32, |
int* object_index_pointer, |
int* dematerialized_index_pointer); |
void PopulateDeoptimizationData(Handle<Code> code); |
@@ -252,60 +219,54 @@ class LCodeGen: public LCodeGenBase { |
void PopulateDeoptimizationLiteralsWithInlinedFunctions(); |
Register ToRegister(int index) const; |
- DwVfpRegister ToDoubleRegister(int index) const; |
+ DoubleRegister ToDoubleRegister(int index) const; |
- MemOperand BuildSeqStringOperand(Register string, |
- LOperand* index, |
+ MemOperand BuildSeqStringOperand(Register string, LOperand* index, |
String::Encoding encoding); |
- void EmitIntegerMathAbs(LMathAbs* instr); |
+ void EmitMathAbs(LMathAbs* instr); |
+#if V8_TARGET_ARCH_PPC64 |
+ void EmitInteger32MathAbs(LMathAbs* instr); |
+#endif |
// Support for recording safepoint and position information. |
- void RecordSafepoint(LPointerMap* pointers, |
- Safepoint::Kind kind, |
- int arguments, |
- Safepoint::DeoptMode mode); |
+ void RecordSafepoint(LPointerMap* pointers, Safepoint::Kind kind, |
+ int arguments, Safepoint::DeoptMode mode); |
void RecordSafepoint(LPointerMap* pointers, Safepoint::DeoptMode mode); |
void RecordSafepoint(Safepoint::DeoptMode mode); |
- void RecordSafepointWithRegisters(LPointerMap* pointers, |
- int arguments, |
+ void RecordSafepointWithRegisters(LPointerMap* pointers, int arguments, |
Safepoint::DeoptMode mode); |
void RecordAndWritePosition(int position) OVERRIDE; |
- static Condition TokenToCondition(Token::Value op, bool is_unsigned); |
+ static Condition TokenToCondition(Token::Value op); |
void EmitGoto(int block); |
// EmitBranch expects to be the last instruction of a block. |
- template<class InstrType> |
- void EmitBranch(InstrType instr, Condition condition); |
- template<class InstrType> |
- void EmitFalseBranch(InstrType instr, Condition condition); |
+ template <class InstrType> |
+ void EmitBranch(InstrType instr, Condition condition, CRegister cr = cr7); |
+ template <class InstrType> |
+ void EmitFalseBranch(InstrType instr, Condition condition, |
+ CRegister cr = cr7); |
void EmitNumberUntagD(LNumberUntagD* instr, Register input, |
- DwVfpRegister result, NumberUntagDMode mode); |
+ DoubleRegister result, NumberUntagDMode mode); |
// Emits optimized code for typeof x == "y". Modifies input register. |
// Returns the condition on which a final split to |
// true and false label should be made, to optimize fallthrough. |
- Condition EmitTypeofIs(Label* true_label, |
- Label* false_label, |
- Register input, |
+ Condition EmitTypeofIs(Label* true_label, Label* false_label, Register input, |
Handle<String> type_name); |
// Emits optimized code for %_IsObject(x). Preserves input register. |
// Returns the condition on which a final split to |
// true and false label should be made, to optimize fallthrough. |
- Condition EmitIsObject(Register input, |
- Register temp1, |
- Label* is_not_object, |
+ Condition EmitIsObject(Register input, Register temp1, Label* is_not_object, |
Label* is_object); |
// Emits optimized code for %_IsString(x). Preserves input register. |
// Returns the condition on which a final split to |
// true and false label should be made, to optimize fallthrough. |
- Condition EmitIsString(Register input, |
- Register temp1, |
- Label* is_not_string, |
+ Condition EmitIsString(Register input, Register temp1, Label* is_not_string, |
SmiCheck check_needed); |
// Emits optimized code for %_IsConstructCall(). |
@@ -314,11 +275,8 @@ class LCodeGen: public LCodeGenBase { |
// Emits optimized code to deep-copy the contents of statically known |
// object graphs (e.g. object literal boilerplate). |
- void EmitDeepCopy(Handle<JSObject> object, |
- Register result, |
- Register source, |
- int* offset, |
- AllocationSiteMode mode); |
+ void EmitDeepCopy(Handle<JSObject> object, Register result, Register source, |
+ int* offset, AllocationSiteMode mode); |
void EnsureSpaceForLazyDeopt(int space_needed) OVERRIDE; |
void DoLoadKeyedExternalArray(LLoadKeyed* instr); |
@@ -357,12 +315,14 @@ class LCodeGen: public LCodeGenBase { |
DCHECK(codegen_->info()->is_calling()); |
DCHECK(codegen_->expected_safepoint_kind_ == Safepoint::kSimple); |
codegen_->expected_safepoint_kind_ = Safepoint::kWithRegisters; |
- codegen_->masm_->PushSafepointRegisters(); |
+ StoreRegistersStateStub stub(codegen_->isolate()); |
+ codegen_->masm_->CallStub(&stub); |
} |
~PushSafepointRegistersScope() { |
DCHECK(codegen_->expected_safepoint_kind_ == Safepoint::kWithRegisters); |
- codegen_->masm_->PopSafepointRegisters(); |
+ RestoreRegistersStateStub stub(codegen_->isolate()); |
+ codegen_->masm_->CallStub(&stub); |
codegen_->expected_safepoint_kind_ = Safepoint::kSimple; |
} |
@@ -406,7 +366,7 @@ class LDeferredCode : public ZoneObject { |
Label* external_exit_; |
int instruction_index_; |
}; |
+} |
+} // namespace v8::internal |
-} } // namespace v8::internal |
- |
-#endif // V8_ARM_LITHIUM_CODEGEN_ARM_H_ |
+#endif // V8_PPC_LITHIUM_CODEGEN_PPC_H_ |