assembler_x86.h revision 3887c468d731420e929e6ad3acf190d5431e94fc
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> 2180afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko#include "base/bit_utils.h" 22761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 230f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes#include "constants_x86.h" 24578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h" 252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers#include "managed_register_x86.h" 26578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "offsets.h" 27166db04e259ca51838c311891598664deeed85adIan Rogers#include "utils/assembler.h" 28a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 296b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art { 302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace x86 { 31a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 32cf7f19135f0e273f7b0136315633c2abfc715343Ian Rogersclass Immediate : public ValueObject { 33a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 34277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe explicit Immediate(int32_t value_in) : value_(value_in) {} 35a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 36a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t value() const { return value_; } 37a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 38ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe bool is_int8() const { return IsInt<8>(value_); } 39ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe bool is_uint8() const { return IsUint<8>(value_); } 40ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe bool is_int16() const { return IsInt<16>(value_); } 41ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe bool is_uint16() const { return IsUint<16>(value_); } 42a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 43a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private: 44a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int32_t value_; 45a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 46a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 47a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 48cf7f19135f0e273f7b0136315633c2abfc715343Ian Rogersclass Operand : public ValueObject { 49a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 50a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint8_t mod() const { 51a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return (encoding_at(0) >> 6) & 3; 52a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 53a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 54a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register rm() const { 55a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<Register>(encoding_at(0) & 7); 56a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 57a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 58a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro ScaleFactor scale() const { 59a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<ScaleFactor>((encoding_at(1) >> 6) & 3); 60a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 61a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 62a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register index() const { 63a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<Register>((encoding_at(1) >> 3) & 7); 64a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 65a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 66a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register base() const { 67a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<Register>(encoding_at(1) & 7); 68a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 69a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int8_t disp8() const { 71a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(length_, 2); 72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<int8_t>(encoding_[length_ - 1]); 73a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t disp32() const { 76a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(length_, 5); 77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t value; 78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro memcpy(&value, &encoding_[length_ - 4], sizeof(value)); 79a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return value; 80a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 81a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 82a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro bool IsRegister(Register reg) const { 83a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return ((encoding_[0] & 0xF8) == 0xC0) // Addressing mode is register only. 84a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro && ((encoding_[0] & 0x07) == reg); // Register codes match. 85a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 86a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 87a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro protected: 88a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Operand can be sub classed (e.g: Address). 89a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Operand() : length_(0) { } 90a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 91277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe void SetModRM(int mod_in, Register rm_in) { 92277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe CHECK_EQ(mod_in & ~3, 0); 93277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe encoding_[0] = (mod_in << 6) | rm_in; 94a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro length_ = 1; 95a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 97277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe void SetSIB(ScaleFactor scale_in, Register index_in, Register base_in) { 98a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(length_, 1); 99277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe CHECK_EQ(scale_in & ~3, 0); 100277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe encoding_[1] = (scale_in << 6) | (index_in << 3) | base_in; 101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro length_ = 2; 102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void SetDisp8(int8_t disp) { 105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(length_ == 1 || length_ == 2); 106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro encoding_[length_++] = static_cast<uint8_t>(disp); 107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void SetDisp32(int32_t disp) { 110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(length_ == 1 || length_ == 2); 111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int disp_size = sizeof(disp); 112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro memmove(&encoding_[length_], &disp, disp_size); 113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro length_ += disp_size; 114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private: 11713735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t length_; 11813735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t encoding_[6]; 119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro explicit Operand(Register reg) { SetModRM(3, reg); } 121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Get the operand encoding byte at the given index. 123277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe uint8_t encoding_at(int index_in) const { 124277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe CHECK_GE(index_in, 0); 125277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe CHECK_LT(index_in, length_); 126277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe return encoding_[index_in]; 127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers friend class X86Assembler; 130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiroclass Address : public Operand { 134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 135277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Address(Register base_in, int32_t disp) { 136277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Init(base_in, disp); 137b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 138b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 139277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Address(Register base_in, Offset disp) { 140277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Init(base_in, disp.Int32Value()); 141a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers } 142a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers 143277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Address(Register base_in, FrameOffset disp) { 144277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe CHECK_EQ(base_in, ESP); 145b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Init(ESP, disp.Int32Value()); 146b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 147b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 148277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Address(Register base_in, MemberOffset disp) { 149277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Init(base_in, disp.Int32Value()); 150b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 151b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 152277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe void Init(Register base_in, int32_t disp) { 153277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe if (disp == 0 && base_in != EBP) { 154277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe SetModRM(0, base_in); 155277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe if (base_in == ESP) SetSIB(TIMES_1, ESP, base_in); 156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (disp >= -128 && disp <= 127) { 157277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe SetModRM(1, base_in); 158277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe if (base_in == ESP) SetSIB(TIMES_1, ESP, base_in); 159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp8(disp); 160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 161277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe SetModRM(2, base_in); 162277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe if (base_in == ESP) SetSIB(TIMES_1, ESP, base_in); 163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp32(disp); 164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 167277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Address(Register index_in, ScaleFactor scale_in, int32_t disp) { 168277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe CHECK_NE(index_in, ESP); // Illegal addressing mode. 169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(0, ESP); 170277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe SetSIB(scale_in, index_in, EBP); 171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp32(disp); 172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 174277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe Address(Register base_in, Register index_in, ScaleFactor scale_in, int32_t disp) { 175277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe CHECK_NE(index_in, ESP); // Illegal addressing mode. 176277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe if (disp == 0 && base_in != EBP) { 177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(0, ESP); 178277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe SetSIB(scale_in, index_in, base_in); 179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (disp >= -128 && disp <= 127) { 180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(1, ESP); 181277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe SetSIB(scale_in, index_in, base_in); 182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp8(disp); 183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetModRM(2, ESP); 185277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe SetSIB(scale_in, index_in, base_in); 186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro SetDisp32(disp); 187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19013735955f39b3b304c37d2b2840663c131262c18Ian Rogers static Address Absolute(uintptr_t addr) { 191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Address result; 192dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers result.SetModRM(0, EBP); 193dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers result.SetDisp32(addr); 194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return result; 195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 197dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers static Address Absolute(ThreadOffset<4> addr) { 198dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers return Absolute(addr.Int32Value()); 199b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 200b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private: 202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Address() {} 203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 206befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogersclass X86Assembler FINAL : public Assembler { 207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 2083887c468d731420e929e6ad3acf190d5431e94fcRoland Levillain X86Assembler() {} 2092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers virtual ~X86Assembler() {} 210c143c55718342519db5398e41dda31422cf16c79buzbee 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro /* 212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro * Emit Machine Instructions. 213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro */ 214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void call(Register reg); 215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void call(const Address& address); 216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void call(Label* label); 2178ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray void call(const ExternalLabel& label); 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void pushl(Register reg); 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void pushl(const Address& address); 221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void pushl(const Immediate& imm); 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void popl(Register reg); 224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void popl(const Address& address); 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(Register dst, const Immediate& src); 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(Register dst, Register src); 228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(Register dst, const Address& src); 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(const Address& dst, Register src); 231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movl(const Address& dst, const Immediate& imm); 232bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers void movl(const Address& dst, Label* lbl); 233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2347a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell void movntl(const Address& dst, Register src); 2357a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell 23609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void bswapl(Register dst); 23709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movzxb(Register dst, ByteRegister src); 239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movzxb(Register dst, const Address& src); 240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsxb(Register dst, ByteRegister src); 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsxb(Register dst, const Address& src); 242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movb(Register dst, const Address& src); 243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movb(const Address& dst, ByteRegister src); 244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movb(const Address& dst, const Immediate& imm); 245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movzxw(Register dst, Register src); 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movzxw(Register dst, const Address& src); 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsxw(Register dst, Register src); 249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movsxw(Register dst, const Address& src); 250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movw(Register dst, const Address& src); 251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void movw(const Address& dst, Register src); 25226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray void movw(const Address& dst, const Immediate& imm); 253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void leal(Register dst, const Address& src); 255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 256b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers void cmovl(Condition condition, Register dst, Register src); 257b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2585b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffray void setb(Condition condition, Register dst); 259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2607fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray void movaps(XmmRegister dst, XmmRegister src); 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 28152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle void psrlq(XmmRegister reg, const Immediate& shift_count); 28252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle void punpckldq(XmmRegister dst, XmmRegister src); 28352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 284234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray void movhpd(XmmRegister dst, const Address& src); 285234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray void movhpd(const Address& dst, XmmRegister src); 286234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 287234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray void psrldq(XmmRegister reg, const Immediate& shift_count); 288234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addsd(XmmRegister dst, XmmRegister src); 290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addsd(XmmRegister dst, const Address& src); 291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subsd(XmmRegister dst, XmmRegister src); 292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subsd(XmmRegister dst, const Address& src); 293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mulsd(XmmRegister dst, XmmRegister src); 294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mulsd(XmmRegister dst, const Address& src); 295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void divsd(XmmRegister dst, XmmRegister src); 296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void divsd(XmmRegister dst, const Address& src); 297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtsi2ss(XmmRegister dst, Register src); 299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtsi2sd(XmmRegister dst, Register src); 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtss2si(Register dst, XmmRegister src); 302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtss2sd(XmmRegister dst, XmmRegister src); 303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtsd2si(Register dst, XmmRegister src); 305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtsd2ss(XmmRegister dst, XmmRegister src); 306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvttss2si(Register dst, XmmRegister src); 308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvttsd2si(Register dst, XmmRegister src); 309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cvtdq2pd(XmmRegister dst, XmmRegister src); 311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void comiss(XmmRegister a, XmmRegister b); 313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void comisd(XmmRegister a, XmmRegister b); 314ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle void ucomiss(XmmRegister a, XmmRegister b); 315ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle void ucomisd(XmmRegister a, XmmRegister b); 316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 317fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell void roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm); 318fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell void roundss(XmmRegister dst, XmmRegister src, const Immediate& imm); 319fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sqrtsd(XmmRegister dst, XmmRegister src); 321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sqrtss(XmmRegister dst, XmmRegister src); 322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorpd(XmmRegister dst, const Address& src); 324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorpd(XmmRegister dst, XmmRegister src); 325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorps(XmmRegister dst, const Address& src); 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorps(XmmRegister dst, XmmRegister src); 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 32809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void andpd(XmmRegister dst, XmmRegister src); 329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void andpd(XmmRegister dst, const Address& src); 33009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void andps(XmmRegister dst, XmmRegister src); 33109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void andps(XmmRegister dst, const Address& src); 33209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 33309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void orpd(XmmRegister dst, XmmRegister src); 33409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void orps(XmmRegister dst, XmmRegister src); 335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void flds(const Address& src); 337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fstps(const Address& dst); 33824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell void fsts(const Address& dst); 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fldl(const Address& src); 341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fstpl(const Address& dst); 34224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell void fstl(const Address& dst); 34324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 34424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell void fstsw(); 34524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 34624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell void fucompp(); 347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fnstcw(const Address& dst); 349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fldcw(const Address& src); 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fistpl(const Address& dst); 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fistps(const Address& dst); 353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fildl(const Address& src); 3540a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain void filds(const Address& src); 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fincstp(); 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void ffree(const Immediate& index); 358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fsin(); 360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fcos(); 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void fptan(); 36224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell void fprem(); 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xchgl(Register dst, Register src); 3657caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers void xchgl(Register reg, const Address& address); 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3673c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray void cmpw(const Address& address, const Immediate& imm); 3683c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(Register reg, const Immediate& imm); 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(Register reg0, Register reg1); 371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(Register reg, const Address& address); 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(const Address& address, Register reg); 374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpl(const Address& address, const Immediate& imm); 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void testl(Register reg1, Register reg2); 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void testl(Register reg, const Immediate& imm); 378f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray void testl(Register reg1, const Address& address); 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void andl(Register dst, const Immediate& imm); 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void andl(Register dst, Register src); 3829574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray void andl(Register dst, const Address& address); 383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void orl(Register dst, const Immediate& imm); 385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void orl(Register dst, Register src); 3869574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray void orl(Register dst, const Address& address); 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void xorl(Register dst, Register src); 389b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray void xorl(Register dst, const Immediate& imm); 3909574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray void xorl(Register dst, const Address& address); 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(Register dst, Register src); 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(Register reg, const Immediate& imm); 394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(Register reg, const Address& address); 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(const Address& address, Register reg); 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void addl(const Address& address, const Immediate& imm); 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void adcl(Register dst, Register src); 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void adcl(Register reg, const Immediate& imm); 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void adcl(Register dst, const Address& address); 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subl(Register dst, Register src); 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subl(Register reg, const Immediate& imm); 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void subl(Register reg, const Address& address); 40609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void subl(const Address& address, Register src); 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cdq(); 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void idivl(Register reg); 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(Register dst, Register src); 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(Register reg, const Immediate& imm); 4144a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell void imull(Register dst, Register src, const Immediate& imm); 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(Register reg, const Address& address); 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(Register reg); 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void imull(const Address& address); 419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mull(Register reg); 421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void mull(const Address& address); 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sbbl(Register dst, Register src); 424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sbbl(Register reg, const Immediate& imm); 425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sbbl(Register reg, const Address& address); 42609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void sbbl(const Address& address, Register src); 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void incl(Register reg); 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void incl(const Address& address); 430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void decl(Register reg); 432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void decl(const Address& address); 433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shll(Register reg, const Immediate& imm); 435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shll(Register operand, Register shifter); 4367394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void shll(const Address& address, const Immediate& imm); 4377394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void shll(const Address& address, Register shifter); 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shrl(Register reg, const Immediate& imm); 439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void shrl(Register operand, Register shifter); 4407394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void shrl(const Address& address, const Immediate& imm); 4417394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void shrl(const Address& address, Register shifter); 442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sarl(Register reg, const Immediate& imm); 443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void sarl(Register operand, Register shifter); 4447394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void sarl(const Address& address, const Immediate& imm); 4457394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void sarl(const Address& address, Register shifter); 4469aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle void shld(Register dst, Register src, Register shifter); 4477394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void shld(Register dst, Register src, const Immediate& imm); 4489aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle void shrd(Register dst, Register src, Register shifter); 4497394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void shrd(Register dst, Register src, const Immediate& imm); 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void negl(Register reg); 452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void notl(Register reg); 453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void enter(const Immediate& imm); 455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void leave(); 456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void ret(); 458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void ret(const Immediate& imm); 459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void nop(); 461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void int3(); 462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void hlt(); 463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void j(Condition condition, Label* label); 465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void jmp(Register reg); 4677caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers void jmp(const Address& address); 468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void jmp(Label* label); 469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 47021030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe void repne_scasw(); 47171311f868e2579fa5d40b24e620198734119d1a0agicsaki void repe_cmpsw(); 472970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki void repe_cmpsl(); 47321030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 4742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* lock(); 475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void cmpxchgl(const Address& address, Register reg); 47658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell void cmpxchg8b(const Address& address); 477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 47879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes void mfence(); 47979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 4802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* fs(); 481befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers X86Assembler* gs(); 482b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 483b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // 484b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // Macros for High-level operations. 485b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // 486b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void AddImmediate(Register reg, const Immediate& imm); 488b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 489647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain void LoadLongConstant(XmmRegister dst, int64_t value); 4902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void LoadDoubleConstant(XmmRegister dst, double value); 491b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 4922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void LockCmpxchgl(const Address& address, Register reg) { 4932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers lock()->cmpxchgl(address, reg); 4942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 495b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 49658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell void LockCmpxchg8b(const Address& address) { 49758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell lock()->cmpxchg8b(address); 49858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell } 49958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 5002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // 5012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Misc. functionality 5022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // 5032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers int PreferredLoopAlignment() { return 16; } 5042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void Align(int alignment, int offset); 5052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers void Bind(Label* label); 506b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 5072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // 5082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Overridden common assembler high-level functionality 5092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // 510b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 5112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Emit code that will create an activation on the stack 512dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void BuildFrame(size_t frame_size, ManagedRegister method_reg, 513dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers const std::vector<ManagedRegister>& callee_save_regs, 514dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers const ManagedRegisterEntrySpills& entry_spills) OVERRIDE; 515b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 5162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Emit code that will remove an activation from the stack 517dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void RemoveFrame(size_t frame_size, const std::vector<ManagedRegister>& callee_save_regs) 518dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers OVERRIDE; 51945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 520dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void IncreaseFrameSize(size_t adjust) OVERRIDE; 521dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void DecreaseFrameSize(size_t adjust) OVERRIDE; 522b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 5232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Store routines 524dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Store(FrameOffset offs, ManagedRegister src, size_t size) OVERRIDE; 525dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreRef(FrameOffset dest, ManagedRegister src) OVERRIDE; 526dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreRawPtr(FrameOffset dest, ManagedRegister src) OVERRIDE; 527b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 528dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreImmediateToFrame(FrameOffset dest, uint32_t imm, ManagedRegister scratch) OVERRIDE; 529b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 530dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreImmediateToThread32(ThreadOffset<4> dest, uint32_t imm, ManagedRegister scratch) 531dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers OVERRIDE; 532b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 533dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreStackOffsetToThread32(ThreadOffset<4> thr_offs, FrameOffset fr_offs, 534dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch) OVERRIDE; 535b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 536dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreStackPointerToThread32(ThreadOffset<4> thr_offs) OVERRIDE; 537bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers 538dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void StoreSpanning(FrameOffset dest, ManagedRegister src, FrameOffset in_off, 539dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch) OVERRIDE; 540668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 5412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Load routines 542dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Load(ManagedRegister dest, FrameOffset src, size_t size) OVERRIDE; 543b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 544dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void LoadFromThread32(ManagedRegister dest, ThreadOffset<4> src, size_t size) OVERRIDE; 5455a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 546e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier void LoadRef(ManagedRegister dest, FrameOffset src) OVERRIDE; 54745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 548e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier void LoadRef(ManagedRegister dest, ManagedRegister base, MemberOffset offs, 5494d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain bool unpoison_reference) OVERRIDE; 55045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 551dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void LoadRawPtr(ManagedRegister dest, ManagedRegister base, Offset offs) OVERRIDE; 552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 553dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void LoadRawPtrFromThread32(ManagedRegister dest, ThreadOffset<4> offs) OVERRIDE; 554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Copying routines 556dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Move(ManagedRegister dest, ManagedRegister src, size_t size) OVERRIDE; 557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 558dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void CopyRawPtrFromThread32(FrameOffset fr_offs, ThreadOffset<4> thr_offs, 559dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch) OVERRIDE; 560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 561dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void CopyRawPtrToThread32(ThreadOffset<4> thr_offs, FrameOffset fr_offs, ManagedRegister scratch) 562dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers OVERRIDE; 563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 564dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void CopyRef(FrameOffset dest, FrameOffset src, ManagedRegister scratch) OVERRIDE; 565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 566dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(FrameOffset dest, FrameOffset src, ManagedRegister scratch, size_t size) OVERRIDE; 56745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 568dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(FrameOffset dest, ManagedRegister src_base, Offset src_offset, ManagedRegister scratch, 569dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers size_t size) OVERRIDE; 570dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 571dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, ManagedRegister scratch, 572dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers size_t size) OVERRIDE; 5735a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 574dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, ManagedRegister scratch, 575dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers size_t size) OVERRIDE; 576dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 577dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(ManagedRegister dest, Offset dest_offset, ManagedRegister src, Offset src_offset, 578dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch, size_t size) OVERRIDE; 5795a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 580dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 581dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ManagedRegister scratch, size_t size) OVERRIDE; 582dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 583dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void MemoryBarrier(ManagedRegister) OVERRIDE; 584e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers 58558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao // Sign extension 586dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void SignExtend(ManagedRegister mreg, size_t size) OVERRIDE; 58758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao 588cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao // Zero extension 589dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void ZeroExtend(ManagedRegister mreg, size_t size) OVERRIDE; 590cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao 5912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Exploit fast access in managed code to Thread::Current() 592dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void GetCurrentThread(ManagedRegister tr) OVERRIDE; 593dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void GetCurrentThread(FrameOffset dest_offset, ManagedRegister scratch) OVERRIDE; 594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // Set up out_reg to hold a Object** into the handle scope, or to be null if the 5962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // value is null and null_allowed. in_reg holds a possibly stale reference 597eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier // that can be used to avoid loading the handle scope entry to see if the value is 5982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // null. 5992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier void CreateHandleScopeEntry(ManagedRegister out_reg, FrameOffset handlescope_offset, 6002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ManagedRegister in_reg, bool null_allowed) OVERRIDE; 6012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 6022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // Set up out_off to hold a Object** into the handle scope, or to be null if the 6032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // value is null and null_allowed. 6042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier void CreateHandleScopeEntry(FrameOffset out_off, FrameOffset handlescope_offset, 6052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ManagedRegister scratch, bool null_allowed) OVERRIDE; 6062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 607eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier // src holds a handle scope entry (Object**) load this into dst 608eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier void LoadReferenceFromHandleScope(ManagedRegister dst, ManagedRegister src) OVERRIDE; 6092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 6102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Heap::VerifyObject on src. In some cases (such as a reference to this) we 6112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // know that src may not be null. 612dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void VerifyObject(ManagedRegister src, bool could_be_null) OVERRIDE; 613dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void VerifyObject(FrameOffset src, bool could_be_null) OVERRIDE; 6142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 6152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Call to address held at [base+offset] 616dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Call(ManagedRegister base, Offset offset, ManagedRegister scratch) OVERRIDE; 617dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void Call(FrameOffset base, Offset offset, ManagedRegister scratch) OVERRIDE; 618dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void CallFromThread32(ThreadOffset<4> offset, ManagedRegister scratch) OVERRIDE; 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // Generate code to check if Thread::Current()->exception_ is non-null 6212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // and branch to a ExceptionSlowPath if it is. 622dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers void ExceptionPoll(ManagedRegister scratch, size_t stack_adjust) OVERRIDE; 623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6244d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain // 6254d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain // Heap poisoning. 6264d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain // 6274d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain 6284d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain // Poison a heap reference contained in `reg`. 6294d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain void PoisonHeapReference(Register reg) { negl(reg); } 6304d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain // Unpoison a heap reference contained in `reg`. 6314d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain void UnpoisonHeapReference(Register reg) { negl(reg); } 6324d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain // Unpoison a heap reference contained in `reg` if heap poisoning is enabled. 6334d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain void MaybeUnpoisonHeapReference(Register reg) { 6344d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain if (kPoisonHeapReferences) { 6354d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain UnpoisonHeapReference(reg); 6364d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain } 6374d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain } 6384d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain 639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private: 640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitUint8(uint8_t value); 641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitInt32(int32_t value); 642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitRegisterOperand(int rm, int reg); 643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitXmmRegisterOperand(int rm, XmmRegister reg); 644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitFixup(AssemblerFixup* fixup); 645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro inline void EmitOperandSizeOverride(); 646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitOperand(int rm, const Operand& operand); 648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitImmediate(const Immediate& imm); 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitComplex(int rm, const Operand& operand, const Immediate& immediate); 650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitLabel(Label* label, int instruction_size); 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitLabelLink(Label* label); 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void EmitNearLabelLink(Label* label); 653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6547394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void EmitGenericShift(int rm, const Operand& operand, const Immediate& imm); 6557394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell void EmitGenericShift(int rm, const Operand& operand, Register shifter); 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers DISALLOW_COPY_AND_ASSIGN(X86Assembler); 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitUint8(uint8_t value) { 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Emit<uint8_t>(value); 662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitInt32(int32_t value) { 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Emit<int32_t>(value); 666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitRegisterOperand(int rm, int reg) { 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(rm, 0); 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(rm, 8); 671a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Emit<uint8_t>(0xC0 + (rm << 3) + reg); 672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitXmmRegisterOperand(int rm, XmmRegister reg) { 675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(rm, static_cast<Register>(reg)); 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitFixup(AssemblerFixup* fixup) { 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.EmitFixup(fixup); 680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitOperandSizeOverride() { 683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers// Slowpath entered when Thread::Current()->_exception is non-null 687dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersclass X86ExceptionSlowPath FINAL : public SlowPath { 6882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers public: 68993ba893c20532990a430741e0a97212900094e8cBrian Carlstrom explicit X86ExceptionSlowPath(size_t stack_adjust) : stack_adjust_(stack_adjust) {} 690dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers virtual void Emit(Assembler *sp_asm) OVERRIDE; 69100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers private: 69200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers const size_t stack_adjust_; 6932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}; 6942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 6952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 6966b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro} // namespace art 697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 698166db04e259ca51838c311891598664deeed85adIan Rogers#endif // ART_COMPILER_UTILS_X86_ASSEMBLER_X86_H_ 699