1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/assembler.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/common-operator.h" 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/graph.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/linkage.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/machine-operator.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node.h" 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/operator.h" 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/factory.h" 16c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/globals.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler { 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass BasicBlock; 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass RawMachineLabel; 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Schedule; 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The RawMachineAssembler produces a low-level IR graph. All nodes are wired 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// into a graph and also placed into a schedule immediately, hence subsequent 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// code generation can happen without the need for scheduling. 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// In order to create a schedule on-the-fly, the assembler keeps track of basic 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// blocks by having one current basic block being populated and by referencing 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// other basic blocks through the use of labels. 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Also note that the generated graph is only valid together with the generated 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// schedule, using one without the other is invalid as the graph is inherently 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// non-schedulable due to missing control and effect dependencies. 38c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE RawMachineAssembler { 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineAssembler( 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Graph* graph, CallDescriptor* call_descriptor, 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation word = MachineType::PointerRepresentation(), 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineOperatorBuilder::Flags flags = 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MachineOperatorBuilder::Flag::kNoFlags, 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MachineOperatorBuilder::AlignmentRequirements alignment_requirements = 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MachineOperatorBuilder::AlignmentRequirements:: 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FullUnalignedAccessSupport()); 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ~RawMachineAssembler() {} 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate() const { return isolate_; } 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Graph* graph() const { return graph_; } 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone() const { return graph()->zone(); } 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder* machine() { return &machine_; } 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CommonOperatorBuilder* common() { return &common_; } 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallDescriptor* call_descriptor() const { return call_descriptor_; } 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Finalizes the schedule and exports it to be used for code generation. Note 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // that this RawMachineAssembler becomes invalid after export. 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Schedule* Export(); 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // =========================================================================== 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The following utility methods create new nodes with specific operators and 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // place them into the current basic block. They don't perform control flow, 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // hence will not switch the current basic block. 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* NullConstant() { 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return HeapConstant(isolate()->factory()->null_value()); 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* UndefinedConstant() { 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return HeapConstant(isolate()->factory()->undefined_value()); 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Constants. 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* PointerConstant(void* value) { 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IntPtrConstant(reinterpret_cast<intptr_t>(value)); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* IntPtrConstant(intptr_t value) { 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(dcarney): mark generated code as unserializable if value != 0. 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kPointerSize == 8 ? Int64Constant(value) 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Int32Constant(static_cast<int>(value)); 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 83bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* RelocatableIntPtrConstant(intptr_t value, RelocInfo::Mode rmode); 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32Constant(int32_t value) { 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(common()->Int32Constant(value)); 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 87109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* StackSlot(MachineRepresentation rep) { 88109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(machine()->StackSlot(rep)); 89109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64Constant(int64_t value) { 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(common()->Int64Constant(value)); 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* NumberConstant(double value) { 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(common()->NumberConstant(value)); 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Float32Constant(float value) { 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(common()->Float32Constant(value)); 98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64Constant(double value) { 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(common()->Float64Constant(value)); 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* HeapConstant(Handle<HeapObject> object) { 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(common()->HeapConstant(object)); 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* BooleanConstant(bool value) { 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> object = isolate()->factory()->ToBoolean(value); 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return HeapConstant(Handle<HeapObject>::cast(object)); 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* ExternalConstant(ExternalReference address) { 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(common()->ExternalConstant(address)); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 112bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* RelocatableInt32Constant(int32_t value, RelocInfo::Mode rmode) { 113bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AddNode(common()->RelocatableInt32Constant(value, rmode)); 114bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* RelocatableInt64Constant(int64_t value, RelocInfo::Mode rmode) { 116bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AddNode(common()->RelocatableInt64Constant(value, rmode)); 117bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Projection(int index, Node* a) { 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(common()->Projection(index), a); 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Memory Operations. 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Load(MachineType rep, Node* base) { 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Load(rep, base, IntPtrConstant(0)); 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Load(MachineType rep, Node* base, Node* index) { 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Load(rep), base, index); 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Store(MachineRepresentation rep, Node* base, Node* value, 131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteBarrierKind write_barrier) { 132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Store(rep, base, IntPtrConstant(0), value, write_barrier); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Store(MachineRepresentation rep, Node* base, Node* index, Node* value, 135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteBarrierKind write_barrier) { 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Store(StoreRepresentation(rep, write_barrier)), 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base, index, value); 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 139f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Node* Retain(Node* value) { return AddNode(common()->Retain(), value); } 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Unaligned memory operations 142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* UnalignedLoad(MachineType rep, Node* base) { 143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return UnalignedLoad(rep, base, IntPtrConstant(0)); 144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* UnalignedLoad(MachineType rep, Node* base, Node* index) { 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (machine()->UnalignedLoadSupported(rep, 1)) { 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->Load(rep), base, index); 148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } else { 149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->UnalignedLoad(rep), base, index); 150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* UnalignedStore(MachineRepresentation rep, Node* base, Node* value) { 153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return UnalignedStore(rep, base, IntPtrConstant(0), value); 154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* UnalignedStore(MachineRepresentation rep, Node* base, Node* index, 156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* value) { 157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MachineType t = MachineType::TypeForRepresentation(rep); 158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (machine()->UnalignedStoreSupported(t, 1)) { 159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->Store(StoreRepresentation( 160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch rep, WriteBarrierKind::kNoWriteBarrier)), 161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch base, index, value); 162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } else { 163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode( 164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch machine()->UnalignedStore(UnalignedStoreRepresentation(rep)), base, 165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch index, value); 166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 169bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Atomic memory operations. 170bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* AtomicLoad(MachineType rep, Node* base, Node* index) { 171bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AddNode(machine()->AtomicLoad(rep), base, index); 172bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 173bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* AtomicStore(MachineRepresentation rep, Node* base, Node* index, 174bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* value) { 175bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AddNode(machine()->AtomicStore(rep), base, index, value); 176bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 177bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Arithmetic Operations. 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordAnd(Node* a, Node* b) { 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->WordAnd(), a, b); 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* WordOr(Node* a, Node* b) { return AddNode(machine()->WordOr(), a, b); } 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordXor(Node* a, Node* b) { 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->WordXor(), a, b); 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordShl(Node* a, Node* b) { 187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->WordShl(), a, b); 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordShr(Node* a, Node* b) { 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->WordShr(), a, b); 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordSar(Node* a, Node* b) { 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->WordSar(), a, b); 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordRor(Node* a, Node* b) { 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->WordRor(), a, b); 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordEqual(Node* a, Node* b) { 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->WordEqual(), a, b); 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordNotEqual(Node* a, Node* b) { 202109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return Word32BinaryNot(WordEqual(a, b)); 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* WordNot(Node* a) { 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (machine()->Is32()) { 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Word32Not(a); 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Word64Not(a); 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32And(Node* a, Node* b) { 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word32And(), a, b); 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32Or(Node* a, Node* b) { 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word32Or(), a, b); 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32Xor(Node* a, Node* b) { 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word32Xor(), a, b); 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32Shl(Node* a, Node* b) { 222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word32Shl(), a, b); 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32Shr(Node* a, Node* b) { 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word32Shr(), a, b); 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32Sar(Node* a, Node* b) { 228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word32Sar(), a, b); 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32Ror(Node* a, Node* b) { 231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word32Ror(), a, b); 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Word32Clz(Node* a) { return AddNode(machine()->Word32Clz(), a); } 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32Equal(Node* a, Node* b) { 235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word32Equal(), a, b); 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32NotEqual(Node* a, Node* b) { 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Word32BinaryNot(Word32Equal(a, b)); 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32Not(Node* a) { return Word32Xor(a, Int32Constant(-1)); } 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word32BinaryNot(Node* a) { return Word32Equal(a, Int32Constant(0)); } 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64And(Node* a, Node* b) { 244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word64And(), a, b); 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64Or(Node* a, Node* b) { 247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word64Or(), a, b); 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64Xor(Node* a, Node* b) { 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word64Xor(), a, b); 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64Shl(Node* a, Node* b) { 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word64Shl(), a, b); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64Shr(Node* a, Node* b) { 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word64Shr(), a, b); 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64Sar(Node* a, Node* b) { 259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word64Sar(), a, b); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64Ror(Node* a, Node* b) { 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word64Ror(), a, b); 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Word64Clz(Node* a) { return AddNode(machine()->Word64Clz(), a); } 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64Equal(Node* a, Node* b) { 266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Word64Equal(), a, b); 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64NotEqual(Node* a, Node* b) { 269109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return Word32BinaryNot(Word64Equal(a, b)); 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Word64Not(Node* a) { return Word64Xor(a, Int64Constant(-1)); } 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32Add(Node* a, Node* b) { 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32Add(), a, b); 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32AddWithOverflow(Node* a, Node* b) { 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32AddWithOverflow(), a, b); 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32Sub(Node* a, Node* b) { 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32Sub(), a, b); 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32SubWithOverflow(Node* a, Node* b) { 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32SubWithOverflow(), a, b); 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32Mul(Node* a, Node* b) { 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32Mul(), a, b); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Int32MulHigh(Node* a, Node* b) { 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32MulHigh(), a, b); 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Int32MulWithOverflow(Node* a, Node* b) { 292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->Int32MulWithOverflow(), a, b); 293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Int32Div(Node* a, Node* b) { 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32Div(), a, b); 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32Mod(Node* a, Node* b) { 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32Mod(), a, b); 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32LessThan(Node* a, Node* b) { 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32LessThan(), a, b); 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32LessThanOrEqual(Node* a, Node* b) { 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int32LessThanOrEqual(), a, b); 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Uint32Div(Node* a, Node* b) { 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint32Div(), a, b); 308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Uint32LessThan(Node* a, Node* b) { 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint32LessThan(), a, b); 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Uint32LessThanOrEqual(Node* a, Node* b) { 313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint32LessThanOrEqual(), a, b); 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Uint32Mod(Node* a, Node* b) { 316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint32Mod(), a, b); 317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Uint32MulHigh(Node* a, Node* b) { 319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint32MulHigh(), a, b); 320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32GreaterThan(Node* a, Node* b) { return Int32LessThan(b, a); } 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32GreaterThanOrEqual(Node* a, Node* b) { 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Int32LessThanOrEqual(b, a); 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 325109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* Uint32GreaterThan(Node* a, Node* b) { return Uint32LessThan(b, a); } 326109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* Uint32GreaterThanOrEqual(Node* a, Node* b) { 327109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return Uint32LessThanOrEqual(b, a); 328109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int32Neg(Node* a) { return Int32Sub(Int32Constant(0), a); } 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64Add(Node* a, Node* b) { 332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64Add(), a, b); 333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Int64AddWithOverflow(Node* a, Node* b) { 335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64AddWithOverflow(), a, b); 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64Sub(Node* a, Node* b) { 338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64Sub(), a, b); 339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Int64SubWithOverflow(Node* a, Node* b) { 341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64SubWithOverflow(), a, b); 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64Mul(Node* a, Node* b) { 344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64Mul(), a, b); 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64Div(Node* a, Node* b) { 347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64Div(), a, b); 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64Mod(Node* a, Node* b) { 350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64Mod(), a, b); 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64Neg(Node* a) { return Int64Sub(Int64Constant(0), a); } 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64LessThan(Node* a, Node* b) { 354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64LessThan(), a, b); 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64LessThanOrEqual(Node* a, Node* b) { 357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Int64LessThanOrEqual(), a, b); 358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Uint64LessThan(Node* a, Node* b) { 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint64LessThan(), a, b); 361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Uint64LessThanOrEqual(Node* a, Node* b) { 363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint64LessThanOrEqual(), a, b); 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64GreaterThan(Node* a, Node* b) { return Int64LessThan(b, a); } 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Int64GreaterThanOrEqual(Node* a, Node* b) { 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Int64LessThanOrEqual(b, a); 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 369109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* Uint64GreaterThan(Node* a, Node* b) { return Uint64LessThan(b, a); } 370109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* Uint64GreaterThanOrEqual(Node* a, Node* b) { 371109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return Uint64LessThanOrEqual(b, a); 372109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Uint64Div(Node* a, Node* b) { 374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint64Div(), a, b); 375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Uint64Mod(Node* a, Node* b) { 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Uint64Mod(), a, b); 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* Int32PairAdd(Node* a_low, Node* a_high, Node* b_low, Node* b_high) { 3803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AddNode(machine()->Int32PairAdd(), a_low, a_high, b_low, b_high); 3813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* Int32PairSub(Node* a_low, Node* a_high, Node* b_low, Node* b_high) { 3833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AddNode(machine()->Int32PairSub(), a_low, a_high, b_low, b_high); 3843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* Int32PairMul(Node* a_low, Node* a_high, Node* b_low, Node* b_high) { 3863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AddNode(machine()->Int32PairMul(), a_low, a_high, b_low, b_high); 3873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* Word32PairShl(Node* low_word, Node* high_word, Node* shift) { 3893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AddNode(machine()->Word32PairShl(), low_word, high_word, shift); 3903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* Word32PairShr(Node* low_word, Node* high_word, Node* shift) { 3923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AddNode(machine()->Word32PairShr(), low_word, high_word, shift); 3933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* Word32PairSar(Node* low_word, Node* high_word, Node* shift) { 3953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AddNode(machine()->Word32PairSar(), low_word, high_word, shift); 3963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define INTPTR_BINOP(prefix, name) \ 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* IntPtr##name(Node* a, Node* b) { \ 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kPointerSize == 8 ? prefix##64##name(a, b) \ 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : prefix##32##name(a, b); \ 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INTPTR_BINOP(Int, Add); 4053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch INTPTR_BINOP(Int, AddWithOverflow); 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INTPTR_BINOP(Int, Sub); 4073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch INTPTR_BINOP(Int, SubWithOverflow); 408bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch INTPTR_BINOP(Int, Mul); 409bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch INTPTR_BINOP(Int, Div); 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INTPTR_BINOP(Int, LessThan); 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INTPTR_BINOP(Int, LessThanOrEqual); 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INTPTR_BINOP(Word, Equal); 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INTPTR_BINOP(Word, NotEqual); 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INTPTR_BINOP(Int, GreaterThanOrEqual); 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INTPTR_BINOP(Int, GreaterThan); 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef INTPTR_BINOP 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 419109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define UINTPTR_BINOP(prefix, name) \ 420109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* UintPtr##name(Node* a, Node* b) { \ 421109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return kPointerSize == 8 ? prefix##64##name(a, b) \ 422109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch : prefix##32##name(a, b); \ 423109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 424109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 425109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch UINTPTR_BINOP(Uint, LessThan); 426109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch UINTPTR_BINOP(Uint, LessThanOrEqual); 427109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch UINTPTR_BINOP(Uint, GreaterThanOrEqual); 428109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch UINTPTR_BINOP(Uint, GreaterThan); 429109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 430109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef UINTPTR_BINOP 431109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32Add(Node* a, Node* b) { 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32Add(), a, b); 434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32Sub(Node* a, Node* b) { 436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32Sub(), a, b); 437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32Mul(Node* a, Node* b) { 439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32Mul(), a, b); 440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32Div(Node* a, Node* b) { 442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32Div(), a, b); 443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32Abs(Node* a) { return AddNode(machine()->Float32Abs(), a); } 445f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float32Neg(Node* a) { return AddNode(machine()->Float32Neg(), a); } 446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32Sqrt(Node* a) { return AddNode(machine()->Float32Sqrt(), a); } 447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32Equal(Node* a, Node* b) { 448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32Equal(), a, b); 449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32NotEqual(Node* a, Node* b) { 451109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return Word32BinaryNot(Float32Equal(a, b)); 452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32LessThan(Node* a, Node* b) { 454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32LessThan(), a, b); 455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32LessThanOrEqual(Node* a, Node* b) { 457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32LessThanOrEqual(), a, b); 458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32GreaterThan(Node* a, Node* b) { return Float32LessThan(b, a); } 460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32GreaterThanOrEqual(Node* a, Node* b) { 461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Float32LessThanOrEqual(b, a); 462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 463f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float32Max(Node* a, Node* b) { 464f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->Float32Max(), a, b); 465f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 466f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float32Min(Node* a, Node* b) { 467f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->Float32Min(), a, b); 468f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64Add(Node* a, Node* b) { 470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64Add(), a, b); 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64Sub(Node* a, Node* b) { 473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64Sub(), a, b); 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64Mul(Node* a, Node* b) { 476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64Mul(), a, b); 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64Div(Node* a, Node* b) { 479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64Div(), a, b); 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64Mod(Node* a, Node* b) { 482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64Mod(), a, b); 483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64Max(Node* a, Node* b) { 485f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->Float64Max(), a, b); 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64Min(Node* a, Node* b) { 488f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->Float64Min(), a, b); 489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64Abs(Node* a) { return AddNode(machine()->Float64Abs(), a); } 491f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Neg(Node* a) { return AddNode(machine()->Float64Neg(), a); } 492f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Acos(Node* a) { return AddNode(machine()->Float64Acos(), a); } 493f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Acosh(Node* a) { return AddNode(machine()->Float64Acosh(), a); } 494f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Asin(Node* a) { return AddNode(machine()->Float64Asin(), a); } 495f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Asinh(Node* a) { return AddNode(machine()->Float64Asinh(), a); } 49613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Atan(Node* a) { return AddNode(machine()->Float64Atan(), a); } 497f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Atanh(Node* a) { return AddNode(machine()->Float64Atanh(), a); } 49813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Atan2(Node* a, Node* b) { 49913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return AddNode(machine()->Float64Atan2(), a, b); 50013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 50113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Cbrt(Node* a) { return AddNode(machine()->Float64Cbrt(), a); } 50213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Cos(Node* a) { return AddNode(machine()->Float64Cos(), a); } 503f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Cosh(Node* a) { return AddNode(machine()->Float64Cosh(), a); } 50413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Exp(Node* a) { return AddNode(machine()->Float64Exp(), a); } 50513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Expm1(Node* a) { return AddNode(machine()->Float64Expm1(), a); } 50613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Log(Node* a) { return AddNode(machine()->Float64Log(), a); } 50713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Log1p(Node* a) { return AddNode(machine()->Float64Log1p(), a); } 50813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Log10(Node* a) { return AddNode(machine()->Float64Log10(), a); } 50913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Log2(Node* a) { return AddNode(machine()->Float64Log2(), a); } 510f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Pow(Node* a, Node* b) { 511f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return AddNode(machine()->Float64Pow(), a, b); 512f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 51313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Sin(Node* a) { return AddNode(machine()->Float64Sin(), a); } 514f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Sinh(Node* a) { return AddNode(machine()->Float64Sinh(), a); } 515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64Sqrt(Node* a) { return AddNode(machine()->Float64Sqrt(), a); } 51613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Node* Float64Tan(Node* a) { return AddNode(machine()->Float64Tan(), a); } 517f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* Float64Tanh(Node* a) { return AddNode(machine()->Float64Tanh(), a); } 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64Equal(Node* a, Node* b) { 519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64Equal(), a, b); 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64NotEqual(Node* a, Node* b) { 522109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return Word32BinaryNot(Float64Equal(a, b)); 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64LessThan(Node* a, Node* b) { 525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64LessThan(), a, b); 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64LessThanOrEqual(Node* a, Node* b) { 528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64LessThanOrEqual(), a, b); 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64GreaterThan(Node* a, Node* b) { return Float64LessThan(b, a); } 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Float64GreaterThanOrEqual(Node* a, Node* b) { 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Float64LessThanOrEqual(b, a); 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conversions. 536f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Node* BitcastTaggedToWord(Node* a) { 537f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AddNode(machine()->BitcastTaggedToWord(), a); 538f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 539bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* BitcastWordToTagged(Node* a) { 540bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AddNode(machine()->BitcastWordToTagged(), a); 541bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 542f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Node* BitcastWordToTaggedSigned(Node* a) { 543f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AddNode(machine()->BitcastWordToTaggedSigned(), a); 544f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 545bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* TruncateFloat64ToWord32(Node* a) { 546bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AddNode(machine()->TruncateFloat64ToWord32(), a); 547bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* ChangeFloat32ToFloat64(Node* a) { 549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->ChangeFloat32ToFloat64(), a); 550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ChangeInt32ToFloat64(Node* a) { 552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->ChangeInt32ToFloat64(), a); 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ChangeUint32ToFloat64(Node* a) { 555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->ChangeUint32ToFloat64(), a); 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ChangeFloat64ToInt32(Node* a) { 558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->ChangeFloat64ToInt32(), a); 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ChangeFloat64ToUint32(Node* a) { 561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->ChangeFloat64ToUint32(), a); 562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* TruncateFloat64ToUint32(Node* a) { 5643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AddNode(machine()->TruncateFloat64ToUint32(), a); 5653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 566109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* TruncateFloat32ToInt32(Node* a) { 567109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(machine()->TruncateFloat32ToInt32(), a); 568109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 569109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* TruncateFloat32ToUint32(Node* a) { 570109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(machine()->TruncateFloat32ToUint32(), a); 571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* TryTruncateFloat32ToInt64(Node* a) { 573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->TryTruncateFloat32ToInt64(), a); 574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* TryTruncateFloat64ToInt64(Node* a) { 576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->TryTruncateFloat64ToInt64(), a); 577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* TryTruncateFloat32ToUint64(Node* a) { 579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->TryTruncateFloat32ToUint64(), a); 580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* TryTruncateFloat64ToUint64(Node* a) { 582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->TryTruncateFloat64ToUint64(), a); 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ChangeInt32ToInt64(Node* a) { 585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->ChangeInt32ToInt64(), a); 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* ChangeUint32ToUint64(Node* a) { 588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->ChangeUint32ToUint64(), a); 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* TruncateFloat64ToFloat32(Node* a) { 591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->TruncateFloat64ToFloat32(), a); 592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* TruncateInt64ToInt32(Node* a) { 594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->TruncateInt64ToInt32(), a); 595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 596bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Node* RoundFloat64ToInt32(Node* a) { 597bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AddNode(machine()->RoundFloat64ToInt32(), a); 598bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 599109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* RoundInt32ToFloat32(Node* a) { 600109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(machine()->RoundInt32ToFloat32(), a); 601109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* RoundInt64ToFloat32(Node* a) { 603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->RoundInt64ToFloat32(), a); 604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* RoundInt64ToFloat64(Node* a) { 606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->RoundInt64ToFloat64(), a); 607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 608109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* RoundUint32ToFloat32(Node* a) { 609109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(machine()->RoundUint32ToFloat32(), a); 610109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* RoundUint64ToFloat32(Node* a) { 612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->RoundUint64ToFloat32(), a); 613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* RoundUint64ToFloat64(Node* a) { 615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->RoundUint64ToFloat64(), a); 616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* BitcastFloat32ToInt32(Node* a) { 618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->BitcastFloat32ToInt32(), a); 619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* BitcastFloat64ToInt64(Node* a) { 621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->BitcastFloat64ToInt64(), a); 622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* BitcastInt32ToFloat32(Node* a) { 624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->BitcastInt32ToFloat32(), a); 625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* BitcastInt64ToFloat64(Node* a) { 627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->BitcastInt64ToFloat64(), a); 628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32RoundDown(Node* a) { 630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32RoundDown().op(), a); 631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64RoundDown(Node* a) { 633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64RoundDown().op(), a); 634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32RoundUp(Node* a) { 636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32RoundUp().op(), a); 637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64RoundUp(Node* a) { 639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64RoundUp().op(), a); 640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32RoundTruncate(Node* a) { 642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32RoundTruncate().op(), a); 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Float64RoundTruncate(Node* a) { 645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64RoundTruncate().op(), a); 646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Node* Float64RoundTiesAway(Node* a) { 648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64RoundTiesAway().op(), a); 649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float32RoundTiesEven(Node* a) { 651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float32RoundTiesEven().op(), a); 652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64RoundTiesEven(Node* a) { 654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64RoundTiesEven().op(), a); 655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Float64 bit operations. 658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64ExtractLowWord32(Node* a) { 659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64ExtractLowWord32(), a); 660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64ExtractHighWord32(Node* a) { 662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64ExtractHighWord32(), a); 663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64InsertLowWord32(Node* a, Node* b) { 665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64InsertLowWord32(), a, b); 666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Float64InsertHighWord32(Node* a, Node* b) { 668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(machine()->Float64InsertHighWord32(), a, b); 669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 670f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Node* Float64SilenceNaN(Node* a) { 671f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AddNode(machine()->Float64SilenceNaN(), a); 672f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Stack operations. 675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* LoadStackPointer() { return AddNode(machine()->LoadStackPointer()); } 676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* LoadFramePointer() { return AddNode(machine()->LoadFramePointer()); } 677109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* LoadParentFramePointer() { 678109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(machine()->LoadParentFramePointer()); 679109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Parameters. 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* Parameter(size_t index); 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Pointer utilities. 685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* LoadFromPointer(void* address, MachineType rep, int32_t offset = 0) { 686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Load(rep, PointerConstant(address), Int32Constant(offset)); 687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* StoreToPointer(void* address, MachineRepresentation rep, Node* node) { 689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Store(rep, PointerConstant(address), node, kNoWriteBarrier); 690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 691f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* UnalignedLoadFromPointer(void* address, MachineType rep, 692f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int32_t offset = 0) { 693f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return UnalignedLoad(rep, PointerConstant(address), Int32Constant(offset)); 694f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 695f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* UnalignedStoreToPointer(void* address, MachineRepresentation rep, 696f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* node) { 697f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return UnalignedStore(rep, PointerConstant(address), node); 698f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* StringConstant(const char* string) { 700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return HeapConstant(isolate()->factory()->InternalizeUtf8String(string)); 701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call a given call descriptor and the given arguments. 704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallN(CallDescriptor* desc, Node* function, Node** args); 705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call a given call descriptor and the given arguments and frame-state. 706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallNWithFrameState(CallDescriptor* desc, Node* function, Node** args, 707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* frame_state); 708109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Call to a runtime function with zero arguments. 709109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* CallRuntime0(Runtime::FunctionId function, Node* context); 710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call to a runtime function with one arguments. 711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallRuntime1(Runtime::FunctionId function, Node* arg0, Node* context); 712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call to a runtime function with two arguments. 713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2, 714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* context); 715109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Call to a runtime function with three arguments. 716109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* CallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2, 717109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* arg3, Node* context); 718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call to a runtime function with four arguments. 719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2, 720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* arg3, Node* arg4, Node* context); 721c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Call to a runtime function with five arguments. 722c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Node* CallRuntime5(Runtime::FunctionId function, Node* arg1, Node* arg2, 723c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Node* arg3, Node* arg4, Node* arg5, Node* context); 724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call to a C function with zero arguments. 725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallCFunction0(MachineType return_type, Node* function); 726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call to a C function with one parameter. 727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallCFunction1(MachineType return_type, MachineType arg0_type, 728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* function, Node* arg0); 729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call to a C function with two arguments. 730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallCFunction2(MachineType return_type, MachineType arg0_type, 731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType arg1_type, Node* function, Node* arg0, 732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* arg1); 733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Call to a C function with eight arguments. 734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* CallCFunction8(MachineType return_type, MachineType arg0_type, 735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType arg1_type, MachineType arg2_type, 736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType arg3_type, MachineType arg4_type, 737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType arg5_type, MachineType arg6_type, 738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType arg7_type, Node* function, Node* arg0, 739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* arg1, Node* arg2, Node* arg3, Node* arg4, 740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* arg5, Node* arg6, Node* arg7); 741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tail call the given call descriptor and the given arguments. 743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* TailCallN(CallDescriptor* call_descriptor, Node* function, Node** args); 7443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Tail call to a runtime function with zero arguments. 7453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* TailCallRuntime0(Runtime::FunctionId function, Node* context); 746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tail call to a runtime function with one argument. 747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* TailCallRuntime1(Runtime::FunctionId function, Node* arg0, 748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* context); 749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tail call to a runtime function with two arguments. 750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* TailCallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2, 751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* context); 752109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Tail call to a runtime function with three arguments. 753109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* TailCallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2, 754109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* arg3, Node* context); 755109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Tail call to a runtime function with four arguments. 756109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* TailCallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2, 757109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* arg3, Node* arg4, Node* context); 758f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Tail call to a runtime function with five arguments. 759f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* TailCallRuntime5(Runtime::FunctionId function, Node* arg1, Node* arg2, 760f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* arg3, Node* arg4, Node* arg5, Node* context); 761f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Tail call to a runtime function with six arguments. 762f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Node* TailCallRuntime6(Runtime::FunctionId function, Node* arg1, Node* arg2, 763f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Node* arg3, Node* arg4, Node* arg5, Node* arg6, 764f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Node* context); 765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // =========================================================================== 767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The following utility methods deal with control flow, hence might switch 768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the current basic block or create new basic blocks for labels. 769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Control flow. 771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Goto(RawMachineLabel* label); 772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Branch(Node* condition, RawMachineLabel* true_val, 773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RawMachineLabel* false_val); 774f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void Switch(Node* index, RawMachineLabel* default_label, 775f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const int32_t* case_values, RawMachineLabel** case_labels, 776f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t case_count); 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Return(Node* value); 778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Return(Node* v1, Node* v2); 779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Return(Node* v1, Node* v2, Node* v3); 780c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void PopAndReturn(Node* pop, Node* value); 781c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void PopAndReturn(Node* pop, Node* v1, Node* v2); 782c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void PopAndReturn(Node* pop, Node* v1, Node* v2, Node* v3); 783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Bind(RawMachineLabel* label); 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Deoptimize(Node* state); 78513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void DebugBreak(); 78613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void Comment(const char* msg); 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 788f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Add success / exception successor blocks and ends the current block ending 789f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // in a potentially throwing call node. 790f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void Continuations(Node* call, RawMachineLabel* if_success, 791f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RawMachineLabel* if_exception); 792f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Variables. 794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Phi(MachineRepresentation rep, Node* n1, Node* n2) { 795109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(common()->Phi(rep, 2), n1, n2, graph()->start()); 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3) { 798109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(common()->Phi(rep, 3), n1, n2, n3, graph()->start()); 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3, Node* n4) { 801109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(common()->Phi(rep, 4), n1, n2, n3, n4, graph()->start()); 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 803109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* Phi(MachineRepresentation rep, int input_count, Node* const* inputs); 804109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void AppendPhiInput(Node* phi, Node* new_input); 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // =========================================================================== 807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The following generic node creation methods can be used for operators that 808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // are not covered by the above utility methods. There should rarely be a need 809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to do that outside of testing though. 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 811109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* AddNode(const Operator* op, int input_count, Node* const* inputs); 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* AddNode(const Operator* op) { 814109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return AddNode(op, 0, static_cast<Node* const*>(nullptr)); 815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class... TArgs> 818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* AddNode(const Operator* op, Node* n1, TArgs... args) { 819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* buffer[] = {n1, args...}; 820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AddNode(op, sizeof...(args) + 1, buffer); 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 824109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Node* MakeNode(const Operator* op, int input_count, Node* const* inputs); 825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BasicBlock* Use(RawMachineLabel* label); 826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BasicBlock* EnsureBlock(RawMachineLabel* label); 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock* CurrentBlock(); 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Schedule* schedule() { return schedule_; } 830f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch size_t parameter_count() const { return call_descriptor_->ParameterCount(); } 831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate_; 833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Graph* graph_; 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Schedule* schedule_; 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine_; 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CommonOperatorBuilder common_; 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallDescriptor* call_descriptor_; 838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NodeVector parameters_; 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock* current_block_; 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_COPY_AND_ASSIGN(RawMachineAssembler); 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 844c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE RawMachineLabel final { 845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 8463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch enum Type { kDeferred, kNonDeferred }; 8473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 8483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch explicit RawMachineLabel(Type type = kNonDeferred) 8493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch : deferred_(type == kDeferred) {} 850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ~RawMachineLabel(); 851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 8533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch BasicBlock* block_ = nullptr; 8543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool used_ = false; 8553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool bound_ = false; 8563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool deferred_; 857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class RawMachineAssembler; 858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_COPY_AND_ASSIGN(RawMachineLabel); 859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace compiler 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ 866