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