1f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
5fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org#ifndef V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_
6fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org#define V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_
7f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
8f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#include <ctype.h>
9f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/globals.h"
11f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm64/assembler-arm64-inl.h"
134b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm64/assembler-arm64.h"
14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm64/instrument-arm64.h"
154b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm64/macro-assembler-arm64.h"
1621d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org#include "src/base/bits.h"
17f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
18f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
19f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace v8 {
20f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace internal {
21f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
22f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
23f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgMemOperand FieldMemOperand(Register object, int offset) {
24f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MemOperand(object, offset - kHeapObjectTag);
25f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
26f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
27f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
28f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgMemOperand UntagSmiFieldMemOperand(Register object, int offset) {
29f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return UntagSmiMemOperand(object, offset - kHeapObjectTag);
30f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
31f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
32f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
33f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgMemOperand UntagSmiMemOperand(Register object, int offset) {
34f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Assumes that Smis are shifted by 32 bits and little endianness.
35f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  STATIC_ASSERT(kSmiShift == 32);
36f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MemOperand(object, offset + (kSmiShift / kBitsPerByte));
37f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
38f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
39f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
40f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgHandle<Object> MacroAssembler::CodeObject() {
41e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!code_object_.is_null());
42f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return code_object_;
43f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
44f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
45f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
46f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::And(const Register& rd,
47f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
48f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
49e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
50e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
51f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(rd, rn, operand, AND);
52f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
53f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
54f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
55f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ands(const Register& rd,
56f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
57f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand) {
58e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
59e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
60f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(rd, rn, operand, ANDS);
61f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
62f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
63f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
64f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Tst(const Register& rn,
65f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
66e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
67f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(AppropriateZeroRegFor(rn), rn, operand, ANDS);
68f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
69f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
70f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
71f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Bic(const Register& rd,
72f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
73f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
74e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
75e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
76f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(rd, rn, operand, BIC);
77f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
78f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
79f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
80f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Bics(const Register& rd,
81f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
82f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand) {
83e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
84e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
85f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(rd, rn, operand, BICS);
86f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
87f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
88f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
89f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Orr(const Register& rd,
90f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
91f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
92e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
93e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
94f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(rd, rn, operand, ORR);
95f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
96f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
97f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
98f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Orn(const Register& rd,
99f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
100f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
101e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
102e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
103f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(rd, rn, operand, ORN);
104f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
105f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
107f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Eor(const Register& rd,
108f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
109f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
110e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
111e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
112f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(rd, rn, operand, EOR);
113f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
114f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
115f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Eon(const Register& rd,
117f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
118f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
119e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
120e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LogicalMacro(rd, rn, operand, EON);
122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
123f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
124f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
125f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ccmp(const Register& rn,
126f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand,
127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          StatusFlags nzcv,
128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          Condition cond) {
129e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
130e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  if (operand.IsImmediate() && (operand.ImmediateValue() < 0)) {
131e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    ConditionalCompareMacro(rn, -operand.ImmediateValue(), nzcv, cond, CCMN);
132f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
133f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    ConditionalCompareMacro(rn, operand, nzcv, cond, CCMP);
134f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
135f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
136f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
137f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
138f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ccmn(const Register& rn,
139f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand,
140f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          StatusFlags nzcv,
141f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          Condition cond) {
142e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
143e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  if (operand.IsImmediate() && (operand.ImmediateValue() < 0)) {
144e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    ConditionalCompareMacro(rn, -operand.ImmediateValue(), nzcv, cond, CCMP);
145f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
146f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    ConditionalCompareMacro(rn, operand, nzcv, cond, CCMN);
147f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
148f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
149f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
150f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
151f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Add(const Register& rd,
152f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
153f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
154e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
155f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (operand.IsImmediate() && (operand.ImmediateValue() < 0) &&
156f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      IsImmAddSub(-operand.ImmediateValue())) {
157e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    AddSubMacro(rd, rn, -operand.ImmediateValue(), LeaveFlags, SUB);
158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    AddSubMacro(rd, rn, operand, LeaveFlags, ADD);
160f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
162f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
163f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Adds(const Register& rd,
164f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
165f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand) {
166e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
167f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (operand.IsImmediate() && (operand.ImmediateValue() < 0) &&
168f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      IsImmAddSub(-operand.ImmediateValue())) {
169e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    AddSubMacro(rd, rn, -operand.ImmediateValue(), SetFlags, SUB);
170f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
171f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    AddSubMacro(rd, rn, operand, SetFlags, ADD);
172f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
173f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
174f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
175f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
176f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sub(const Register& rd,
177f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
178f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
179e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
180f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (operand.IsImmediate() && (operand.ImmediateValue() < 0) &&
181f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      IsImmAddSub(-operand.ImmediateValue())) {
182e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    AddSubMacro(rd, rn, -operand.ImmediateValue(), LeaveFlags, ADD);
183f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
184f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    AddSubMacro(rd, rn, operand, LeaveFlags, SUB);
185f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
186f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
187f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
188f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Subs(const Register& rd,
190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand) {
192e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
193f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (operand.IsImmediate() && (operand.ImmediateValue() < 0) &&
194f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      IsImmAddSub(-operand.ImmediateValue())) {
195e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    AddSubMacro(rd, rn, -operand.ImmediateValue(), SetFlags, ADD);
196f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
197f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    AddSubMacro(rd, rn, operand, SetFlags, SUB);
198f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
199f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
201f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
202f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Cmn(const Register& rn, const Operand& operand) {
203e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Adds(AppropriateZeroRegFor(rn), rn, operand);
205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Cmp(const Register& rn, const Operand& operand) {
209e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
210f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Subs(AppropriateZeroRegFor(rn), rn, operand);
211f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
212f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
213f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
214f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Neg(const Register& rd,
215f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
216e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
217e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
218f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (operand.IsImmediate()) {
219e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    Mov(rd, -operand.ImmediateValue());
220f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
221f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Sub(rd, AppropriateZeroRegFor(rd), operand);
222f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
223f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
224f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
225f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
226f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Negs(const Register& rd,
227f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand) {
228e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
229f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Subs(rd, AppropriateZeroRegFor(rd), operand);
230f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
231f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
232f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
233f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Adc(const Register& rd,
234f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
235f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
236e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
237e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
238f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  AddSubWithCarryMacro(rd, rn, operand, LeaveFlags, ADC);
239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
240f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
241f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
242f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Adcs(const Register& rd,
243f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
244f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand) {
245e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
246e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
247f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  AddSubWithCarryMacro(rd, rn, operand, SetFlags, ADC);
248f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
249f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
250f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
251f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sbc(const Register& rd,
252f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
253f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
254e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
256f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  AddSubWithCarryMacro(rd, rn, operand, LeaveFlags, SBC);
257f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
258f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
259f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
260f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sbcs(const Register& rd,
261f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
262f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand) {
263e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
264e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
265f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  AddSubWithCarryMacro(rd, rn, operand, SetFlags, SBC);
266f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
267f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
268f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
269f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ngc(const Register& rd,
270f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Operand& operand) {
271e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
272e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
273f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Register zr = AppropriateZeroRegFor(rd);
274f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Sbc(rd, zr, operand);
275f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
276f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
277f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
278f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ngcs(const Register& rd,
279f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Operand& operand) {
280e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
281e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
282f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Register zr = AppropriateZeroRegFor(rd);
283f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Sbcs(rd, zr, operand);
284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
285f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
286f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
287f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Mvn(const Register& rd, uint64_t imm) {
288e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
289e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
290f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Mov(rd, ~imm);
291f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#define DEFINE_FUNCTION(FN, REGTYPE, REG, OP)                         \
295f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::FN(const REGTYPE REG, const MemOperand& addr) {  \
296e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);                                  \
297f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LoadStoreMacro(REG, addr, OP);                                      \
298f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
299f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLS_MACRO_LIST(DEFINE_FUNCTION)
300f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#undef DEFINE_FUNCTION
301f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
302f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
3038640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org#define DEFINE_FUNCTION(FN, REGTYPE, REG, REG2, OP)              \
3048640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  void MacroAssembler::FN(const REGTYPE REG, const REGTYPE REG2, \
3058640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org                          const MemOperand& addr) {              \
3068640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org    DCHECK(allow_macro_instructions_);                           \
3078640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org    LoadStorePairMacro(REG, REG2, addr, OP);                     \
3088640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  }
3098640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgLSPAIR_MACRO_LIST(DEFINE_FUNCTION)
3108640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org#undef DEFINE_FUNCTION
3118640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
3128640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
313f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Asr(const Register& rd,
314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         unsigned shift) {
316e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
317e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
318f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  asr(rd, rn, shift);
319f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
320f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
321f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
322f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Asr(const Register& rd,
323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rm) {
325e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
326e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  asrv(rd, rn, rm);
328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::B(Label* label) {
332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  b(label);
3339801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  CheckVeneerPool(false, false);
334f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
335f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
337f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::B(Condition cond, Label* label) {
338e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  B(label, cond);
340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
341f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
342f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
343f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Bfi(const Register& rd,
344f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
345f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         unsigned lsb,
346f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         unsigned width) {
347e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
348e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
349f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bfi(rd, rn, lsb, width);
350f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
351f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
352f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
353f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Bfxil(const Register& rd,
354f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
355f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           unsigned lsb,
356f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           unsigned width) {
357e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
358e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
359f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bfxil(rd, rn, lsb, width);
360f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
361f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
362f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
363f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Bind(Label* label) {
364e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
365f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bind(label);
366f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
367f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Bl(Label* label) {
370e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
371f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bl(label);
372f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
373f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
374f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
375f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Blr(const Register& xn) {
376e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
377e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!xn.IsZero());
378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  blr(xn);
379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
380f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
381f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
382f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Br(const Register& xn) {
383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
384e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!xn.IsZero());
385f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  br(xn);
386f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
387f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
388f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
389f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Brk(int code) {
390e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
391f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  brk(code);
392f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
393f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
394f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
395f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Cinc(const Register& rd,
396f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
397f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          Condition cond) {
398e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
399e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
400e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
401f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  cinc(rd, rn, cond);
402f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
403f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
404f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
405f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Cinv(const Register& rd,
406f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
407f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          Condition cond) {
408e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
409e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
410e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
411f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  cinv(rd, rn, cond);
412f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
413f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
414f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
415f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Cls(const Register& rd, const Register& rn) {
416e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
417e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
418f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  cls(rd, rn);
419f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
420f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
421f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
422f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Clz(const Register& rd, const Register& rn) {
423e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
424e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
425f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  clz(rd, rn);
426f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
427f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
428f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
429f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Cneg(const Register& rd,
430f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
431f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          Condition cond) {
432e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
433e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
434e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
435f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  cneg(rd, rn, cond);
436f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
437f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
438f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
439f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Conditionally zero the destination register. Only X registers are supported
440f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// due to the truncation side-effect when used on W registers.
441f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::CzeroX(const Register& rd,
442f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            Condition cond) {
443e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
444e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsSP() && rd.Is64Bits());
445e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
446f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  csel(rd, xzr, rd, cond);
447f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
448f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
449f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Conditionally move a value into the destination register. Only X registers
451f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// are supported due to the truncation side-effect when used on W registers.
452f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::CmovX(const Register& rd,
453f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
454f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           Condition cond) {
455e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
456e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsSP());
457e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rd.Is64Bits() && rn.Is64Bits());
458e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
459f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!rd.is(rn)) {
460f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    csel(rd, rn, rd, cond);
461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
463f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
464f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
465f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Cset(const Register& rd, Condition cond) {
466e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
467e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
468e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
469f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  cset(rd, cond);
470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
471f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
472f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Csetm(const Register& rd, Condition cond) {
474e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
475e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
476e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
477f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  csetm(rd, cond);
478f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
479f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
480f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
481f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Csinc(const Register& rd,
482f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
483f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rm,
484f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           Condition cond) {
485e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
486e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
487e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
488f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  csinc(rd, rn, rm, cond);
489f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
490f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
491f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
492f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Csinv(const Register& rd,
493f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
494f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rm,
495f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           Condition cond) {
496e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
497e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
498e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
499f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  csinv(rd, rn, rm, cond);
500f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
501f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
503f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Csneg(const Register& rd,
504f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
505f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rm,
506f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           Condition cond) {
507e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
508e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
509e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
510f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  csneg(rd, rn, rm, cond);
511f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
512f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
513f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Dmb(BarrierDomain domain, BarrierType type) {
515e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
516f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  dmb(domain, type);
517f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
518f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
519f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
520f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Dsb(BarrierDomain domain, BarrierType type) {
521e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
522f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  dsb(domain, type);
523f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
524f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
525f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
526f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Debug(const char* message, uint32_t code, Instr params) {
527e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
528f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  debug(message, code, params);
529f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
530f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Extr(const Register& rd,
533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rm,
535f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          unsigned lsb) {
536e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
537e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
538f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  extr(rd, rn, rm, lsb);
539f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
540f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fabs(const FPRegister& fd, const FPRegister& fn) {
543e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fabs(fd, fn);
545f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
546f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
547f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
548f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fadd(const FPRegister& fd,
549f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fn,
550f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fm) {
551e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
552f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fadd(fd, fn, fm);
553f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
554f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
555f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fccmp(const FPRegister& fn,
557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fm,
558f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           StatusFlags nzcv,
559f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           Condition cond) {
560e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
561e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
562f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fccmp(fn, fm, nzcv, cond);
563f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
564f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
565f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
566f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcmp(const FPRegister& fn, const FPRegister& fm) {
567e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
568f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcmp(fn, fm);
569f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
570f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcmp(const FPRegister& fn, double value) {
573e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (value != 0.0) {
575bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    UseScratchRegisterScope temps(this);
576bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    FPRegister tmp = temps.AcquireSameSizeAs(fn);
577f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Fmov(tmp, value);
578f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    fcmp(fn, tmp);
579f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
580f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    fcmp(fn, value);
581f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
582f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
583f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
584f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
585f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcsel(const FPRegister& fd,
586f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fn,
587f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fm,
588f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           Condition cond) {
589e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
590e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((cond != al) && (cond != nv));
591f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcsel(fd, fn, fm, cond);
592f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
593f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
594f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
595f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvt(const FPRegister& fd, const FPRegister& fn) {
596e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
597f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvt(fd, fn);
598f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
599f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
600f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
601f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvtas(const Register& rd, const FPRegister& fn) {
602e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
603e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
604f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvtas(rd, fn);
605f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
606f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
607f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
608f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvtau(const Register& rd, const FPRegister& fn) {
609e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
610e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
611f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvtau(rd, fn);
612f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
613f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
614f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
615f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvtms(const Register& rd, const FPRegister& fn) {
616e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
617e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
618f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvtms(rd, fn);
619f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
620f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
622f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvtmu(const Register& rd, const FPRegister& fn) {
623e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
624e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
625f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvtmu(rd, fn);
626f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvtns(const Register& rd, const FPRegister& fn) {
630e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
631e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
632f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvtns(rd, fn);
633f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvtnu(const Register& rd, const FPRegister& fn) {
637e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
638e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvtnu(rd, fn);
640f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
641f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
642f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
643f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvtzs(const Register& rd, const FPRegister& fn) {
644e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
645e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
646f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvtzs(rd, fn);
647f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
648f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fcvtzu(const Register& rd, const FPRegister& fn) {
649e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
650e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
651f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fcvtzu(rd, fn);
652f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
653f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
654f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
655f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fdiv(const FPRegister& fd,
656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fn,
657f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fm) {
658e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fdiv(fd, fn, fm);
660f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
663f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmadd(const FPRegister& fd,
664f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fn,
665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fm,
666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fa) {
667e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fmadd(fd, fn, fm, fa);
669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
671f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmax(const FPRegister& fd,
673f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fn,
674f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fm) {
675e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
676f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fmax(fd, fn, fm);
677f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
678f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
679f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
680f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmaxnm(const FPRegister& fd,
681f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fn,
682f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fm) {
683e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
684f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fmaxnm(fd, fn, fm);
685f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
687f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
688f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmin(const FPRegister& fd,
689f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fn,
690f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fm) {
691e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
692f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fmin(fd, fn, fm);
693f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
694f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
695f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
696f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fminnm(const FPRegister& fd,
697f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fn,
698f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fm) {
699e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
700f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fminnm(fd, fn, fm);
701f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
702f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
703f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
704f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmov(FPRegister fd, FPRegister fn) {
705e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
706f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Only emit an instruction if fd and fn are different, and they are both D
707f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // registers. fmov(s0, s0) is not a no-op because it clears the top word of
708f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // d0. Technically, fmov(d0, d0) is not a no-op either because it clears the
709f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // top of q0, but FPRegister does not currently support Q registers.
710f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!fd.Is(fn) || !fd.Is64Bits()) {
711f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    fmov(fd, fn);
712f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
713f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
714f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
715f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
716f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmov(FPRegister fd, Register rn) {
717e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
718f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fmov(fd, rn);
719f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
720f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
721f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
722f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmov(FPRegister fd, double imm) {
723e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
724381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (fd.Is32Bits()) {
725381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Fmov(fd, static_cast<float>(imm));
726381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    return;
727381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
728381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org
729e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(fd.Is64Bits());
730381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (IsImmFP64(imm)) {
731381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    fmov(fd, imm);
732381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) {
733381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    fmov(fd, xzr);
734381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  } else {
735e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    Ldr(fd, imm);
736381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
737381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org}
738381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org
739381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org
740381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.orgvoid MacroAssembler::Fmov(FPRegister fd, float imm) {
741e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
742381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (fd.Is64Bits()) {
743381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Fmov(fd, static_cast<double>(imm));
744381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    return;
745381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
746381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org
747e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(fd.Is32Bits());
748381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (IsImmFP32(imm)) {
749f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    fmov(fd, imm);
750381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) {
751381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    fmov(fd, wzr);
752f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
753bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    UseScratchRegisterScope temps(this);
754381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Register tmp = temps.AcquireW();
755381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    // TODO(all): Use Assembler::ldr(const FPRegister& ft, float imm).
756381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Mov(tmp, float_to_rawbits(imm));
757381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Fmov(fd, tmp);
758f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
759f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
760f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
761f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
762f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmov(Register rd, FPRegister fn) {
763e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
764e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
765f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fmov(rd, fn);
766f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
767f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
768f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
769f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmsub(const FPRegister& fd,
770f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fn,
771f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fm,
772f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const FPRegister& fa) {
773e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
774f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fmsub(fd, fn, fm, fa);
775f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
776f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
777f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
778f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fmul(const FPRegister& fd,
779f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fn,
780f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fm) {
781e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
782f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fmul(fd, fn, fm);
783f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
784f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
785f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
786f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fneg(const FPRegister& fd, const FPRegister& fn) {
787e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
788f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fneg(fd, fn);
789f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
790f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
791f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
792f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fnmadd(const FPRegister& fd,
793f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fn,
794f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fm,
795f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fa) {
796e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
797f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fnmadd(fd, fn, fm, fa);
798f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
799f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
800f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
801f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fnmsub(const FPRegister& fd,
802f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fn,
803f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fm,
804f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const FPRegister& fa) {
805e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
806f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fnmsub(fd, fn, fm, fa);
807f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
808f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
809f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
810f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Frinta(const FPRegister& fd, const FPRegister& fn) {
811e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
812f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  frinta(fd, fn);
813f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
814f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
815f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
816255043f8054e713a64509c707cfabadd42344683machenbach@chromium.orgvoid MacroAssembler::Frintm(const FPRegister& fd, const FPRegister& fn) {
817e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
818255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org  frintm(fd, fn);
819255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org}
820255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
821255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
822f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Frintn(const FPRegister& fd, const FPRegister& fn) {
823e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
824f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  frintn(fd, fn);
825f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
826f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
827f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
828f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Frintz(const FPRegister& fd, const FPRegister& fn) {
829e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
830f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  frintz(fd, fn);
831f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
832f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
833f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
834f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fsqrt(const FPRegister& fd, const FPRegister& fn) {
835e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
836f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fsqrt(fd, fn);
837f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
838f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
839f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
840f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Fsub(const FPRegister& fd,
841f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fn,
842f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const FPRegister& fm) {
843e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
844f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  fsub(fd, fn, fm);
845f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
846f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
847f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
848f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Hint(SystemHint code) {
849e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
850f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  hint(code);
851f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
852f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
853f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
854f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Hlt(int code) {
855e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
856f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  hlt(code);
857f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
858f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
859f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
860f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Isb() {
861e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
862f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  isb();
863f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
864f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
865f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
866f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ldnp(const CPURegister& rt,
867f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const CPURegister& rt2,
868f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const MemOperand& src) {
869e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
870e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!AreAliased(rt, rt2));
871f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ldnp(rt, rt2, src);
872f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
873f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
874f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
875e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.orgvoid MacroAssembler::Ldr(const CPURegister& rt, const Immediate& imm) {
876e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
877e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  ldr(rt, imm);
878f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
879f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
880f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
881e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.orgvoid MacroAssembler::Ldr(const CPURegister& rt, double imm) {
882e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
883e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(rt.Is64Bits());
884e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  ldr(rt, Immediate(double_to_rawbits(imm)));
885f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
886f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
887f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
888f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Lsl(const Register& rd,
889f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
890f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         unsigned shift) {
891e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
892e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
893f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  lsl(rd, rn, shift);
894f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
895f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
896f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
897f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Lsl(const Register& rd,
898f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
899f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rm) {
900e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
901e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
902f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  lslv(rd, rn, rm);
903f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
904f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
905f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
906f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Lsr(const Register& rd,
907f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
908f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         unsigned shift) {
909e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
910e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
911f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  lsr(rd, rn, shift);
912f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
913f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
914f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
915f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Lsr(const Register& rd,
916f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
917f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rm) {
918e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
919e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
920f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  lsrv(rd, rn, rm);
921f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
922f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
923f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
924f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Madd(const Register& rd,
925f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
926f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rm,
927f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& ra) {
928e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
929e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  madd(rd, rn, rm, ra);
931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
932f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
933f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
934f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Mneg(const Register& rd,
935f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
936f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rm) {
937e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
938e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
939f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  mneg(rd, rn, rm);
940f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
941f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
942f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
943f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Mov(const Register& rd, const Register& rn) {
944e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
945e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
946f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Emit a register move only if the registers are distinct, or if they are
947f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // not X registers. Note that mov(w0, w0) is not a no-op because it clears
948f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // the top word of x0.
949f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!rd.Is(rn) || !rd.Is64Bits()) {
950f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Assembler::mov(rd, rn);
951f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
952f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
953f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
954f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
955f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Movk(const Register& rd, uint64_t imm, int shift) {
956e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
957e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
958f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  movk(rd, imm, shift);
959f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
960f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
961f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
962f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Mrs(const Register& rt, SystemRegister sysreg) {
963e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
964e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rt.IsZero());
965f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  mrs(rt, sysreg);
966f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
967f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
968f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
969f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Msr(SystemRegister sysreg, const Register& rt) {
970e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
971f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  msr(sysreg, rt);
972f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
973f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
974f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
975f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Msub(const Register& rd,
976f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
977f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rm,
978f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& ra) {
979e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
980e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
981f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  msub(rd, rn, rm, ra);
982f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
983f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
984f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
985f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Mul(const Register& rd,
986f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
987f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rm) {
988e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
989e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
990f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  mul(rd, rn, rm);
991f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
992f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
993f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
994f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Rbit(const Register& rd, const Register& rn) {
995e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
996e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
997f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  rbit(rd, rn);
998f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
999f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1000f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1001f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ret(const Register& xn) {
1002e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1003e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!xn.IsZero());
1004f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ret(xn);
10059801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  CheckVeneerPool(false, false);
1006f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1007f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1008f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1009f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Rev(const Register& rd, const Register& rn) {
1010e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1011e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1012f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  rev(rd, rn);
1013f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1014f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1015f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1016f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Rev16(const Register& rd, const Register& rn) {
1017e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1018e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1019f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  rev16(rd, rn);
1020f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1021f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1022f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1023f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Rev32(const Register& rd, const Register& rn) {
1024e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1025e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1026f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  rev32(rd, rn);
1027f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1028f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1029f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1030f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ror(const Register& rd,
1031f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rs,
1032f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         unsigned shift) {
1033e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1034e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1035f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ror(rd, rs, shift);
1036f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1037f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1038f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1039f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ror(const Register& rd,
1040f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rn,
1041f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                         const Register& rm) {
1042e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1043e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1044f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  rorv(rd, rn, rm);
1045f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1046f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1047f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1048f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sbfiz(const Register& rd,
1049f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
1050f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           unsigned lsb,
1051f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           unsigned width) {
1052e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1053e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1054f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  sbfiz(rd, rn, lsb, width);
1055f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1056f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1057f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1058f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sbfx(const Register& rd,
1059f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
1060f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          unsigned lsb,
1061f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          unsigned width) {
1062e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1063e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1064f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  sbfx(rd, rn, lsb, width);
1065f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1066f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1067f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1068f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Scvtf(const FPRegister& fd,
1069f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
1070f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           unsigned fbits) {
1071e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1072f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  scvtf(fd, rn, fbits);
1073f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1074f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1075f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1076f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sdiv(const Register& rd,
1077f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
1078f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rm) {
1079e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1080e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1081f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  sdiv(rd, rn, rm);
1082f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1083f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1084f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1085f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Smaddl(const Register& rd,
1086f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& rn,
1087f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& rm,
1088f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& ra) {
1089e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1090e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1091f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  smaddl(rd, rn, rm, ra);
1092f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1093f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1094f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1095f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Smsubl(const Register& rd,
1096f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& rn,
1097f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& rm,
1098f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& ra) {
1099e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1100e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1101f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  smsubl(rd, rn, rm, ra);
1102f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1103f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1104f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1105f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Smull(const Register& rd,
1106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
1107f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rm) {
1108e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1109e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1110f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  smull(rd, rn, rm);
1111f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1112f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1113f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1114f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Smulh(const Register& rd,
1115f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
1116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rm) {
1117e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1118e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  smulh(rd, rn, rm);
1120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1123f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Stnp(const CPURegister& rt,
1124f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const CPURegister& rt2,
1125f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const MemOperand& dst) {
1126e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stnp(rt, rt2, dst);
1128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1129f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1130f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1131f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sxtb(const Register& rd, const Register& rn) {
1132e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1133e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1134f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  sxtb(rd, rn);
1135f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1136f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1137f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1138f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sxth(const Register& rd, const Register& rn) {
1139e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1140e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1141f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  sxth(rd, rn);
1142f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1143f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1144f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1145f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Sxtw(const Register& rd, const Register& rn) {
1146e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1147e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1148f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  sxtw(rd, rn);
1149f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1150f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1151f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1152f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ubfiz(const Register& rd,
1153f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
1154f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           unsigned lsb,
1155f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           unsigned width) {
1156e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1157e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ubfiz(rd, rn, lsb, width);
1159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1160f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1162f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ubfx(const Register& rd,
1163f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
1164f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          unsigned lsb,
1165f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          unsigned width) {
1166e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1167e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1168f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ubfx(rd, rn, lsb, width);
1169f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1170f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1171f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1172f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Ucvtf(const FPRegister& fd,
1173f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           const Register& rn,
1174f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                           unsigned fbits) {
1175e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1176f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ucvtf(fd, rn, fbits);
1177f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1178f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1179f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1180f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Udiv(const Register& rd,
1181f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rn,
1182f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                          const Register& rm) {
1183e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1184e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1185f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  udiv(rd, rn, rm);
1186f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1187f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1188f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Umaddl(const Register& rd,
1190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& rn,
1191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& rm,
1192f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& ra) {
1193e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1194e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1195f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  umaddl(rd, rn, rm, ra);
1196f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1197f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1198f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1199f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Umsubl(const Register& rd,
1200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& rn,
1201f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& rm,
1202f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            const Register& ra) {
1203e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1204e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  umsubl(rd, rn, rm, ra);
1206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1209f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Uxtb(const Register& rd, const Register& rn) {
1210e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1211e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1212f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  uxtb(rd, rn);
1213f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1214f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1215f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1216f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Uxth(const Register& rd, const Register& rn) {
1217e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1218e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1219f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  uxth(rd, rn);
1220f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1221f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1222f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1223f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Uxtw(const Register& rd, const Register& rn) {
1224e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(allow_macro_instructions_);
1225e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!rd.IsZero());
1226f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  uxtw(rd, rn);
1227f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1228f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1229f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1230f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::BumpSystemStackPointer(const Operand& space) {
1231e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!csp.Is(sp_));
12323c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  if (!TmpList()->IsEmpty()) {
12333c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    if (CpuFeatures::IsSupported(ALWAYS_ALIGN_CSP)) {
12343c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      UseScratchRegisterScope temps(this);
12353c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      Register temp = temps.AcquireX();
12363c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      Sub(temp, StackPointer(), space);
12373c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      Bic(csp, temp, 0xf);
12383c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    } else {
12393c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      Sub(csp, StackPointer(), space);
12403c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    }
12413c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  } else {
12423c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // TODO(jbramley): Several callers rely on this not using scratch
12433c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // registers, so we use the assembler directly here. However, this means
12443c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // that large immediate values of 'space' cannot be handled cleanly. (Only
12453c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // 24-bits immediates or values of 'space' that can be encoded in one
12463c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // instruction are accepted.) Once we implement our flexible scratch
12473c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // register idea, we could greatly simplify this function.
12483c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    InstructionAccurateScope scope(this);
1249e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(space.IsImmediate());
12503c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // Align to 16 bytes.
1251e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    uint64_t imm = RoundUp(space.ImmediateValue(), 0x10);
1252e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(is_uint24(imm));
1253f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
12543c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    Register source = StackPointer();
12553c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    if (CpuFeatures::IsSupported(ALWAYS_ALIGN_CSP)) {
12563c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      bic(csp, source, 0xf);
12573c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      source = csp;
12583c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    }
12593c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    if (!is_uint12(imm)) {
12603c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      int64_t imm_top_12_bits = imm >> 12;
12613c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      sub(csp, source, imm_top_12_bits << 12);
12623c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      source = csp;
12633c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      imm -= imm_top_12_bits << 12;
12643c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    }
1265f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (imm > 0) {
12663c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      sub(csp, source, imm);
12673c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    }
12683c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  }
12693c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  AssertStackConsistency();
12703c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org}
12713c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
12723c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
12733c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgvoid MacroAssembler::SyncSystemStackPointer() {
1274e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(emit_debug_code());
1275e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!csp.Is(sp_));
12763c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  { InstructionAccurateScope scope(this);
12773c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    if (CpuFeatures::IsSupported(ALWAYS_ALIGN_CSP)) {
12783c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      bic(csp, StackPointer(), 0xf);
12793c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    } else {
12803c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      mov(csp, StackPointer());
1281f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1282f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
12833c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  AssertStackConsistency();
1284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1285f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1286f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1287f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::InitializeRootRegister() {
1288f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ExternalReference roots_array_start =
1289f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      ExternalReference::roots_array_start(isolate());
1290f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Mov(root, Operand(roots_array_start));
1291f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::SmiTag(Register dst, Register src) {
12955366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org  STATIC_ASSERT(kXRegSizeInBits ==
12965366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org                static_cast<unsigned>(kSmiShift + kSmiValueSize));
1297e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(dst.Is64Bits() && src.Is64Bits());
1298f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Lsl(dst, src, kSmiShift);
1299f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1300f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1301f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1302f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::SmiTag(Register smi) { SmiTag(smi, smi); }
1303f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1304f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1305f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::SmiUntag(Register dst, Register src) {
13065366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org  STATIC_ASSERT(kXRegSizeInBits ==
13075366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org                static_cast<unsigned>(kSmiShift + kSmiValueSize));
1308e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(dst.Is64Bits() && src.Is64Bits());
1309f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (FLAG_enable_slow_asserts) {
1310f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    AssertSmi(src);
1311f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1312f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Asr(dst, src, kSmiShift);
1313f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1316f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::SmiUntag(Register smi) { SmiUntag(smi, smi); }
1317f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1318f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1319f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::SmiUntagToDouble(FPRegister dst,
1320f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      Register src,
1321f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      UntagMode mode) {
1322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(dst.Is64Bits() && src.Is64Bits());
1323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (FLAG_enable_slow_asserts && (mode == kNotSpeculativeUntag)) {
1324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    AssertSmi(src);
1325f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1326f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Scvtf(dst, src, kSmiShift);
1327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::SmiUntagToFloat(FPRegister dst,
1331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                     Register src,
1332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                     UntagMode mode) {
1333e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(dst.Is32Bits() && src.Is64Bits());
1334f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (FLAG_enable_slow_asserts && (mode == kNotSpeculativeUntag)) {
1335f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    AssertSmi(src);
1336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1337f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Scvtf(dst, src, kSmiShift);
1338f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
13411e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgvoid MacroAssembler::SmiTagAndPush(Register src) {
13425366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org  STATIC_ASSERT((static_cast<unsigned>(kSmiShift) == kWRegSizeInBits) &&
13435366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org                (static_cast<unsigned>(kSmiValueSize) == kWRegSizeInBits) &&
13445366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org                (kSmiTag == 0));
13451e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  Push(src.W(), wzr);
13461e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
13471e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
13481e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
13491e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgvoid MacroAssembler::SmiTagAndPush(Register src1, Register src2) {
13505366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org  STATIC_ASSERT((static_cast<unsigned>(kSmiShift) == kWRegSizeInBits) &&
13515366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org                (static_cast<unsigned>(kSmiValueSize) == kWRegSizeInBits) &&
13525366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org                (kSmiTag == 0));
13531e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  Push(src1.W(), wzr, src2.W(), wzr);
13541e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
13551e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
13561e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
1357f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::JumpIfSmi(Register value,
1358f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                               Label* smi_label,
1359f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                               Label* not_smi_label) {
1360f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0));
1361f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Check if the tag bit is set.
1362f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (smi_label) {
1363f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Tbz(value, 0, smi_label);
1364f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (not_smi_label) {
1365f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      B(not_smi_label);
1366f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1367f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1368e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(not_smi_label);
1369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Tbnz(value, 0, not_smi_label);
1370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1371f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1372f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1373f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1374f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::JumpIfNotSmi(Register value, Label* not_smi_label) {
1375f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  JumpIfSmi(value, NULL, not_smi_label);
1376f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1377f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::JumpIfBothSmi(Register value1,
1380f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                   Register value2,
1381f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                   Label* both_smi_label,
1382f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                   Label* not_smi_label) {
1383f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0));
1384bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  UseScratchRegisterScope temps(this);
1385bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  Register tmp = temps.AcquireX();
1386f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Check if both tag bits are clear.
1387bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  Orr(tmp, value1, value2);
1388bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  JumpIfSmi(tmp, both_smi_label, not_smi_label);
1389f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1390f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1391f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1392f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::JumpIfEitherSmi(Register value1,
1393f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                     Register value2,
1394f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                     Label* either_smi_label,
1395f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                     Label* not_smi_label) {
1396f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0));
1397bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  UseScratchRegisterScope temps(this);
1398bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  Register tmp = temps.AcquireX();
1399f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Check if either tag bit is clear.
1400bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  And(tmp, value1, value2);
1401bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  JumpIfSmi(tmp, either_smi_label, not_smi_label);
1402f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1403f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1404f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1405f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::JumpIfEitherNotSmi(Register value1,
1406f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                        Register value2,
1407f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                        Label* not_smi_label) {
1408f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  JumpIfBothSmi(value1, value2, NULL, not_smi_label);
1409f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1410f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1411f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1412f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::JumpIfBothNotSmi(Register value1,
1413f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      Register value2,
1414f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      Label* not_smi_label) {
1415f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  JumpIfEitherSmi(value1, value2, NULL, not_smi_label);
1416f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1417f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1418f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
141963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgvoid MacroAssembler::ObjectTag(Register tagged_obj, Register obj) {
142063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  STATIC_ASSERT(kHeapObjectTag == 1);
142163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  if (emit_debug_code()) {
142263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Label ok;
142363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Tbz(obj, 0, &ok);
142463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Abort(kObjectTagged);
142563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Bind(&ok);
142663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  }
142763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  Orr(tagged_obj, obj, kHeapObjectTag);
142863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org}
142963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
143063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
143163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgvoid MacroAssembler::ObjectUntag(Register untagged_obj, Register obj) {
143263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  STATIC_ASSERT(kHeapObjectTag == 1);
143363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  if (emit_debug_code()) {
143463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Label ok;
143563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Tbnz(obj, 0, &ok);
143663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Abort(kObjectNotTagged);
143763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Bind(&ok);
143863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  }
143963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  Bic(untagged_obj, obj, kHeapObjectTag);
144063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org}
144163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
144263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
1443f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::IsObjectNameType(Register object,
1444f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      Register type,
1445f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      Label* fail) {
1446f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CompareObjectType(object, type, type, LAST_NAME_TYPE);
1447f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  B(hi, fail);
1448f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1449f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1451f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::IsObjectJSObjectType(Register heap_object,
1452f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                          Register map,
1453f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                          Register scratch,
1454f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                          Label* fail) {
1455f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Ldr(map, FieldMemOperand(heap_object, HeapObject::kMapOffset));
1456f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  IsInstanceJSObjectType(map, scratch, fail);
1457f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1458f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1459f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1460f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::IsInstanceJSObjectType(Register map,
1461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                            Register scratch,
1462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                            Label* fail) {
1463f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Ldrb(scratch, FieldMemOperand(map, Map::kInstanceTypeOffset));
1464f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // If cmp result is lt, the following ccmp will clear all flags.
1465f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Z == 0, N == V implies gt condition.
1466f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Cmp(scratch, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE);
1467f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Ccmp(scratch, LAST_NONCALLABLE_SPEC_OBJECT_TYPE, NoFlag, ge);
1468f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1469f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // If we didn't get a valid label object just fall through and leave the
1470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // flags updated.
1471f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (fail != NULL) {
1472f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    B(gt, fail);
1473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1474f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1475f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1476f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1477f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::IsObjectJSStringType(Register object,
1478f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                          Register type,
1479f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                          Label* not_string,
1480f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                          Label* string) {
1481f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Ldr(type, FieldMemOperand(object, HeapObject::kMapOffset));
1482f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Ldrb(type.W(), FieldMemOperand(type, Map::kInstanceTypeOffset));
1483f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1484f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  STATIC_ASSERT(kStringTag == 0);
1485e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((string != NULL) || (not_string != NULL));
1486f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (string == NULL) {
1487f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    TestAndBranchIfAnySet(type.W(), kIsNotStringMask, not_string);
1488f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (not_string == NULL) {
1489f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    TestAndBranchIfAllClear(type.W(), kIsNotStringMask, string);
1490f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1491f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    TestAndBranchIfAnySet(type.W(), kIsNotStringMask, not_string);
1492f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    B(string);
1493f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1494f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1495f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1496f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1497f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Push(Handle<Object> handle) {
1498bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  UseScratchRegisterScope temps(this);
1499bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  Register tmp = temps.AcquireX();
1500bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  Mov(tmp, Operand(handle));
1501bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  Push(tmp);
1502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1503f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1504f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1505f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Claim(uint64_t count, uint64_t unit_size) {
1506f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  uint64_t size = count * unit_size;
1507f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1508f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (size == 0) {
1509f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return;
1510f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1511f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1512f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (csp.Is(StackPointer())) {
1513e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(size % 16 == 0);
1514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1515f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    BumpSystemStackPointer(size);
1516f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1517f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1518f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Sub(StackPointer(), StackPointer(), size);
1519f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1520f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1521f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1522f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Claim(const Register& count, uint64_t unit_size) {
1523ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (unit_size == 0) return;
152421d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  DCHECK(base::bits::IsPowerOfTwo64(unit_size));
1525f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
152697b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  const int shift = CountTrailingZeros(unit_size, kXRegSizeInBits);
1527f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  const Operand size(count, LSL, shift);
1528f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1529f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (size.IsZero()) {
1530f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return;
1531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!csp.Is(StackPointer())) {
1534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    BumpSystemStackPointer(size);
1535f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1536f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Sub(StackPointer(), StackPointer(), size);
1538f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1539f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1540f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::ClaimBySMI(const Register& count_smi, uint64_t unit_size) {
154221d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  DCHECK(unit_size == 0 || base::bits::IsPowerOfTwo64(unit_size));
154397b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  const int shift = CountTrailingZeros(unit_size, kXRegSizeInBits) - kSmiShift;
1544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  const Operand size(count_smi,
1545f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                     (shift >= 0) ? (LSL) : (LSR),
1546f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                     (shift >= 0) ? (shift) : (-shift));
1547f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1548f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (size.IsZero()) {
1549f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return;
1550f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1551f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1552f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!csp.Is(StackPointer())) {
1553f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    BumpSystemStackPointer(size);
1554f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1555f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Sub(StackPointer(), StackPointer(), size);
1557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1558f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1559f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1560f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Drop(uint64_t count, uint64_t unit_size) {
1561f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  uint64_t size = count * unit_size;
1562f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1563f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (size == 0) {
1564f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return;
1565f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1566f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1567f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Add(StackPointer(), StackPointer(), size);
1568f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1569f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (csp.Is(StackPointer())) {
1570e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(size % 16 == 0);
1571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (emit_debug_code()) {
1572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // It is safe to leave csp where it is when unwinding the JavaScript stack,
1573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // but if we keep it matching StackPointer, the simulator can detect memory
1574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // accesses in the now-free part of the stack.
15753c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    SyncSystemStackPointer();
1576f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1577f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1578f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1579f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1580f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::Drop(const Register& count, uint64_t unit_size) {
1581ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (unit_size == 0) return;
158221d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  DCHECK(base::bits::IsPowerOfTwo64(unit_size));
1583f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
158497b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  const int shift = CountTrailingZeros(unit_size, kXRegSizeInBits);
1585f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  const Operand size(count, LSL, shift);
1586f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1587f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (size.IsZero()) {
1588f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return;
1589f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1590f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1591f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Add(StackPointer(), StackPointer(), size);
1592f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1593f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!csp.Is(StackPointer()) && emit_debug_code()) {
1594f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // It is safe to leave csp where it is when unwinding the JavaScript stack,
1595f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // but if we keep it matching StackPointer, the simulator can detect memory
1596f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // accesses in the now-free part of the stack.
15973c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    SyncSystemStackPointer();
1598f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1599f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1600f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1601f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1602f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::DropBySMI(const Register& count_smi, uint64_t unit_size) {
160321d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  DCHECK(unit_size == 0 || base::bits::IsPowerOfTwo64(unit_size));
160497b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  const int shift = CountTrailingZeros(unit_size, kXRegSizeInBits) - kSmiShift;
1605f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  const Operand size(count_smi,
1606f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                     (shift >= 0) ? (LSL) : (LSR),
1607f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                     (shift >= 0) ? (shift) : (-shift));
1608f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1609f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (size.IsZero()) {
1610f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return;
1611f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1612f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1613f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Add(StackPointer(), StackPointer(), size);
1614f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1615f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!csp.Is(StackPointer()) && emit_debug_code()) {
1616f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // It is safe to leave csp where it is when unwinding the JavaScript stack,
1617f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // but if we keep it matching StackPointer, the simulator can detect memory
1618f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // accesses in the now-free part of the stack.
16193c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    SyncSystemStackPointer();
1620f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1622f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::CompareAndBranch(const Register& lhs,
1625f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      const Operand& rhs,
1626f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      Condition cond,
1627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      Label* label) {
1628e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  if (rhs.IsImmediate() && (rhs.ImmediateValue() == 0) &&
1629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      ((cond == eq) || (cond == ne))) {
1630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (cond == eq) {
1631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      Cbz(lhs, label);
1632f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
1633f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      Cbnz(lhs, label);
1634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Cmp(lhs, rhs);
1637f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    B(cond, label);
1638f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1640f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1641f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1642f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::TestAndBranchIfAnySet(const Register& reg,
1643f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                           const uint64_t bit_pattern,
1644f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                           Label* label) {
1645f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int bits = reg.SizeInBits();
1646e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(CountSetBits(bit_pattern, bits) > 0);
1647f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (CountSetBits(bit_pattern, bits) == 1) {
1648f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Tbnz(reg, MaskToBit(bit_pattern), label);
1649f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1650f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Tst(reg, bit_pattern);
1651f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    B(ne, label);
1652f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1653f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1654f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1655f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::TestAndBranchIfAllClear(const Register& reg,
1657f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                             const uint64_t bit_pattern,
1658f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                             Label* label) {
1659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int bits = reg.SizeInBits();
1660e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(CountSetBits(bit_pattern, bits) > 0);
1661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (CountSetBits(bit_pattern, bits) == 1) {
1662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Tbz(reg, MaskToBit(bit_pattern), label);
1663f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1664f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Tst(reg, bit_pattern);
1665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    B(eq, label);
1666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1667f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::InlineData(uint64_t data) {
1671e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_uint16(data));
1672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  InstructionAccurateScope scope(this, 1);
1673f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  movz(xzr, data);
1674f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1675f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1676f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1677f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::EnableInstrumentation() {
1678f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  InstructionAccurateScope scope(this, 1);
1679f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  movn(xzr, InstrumentStateEnable);
1680f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1681f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1682f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1683f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::DisableInstrumentation() {
1684f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  InstructionAccurateScope scope(this, 1);
1685f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  movn(xzr, InstrumentStateDisable);
1686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1687f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1688f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1689f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid MacroAssembler::AnnotateInstrumentation(const char* marker_name) {
1690e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(strlen(marker_name) == 2);
1691f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1692f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // We allow only printable characters in the marker names. Unprintable
1693f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // characters are reserved for controlling features of the instrumentation.
1694e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(isprint(marker_name[0]) && isprint(marker_name[1]));
1695f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1696f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  InstructionAccurateScope scope(this, 1);
1697f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  movn(xzr, (marker_name[1] << 8) | marker_name[0]);
1698f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1699f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1700f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} }  // namespace v8::internal
1701f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1702fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org#endif  // V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_
1703