Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: src/IceAssemblerX86BaseImpl.h

Issue 1224173006: Adds the x86-64 assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments; changes emitRex.* logic. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- subzero/src/IceAssemblerX86BaseImpl.h - base x86 assembler -*- C++ -*-=// 1 //===- subzero/src/IceAssemblerX86BaseImpl.h - base x86 assembler -*- C++ -*-=//
2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
3 // for details. All rights reserved. Use of this source code is governed by a 3 // for details. All rights reserved. Use of this source code is governed by a
4 // BSD-style license that can be found in the LICENSE file. 4 // BSD-style license that can be found in the LICENSE file.
5 // 5 //
6 // Modified by the Subzero authors. 6 // Modified by the Subzero authors.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // The Subzero Code Generator 10 // The Subzero Code Generator
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 template <class Machine> 89 template <class Machine>
90 void AssemblerX86Base<Machine>::BindLocalLabel(SizeT Number) { 90 void AssemblerX86Base<Machine>::BindLocalLabel(SizeT Number) {
91 Label *L = GetOrCreateLocalLabel(Number); 91 Label *L = GetOrCreateLocalLabel(Number);
92 if (!getPreliminary()) 92 if (!getPreliminary())
93 this->bind(L); 93 this->bind(L);
94 } 94 }
95 95
96 template <class Machine> 96 template <class Machine>
97 void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) { 97 void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) {
98 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 98 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
99 emitRexB(IceType_Irrelevant, reg);
99 emitUint8(0xFF); 100 emitUint8(0xFF);
100 emitRegisterOperand(2, reg); 101 emitRegisterOperand(2, gprEncoding(reg));
101 } 102 }
102 103
103 template <class Machine> 104 template <class Machine>
104 void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) { 105 void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) {
105 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 106 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
107 emitRex(IceType_Irrelevant, address, Encoded_Reg_Irrelevant);
106 emitUint8(0xFF); 108 emitUint8(0xFF);
107 emitOperand(2, address); 109 emitOperand(2, address);
108 } 110 }
109 111
110 template <class Machine> 112 template <class Machine>
111 void AssemblerX86Base<Machine>::call(const ConstantRelocatable *label) { 113 void AssemblerX86Base<Machine>::call(const ConstantRelocatable *label) {
112 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 114 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
113 intptr_t call_start = Buffer.getPosition(); 115 intptr_t call_start = Buffer.getPosition();
114 emitUint8(0xE8); 116 emitUint8(0xE8);
115 emitFixup(this->createFixup(Traits::PcRelFixup, label)); 117 emitFixup(this->createFixup(Traits::PcRelFixup, label));
116 emitInt32(-4); 118 emitInt32(-4);
117 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize); 119 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
118 (void)call_start; 120 (void)call_start;
119 } 121 }
120 122
121 template <class Machine> 123 template <class Machine>
122 void AssemblerX86Base<Machine>::call(const Immediate &abs_address) { 124 void AssemblerX86Base<Machine>::call(const Immediate &abs_address) {
123 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 125 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
124 intptr_t call_start = Buffer.getPosition(); 126 intptr_t call_start = Buffer.getPosition();
125 emitUint8(0xE8); 127 emitUint8(0xE8);
126 emitFixup(this->createFixup(Traits::PcRelFixup, AssemblerFixup::NullSymbol)); 128 emitFixup(this->createFixup(Traits::PcRelFixup, AssemblerFixup::NullSymbol));
127 emitInt32(abs_address.value() - 4); 129 emitInt32(abs_address.value() - 4);
128 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize); 130 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
129 (void)call_start; 131 (void)call_start;
130 } 132 }
131 133
132 template <class Machine> 134 template <class Machine>
133 void AssemblerX86Base<Machine>::pushl(typename Traits::GPRRegister reg) { 135 void AssemblerX86Base<Machine>::pushl(typename Traits::GPRRegister reg) {
134 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 136 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
135 emitUint8(0x50 + reg); 137 emitRexB(IceType_Irrelevant, reg);
138 emitUint8(0x50 + gprEncoding(reg));
136 } 139 }
137 140
138 template <class Machine> 141 template <class Machine>
139 void AssemblerX86Base<Machine>::popl(typename Traits::GPRRegister reg) { 142 void AssemblerX86Base<Machine>::popl(typename Traits::GPRRegister reg) {
140 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 143 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
141 emitUint8(0x58 + reg); 144 // Any type that would not force a REX prefix to be emitted can be provided
145 // here.
146 emitRexB(IceType_Irrelevant, reg);
147 emitUint8(0x58 + gprEncoding(reg));
142 } 148 }
143 149
144 template <class Machine> 150 template <class Machine>
145 void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) { 151 void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) {
146 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 152 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
153 emitRex(IceType_Irrelevant, address, Encoded_Reg_Irrelevant);
147 emitUint8(0x8F); 154 emitUint8(0x8F);
148 emitOperand(0, address); 155 emitOperand(0, address);
149 } 156 }
150 157
151 template <class Machine> void AssemblerX86Base<Machine>::pushal() { 158 template <class Machine>
159 template <typename, typename>
160 void AssemblerX86Base<Machine>::pushal() {
152 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 161 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
153 emitUint8(0x60); 162 emitUint8(0x60);
154 } 163 }
155 164
156 template <class Machine> void AssemblerX86Base<Machine>::popal() { 165 template <class Machine>
166 template <typename, typename>
167 void AssemblerX86Base<Machine>::popal() {
157 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 168 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
158 emitUint8(0x61); 169 emitUint8(0x61);
159 } 170 }
160 171
161 template <class Machine> 172 template <class Machine>
162 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition, 173 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition,
163 typename Traits::ByteRegister dst) { 174 typename Traits::ByteRegister dst) {
164 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 175 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
176 emitRexB(IceType_i8, dst);
165 emitUint8(0x0F); 177 emitUint8(0x0F);
166 emitUint8(0x90 + condition); 178 emitUint8(0x90 + condition);
167 emitUint8(0xC0 + dst); 179 emitUint8(0xC0 + gprEncoding(dst));
168 } 180 }
169 181
170 template <class Machine> 182 template <class Machine>
171 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition, 183 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition,
172 const typename Traits::Address &address) { 184 const typename Traits::Address &address) {
173 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 185 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
186 emitRex(IceType_Irrelevant, address, Encoded_Reg_Irrelevant);
174 emitUint8(0x0F); 187 emitUint8(0x0F);
175 emitUint8(0x90 + condition); 188 emitUint8(0x90 + condition);
176 emitOperand(0, address); 189 emitOperand(0, address);
177 } 190 }
178 191
179 template <class Machine> 192 template <class Machine>
180 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 193 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
181 const Immediate &imm) { 194 const Immediate &imm) {
195 assert(Ty != IceType_i64 && "i64 not supported yet.");
182 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 196 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
183 if (isByteSizedType(Ty)) {
184 emitUint8(0xB0 + dst);
185 emitUint8(imm.value() & 0xFF);
186 return;
187 }
188 if (Ty == IceType_i16) 197 if (Ty == IceType_i16)
189 emitOperandSizeOverride(); 198 emitOperandSizeOverride();
190 emitUint8(0xB8 + dst); 199 emitRexB(Ty, dst);
191 emitImmediate(Ty, imm); 200 if (isByteSizedType(Ty)) {
201 emitUint8(0xB0 + gprEncoding(dst));
202 emitUint8(imm.value() & 0xFF);
203 } else {
204 emitUint8(0xB8 + gprEncoding(dst));
205 emitImmediate(Ty, imm);
206 }
192 } 207 }
193 208
194 template <class Machine> 209 template <class Machine>
195 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 210 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
196 typename Traits::GPRRegister src) { 211 typename Traits::GPRRegister src) {
197 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 212 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
198 if (Ty == IceType_i16) 213 if (Ty == IceType_i16)
199 emitOperandSizeOverride(); 214 emitOperandSizeOverride();
215 emitRexRB(Ty, src, dst);
200 if (isByteSizedType(Ty)) { 216 if (isByteSizedType(Ty)) {
201 emitUint8(0x88); 217 emitUint8(0x88);
202 } else { 218 } else {
203 emitUint8(0x89); 219 emitUint8(0x89);
204 } 220 }
205 emitRegisterOperand(src, dst); 221 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
206 } 222 }
207 223
208 template <class Machine> 224 template <class Machine>
209 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 225 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
210 const typename Traits::Address &src) { 226 const typename Traits::Address &src) {
211 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 227 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
212 if (Ty == IceType_i16) 228 if (Ty == IceType_i16)
213 emitOperandSizeOverride(); 229 emitOperandSizeOverride();
230 emitRex(Ty, src, dst);
214 if (isByteSizedType(Ty)) { 231 if (isByteSizedType(Ty)) {
215 emitUint8(0x8A); 232 emitUint8(0x8A);
216 } else { 233 } else {
217 emitUint8(0x8B); 234 emitUint8(0x8B);
218 } 235 }
219 emitOperand(dst, src); 236 emitOperand(gprEncoding(dst), src);
220 } 237 }
221 238
222 template <class Machine> 239 template <class Machine>
223 void AssemblerX86Base<Machine>::mov(Type Ty, 240 void AssemblerX86Base<Machine>::mov(Type Ty,
224 const typename Traits::Address &dst, 241 const typename Traits::Address &dst,
225 typename Traits::GPRRegister src) { 242 typename Traits::GPRRegister src) {
226 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 243 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
227 if (Ty == IceType_i16) 244 if (Ty == IceType_i16)
228 emitOperandSizeOverride(); 245 emitOperandSizeOverride();
246 emitRex(Ty, dst, src);
229 if (isByteSizedType(Ty)) { 247 if (isByteSizedType(Ty)) {
230 emitUint8(0x88); 248 emitUint8(0x88);
231 } else { 249 } else {
232 emitUint8(0x89); 250 emitUint8(0x89);
233 } 251 }
234 emitOperand(src, dst); 252 emitOperand(gprEncoding(src), dst);
235 } 253 }
236 254
237 template <class Machine> 255 template <class Machine>
238 void AssemblerX86Base<Machine>::mov(Type Ty, 256 void AssemblerX86Base<Machine>::mov(Type Ty,
239 const typename Traits::Address &dst, 257 const typename Traits::Address &dst,
240 const Immediate &imm) { 258 const Immediate &imm) {
259 assert(Ty != IceType_i64 && "i64 not supported yet.");
241 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 260 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
242 if (Ty == IceType_i16) 261 if (Ty == IceType_i16)
243 emitOperandSizeOverride(); 262 emitOperandSizeOverride();
263 emitRex(Ty, dst, Encoded_Reg_Irrelevant);
244 if (isByteSizedType(Ty)) { 264 if (isByteSizedType(Ty)) {
245 emitUint8(0xC6); 265 emitUint8(0xC6);
246 emitOperand(0, dst); 266 emitOperand(0, dst);
247 emitUint8(imm.value() & 0xFF); 267 emitUint8(imm.value() & 0xFF);
248 } else { 268 } else {
249 emitUint8(0xC7); 269 emitUint8(0xC7);
250 emitOperand(0, dst); 270 emitOperand(0, dst);
251 emitImmediate(Ty, imm); 271 emitImmediate(Ty, imm);
252 } 272 }
253 } 273 }
254 274
255 template <class Machine> 275 template <class Machine>
256 void AssemblerX86Base<Machine>::movzx(Type SrcTy, 276 void AssemblerX86Base<Machine>::movzx(Type SrcTy,
257 typename Traits::GPRRegister dst, 277 typename Traits::GPRRegister dst,
258 typename Traits::GPRRegister src) { 278 typename Traits::GPRRegister src) {
259 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 279 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
260 bool ByteSized = isByteSizedType(SrcTy); 280 bool ByteSized = isByteSizedType(SrcTy);
261 assert(ByteSized || SrcTy == IceType_i16); 281 assert(ByteSized || SrcTy == IceType_i16);
282 emitRexRB(IceType_Irrelevant, dst, SrcTy, src);
262 emitUint8(0x0F); 283 emitUint8(0x0F);
263 emitUint8(ByteSized ? 0xB6 : 0xB7); 284 emitUint8(ByteSized ? 0xB6 : 0xB7);
264 emitRegisterOperand(dst, src); 285 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
265 } 286 }
266 287
267 template <class Machine> 288 template <class Machine>
268 void AssemblerX86Base<Machine>::movzx(Type SrcTy, 289 void AssemblerX86Base<Machine>::movzx(Type SrcTy,
269 typename Traits::GPRRegister dst, 290 typename Traits::GPRRegister dst,
270 const typename Traits::Address &src) { 291 const typename Traits::Address &src) {
271 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 292 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
272 bool ByteSized = isByteSizedType(SrcTy); 293 bool ByteSized = isByteSizedType(SrcTy);
273 assert(ByteSized || SrcTy == IceType_i16); 294 assert(ByteSized || SrcTy == IceType_i16);
295 emitRex(SrcTy, src, IceType_Irrelevant, dst);
274 emitUint8(0x0F); 296 emitUint8(0x0F);
275 emitUint8(ByteSized ? 0xB6 : 0xB7); 297 emitUint8(ByteSized ? 0xB6 : 0xB7);
276 emitOperand(dst, src); 298 emitOperand(gprEncoding(dst), src);
277 } 299 }
278 300
279 template <class Machine> 301 template <class Machine>
280 void AssemblerX86Base<Machine>::movsx(Type SrcTy, 302 void AssemblerX86Base<Machine>::movsx(Type SrcTy,
281 typename Traits::GPRRegister dst, 303 typename Traits::GPRRegister dst,
282 typename Traits::GPRRegister src) { 304 typename Traits::GPRRegister src) {
283 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 305 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
284 bool ByteSized = isByteSizedType(SrcTy); 306 bool ByteSized = isByteSizedType(SrcTy);
285 assert(ByteSized || SrcTy == IceType_i16); 307 emitRexRB(IceType_ForceRexW, dst, SrcTy, src);
286 emitUint8(0x0F); 308 if (ByteSized || SrcTy == IceType_i16) {
287 emitUint8(ByteSized ? 0xBE : 0xBF); 309 emitUint8(0x0F);
288 emitRegisterOperand(dst, src); 310 emitUint8(ByteSized ? 0xBE : 0xBF);
311 } else {
312 assert(Traits::Is64Bit && SrcTy == IceType_i32);
313 emitUint8(0x63);
314 }
315 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
289 } 316 }
290 317
291 template <class Machine> 318 template <class Machine>
292 void AssemblerX86Base<Machine>::movsx(Type SrcTy, 319 void AssemblerX86Base<Machine>::movsx(Type SrcTy,
293 typename Traits::GPRRegister dst, 320 typename Traits::GPRRegister dst,
294 const typename Traits::Address &src) { 321 const typename Traits::Address &src) {
295 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 322 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
296 bool ByteSized = isByteSizedType(SrcTy); 323 bool ByteSized = isByteSizedType(SrcTy);
297 assert(ByteSized || SrcTy == IceType_i16); 324 emitRex(SrcTy, src, IceType_ForceRexW, dst);
298 emitUint8(0x0F); 325 if (ByteSized || SrcTy == IceType_i16) {
299 emitUint8(ByteSized ? 0xBE : 0xBF); 326 emitUint8(0x0F);
300 emitOperand(dst, src); 327 emitUint8(ByteSized ? 0xBE : 0xBF);
328 } else {
329 assert(Traits::Is64Bit && SrcTy == IceType_i32);
330 emitUint8(0x63);
331 }
332 emitOperand(gprEncoding(dst), src);
301 } 333 }
302 334
303 template <class Machine> 335 template <class Machine>
304 void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst, 336 void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst,
305 const typename Traits::Address &src) { 337 const typename Traits::Address &src) {
306 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 338 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
307 assert(Ty == IceType_i16 || Ty == IceType_i32); 339 assert(Ty == IceType_i16 || Ty == IceType_i32);
308 if (Ty == IceType_i16) 340 if (Ty == IceType_i16)
309 emitOperandSizeOverride(); 341 emitOperandSizeOverride();
342 emitRex(Ty, src, dst);
310 emitUint8(0x8D); 343 emitUint8(0x8D);
311 emitOperand(dst, src); 344 emitOperand(gprEncoding(dst), src);
312 } 345 }
313 346
314 template <class Machine> 347 template <class Machine>
315 void AssemblerX86Base<Machine>::cmov(Type Ty, 348 void AssemblerX86Base<Machine>::cmov(Type Ty,
316 typename Traits::Cond::BrCond cond, 349 typename Traits::Cond::BrCond cond,
317 typename Traits::GPRRegister dst, 350 typename Traits::GPRRegister dst,
318 typename Traits::GPRRegister src) { 351 typename Traits::GPRRegister src) {
319 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 352 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
320 if (Ty == IceType_i16) 353 if (Ty == IceType_i16)
321 emitOperandSizeOverride(); 354 emitOperandSizeOverride();
322 else 355 else
323 assert(Ty == IceType_i32); 356 assert(Ty == IceType_i32);
357 emitRexRB(Ty, dst, src);
324 emitUint8(0x0F); 358 emitUint8(0x0F);
325 emitUint8(0x40 + cond); 359 emitUint8(0x40 + cond);
326 emitRegisterOperand(dst, src); 360 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
327 } 361 }
328 362
329 template <class Machine> 363 template <class Machine>
330 void AssemblerX86Base<Machine>::cmov(Type Ty, 364 void AssemblerX86Base<Machine>::cmov(Type Ty,
331 typename Traits::Cond::BrCond cond, 365 typename Traits::Cond::BrCond cond,
332 typename Traits::GPRRegister dst, 366 typename Traits::GPRRegister dst,
333 const typename Traits::Address &src) { 367 const typename Traits::Address &src) {
334 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 368 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
335 if (Ty == IceType_i16) 369 if (Ty == IceType_i16)
336 emitOperandSizeOverride(); 370 emitOperandSizeOverride();
337 else 371 else
338 assert(Ty == IceType_i32); 372 assert(Ty == IceType_i32);
373 emitRex(Ty, src, dst);
339 emitUint8(0x0F); 374 emitUint8(0x0F);
340 emitUint8(0x40 + cond); 375 emitUint8(0x40 + cond);
341 emitOperand(dst, src); 376 emitOperand(gprEncoding(dst), src);
342 } 377 }
343 378
344 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() { 379 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() {
345 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 380 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
346 emitUint8(0xF3); 381 emitUint8(0xF3);
347 emitUint8(0xA4); 382 emitUint8(0xA4);
348 } 383 }
349 384
350 template <class Machine> 385 template <class Machine>
351 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, 386 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst,
352 const typename Traits::Address &src) { 387 const typename Traits::Address &src) {
353 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 388 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
354 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 389 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
390 emitRex(IceType_Irrelevant, src, dst);
355 emitUint8(0x0F); 391 emitUint8(0x0F);
356 emitUint8(0x10); 392 emitUint8(0x10);
357 emitOperand(dst, src); 393 emitOperand(gprEncoding(dst), src);
358 } 394 }
359 395
360 template <class Machine> 396 template <class Machine>
361 void AssemblerX86Base<Machine>::movss(Type Ty, 397 void AssemblerX86Base<Machine>::movss(Type Ty,
362 const typename Traits::Address &dst, 398 const typename Traits::Address &dst,
363 typename Traits::XmmRegister src) { 399 typename Traits::XmmRegister src) {
364 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 400 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
365 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 401 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
402 emitRex(IceType_Irrelevant, dst, src);
366 emitUint8(0x0F); 403 emitUint8(0x0F);
367 emitUint8(0x11); 404 emitUint8(0x11);
368 emitOperand(src, dst); 405 emitOperand(gprEncoding(src), dst);
369 } 406 }
370 407
371 template <class Machine> 408 template <class Machine>
372 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, 409 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst,
373 typename Traits::XmmRegister src) { 410 typename Traits::XmmRegister src) {
374 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 411 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
375 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 412 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
413 emitRexRB(IceType_Irrelevant, src, dst);
376 emitUint8(0x0F); 414 emitUint8(0x0F);
377 emitUint8(0x11); 415 emitUint8(0x11);
378 emitXmmRegisterOperand(src, dst); 416 emitXmmRegisterOperand(src, dst);
379 } 417 }
380 418
381 template <class Machine> 419 template <class Machine>
382 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst, 420 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst,
383 typename Traits::GPRRegister src) { 421 typename Traits::GPRRegister src) {
384 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 422 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
385 emitUint8(0x66); 423 emitUint8(0x66);
424 emitRexRB(IceType_Irrelevant, dst, src);
386 emitUint8(0x0F); 425 emitUint8(0x0F);
387 emitUint8(0x6E); 426 emitUint8(0x6E);
388 emitRegisterOperand(dst, src); 427 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
389 } 428 }
390 429
391 template <class Machine> 430 template <class Machine>
392 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst, 431 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst,
393 const typename Traits::Address &src) { 432 const typename Traits::Address &src) {
394 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 433 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
395 emitUint8(0x66); 434 emitUint8(0x66);
435 emitRex(IceType_Irrelevant, src, dst);
396 emitUint8(0x0F); 436 emitUint8(0x0F);
397 emitUint8(0x6E); 437 emitUint8(0x6E);
398 emitOperand(dst, src); 438 emitOperand(gprEncoding(dst), src);
399 } 439 }
400 440
401 template <class Machine> 441 template <class Machine>
402 void AssemblerX86Base<Machine>::movd(typename Traits::GPRRegister dst, 442 void AssemblerX86Base<Machine>::movd(typename Traits::GPRRegister dst,
403 typename Traits::XmmRegister src) { 443 typename Traits::XmmRegister src) {
404 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 444 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
405 emitUint8(0x66); 445 emitUint8(0x66);
446 emitRexRB(IceType_Irrelevant, src, dst);
406 emitUint8(0x0F); 447 emitUint8(0x0F);
407 emitUint8(0x7E); 448 emitUint8(0x7E);
408 emitRegisterOperand(src, dst); 449 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
409 } 450 }
410 451
411 template <class Machine> 452 template <class Machine>
412 void AssemblerX86Base<Machine>::movd(const typename Traits::Address &dst, 453 void AssemblerX86Base<Machine>::movd(const typename Traits::Address &dst,
413 typename Traits::XmmRegister src) { 454 typename Traits::XmmRegister src) {
414 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 455 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
415 emitUint8(0x66); 456 emitUint8(0x66);
457 emitRex(IceType_Irrelevant, dst, src);
416 emitUint8(0x0F); 458 emitUint8(0x0F);
417 emitUint8(0x7E); 459 emitUint8(0x7E);
418 emitOperand(src, dst); 460 emitOperand(gprEncoding(src), dst);
419 } 461 }
420 462
421 template <class Machine> 463 template <class Machine>
422 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, 464 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst,
423 typename Traits::XmmRegister src) { 465 typename Traits::XmmRegister src) {
424 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 466 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
425 emitUint8(0xF3); 467 emitUint8(0xF3);
468 emitRexRB(IceType_Irrelevant, dst, src);
426 emitUint8(0x0F); 469 emitUint8(0x0F);
427 emitUint8(0x7E); 470 emitUint8(0x7E);
428 emitRegisterOperand(dst, src); 471 emitXmmRegisterOperand(dst, src);
429 } 472 }
430 473
431 template <class Machine> 474 template <class Machine>
432 void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst, 475 void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst,
433 typename Traits::XmmRegister src) { 476 typename Traits::XmmRegister src) {
434 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 477 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
435 emitUint8(0x66); 478 emitUint8(0x66);
479 emitRex(IceType_Irrelevant, dst, src);
436 emitUint8(0x0F); 480 emitUint8(0x0F);
437 emitUint8(0xD6); 481 emitUint8(0xD6);
438 emitOperand(src, dst); 482 emitOperand(gprEncoding(src), dst);
439 } 483 }
440 484
441 template <class Machine> 485 template <class Machine>
442 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, 486 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst,
443 const typename Traits::Address &src) { 487 const typename Traits::Address &src) {
444 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 488 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
445 emitUint8(0xF3); 489 emitUint8(0xF3);
490 emitRex(IceType_Irrelevant, src, dst);
446 emitUint8(0x0F); 491 emitUint8(0x0F);
447 emitUint8(0x7E); 492 emitUint8(0x7E);
448 emitOperand(dst, src); 493 emitOperand(gprEncoding(dst), src);
449 } 494 }
450 495
451 template <class Machine> 496 template <class Machine>
452 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, 497 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst,
453 typename Traits::XmmRegister src) { 498 typename Traits::XmmRegister src) {
454 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 499 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
455 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 500 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
501 emitRexRB(IceType_Irrelevant, dst, src);
456 emitUint8(0x0F); 502 emitUint8(0x0F);
457 emitUint8(0x58); 503 emitUint8(0x58);
458 emitXmmRegisterOperand(dst, src); 504 emitXmmRegisterOperand(dst, src);
459 } 505 }
460 506
461 template <class Machine> 507 template <class Machine>
462 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, 508 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst,
463 const typename Traits::Address &src) { 509 const typename Traits::Address &src) {
464 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 510 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
465 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 511 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
512 emitRex(IceType_Irrelevant, src, dst);
466 emitUint8(0x0F); 513 emitUint8(0x0F);
467 emitUint8(0x58); 514 emitUint8(0x58);
468 emitOperand(dst, src); 515 emitOperand(gprEncoding(dst), src);
469 } 516 }
470 517
471 template <class Machine> 518 template <class Machine>
472 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, 519 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst,
473 typename Traits::XmmRegister src) { 520 typename Traits::XmmRegister src) {
474 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 521 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
475 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 522 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
523 emitRexRB(IceType_Irrelevant, dst, src);
476 emitUint8(0x0F); 524 emitUint8(0x0F);
477 emitUint8(0x5C); 525 emitUint8(0x5C);
478 emitXmmRegisterOperand(dst, src); 526 emitXmmRegisterOperand(dst, src);
479 } 527 }
480 528
481 template <class Machine> 529 template <class Machine>
482 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, 530 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst,
483 const typename Traits::Address &src) { 531 const typename Traits::Address &src) {
484 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 532 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
485 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 533 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
534 emitRex(IceType_Irrelevant, src, dst);
486 emitUint8(0x0F); 535 emitUint8(0x0F);
487 emitUint8(0x5C); 536 emitUint8(0x5C);
488 emitOperand(dst, src); 537 emitOperand(gprEncoding(dst), src);
489 } 538 }
490 539
491 template <class Machine> 540 template <class Machine>
492 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, 541 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst,
493 typename Traits::XmmRegister src) { 542 typename Traits::XmmRegister src) {
494 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 543 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
495 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 544 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
545 emitRexRB(IceType_Irrelevant, dst, src);
496 emitUint8(0x0F); 546 emitUint8(0x0F);
497 emitUint8(0x59); 547 emitUint8(0x59);
498 emitXmmRegisterOperand(dst, src); 548 emitXmmRegisterOperand(dst, src);
499 } 549 }
500 550
501 template <class Machine> 551 template <class Machine>
502 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, 552 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst,
503 const typename Traits::Address &src) { 553 const typename Traits::Address &src) {
504 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 554 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
505 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 555 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
556 emitRex(IceType_Irrelevant, src, dst);
506 emitUint8(0x0F); 557 emitUint8(0x0F);
507 emitUint8(0x59); 558 emitUint8(0x59);
508 emitOperand(dst, src); 559 emitOperand(gprEncoding(dst), src);
509 } 560 }
510 561
511 template <class Machine> 562 template <class Machine>
512 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, 563 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst,
513 typename Traits::XmmRegister src) { 564 typename Traits::XmmRegister src) {
514 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 565 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
515 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 566 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
567 emitRexRB(IceType_Irrelevant, dst, src);
516 emitUint8(0x0F); 568 emitUint8(0x0F);
517 emitUint8(0x5E); 569 emitUint8(0x5E);
518 emitXmmRegisterOperand(dst, src); 570 emitXmmRegisterOperand(dst, src);
519 } 571 }
520 572
521 template <class Machine> 573 template <class Machine>
522 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, 574 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst,
523 const typename Traits::Address &src) { 575 const typename Traits::Address &src) {
524 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 576 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
525 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 577 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
578 emitRex(IceType_Irrelevant, src, dst);
526 emitUint8(0x0F); 579 emitUint8(0x0F);
527 emitUint8(0x5E); 580 emitUint8(0x5E);
528 emitOperand(dst, src); 581 emitOperand(gprEncoding(dst), src);
529 } 582 }
530 583
531 template <class Machine> 584 template <class Machine>
532 void AssemblerX86Base<Machine>::fld(Type Ty, 585 template <typename T, typename>
533 const typename Traits::Address &src) { 586 void AssemblerX86Base<Machine>::fld(Type Ty, const typename T::Address &src) {
534 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 587 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
535 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); 588 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
536 emitOperand(0, src); 589 emitOperand(0, src);
537 } 590 }
538 591
539 template <class Machine> 592 template <class Machine>
540 void AssemblerX86Base<Machine>::fstp(Type Ty, 593 template <typename T, typename>
541 const typename Traits::Address &dst) { 594 void AssemblerX86Base<Machine>::fstp(Type Ty, const typename T::Address &dst) {
542 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 595 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
543 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); 596 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
544 emitOperand(3, dst); 597 emitOperand(3, dst);
545 } 598 }
546 599
547 template <class Machine> 600 template <class Machine>
548 void AssemblerX86Base<Machine>::fstp(typename Traits::X87STRegister st) { 601 template <typename T, typename>
602 void AssemblerX86Base<Machine>::fstp(typename T::X87STRegister st) {
549 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 603 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
550 emitUint8(0xDD); 604 emitUint8(0xDD);
551 emitUint8(0xD8 + st); 605 emitUint8(0xD8 + st);
552 } 606 }
553 607
554 template <class Machine> 608 template <class Machine>
555 void AssemblerX86Base<Machine>::movaps(typename Traits::XmmRegister dst, 609 void AssemblerX86Base<Machine>::movaps(typename Traits::XmmRegister dst,
556 typename Traits::XmmRegister src) { 610 typename Traits::XmmRegister src) {
557 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 611 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
612 emitRexRB(IceType_Irrelevant, dst, src);
558 emitUint8(0x0F); 613 emitUint8(0x0F);
559 emitUint8(0x28); 614 emitUint8(0x28);
560 emitXmmRegisterOperand(dst, src); 615 emitXmmRegisterOperand(dst, src);
561 } 616 }
562 617
563 template <class Machine> 618 template <class Machine>
564 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst, 619 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst,
565 typename Traits::XmmRegister src) { 620 typename Traits::XmmRegister src) {
566 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 621 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
622 emitRexRB(IceType_Irrelevant, dst, src);
567 emitUint8(0x0F); 623 emitUint8(0x0F);
568 emitUint8(0x10); 624 emitUint8(0x10);
569 emitRegisterOperand(dst, src); 625 emitXmmRegisterOperand(dst, src);
570 } 626 }
571 627
572 template <class Machine> 628 template <class Machine>
573 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst, 629 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst,
574 const typename Traits::Address &src) { 630 const typename Traits::Address &src) {
575 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 631 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
632 emitRex(IceType_Irrelevant, src, dst);
576 emitUint8(0x0F); 633 emitUint8(0x0F);
577 emitUint8(0x10); 634 emitUint8(0x10);
578 emitOperand(dst, src); 635 emitOperand(gprEncoding(dst), src);
579 } 636 }
580 637
581 template <class Machine> 638 template <class Machine>
582 void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst, 639 void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst,
583 typename Traits::XmmRegister src) { 640 typename Traits::XmmRegister src) {
584 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 641 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
642 emitRex(IceType_Irrelevant, dst, src);
585 emitUint8(0x0F); 643 emitUint8(0x0F);
586 emitUint8(0x11); 644 emitUint8(0x11);
587 emitOperand(src, dst); 645 emitOperand(gprEncoding(src), dst);
588 } 646 }
589 647
590 template <class Machine> 648 template <class Machine>
591 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, 649 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst,
592 typename Traits::XmmRegister src) { 650 typename Traits::XmmRegister src) {
593 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 651 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
594 emitUint8(0x66); 652 emitUint8(0x66);
653 emitRexRB(IceType_Irrelevant, dst, src);
595 emitUint8(0x0F); 654 emitUint8(0x0F);
596 if (isByteSizedArithType(Ty)) { 655 if (isByteSizedArithType(Ty)) {
597 emitUint8(0xFC); 656 emitUint8(0xFC);
598 } else if (Ty == IceType_i16) { 657 } else if (Ty == IceType_i16) {
599 emitUint8(0xFD); 658 emitUint8(0xFD);
600 } else { 659 } else {
601 emitUint8(0xFE); 660 emitUint8(0xFE);
602 } 661 }
603 emitXmmRegisterOperand(dst, src); 662 emitXmmRegisterOperand(dst, src);
604 } 663 }
605 664
606 template <class Machine> 665 template <class Machine>
607 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, 666 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst,
608 const typename Traits::Address &src) { 667 const typename Traits::Address &src) {
609 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 668 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
610 emitUint8(0x66); 669 emitUint8(0x66);
670 emitRex(IceType_Irrelevant, src, dst);
611 emitUint8(0x0F); 671 emitUint8(0x0F);
612 if (isByteSizedArithType(Ty)) { 672 if (isByteSizedArithType(Ty)) {
613 emitUint8(0xFC); 673 emitUint8(0xFC);
614 } else if (Ty == IceType_i16) { 674 } else if (Ty == IceType_i16) {
615 emitUint8(0xFD); 675 emitUint8(0xFD);
616 } else { 676 } else {
617 emitUint8(0xFE); 677 emitUint8(0xFE);
618 } 678 }
619 emitOperand(dst, src); 679 emitOperand(gprEncoding(dst), src);
620 } 680 }
621 681
622 template <class Machine> 682 template <class Machine>
623 void AssemblerX86Base<Machine>::pand(Type /* Ty */, 683 void AssemblerX86Base<Machine>::pand(Type /* Ty */,
624 typename Traits::XmmRegister dst, 684 typename Traits::XmmRegister dst,
625 typename Traits::XmmRegister src) { 685 typename Traits::XmmRegister src) {
626 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 686 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
627 emitUint8(0x66); 687 emitUint8(0x66);
688 emitRexRB(IceType_Irrelevant, dst, src);
628 emitUint8(0x0F); 689 emitUint8(0x0F);
629 emitUint8(0xDB); 690 emitUint8(0xDB);
630 emitXmmRegisterOperand(dst, src); 691 emitXmmRegisterOperand(dst, src);
631 } 692 }
632 693
633 template <class Machine> 694 template <class Machine>
634 void AssemblerX86Base<Machine>::pand(Type /* Ty */, 695 void AssemblerX86Base<Machine>::pand(Type /* Ty */,
635 typename Traits::XmmRegister dst, 696 typename Traits::XmmRegister dst,
636 const typename Traits::Address &src) { 697 const typename Traits::Address &src) {
637 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 698 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
638 emitUint8(0x66); 699 emitUint8(0x66);
700 emitRex(IceType_Irrelevant, src, dst);
639 emitUint8(0x0F); 701 emitUint8(0x0F);
640 emitUint8(0xDB); 702 emitUint8(0xDB);
641 emitOperand(dst, src); 703 emitOperand(gprEncoding(dst), src);
642 } 704 }
643 705
644 template <class Machine> 706 template <class Machine>
645 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, 707 void AssemblerX86Base<Machine>::pandn(Type /* Ty */,
646 typename Traits::XmmRegister dst, 708 typename Traits::XmmRegister dst,
647 typename Traits::XmmRegister src) { 709 typename Traits::XmmRegister src) {
648 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 710 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
649 emitUint8(0x66); 711 emitUint8(0x66);
712 emitRexRB(IceType_Irrelevant, dst, src);
650 emitUint8(0x0F); 713 emitUint8(0x0F);
651 emitUint8(0xDF); 714 emitUint8(0xDF);
652 emitXmmRegisterOperand(dst, src); 715 emitXmmRegisterOperand(dst, src);
653 } 716 }
654 717
655 template <class Machine> 718 template <class Machine>
656 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, 719 void AssemblerX86Base<Machine>::pandn(Type /* Ty */,
657 typename Traits::XmmRegister dst, 720 typename Traits::XmmRegister dst,
658 const typename Traits::Address &src) { 721 const typename Traits::Address &src) {
659 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 722 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
660 emitUint8(0x66); 723 emitUint8(0x66);
724 emitRex(IceType_Irrelevant, src, dst);
661 emitUint8(0x0F); 725 emitUint8(0x0F);
662 emitUint8(0xDF); 726 emitUint8(0xDF);
663 emitOperand(dst, src); 727 emitOperand(gprEncoding(dst), src);
664 } 728 }
665 729
666 template <class Machine> 730 template <class Machine>
667 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, 731 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst,
668 typename Traits::XmmRegister src) { 732 typename Traits::XmmRegister src) {
669 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 733 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
670 emitUint8(0x66); 734 emitUint8(0x66);
735 emitRexRB(IceType_Irrelevant, dst, src);
671 emitUint8(0x0F); 736 emitUint8(0x0F);
672 if (Ty == IceType_i16) { 737 if (Ty == IceType_i16) {
673 emitUint8(0xD5); 738 emitUint8(0xD5);
674 } else { 739 } else {
675 assert(Ty == IceType_i32); 740 assert(Ty == IceType_i32);
676 emitUint8(0x38); 741 emitUint8(0x38);
677 emitUint8(0x40); 742 emitUint8(0x40);
678 } 743 }
679 emitXmmRegisterOperand(dst, src); 744 emitXmmRegisterOperand(dst, src);
680 } 745 }
681 746
682 template <class Machine> 747 template <class Machine>
683 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, 748 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst,
684 const typename Traits::Address &src) { 749 const typename Traits::Address &src) {
685 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 750 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
686 emitUint8(0x66); 751 emitUint8(0x66);
752 emitRex(IceType_Irrelevant, src, dst);
687 emitUint8(0x0F); 753 emitUint8(0x0F);
688 if (Ty == IceType_i16) { 754 if (Ty == IceType_i16) {
689 emitUint8(0xD5); 755 emitUint8(0xD5);
690 } else { 756 } else {
691 assert(Ty == IceType_i32); 757 assert(Ty == IceType_i32);
692 emitUint8(0x38); 758 emitUint8(0x38);
693 emitUint8(0x40); 759 emitUint8(0x40);
694 } 760 }
695 emitOperand(dst, src); 761 emitOperand(gprEncoding(dst), src);
696 } 762 }
697 763
698 template <class Machine> 764 template <class Machine>
699 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */, 765 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */,
700 typename Traits::XmmRegister dst, 766 typename Traits::XmmRegister dst,
701 typename Traits::XmmRegister src) { 767 typename Traits::XmmRegister src) {
702 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 768 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
703 emitUint8(0x66); 769 emitUint8(0x66);
770 emitRexRB(IceType_Irrelevant, dst, src);
704 emitUint8(0x0F); 771 emitUint8(0x0F);
705 emitUint8(0xF4); 772 emitUint8(0xF4);
706 emitXmmRegisterOperand(dst, src); 773 emitXmmRegisterOperand(dst, src);
707 } 774 }
708 775
709 template <class Machine> 776 template <class Machine>
710 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */, 777 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */,
711 typename Traits::XmmRegister dst, 778 typename Traits::XmmRegister dst,
712 const typename Traits::Address &src) { 779 const typename Traits::Address &src) {
713 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 780 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
714 emitUint8(0x66); 781 emitUint8(0x66);
782 emitRex(IceType_Irrelevant, src, dst);
715 emitUint8(0x0F); 783 emitUint8(0x0F);
716 emitUint8(0xF4); 784 emitUint8(0xF4);
717 emitOperand(dst, src); 785 emitOperand(gprEncoding(dst), src);
718 } 786 }
719 787
720 template <class Machine> 788 template <class Machine>
721 void AssemblerX86Base<Machine>::por(Type /* Ty */, 789 void AssemblerX86Base<Machine>::por(Type /* Ty */,
722 typename Traits::XmmRegister dst, 790 typename Traits::XmmRegister dst,
723 typename Traits::XmmRegister src) { 791 typename Traits::XmmRegister src) {
724 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 792 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
725 emitUint8(0x66); 793 emitUint8(0x66);
794 emitRexRB(IceType_Irrelevant, dst, src);
726 emitUint8(0x0F); 795 emitUint8(0x0F);
727 emitUint8(0xEB); 796 emitUint8(0xEB);
728 emitXmmRegisterOperand(dst, src); 797 emitXmmRegisterOperand(dst, src);
729 } 798 }
730 799
731 template <class Machine> 800 template <class Machine>
732 void AssemblerX86Base<Machine>::por(Type /* Ty */, 801 void AssemblerX86Base<Machine>::por(Type /* Ty */,
733 typename Traits::XmmRegister dst, 802 typename Traits::XmmRegister dst,
734 const typename Traits::Address &src) { 803 const typename Traits::Address &src) {
735 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 804 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
736 emitUint8(0x66); 805 emitUint8(0x66);
806 emitRex(IceType_Irrelevant, src, dst);
737 emitUint8(0x0F); 807 emitUint8(0x0F);
738 emitUint8(0xEB); 808 emitUint8(0xEB);
739 emitOperand(dst, src); 809 emitOperand(gprEncoding(dst), src);
740 } 810 }
741 811
742 template <class Machine> 812 template <class Machine>
743 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, 813 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst,
744 typename Traits::XmmRegister src) { 814 typename Traits::XmmRegister src) {
745 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 815 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
746 emitUint8(0x66); 816 emitUint8(0x66);
817 emitRexRB(IceType_Irrelevant, dst, src);
747 emitUint8(0x0F); 818 emitUint8(0x0F);
748 if (isByteSizedArithType(Ty)) { 819 if (isByteSizedArithType(Ty)) {
749 emitUint8(0xF8); 820 emitUint8(0xF8);
750 } else if (Ty == IceType_i16) { 821 } else if (Ty == IceType_i16) {
751 emitUint8(0xF9); 822 emitUint8(0xF9);
752 } else { 823 } else {
753 emitUint8(0xFA); 824 emitUint8(0xFA);
754 } 825 }
755 emitXmmRegisterOperand(dst, src); 826 emitXmmRegisterOperand(dst, src);
756 } 827 }
757 828
758 template <class Machine> 829 template <class Machine>
759 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, 830 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst,
760 const typename Traits::Address &src) { 831 const typename Traits::Address &src) {
761 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 832 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
762 emitUint8(0x66); 833 emitUint8(0x66);
834 emitRex(IceType_Irrelevant, src, dst);
763 emitUint8(0x0F); 835 emitUint8(0x0F);
764 if (isByteSizedArithType(Ty)) { 836 if (isByteSizedArithType(Ty)) {
765 emitUint8(0xF8); 837 emitUint8(0xF8);
766 } else if (Ty == IceType_i16) { 838 } else if (Ty == IceType_i16) {
767 emitUint8(0xF9); 839 emitUint8(0xF9);
768 } else { 840 } else {
769 emitUint8(0xFA); 841 emitUint8(0xFA);
770 } 842 }
771 emitOperand(dst, src); 843 emitOperand(gprEncoding(dst), src);
772 } 844 }
773 845
774 template <class Machine> 846 template <class Machine>
775 void AssemblerX86Base<Machine>::pxor(Type /* Ty */, 847 void AssemblerX86Base<Machine>::pxor(Type /* Ty */,
776 typename Traits::XmmRegister dst, 848 typename Traits::XmmRegister dst,
777 typename Traits::XmmRegister src) { 849 typename Traits::XmmRegister src) {
778 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 850 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
779 emitUint8(0x66); 851 emitUint8(0x66);
852 emitRexRB(IceType_Irrelevant, dst, src);
780 emitUint8(0x0F); 853 emitUint8(0x0F);
781 emitUint8(0xEF); 854 emitUint8(0xEF);
782 emitXmmRegisterOperand(dst, src); 855 emitXmmRegisterOperand(dst, src);
783 } 856 }
784 857
785 template <class Machine> 858 template <class Machine>
786 void AssemblerX86Base<Machine>::pxor(Type /* Ty */, 859 void AssemblerX86Base<Machine>::pxor(Type /* Ty */,
787 typename Traits::XmmRegister dst, 860 typename Traits::XmmRegister dst,
788 const typename Traits::Address &src) { 861 const typename Traits::Address &src) {
789 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 862 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
790 emitUint8(0x66); 863 emitUint8(0x66);
864 emitRex(IceType_Irrelevant, src, dst);
791 emitUint8(0x0F); 865 emitUint8(0x0F);
792 emitUint8(0xEF); 866 emitUint8(0xEF);
793 emitOperand(dst, src); 867 emitOperand(gprEncoding(dst), src);
794 } 868 }
795 869
796 template <class Machine> 870 template <class Machine>
797 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, 871 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
798 typename Traits::XmmRegister src) { 872 typename Traits::XmmRegister src) {
799 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 873 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
800 emitUint8(0x66); 874 emitUint8(0x66);
875 emitRexRB(IceType_Irrelevant, dst, src);
801 emitUint8(0x0F); 876 emitUint8(0x0F);
802 if (Ty == IceType_i16) { 877 if (Ty == IceType_i16) {
803 emitUint8(0xF1); 878 emitUint8(0xF1);
804 } else { 879 } else {
805 assert(Ty == IceType_i32); 880 assert(Ty == IceType_i32);
806 emitUint8(0xF2); 881 emitUint8(0xF2);
807 } 882 }
808 emitXmmRegisterOperand(dst, src); 883 emitXmmRegisterOperand(dst, src);
809 } 884 }
810 885
811 template <class Machine> 886 template <class Machine>
812 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, 887 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
813 const typename Traits::Address &src) { 888 const typename Traits::Address &src) {
814 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 889 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
815 emitUint8(0x66); 890 emitUint8(0x66);
891 emitRex(IceType_Irrelevant, src, dst);
816 emitUint8(0x0F); 892 emitUint8(0x0F);
817 if (Ty == IceType_i16) { 893 if (Ty == IceType_i16) {
818 emitUint8(0xF1); 894 emitUint8(0xF1);
819 } else { 895 } else {
820 assert(Ty == IceType_i32); 896 assert(Ty == IceType_i32);
821 emitUint8(0xF2); 897 emitUint8(0xF2);
822 } 898 }
823 emitOperand(dst, src); 899 emitOperand(gprEncoding(dst), src);
824 } 900 }
825 901
826 template <class Machine> 902 template <class Machine>
827 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, 903 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
828 const Immediate &imm) { 904 const Immediate &imm) {
829 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 905 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
830 assert(imm.is_int8()); 906 assert(imm.is_int8());
831 emitUint8(0x66); 907 emitUint8(0x66);
908 emitRexB(IceType_Irrelevant, dst);
832 emitUint8(0x0F); 909 emitUint8(0x0F);
833 if (Ty == IceType_i16) { 910 if (Ty == IceType_i16) {
834 emitUint8(0x71); 911 emitUint8(0x71);
835 } else { 912 } else {
836 assert(Ty == IceType_i32); 913 assert(Ty == IceType_i32);
837 emitUint8(0x72); 914 emitUint8(0x72);
838 } 915 }
839 emitRegisterOperand(6, dst); 916 emitRegisterOperand(6, gprEncoding(dst));
840 emitUint8(imm.value() & 0xFF); 917 emitUint8(imm.value() & 0xFF);
841 } 918 }
842 919
843 template <class Machine> 920 template <class Machine>
844 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, 921 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst,
845 typename Traits::XmmRegister src) { 922 typename Traits::XmmRegister src) {
846 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 923 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
847 emitUint8(0x66); 924 emitUint8(0x66);
925 emitRexRB(IceType_Irrelevant, dst, src);
848 emitUint8(0x0F); 926 emitUint8(0x0F);
849 if (Ty == IceType_i16) { 927 if (Ty == IceType_i16) {
850 emitUint8(0xE1); 928 emitUint8(0xE1);
851 } else { 929 } else {
852 assert(Ty == IceType_i32); 930 assert(Ty == IceType_i32);
853 emitUint8(0xE2); 931 emitUint8(0xE2);
854 } 932 }
855 emitXmmRegisterOperand(dst, src); 933 emitXmmRegisterOperand(dst, src);
856 } 934 }
857 935
858 template <class Machine> 936 template <class Machine>
859 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, 937 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst,
860 const typename Traits::Address &src) { 938 const typename Traits::Address &src) {
861 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 939 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
862 emitUint8(0x66); 940 emitUint8(0x66);
941 emitRex(IceType_Irrelevant, src, dst);
863 emitUint8(0x0F); 942 emitUint8(0x0F);
864 if (Ty == IceType_i16) { 943 if (Ty == IceType_i16) {
865 emitUint8(0xE1); 944 emitUint8(0xE1);
866 } else { 945 } else {
867 assert(Ty == IceType_i32); 946 assert(Ty == IceType_i32);
868 emitUint8(0xE2); 947 emitUint8(0xE2);
869 } 948 }
870 emitOperand(dst, src); 949 emitOperand(gprEncoding(dst), src);
871 } 950 }
872 951
873 template <class Machine> 952 template <class Machine>
874 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, 953 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst,
875 const Immediate &imm) { 954 const Immediate &imm) {
876 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 955 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
877 assert(imm.is_int8()); 956 assert(imm.is_int8());
878 emitUint8(0x66); 957 emitUint8(0x66);
958 emitRexB(IceType_Irrelevant, dst);
879 emitUint8(0x0F); 959 emitUint8(0x0F);
880 if (Ty == IceType_i16) { 960 if (Ty == IceType_i16) {
881 emitUint8(0x71); 961 emitUint8(0x71);
882 } else { 962 } else {
883 assert(Ty == IceType_i32); 963 assert(Ty == IceType_i32);
884 emitUint8(0x72); 964 emitUint8(0x72);
885 } 965 }
886 emitRegisterOperand(4, dst); 966 emitRegisterOperand(4, gprEncoding(dst));
887 emitUint8(imm.value() & 0xFF); 967 emitUint8(imm.value() & 0xFF);
888 } 968 }
889 969
890 template <class Machine> 970 template <class Machine>
891 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, 971 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst,
892 typename Traits::XmmRegister src) { 972 typename Traits::XmmRegister src) {
893 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 973 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
894 emitUint8(0x66); 974 emitUint8(0x66);
975 emitRexRB(IceType_Irrelevant, dst, src);
895 emitUint8(0x0F); 976 emitUint8(0x0F);
896 if (Ty == IceType_i16) { 977 if (Ty == IceType_i16) {
897 emitUint8(0xD1); 978 emitUint8(0xD1);
898 } else if (Ty == IceType_f64) { 979 } else if (Ty == IceType_f64) {
899 emitUint8(0xD3); 980 emitUint8(0xD3);
900 } else { 981 } else {
901 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 982 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
902 emitUint8(0xD2); 983 emitUint8(0xD2);
903 } 984 }
904 emitXmmRegisterOperand(dst, src); 985 emitXmmRegisterOperand(dst, src);
905 } 986 }
906 987
907 template <class Machine> 988 template <class Machine>
908 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, 989 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst,
909 const typename Traits::Address &src) { 990 const typename Traits::Address &src) {
910 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 991 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
911 emitUint8(0x66); 992 emitUint8(0x66);
993 emitRex(IceType_Irrelevant, src, dst);
912 emitUint8(0x0F); 994 emitUint8(0x0F);
913 if (Ty == IceType_i16) { 995 if (Ty == IceType_i16) {
914 emitUint8(0xD1); 996 emitUint8(0xD1);
915 } else if (Ty == IceType_f64) { 997 } else if (Ty == IceType_f64) {
916 emitUint8(0xD3); 998 emitUint8(0xD3);
917 } else { 999 } else {
918 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 1000 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
919 emitUint8(0xD2); 1001 emitUint8(0xD2);
920 } 1002 }
921 emitOperand(dst, src); 1003 emitOperand(gprEncoding(dst), src);
922 } 1004 }
923 1005
924 template <class Machine> 1006 template <class Machine>
925 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, 1007 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst,
926 const Immediate &imm) { 1008 const Immediate &imm) {
927 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1009 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
928 assert(imm.is_int8()); 1010 assert(imm.is_int8());
929 emitUint8(0x66); 1011 emitUint8(0x66);
1012 emitRexB(IceType_Irrelevant, dst);
930 emitUint8(0x0F); 1013 emitUint8(0x0F);
931 if (Ty == IceType_i16) { 1014 if (Ty == IceType_i16) {
932 emitUint8(0x71); 1015 emitUint8(0x71);
933 } else if (Ty == IceType_f64) { 1016 } else if (Ty == IceType_f64) {
934 emitUint8(0x73); 1017 emitUint8(0x73);
935 } else { 1018 } else {
936 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 1019 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
937 emitUint8(0x72); 1020 emitUint8(0x72);
938 } 1021 }
939 emitRegisterOperand(2, dst); 1022 emitRegisterOperand(2, gprEncoding(dst));
940 emitUint8(imm.value() & 0xFF); 1023 emitUint8(imm.value() & 0xFF);
941 } 1024 }
942 1025
943 // {add,sub,mul,div}ps are given a Ty parameter for consistency with 1026 // {add,sub,mul,div}ps are given a Ty parameter for consistency with
944 // {add,sub,mul,div}ss. In the future, when the PNaCl ABI allows 1027 // {add,sub,mul,div}ss. In the future, when the PNaCl ABI allows
945 // addpd, etc., we can use the Ty parameter to decide on adding 1028 // addpd, etc., we can use the Ty parameter to decide on adding
946 // a 0x66 prefix. 1029 // a 0x66 prefix.
947 template <class Machine> 1030 template <class Machine>
948 void AssemblerX86Base<Machine>::addps(Type /* Ty */, 1031 void AssemblerX86Base<Machine>::addps(Type /* Ty */,
949 typename Traits::XmmRegister dst, 1032 typename Traits::XmmRegister dst,
950 typename Traits::XmmRegister src) { 1033 typename Traits::XmmRegister src) {
951 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1034 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1035 emitRexRB(IceType_Irrelevant, dst, src);
952 emitUint8(0x0F); 1036 emitUint8(0x0F);
953 emitUint8(0x58); 1037 emitUint8(0x58);
954 emitXmmRegisterOperand(dst, src); 1038 emitXmmRegisterOperand(dst, src);
955 } 1039 }
956 1040
957 template <class Machine> 1041 template <class Machine>
958 void AssemblerX86Base<Machine>::addps(Type /* Ty */, 1042 void AssemblerX86Base<Machine>::addps(Type /* Ty */,
959 typename Traits::XmmRegister dst, 1043 typename Traits::XmmRegister dst,
960 const typename Traits::Address &src) { 1044 const typename Traits::Address &src) {
961 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1045 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1046 emitRex(IceType_Irrelevant, src, dst);
962 emitUint8(0x0F); 1047 emitUint8(0x0F);
963 emitUint8(0x58); 1048 emitUint8(0x58);
964 emitOperand(dst, src); 1049 emitOperand(gprEncoding(dst), src);
965 } 1050 }
966 1051
967 template <class Machine> 1052 template <class Machine>
968 void AssemblerX86Base<Machine>::subps(Type /* Ty */, 1053 void AssemblerX86Base<Machine>::subps(Type /* Ty */,
969 typename Traits::XmmRegister dst, 1054 typename Traits::XmmRegister dst,
970 typename Traits::XmmRegister src) { 1055 typename Traits::XmmRegister src) {
971 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1056 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1057 emitRexRB(IceType_Irrelevant, dst, src);
972 emitUint8(0x0F); 1058 emitUint8(0x0F);
973 emitUint8(0x5C); 1059 emitUint8(0x5C);
974 emitXmmRegisterOperand(dst, src); 1060 emitXmmRegisterOperand(dst, src);
975 } 1061 }
976 1062
977 template <class Machine> 1063 template <class Machine>
978 void AssemblerX86Base<Machine>::subps(Type /* Ty */, 1064 void AssemblerX86Base<Machine>::subps(Type /* Ty */,
979 typename Traits::XmmRegister dst, 1065 typename Traits::XmmRegister dst,
980 const typename Traits::Address &src) { 1066 const typename Traits::Address &src) {
981 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1067 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1068 emitRex(IceType_Irrelevant, src, dst);
982 emitUint8(0x0F); 1069 emitUint8(0x0F);
983 emitUint8(0x5C); 1070 emitUint8(0x5C);
984 emitOperand(dst, src); 1071 emitOperand(gprEncoding(dst), src);
985 } 1072 }
986 1073
987 template <class Machine> 1074 template <class Machine>
988 void AssemblerX86Base<Machine>::divps(Type /* Ty */, 1075 void AssemblerX86Base<Machine>::divps(Type /* Ty */,
989 typename Traits::XmmRegister dst, 1076 typename Traits::XmmRegister dst,
990 typename Traits::XmmRegister src) { 1077 typename Traits::XmmRegister src) {
991 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1078 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1079 emitRexRB(IceType_Irrelevant, dst, src);
992 emitUint8(0x0F); 1080 emitUint8(0x0F);
993 emitUint8(0x5E); 1081 emitUint8(0x5E);
994 emitXmmRegisterOperand(dst, src); 1082 emitXmmRegisterOperand(dst, src);
995 } 1083 }
996 1084
997 template <class Machine> 1085 template <class Machine>
998 void AssemblerX86Base<Machine>::divps(Type /* Ty */, 1086 void AssemblerX86Base<Machine>::divps(Type /* Ty */,
999 typename Traits::XmmRegister dst, 1087 typename Traits::XmmRegister dst,
1000 const typename Traits::Address &src) { 1088 const typename Traits::Address &src) {
1001 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1089 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1090 emitRex(IceType_Irrelevant, src, dst);
1002 emitUint8(0x0F); 1091 emitUint8(0x0F);
1003 emitUint8(0x5E); 1092 emitUint8(0x5E);
1004 emitOperand(dst, src); 1093 emitOperand(gprEncoding(dst), src);
1005 } 1094 }
1006 1095
1007 template <class Machine> 1096 template <class Machine>
1008 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, 1097 void AssemblerX86Base<Machine>::mulps(Type /* Ty */,
1009 typename Traits::XmmRegister dst, 1098 typename Traits::XmmRegister dst,
1010 typename Traits::XmmRegister src) { 1099 typename Traits::XmmRegister src) {
1011 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1100 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1101 emitRexRB(IceType_Irrelevant, dst, src);
1012 emitUint8(0x0F); 1102 emitUint8(0x0F);
1013 emitUint8(0x59); 1103 emitUint8(0x59);
1014 emitXmmRegisterOperand(dst, src); 1104 emitXmmRegisterOperand(dst, src);
1015 } 1105 }
1016 1106
1017 template <class Machine> 1107 template <class Machine>
1018 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, 1108 void AssemblerX86Base<Machine>::mulps(Type /* Ty */,
1019 typename Traits::XmmRegister dst, 1109 typename Traits::XmmRegister dst,
1020 const typename Traits::Address &src) { 1110 const typename Traits::Address &src) {
1021 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1111 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1112 emitRex(IceType_Irrelevant, src, dst);
1022 emitUint8(0x0F); 1113 emitUint8(0x0F);
1023 emitUint8(0x59); 1114 emitUint8(0x59);
1024 emitOperand(dst, src); 1115 emitOperand(gprEncoding(dst), src);
1025 } 1116 }
1026 1117
1027 template <class Machine> 1118 template <class Machine>
1028 void AssemblerX86Base<Machine>::minps(typename Traits::XmmRegister dst, 1119 void AssemblerX86Base<Machine>::minps(typename Traits::XmmRegister dst,
1029 typename Traits::XmmRegister src) { 1120 typename Traits::XmmRegister src) {
1030 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1121 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1122 emitRexRB(IceType_Irrelevant, dst, src);
1031 emitUint8(0x0F); 1123 emitUint8(0x0F);
1032 emitUint8(0x5D); 1124 emitUint8(0x5D);
1033 emitXmmRegisterOperand(dst, src); 1125 emitXmmRegisterOperand(dst, src);
1034 } 1126 }
1035 1127
1036 template <class Machine> 1128 template <class Machine>
1037 void AssemblerX86Base<Machine>::maxps(typename Traits::XmmRegister dst, 1129 void AssemblerX86Base<Machine>::maxps(typename Traits::XmmRegister dst,
1038 typename Traits::XmmRegister src) { 1130 typename Traits::XmmRegister src) {
1039 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1131 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1132 emitRexRB(IceType_Irrelevant, dst, src);
1040 emitUint8(0x0F); 1133 emitUint8(0x0F);
1041 emitUint8(0x5F); 1134 emitUint8(0x5F);
1042 emitXmmRegisterOperand(dst, src); 1135 emitXmmRegisterOperand(dst, src);
1043 } 1136 }
1044 1137
1045 template <class Machine> 1138 template <class Machine>
1046 void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst, 1139 void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst,
1047 typename Traits::XmmRegister src) { 1140 typename Traits::XmmRegister src) {
1048 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1141 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1142 emitRexRB(IceType_Irrelevant, dst, src);
1049 emitUint8(0x0F); 1143 emitUint8(0x0F);
1050 emitUint8(0x54); 1144 emitUint8(0x54);
1051 emitXmmRegisterOperand(dst, src); 1145 emitXmmRegisterOperand(dst, src);
1052 } 1146 }
1053 1147
1054 template <class Machine> 1148 template <class Machine>
1055 void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst, 1149 void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst,
1056 const typename Traits::Address &src) { 1150 const typename Traits::Address &src) {
1057 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1151 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1152 emitRex(IceType_Irrelevant, src, dst);
1058 emitUint8(0x0F); 1153 emitUint8(0x0F);
1059 emitUint8(0x54); 1154 emitUint8(0x54);
1060 emitOperand(dst, src); 1155 emitOperand(gprEncoding(dst), src);
1061 } 1156 }
1062 1157
1063 template <class Machine> 1158 template <class Machine>
1064 void AssemblerX86Base<Machine>::orps(typename Traits::XmmRegister dst, 1159 void AssemblerX86Base<Machine>::orps(typename Traits::XmmRegister dst,
1065 typename Traits::XmmRegister src) { 1160 typename Traits::XmmRegister src) {
1066 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1161 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1162 emitRexRB(IceType_Irrelevant, dst, src);
1067 emitUint8(0x0F); 1163 emitUint8(0x0F);
1068 emitUint8(0x56); 1164 emitUint8(0x56);
1069 emitXmmRegisterOperand(dst, src); 1165 emitXmmRegisterOperand(dst, src);
1070 } 1166 }
1071 1167
1072 template <class Machine> 1168 template <class Machine>
1073 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, 1169 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */,
1074 typename Traits::XmmRegister dst, 1170 typename Traits::XmmRegister dst,
1075 typename Traits::XmmRegister src) { 1171 typename Traits::XmmRegister src) {
1076 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1172 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1077 emitUint8(0x66); 1173 emitUint8(0x66);
1174 emitRexRB(IceType_Irrelevant, dst, src);
1078 emitUint8(0x0F); 1175 emitUint8(0x0F);
1079 emitUint8(0x38); 1176 emitUint8(0x38);
1080 emitUint8(0x14); 1177 emitUint8(0x14);
1081 emitXmmRegisterOperand(dst, src); 1178 emitXmmRegisterOperand(dst, src);
1082 } 1179 }
1083 1180
1084 template <class Machine> 1181 template <class Machine>
1085 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, 1182 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */,
1086 typename Traits::XmmRegister dst, 1183 typename Traits::XmmRegister dst,
1087 const typename Traits::Address &src) { 1184 const typename Traits::Address &src) {
1088 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1185 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1089 emitUint8(0x66); 1186 emitUint8(0x66);
1187 emitRex(IceType_Irrelevant, src, dst);
1090 emitUint8(0x0F); 1188 emitUint8(0x0F);
1091 emitUint8(0x38); 1189 emitUint8(0x38);
1092 emitUint8(0x14); 1190 emitUint8(0x14);
1093 emitOperand(dst, src); 1191 emitOperand(gprEncoding(dst), src);
1094 } 1192 }
1095 1193
1096 template <class Machine> 1194 template <class Machine>
1097 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, 1195 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */,
1098 typename Traits::XmmRegister dst, 1196 typename Traits::XmmRegister dst,
1099 typename Traits::XmmRegister src) { 1197 typename Traits::XmmRegister src) {
1100 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1198 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1101 emitUint8(0x66); 1199 emitUint8(0x66);
1200 emitRexRB(IceType_Irrelevant, dst, src);
1102 emitUint8(0x0F); 1201 emitUint8(0x0F);
1103 emitUint8(0x38); 1202 emitUint8(0x38);
1104 emitUint8(0x10); 1203 emitUint8(0x10);
1105 emitXmmRegisterOperand(dst, src); 1204 emitXmmRegisterOperand(dst, src);
1106 } 1205 }
1107 1206
1108 template <class Machine> 1207 template <class Machine>
1109 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, 1208 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */,
1110 typename Traits::XmmRegister dst, 1209 typename Traits::XmmRegister dst,
1111 const typename Traits::Address &src) { 1210 const typename Traits::Address &src) {
1112 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1211 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1113 emitUint8(0x66); 1212 emitUint8(0x66);
1213 emitRex(IceType_Irrelevant, src, dst);
1114 emitUint8(0x0F); 1214 emitUint8(0x0F);
1115 emitUint8(0x38); 1215 emitUint8(0x38);
1116 emitUint8(0x10); 1216 emitUint8(0x10);
1117 emitOperand(dst, src); 1217 emitOperand(gprEncoding(dst), src);
1118 } 1218 }
1119 1219
1120 template <class Machine> 1220 template <class Machine>
1121 void AssemblerX86Base<Machine>::cmpps( 1221 void AssemblerX86Base<Machine>::cmpps(
1122 typename Traits::XmmRegister dst, typename Traits::XmmRegister src, 1222 typename Traits::XmmRegister dst, typename Traits::XmmRegister src,
1123 typename Traits::Cond::CmppsCond CmpCondition) { 1223 typename Traits::Cond::CmppsCond CmpCondition) {
1124 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1224 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1225 emitRexRB(IceType_Irrelevant, dst, src);
1125 emitUint8(0x0F); 1226 emitUint8(0x0F);
1126 emitUint8(0xC2); 1227 emitUint8(0xC2);
1127 emitXmmRegisterOperand(dst, src); 1228 emitXmmRegisterOperand(dst, src);
1128 emitUint8(CmpCondition); 1229 emitUint8(CmpCondition);
1129 } 1230 }
1130 1231
1131 template <class Machine> 1232 template <class Machine>
1132 void AssemblerX86Base<Machine>::cmpps( 1233 void AssemblerX86Base<Machine>::cmpps(
1133 typename Traits::XmmRegister dst, const typename Traits::Address &src, 1234 typename Traits::XmmRegister dst, const typename Traits::Address &src,
1134 typename Traits::Cond::CmppsCond CmpCondition) { 1235 typename Traits::Cond::CmppsCond CmpCondition) {
1135 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1236 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1237 emitRex(IceType_Irrelevant, src, dst);
1136 emitUint8(0x0F); 1238 emitUint8(0x0F);
1137 emitUint8(0xC2); 1239 emitUint8(0xC2);
1138 emitOperand(dst, src); 1240 emitOperand(gprEncoding(dst), src);
1139 emitUint8(CmpCondition); 1241 emitUint8(CmpCondition);
1140 } 1242 }
1141 1243
1142 template <class Machine> 1244 template <class Machine>
1143 void AssemblerX86Base<Machine>::sqrtps(typename Traits::XmmRegister dst) { 1245 void AssemblerX86Base<Machine>::sqrtps(typename Traits::XmmRegister dst) {
1144 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1246 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1247 emitRexRB(IceType_Irrelevant, dst, dst);
1145 emitUint8(0x0F); 1248 emitUint8(0x0F);
1146 emitUint8(0x51); 1249 emitUint8(0x51);
1147 emitXmmRegisterOperand(dst, dst); 1250 emitXmmRegisterOperand(dst, dst);
1148 } 1251 }
1149 1252
1150 template <class Machine> 1253 template <class Machine>
1151 void AssemblerX86Base<Machine>::rsqrtps(typename Traits::XmmRegister dst) { 1254 void AssemblerX86Base<Machine>::rsqrtps(typename Traits::XmmRegister dst) {
1152 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1255 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1256 emitRexRB(IceType_Irrelevant, dst, dst);
1153 emitUint8(0x0F); 1257 emitUint8(0x0F);
1154 emitUint8(0x52); 1258 emitUint8(0x52);
1155 emitXmmRegisterOperand(dst, dst); 1259 emitXmmRegisterOperand(dst, dst);
1156 } 1260 }
1157 1261
1158 template <class Machine> 1262 template <class Machine>
1159 void AssemblerX86Base<Machine>::reciprocalps(typename Traits::XmmRegister dst) { 1263 void AssemblerX86Base<Machine>::reciprocalps(typename Traits::XmmRegister dst) {
1160 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1264 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1265 emitRexRB(IceType_Irrelevant, dst, dst);
1161 emitUint8(0x0F); 1266 emitUint8(0x0F);
1162 emitUint8(0x53); 1267 emitUint8(0x53);
1163 emitXmmRegisterOperand(dst, dst); 1268 emitXmmRegisterOperand(dst, dst);
1164 } 1269 }
1165 1270
1166 template <class Machine> 1271 template <class Machine>
1167 void AssemblerX86Base<Machine>::movhlps(typename Traits::XmmRegister dst, 1272 void AssemblerX86Base<Machine>::movhlps(typename Traits::XmmRegister dst,
1168 typename Traits::XmmRegister src) { 1273 typename Traits::XmmRegister src) {
1169 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1274 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1275 emitRexRB(IceType_Irrelevant, dst, src);
1170 emitUint8(0x0F); 1276 emitUint8(0x0F);
1171 emitUint8(0x12); 1277 emitUint8(0x12);
1172 emitXmmRegisterOperand(dst, src); 1278 emitXmmRegisterOperand(dst, src);
1173 } 1279 }
1174 1280
1175 template <class Machine> 1281 template <class Machine>
1176 void AssemblerX86Base<Machine>::movlhps(typename Traits::XmmRegister dst, 1282 void AssemblerX86Base<Machine>::movlhps(typename Traits::XmmRegister dst,
1177 typename Traits::XmmRegister src) { 1283 typename Traits::XmmRegister src) {
1178 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1284 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1285 emitRexRB(IceType_Irrelevant, dst, src);
1179 emitUint8(0x0F); 1286 emitUint8(0x0F);
1180 emitUint8(0x16); 1287 emitUint8(0x16);
1181 emitXmmRegisterOperand(dst, src); 1288 emitXmmRegisterOperand(dst, src);
1182 } 1289 }
1183 1290
1184 template <class Machine> 1291 template <class Machine>
1185 void AssemblerX86Base<Machine>::unpcklps(typename Traits::XmmRegister dst, 1292 void AssemblerX86Base<Machine>::unpcklps(typename Traits::XmmRegister dst,
1186 typename Traits::XmmRegister src) { 1293 typename Traits::XmmRegister src) {
1187 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1294 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1295 emitRexRB(IceType_Irrelevant, dst, src);
1188 emitUint8(0x0F); 1296 emitUint8(0x0F);
1189 emitUint8(0x14); 1297 emitUint8(0x14);
1190 emitXmmRegisterOperand(dst, src); 1298 emitXmmRegisterOperand(dst, src);
1191 } 1299 }
1192 1300
1193 template <class Machine> 1301 template <class Machine>
1194 void AssemblerX86Base<Machine>::unpckhps(typename Traits::XmmRegister dst, 1302 void AssemblerX86Base<Machine>::unpckhps(typename Traits::XmmRegister dst,
1195 typename Traits::XmmRegister src) { 1303 typename Traits::XmmRegister src) {
1196 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1304 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1305 emitRexRB(IceType_Irrelevant, dst, src);
1197 emitUint8(0x0F); 1306 emitUint8(0x0F);
1198 emitUint8(0x15); 1307 emitUint8(0x15);
1199 emitXmmRegisterOperand(dst, src); 1308 emitXmmRegisterOperand(dst, src);
1200 } 1309 }
1201 1310
1202 template <class Machine> 1311 template <class Machine>
1203 void AssemblerX86Base<Machine>::unpcklpd(typename Traits::XmmRegister dst, 1312 void AssemblerX86Base<Machine>::unpcklpd(typename Traits::XmmRegister dst,
1204 typename Traits::XmmRegister src) { 1313 typename Traits::XmmRegister src) {
1205 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1314 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1206 emitUint8(0x66); 1315 emitUint8(0x66);
1316 emitRexRB(IceType_Irrelevant, dst, src);
1207 emitUint8(0x0F); 1317 emitUint8(0x0F);
1208 emitUint8(0x14); 1318 emitUint8(0x14);
1209 emitXmmRegisterOperand(dst, src); 1319 emitXmmRegisterOperand(dst, src);
1210 } 1320 }
1211 1321
1212 template <class Machine> 1322 template <class Machine>
1213 void AssemblerX86Base<Machine>::unpckhpd(typename Traits::XmmRegister dst, 1323 void AssemblerX86Base<Machine>::unpckhpd(typename Traits::XmmRegister dst,
1214 typename Traits::XmmRegister src) { 1324 typename Traits::XmmRegister src) {
1215 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1325 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1216 emitUint8(0x66); 1326 emitUint8(0x66);
1327 emitRexRB(IceType_Irrelevant, dst, src);
1217 emitUint8(0x0F); 1328 emitUint8(0x0F);
1218 emitUint8(0x15); 1329 emitUint8(0x15);
1219 emitXmmRegisterOperand(dst, src); 1330 emitXmmRegisterOperand(dst, src);
1220 } 1331 }
1221 1332
1222 template <class Machine> 1333 template <class Machine>
1223 void AssemblerX86Base<Machine>::set1ps(typename Traits::XmmRegister dst, 1334 void AssemblerX86Base<Machine>::set1ps(typename Traits::XmmRegister dst,
1224 typename Traits::GPRRegister tmp1, 1335 typename Traits::GPRRegister tmp1,
1225 const Immediate &imm) { 1336 const Immediate &imm) {
1226 // Load 32-bit immediate value into tmp1. 1337 // Load 32-bit immediate value into tmp1.
1227 mov(IceType_i32, tmp1, imm); 1338 mov(IceType_i32, tmp1, imm);
1228 // Move value from tmp1 into dst. 1339 // Move value from tmp1 into dst.
1229 movd(dst, tmp1); 1340 movd(dst, tmp1);
1230 // Broadcast low lane into other three lanes. 1341 // Broadcast low lane into other three lanes.
1231 shufps(dst, dst, Immediate(0x0)); 1342 shufps(IceType_Irrelevant, dst, dst, Immediate(0x0));
1232 } 1343 }
1233 1344
1234 template <class Machine> 1345 template <class Machine>
1235 void AssemblerX86Base<Machine>::shufps(typename Traits::XmmRegister dst,
1236 typename Traits::XmmRegister src,
1237 const Immediate &imm) {
1238 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1239 emitUint8(0x0F);
1240 emitUint8(0xC6);
1241 emitXmmRegisterOperand(dst, src);
1242 assert(imm.is_uint8());
1243 emitUint8(imm.value());
1244 }
1245
1246 template <class Machine>
1247 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, 1346 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */,
1248 typename Traits::XmmRegister dst, 1347 typename Traits::XmmRegister dst,
1249 typename Traits::XmmRegister src, 1348 typename Traits::XmmRegister src,
1250 const Immediate &imm) { 1349 const Immediate &imm) {
1251 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1350 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1252 emitUint8(0x66); 1351 emitUint8(0x66);
1352 emitRexRB(IceType_Irrelevant, dst, src);
1253 emitUint8(0x0F); 1353 emitUint8(0x0F);
1254 emitUint8(0x70); 1354 emitUint8(0x70);
1255 emitXmmRegisterOperand(dst, src); 1355 emitXmmRegisterOperand(dst, src);
1256 assert(imm.is_uint8()); 1356 assert(imm.is_uint8());
1257 emitUint8(imm.value()); 1357 emitUint8(imm.value());
1258 } 1358 }
1259 1359
1260 template <class Machine> 1360 template <class Machine>
1261 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, 1361 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */,
1262 typename Traits::XmmRegister dst, 1362 typename Traits::XmmRegister dst,
1263 const typename Traits::Address &src, 1363 const typename Traits::Address &src,
1264 const Immediate &imm) { 1364 const Immediate &imm) {
1265 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1365 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1266 emitUint8(0x66); 1366 emitUint8(0x66);
1367 emitRex(IceType_Irrelevant, src, dst);
1267 emitUint8(0x0F); 1368 emitUint8(0x0F);
1268 emitUint8(0x70); 1369 emitUint8(0x70);
1269 emitOperand(dst, src); 1370 emitOperand(gprEncoding(dst), src);
1270 assert(imm.is_uint8()); 1371 assert(imm.is_uint8());
1271 emitUint8(imm.value()); 1372 emitUint8(imm.value());
1272 } 1373 }
1273 1374
1274 template <class Machine> 1375 template <class Machine>
1275 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, 1376 void AssemblerX86Base<Machine>::shufps(Type /* Ty */,
1276 typename Traits::XmmRegister dst, 1377 typename Traits::XmmRegister dst,
1277 typename Traits::XmmRegister src, 1378 typename Traits::XmmRegister src,
1278 const Immediate &imm) { 1379 const Immediate &imm) {
1279 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1380 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1381 emitRexRB(IceType_Irrelevant, dst, src);
1280 emitUint8(0x0F); 1382 emitUint8(0x0F);
1281 emitUint8(0xC6); 1383 emitUint8(0xC6);
1282 emitXmmRegisterOperand(dst, src); 1384 emitXmmRegisterOperand(dst, src);
1283 assert(imm.is_uint8()); 1385 assert(imm.is_uint8());
1284 emitUint8(imm.value()); 1386 emitUint8(imm.value());
1285 } 1387 }
1286 1388
1287 template <class Machine> 1389 template <class Machine>
1288 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, 1390 void AssemblerX86Base<Machine>::shufps(Type /* Ty */,
1289 typename Traits::XmmRegister dst, 1391 typename Traits::XmmRegister dst,
1290 const typename Traits::Address &src, 1392 const typename Traits::Address &src,
1291 const Immediate &imm) { 1393 const Immediate &imm) {
1292 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1394 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1395 emitRex(IceType_Irrelevant, src, dst);
1293 emitUint8(0x0F); 1396 emitUint8(0x0F);
1294 emitUint8(0xC6); 1397 emitUint8(0xC6);
1295 emitOperand(dst, src); 1398 emitOperand(gprEncoding(dst), src);
1296 assert(imm.is_uint8()); 1399 assert(imm.is_uint8());
1297 emitUint8(imm.value()); 1400 emitUint8(imm.value());
1298 } 1401 }
1299 1402
1300 template <class Machine> 1403 template <class Machine>
1301 void AssemblerX86Base<Machine>::minpd(typename Traits::XmmRegister dst, 1404 void AssemblerX86Base<Machine>::minpd(typename Traits::XmmRegister dst,
1302 typename Traits::XmmRegister src) { 1405 typename Traits::XmmRegister src) {
1303 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1406 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1304 emitUint8(0x66); 1407 emitUint8(0x66);
1408 emitRexRB(IceType_Irrelevant, dst, src);
1305 emitUint8(0x0F); 1409 emitUint8(0x0F);
1306 emitUint8(0x5D); 1410 emitUint8(0x5D);
1307 emitXmmRegisterOperand(dst, src); 1411 emitXmmRegisterOperand(dst, src);
1308 } 1412 }
1309 1413
1310 template <class Machine> 1414 template <class Machine>
1311 void AssemblerX86Base<Machine>::maxpd(typename Traits::XmmRegister dst, 1415 void AssemblerX86Base<Machine>::maxpd(typename Traits::XmmRegister dst,
1312 typename Traits::XmmRegister src) { 1416 typename Traits::XmmRegister src) {
1313 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1417 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1314 emitUint8(0x66); 1418 emitUint8(0x66);
1419 emitRexRB(IceType_Irrelevant, dst, src);
1315 emitUint8(0x0F); 1420 emitUint8(0x0F);
1316 emitUint8(0x5F); 1421 emitUint8(0x5F);
1317 emitXmmRegisterOperand(dst, src); 1422 emitXmmRegisterOperand(dst, src);
1318 } 1423 }
1319 1424
1320 template <class Machine> 1425 template <class Machine>
1321 void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) { 1426 void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) {
1322 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1427 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1323 emitUint8(0x66); 1428 emitUint8(0x66);
1429 emitRexRB(IceType_Irrelevant, dst, dst);
1324 emitUint8(0x0F); 1430 emitUint8(0x0F);
1325 emitUint8(0x51); 1431 emitUint8(0x51);
1326 emitXmmRegisterOperand(dst, dst); 1432 emitXmmRegisterOperand(dst, dst);
1327 } 1433 }
1328 1434
1329 template <class Machine> 1435 template <class Machine>
1330 void AssemblerX86Base<Machine>::shufpd(typename Traits::XmmRegister dst,
1331 typename Traits::XmmRegister src,
1332 const Immediate &imm) {
1333 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1334 emitUint8(0x66);
1335 emitUint8(0x0F);
1336 emitUint8(0xC6);
1337 emitXmmRegisterOperand(dst, src);
1338 assert(imm.is_uint8());
1339 emitUint8(imm.value());
1340 }
1341
1342 template <class Machine>
1343 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */, 1436 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */,
1344 typename Traits::XmmRegister dst, 1437 typename Traits::XmmRegister dst,
1345 typename Traits::XmmRegister src) { 1438 typename Traits::XmmRegister src) {
1346 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1439 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1440 emitRexRB(IceType_Irrelevant, dst, src);
1347 emitUint8(0x0F); 1441 emitUint8(0x0F);
1348 emitUint8(0x5B); 1442 emitUint8(0x5B);
1349 emitXmmRegisterOperand(dst, src); 1443 emitXmmRegisterOperand(dst, src);
1350 } 1444 }
1351 1445
1352 template <class Machine> 1446 template <class Machine>
1353 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */, 1447 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */,
1354 typename Traits::XmmRegister dst, 1448 typename Traits::XmmRegister dst,
1355 const typename Traits::Address &src) { 1449 const typename Traits::Address &src) {
1356 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1450 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1451 emitRex(IceType_Irrelevant, src, dst);
1357 emitUint8(0x0F); 1452 emitUint8(0x0F);
1358 emitUint8(0x5B); 1453 emitUint8(0x5B);
1359 emitOperand(dst, src); 1454 emitOperand(gprEncoding(dst), src);
1360 } 1455 }
1361 1456
1362 template <class Machine> 1457 template <class Machine>
1363 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, 1458 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */,
1364 typename Traits::XmmRegister dst, 1459 typename Traits::XmmRegister dst,
1365 typename Traits::XmmRegister src) { 1460 typename Traits::XmmRegister src) {
1366 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1461 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1367 emitUint8(0xF3); 1462 emitUint8(0xF3);
1463 emitRexRB(IceType_Irrelevant, dst, src);
1368 emitUint8(0x0F); 1464 emitUint8(0x0F);
1369 emitUint8(0x5B); 1465 emitUint8(0x5B);
1370 emitXmmRegisterOperand(dst, src); 1466 emitXmmRegisterOperand(dst, src);
1371 } 1467 }
1372 1468
1373 template <class Machine> 1469 template <class Machine>
1374 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, 1470 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */,
1375 typename Traits::XmmRegister dst, 1471 typename Traits::XmmRegister dst,
1376 const typename Traits::Address &src) { 1472 const typename Traits::Address &src) {
1377 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1473 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1378 emitUint8(0xF3); 1474 emitUint8(0xF3);
1475 emitRex(IceType_Irrelevant, src, dst);
1379 emitUint8(0x0F); 1476 emitUint8(0x0F);
1380 emitUint8(0x5B); 1477 emitUint8(0x5B);
1381 emitOperand(dst, src); 1478 emitOperand(gprEncoding(dst), src);
1382 } 1479 }
1383 1480
1384 template <class Machine> 1481 template <class Machine>
1385 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, 1482 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
1386 typename Traits::XmmRegister dst, 1483 typename Traits::XmmRegister dst,
1387 typename Traits::GPRRegister src) { 1484 typename Traits::GPRRegister src) {
1388 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1485 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1389 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1486 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1487 emitRexRB(IceType_Irrelevant, dst, src);
1390 emitUint8(0x0F); 1488 emitUint8(0x0F);
1391 emitUint8(0x2A); 1489 emitUint8(0x2A);
1392 emitRegisterOperand(dst, src); 1490 emitXmmRegisterOperand(dst, src);
1393 } 1491 }
1394 1492
1395 template <class Machine> 1493 template <class Machine>
1396 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, 1494 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
1397 typename Traits::XmmRegister dst, 1495 typename Traits::XmmRegister dst,
1398 const typename Traits::Address &src) { 1496 const typename Traits::Address &src) {
1399 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1497 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1400 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1498 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1499 emitRex(IceType_Irrelevant, src, dst);
1401 emitUint8(0x0F); 1500 emitUint8(0x0F);
1402 emitUint8(0x2A); 1501 emitUint8(0x2A);
1403 emitOperand(dst, src); 1502 emitOperand(gprEncoding(dst), src);
1404 } 1503 }
1405 1504
1406 template <class Machine> 1505 template <class Machine>
1407 void AssemblerX86Base<Machine>::cvtfloat2float( 1506 void AssemblerX86Base<Machine>::cvtfloat2float(
1408 Type SrcTy, typename Traits::XmmRegister dst, 1507 Type SrcTy, typename Traits::XmmRegister dst,
1409 typename Traits::XmmRegister src) { 1508 typename Traits::XmmRegister src) {
1410 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1509 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1411 // ss2sd or sd2ss 1510 // ss2sd or sd2ss
1412 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1511 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1512 emitRexRB(IceType_Irrelevant, dst, src);
1413 emitUint8(0x0F); 1513 emitUint8(0x0F);
1414 emitUint8(0x5A); 1514 emitUint8(0x5A);
1415 emitXmmRegisterOperand(dst, src); 1515 emitXmmRegisterOperand(dst, src);
1416 } 1516 }
1417 1517
1418 template <class Machine> 1518 template <class Machine>
1419 void AssemblerX86Base<Machine>::cvtfloat2float( 1519 void AssemblerX86Base<Machine>::cvtfloat2float(
1420 Type SrcTy, typename Traits::XmmRegister dst, 1520 Type SrcTy, typename Traits::XmmRegister dst,
1421 const typename Traits::Address &src) { 1521 const typename Traits::Address &src) {
1422 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1522 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1423 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1523 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1524 emitRex(IceType_Irrelevant, src, dst);
1424 emitUint8(0x0F); 1525 emitUint8(0x0F);
1425 emitUint8(0x5A); 1526 emitUint8(0x5A);
1426 emitOperand(dst, src); 1527 emitOperand(gprEncoding(dst), src);
1427 } 1528 }
1428 1529
1429 template <class Machine> 1530 template <class Machine>
1430 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy, 1531 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy,
1431 typename Traits::GPRRegister dst, 1532 typename Traits::GPRRegister dst,
1432 typename Traits::XmmRegister src) { 1533 typename Traits::XmmRegister src) {
1433 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1534 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1434 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1535 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1536 emitRexRB(IceType_Irrelevant, dst, src);
1435 emitUint8(0x0F); 1537 emitUint8(0x0F);
1436 emitUint8(0x2C); 1538 emitUint8(0x2C);
1437 emitXmmRegisterOperand(dst, src); 1539 emitXmmRegisterOperand(dst, src);
1438 } 1540 }
1439 1541
1440 template <class Machine> 1542 template <class Machine>
1441 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy, 1543 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy,
1442 typename Traits::GPRRegister dst, 1544 typename Traits::GPRRegister dst,
1443 const typename Traits::Address &src) { 1545 const typename Traits::Address &src) {
1444 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1546 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1445 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1547 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1548 emitRex(IceType_Irrelevant, src, dst);
1446 emitUint8(0x0F); 1549 emitUint8(0x0F);
1447 emitUint8(0x2C); 1550 emitUint8(0x2C);
1448 emitOperand(dst, src); 1551 emitOperand(gprEncoding(dst), src);
1449 } 1552 }
1450 1553
1451 template <class Machine> 1554 template <class Machine>
1452 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, 1555 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a,
1453 typename Traits::XmmRegister b) { 1556 typename Traits::XmmRegister b) {
1454 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1557 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1455 if (Ty == IceType_f64) 1558 if (Ty == IceType_f64)
1456 emitUint8(0x66); 1559 emitUint8(0x66);
1560 emitRexRB(IceType_Irrelevant, a, b);
1457 emitUint8(0x0F); 1561 emitUint8(0x0F);
1458 emitUint8(0x2E); 1562 emitUint8(0x2E);
1459 emitXmmRegisterOperand(a, b); 1563 emitXmmRegisterOperand(a, b);
1460 } 1564 }
1461 1565
1462 template <class Machine> 1566 template <class Machine>
1463 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, 1567 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a,
1464 const typename Traits::Address &b) { 1568 const typename Traits::Address &b) {
1465 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1569 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1466 if (Ty == IceType_f64) 1570 if (Ty == IceType_f64)
1467 emitUint8(0x66); 1571 emitUint8(0x66);
1572 emitRex(IceType_Irrelevant, b, a);
1468 emitUint8(0x0F); 1573 emitUint8(0x0F);
1469 emitUint8(0x2E); 1574 emitUint8(0x2E);
1470 emitOperand(a, b); 1575 emitOperand(gprEncoding(a), b);
1471 } 1576 }
1472 1577
1473 template <class Machine> 1578 template <class Machine>
1474 void AssemblerX86Base<Machine>::movmskpd(typename Traits::GPRRegister dst, 1579 void AssemblerX86Base<Machine>::movmskpd(typename Traits::GPRRegister dst,
1475 typename Traits::XmmRegister src) { 1580 typename Traits::XmmRegister src) {
1476 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1581 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1477 emitUint8(0x66); 1582 emitUint8(0x66);
1583 emitRexRB(IceType_Irrelevant, dst, src);
1478 emitUint8(0x0F); 1584 emitUint8(0x0F);
1479 emitUint8(0x50); 1585 emitUint8(0x50);
1480 emitXmmRegisterOperand(dst, src); 1586 emitXmmRegisterOperand(dst, src);
1481 } 1587 }
1482 1588
1483 template <class Machine> 1589 template <class Machine>
1484 void AssemblerX86Base<Machine>::movmskps(typename Traits::GPRRegister dst, 1590 void AssemblerX86Base<Machine>::movmskps(typename Traits::GPRRegister dst,
1485 typename Traits::XmmRegister src) { 1591 typename Traits::XmmRegister src) {
1486 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1592 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1593 emitRexRB(IceType_Irrelevant, dst, src);
1487 emitUint8(0x0F); 1594 emitUint8(0x0F);
1488 emitUint8(0x50); 1595 emitUint8(0x50);
1489 emitXmmRegisterOperand(dst, src); 1596 emitXmmRegisterOperand(dst, src);
1490 } 1597 }
1491 1598
1492 template <class Machine> 1599 template <class Machine>
1493 void AssemblerX86Base<Machine>::sqrtss(Type Ty, 1600 void AssemblerX86Base<Machine>::sqrtss(Type Ty,
1494 typename Traits::XmmRegister dst, 1601 typename Traits::XmmRegister dst,
1495 const typename Traits::Address &src) { 1602 const typename Traits::Address &src) {
1496 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1603 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1497 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1604 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1605 emitRex(IceType_Irrelevant, src, dst);
1498 emitUint8(0x0F); 1606 emitUint8(0x0F);
1499 emitUint8(0x51); 1607 emitUint8(0x51);
1500 emitOperand(dst, src); 1608 emitOperand(gprEncoding(dst), src);
1501 } 1609 }
1502 1610
1503 template <class Machine> 1611 template <class Machine>
1504 void AssemblerX86Base<Machine>::sqrtss(Type Ty, 1612 void AssemblerX86Base<Machine>::sqrtss(Type Ty,
1505 typename Traits::XmmRegister dst, 1613 typename Traits::XmmRegister dst,
1506 typename Traits::XmmRegister src) { 1614 typename Traits::XmmRegister src) {
1507 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1615 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1508 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1616 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1617 emitRexRB(IceType_Irrelevant, dst, src);
1509 emitUint8(0x0F); 1618 emitUint8(0x0F);
1510 emitUint8(0x51); 1619 emitUint8(0x51);
1511 emitXmmRegisterOperand(dst, src); 1620 emitXmmRegisterOperand(dst, src);
1512 } 1621 }
1513 1622
1514 template <class Machine> 1623 template <class Machine>
1515 void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst, 1624 void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst,
1516 const typename Traits::Address &src) { 1625 const typename Traits::Address &src) {
1517 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1626 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1518 emitUint8(0x66); 1627 emitUint8(0x66);
1628 emitRex(IceType_Irrelevant, src, dst);
1519 emitUint8(0x0F); 1629 emitUint8(0x0F);
1520 emitUint8(0x57); 1630 emitUint8(0x57);
1521 emitOperand(dst, src); 1631 emitOperand(gprEncoding(dst), src);
1522 } 1632 }
1523 1633
1524 template <class Machine> 1634 template <class Machine>
1525 void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst, 1635 void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst,
1526 typename Traits::XmmRegister src) { 1636 typename Traits::XmmRegister src) {
1527 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1637 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1528 emitUint8(0x66); 1638 emitUint8(0x66);
1639 emitRexRB(IceType_Irrelevant, dst, src);
1529 emitUint8(0x0F); 1640 emitUint8(0x0F);
1530 emitUint8(0x57); 1641 emitUint8(0x57);
1531 emitXmmRegisterOperand(dst, src); 1642 emitXmmRegisterOperand(dst, src);
1532 } 1643 }
1533 1644
1534 template <class Machine> 1645 template <class Machine>
1535 void AssemblerX86Base<Machine>::orpd(typename Traits::XmmRegister dst, 1646 void AssemblerX86Base<Machine>::orpd(typename Traits::XmmRegister dst,
1536 typename Traits::XmmRegister src) { 1647 typename Traits::XmmRegister src) {
1537 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1648 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1538 emitUint8(0x66); 1649 emitUint8(0x66);
1650 emitRexRB(IceType_Irrelevant, dst, src);
1539 emitUint8(0x0F); 1651 emitUint8(0x0F);
1540 emitUint8(0x56); 1652 emitUint8(0x56);
1541 emitXmmRegisterOperand(dst, src); 1653 emitXmmRegisterOperand(dst, src);
1542 } 1654 }
1543 1655
1544 template <class Machine> 1656 template <class Machine>
1545 void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst, 1657 void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst,
1546 const typename Traits::Address &src) { 1658 const typename Traits::Address &src) {
1547 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1659 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1660 emitRex(IceType_Irrelevant, src, dst);
1548 emitUint8(0x0F); 1661 emitUint8(0x0F);
1549 emitUint8(0x57); 1662 emitUint8(0x57);
1550 emitOperand(dst, src); 1663 emitOperand(gprEncoding(dst), src);
1551 } 1664 }
1552 1665
1553 template <class Machine> 1666 template <class Machine>
1554 void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst, 1667 void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst,
1555 typename Traits::XmmRegister src) { 1668 typename Traits::XmmRegister src) {
1556 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1669 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1670 emitRexRB(IceType_Irrelevant, dst, src);
1557 emitUint8(0x0F); 1671 emitUint8(0x0F);
1558 emitUint8(0x57); 1672 emitUint8(0x57);
1559 emitXmmRegisterOperand(dst, src); 1673 emitXmmRegisterOperand(dst, src);
1560 } 1674 }
1561 1675
1562 template <class Machine> 1676 template <class Machine>
1563 void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst, 1677 void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst,
1564 const typename Traits::Address &src) { 1678 const typename Traits::Address &src) {
1565 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1679 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1566 emitUint8(0x66); 1680 emitUint8(0x66);
1681 emitRex(IceType_Irrelevant, src, dst);
1567 emitUint8(0x0F); 1682 emitUint8(0x0F);
1568 emitUint8(0x54); 1683 emitUint8(0x54);
1569 emitOperand(dst, src); 1684 emitOperand(gprEncoding(dst), src);
1570 } 1685 }
1571 1686
1572 template <class Machine> 1687 template <class Machine>
1573 void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst, 1688 void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst,
1574 typename Traits::XmmRegister src) { 1689 typename Traits::XmmRegister src) {
1575 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1690 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1576 emitUint8(0x66); 1691 emitUint8(0x66);
1692 emitRexRB(IceType_Irrelevant, dst, src);
1577 emitUint8(0x0F); 1693 emitUint8(0x0F);
1578 emitUint8(0x54); 1694 emitUint8(0x54);
1579 emitXmmRegisterOperand(dst, src); 1695 emitXmmRegisterOperand(dst, src);
1580 } 1696 }
1581 1697
1582 template <class Machine> 1698 template <class Machine>
1583 void AssemblerX86Base<Machine>::insertps(Type Ty, 1699 void AssemblerX86Base<Machine>::insertps(Type Ty,
1584 typename Traits::XmmRegister dst, 1700 typename Traits::XmmRegister dst,
1585 typename Traits::XmmRegister src, 1701 typename Traits::XmmRegister src,
1586 const Immediate &imm) { 1702 const Immediate &imm) {
1587 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1703 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1588 assert(imm.is_uint8()); 1704 assert(imm.is_uint8());
1589 assert(isVectorFloatingType(Ty)); 1705 assert(isVectorFloatingType(Ty));
1590 (void)Ty; 1706 (void)Ty;
1591 emitUint8(0x66); 1707 emitUint8(0x66);
1708 emitRexRB(IceType_Irrelevant, dst, src);
1592 emitUint8(0x0F); 1709 emitUint8(0x0F);
1593 emitUint8(0x3A); 1710 emitUint8(0x3A);
1594 emitUint8(0x21); 1711 emitUint8(0x21);
1595 emitXmmRegisterOperand(dst, src); 1712 emitXmmRegisterOperand(dst, src);
1596 emitUint8(imm.value()); 1713 emitUint8(imm.value());
1597 } 1714 }
1598 1715
1599 template <class Machine> 1716 template <class Machine>
1600 void AssemblerX86Base<Machine>::insertps(Type Ty, 1717 void AssemblerX86Base<Machine>::insertps(Type Ty,
1601 typename Traits::XmmRegister dst, 1718 typename Traits::XmmRegister dst,
1602 const typename Traits::Address &src, 1719 const typename Traits::Address &src,
1603 const Immediate &imm) { 1720 const Immediate &imm) {
1604 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1721 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1605 assert(imm.is_uint8()); 1722 assert(imm.is_uint8());
1606 assert(isVectorFloatingType(Ty)); 1723 assert(isVectorFloatingType(Ty));
1607 (void)Ty; 1724 (void)Ty;
1608 emitUint8(0x66); 1725 emitUint8(0x66);
1726 emitRex(IceType_Irrelevant, src, dst);
1609 emitUint8(0x0F); 1727 emitUint8(0x0F);
1610 emitUint8(0x3A); 1728 emitUint8(0x3A);
1611 emitUint8(0x21); 1729 emitUint8(0x21);
1612 emitOperand(dst, src); 1730 emitOperand(gprEncoding(dst), src);
1613 emitUint8(imm.value()); 1731 emitUint8(imm.value());
1614 } 1732 }
1615 1733
1616 template <class Machine> 1734 template <class Machine>
1617 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, 1735 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst,
1618 typename Traits::GPRRegister src, 1736 typename Traits::GPRRegister src,
1619 const Immediate &imm) { 1737 const Immediate &imm) {
1620 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1738 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1621 assert(imm.is_uint8()); 1739 assert(imm.is_uint8());
1740 emitUint8(0x66);
1741 emitRexRB(Ty, dst, src);
1742 emitUint8(0x0F);
1622 if (Ty == IceType_i16) { 1743 if (Ty == IceType_i16) {
1623 emitUint8(0x66);
1624 emitUint8(0x0F);
1625 emitUint8(0xC4); 1744 emitUint8(0xC4);
1626 emitXmmRegisterOperand(dst, typename Traits::XmmRegister(src));
1627 emitUint8(imm.value());
1628 } else { 1745 } else {
1629 emitUint8(0x66);
1630 emitUint8(0x0F);
1631 emitUint8(0x3A); 1746 emitUint8(0x3A);
1632 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); 1747 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1633 emitXmmRegisterOperand(dst, typename Traits::XmmRegister(src));
1634 emitUint8(imm.value());
1635 } 1748 }
1749 emitXmmRegisterOperand(dst, src);
1750 emitUint8(imm.value());
1636 } 1751 }
1637 1752
1638 template <class Machine> 1753 template <class Machine>
1639 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, 1754 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst,
1640 const typename Traits::Address &src, 1755 const typename Traits::Address &src,
1641 const Immediate &imm) { 1756 const Immediate &imm) {
1642 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1757 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1643 assert(imm.is_uint8()); 1758 assert(imm.is_uint8());
1759 emitUint8(0x66);
1760 emitRex(IceType_Irrelevant, src, dst);
1761 emitUint8(0x0F);
1644 if (Ty == IceType_i16) { 1762 if (Ty == IceType_i16) {
1645 emitUint8(0x66);
1646 emitUint8(0x0F);
1647 emitUint8(0xC4); 1763 emitUint8(0xC4);
1648 emitOperand(dst, src);
1649 emitUint8(imm.value());
1650 } else { 1764 } else {
1651 emitUint8(0x66);
1652 emitUint8(0x0F);
1653 emitUint8(0x3A); 1765 emitUint8(0x3A);
1654 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); 1766 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1655 emitOperand(dst, src);
1656 emitUint8(imm.value());
1657 } 1767 }
1768 emitOperand(gprEncoding(dst), src);
1769 emitUint8(imm.value());
1658 } 1770 }
1659 1771
1660 template <class Machine> 1772 template <class Machine>
1661 void AssemblerX86Base<Machine>::pextr(Type Ty, typename Traits::GPRRegister dst, 1773 void AssemblerX86Base<Machine>::pextr(Type Ty, typename Traits::GPRRegister dst,
1662 typename Traits::XmmRegister src, 1774 typename Traits::XmmRegister src,
1663 const Immediate &imm) { 1775 const Immediate &imm) {
1664 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1776 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1665 assert(imm.is_uint8()); 1777 assert(imm.is_uint8());
1666 if (Ty == IceType_i16) { 1778 if (Ty == IceType_i16) {
1667 emitUint8(0x66); 1779 emitUint8(0x66);
1780 emitRexRB(Ty, dst, src);
1668 emitUint8(0x0F); 1781 emitUint8(0x0F);
1669 emitUint8(0xC5); 1782 emitUint8(0xC5);
1670 emitXmmRegisterOperand(typename Traits::XmmRegister(dst), src); 1783 emitXmmRegisterOperand(dst, src);
1671 emitUint8(imm.value()); 1784 emitUint8(imm.value());
1672 } else { 1785 } else {
1673 emitUint8(0x66); 1786 emitUint8(0x66);
1787 emitRexRB(Ty, src, dst);
1674 emitUint8(0x0F); 1788 emitUint8(0x0F);
1675 emitUint8(0x3A); 1789 emitUint8(0x3A);
1676 emitUint8(isByteSizedType(Ty) ? 0x14 : 0x16); 1790 emitUint8(isByteSizedType(Ty) ? 0x14 : 0x16);
1677 // SSE 4.1 versions are "MRI" because dst can be mem, while 1791 // SSE 4.1 versions are "MRI" because dst can be mem, while
1678 // pextrw (SSE2) is RMI because dst must be reg. 1792 // pextrw (SSE2) is RMI because dst must be reg.
1679 emitXmmRegisterOperand(src, typename Traits::XmmRegister(dst)); 1793 emitXmmRegisterOperand(src, dst);
1680 emitUint8(imm.value()); 1794 emitUint8(imm.value());
1681 } 1795 }
1682 } 1796 }
1683 1797
1684 template <class Machine> 1798 template <class Machine>
1685 void AssemblerX86Base<Machine>::pmovsxdq(typename Traits::XmmRegister dst, 1799 void AssemblerX86Base<Machine>::pmovsxdq(typename Traits::XmmRegister dst,
1686 typename Traits::XmmRegister src) { 1800 typename Traits::XmmRegister src) {
1687 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1801 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1688 emitUint8(0x66); 1802 emitUint8(0x66);
1803 emitRexRB(IceType_Irrelevant, dst, src);
1689 emitUint8(0x0F); 1804 emitUint8(0x0F);
1690 emitUint8(0x38); 1805 emitUint8(0x38);
1691 emitUint8(0x25); 1806 emitUint8(0x25);
1692 emitXmmRegisterOperand(dst, src); 1807 emitXmmRegisterOperand(dst, src);
1693 } 1808 }
1694 1809
1695 template <class Machine> 1810 template <class Machine>
1696 void AssemblerX86Base<Machine>::pcmpeq(Type Ty, 1811 void AssemblerX86Base<Machine>::pcmpeq(Type Ty,
1697 typename Traits::XmmRegister dst, 1812 typename Traits::XmmRegister dst,
1698 typename Traits::XmmRegister src) { 1813 typename Traits::XmmRegister src) {
1699 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1814 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1700 emitUint8(0x66); 1815 emitUint8(0x66);
1816 emitRexRB(IceType_Irrelevant, dst, src);
1701 emitUint8(0x0F); 1817 emitUint8(0x0F);
1702 if (isByteSizedArithType(Ty)) { 1818 if (isByteSizedArithType(Ty)) {
1703 emitUint8(0x74); 1819 emitUint8(0x74);
1704 } else if (Ty == IceType_i16) { 1820 } else if (Ty == IceType_i16) {
1705 emitUint8(0x75); 1821 emitUint8(0x75);
1706 } else { 1822 } else {
1707 emitUint8(0x76); 1823 emitUint8(0x76);
1708 } 1824 }
1709 emitXmmRegisterOperand(dst, src); 1825 emitXmmRegisterOperand(dst, src);
1710 } 1826 }
1711 1827
1712 template <class Machine> 1828 template <class Machine>
1713 void AssemblerX86Base<Machine>::pcmpeq(Type Ty, 1829 void AssemblerX86Base<Machine>::pcmpeq(Type Ty,
1714 typename Traits::XmmRegister dst, 1830 typename Traits::XmmRegister dst,
1715 const typename Traits::Address &src) { 1831 const typename Traits::Address &src) {
1716 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1832 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1717 emitUint8(0x66); 1833 emitUint8(0x66);
1834 emitRex(IceType_Irrelevant, src, dst);
1718 emitUint8(0x0F); 1835 emitUint8(0x0F);
1719 if (isByteSizedArithType(Ty)) { 1836 if (isByteSizedArithType(Ty)) {
1720 emitUint8(0x74); 1837 emitUint8(0x74);
1721 } else if (Ty == IceType_i16) { 1838 } else if (Ty == IceType_i16) {
1722 emitUint8(0x75); 1839 emitUint8(0x75);
1723 } else { 1840 } else {
1724 emitUint8(0x76); 1841 emitUint8(0x76);
1725 } 1842 }
1726 emitOperand(dst, src); 1843 emitOperand(gprEncoding(dst), src);
1727 } 1844 }
1728 1845
1729 template <class Machine> 1846 template <class Machine>
1730 void AssemblerX86Base<Machine>::pcmpgt(Type Ty, 1847 void AssemblerX86Base<Machine>::pcmpgt(Type Ty,
1731 typename Traits::XmmRegister dst, 1848 typename Traits::XmmRegister dst,
1732 typename Traits::XmmRegister src) { 1849 typename Traits::XmmRegister src) {
1733 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1850 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1734 emitUint8(0x66); 1851 emitUint8(0x66);
1852 emitRexRB(IceType_Irrelevant, dst, src);
1735 emitUint8(0x0F); 1853 emitUint8(0x0F);
1736 if (isByteSizedArithType(Ty)) { 1854 if (isByteSizedArithType(Ty)) {
1737 emitUint8(0x64); 1855 emitUint8(0x64);
1738 } else if (Ty == IceType_i16) { 1856 } else if (Ty == IceType_i16) {
1739 emitUint8(0x65); 1857 emitUint8(0x65);
1740 } else { 1858 } else {
1741 emitUint8(0x66); 1859 emitUint8(0x66);
1742 } 1860 }
1743 emitXmmRegisterOperand(dst, src); 1861 emitXmmRegisterOperand(dst, src);
1744 } 1862 }
1745 1863
1746 template <class Machine> 1864 template <class Machine>
1747 void AssemblerX86Base<Machine>::pcmpgt(Type Ty, 1865 void AssemblerX86Base<Machine>::pcmpgt(Type Ty,
1748 typename Traits::XmmRegister dst, 1866 typename Traits::XmmRegister dst,
1749 const typename Traits::Address &src) { 1867 const typename Traits::Address &src) {
1750 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1868 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1751 emitUint8(0x66); 1869 emitUint8(0x66);
1870 emitRex(IceType_Irrelevant, src, dst);
1752 emitUint8(0x0F); 1871 emitUint8(0x0F);
1753 if (isByteSizedArithType(Ty)) { 1872 if (isByteSizedArithType(Ty)) {
1754 emitUint8(0x64); 1873 emitUint8(0x64);
1755 } else if (Ty == IceType_i16) { 1874 } else if (Ty == IceType_i16) {
1756 emitUint8(0x65); 1875 emitUint8(0x65);
1757 } else { 1876 } else {
1758 emitUint8(0x66); 1877 emitUint8(0x66);
1759 } 1878 }
1760 emitOperand(dst, src); 1879 emitOperand(gprEncoding(dst), src);
1761 } 1880 }
1762 1881
1763 template <class Machine> 1882 template <class Machine>
1764 void AssemblerX86Base<Machine>::roundsd(typename Traits::XmmRegister dst, 1883 void AssemblerX86Base<Machine>::roundsd(typename Traits::XmmRegister dst,
1765 typename Traits::XmmRegister src, 1884 typename Traits::XmmRegister src,
1766 RoundingMode mode) { 1885 RoundingMode mode) {
1767 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1886 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1768 emitUint8(0x66); 1887 emitUint8(0x66);
1888 emitRexRB(IceType_Irrelevant, dst, src);
1769 emitUint8(0x0F); 1889 emitUint8(0x0F);
1770 emitUint8(0x3A); 1890 emitUint8(0x3A);
1771 emitUint8(0x0B); 1891 emitUint8(0x0B);
1772 emitXmmRegisterOperand(dst, src); 1892 emitXmmRegisterOperand(dst, src);
1773 // Mask precision exeption. 1893 // Mask precision exeption.
1774 emitUint8(static_cast<uint8_t>(mode) | 0x8); 1894 emitUint8(static_cast<uint8_t>(mode) | 0x8);
1775 } 1895 }
1776 1896
1777 template <class Machine> 1897 template <class Machine>
1778 void AssemblerX86Base<Machine>::fnstcw(const typename Traits::Address &dst) { 1898 template <typename T, typename>
1899 void AssemblerX86Base<Machine>::fnstcw(const typename T::Address &dst) {
1779 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1900 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1780 emitUint8(0xD9); 1901 emitUint8(0xD9);
1781 emitOperand(7, dst); 1902 emitOperand(7, dst);
1782 } 1903 }
1783 1904
1784 template <class Machine> 1905 template <class Machine>
1785 void AssemblerX86Base<Machine>::fldcw(const typename Traits::Address &src) { 1906 template <typename T, typename>
1907 void AssemblerX86Base<Machine>::fldcw(const typename T::Address &src) {
1786 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1908 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1787 emitUint8(0xD9); 1909 emitUint8(0xD9);
1788 emitOperand(5, src); 1910 emitOperand(5, src);
1789 } 1911 }
1790 1912
1791 template <class Machine> 1913 template <class Machine>
1792 void AssemblerX86Base<Machine>::fistpl(const typename Traits::Address &dst) { 1914 template <typename T, typename>
1915 void AssemblerX86Base<Machine>::fistpl(const typename T::Address &dst) {
1793 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1916 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1794 emitUint8(0xDF); 1917 emitUint8(0xDF);
1795 emitOperand(7, dst); 1918 emitOperand(7, dst);
1796 } 1919 }
1797 1920
1798 template <class Machine> 1921 template <class Machine>
1799 void AssemblerX86Base<Machine>::fistps(const typename Traits::Address &dst) { 1922 template <typename T, typename>
1923 void AssemblerX86Base<Machine>::fistps(const typename T::Address &dst) {
1800 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1924 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1801 emitUint8(0xDB); 1925 emitUint8(0xDB);
1802 emitOperand(3, dst); 1926 emitOperand(3, dst);
1803 } 1927 }
1804 1928
1805 template <class Machine> 1929 template <class Machine>
1806 void AssemblerX86Base<Machine>::fildl(const typename Traits::Address &src) { 1930 template <typename T, typename>
1931 void AssemblerX86Base<Machine>::fildl(const typename T::Address &src) {
1807 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1932 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1808 emitUint8(0xDF); 1933 emitUint8(0xDF);
1809 emitOperand(5, src); 1934 emitOperand(5, src);
1810 } 1935 }
1811 1936
1812 template <class Machine> 1937 template <class Machine>
1813 void AssemblerX86Base<Machine>::filds(const typename Traits::Address &src) { 1938 template <typename T, typename>
1939 void AssemblerX86Base<Machine>::filds(const typename T::Address &src) {
1814 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1940 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1815 emitUint8(0xDB); 1941 emitUint8(0xDB);
1816 emitOperand(0, src); 1942 emitOperand(0, src);
1817 } 1943 }
1818 1944
1819 template <class Machine> void AssemblerX86Base<Machine>::fincstp() { 1945 template <class Machine>
1946 template <typename, typename>
1947 void AssemblerX86Base<Machine>::fincstp() {
1820 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1948 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1821 emitUint8(0xD9); 1949 emitUint8(0xD9);
1822 emitUint8(0xF7); 1950 emitUint8(0xF7);
1823 } 1951 }
1824 1952
1825 template <class Machine> 1953 template <class Machine>
1826 template <uint32_t Tag> 1954 template <uint32_t Tag>
1827 void AssemblerX86Base<Machine>::arith_int(Type Ty, 1955 void AssemblerX86Base<Machine>::arith_int(Type Ty,
1828 typename Traits::GPRRegister reg, 1956 typename Traits::GPRRegister reg,
1829 const Immediate &imm) { 1957 const Immediate &imm) {
1830 static_assert(Tag < 8, "Tag must be between 0..7"); 1958 static_assert(Tag < 8, "Tag must be between 0..7");
1831 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1959 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1960 if (Ty == IceType_i16)
1961 emitOperandSizeOverride();
1962 emitRexB(Ty, reg);
1832 if (isByteSizedType(Ty)) { 1963 if (isByteSizedType(Ty)) {
1833 emitComplexI8(Tag, typename Traits::Operand(reg), imm); 1964 emitComplexI8(Tag, typename Traits::Operand(reg), imm);
1834 return; 1965 } else {
1966 emitComplex(Ty, Tag, typename Traits::Operand(reg), imm);
1835 } 1967 }
1836 if (Ty == IceType_i16)
1837 emitOperandSizeOverride();
1838 emitComplex(Ty, Tag, typename Traits::Operand(reg), imm);
1839 } 1968 }
1840 1969
1841 template <class Machine> 1970 template <class Machine>
1842 template <uint32_t Tag> 1971 template <uint32_t Tag>
1843 void AssemblerX86Base<Machine>::arith_int(Type Ty, 1972 void AssemblerX86Base<Machine>::arith_int(Type Ty,
1844 typename Traits::GPRRegister reg0, 1973 typename Traits::GPRRegister reg0,
1845 typename Traits::GPRRegister reg1) { 1974 typename Traits::GPRRegister reg1) {
1846 static_assert(Tag < 8, "Tag must be between 0..7"); 1975 static_assert(Tag < 8, "Tag must be between 0..7");
1847 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1976 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1848 if (Ty == IceType_i16) 1977 if (Ty == IceType_i16)
1849 emitOperandSizeOverride(); 1978 emitOperandSizeOverride();
1979 emitRexRB(Ty, reg0, reg1);
1850 if (isByteSizedType(Ty)) 1980 if (isByteSizedType(Ty))
1851 emitUint8(Tag * 8 + 2); 1981 emitUint8(Tag * 8 + 2);
1852 else 1982 else
1853 emitUint8(Tag * 8 + 3); 1983 emitUint8(Tag * 8 + 3);
1854 emitRegisterOperand(reg0, reg1); 1984 emitRegisterOperand(gprEncoding(reg0), gprEncoding(reg1));
1855 } 1985 }
1856 1986
1857 template <class Machine> 1987 template <class Machine>
1858 template <uint32_t Tag> 1988 template <uint32_t Tag>
1859 void AssemblerX86Base<Machine>::arith_int( 1989 void AssemblerX86Base<Machine>::arith_int(
1860 Type Ty, typename Traits::GPRRegister reg, 1990 Type Ty, typename Traits::GPRRegister reg,
1861 const typename Traits::Address &address) { 1991 const typename Traits::Address &address) {
1862 static_assert(Tag < 8, "Tag must be between 0..7"); 1992 static_assert(Tag < 8, "Tag must be between 0..7");
1863 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1993 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1864 if (Ty == IceType_i16) 1994 if (Ty == IceType_i16)
1865 emitOperandSizeOverride(); 1995 emitOperandSizeOverride();
1996 emitRex(Ty, address, reg);
1866 if (isByteSizedType(Ty)) 1997 if (isByteSizedType(Ty))
1867 emitUint8(Tag * 8 + 2); 1998 emitUint8(Tag * 8 + 2);
1868 else 1999 else
1869 emitUint8(Tag * 8 + 3); 2000 emitUint8(Tag * 8 + 3);
1870 emitOperand(reg, address); 2001 emitOperand(gprEncoding(reg), address);
1871 } 2002 }
1872 2003
1873 template <class Machine> 2004 template <class Machine>
1874 template <uint32_t Tag> 2005 template <uint32_t Tag>
1875 void AssemblerX86Base<Machine>::arith_int( 2006 void AssemblerX86Base<Machine>::arith_int(
1876 Type Ty, const typename Traits::Address &address, 2007 Type Ty, const typename Traits::Address &address,
1877 typename Traits::GPRRegister reg) { 2008 typename Traits::GPRRegister reg) {
1878 static_assert(Tag < 8, "Tag must be between 0..7"); 2009 static_assert(Tag < 8, "Tag must be between 0..7");
1879 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2010 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1880 if (Ty == IceType_i16) 2011 if (Ty == IceType_i16)
1881 emitOperandSizeOverride(); 2012 emitOperandSizeOverride();
2013 emitRex(Ty, address, reg);
1882 if (isByteSizedType(Ty)) 2014 if (isByteSizedType(Ty))
1883 emitUint8(Tag * 8 + 0); 2015 emitUint8(Tag * 8 + 0);
1884 else 2016 else
1885 emitUint8(Tag * 8 + 1); 2017 emitUint8(Tag * 8 + 1);
1886 emitOperand(reg, address); 2018 emitOperand(gprEncoding(reg), address);
1887 } 2019 }
1888 2020
1889 template <class Machine> 2021 template <class Machine>
1890 template <uint32_t Tag> 2022 template <uint32_t Tag>
1891 void AssemblerX86Base<Machine>::arith_int( 2023 void AssemblerX86Base<Machine>::arith_int(
1892 Type Ty, const typename Traits::Address &address, const Immediate &imm) { 2024 Type Ty, const typename Traits::Address &address, const Immediate &imm) {
1893 static_assert(Tag < 8, "Tag must be between 0..7"); 2025 static_assert(Tag < 8, "Tag must be between 0..7");
1894 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2026 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2027 if (Ty == IceType_i16)
2028 emitOperandSizeOverride();
2029 emitRex(Ty, address, Encoded_Reg_Irrelevant);
1895 if (isByteSizedType(Ty)) { 2030 if (isByteSizedType(Ty)) {
1896 emitComplexI8(Tag, address, imm); 2031 emitComplexI8(Tag, address, imm);
1897 return; 2032 } else {
2033 emitComplex(Ty, Tag, address, imm);
1898 } 2034 }
1899 if (Ty == IceType_i16)
1900 emitOperandSizeOverride();
1901 emitComplex(Ty, Tag, address, imm);
1902 } 2035 }
1903 2036
1904 template <class Machine> 2037 template <class Machine>
1905 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg, 2038 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg,
1906 const Immediate &imm) { 2039 const Immediate &imm) {
1907 arith_int<7>(Ty, reg, imm); 2040 arith_int<7>(Ty, reg, imm);
1908 } 2041 }
1909 2042
1910 template <class Machine> 2043 template <class Machine>
1911 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg0, 2044 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg0,
(...skipping 20 matching lines...) Expand all
1932 const Immediate &imm) { 2065 const Immediate &imm) {
1933 arith_int<7>(Ty, address, imm); 2066 arith_int<7>(Ty, address, imm);
1934 } 2067 }
1935 2068
1936 template <class Machine> 2069 template <class Machine>
1937 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg1, 2070 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg1,
1938 typename Traits::GPRRegister reg2) { 2071 typename Traits::GPRRegister reg2) {
1939 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2072 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1940 if (Ty == IceType_i16) 2073 if (Ty == IceType_i16)
1941 emitOperandSizeOverride(); 2074 emitOperandSizeOverride();
2075 emitRexRB(Ty, reg1, reg2);
1942 if (isByteSizedType(Ty)) 2076 if (isByteSizedType(Ty))
1943 emitUint8(0x84); 2077 emitUint8(0x84);
1944 else 2078 else
1945 emitUint8(0x85); 2079 emitUint8(0x85);
1946 emitRegisterOperand(reg1, reg2); 2080 emitRegisterOperand(gprEncoding(reg1), gprEncoding(reg2));
1947 } 2081 }
1948 2082
1949 template <class Machine> 2083 template <class Machine>
1950 void AssemblerX86Base<Machine>::test(Type Ty, 2084 void AssemblerX86Base<Machine>::test(Type Ty,
1951 const typename Traits::Address &addr, 2085 const typename Traits::Address &addr,
1952 typename Traits::GPRRegister reg) { 2086 typename Traits::GPRRegister reg) {
1953 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2087 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1954 if (Ty == IceType_i16) 2088 if (Ty == IceType_i16)
1955 emitOperandSizeOverride(); 2089 emitOperandSizeOverride();
2090 emitRex(Ty, addr, reg);
1956 if (isByteSizedType(Ty)) 2091 if (isByteSizedType(Ty))
1957 emitUint8(0x84); 2092 emitUint8(0x84);
1958 else 2093 else
1959 emitUint8(0x85); 2094 emitUint8(0x85);
1960 emitOperand(reg, addr); 2095 emitOperand(gprEncoding(reg), addr);
1961 } 2096 }
1962 2097
1963 template <class Machine> 2098 template <class Machine>
1964 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg, 2099 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg,
1965 const Immediate &immediate) { 2100 const Immediate &immediate) {
1966 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2101 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1967 // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 2102 // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
1968 // we only test the byte register to keep the encoding short. 2103 // we only test the byte register to keep the encoding short.
1969 // This is legal even if the register had high bits set since 2104 // This is legal even if the register had high bits set since
1970 // this only sets flags registers based on the "AND" of the two operands, 2105 // this only sets flags registers based on the "AND" of the two operands,
1971 // and the immediate had zeros at those high bits. 2106 // and the immediate had zeros at those high bits.
1972 if (immediate.is_uint8() && reg < 4) { 2107 if (immediate.is_uint8() && reg <= Traits::Last8BitGPR) {
1973 // Use zero-extended 8-bit immediate. 2108 // Use zero-extended 8-bit immediate.
2109 emitRexB(Ty, reg);
1974 if (reg == Traits::Encoded_Reg_Accumulator) { 2110 if (reg == Traits::Encoded_Reg_Accumulator) {
1975 emitUint8(0xA8); 2111 emitUint8(0xA8);
1976 } else { 2112 } else {
1977 emitUint8(0xF6); 2113 emitUint8(0xF6);
1978 emitUint8(0xC0 + reg); 2114 emitUint8(0xC0 + gprEncoding(reg));
1979 } 2115 }
1980 emitUint8(immediate.value() & 0xFF); 2116 emitUint8(immediate.value() & 0xFF);
1981 } else if (reg == Traits::Encoded_Reg_Accumulator) { 2117 } else if (reg == Traits::Encoded_Reg_Accumulator) {
1982 // Use short form if the destination is EAX. 2118 // Use short form if the destination is EAX.
1983 if (Ty == IceType_i16) 2119 if (Ty == IceType_i16)
1984 emitOperandSizeOverride(); 2120 emitOperandSizeOverride();
1985 emitUint8(0xA9); 2121 emitUint8(0xA9);
1986 emitImmediate(Ty, immediate); 2122 emitImmediate(Ty, immediate);
1987 } else { 2123 } else {
1988 if (Ty == IceType_i16) 2124 if (Ty == IceType_i16)
1989 emitOperandSizeOverride(); 2125 emitOperandSizeOverride();
2126 emitRexB(Ty, reg);
1990 emitUint8(0xF7); 2127 emitUint8(0xF7);
1991 emitRegisterOperand(0, reg); 2128 emitRegisterOperand(0, gprEncoding(reg));
1992 emitImmediate(Ty, immediate); 2129 emitImmediate(Ty, immediate);
1993 } 2130 }
1994 } 2131 }
1995 2132
1996 template <class Machine> 2133 template <class Machine>
1997 void AssemblerX86Base<Machine>::test(Type Ty, 2134 void AssemblerX86Base<Machine>::test(Type Ty,
1998 const typename Traits::Address &addr, 2135 const typename Traits::Address &addr,
1999 const Immediate &immediate) { 2136 const Immediate &immediate) {
2000 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2137 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2001 // If the immediate is short, we only test the byte addr to keep the 2138 // If the immediate is short, we only test the byte addr to keep the
2002 // encoding short. 2139 // encoding short.
2003 if (immediate.is_uint8()) { 2140 if (immediate.is_uint8()) {
2004 // Use zero-extended 8-bit immediate. 2141 // Use zero-extended 8-bit immediate.
2142 emitRex(Ty, addr, Encoded_Reg_Irrelevant);
2005 emitUint8(0xF6); 2143 emitUint8(0xF6);
2006 emitOperand(0, addr); 2144 emitOperand(0, addr);
2007 emitUint8(immediate.value() & 0xFF); 2145 emitUint8(immediate.value() & 0xFF);
2008 } else { 2146 } else {
2009 if (Ty == IceType_i16) 2147 if (Ty == IceType_i16)
2010 emitOperandSizeOverride(); 2148 emitOperandSizeOverride();
2149 emitRex(Ty, addr, Encoded_Reg_Irrelevant);
2011 emitUint8(0xF7); 2150 emitUint8(0xF7);
2012 emitOperand(0, addr); 2151 emitOperand(0, addr);
2013 emitImmediate(Ty, immediate); 2152 emitImmediate(Ty, immediate);
2014 } 2153 }
2015 } 2154 }
2016 2155
2017 template <class Machine> 2156 template <class Machine>
2018 void AssemblerX86Base<Machine>::And(Type Ty, typename Traits::GPRRegister dst, 2157 void AssemblerX86Base<Machine>::And(Type Ty, typename Traits::GPRRegister dst,
2019 typename Traits::GPRRegister src) { 2158 typename Traits::GPRRegister src) {
2020 arith_int<4>(Ty, dst, src); 2159 arith_int<4>(Ty, dst, src);
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
2253 template <class Machine> void AssemblerX86Base<Machine>::cdq() { 2392 template <class Machine> void AssemblerX86Base<Machine>::cdq() {
2254 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2393 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2255 emitUint8(0x99); 2394 emitUint8(0x99);
2256 } 2395 }
2257 2396
2258 template <class Machine> 2397 template <class Machine>
2259 void AssemblerX86Base<Machine>::div(Type Ty, typename Traits::GPRRegister reg) { 2398 void AssemblerX86Base<Machine>::div(Type Ty, typename Traits::GPRRegister reg) {
2260 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2399 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2261 if (Ty == IceType_i16) 2400 if (Ty == IceType_i16)
2262 emitOperandSizeOverride(); 2401 emitOperandSizeOverride();
2402 emitRexB(Ty, reg);
2263 if (isByteSizedArithType(Ty)) 2403 if (isByteSizedArithType(Ty))
2264 emitUint8(0xF6); 2404 emitUint8(0xF6);
2265 else 2405 else
2266 emitUint8(0xF7); 2406 emitUint8(0xF7);
2267 emitRegisterOperand(6, reg); 2407 emitRegisterOperand(6, gprEncoding(reg));
2268 } 2408 }
2269 2409
2270 template <class Machine> 2410 template <class Machine>
2271 void AssemblerX86Base<Machine>::div(Type Ty, 2411 void AssemblerX86Base<Machine>::div(Type Ty,
2272 const typename Traits::Address &addr) { 2412 const typename Traits::Address &addr) {
2273 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2413 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2274 if (Ty == IceType_i16) 2414 if (Ty == IceType_i16)
2275 emitOperandSizeOverride(); 2415 emitOperandSizeOverride();
2416 emitRex(Ty, addr, Encoded_Reg_Irrelevant);
2276 if (isByteSizedArithType(Ty)) 2417 if (isByteSizedArithType(Ty))
2277 emitUint8(0xF6); 2418 emitUint8(0xF6);
2278 else 2419 else
2279 emitUint8(0xF7); 2420 emitUint8(0xF7);
2280 emitOperand(6, addr); 2421 emitOperand(6, addr);
2281 } 2422 }
2282 2423
2283 template <class Machine> 2424 template <class Machine>
2284 void AssemblerX86Base<Machine>::idiv(Type Ty, 2425 void AssemblerX86Base<Machine>::idiv(Type Ty,
2285 typename Traits::GPRRegister reg) { 2426 typename Traits::GPRRegister reg) {
2286 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2427 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2287 if (Ty == IceType_i16) 2428 if (Ty == IceType_i16)
2288 emitOperandSizeOverride(); 2429 emitOperandSizeOverride();
2430 emitRexB(Ty, reg);
2289 if (isByteSizedArithType(Ty)) 2431 if (isByteSizedArithType(Ty))
2290 emitUint8(0xF6); 2432 emitUint8(0xF6);
2291 else 2433 else
2292 emitUint8(0xF7); 2434 emitUint8(0xF7);
2293 emitRegisterOperand(7, reg); 2435 emitRegisterOperand(7, gprEncoding(reg));
2294 } 2436 }
2295 2437
2296 template <class Machine> 2438 template <class Machine>
2297 void AssemblerX86Base<Machine>::idiv(Type Ty, 2439 void AssemblerX86Base<Machine>::idiv(Type Ty,
2298 const typename Traits::Address &addr) { 2440 const typename Traits::Address &addr) {
2299 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2441 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2300 if (Ty == IceType_i16) 2442 if (Ty == IceType_i16)
2301 emitOperandSizeOverride(); 2443 emitOperandSizeOverride();
2444 emitRex(Ty, addr, Encoded_Reg_Irrelevant);
2302 if (isByteSizedArithType(Ty)) 2445 if (isByteSizedArithType(Ty))
2303 emitUint8(0xF6); 2446 emitUint8(0xF6);
2304 else 2447 else
2305 emitUint8(0xF7); 2448 emitUint8(0xF7);
2306 emitOperand(7, addr); 2449 emitOperand(7, addr);
2307 } 2450 }
2308 2451
2309 template <class Machine> 2452 template <class Machine>
2310 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, 2453 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst,
2311 typename Traits::GPRRegister src) { 2454 typename Traits::GPRRegister src) {
2312 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2455 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2313 assert(Ty == IceType_i16 || Ty == IceType_i32); 2456 assert(Ty == IceType_i16 || Ty == IceType_i32);
2314 if (Ty == IceType_i16) 2457 if (Ty == IceType_i16)
2315 emitOperandSizeOverride(); 2458 emitOperandSizeOverride();
2459 emitRexRB(Ty, dst, src);
2316 emitUint8(0x0F); 2460 emitUint8(0x0F);
2317 emitUint8(0xAF); 2461 emitUint8(0xAF);
2318 emitRegisterOperand(dst, src); 2462 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2319 } 2463 }
2320 2464
2321 template <class Machine> 2465 template <class Machine>
2322 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, 2466 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
2323 const typename Traits::Address &address) { 2467 const typename Traits::Address &address) {
2324 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2468 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2325 assert(Ty == IceType_i16 || Ty == IceType_i32); 2469 assert(Ty == IceType_i16 || Ty == IceType_i32);
2326 if (Ty == IceType_i16) 2470 if (Ty == IceType_i16)
2327 emitOperandSizeOverride(); 2471 emitOperandSizeOverride();
2472 emitRex(Ty, address, reg);
2328 emitUint8(0x0F); 2473 emitUint8(0x0F);
2329 emitUint8(0xAF); 2474 emitUint8(0xAF);
2330 emitOperand(reg, address); 2475 emitOperand(gprEncoding(reg), address);
2331 } 2476 }
2332 2477
2333 template <class Machine> 2478 template <class Machine>
2334 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, 2479 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
2335 const Immediate &imm) { 2480 const Immediate &imm) {
2336 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2481 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2337 assert(Ty == IceType_i16 || Ty == IceType_i32); 2482 assert(Ty == IceType_i16 || Ty == IceType_i32);
2338 if (Ty == IceType_i16) 2483 if (Ty == IceType_i16)
2339 emitOperandSizeOverride(); 2484 emitOperandSizeOverride();
2485 emitRexRB(Ty, reg, reg);
2340 if (imm.is_int8()) { 2486 if (imm.is_int8()) {
2341 emitUint8(0x6B); 2487 emitUint8(0x6B);
2342 emitRegisterOperand(reg, reg); 2488 emitRegisterOperand(gprEncoding(reg), gprEncoding(reg));
2343 emitUint8(imm.value() & 0xFF); 2489 emitUint8(imm.value() & 0xFF);
2344 } else { 2490 } else {
2345 emitUint8(0x69); 2491 emitUint8(0x69);
2346 emitRegisterOperand(reg, reg); 2492 emitRegisterOperand(gprEncoding(reg), gprEncoding(reg));
2347 emitImmediate(Ty, imm); 2493 emitImmediate(Ty, imm);
2348 } 2494 }
2349 } 2495 }
2350 2496
2351 template <class Machine> 2497 template <class Machine>
2352 void AssemblerX86Base<Machine>::imul(Type Ty, 2498 void AssemblerX86Base<Machine>::imul(Type Ty,
2353 typename Traits::GPRRegister reg) { 2499 typename Traits::GPRRegister reg) {
2354 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2500 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2355 if (Ty == IceType_i16) 2501 if (Ty == IceType_i16)
2356 emitOperandSizeOverride(); 2502 emitOperandSizeOverride();
2503 emitRexB(Ty, reg);
2357 if (isByteSizedArithType(Ty)) 2504 if (isByteSizedArithType(Ty))
2358 emitUint8(0xF6); 2505 emitUint8(0xF6);
2359 else 2506 else
2360 emitUint8(0xF7); 2507 emitUint8(0xF7);
2361 emitRegisterOperand(5, reg); 2508 emitRegisterOperand(5, gprEncoding(reg));
2362 } 2509 }
2363 2510
2364 template <class Machine> 2511 template <class Machine>
2365 void AssemblerX86Base<Machine>::imul(Type Ty, 2512 void AssemblerX86Base<Machine>::imul(Type Ty,
2366 const typename Traits::Address &address) { 2513 const typename Traits::Address &address) {
2367 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2514 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2368 if (Ty == IceType_i16) 2515 if (Ty == IceType_i16)
2369 emitOperandSizeOverride(); 2516 emitOperandSizeOverride();
2517 emitRex(Ty, address, Encoded_Reg_Irrelevant);
2370 if (isByteSizedArithType(Ty)) 2518 if (isByteSizedArithType(Ty))
2371 emitUint8(0xF6); 2519 emitUint8(0xF6);
2372 else 2520 else
2373 emitUint8(0xF7); 2521 emitUint8(0xF7);
2374 emitOperand(5, address); 2522 emitOperand(5, address);
2375 } 2523 }
2376 2524
2377 template <class Machine> 2525 template <class Machine>
2378 void AssemblerX86Base<Machine>::mul(Type Ty, typename Traits::GPRRegister reg) { 2526 void AssemblerX86Base<Machine>::mul(Type Ty, typename Traits::GPRRegister reg) {
2379 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2527 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2380 if (Ty == IceType_i16) 2528 if (Ty == IceType_i16)
2381 emitOperandSizeOverride(); 2529 emitOperandSizeOverride();
2530 emitRexB(Ty, reg);
2382 if (isByteSizedArithType(Ty)) 2531 if (isByteSizedArithType(Ty))
2383 emitUint8(0xF6); 2532 emitUint8(0xF6);
2384 else 2533 else
2385 emitUint8(0xF7); 2534 emitUint8(0xF7);
2386 emitRegisterOperand(4, reg); 2535 emitRegisterOperand(4, gprEncoding(reg));
2387 } 2536 }
2388 2537
2389 template <class Machine> 2538 template <class Machine>
2390 void AssemblerX86Base<Machine>::mul(Type Ty, 2539 void AssemblerX86Base<Machine>::mul(Type Ty,
2391 const typename Traits::Address &address) { 2540 const typename Traits::Address &address) {
2392 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2541 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2393 if (Ty == IceType_i16) 2542 if (Ty == IceType_i16)
2394 emitOperandSizeOverride(); 2543 emitOperandSizeOverride();
2544 emitRex(Ty, address, Encoded_Reg_Irrelevant);
2395 if (isByteSizedArithType(Ty)) 2545 if (isByteSizedArithType(Ty))
2396 emitUint8(0xF6); 2546 emitUint8(0xF6);
2397 else 2547 else
2398 emitUint8(0xF7); 2548 emitUint8(0xF7);
2399 emitOperand(4, address); 2549 emitOperand(4, address);
2400 } 2550 }
2401 2551
2402 template <class Machine> 2552 template <class Machine>
2553 template <typename, typename>
2403 void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) { 2554 void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) {
2404 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2555 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2405 emitUint8(0x40 + reg); 2556 emitUint8(0x40 + reg);
2406 } 2557 }
2407 2558
2408 template <class Machine> 2559 template <class Machine>
2409 void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) { 2560 void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) {
2410 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2561 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2562 emitRex(IceType_i32, address, Encoded_Reg_Irrelevant);
2411 emitUint8(0xFF); 2563 emitUint8(0xFF);
2412 emitOperand(0, address); 2564 emitOperand(0, address);
2413 } 2565 }
2414 2566
2415 template <class Machine> 2567 template <class Machine>
2568 template <typename, typename>
2416 void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) { 2569 void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) {
2417 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2570 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2418 emitUint8(0x48 + reg); 2571 emitUint8(0x48 + reg);
2419 } 2572 }
2420 2573
2421 template <class Machine> 2574 template <class Machine>
2422 void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) { 2575 void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) {
2423 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2576 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2577 emitRex(IceType_i32, address, Encoded_Reg_Irrelevant);
2424 emitUint8(0xFF); 2578 emitUint8(0xFF);
2425 emitOperand(1, address); 2579 emitOperand(1, address);
2426 } 2580 }
2427 2581
2428 template <class Machine> 2582 template <class Machine>
2429 void AssemblerX86Base<Machine>::rol(Type Ty, typename Traits::GPRRegister reg, 2583 void AssemblerX86Base<Machine>::rol(Type Ty, typename Traits::GPRRegister reg,
2430 const Immediate &imm) { 2584 const Immediate &imm) {
2431 emitGenericShift(0, Ty, reg, imm); 2585 emitGenericShift(0, Ty, reg, imm);
2432 } 2586 }
2433 2587
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2505 emitGenericShift(7, Ty, address, shifter); 2659 emitGenericShift(7, Ty, address, shifter);
2506 } 2660 }
2507 2661
2508 template <class Machine> 2662 template <class Machine>
2509 void AssemblerX86Base<Machine>::shld(Type Ty, typename Traits::GPRRegister dst, 2663 void AssemblerX86Base<Machine>::shld(Type Ty, typename Traits::GPRRegister dst,
2510 typename Traits::GPRRegister src) { 2664 typename Traits::GPRRegister src) {
2511 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2665 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2512 assert(Ty == IceType_i16 || Ty == IceType_i32); 2666 assert(Ty == IceType_i16 || Ty == IceType_i32);
2513 if (Ty == IceType_i16) 2667 if (Ty == IceType_i16)
2514 emitOperandSizeOverride(); 2668 emitOperandSizeOverride();
2669 emitRexRB(Ty, src, dst);
2515 emitUint8(0x0F); 2670 emitUint8(0x0F);
2516 emitUint8(0xA5); 2671 emitUint8(0xA5);
2517 emitRegisterOperand(src, dst); 2672 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2518 } 2673 }
2519 2674
2520 template <class Machine> 2675 template <class Machine>
2521 void AssemblerX86Base<Machine>::shld(Type Ty, typename Traits::GPRRegister dst, 2676 void AssemblerX86Base<Machine>::shld(Type Ty, typename Traits::GPRRegister dst,
2522 typename Traits::GPRRegister src, 2677 typename Traits::GPRRegister src,
2523 const Immediate &imm) { 2678 const Immediate &imm) {
2524 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2679 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2525 assert(Ty == IceType_i16 || Ty == IceType_i32); 2680 assert(Ty == IceType_i16 || Ty == IceType_i32);
2526 assert(imm.is_int8()); 2681 assert(imm.is_int8());
2527 if (Ty == IceType_i16) 2682 if (Ty == IceType_i16)
2528 emitOperandSizeOverride(); 2683 emitOperandSizeOverride();
2684 emitRexRB(Ty, src, dst);
2529 emitUint8(0x0F); 2685 emitUint8(0x0F);
2530 emitUint8(0xA4); 2686 emitUint8(0xA4);
2531 emitRegisterOperand(src, dst); 2687 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2532 emitUint8(imm.value() & 0xFF); 2688 emitUint8(imm.value() & 0xFF);
2533 } 2689 }
2534 2690
2535 template <class Machine> 2691 template <class Machine>
2536 void AssemblerX86Base<Machine>::shld(Type Ty, 2692 void AssemblerX86Base<Machine>::shld(Type Ty,
2537 const typename Traits::Address &operand, 2693 const typename Traits::Address &operand,
2538 typename Traits::GPRRegister src) { 2694 typename Traits::GPRRegister src) {
2539 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2695 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2540 assert(Ty == IceType_i16 || Ty == IceType_i32); 2696 assert(Ty == IceType_i16 || Ty == IceType_i32);
2541 if (Ty == IceType_i16) 2697 if (Ty == IceType_i16)
2542 emitOperandSizeOverride(); 2698 emitOperandSizeOverride();
2699 emitRex(Ty, operand, src);
2543 emitUint8(0x0F); 2700 emitUint8(0x0F);
2544 emitUint8(0xA5); 2701 emitUint8(0xA5);
2545 emitOperand(src, operand); 2702 emitOperand(gprEncoding(src), operand);
2546 } 2703 }
2547 2704
2548 template <class Machine> 2705 template <class Machine>
2549 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst, 2706 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst,
2550 typename Traits::GPRRegister src) { 2707 typename Traits::GPRRegister src) {
2551 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2708 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2552 assert(Ty == IceType_i16 || Ty == IceType_i32); 2709 assert(Ty == IceType_i16 || Ty == IceType_i32);
2553 if (Ty == IceType_i16) 2710 if (Ty == IceType_i16)
2554 emitOperandSizeOverride(); 2711 emitOperandSizeOverride();
2712 emitRexRB(Ty, src, dst);
2555 emitUint8(0x0F); 2713 emitUint8(0x0F);
2556 emitUint8(0xAD); 2714 emitUint8(0xAD);
2557 emitRegisterOperand(src, dst); 2715 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2558 } 2716 }
2559 2717
2560 template <class Machine> 2718 template <class Machine>
2561 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst, 2719 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst,
2562 typename Traits::GPRRegister src, 2720 typename Traits::GPRRegister src,
2563 const Immediate &imm) { 2721 const Immediate &imm) {
2564 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2722 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2565 assert(Ty == IceType_i16 || Ty == IceType_i32); 2723 assert(Ty == IceType_i16 || Ty == IceType_i32);
2566 assert(imm.is_int8()); 2724 assert(imm.is_int8());
2567 if (Ty == IceType_i16) 2725 if (Ty == IceType_i16)
2568 emitOperandSizeOverride(); 2726 emitOperandSizeOverride();
2727 emitRexRB(Ty, src, dst);
2569 emitUint8(0x0F); 2728 emitUint8(0x0F);
2570 emitUint8(0xAC); 2729 emitUint8(0xAC);
2571 emitRegisterOperand(src, dst); 2730 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2572 emitUint8(imm.value() & 0xFF); 2731 emitUint8(imm.value() & 0xFF);
2573 } 2732 }
2574 2733
2575 template <class Machine> 2734 template <class Machine>
2576 void AssemblerX86Base<Machine>::shrd(Type Ty, 2735 void AssemblerX86Base<Machine>::shrd(Type Ty,
2577 const typename Traits::Address &dst, 2736 const typename Traits::Address &dst,
2578 typename Traits::GPRRegister src) { 2737 typename Traits::GPRRegister src) {
2579 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2738 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2580 assert(Ty == IceType_i16 || Ty == IceType_i32); 2739 assert(Ty == IceType_i16 || Ty == IceType_i32);
2581 if (Ty == IceType_i16) 2740 if (Ty == IceType_i16)
2582 emitOperandSizeOverride(); 2741 emitOperandSizeOverride();
2742 emitRex(Ty, dst, src);
2583 emitUint8(0x0F); 2743 emitUint8(0x0F);
2584 emitUint8(0xAD); 2744 emitUint8(0xAD);
2585 emitOperand(src, dst); 2745 emitOperand(gprEncoding(src), dst);
2586 } 2746 }
2587 2747
2588 template <class Machine> 2748 template <class Machine>
2589 void AssemblerX86Base<Machine>::neg(Type Ty, typename Traits::GPRRegister reg) { 2749 void AssemblerX86Base<Machine>::neg(Type Ty, typename Traits::GPRRegister reg) {
2590 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2750 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2591 if (Ty == IceType_i16) 2751 if (Ty == IceType_i16)
2592 emitOperandSizeOverride(); 2752 emitOperandSizeOverride();
2753 emitRexB(Ty, reg);
2593 if (isByteSizedArithType(Ty)) 2754 if (isByteSizedArithType(Ty))
2594 emitUint8(0xF6); 2755 emitUint8(0xF6);
2595 else 2756 else
2596 emitUint8(0xF7); 2757 emitUint8(0xF7);
2597 emitRegisterOperand(3, reg); 2758 emitRegisterOperand(3, gprEncoding(reg));
2598 } 2759 }
2599 2760
2600 template <class Machine> 2761 template <class Machine>
2601 void AssemblerX86Base<Machine>::neg(Type Ty, 2762 void AssemblerX86Base<Machine>::neg(Type Ty,
2602 const typename Traits::Address &addr) { 2763 const typename Traits::Address &addr) {
2603 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2764 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2604 if (Ty == IceType_i16) 2765 if (Ty == IceType_i16)
2605 emitOperandSizeOverride(); 2766 emitOperandSizeOverride();
2767 emitRex(Ty, addr, Encoded_Reg_Irrelevant);
2606 if (isByteSizedArithType(Ty)) 2768 if (isByteSizedArithType(Ty))
2607 emitUint8(0xF6); 2769 emitUint8(0xF6);
2608 else 2770 else
2609 emitUint8(0xF7); 2771 emitUint8(0xF7);
2610 emitOperand(3, addr); 2772 emitOperand(3, addr);
2611 } 2773 }
2612 2774
2613 template <class Machine> 2775 template <class Machine>
2614 void AssemblerX86Base<Machine>::notl(typename Traits::GPRRegister reg) { 2776 void AssemblerX86Base<Machine>::notl(typename Traits::GPRRegister reg) {
2615 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2777 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2778 emitRexB(IceType_i32, reg);
2616 emitUint8(0xF7); 2779 emitUint8(0xF7);
2617 emitUint8(0xD0 | reg); 2780 emitUint8(0xD0 | gprEncoding(reg));
2618 } 2781 }
2619 2782
2620 template <class Machine> 2783 template <class Machine>
2621 void AssemblerX86Base<Machine>::bswap(Type Ty, 2784 void AssemblerX86Base<Machine>::bswap(Type Ty,
2622 typename Traits::GPRRegister reg) { 2785 typename Traits::GPRRegister reg) {
2623 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2786 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2624 assert(Ty == IceType_i32); 2787 assert(Ty == IceType_i32);
2625 (void)Ty; 2788 (void)Ty;
2789 emitRexB(Ty, reg);
2626 emitUint8(0x0F); 2790 emitUint8(0x0F);
2627 emitUint8(0xC8 | reg); 2791 emitUint8(0xC8 | gprEncoding(reg));
2628 } 2792 }
2629 2793
2630 template <class Machine> 2794 template <class Machine>
2631 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, 2795 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
2632 typename Traits::GPRRegister src) { 2796 typename Traits::GPRRegister src) {
2633 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2797 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2634 assert(Ty == IceType_i16 || Ty == IceType_i32); 2798 assert(Ty == IceType_i16 || Ty == IceType_i32);
2635 if (Ty == IceType_i16) 2799 if (Ty == IceType_i16)
2636 emitOperandSizeOverride(); 2800 emitOperandSizeOverride();
2801 emitRexRB(Ty, dst, src);
2637 emitUint8(0x0F); 2802 emitUint8(0x0F);
2638 emitUint8(0xBC); 2803 emitUint8(0xBC);
2639 emitRegisterOperand(dst, src); 2804 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2640 } 2805 }
2641 2806
2642 template <class Machine> 2807 template <class Machine>
2643 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, 2808 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
2644 const typename Traits::Address &src) { 2809 const typename Traits::Address &src) {
2645 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2810 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2646 assert(Ty == IceType_i16 || Ty == IceType_i32); 2811 assert(Ty == IceType_i16 || Ty == IceType_i32);
2647 if (Ty == IceType_i16) 2812 if (Ty == IceType_i16)
2648 emitOperandSizeOverride(); 2813 emitOperandSizeOverride();
2814 emitRex(Ty, src, dst);
2649 emitUint8(0x0F); 2815 emitUint8(0x0F);
2650 emitUint8(0xBC); 2816 emitUint8(0xBC);
2651 emitOperand(dst, src); 2817 emitOperand(gprEncoding(dst), src);
2652 } 2818 }
2653 2819
2654 template <class Machine> 2820 template <class Machine>
2655 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, 2821 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst,
2656 typename Traits::GPRRegister src) { 2822 typename Traits::GPRRegister src) {
2657 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2823 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2658 assert(Ty == IceType_i16 || Ty == IceType_i32); 2824 assert(Ty == IceType_i16 || Ty == IceType_i32);
2659 if (Ty == IceType_i16) 2825 if (Ty == IceType_i16)
2660 emitOperandSizeOverride(); 2826 emitOperandSizeOverride();
2827 emitRexRB(Ty, dst, src);
2661 emitUint8(0x0F); 2828 emitUint8(0x0F);
2662 emitUint8(0xBD); 2829 emitUint8(0xBD);
2663 emitRegisterOperand(dst, src); 2830 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2664 } 2831 }
2665 2832
2666 template <class Machine> 2833 template <class Machine>
2667 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, 2834 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst,
2668 const typename Traits::Address &src) { 2835 const typename Traits::Address &src) {
2669 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2836 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2670 assert(Ty == IceType_i16 || Ty == IceType_i32); 2837 assert(Ty == IceType_i16 || Ty == IceType_i32);
2671 if (Ty == IceType_i16) 2838 if (Ty == IceType_i16)
2672 emitOperandSizeOverride(); 2839 emitOperandSizeOverride();
2840 emitRex(Ty, src, dst);
2673 emitUint8(0x0F); 2841 emitUint8(0x0F);
2674 emitUint8(0xBD); 2842 emitUint8(0xBD);
2675 emitOperand(dst, src); 2843 emitOperand(gprEncoding(dst), src);
2676 } 2844 }
2677 2845
2678 template <class Machine> 2846 template <class Machine>
2679 void AssemblerX86Base<Machine>::bt(typename Traits::GPRRegister base, 2847 void AssemblerX86Base<Machine>::bt(typename Traits::GPRRegister base,
2680 typename Traits::GPRRegister offset) { 2848 typename Traits::GPRRegister offset) {
2681 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2849 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2850 emitRexRB(IceType_i32, offset, base);
2682 emitUint8(0x0F); 2851 emitUint8(0x0F);
2683 emitUint8(0xA3); 2852 emitUint8(0xA3);
2684 emitRegisterOperand(offset, base); 2853 emitRegisterOperand(gprEncoding(offset), gprEncoding(base));
2685 } 2854 }
2686 2855
2687 template <class Machine> void AssemblerX86Base<Machine>::ret() { 2856 template <class Machine> void AssemblerX86Base<Machine>::ret() {
2688 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2857 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2689 emitUint8(0xC3); 2858 emitUint8(0xC3);
2690 } 2859 }
2691 2860
2692 template <class Machine> 2861 template <class Machine>
2693 void AssemblerX86Base<Machine>::ret(const Immediate &imm) { 2862 void AssemblerX86Base<Machine>::ret(const Immediate &imm) {
2694 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2863 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2816 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2985 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2817 emitUint8(0x0F); 2986 emitUint8(0x0F);
2818 emitUint8(0x80 + condition); 2987 emitUint8(0x80 + condition);
2819 emitFixup(this->createFixup(Traits::PcRelFixup, label)); 2988 emitFixup(this->createFixup(Traits::PcRelFixup, label));
2820 emitInt32(-4); 2989 emitInt32(-4);
2821 } 2990 }
2822 2991
2823 template <class Machine> 2992 template <class Machine>
2824 void AssemblerX86Base<Machine>::jmp(typename Traits::GPRRegister reg) { 2993 void AssemblerX86Base<Machine>::jmp(typename Traits::GPRRegister reg) {
2825 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2994 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2995 emitRexB(IceType_Irrelevant, reg);
2826 emitUint8(0xFF); 2996 emitUint8(0xFF);
2827 emitRegisterOperand(4, reg); 2997 emitRegisterOperand(4, gprEncoding(reg));
2828 } 2998 }
2829 2999
2830 template <class Machine> 3000 template <class Machine>
2831 void AssemblerX86Base<Machine>::jmp(Label *label, bool near) { 3001 void AssemblerX86Base<Machine>::jmp(Label *label, bool near) {
2832 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3002 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2833 if (label->IsBound()) { 3003 if (label->IsBound()) {
2834 static const int kShortSize = 2; 3004 static const int kShortSize = 2;
2835 static const int kLongSize = 5; 3005 static const int kLongSize = 5;
2836 intptr_t offset = label->Position() - Buffer.size(); 3006 intptr_t offset = label->Position() - Buffer.size();
2837 assert(offset <= 0); 3007 assert(offset <= 0);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 template <class Machine> 3044 template <class Machine>
2875 void AssemblerX86Base<Machine>::cmpxchg(Type Ty, 3045 void AssemblerX86Base<Machine>::cmpxchg(Type Ty,
2876 const typename Traits::Address &address, 3046 const typename Traits::Address &address,
2877 typename Traits::GPRRegister reg, 3047 typename Traits::GPRRegister reg,
2878 bool Locked) { 3048 bool Locked) {
2879 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3049 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2880 if (Ty == IceType_i16) 3050 if (Ty == IceType_i16)
2881 emitOperandSizeOverride(); 3051 emitOperandSizeOverride();
2882 if (Locked) 3052 if (Locked)
2883 emitUint8(0xF0); 3053 emitUint8(0xF0);
3054 emitRex(Ty, address, reg);
2884 emitUint8(0x0F); 3055 emitUint8(0x0F);
2885 if (isByteSizedArithType(Ty)) 3056 if (isByteSizedArithType(Ty))
2886 emitUint8(0xB0); 3057 emitUint8(0xB0);
2887 else 3058 else
2888 emitUint8(0xB1); 3059 emitUint8(0xB1);
2889 emitOperand(reg, address); 3060 emitOperand(gprEncoding(reg), address);
2890 } 3061 }
2891 3062
2892 template <class Machine> 3063 template <class Machine>
2893 void AssemblerX86Base<Machine>::cmpxchg8b( 3064 void AssemblerX86Base<Machine>::cmpxchg8b(
2894 const typename Traits::Address &address, bool Locked) { 3065 const typename Traits::Address &address, bool Locked) {
2895 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3066 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2896 if (Locked) 3067 if (Locked)
2897 emitUint8(0xF0); 3068 emitUint8(0xF0);
3069 emitRex(IceType_i32, address, Encoded_Reg_Irrelevant);
2898 emitUint8(0x0F); 3070 emitUint8(0x0F);
2899 emitUint8(0xC7); 3071 emitUint8(0xC7);
2900 emitOperand(1, address); 3072 emitOperand(1, address);
2901 } 3073 }
2902 3074
2903 template <class Machine> 3075 template <class Machine>
2904 void AssemblerX86Base<Machine>::xadd(Type Ty, 3076 void AssemblerX86Base<Machine>::xadd(Type Ty,
2905 const typename Traits::Address &addr, 3077 const typename Traits::Address &addr,
2906 typename Traits::GPRRegister reg, 3078 typename Traits::GPRRegister reg,
2907 bool Locked) { 3079 bool Locked) {
2908 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3080 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2909 if (Ty == IceType_i16) 3081 if (Ty == IceType_i16)
2910 emitOperandSizeOverride(); 3082 emitOperandSizeOverride();
2911 if (Locked) 3083 if (Locked)
2912 emitUint8(0xF0); 3084 emitUint8(0xF0);
3085 emitRex(Ty, addr, reg);
2913 emitUint8(0x0F); 3086 emitUint8(0x0F);
2914 if (isByteSizedArithType(Ty)) 3087 if (isByteSizedArithType(Ty))
2915 emitUint8(0xC0); 3088 emitUint8(0xC0);
2916 else 3089 else
2917 emitUint8(0xC1); 3090 emitUint8(0xC1);
2918 emitOperand(reg, addr); 3091 emitOperand(gprEncoding(reg), addr);
2919 } 3092 }
2920 3093
2921 template <class Machine> 3094 template <class Machine>
2922 void AssemblerX86Base<Machine>::xchg(Type Ty, 3095 void AssemblerX86Base<Machine>::xchg(Type Ty,
2923 const typename Traits::Address &addr, 3096 const typename Traits::Address &addr,
2924 typename Traits::GPRRegister reg) { 3097 typename Traits::GPRRegister reg) {
2925 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3098 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2926 if (Ty == IceType_i16) 3099 if (Ty == IceType_i16)
2927 emitOperandSizeOverride(); 3100 emitOperandSizeOverride();
3101 emitRex(Ty, addr, reg);
2928 if (isByteSizedArithType(Ty)) 3102 if (isByteSizedArithType(Ty))
2929 emitUint8(0x86); 3103 emitUint8(0x86);
2930 else 3104 else
2931 emitUint8(0x87); 3105 emitUint8(0x87);
2932 emitOperand(reg, addr); 3106 emitOperand(gprEncoding(reg), addr);
2933 } 3107 }
2934 3108
2935 template <class Machine> 3109 template <class Machine>
2936 void AssemblerX86Base<Machine>::emitSegmentOverride(uint8_t prefix) { 3110 void AssemblerX86Base<Machine>::emitSegmentOverride(uint8_t prefix) {
2937 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3111 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2938 emitUint8(prefix); 3112 emitUint8(prefix);
2939 } 3113 }
2940 3114
2941 template <class Machine> 3115 template <class Machine>
2942 void AssemblerX86Base<Machine>::align(intptr_t alignment, intptr_t offset) { 3116 void AssemblerX86Base<Machine>::align(intptr_t alignment, intptr_t offset) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
3075 label->NearLinkTo(position); 3249 label->NearLinkTo(position);
3076 } 3250 }
3077 3251
3078 template <class Machine> 3252 template <class Machine>
3079 void AssemblerX86Base<Machine>::emitGenericShift( 3253 void AssemblerX86Base<Machine>::emitGenericShift(
3080 int rm, Type Ty, typename Traits::GPRRegister reg, const Immediate &imm) { 3254 int rm, Type Ty, typename Traits::GPRRegister reg, const Immediate &imm) {
3081 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3255 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3082 assert(imm.is_int8()); 3256 assert(imm.is_int8());
3083 if (Ty == IceType_i16) 3257 if (Ty == IceType_i16)
3084 emitOperandSizeOverride(); 3258 emitOperandSizeOverride();
3259 emitRexB(Ty, reg);
3085 if (imm.value() == 1) { 3260 if (imm.value() == 1) {
3086 emitUint8(isByteSizedArithType(Ty) ? 0xD0 : 0xD1); 3261 emitUint8(isByteSizedArithType(Ty) ? 0xD0 : 0xD1);
3087 emitOperand(rm, typename Traits::Operand(reg)); 3262 emitOperand(rm, typename Traits::Operand(reg));
3088 } else { 3263 } else {
3089 emitUint8(isByteSizedArithType(Ty) ? 0xC0 : 0xC1); 3264 emitUint8(isByteSizedArithType(Ty) ? 0xC0 : 0xC1);
3090 emitOperand(rm, typename Traits::Operand(reg)); 3265 emitOperand(rm, typename Traits::Operand(reg));
3091 emitUint8(imm.value() & 0xFF); 3266 emitUint8(imm.value() & 0xFF);
3092 } 3267 }
3093 } 3268 }
3094 3269
3095 template <class Machine> 3270 template <class Machine>
3096 void AssemblerX86Base<Machine>::emitGenericShift( 3271 void AssemblerX86Base<Machine>::emitGenericShift(
3097 int rm, Type Ty, const typename Traits::Operand &operand, 3272 int rm, Type Ty, const typename Traits::Operand &operand,
3098 typename Traits::GPRRegister shifter) { 3273 typename Traits::GPRRegister shifter) {
3099 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3274 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3100 assert(shifter == Traits::Encoded_Reg_Counter); 3275 assert(shifter == Traits::Encoded_Reg_Counter);
3101 (void)shifter; 3276 (void)shifter;
3102 if (Ty == IceType_i16) 3277 if (Ty == IceType_i16)
3103 emitOperandSizeOverride(); 3278 emitOperandSizeOverride();
3279 emitRexB(Ty, operand.rm());
3104 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); 3280 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3);
3105 emitOperand(rm, operand); 3281 emitOperand(rm, operand);
3106 } 3282 }
3107 3283
3108 } // end of namespace X86Internal 3284 } // end of namespace X86Internal
3109 } // end of namespace Ice 3285 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceAssemblerX86Base.h ('k') | src/IceConditionCodesX8664.h » ('j') | src/IceRegistersX8664.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698