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
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Asr(const Register& rd,
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         unsigned shift) {
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  asr(rd, rn, shift);
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Asr(const Register& rd,
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rm) {
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  asrv(rd, rn, rm);
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::B(Label* label) {
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  b(label);
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckVeneerPool(false, false);
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::B(Condition cond, Label* label) {
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  B(label, cond);
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Bfi(const Register& rd,
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         unsigned lsb,
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         unsigned width) {
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bfi(rd, rn, lsb, width);
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Bfxil(const Register& rd,
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           unsigned lsb,
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           unsigned width) {
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bfxil(rd, rn, lsb, width);
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Bind(Label* label) {
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bind(label);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Bl(Label* label) {
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bl(label);
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Blr(const Register& xn) {
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!xn.IsZero());
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  blr(xn);
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Br(const Register& xn) {
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!xn.IsZero());
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  br(xn);
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Brk(int code) {
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  brk(code);
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Cinc(const Register& rd,
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          Condition cond) {
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  cinc(rd, rn, cond);
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Cinv(const Register& rd,
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          Condition cond) {
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  cinv(rd, rn, cond);
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Cls(const Register& rd, const Register& rn) {
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  cls(rd, rn);
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Clz(const Register& rd, const Register& rn) {
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  clz(rd, rn);
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Cneg(const Register& rd,
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          Condition cond) {
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  cneg(rd, rn, cond);
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conditionally zero the destination register. Only X registers are supported
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// due to the truncation side-effect when used on W registers.
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::CzeroX(const Register& rd,
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            Condition cond) {
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsSP() && rd.Is64Bits());
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  csel(rd, xzr, rd, cond);
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conditionally move a value into the destination register. Only X registers
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// are supported due to the truncation side-effect when used on W registers.
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::CmovX(const Register& rd,
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Condition cond) {
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsSP());
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(rd.Is64Bits() && rn.Is64Bits());
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!rd.is(rn)) {
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    csel(rd, rn, rd, cond);
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Cset(const Register& rd, Condition cond) {
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  cset(rd, cond);
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Csetm(const Register& rd, Condition cond) {
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  csetm(rd, cond);
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Csinc(const Register& rd,
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rm,
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Condition cond) {
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  csinc(rd, rn, rm, cond);
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Csinv(const Register& rd,
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rm,
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Condition cond) {
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  csinv(rd, rn, rm, cond);
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Csneg(const Register& rd,
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rm,
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Condition cond) {
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  csneg(rd, rn, rm, cond);
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Dmb(BarrierDomain domain, BarrierType type) {
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  dmb(domain, type);
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Dsb(BarrierDomain domain, BarrierType type) {
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  dsb(domain, type);
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Debug(const char* message, uint32_t code, Instr params) {
527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  debug(message, code, params);
529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Extr(const Register& rd,
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rm,
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          unsigned lsb) {
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  extr(rd, rn, rm, lsb);
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fabs(const FPRegister& fd, const FPRegister& fn) {
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fabs(fd, fn);
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fadd(const FPRegister& fd,
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fn,
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fm) {
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fadd(fd, fn, fm);
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fccmp(const FPRegister& fn,
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fm,
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           StatusFlags nzcv,
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Condition cond) {
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fccmp(fn, fm, nzcv, cond);
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcmp(const FPRegister& fn, const FPRegister& fm) {
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcmp(fn, fm);
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcmp(const FPRegister& fn, double value) {
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value != 0.0) {
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UseScratchRegisterScope temps(this);
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FPRegister tmp = temps.AcquireSameSizeAs(fn);
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Fmov(tmp, value);
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fcmp(fn, tmp);
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fcmp(fn, value);
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcsel(const FPRegister& fd,
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fn,
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fm,
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Condition cond) {
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((cond != al) && (cond != nv));
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcsel(fd, fn, fm, cond);
592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvt(const FPRegister& fd, const FPRegister& fn) {
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvt(fd, fn);
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvtas(const Register& rd, const FPRegister& fn) {
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvtas(rd, fn);
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvtau(const Register& rd, const FPRegister& fn) {
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvtau(rd, fn);
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvtms(const Register& rd, const FPRegister& fn) {
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvtms(rd, fn);
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvtmu(const Register& rd, const FPRegister& fn) {
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvtmu(rd, fn);
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvtns(const Register& rd, const FPRegister& fn) {
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvtns(rd, fn);
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvtnu(const Register& rd, const FPRegister& fn) {
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvtnu(rd, fn);
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvtzs(const Register& rd, const FPRegister& fn) {
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvtzs(rd, fn);
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fcvtzu(const Register& rd, const FPRegister& fn) {
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fcvtzu(rd, fn);
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fdiv(const FPRegister& fd,
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fn,
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fm) {
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fdiv(fd, fn, fm);
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmadd(const FPRegister& fd,
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fn,
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fm,
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fa) {
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fmadd(fd, fn, fm, fa);
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmax(const FPRegister& fd,
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fn,
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fm) {
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fmax(fd, fn, fm);
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmaxnm(const FPRegister& fd,
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fn,
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fm) {
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fmaxnm(fd, fn, fm);
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmin(const FPRegister& fd,
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fn,
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fm) {
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fmin(fd, fn, fm);
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fminnm(const FPRegister& fd,
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fn,
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fm) {
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fminnm(fd, fn, fm);
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmov(FPRegister fd, FPRegister fn) {
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Only emit an instruction if fd and fn are different, and they are both D
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // registers. fmov(s0, s0) is not a no-op because it clears the top word of
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // d0. Technically, fmov(d0, d0) is not a no-op either because it clears the
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // top of q0, but FPRegister does not currently support Q registers.
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!fd.Is(fn) || !fd.Is64Bits()) {
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fmov(fd, fn);
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmov(FPRegister fd, Register rn) {
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fmov(fd, rn);
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmov(FPRegister fd, double imm) {
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (fd.Is32Bits()) {
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Fmov(fd, static_cast<float>(imm));
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(fd.Is64Bits());
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsImmFP64(imm)) {
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fmov(fd, imm);
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) {
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fmov(fd, xzr);
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Ldr(fd, imm);
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmov(FPRegister fd, float imm) {
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (fd.Is64Bits()) {
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Fmov(fd, static_cast<double>(imm));
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(fd.Is32Bits());
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsImmFP32(imm)) {
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fmov(fd, imm);
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) {
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fmov(fd, wzr);
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UseScratchRegisterScope temps(this);
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Register tmp = temps.AcquireW();
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(all): Use Assembler::ldr(const FPRegister& ft, float imm).
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Mov(tmp, float_to_rawbits(imm));
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Fmov(fd, tmp);
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmov(Register rd, FPRegister fn) {
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fmov(rd, fn);
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmsub(const FPRegister& fd,
770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fn,
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fm,
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const FPRegister& fa) {
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fmsub(fd, fn, fm, fa);
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fmul(const FPRegister& fd,
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fn,
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fm) {
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fmul(fd, fn, fm);
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fneg(const FPRegister& fd, const FPRegister& fn) {
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fneg(fd, fn);
789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fnmadd(const FPRegister& fd,
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fn,
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fm,
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fa) {
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fnmadd(fd, fn, fm, fa);
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fnmsub(const FPRegister& fd,
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fn,
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fm,
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const FPRegister& fa) {
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fnmsub(fd, fn, fm, fa);
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Frinta(const FPRegister& fd, const FPRegister& fn) {
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  frinta(fd, fn);
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Frintm(const FPRegister& fd, const FPRegister& fn) {
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  frintm(fd, fn);
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Frintn(const FPRegister& fd, const FPRegister& fn) {
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  frintn(fd, fn);
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Frintz(const FPRegister& fd, const FPRegister& fn) {
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  frintz(fd, fn);
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fsqrt(const FPRegister& fd, const FPRegister& fn) {
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fsqrt(fd, fn);
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Fsub(const FPRegister& fd,
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fn,
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const FPRegister& fm) {
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fsub(fd, fn, fm);
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Hint(SystemHint code) {
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  hint(code);
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Hlt(int code) {
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  hlt(code);
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Isb() {
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isb();
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ldnp(const CPURegister& rt,
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const CPURegister& rt2,
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const MemOperand& src) {
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!AreAliased(rt, rt2));
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ldnp(rt, rt2, src);
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ldr(const CPURegister& rt, const Immediate& imm) {
876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ldr(rt, imm);
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ldr(const CPURegister& rt, double imm) {
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(rt.Is64Bits());
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ldr(rt, Immediate(double_to_rawbits(imm)));
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Lsl(const Register& rd,
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         unsigned shift) {
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  lsl(rd, rn, shift);
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Lsl(const Register& rd,
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rm) {
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  lslv(rd, rn, rm);
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Lsr(const Register& rd,
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         unsigned shift) {
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  lsr(rd, rn, shift);
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Lsr(const Register& rd,
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rm) {
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  lsrv(rd, rn, rm);
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Madd(const Register& rd,
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rm,
927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& ra) {
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  madd(rd, rn, rm, ra);
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Mneg(const Register& rd,
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rm) {
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  mneg(rd, rn, rm);
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Mov(const Register& rd, const Register& rn) {
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Emit a register move only if the registers are distinct, or if they are
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // not X registers. Note that mov(w0, w0) is not a no-op because it clears
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the top word of x0.
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!rd.Is(rn) || !rd.Is64Bits()) {
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Assembler::mov(rd, rn);
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Movk(const Register& rd, uint64_t imm, int shift) {
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  movk(rd, imm, shift);
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Mrs(const Register& rt, SystemRegister sysreg) {
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rt.IsZero());
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  mrs(rt, sysreg);
966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Msr(SystemRegister sysreg, const Register& rt) {
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  msr(sysreg, rt);
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Msub(const Register& rd,
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rm,
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& ra) {
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  msub(rd, rn, rm, ra);
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Mul(const Register& rd,
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rm) {
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  mul(rd, rn, rm);
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Rbit(const Register& rd, const Register& rn) {
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  rbit(rd, rn);
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ret(const Register& xn) {
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!xn.IsZero());
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ret(xn);
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckVeneerPool(false, false);
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Rev(const Register& rd, const Register& rn) {
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  rev(rd, rn);
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Rev16(const Register& rd, const Register& rn) {
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  rev16(rd, rn);
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Rev32(const Register& rd, const Register& rn) {
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  rev32(rd, rn);
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ror(const Register& rd,
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rs,
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         unsigned shift) {
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ror(rd, rs, shift);
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ror(const Register& rd,
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rn,
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const Register& rm) {
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  rorv(rd, rn, rm);
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Sbfiz(const Register& rd,
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           unsigned lsb,
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           unsigned width) {
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sbfiz(rd, rn, lsb, width);
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Sbfx(const Register& rd,
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          unsigned lsb,
1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          unsigned width) {
1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sbfx(rd, rn, lsb, width);
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Scvtf(const FPRegister& fd,
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           unsigned fbits) {
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  scvtf(fd, rn, fbits);
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Sdiv(const Register& rd,
1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rm) {
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sdiv(rd, rn, rm);
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Smaddl(const Register& rd,
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& rn,
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& rm,
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& ra) {
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  smaddl(rd, rn, rm, ra);
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Smsubl(const Register& rd,
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& rn,
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& rm,
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& ra) {
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  smsubl(rd, rn, rm, ra);
1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Smull(const Register& rd,
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rm) {
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  smull(rd, rn, rm);
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Smulh(const Register& rd,
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rm) {
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  smulh(rd, rn, rm);
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Stnp(const CPURegister& rt,
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const CPURegister& rt2,
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const MemOperand& dst) {
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stnp(rt, rt2, dst);
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Sxtb(const Register& rd, const Register& rn) {
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sxtb(rd, rn);
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Sxth(const Register& rd, const Register& rn) {
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sxth(rd, rn);
1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Sxtw(const Register& rd, const Register& rn) {
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  sxtw(rd, rn);
1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ubfiz(const Register& rd,
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           unsigned lsb,
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           unsigned width) {
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ubfiz(rd, rn, lsb, width);
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ubfx(const Register& rd,
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          unsigned lsb,
1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          unsigned width) {
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ubfx(rd, rn, lsb, width);
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Ucvtf(const FPRegister& fd,
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           const Register& rn,
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           unsigned fbits) {
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ucvtf(fd, rn, fbits);
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Udiv(const Register& rd,
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rn,
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const Register& rm) {
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  udiv(rd, rn, rm);
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Umaddl(const Register& rd,
1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& rn,
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& rm,
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& ra) {
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  umaddl(rd, rn, rm, ra);
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Umsubl(const Register& rd,
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& rn,
1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& rm,
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            const Register& ra) {
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  umsubl(rd, rn, rm, ra);
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Uxtb(const Register& rd, const Register& rn) {
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uxtb(rd, rn);
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Uxth(const Register& rd, const Register& rn) {
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uxth(rd, rn);
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Uxtw(const Register& rd, const Register& rn) {
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(allow_macro_instructions_);
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!rd.IsZero());
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uxtw(rd, rn);
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::BumpSystemStackPointer(const Operand& space) {
1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!csp.Is(sp_));
1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!TmpList()->IsEmpty()) {
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (CpuFeatures::IsSupported(ALWAYS_ALIGN_CSP)) {
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UseScratchRegisterScope temps(this);
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Register temp = temps.AcquireX();
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Sub(temp, StackPointer(), space);
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Bic(csp, temp, 0xf);
1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Sub(csp, StackPointer(), space);
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(jbramley): Several callers rely on this not using scratch
1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // registers, so we use the assembler directly here. However, this means
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // that large immediate values of 'space' cannot be handled cleanly. (Only
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // 24-bits immediates or values of 'space' that can be encoded in one
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // instruction are accepted.) Once we implement our flexible scratch
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // register idea, we could greatly simplify this function.
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InstructionAccurateScope scope(this);
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(space.IsImmediate());
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Align to 16 bytes.
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint64_t imm = RoundUp(space.ImmediateValue(), 0x10);
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(is_uint24(imm));
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Register source = StackPointer();
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (CpuFeatures::IsSupported(ALWAYS_ALIGN_CSP)) {
1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      bic(csp, source, 0xf);
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      source = csp;
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!is_uint12(imm)) {
1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int64_t imm_top_12_bits = imm >> 12;
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      sub(csp, source, imm_top_12_bits << 12);
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      source = csp;
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      imm -= imm_top_12_bits << 12;
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (imm > 0) {
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      sub(csp, source, imm);
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AssertStackConsistency();
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SyncSystemStackPointer() {
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(emit_debug_code());
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!csp.Is(sp_));
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  { InstructionAccurateScope scope(this);
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (CpuFeatures::IsSupported(ALWAYS_ALIGN_CSP)) {
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      bic(csp, StackPointer(), 0xf);
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      mov(csp, StackPointer());
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AssertStackConsistency();
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::InitializeRootRegister() {
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExternalReference roots_array_start =
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ExternalReference::roots_array_start(isolate());
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Mov(root, Operand(roots_array_start));
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SmiTag(Register dst, Register src) {
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(kXRegSizeInBits ==
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                static_cast<unsigned>(kSmiShift + kSmiValueSize));
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(dst.Is64Bits() && src.Is64Bits());
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Lsl(dst, src, kSmiShift);
1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SmiTag(Register smi) { SmiTag(smi, smi); }
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SmiUntag(Register dst, Register src) {
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(kXRegSizeInBits ==
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                static_cast<unsigned>(kSmiShift + kSmiValueSize));
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(dst.Is64Bits() && src.Is64Bits());
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_enable_slow_asserts) {
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AssertSmi(src);
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Asr(dst, src, kSmiShift);
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SmiUntag(Register smi) { SmiUntag(smi, smi); }
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SmiUntagToDouble(FPRegister dst,
1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      Register src,
1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      UntagMode mode) {
1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(dst.Is64Bits() && src.Is64Bits());
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_enable_slow_asserts && (mode == kNotSpeculativeUntag)) {
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AssertSmi(src);
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Scvtf(dst, src, kSmiShift);
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SmiUntagToFloat(FPRegister dst,
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     Register src,
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     UntagMode mode) {
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(dst.Is32Bits() && src.Is64Bits());
1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_enable_slow_asserts && (mode == kNotSpeculativeUntag)) {
1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AssertSmi(src);
1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Scvtf(dst, src, kSmiShift);
1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SmiTagAndPush(Register src) {
1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT((static_cast<unsigned>(kSmiShift) == kWRegSizeInBits) &&
1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                (static_cast<unsigned>(kSmiValueSize) == kWRegSizeInBits) &&
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                (kSmiTag == 0));
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Push(src.W(), wzr);
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::SmiTagAndPush(Register src1, Register src2) {
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT((static_cast<unsigned>(kSmiShift) == kWRegSizeInBits) &&
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                (static_cast<unsigned>(kSmiValueSize) == kWRegSizeInBits) &&
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                (kSmiTag == 0));
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Push(src1.W(), wzr, src2.W(), wzr);
1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::JumpIfSmi(Register value,
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               Label* smi_label,
1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               Label* not_smi_label) {
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0));
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Check if the tag bit is set.
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (smi_label) {
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Tbz(value, 0, smi_label);
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (not_smi_label) {
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      B(not_smi_label);
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(not_smi_label);
1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Tbnz(value, 0, not_smi_label);
1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::JumpIfNotSmi(Register value, Label* not_smi_label) {
1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JumpIfSmi(value, NULL, not_smi_label);
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::JumpIfBothSmi(Register value1,
1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   Register value2,
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   Label* both_smi_label,
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   Label* not_smi_label) {
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0));
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UseScratchRegisterScope temps(this);
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Register tmp = temps.AcquireX();
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Check if both tag bits are clear.
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Orr(tmp, value1, value2);
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JumpIfSmi(tmp, both_smi_label, not_smi_label);
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::JumpIfEitherSmi(Register value1,
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     Register value2,
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     Label* either_smi_label,
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     Label* not_smi_label) {
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0));
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UseScratchRegisterScope temps(this);
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Register tmp = temps.AcquireX();
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Check if either tag bit is clear.
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  And(tmp, value1, value2);
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JumpIfSmi(tmp, either_smi_label, not_smi_label);
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::JumpIfEitherNotSmi(Register value1,
1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Register value2,
1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Label* not_smi_label) {
1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JumpIfBothSmi(value1, value2, NULL, not_smi_label);
1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::JumpIfBothNotSmi(Register value1,
1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      Register value2,
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      Label* not_smi_label) {
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JumpIfEitherSmi(value1, value2, NULL, not_smi_label);
1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::ObjectTag(Register tagged_obj, Register obj) {
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(kHeapObjectTag == 1);
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (emit_debug_code()) {
1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Label ok;
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Tbz(obj, 0, &ok);
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Abort(kObjectTagged);
1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Bind(&ok);
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Orr(tagged_obj, obj, kHeapObjectTag);
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::ObjectUntag(Register untagged_obj, Register obj) {
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(kHeapObjectTag == 1);
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (emit_debug_code()) {
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Label ok;
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Tbnz(obj, 0, &ok);
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Abort(kObjectNotTagged);
1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Bind(&ok);
1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Bic(untagged_obj, obj, kHeapObjectTag);
1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::IsObjectNameType(Register object,
1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      Register type,
1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      Label* fail) {
1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareObjectType(object, type, type, LAST_NAME_TYPE);
1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  B(hi, fail);
1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::IsObjectJSObjectType(Register heap_object,
1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Register map,
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Register scratch,
1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Label* fail) {
1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Ldr(map, FieldMemOperand(heap_object, HeapObject::kMapOffset));
1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  IsInstanceJSObjectType(map, scratch, fail);
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::IsInstanceJSObjectType(Register map,
1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            Register scratch,
1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            Label* fail) {
1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Ldrb(scratch, FieldMemOperand(map, Map::kInstanceTypeOffset));
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If cmp result is lt, the following ccmp will clear all flags.
1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Z == 0, N == V implies gt condition.
1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Cmp(scratch, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE);
1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Ccmp(scratch, LAST_NONCALLABLE_SPEC_OBJECT_TYPE, NoFlag, ge);
1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If we didn't get a valid label object just fall through and leave the
1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // flags updated.
1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (fail != NULL) {
1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    B(gt, fail);
1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::IsObjectJSStringType(Register object,
1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Register type,
1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Label* not_string,
1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Label* string) {
1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Ldr(type, FieldMemOperand(object, HeapObject::kMapOffset));
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Ldrb(type.W(), FieldMemOperand(type, Map::kInstanceTypeOffset));
1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(kStringTag == 0);
1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((string != NULL) || (not_string != NULL));
1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (string == NULL) {
1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestAndBranchIfAnySet(type.W(), kIsNotStringMask, not_string);
1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (not_string == NULL) {
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestAndBranchIfAllClear(type.W(), kIsNotStringMask, string);
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestAndBranchIfAnySet(type.W(), kIsNotStringMask, not_string);
1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    B(string);
1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Push(Handle<Object> handle) {
1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UseScratchRegisterScope temps(this);
1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Register tmp = temps.AcquireX();
1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Mov(tmp, Operand(handle));
1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Push(tmp);
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Claim(uint64_t count, uint64_t unit_size) {
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint64_t size = count * unit_size;
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (size == 0) {
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (csp.Is(StackPointer())) {
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(size % 16 == 0);
1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BumpSystemStackPointer(size);
1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Sub(StackPointer(), StackPointer(), size);
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Claim(const Register& count, uint64_t unit_size) {
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (unit_size == 0) return;
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(base::bits::IsPowerOfTwo64(unit_size));
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int shift = CountTrailingZeros(unit_size, kXRegSizeInBits);
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operand size(count, LSL, shift);
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (size.IsZero()) {
1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!csp.Is(StackPointer())) {
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BumpSystemStackPointer(size);
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Sub(StackPointer(), StackPointer(), size);
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::ClaimBySMI(const Register& count_smi, uint64_t unit_size) {
1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(unit_size == 0 || base::bits::IsPowerOfTwo64(unit_size));
1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int shift = CountTrailingZeros(unit_size, kXRegSizeInBits) - kSmiShift;
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operand size(count_smi,
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     (shift >= 0) ? (LSL) : (LSR),
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     (shift >= 0) ? (shift) : (-shift));
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (size.IsZero()) {
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!csp.Is(StackPointer())) {
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BumpSystemStackPointer(size);
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Sub(StackPointer(), StackPointer(), size);
1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Drop(uint64_t count, uint64_t unit_size) {
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint64_t size = count * unit_size;
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (size == 0) {
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Add(StackPointer(), StackPointer(), size);
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (csp.Is(StackPointer())) {
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(size % 16 == 0);
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (emit_debug_code()) {
1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // It is safe to leave csp where it is when unwinding the JavaScript stack,
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // but if we keep it matching StackPointer, the simulator can detect memory
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // accesses in the now-free part of the stack.
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SyncSystemStackPointer();
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::Drop(const Register& count, uint64_t unit_size) {
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (unit_size == 0) return;
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(base::bits::IsPowerOfTwo64(unit_size));
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int shift = CountTrailingZeros(unit_size, kXRegSizeInBits);
1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operand size(count, LSL, shift);
1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (size.IsZero()) {
1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Add(StackPointer(), StackPointer(), size);
1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!csp.Is(StackPointer()) && emit_debug_code()) {
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // It is safe to leave csp where it is when unwinding the JavaScript stack,
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // but if we keep it matching StackPointer, the simulator can detect memory
1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // accesses in the now-free part of the stack.
1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SyncSystemStackPointer();
1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::DropBySMI(const Register& count_smi, uint64_t unit_size) {
1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(unit_size == 0 || base::bits::IsPowerOfTwo64(unit_size));
1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int shift = CountTrailingZeros(unit_size, kXRegSizeInBits) - kSmiShift;
1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operand size(count_smi,
1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     (shift >= 0) ? (LSL) : (LSR),
1607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     (shift >= 0) ? (shift) : (-shift));
1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (size.IsZero()) {
1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Add(StackPointer(), StackPointer(), size);
1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!csp.Is(StackPointer()) && emit_debug_code()) {
1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // It is safe to leave csp where it is when unwinding the JavaScript stack,
1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // but if we keep it matching StackPointer, the simulator can detect memory
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // accesses in the now-free part of the stack.
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SyncSystemStackPointer();
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::CompareAndBranch(const Register& lhs,
1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      const Operand& rhs,
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      Condition cond,
1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      Label* label) {
1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (rhs.IsImmediate() && (rhs.ImmediateValue() == 0) &&
1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ((cond == eq) || (cond == ne))) {
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (cond == eq) {
1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cbz(lhs, label);
1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cbnz(lhs, label);
1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Cmp(lhs, rhs);
1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    B(cond, label);
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::TestAndBranchIfAnySet(const Register& reg,
1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           const uint64_t bit_pattern,
1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           Label* label) {
1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int bits = reg.SizeInBits();
1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(CountSetBits(bit_pattern, bits) > 0);
1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (CountSetBits(bit_pattern, bits) == 1) {
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Tbnz(reg, MaskToBit(bit_pattern), label);
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Tst(reg, bit_pattern);
1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    B(ne, label);
1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::TestAndBranchIfAllClear(const Register& reg,
1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             const uint64_t bit_pattern,
1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             Label* label) {
1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int bits = reg.SizeInBits();
1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(CountSetBits(bit_pattern, bits) > 0);
1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (CountSetBits(bit_pattern, bits) == 1) {
1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Tbz(reg, MaskToBit(bit_pattern), label);
1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Tst(reg, bit_pattern);
1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    B(eq, label);
1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::InlineData(uint64_t data) {
1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint16(data));
1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstructionAccurateScope scope(this, 1);
1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  movz(xzr, data);
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::EnableInstrumentation() {
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstructionAccurateScope scope(this, 1);
1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  movn(xzr, InstrumentStateEnable);
1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::DisableInstrumentation() {
1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstructionAccurateScope scope(this, 1);
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  movn(xzr, InstrumentStateDisable);
1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MacroAssembler::AnnotateInstrumentation(const char* marker_name) {
1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(strlen(marker_name) == 2);
1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We allow only printable characters in the marker names. Unprintable
1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // characters are reserved for controlling features of the instrumentation.
1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(isprint(marker_name[0]) && isprint(marker_name[1]));
1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstructionAccurateScope scope(this, 1);
1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  movn(xzr, (marker_name[1] << 8) | marker_name[0]);
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} }  // namespace v8::internal
1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_
1703