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