Index: src/interpreter/bytecode-array-builder.h |
diff --git a/src/interpreter/bytecode-array-builder.h b/src/interpreter/bytecode-array-builder.h |
index 7cdb72fed21ea3d7df0839c851e0a014a89db126..0275f17fe44a9f0e275b43e196441051b3a504d1 100644 |
--- a/src/interpreter/bytecode-array-builder.h |
+++ b/src/interpreter/bytecode-array-builder.h |
@@ -9,6 +9,7 @@ |
#include "src/interpreter/bytecodes.h" |
#include "src/interpreter/constant-array-builder.h" |
#include "src/interpreter/handler-table-builder.h" |
+#include "src/interpreter/register-translator.h" |
#include "src/zone-containers.h" |
namespace v8 { |
@@ -25,7 +26,7 @@ class Register; |
// when rest parameters implementation has settled down. |
enum class CreateArgumentsType { kMappedArguments, kUnmappedArguments }; |
-class BytecodeArrayBuilder final { |
+class BytecodeArrayBuilder final : private RegisterMover { |
public: |
BytecodeArrayBuilder(Isolate* isolate, Zone* zone); |
~BytecodeArrayBuilder(); |
@@ -59,6 +60,18 @@ class BytecodeArrayBuilder final { |
// Returns the number of fixed (non-temporary) registers. |
int fixed_register_count() const { return context_count() + locals_count(); } |
+ // Returns the number of fixed and temporary registers. |
+ int fixed_and_temporary_register_count() const { |
+ return fixed_register_count() + temporary_register_count_; |
+ } |
+ |
+ // Returns the number of used for translating wide register operands |
rmcilroy
2016/01/22 17:50:56
/s/of used/of registers used
|
+ // into byte sized register operands.. |
rmcilroy
2016/01/22 17:50:56
remove extra full-stop.
|
+ int translation_register_count() const { |
+ return RegisterTranslator::RegisterCountAdjustment( |
+ fixed_and_temporary_register_count(), parameter_count()); |
+ } |
+ |
Register Parameter(int parameter_index) const; |
// Return true if the register |reg| represents a parameter or a |
@@ -240,6 +253,7 @@ class BytecodeArrayBuilder final { |
private: |
class PreviousBytecodeHelper; |
+ class RegisterTranslationScope; |
friend class BytecodeRegisterAllocator; |
static Bytecode BytecodeForBinaryOperation(Token::Value op); |
@@ -263,15 +277,16 @@ class BytecodeArrayBuilder final { |
static bool FitsInIdx16Operand(int value); |
static bool FitsInIdx16Operand(size_t value); |
static bool FitsInReg8Operand(Register value); |
+ static bool FitsInReg8OperandUntranslated(Register value); |
static bool FitsInReg16Operand(Register value); |
+ static bool FitsInReg16OperandUntranslated(Register value); |
+ |
+ bool MoveRegisterUntranslated(Register from, Register to) override; |
static Bytecode GetJumpWithConstantOperand(Bytecode jump_smi8_operand); |
static Bytecode GetJumpWithConstantWideOperand(Bytecode jump_smi8_operand); |
static Bytecode GetJumpWithToBoolean(Bytecode jump_smi8_operand); |
- Register MapRegister(Register reg); |
- Register MapRegisters(Register reg, Register args_base, int args_length = 1); |
- |
template <size_t N> |
INLINE(void Output(Bytecode bytecode, uint32_t(&operands)[N])); |
void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1, |
@@ -296,13 +311,14 @@ class BytecodeArrayBuilder final { |
bool OperandIsValid(Bytecode bytecode, int operand_index, |
uint32_t operand_value) const; |
- bool LastBytecodeInSameBlock() const; |
bool RegisterIsValid(Register reg, OperandType reg_type) const; |
+ bool LastBytecodeInSameBlock() const; |
bool NeedToBooleanCast(); |
bool IsRegisterInAccumulator(Register reg); |
// Temporary register management. |
+ void ForgeTemporaryRegister(); |
int BorrowTemporaryRegister(); |
int BorrowTemporaryRegisterNotInRange(int start_index, int end_index); |
void ReturnTemporaryRegister(int reg_index); |
@@ -328,6 +344,13 @@ class BytecodeArrayBuilder final { |
HandlerTableBuilder* handler_table_builder() { |
return &handler_table_builder_; |
} |
+ RegisterTranslator* register_translator() { return ®ister_translator_; } |
+ void set_register_translation_scope(RegisterTranslationScope* scope) { |
+ register_translation_scope_ = scope; |
+ } |
+ RegisterTranslationScope* register_translation_scope() const { |
+ return register_translation_scope_; |
+ } |
Isolate* isolate_; |
Zone* zone_; |
@@ -339,12 +362,13 @@ class BytecodeArrayBuilder final { |
size_t last_bytecode_start_; |
bool exit_seen_in_block_; |
int unbound_jumps_; |
- |
int parameter_count_; |
int local_register_count_; |
int context_register_count_; |
int temporary_register_count_; |
ZoneSet<int> free_temporaries_; |
+ RegisterTranslator register_translator_; |
+ RegisterTranslationScope* register_translation_scope_; |
DISALLOW_COPY_AND_ASSIGN(BytecodeArrayBuilder); |
}; |