summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/raw-machine-assembler.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/raw-machine-assembler.h')
-rw-r--r--deps/v8/src/compiler/raw-machine-assembler.h89
1 files changed, 61 insertions, 28 deletions
diff --git a/deps/v8/src/compiler/raw-machine-assembler.h b/deps/v8/src/compiler/raw-machine-assembler.h
index 5c232ed1d1..a0cb7a0bfb 100644
--- a/deps/v8/src/compiler/raw-machine-assembler.h
+++ b/deps/v8/src/compiler/raw-machine-assembler.h
@@ -79,6 +79,9 @@ class RawMachineAssembler {
Node* Int32Constant(int32_t value) {
return AddNode(common()->Int32Constant(value));
}
+ Node* StackSlot(MachineRepresentation rep) {
+ return AddNode(machine()->StackSlot(rep));
+ }
Node* Int64Constant(int64_t value) {
return AddNode(common()->Int64Constant(value));
}
@@ -147,7 +150,7 @@ class RawMachineAssembler {
return AddNode(machine()->WordEqual(), a, b);
}
Node* WordNotEqual(Node* a, Node* b) {
- return WordBinaryNot(WordEqual(a, b));
+ return Word32BinaryNot(WordEqual(a, b));
}
Node* WordNot(Node* a) {
if (machine()->Is32()) {
@@ -156,13 +159,6 @@ class RawMachineAssembler {
return Word64Not(a);
}
}
- Node* WordBinaryNot(Node* a) {
- if (machine()->Is32()) {
- return Word32BinaryNot(a);
- } else {
- return Word64BinaryNot(a);
- }
- }
Node* Word32And(Node* a, Node* b) {
return AddNode(machine()->Word32And(), a, b);
@@ -221,10 +217,9 @@ class RawMachineAssembler {
return AddNode(machine()->Word64Equal(), a, b);
}
Node* Word64NotEqual(Node* a, Node* b) {
- return Word64BinaryNot(Word64Equal(a, b));
+ return Word32BinaryNot(Word64Equal(a, b));
}
Node* Word64Not(Node* a) { return Word64Xor(a, Int64Constant(-1)); }
- Node* Word64BinaryNot(Node* a) { return Word64Equal(a, Int64Constant(0)); }
Node* Int32Add(Node* a, Node* b) {
return AddNode(machine()->Int32Add(), a, b);
@@ -275,6 +270,10 @@ class RawMachineAssembler {
Node* Int32GreaterThanOrEqual(Node* a, Node* b) {
return Int32LessThanOrEqual(b, a);
}
+ Node* Uint32GreaterThan(Node* a, Node* b) { return Uint32LessThan(b, a); }
+ Node* Uint32GreaterThanOrEqual(Node* a, Node* b) {
+ return Uint32LessThanOrEqual(b, a);
+ }
Node* Int32Neg(Node* a) { return Int32Sub(Int32Constant(0), a); }
Node* Int64Add(Node* a, Node* b) {
@@ -315,6 +314,10 @@ class RawMachineAssembler {
Node* Int64GreaterThanOrEqual(Node* a, Node* b) {
return Int64LessThanOrEqual(b, a);
}
+ Node* Uint64GreaterThan(Node* a, Node* b) { return Uint64LessThan(b, a); }
+ Node* Uint64GreaterThanOrEqual(Node* a, Node* b) {
+ return Uint64LessThanOrEqual(b, a);
+ }
Node* Uint64Div(Node* a, Node* b) {
return AddNode(machine()->Uint64Div(), a, b);
}
@@ -339,6 +342,19 @@ class RawMachineAssembler {
#undef INTPTR_BINOP
+#define UINTPTR_BINOP(prefix, name) \
+ Node* UintPtr##name(Node* a, Node* b) { \
+ return kPointerSize == 8 ? prefix##64##name(a, b) \
+ : prefix##32##name(a, b); \
+ }
+
+ UINTPTR_BINOP(Uint, LessThan);
+ UINTPTR_BINOP(Uint, LessThanOrEqual);
+ UINTPTR_BINOP(Uint, GreaterThanOrEqual);
+ UINTPTR_BINOP(Uint, GreaterThan);
+
+#undef UINTPTR_BINOP
+
Node* Float32Add(Node* a, Node* b) {
return AddNode(machine()->Float32Add(), a, b);
}
@@ -363,7 +379,7 @@ class RawMachineAssembler {
return AddNode(machine()->Float32Equal(), a, b);
}
Node* Float32NotEqual(Node* a, Node* b) {
- return WordBinaryNot(Float32Equal(a, b));
+ return Word32BinaryNot(Float32Equal(a, b));
}
Node* Float32LessThan(Node* a, Node* b) {
return AddNode(machine()->Float32LessThan(), a, b);
@@ -403,7 +419,7 @@ class RawMachineAssembler {
return AddNode(machine()->Float64Equal(), a, b);
}
Node* Float64NotEqual(Node* a, Node* b) {
- return WordBinaryNot(Float64Equal(a, b));
+ return Word32BinaryNot(Float64Equal(a, b));
}
Node* Float64LessThan(Node* a, Node* b) {
return AddNode(machine()->Float64LessThan(), a, b);
@@ -432,10 +448,11 @@ class RawMachineAssembler {
Node* ChangeFloat64ToUint32(Node* a) {
return AddNode(machine()->ChangeFloat64ToUint32(), a);
}
- Node* TruncateFloat32ToInt64(Node* a) {
- // TODO(ahaas): Remove this function as soon as it is not used anymore in
- // WebAssembly.
- return AddNode(machine()->TryTruncateFloat32ToInt64(), a);
+ Node* TruncateFloat32ToInt32(Node* a) {
+ return AddNode(machine()->TruncateFloat32ToInt32(), a);
+ }
+ Node* TruncateFloat32ToUint32(Node* a) {
+ return AddNode(machine()->TruncateFloat32ToUint32(), a);
}
Node* TryTruncateFloat32ToInt64(Node* a) {
return AddNode(machine()->TryTruncateFloat32ToInt64(), a);
@@ -448,11 +465,6 @@ class RawMachineAssembler {
Node* TryTruncateFloat64ToInt64(Node* a) {
return AddNode(machine()->TryTruncateFloat64ToInt64(), a);
}
- Node* TruncateFloat32ToUint64(Node* a) {
- // TODO(ahaas): Remove this function as soon as it is not used anymore in
- // WebAssembly.
- return AddNode(machine()->TryTruncateFloat32ToUint64(), a);
- }
Node* TryTruncateFloat32ToUint64(Node* a) {
return AddNode(machine()->TryTruncateFloat32ToUint64(), a);
}
@@ -479,12 +491,18 @@ class RawMachineAssembler {
Node* TruncateInt64ToInt32(Node* a) {
return AddNode(machine()->TruncateInt64ToInt32(), a);
}
+ Node* RoundInt32ToFloat32(Node* a) {
+ return AddNode(machine()->RoundInt32ToFloat32(), a);
+ }
Node* RoundInt64ToFloat32(Node* a) {
return AddNode(machine()->RoundInt64ToFloat32(), a);
}
Node* RoundInt64ToFloat64(Node* a) {
return AddNode(machine()->RoundInt64ToFloat64(), a);
}
+ Node* RoundUint32ToFloat32(Node* a) {
+ return AddNode(machine()->RoundUint32ToFloat32(), a);
+ }
Node* RoundUint64ToFloat32(Node* a) {
return AddNode(machine()->RoundUint64ToFloat32(), a);
}
@@ -548,6 +566,9 @@ class RawMachineAssembler {
// Stack operations.
Node* LoadStackPointer() { return AddNode(machine()->LoadStackPointer()); }
Node* LoadFramePointer() { return AddNode(machine()->LoadFramePointer()); }
+ Node* LoadParentFramePointer() {
+ return AddNode(machine()->LoadParentFramePointer());
+ }
// Parameters.
Node* Parameter(size_t index);
@@ -568,11 +589,16 @@ class RawMachineAssembler {
// Call a given call descriptor and the given arguments and frame-state.
Node* CallNWithFrameState(CallDescriptor* desc, Node* function, Node** args,
Node* frame_state);
+ // Call to a runtime function with zero arguments.
+ Node* CallRuntime0(Runtime::FunctionId function, Node* context);
// Call to a runtime function with one arguments.
Node* CallRuntime1(Runtime::FunctionId function, Node* arg0, Node* context);
// Call to a runtime function with two arguments.
Node* CallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2,
Node* context);
+ // Call to a runtime function with three arguments.
+ Node* CallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2,
+ Node* arg3, Node* context);
// Call to a runtime function with four arguments.
Node* CallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2,
Node* arg3, Node* arg4, Node* context);
@@ -602,7 +628,12 @@ class RawMachineAssembler {
// Tail call to a runtime function with two arguments.
Node* TailCallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2,
Node* context);
-
+ // Tail call to a runtime function with three arguments.
+ Node* TailCallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2,
+ Node* arg3, Node* context);
+ // Tail call to a runtime function with four arguments.
+ Node* TailCallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2,
+ Node* arg3, Node* arg4, Node* context);
// ===========================================================================
// The following utility methods deal with control flow, hence might switch
@@ -622,24 +653,26 @@ class RawMachineAssembler {
// Variables.
Node* Phi(MachineRepresentation rep, Node* n1, Node* n2) {
- return AddNode(common()->Phi(rep, 2), n1, n2);
+ return AddNode(common()->Phi(rep, 2), n1, n2, graph()->start());
}
Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3) {
- return AddNode(common()->Phi(rep, 3), n1, n2, n3);
+ return AddNode(common()->Phi(rep, 3), n1, n2, n3, graph()->start());
}
Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3, Node* n4) {
- return AddNode(common()->Phi(rep, 4), n1, n2, n3, n4);
+ return AddNode(common()->Phi(rep, 4), n1, n2, n3, n4, graph()->start());
}
+ Node* Phi(MachineRepresentation rep, int input_count, Node* const* inputs);
+ void AppendPhiInput(Node* phi, Node* new_input);
// ===========================================================================
// The following generic node creation methods can be used for operators that
// are not covered by the above utility methods. There should rarely be a need
// to do that outside of testing though.
- Node* AddNode(const Operator* op, int input_count, Node** inputs);
+ Node* AddNode(const Operator* op, int input_count, Node* const* inputs);
Node* AddNode(const Operator* op) {
- return AddNode(op, 0, static_cast<Node**>(nullptr));
+ return AddNode(op, 0, static_cast<Node* const*>(nullptr));
}
template <class... TArgs>
@@ -649,7 +682,7 @@ class RawMachineAssembler {
}
private:
- Node* MakeNode(const Operator* op, int input_count, Node** inputs);
+ Node* MakeNode(const Operator* op, int input_count, Node* const* inputs);
BasicBlock* Use(RawMachineLabel* label);
BasicBlock* EnsureBlock(RawMachineLabel* label);
BasicBlock* CurrentBlock();