assembler_x86.h revision 970abfb65530b700f3a0cc8b90b131df5420cec3
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:
2088c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky  explicit 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
23409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  void bswapl(Register dst);
23509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movzxb(Register dst, ByteRegister src);
237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movzxb(Register dst, const Address& src);
238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movsxb(Register dst, ByteRegister src);
239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movsxb(Register dst, const Address& src);
240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movb(Register dst, const Address& src);
241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movb(const Address& dst, ByteRegister src);
242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movb(const Address& dst, const Immediate& imm);
243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movzxw(Register dst, Register src);
245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movzxw(Register dst, const Address& src);
246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movsxw(Register dst, Register src);
247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movsxw(Register dst, const Address& src);
248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movw(Register dst, const Address& src);
249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movw(const Address& dst, Register src);
25026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray  void movw(const Address& dst, const Immediate& imm);
251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void leal(Register dst, const Address& src);
253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
254b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  void cmovl(Condition condition, Register dst, Register src);
255b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
2565b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffray  void setb(Condition condition, Register dst);
257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2587fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray  void movaps(XmmRegister dst, XmmRegister src);
259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movss(XmmRegister dst, const Address& src);
260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movss(const Address& dst, XmmRegister src);
261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movss(XmmRegister dst, XmmRegister src);
262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movd(XmmRegister dst, Register src);
264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movd(Register dst, XmmRegister src);
265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addss(XmmRegister dst, XmmRegister src);
267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addss(XmmRegister dst, const Address& src);
268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void subss(XmmRegister dst, XmmRegister src);
269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void subss(XmmRegister dst, const Address& src);
270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void mulss(XmmRegister dst, XmmRegister src);
271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void mulss(XmmRegister dst, const Address& src);
272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void divss(XmmRegister dst, XmmRegister src);
273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void divss(XmmRegister dst, const Address& src);
274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movsd(XmmRegister dst, const Address& src);
276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movsd(const Address& dst, XmmRegister src);
277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void movsd(XmmRegister dst, XmmRegister src);
278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
27952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle  void psrlq(XmmRegister reg, const Immediate& shift_count);
28052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle  void punpckldq(XmmRegister dst, XmmRegister src);
28152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle
282234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  void movhpd(XmmRegister dst, const Address& src);
283234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  void movhpd(const Address& dst, XmmRegister src);
284234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray
285234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  void psrldq(XmmRegister reg, const Immediate& shift_count);
286234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray
287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addsd(XmmRegister dst, XmmRegister src);
288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addsd(XmmRegister dst, const Address& src);
289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void subsd(XmmRegister dst, XmmRegister src);
290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void subsd(XmmRegister dst, const Address& src);
291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void mulsd(XmmRegister dst, XmmRegister src);
292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void mulsd(XmmRegister dst, const Address& src);
293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void divsd(XmmRegister dst, XmmRegister src);
294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void divsd(XmmRegister dst, const Address& src);
295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvtsi2ss(XmmRegister dst, Register src);
297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvtsi2sd(XmmRegister dst, Register src);
298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvtss2si(Register dst, XmmRegister src);
300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvtss2sd(XmmRegister dst, XmmRegister src);
301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvtsd2si(Register dst, XmmRegister src);
303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvtsd2ss(XmmRegister dst, XmmRegister src);
304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvttss2si(Register dst, XmmRegister src);
306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvttsd2si(Register dst, XmmRegister src);
307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cvtdq2pd(XmmRegister dst, XmmRegister src);
309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void comiss(XmmRegister a, XmmRegister b);
311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void comisd(XmmRegister a, XmmRegister b);
312ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  void ucomiss(XmmRegister a, XmmRegister b);
313ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  void ucomisd(XmmRegister a, XmmRegister b);
314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
315fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  void roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm);
316fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  void roundss(XmmRegister dst, XmmRegister src, const Immediate& imm);
317fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell
318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void sqrtsd(XmmRegister dst, XmmRegister src);
319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void sqrtss(XmmRegister dst, XmmRegister src);
320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void xorpd(XmmRegister dst, const Address& src);
322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void xorpd(XmmRegister dst, XmmRegister src);
323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void xorps(XmmRegister dst, const Address& src);
324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void xorps(XmmRegister dst, XmmRegister src);
325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
32609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  void andpd(XmmRegister dst, XmmRegister src);
327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void andpd(XmmRegister dst, const Address& src);
32809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  void andps(XmmRegister dst, XmmRegister src);
32909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  void andps(XmmRegister dst, const Address& src);
33009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
33109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  void orpd(XmmRegister dst, XmmRegister src);
33209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  void orps(XmmRegister dst, XmmRegister src);
333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void flds(const Address& src);
335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fstps(const Address& dst);
33624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  void fsts(const Address& dst);
337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fldl(const Address& src);
339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fstpl(const Address& dst);
34024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  void fstl(const Address& dst);
34124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
34224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  void fstsw();
34324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
34424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  void fucompp();
345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fnstcw(const Address& dst);
347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fldcw(const Address& src);
348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fistpl(const Address& dst);
350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fistps(const Address& dst);
351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fildl(const Address& src);
3520a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain  void filds(const Address& src);
353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fincstp();
355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void ffree(const Immediate& index);
356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fsin();
358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fcos();
359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void fptan();
36024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  void fprem();
361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void xchgl(Register dst, Register src);
3637caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers  void xchgl(Register reg, const Address& address);
364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
3653c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray  void cmpw(const Address& address, const Immediate& imm);
3663c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray
367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cmpl(Register reg, const Immediate& imm);
368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cmpl(Register reg0, Register reg1);
369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cmpl(Register reg, const Address& address);
370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cmpl(const Address& address, Register reg);
372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cmpl(const Address& address, const Immediate& imm);
373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void testl(Register reg1, Register reg2);
375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void testl(Register reg, const Immediate& imm);
376f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray  void testl(Register reg1, const Address& address);
377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void andl(Register dst, const Immediate& imm);
379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void andl(Register dst, Register src);
3809574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  void andl(Register dst, const Address& address);
381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void orl(Register dst, const Immediate& imm);
383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void orl(Register dst, Register src);
3849574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  void orl(Register dst, const Address& address);
385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void xorl(Register dst, Register src);
387b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray  void xorl(Register dst, const Immediate& imm);
3889574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  void xorl(Register dst, const Address& address);
389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addl(Register dst, Register src);
391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addl(Register reg, const Immediate& imm);
392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addl(Register reg, const Address& address);
393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addl(const Address& address, Register reg);
395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void addl(const Address& address, const Immediate& imm);
396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void adcl(Register dst, Register src);
398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void adcl(Register reg, const Immediate& imm);
399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void adcl(Register dst, const Address& address);
400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void subl(Register dst, Register src);
402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void subl(Register reg, const Immediate& imm);
403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void subl(Register reg, const Address& address);
40409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  void subl(const Address& address, Register src);
405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cdq();
407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void idivl(Register reg);
409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void imull(Register dst, Register src);
411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void imull(Register reg, const Immediate& imm);
412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void imull(Register reg, const Address& address);
413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void imull(Register reg);
415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void imull(const Address& address);
416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void mull(Register reg);
418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void mull(const Address& address);
419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void sbbl(Register dst, Register src);
421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void sbbl(Register reg, const Immediate& imm);
422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void sbbl(Register reg, const Address& address);
42309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  void sbbl(const Address& address, Register src);
424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void incl(Register reg);
426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void incl(const Address& address);
427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void decl(Register reg);
429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void decl(const Address& address);
430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void shll(Register reg, const Immediate& imm);
432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void shll(Register operand, Register shifter);
4337394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void shll(const Address& address, const Immediate& imm);
4347394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void shll(const Address& address, Register shifter);
435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void shrl(Register reg, const Immediate& imm);
436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void shrl(Register operand, Register shifter);
4377394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void shrl(const Address& address, const Immediate& imm);
4387394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void shrl(const Address& address, Register shifter);
439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void sarl(Register reg, const Immediate& imm);
440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void sarl(Register operand, Register shifter);
4417394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void sarl(const Address& address, const Immediate& imm);
4427394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void sarl(const Address& address, Register shifter);
4439aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle  void shld(Register dst, Register src, Register shifter);
4447394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void shld(Register dst, Register src, const Immediate& imm);
4459aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle  void shrd(Register dst, Register src, Register shifter);
4467394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void shrd(Register dst, Register src, const Immediate& imm);
447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void negl(Register reg);
449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void notl(Register reg);
450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void enter(const Immediate& imm);
452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void leave();
453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void ret();
455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void ret(const Immediate& imm);
456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void nop();
458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void int3();
459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void hlt();
460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void j(Condition condition, Label* label);
462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void jmp(Register reg);
4647caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers  void jmp(const Address& address);
465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void jmp(Label* label);
466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
46721030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe  void repne_scasw();
46871311f868e2579fa5d40b24e620198734119d1a0agicsaki  void repe_cmpsw();
469970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki  void repe_cmpsl();
47021030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe
4712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  X86Assembler* lock();
472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void cmpxchgl(const Address& address, Register reg);
47358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell  void cmpxchg8b(const Address& address);
474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
47579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes  void mfence();
47679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes
4772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  X86Assembler* fs();
478befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers  X86Assembler* gs();
479b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
480b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  //
481b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  // Macros for High-level operations.
482b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  //
483b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
4842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  void AddImmediate(Register reg, const Immediate& imm);
485b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
486647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain  void LoadLongConstant(XmmRegister dst, int64_t value);
4872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  void LoadDoubleConstant(XmmRegister dst, double value);
488b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
4892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  void LockCmpxchgl(const Address& address, Register reg) {
4902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers    lock()->cmpxchgl(address, reg);
4912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  }
492b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
49358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell  void LockCmpxchg8b(const Address& address) {
49458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell    lock()->cmpxchg8b(address);
49558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell  }
49658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell
4972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  //
4982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Misc. functionality
4992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  //
5002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  int PreferredLoopAlignment() { return 16; }
5012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  void Align(int alignment, int offset);
5022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  void Bind(Label* label);
503b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
5042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  //
5052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Overridden common assembler high-level functionality
5062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  //
507b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
5082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Emit code that will create an activation on the stack
509dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void BuildFrame(size_t frame_size, ManagedRegister method_reg,
510dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers                  const std::vector<ManagedRegister>& callee_save_regs,
511dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers                  const ManagedRegisterEntrySpills& entry_spills) OVERRIDE;
512b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
5132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Emit code that will remove an activation from the stack
514dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void RemoveFrame(size_t frame_size, const std::vector<ManagedRegister>& callee_save_regs)
515dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers      OVERRIDE;
51645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers
517dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void IncreaseFrameSize(size_t adjust) OVERRIDE;
518dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void DecreaseFrameSize(size_t adjust) OVERRIDE;
519b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
5202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Store routines
521dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Store(FrameOffset offs, ManagedRegister src, size_t size) OVERRIDE;
522dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void StoreRef(FrameOffset dest, ManagedRegister src) OVERRIDE;
523dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void StoreRawPtr(FrameOffset dest, ManagedRegister src) OVERRIDE;
524b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
525dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void StoreImmediateToFrame(FrameOffset dest, uint32_t imm, ManagedRegister scratch) OVERRIDE;
526b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
527dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void StoreImmediateToThread32(ThreadOffset<4> dest, uint32_t imm, ManagedRegister scratch)
528dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers      OVERRIDE;
529b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
530dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void StoreStackOffsetToThread32(ThreadOffset<4> thr_offs, FrameOffset fr_offs,
531dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers                                  ManagedRegister scratch) OVERRIDE;
532b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
533dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void StoreStackPointerToThread32(ThreadOffset<4> thr_offs) OVERRIDE;
534bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
535dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void StoreSpanning(FrameOffset dest, ManagedRegister src, FrameOffset in_off,
536dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers                     ManagedRegister scratch) OVERRIDE;
537668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao
5382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Load routines
539dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Load(ManagedRegister dest, FrameOffset src, size_t size) OVERRIDE;
540b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
541dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void LoadFromThread32(ManagedRegister dest, ThreadOffset<4> src, size_t size) OVERRIDE;
5425a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers
543e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  void LoadRef(ManagedRegister dest, FrameOffset src) OVERRIDE;
54445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers
545e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  void LoadRef(ManagedRegister dest, ManagedRegister base, MemberOffset offs,
5464d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain               bool unpoison_reference) OVERRIDE;
54745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers
548dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void LoadRawPtr(ManagedRegister dest, ManagedRegister base, Offset offs) OVERRIDE;
549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
550dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void LoadRawPtrFromThread32(ManagedRegister dest, ThreadOffset<4> offs) OVERRIDE;
551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
5522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Copying routines
553dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Move(ManagedRegister dest, ManagedRegister src, size_t size) OVERRIDE;
554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
555dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void CopyRawPtrFromThread32(FrameOffset fr_offs, ThreadOffset<4> thr_offs,
556dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers                              ManagedRegister scratch) OVERRIDE;
557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
558dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void CopyRawPtrToThread32(ThreadOffset<4> thr_offs, FrameOffset fr_offs, ManagedRegister scratch)
559dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers      OVERRIDE;
560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
561dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void CopyRef(FrameOffset dest, FrameOffset src, ManagedRegister scratch) OVERRIDE;
562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
563dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Copy(FrameOffset dest, FrameOffset src, ManagedRegister scratch, size_t size) OVERRIDE;
56445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers
565dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Copy(FrameOffset dest, ManagedRegister src_base, Offset src_offset, ManagedRegister scratch,
566dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers            size_t size) OVERRIDE;
567dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers
568dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, ManagedRegister scratch,
569dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers            size_t size) OVERRIDE;
5705a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers
571dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, ManagedRegister scratch,
572dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers            size_t size) OVERRIDE;
573dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers
574dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Copy(ManagedRegister dest, Offset dest_offset, ManagedRegister src, Offset src_offset,
575dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers            ManagedRegister scratch, size_t size) OVERRIDE;
5765a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers
577dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset,
578dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers            ManagedRegister scratch, size_t size) OVERRIDE;
579dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers
580dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void MemoryBarrier(ManagedRegister) OVERRIDE;
581e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers
58258136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao  // Sign extension
583dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void SignExtend(ManagedRegister mreg, size_t size) OVERRIDE;
58458136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao
585cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao  // Zero extension
586dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void ZeroExtend(ManagedRegister mreg, size_t size) OVERRIDE;
587cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao
5882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Exploit fast access in managed code to Thread::Current()
589dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void GetCurrentThread(ManagedRegister tr) OVERRIDE;
590dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void GetCurrentThread(FrameOffset dest_offset, ManagedRegister scratch) OVERRIDE;
591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
5922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  // Set up out_reg to hold a Object** into the handle scope, or to be null if the
5932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // value is null and null_allowed. in_reg holds a possibly stale reference
594eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier  // that can be used to avoid loading the handle scope entry to see if the value is
5952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  // null.
5962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  void CreateHandleScopeEntry(ManagedRegister out_reg, FrameOffset handlescope_offset,
5972cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier                              ManagedRegister in_reg, bool null_allowed) OVERRIDE;
5982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
5992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  // Set up out_off to hold a Object** into the handle scope, or to be null if the
6002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // value is null and null_allowed.
6012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  void CreateHandleScopeEntry(FrameOffset out_off, FrameOffset handlescope_offset,
6022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier                              ManagedRegister scratch, bool null_allowed) OVERRIDE;
6032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
604eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier  // src holds a handle scope entry (Object**) load this into dst
605eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier  void LoadReferenceFromHandleScope(ManagedRegister dst, ManagedRegister src) OVERRIDE;
6062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
6072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Heap::VerifyObject on src. In some cases (such as a reference to this) we
6082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // know that src may not be null.
609dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void VerifyObject(ManagedRegister src, bool could_be_null) OVERRIDE;
610dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void VerifyObject(FrameOffset src, bool could_be_null) OVERRIDE;
6112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
6122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Call to address held at [base+offset]
613dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Call(ManagedRegister base, Offset offset, ManagedRegister scratch) OVERRIDE;
614dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void Call(FrameOffset base, Offset offset, ManagedRegister scratch) OVERRIDE;
615dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void CallFromThread32(ThreadOffset<4> offset, ManagedRegister scratch) OVERRIDE;
616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // Generate code to check if Thread::Current()->exception_ is non-null
6182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  // and branch to a ExceptionSlowPath if it is.
619dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  void ExceptionPoll(ManagedRegister scratch, size_t stack_adjust) OVERRIDE;
620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6214d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  //
6224d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  // Heap poisoning.
6234d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  //
6244d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain
6254d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  // Poison a heap reference contained in `reg`.
6264d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  void PoisonHeapReference(Register reg) { negl(reg); }
6274d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  // Unpoison a heap reference contained in `reg`.
6284d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  void UnpoisonHeapReference(Register reg) { negl(reg); }
6294d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  // Unpoison a heap reference contained in `reg` if heap poisoning is enabled.
6304d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  void MaybeUnpoisonHeapReference(Register reg) {
6314d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain    if (kPoisonHeapReferences) {
6324d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain      UnpoisonHeapReference(reg);
6334d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain    }
6344d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain  }
6354d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain
636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro private:
637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  inline void EmitUint8(uint8_t value);
638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  inline void EmitInt32(int32_t value);
639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  inline void EmitRegisterOperand(int rm, int reg);
640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  inline void EmitXmmRegisterOperand(int rm, XmmRegister reg);
641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  inline void EmitFixup(AssemblerFixup* fixup);
642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  inline void EmitOperandSizeOverride();
643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void EmitOperand(int rm, const Operand& operand);
645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void EmitImmediate(const Immediate& imm);
646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void EmitComplex(int rm, const Operand& operand, const Immediate& immediate);
647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void EmitLabel(Label* label, int instruction_size);
648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void EmitLabelLink(Label* label);
649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  void EmitNearLabelLink(Label* label);
650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6517394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void EmitGenericShift(int rm, const Operand& operand, const Immediate& imm);
6527394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  void EmitGenericShift(int rm, const Operand& operand, Register shifter);
653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  DISALLOW_COPY_AND_ASSIGN(X86Assembler);
655a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro};
656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitUint8(uint8_t value) {
658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  buffer_.Emit<uint8_t>(value);
659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitInt32(int32_t value) {
662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  buffer_.Emit<int32_t>(value);
663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
664a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitRegisterOperand(int rm, int reg) {
666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK_GE(rm, 0);
667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK_LT(rm, 8);
668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  buffer_.Emit<uint8_t>(0xC0 + (rm << 3) + reg);
669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitXmmRegisterOperand(int rm, XmmRegister reg) {
672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(rm, static_cast<Register>(reg));
673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitFixup(AssemblerFixup* fixup) {
676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  buffer_.EmitFixup(fixup);
677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline void X86Assembler::EmitOperandSizeOverride() {
680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x66);
681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers// Slowpath entered when Thread::Current()->_exception is non-null
684dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersclass X86ExceptionSlowPath FINAL : public SlowPath {
6852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers public:
68693ba893c20532990a430741e0a97212900094e8cBrian Carlstrom  explicit X86ExceptionSlowPath(size_t stack_adjust) : stack_adjust_(stack_adjust) {}
687dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  virtual void Emit(Assembler *sp_asm) OVERRIDE;
68800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers private:
68900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const size_t stack_adjust_;
6902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers};
6912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
6922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}  // namespace x86
6936b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro}  // namespace art
694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
695166db04e259ca51838c311891598664deeed85adIan Rogers#endif  // ART_COMPILER_UTILS_X86_ASSEMBLER_X86_H_
696