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