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