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