Index: src/asmjs/asm-wasm-builder.cc |
diff --git a/src/asmjs/asm-wasm-builder.cc b/src/asmjs/asm-wasm-builder.cc |
index 26fec8ab7b914307ca9302f510a93bf79d1b6904..cac6fbd8b372c43cea8d43edec72199a2195ca42 100644 |
--- a/src/asmjs/asm-wasm-builder.cc |
+++ b/src/asmjs/asm-wasm-builder.cc |
@@ -19,7 +19,6 @@ |
#include "src/ast/ast.h" |
#include "src/ast/scopes.h" |
-#include "src/codegen.h" |
namespace v8 { |
namespace internal { |
@@ -755,7 +754,7 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { |
} |
}; |
- void EmitAssignmentLhs(Expression* target, MachineType* mtype) { |
+ void EmitAssignmentLhs(Expression* target, AsmType** atype) { |
// Match the left hand side of the assignment. |
VariableProxy* target_var = target->AsVariableProxy(); |
if (target_var != nullptr) { |
@@ -766,7 +765,7 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { |
Property* target_prop = target->AsProperty(); |
if (target_prop != nullptr) { |
// Left hand side is a property access, i.e. the asm.js heap. |
- VisitPropertyAndEmitIndex(target_prop, mtype); |
+ VisitPropertyAndEmitIndex(target_prop, atype); |
return; |
} |
@@ -814,7 +813,7 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { |
RECURSE(Visit(value)); |
} |
- void EmitAssignment(Assignment* expr, MachineType type, ValueFate fate) { |
+ void EmitAssignment(Assignment* expr, AsmType* type, ValueFate fate) { |
// Match the left hand side of the assignment. |
VariableProxy* target_var = expr->target()->AsVariableProxy(); |
if (target_var != nullptr) { |
@@ -849,21 +848,21 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { |
} |
// Note that unlike StoreMem, AsmjsStoreMem ignores out-of-bounds writes. |
WasmOpcode opcode; |
- if (type == MachineType::Int8()) { |
+ if (type == AsmType::Int8Array()) { |
opcode = kExprI32AsmjsStoreMem8; |
- } else if (type == MachineType::Uint8()) { |
+ } else if (type == AsmType::Uint8Array()) { |
opcode = kExprI32AsmjsStoreMem8; |
- } else if (type == MachineType::Int16()) { |
+ } else if (type == AsmType::Int16Array()) { |
opcode = kExprI32AsmjsStoreMem16; |
- } else if (type == MachineType::Uint16()) { |
+ } else if (type == AsmType::Uint16Array()) { |
opcode = kExprI32AsmjsStoreMem16; |
- } else if (type == MachineType::Int32()) { |
+ } else if (type == AsmType::Int32Array()) { |
opcode = kExprI32AsmjsStoreMem; |
- } else if (type == MachineType::Uint32()) { |
+ } else if (type == AsmType::Uint32Array()) { |
opcode = kExprI32AsmjsStoreMem; |
- } else if (type == MachineType::Float32()) { |
+ } else if (type == AsmType::Float32Array()) { |
opcode = kExprF32AsmjsStoreMem; |
- } else if (type == MachineType::Float64()) { |
+ } else if (type == AsmType::Float64Array()) { |
opcode = kExprF64AsmjsStoreMem; |
} else { |
UNREACHABLE(); |
@@ -930,12 +929,12 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { |
} |
if (as_init) LoadInitFunction(); |
- MachineType mtype = MachineType::None(); |
+ AsmType* atype = AsmType::None(); |
bool is_nop = false; |
- EmitAssignmentLhs(expr->target(), &mtype); |
+ EmitAssignmentLhs(expr->target(), &atype); |
EmitAssignmentRhs(expr->target(), expr->value(), &is_nop); |
if (!is_nop) { |
- EmitAssignment(expr, mtype, fate); |
+ EmitAssignment(expr, atype, fate); |
} |
if (as_init) UnLoadInitFunction(); |
} |
@@ -959,40 +958,10 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { |
} |
} |
- void VisitPropertyAndEmitIndex(Property* expr, MachineType* mtype) { |
+ void VisitPropertyAndEmitIndex(Property* expr, AsmType** atype) { |
Expression* obj = expr->obj(); |
- AsmType* type = typer_->TypeOf(obj); |
- int size; |
- if (type->IsA(AsmType::Uint8Array())) { |
- *mtype = MachineType::Uint8(); |
- size = 1; |
- } else if (type->IsA(AsmType::Int8Array())) { |
- *mtype = MachineType::Int8(); |
- size = 1; |
- } else if (type->IsA(AsmType::Uint16Array())) { |
- *mtype = MachineType::Uint16(); |
- size = 2; |
- } else if (type->IsA(AsmType::Int16Array())) { |
- *mtype = MachineType::Int16(); |
- size = 2; |
- } else if (type->IsA(AsmType::Uint32Array())) { |
- *mtype = MachineType::Uint32(); |
- size = 4; |
- } else if (type->IsA(AsmType::Int32Array())) { |
- *mtype = MachineType::Int32(); |
- size = 4; |
- } else if (type->IsA(AsmType::Uint32Array())) { |
- *mtype = MachineType::Uint32(); |
- size = 4; |
- } else if (type->IsA(AsmType::Float32Array())) { |
- *mtype = MachineType::Float32(); |
- size = 4; |
- } else if (type->IsA(AsmType::Float64Array())) { |
- *mtype = MachineType::Float64(); |
- size = 8; |
- } else { |
- UNREACHABLE(); |
- } |
+ *atype = typer_->TypeOf(obj); |
+ int size = (*atype)->ElementSizeInBytes(); |
if (size == 1) { |
// Allow more general expression in byte arrays than the spec |
// strictly permits. |
@@ -1030,24 +999,24 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { |
} |
void VisitProperty(Property* expr) { |
- MachineType type; |
+ AsmType* type = AsmType::None(); |
VisitPropertyAndEmitIndex(expr, &type); |
WasmOpcode opcode; |
- if (type == MachineType::Int8()) { |
+ if (type == AsmType::Int8Array()) { |
opcode = kExprI32AsmjsLoadMem8S; |
- } else if (type == MachineType::Uint8()) { |
+ } else if (type == AsmType::Uint8Array()) { |
opcode = kExprI32AsmjsLoadMem8U; |
- } else if (type == MachineType::Int16()) { |
+ } else if (type == AsmType::Int16Array()) { |
opcode = kExprI32AsmjsLoadMem16S; |
- } else if (type == MachineType::Uint16()) { |
+ } else if (type == AsmType::Uint16Array()) { |
opcode = kExprI32AsmjsLoadMem16U; |
- } else if (type == MachineType::Int32()) { |
+ } else if (type == AsmType::Int32Array()) { |
opcode = kExprI32AsmjsLoadMem; |
- } else if (type == MachineType::Uint32()) { |
+ } else if (type == AsmType::Uint32Array()) { |
opcode = kExprI32AsmjsLoadMem; |
- } else if (type == MachineType::Float32()) { |
+ } else if (type == AsmType::Float32Array()) { |
opcode = kExprF32AsmjsLoadMem; |
- } else if (type == MachineType::Float64()) { |
+ } else if (type == AsmType::Float64Array()) { |
opcode = kExprF64AsmjsLoadMem; |
} else { |
UNREACHABLE(); |