assembler_x86.h revision f12feb8e0e857f2832545b3f28d31bad5a9d3903
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 16a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17166db04e259ca51838c311891598664deeed85adIan Rogers#ifndef ART_COMPILER_UTILS_X86_ASSEMBLER_X86_H_ 18166db04e259ca51838c311891598664deeed85adIan Rogers#define ART_COMPILER_UTILS_X86_ASSEMBLER_X86_H_ 19a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 200d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#include <vector> 21761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 220f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes#include "constants_x86.h" 23578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h" 242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers#include "managed_register_x86.h" 25578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "offsets.h" 26166db04e259ca51838c311891598664deeed85adIan Rogers#include "utils/assembler.h" 27578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "utils.h" 28a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 296b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art { 302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace x86 { 31a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 32a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiroclass Immediate { 33a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 34a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro explicit Immediate(int32_t value) : value_(value) {} 35a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 36a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t value() const { return value_; } 37a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 38a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro bool is_int8() const { return IsInt(8, value_); } 39a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro bool is_uint8() const { return IsUint(8, value_); } 40a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro bool is_uint16() const { return IsUint(16, value_); } 41a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 42a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private: 43a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int32_t value_; 44a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 45a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro DISALLOW_COPY_AND_ASSIGN(Immediate); 46a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 47a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 48a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 49a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiroclass Operand { 50a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 51a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint8_t mod() const { 52a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return (encoding_at(0) >> 6) & 3; 53a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 54a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 55a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register rm() const { 56a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<Register>(encoding_at(0) & 7); 57a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 58a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 59a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro ScaleFactor scale() const { 60a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<ScaleFactor>((encoding_at(1) >> 6) & 3); 61a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 62a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 63a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register index() const { 64a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<Register>((encoding_at(1) >> 3) & 7); 65a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 66a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 67a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register base() const { 68a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<Register>(encoding_at(1) & 7); 69a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 71a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int8_t disp8() const { 72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(length_, 2); 73a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<int8_t>(encoding_[length_ - 1]); 74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 76a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t disp32() const { 77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(length_, 5); 78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t value; 79a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro memcpy(&value, &encoding_[length_ - 4], sizeof(value)); 80a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return value; 81a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 82a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 83a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro bool IsRegister(Register reg) const { 84a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return ((encoding_[0] & 0xF8) == 0xC0) // Addressing mode is register only. 85a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro && ((encoding_[0] & 0x07) == reg); // Register codes match. 86a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 87a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 88a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro protected: 89a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Operand can be sub classed (e.g: Address). 90a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Operand() : length_(0) { } 91a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 92a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void SetModRM(int mod, Register rm) { 93a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(mod & ~3, 0); 94a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro encoding_[0] = (mod << 6) | rm; 95a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro length_ = 1; 96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 97a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 98a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void SetSIB(ScaleFactor scale, Register index, Register base) { 99a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(length_, 1); 100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(scale & ~3, 0); 101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro encoding_[1] = (scale << 6) | (index << 3) | base; 102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro length_ = 2; 103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void SetDisp8(int8_t disp) { 106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(length_ == 1 || length_ == 2); 107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro encoding_[length_++] = static_cast<uint8_t>(disp); 108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void SetDisp32(int32_t disp) { 111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(length_ == 1 || length_ == 2); 112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int disp_size = sizeof(disp); 113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro memmove(&encoding_[length_], &disp, disp_size); 114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro length_ += disp_size; 115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private: 118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro byte length_; 119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro byte encoding_[6]; 120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro explicit Operand(Register reg) { SetModRM(3, reg); } 122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Get the operand encoding byte at the given index. 124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint8_t encoding_at(int index) const { 125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(index, 0); 126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index, length_); 127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return encoding_[index]; 128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers friend class X86Assembler; 131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro DISALLOW_COPY_AND_ASSIGN(Operand); 133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiroclass Address : public Operand { 137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Address(Register base, int32_t disp) { 139b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Init(base, disp); 140b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 141b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 142a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers Address(Register base, Offset disp) { 143a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers Init(base, disp.Int32Value()); 144a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers } 145a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers 146b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Address(Register base, FrameOffset disp) { 147b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(base, ESP); 148b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Init(ESP, disp.Int32Value()); 149b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 150b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 151b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Address(Register base, MemberOffset disp) { 152b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Init(base, disp.Int32Value()); 153b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 154b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 155b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers void Init(Register base, int32_t disp) { 156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (disp == 0 && base != EBP) { 157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(0, base); 158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (base == ESP) SetSIB(TIMES_1, ESP, base); 159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (disp >= -128 && disp <= 127) { 160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(1, base); 161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (base == ESP) SetSIB(TIMES_1, ESP, base); 162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp8(disp); 163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(2, base); 165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (base == ESP) SetSIB(TIMES_1, ESP, base); 166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp32(disp); 167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 170b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Address(Register index, ScaleFactor scale, int32_t disp) { 172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_NE(index, ESP); // Illegal addressing mode. 173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(0, ESP); 174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetSIB(scale, index, EBP); 175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp32(disp); 176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Address(Register base, Register index, ScaleFactor scale, int32_t disp) { 179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_NE(index, ESP); // Illegal addressing mode. 180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (disp == 0 && base != EBP) { 181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(0, ESP); 182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetSIB(scale, index, base); 183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (disp >= -128 && disp <= 127) { 184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(1, ESP); 185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetSIB(scale, index, base); 186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp8(disp); 187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(2, ESP); 189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetSIB(scale, index, base); 190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp32(disp); 191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 194dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers static Address Absolute(uword addr) { 195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Address result; 196dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers result.SetModRM(0, EBP); 197dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers result.SetDisp32(addr); 198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return result; 199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 201dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers static Address Absolute(ThreadOffset<4> addr) { 202dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers return Absolute(addr.Int32Value()); 203b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 204b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private: 206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Address() {} 207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro DISALLOW_COPY_AND_ASSIGN(Address); 209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 212befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogersclass X86Assembler FINAL : public Assembler { 213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 214befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers explicit X86Assembler() {} 2152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers virtual ~X86Assembler() {} 216c143c55718342519db5398e41dda31422cf16c79buzbee 217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro /* 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro * Emit Machine Instructions. 219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro */ 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void call(Register reg); 221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void call(const Address& address); 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void call(Label* label); 2238ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray void call(const ExternalLabel& label); 224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void pushl(Register reg); 226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void pushl(const Address& address); 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void pushl(const Immediate& imm); 228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void popl(Register reg); 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void popl(const Address& address); 231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(Register dst, const Immediate& src); 233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(Register dst, Register src); 234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(Register dst, const Address& src); 236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(const Address& dst, Register src); 237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(const Address& dst, const Immediate& imm); 238bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers void movl(const Address& dst, Label* lbl); 239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movzxb(Register dst, ByteRegister src); 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movzxb(Register dst, const Address& src); 242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsxb(Register dst, ByteRegister src); 243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsxb(Register dst, const Address& src); 244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movb(Register dst, const Address& src); 245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movb(const Address& dst, ByteRegister src); 246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movb(const Address& dst, const Immediate& imm); 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movzxw(Register dst, Register src); 249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movzxw(Register dst, const Address& src); 250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsxw(Register dst, Register src); 251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsxw(Register dst, const Address& src); 252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movw(Register dst, const Address& src); 253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movw(const Address& dst, Register src); 254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void leal(Register dst, const Address& src); 256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 257b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers void cmovl(Condition condition, Register dst, Register src); 258b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 259b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers void setb(Condition condition, Register dst); 260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movss(XmmRegister dst, const Address& src); 262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movss(const Address& dst, XmmRegister src); 263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movss(XmmRegister dst, XmmRegister src); 264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movd(XmmRegister dst, Register src); 266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movd(Register dst, XmmRegister src); 267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addss(XmmRegister dst, XmmRegister src); 269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addss(XmmRegister dst, const Address& src); 270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subss(XmmRegister dst, XmmRegister src); 271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subss(XmmRegister dst, const Address& src); 272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mulss(XmmRegister dst, XmmRegister src); 273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mulss(XmmRegister dst, const Address& src); 274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void divss(XmmRegister dst, XmmRegister src); 275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void divss(XmmRegister dst, const Address& src); 276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsd(XmmRegister dst, const Address& src); 278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsd(const Address& dst, XmmRegister src); 279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsd(XmmRegister dst, XmmRegister src); 280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addsd(XmmRegister dst, XmmRegister src); 282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addsd(XmmRegister dst, const Address& src); 283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subsd(XmmRegister dst, XmmRegister src); 284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subsd(XmmRegister dst, const Address& src); 285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mulsd(XmmRegister dst, XmmRegister src); 286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mulsd(XmmRegister dst, const Address& src); 287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void divsd(XmmRegister dst, XmmRegister src); 288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void divsd(XmmRegister dst, const Address& src); 289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtsi2ss(XmmRegister dst, Register src); 291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtsi2sd(XmmRegister dst, Register src); 292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtss2si(Register dst, XmmRegister src); 294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtss2sd(XmmRegister dst, XmmRegister src); 295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtsd2si(Register dst, XmmRegister src); 297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtsd2ss(XmmRegister dst, XmmRegister src); 298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvttss2si(Register dst, XmmRegister src); 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvttsd2si(Register dst, XmmRegister src); 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtdq2pd(XmmRegister dst, XmmRegister src); 303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void comiss(XmmRegister a, XmmRegister b); 305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void comisd(XmmRegister a, XmmRegister b); 306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sqrtsd(XmmRegister dst, XmmRegister src); 308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sqrtss(XmmRegister dst, XmmRegister src); 309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorpd(XmmRegister dst, const Address& src); 311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorpd(XmmRegister dst, XmmRegister src); 312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorps(XmmRegister dst, const Address& src); 313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorps(XmmRegister dst, XmmRegister src); 314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void andpd(XmmRegister dst, const Address& src); 316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void flds(const Address& src); 318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fstps(const Address& dst); 319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fldl(const Address& src); 321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fstpl(const Address& dst); 322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fnstcw(const Address& dst); 324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fldcw(const Address& src); 325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fistpl(const Address& dst); 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fistps(const Address& dst); 328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fildl(const Address& src); 329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fincstp(); 331a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void ffree(const Immediate& index); 332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fsin(); 334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fcos(); 335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fptan(); 336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xchgl(Register dst, Register src); 3387caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers void xchgl(Register reg, const Address& address); 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(Register reg, const Immediate& imm); 341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(Register reg0, Register reg1); 342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(Register reg, const Address& address); 343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(const Address& address, Register reg); 345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(const Address& address, const Immediate& imm); 346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void testl(Register reg1, Register reg2); 348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void testl(Register reg, const Immediate& imm); 349f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray void testl(Register reg1, const Address& address); 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void andl(Register dst, const Immediate& imm); 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void andl(Register dst, Register src); 353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void orl(Register dst, const Immediate& imm); 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void orl(Register dst, Register src); 356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorl(Register dst, Register src); 358b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray void xorl(Register dst, const Immediate& imm); 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(Register dst, Register src); 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(Register reg, const Immediate& imm); 362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(Register reg, const Address& address); 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(const Address& address, Register reg); 365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(const Address& address, const Immediate& imm); 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void adcl(Register dst, Register src); 368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void adcl(Register reg, const Immediate& imm); 369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void adcl(Register dst, const Address& address); 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subl(Register dst, Register src); 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subl(Register reg, const Immediate& imm); 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subl(Register reg, const Address& address); 374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cdq(); 376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void idivl(Register reg); 378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(Register dst, Register src); 380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(Register reg, const Immediate& imm); 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(Register reg, const Address& address); 382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(Register reg); 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(const Address& address); 385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mull(Register reg); 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mull(const Address& address); 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sbbl(Register dst, Register src); 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sbbl(Register reg, const Immediate& imm); 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sbbl(Register reg, const Address& address); 392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void incl(Register reg); 394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void incl(const Address& address); 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void decl(Register reg); 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void decl(const Address& address); 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shll(Register reg, const Immediate& imm); 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shll(Register operand, Register shifter); 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shrl(Register reg, const Immediate& imm); 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shrl(Register operand, Register shifter); 403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sarl(Register reg, const Immediate& imm); 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sarl(Register operand, Register shifter); 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shld(Register dst, Register src); 406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void negl(Register reg); 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void notl(Register reg); 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void enter(const Immediate& imm); 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void leave(); 412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void ret(); 414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void ret(const Immediate& imm); 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void nop(); 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void int3(); 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void hlt(); 419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void j(Condition condition, Label* label); 421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void jmp(Register reg); 4237caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers void jmp(const Address& address); 424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void jmp(Label* label); 425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* lock(); 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpxchgl(const Address& address, Register reg); 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 42979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes void mfence(); 43079ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 4312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* fs(); 432befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers X86Assembler* gs(); 433b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 434b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // 435b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // Macros for High-level operations. 436b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // 437b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void AddImmediate(Register reg, const Immediate& imm); 439b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void LoadDoubleConstant(XmmRegister dst, double value); 441b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void DoubleNegate(XmmRegister d); 4432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void FloatNegate(XmmRegister f); 444b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void DoubleAbs(XmmRegister reg); 446b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void LockCmpxchgl(const Address& address, Register reg) { 4482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers lock()->cmpxchgl(address, reg); 4492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 450b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // 4522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Misc. functionality 4532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // 4542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers int PreferredLoopAlignment() { return 16; } 4552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void Align(int alignment, int offset); 4562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void Bind(Label* label); 457b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // 4592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Overridden common assembler high-level functionality 4602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // 461b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Emit code that will create an activation on the stack 463dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void BuildFrame(size_t frame_size, ManagedRegister method_reg, 464dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers const std::vector<ManagedRegister>& callee_save_regs, 465dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers const ManagedRegisterEntrySpills& entry_spills) OVERRIDE; 466b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Emit code that will remove an activation from the stack 468dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void RemoveFrame(size_t frame_size, const std::vector<ManagedRegister>& callee_save_regs) 469dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers OVERRIDE; 47045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 471dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void IncreaseFrameSize(size_t adjust) OVERRIDE; 472dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void DecreaseFrameSize(size_t adjust) OVERRIDE; 473b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Store routines 475dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Store(FrameOffset offs, ManagedRegister src, size_t size) OVERRIDE; 476dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreRef(FrameOffset dest, ManagedRegister src) OVERRIDE; 477dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreRawPtr(FrameOffset dest, ManagedRegister src) OVERRIDE; 478b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 479dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreImmediateToFrame(FrameOffset dest, uint32_t imm, ManagedRegister scratch) OVERRIDE; 480b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 481dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreImmediateToThread32(ThreadOffset<4> dest, uint32_t imm, ManagedRegister scratch) 482dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers OVERRIDE; 483b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 484dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreStackOffsetToThread32(ThreadOffset<4> thr_offs, FrameOffset fr_offs, 485dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch) OVERRIDE; 486b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 487dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreStackPointerToThread32(ThreadOffset<4> thr_offs) OVERRIDE; 488bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers 489dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreSpanning(FrameOffset dest, ManagedRegister src, FrameOffset in_off, 490dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch) OVERRIDE; 491668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 4922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Load routines 493dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Load(ManagedRegister dest, FrameOffset src, size_t size) OVERRIDE; 494b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 495dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void LoadFromThread32(ManagedRegister dest, ThreadOffset<4> src, size_t size) OVERRIDE; 4965a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 497dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void LoadRef(ManagedRegister dest, FrameOffset src) OVERRIDE; 49845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 499dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void LoadRef(ManagedRegister dest, ManagedRegister base, MemberOffset offs) OVERRIDE; 50045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 501dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void LoadRawPtr(ManagedRegister dest, ManagedRegister base, Offset offs) OVERRIDE; 502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 503dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void LoadRawPtrFromThread32(ManagedRegister dest, ThreadOffset<4> offs) OVERRIDE; 504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Copying routines 506dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Move(ManagedRegister dest, ManagedRegister src, size_t size) OVERRIDE; 507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 508dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void CopyRawPtrFromThread32(FrameOffset fr_offs, ThreadOffset<4> thr_offs, 509dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch) OVERRIDE; 510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 511dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void CopyRawPtrToThread32(ThreadOffset<4> thr_offs, FrameOffset fr_offs, ManagedRegister scratch) 512dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers OVERRIDE; 513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 514dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void CopyRef(FrameOffset dest, FrameOffset src, ManagedRegister scratch) OVERRIDE; 515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 516dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(FrameOffset dest, FrameOffset src, ManagedRegister scratch, size_t size) OVERRIDE; 51745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 518dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(FrameOffset dest, ManagedRegister src_base, Offset src_offset, ManagedRegister scratch, 519dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers size_t size) OVERRIDE; 520dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 521dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, ManagedRegister scratch, 522dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers size_t size) OVERRIDE; 5235a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 524dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, ManagedRegister scratch, 525dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers size_t size) OVERRIDE; 526dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 527dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(ManagedRegister dest, Offset dest_offset, ManagedRegister src, Offset src_offset, 528dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch, size_t size) OVERRIDE; 5295a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 530dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 531dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch, size_t size) OVERRIDE; 532dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 533dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void MemoryBarrier(ManagedRegister) OVERRIDE; 534e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers 53558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao // Sign extension 536dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void SignExtend(ManagedRegister mreg, size_t size) OVERRIDE; 53758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao 538cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao // Zero extension 539dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void ZeroExtend(ManagedRegister mreg, size_t size) OVERRIDE; 540cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao 5412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Exploit fast access in managed code to Thread::Current() 542dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void GetCurrentThread(ManagedRegister tr) OVERRIDE; 543dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void GetCurrentThread(FrameOffset dest_offset, ManagedRegister scratch) OVERRIDE; 544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 545eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier // Set up out_reg to hold a Object** into the handle scope, or to be NULL if the 5462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // value is null and null_allowed. in_reg holds a possibly stale reference 547eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier // that can be used to avoid loading the handle scope entry to see if the value is 5482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // NULL. 549eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier void CreateHandleScopeEntry(ManagedRegister out_reg, FrameOffset handlescope_offset, ManagedRegister in_reg, 550dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers bool null_allowed) OVERRIDE; 5512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 552eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier // Set up out_off to hold a Object** into the handle scope, or to be NULL if the 5532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // value is null and null_allowed. 554eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier void CreateHandleScopeEntry(FrameOffset out_off, FrameOffset handlescope_offset, ManagedRegister scratch, 555dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers bool null_allowed) OVERRIDE; 5562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 557eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier // src holds a handle scope entry (Object**) load this into dst 558eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier void LoadReferenceFromHandleScope(ManagedRegister dst, ManagedRegister src) OVERRIDE; 5592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 5602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Heap::VerifyObject on src. In some cases (such as a reference to this) we 5612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // know that src may not be null. 562dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void VerifyObject(ManagedRegister src, bool could_be_null) OVERRIDE; 563dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void VerifyObject(FrameOffset src, bool could_be_null) OVERRIDE; 5642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 5652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Call to address held at [base+offset] 566dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Call(ManagedRegister base, Offset offset, ManagedRegister scratch) OVERRIDE; 567dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Call(FrameOffset base, Offset offset, ManagedRegister scratch) OVERRIDE; 568dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void CallFromThread32(ThreadOffset<4> offset, ManagedRegister scratch) OVERRIDE; 569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Generate code to check if Thread::Current()->exception_ is non-null 5712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // and branch to a ExceptionSlowPath if it is. 572dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void ExceptionPoll(ManagedRegister scratch, size_t stack_adjust) OVERRIDE; 573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private: 575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitUint8(uint8_t value); 576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitInt32(int32_t value); 577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitRegisterOperand(int rm, int reg); 578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitXmmRegisterOperand(int rm, XmmRegister reg); 579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitFixup(AssemblerFixup* fixup); 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitOperandSizeOverride(); 581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitOperand(int rm, const Operand& operand); 583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitImmediate(const Immediate& imm); 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitComplex(int rm, const Operand& operand, const Immediate& immediate); 585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitLabel(Label* label, int instruction_size); 586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitLabelLink(Label* label); 587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitNearLabelLink(Label* label); 588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitGenericShift(int rm, Register reg, const Immediate& imm); 590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitGenericShift(int rm, Register operand, Register shifter); 591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers DISALLOW_COPY_AND_ASSIGN(X86Assembler); 593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitUint8(uint8_t value) { 596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Emit<uint8_t>(value); 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitInt32(int32_t value) { 600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Emit<int32_t>(value); 601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitRegisterOperand(int rm, int reg) { 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(rm, 0); 605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(rm, 8); 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Emit<uint8_t>(0xC0 + (rm << 3) + reg); 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitXmmRegisterOperand(int rm, XmmRegister reg) { 610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(rm, static_cast<Register>(reg)); 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitFixup(AssemblerFixup* fixup) { 614a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.EmitFixup(fixup); 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitOperandSizeOverride() { 618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers// Slowpath entered when Thread::Current()->_exception is non-null 622dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersclass X86ExceptionSlowPath FINAL : public SlowPath { 6232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers public: 62493ba893c20532990a430741e0a97212900094e8cBrian Carlstrom explicit X86ExceptionSlowPath(size_t stack_adjust) : stack_adjust_(stack_adjust) {} 625dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers virtual void Emit(Assembler *sp_asm) OVERRIDE; 62600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers private: 62700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const size_t stack_adjust_; 6282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}; 6292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 6302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 6316b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro} // namespace art 632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 633166db04e259ca51838c311891598664deeed85adIan Rogers#endif // ART_COMPILER_UTILS_X86_ASSEMBLER_X86_H_ 634