| 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 64%
|
| copy from src/arm/lithium-codegen-arm.h
|
| copy to src/ppc/lithium-codegen-ppc.h
|
| index ecf54cf682052dfd58298de64b6d420b331d6343..b61bbdc4a13f4abe68be8c7114f397a98fd54cf9 100644
|
| --- a/src/arm/lithium-codegen-arm.h
|
| +++ b/src/ppc/lithium-codegen-ppc.h
|
| @@ -1,13 +1,16 @@
|
| // Copyright 2012 the V8 project authors. All rights reserved.
|
| +//
|
| +// Copyright IBM Corp. 2012, 2013. 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,12 +24,12 @@ 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),
|
| deoptimizations_(4, info->zone()),
|
| - deopt_jump_table_(4, info->zone()),
|
| + jump_table_(4, info->zone()),
|
| deoptimization_literals_(8, info->zone()),
|
| inlined_function_count_(0),
|
| scope_(info->scope()),
|
| @@ -50,10 +53,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 +71,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 +104,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 +115,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 +142,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(); }
|
|
|
| @@ -172,7 +163,7 @@ class LCodeGen: public LCodeGenBase {
|
| void GenerateBodyInstructionPre(LInstruction* instr) OVERRIDE;
|
| bool GeneratePrologue();
|
| bool GenerateDeferredCode();
|
| - bool GenerateDeoptJumpTable();
|
| + bool GenerateJumpTable();
|
| bool GenerateSafepointTable();
|
|
|
| // Generates the custom OSR entrypoint and sets the osr_pc_offset.
|
| @@ -183,67 +174,46 @@ 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);
|
|
|
| void RegisterEnvironmentForDeoptimization(LEnvironment* environment,
|
| Safepoint::DeoptMode mode);
|
| - void DeoptimizeIf(Condition condition,
|
| - LEnvironment* environment,
|
| - Deoptimizer::BailoutType bailout_type);
|
| - void DeoptimizeIf(Condition condition, LEnvironment* environment);
|
| -
|
| - void AddToTranslation(LEnvironment* environment,
|
| - Translation* translation,
|
| - LOperand* op,
|
| - bool is_tagged,
|
| - bool is_uint32,
|
| + void DeoptimizeIf(Condition condition, LInstruction* instr,
|
| + const char* detail, Deoptimizer::BailoutType bailout_type,
|
| + CRegister cr = cr7);
|
| + void DeoptimizeIf(Condition condition, LInstruction* instr,
|
| + CRegister cr = cr7, const char* detail = NULL);
|
| +
|
| + 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,64 +222,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);
|
| - void EmitNumberUntagD(Register input,
|
| - DwVfpRegister result,
|
| - bool allow_undefined_as_nan,
|
| - bool deoptimize_on_minus_zero,
|
| - LEnvironment* env,
|
| - NumberUntagDMode mode);
|
| + 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,
|
| + 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().
|
| @@ -318,11 +278,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);
|
| @@ -336,7 +293,7 @@ class LCodeGen: public LCodeGenBase {
|
| void EmitVectorLoadICRegisters(T* instr);
|
|
|
| ZoneList<LEnvironment*> deoptimizations_;
|
| - ZoneList<Deoptimizer::JumpTableEntry> deopt_jump_table_;
|
| + ZoneList<Deoptimizer::JumpTableEntry> jump_table_;
|
| ZoneList<Handle<Object> > deoptimization_literals_;
|
| int inlined_function_count_;
|
| Scope* const scope_;
|
| @@ -410,7 +367,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_
|
|
|