OLD | NEW |
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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) { | 105 void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) { |
106 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 106 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
107 emitRexB(RexTypeIrrelevant, reg); | 107 emitRexB(RexTypeIrrelevant, reg); |
108 emitUint8(0xFF); | 108 emitUint8(0xFF); |
109 emitRegisterOperand(2, gprEncoding(reg)); | 109 emitRegisterOperand(2, gprEncoding(reg)); |
110 } | 110 } |
111 | 111 |
112 template <class Machine> | 112 template <class Machine> |
113 void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) { | 113 void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) { |
114 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 114 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 115 emitAddrSizeOverridePrefix(); |
115 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); | 116 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); |
116 emitUint8(0xFF); | 117 emitUint8(0xFF); |
117 emitOperand(2, address); | 118 emitOperand(2, address); |
118 } | 119 } |
119 | 120 |
120 template <class Machine> | 121 template <class Machine> |
121 void AssemblerX86Base<Machine>::call(const ConstantRelocatable *label) { | 122 void AssemblerX86Base<Machine>::call(const ConstantRelocatable *label) { |
122 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 123 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
123 intptr_t call_start = Buffer.getPosition(); | 124 intptr_t call_start = Buffer.getPosition(); |
124 emitUint8(0xE8); | 125 emitUint8(0xE8); |
(...skipping 26 matching lines...) Expand all Loading... |
151 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 152 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
152 // Any type that would not force a REX prefix to be emitted can be provided | 153 // Any type that would not force a REX prefix to be emitted can be provided |
153 // here. | 154 // here. |
154 emitRexB(RexTypeIrrelevant, reg); | 155 emitRexB(RexTypeIrrelevant, reg); |
155 emitUint8(0x58 + gprEncoding(reg)); | 156 emitUint8(0x58 + gprEncoding(reg)); |
156 } | 157 } |
157 | 158 |
158 template <class Machine> | 159 template <class Machine> |
159 void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) { | 160 void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) { |
160 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 161 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 162 emitAddrSizeOverridePrefix(); |
161 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); | 163 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); |
162 emitUint8(0x8F); | 164 emitUint8(0x8F); |
163 emitOperand(0, address); | 165 emitOperand(0, address); |
164 } | 166 } |
165 | 167 |
166 template <class Machine> | 168 template <class Machine> |
167 template <typename, typename> | 169 template <typename, typename> |
168 void AssemblerX86Base<Machine>::pushal() { | 170 void AssemblerX86Base<Machine>::pushal() { |
169 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 171 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
170 emitUint8(0x60); | 172 emitUint8(0x60); |
(...skipping 13 matching lines...) Expand all Loading... |
184 emitRexB(IceType_i8, dst); | 186 emitRexB(IceType_i8, dst); |
185 emitUint8(0x0F); | 187 emitUint8(0x0F); |
186 emitUint8(0x90 + condition); | 188 emitUint8(0x90 + condition); |
187 emitUint8(0xC0 + gprEncoding(dst)); | 189 emitUint8(0xC0 + gprEncoding(dst)); |
188 } | 190 } |
189 | 191 |
190 template <class Machine> | 192 template <class Machine> |
191 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition, | 193 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition, |
192 const typename Traits::Address &address) { | 194 const typename Traits::Address &address) { |
193 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 195 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 196 emitAddrSizeOverridePrefix(); |
194 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); | 197 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); |
195 emitUint8(0x0F); | 198 emitUint8(0x0F); |
196 emitUint8(0x90 + condition); | 199 emitUint8(0x90 + condition); |
197 emitOperand(0, address); | 200 emitOperand(0, address); |
198 } | 201 } |
199 | 202 |
200 template <class Machine> | 203 template <class Machine> |
201 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, | 204 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, |
202 const Immediate &imm) { | 205 const Immediate &imm) { |
203 assert(Ty != IceType_i64 && "i64 not supported yet."); | 206 assert(Ty != IceType_i64 && "i64 not supported yet."); |
(...skipping 26 matching lines...) Expand all Loading... |
230 } | 233 } |
231 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); | 234 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); |
232 } | 235 } |
233 | 236 |
234 template <class Machine> | 237 template <class Machine> |
235 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, | 238 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, |
236 const typename Traits::Address &src) { | 239 const typename Traits::Address &src) { |
237 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 240 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
238 if (Ty == IceType_i16) | 241 if (Ty == IceType_i16) |
239 emitOperandSizeOverride(); | 242 emitOperandSizeOverride(); |
| 243 emitAddrSizeOverridePrefix(); |
240 emitRex(Ty, src, dst); | 244 emitRex(Ty, src, dst); |
241 if (isByteSizedType(Ty)) { | 245 if (isByteSizedType(Ty)) { |
242 emitUint8(0x8A); | 246 emitUint8(0x8A); |
243 } else { | 247 } else { |
244 emitUint8(0x8B); | 248 emitUint8(0x8B); |
245 } | 249 } |
246 emitOperand(gprEncoding(dst), src); | 250 emitOperand(gprEncoding(dst), src); |
247 } | 251 } |
248 | 252 |
249 template <class Machine> | 253 template <class Machine> |
250 void AssemblerX86Base<Machine>::mov(Type Ty, | 254 void AssemblerX86Base<Machine>::mov(Type Ty, |
251 const typename Traits::Address &dst, | 255 const typename Traits::Address &dst, |
252 typename Traits::GPRRegister src) { | 256 typename Traits::GPRRegister src) { |
253 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 257 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
254 if (Ty == IceType_i16) | 258 if (Ty == IceType_i16) |
255 emitOperandSizeOverride(); | 259 emitOperandSizeOverride(); |
| 260 emitAddrSizeOverridePrefix(); |
256 emitRex(Ty, dst, src); | 261 emitRex(Ty, dst, src); |
257 if (isByteSizedType(Ty)) { | 262 if (isByteSizedType(Ty)) { |
258 emitUint8(0x88); | 263 emitUint8(0x88); |
259 } else { | 264 } else { |
260 emitUint8(0x89); | 265 emitUint8(0x89); |
261 } | 266 } |
262 emitOperand(gprEncoding(src), dst); | 267 emitOperand(gprEncoding(src), dst); |
263 } | 268 } |
264 | 269 |
265 template <class Machine> | 270 template <class Machine> |
266 void AssemblerX86Base<Machine>::mov(Type Ty, | 271 void AssemblerX86Base<Machine>::mov(Type Ty, |
267 const typename Traits::Address &dst, | 272 const typename Traits::Address &dst, |
268 const Immediate &imm) { | 273 const Immediate &imm) { |
269 assert(Ty != IceType_i64 && "i64 not supported yet."); | 274 assert(Ty != IceType_i64 && "i64 not supported yet."); |
270 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 275 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
271 if (Ty == IceType_i16) | 276 if (Ty == IceType_i16) |
272 emitOperandSizeOverride(); | 277 emitOperandSizeOverride(); |
| 278 emitAddrSizeOverridePrefix(); |
273 emitRex(Ty, dst, RexRegIrrelevant); | 279 emitRex(Ty, dst, RexRegIrrelevant); |
274 if (isByteSizedType(Ty)) { | 280 if (isByteSizedType(Ty)) { |
275 emitUint8(0xC6); | 281 emitUint8(0xC6); |
276 emitOperand(0, dst); | 282 emitOperand(0, dst); |
277 emitUint8(imm.value() & 0xFF); | 283 emitUint8(imm.value() & 0xFF); |
278 } else { | 284 } else { |
279 emitUint8(0xC7); | 285 emitUint8(0xC7); |
280 emitOperand(0, dst); | 286 emitOperand(0, dst); |
281 emitImmediate(Ty, imm); | 287 emitImmediate(Ty, imm); |
282 } | 288 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 if (Traits::Is64Bit && SrcTy == IceType_i32) { | 333 if (Traits::Is64Bit && SrcTy == IceType_i32) { |
328 // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit | 334 // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit |
329 // operand to 64-bit. | 335 // operand to 64-bit. |
330 mov(IceType_i32, dst, src); | 336 mov(IceType_i32, dst, src); |
331 return; | 337 return; |
332 } | 338 } |
333 | 339 |
334 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 340 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
335 bool ByteSized = isByteSizedType(SrcTy); | 341 bool ByteSized = isByteSizedType(SrcTy); |
336 assert(ByteSized || SrcTy == IceType_i16); | 342 assert(ByteSized || SrcTy == IceType_i16); |
| 343 emitAddrSizeOverridePrefix(); |
337 emitRex(SrcTy, src, RexTypeIrrelevant, dst); | 344 emitRex(SrcTy, src, RexTypeIrrelevant, dst); |
338 emitUint8(0x0F); | 345 emitUint8(0x0F); |
339 emitUint8(ByteSized ? 0xB6 : 0xB7); | 346 emitUint8(ByteSized ? 0xB6 : 0xB7); |
340 emitOperand(gprEncoding(dst), src); | 347 emitOperand(gprEncoding(dst), src); |
341 } | 348 } |
342 | 349 |
343 template <class Machine> | 350 template <class Machine> |
344 void AssemblerX86Base<Machine>::movsx(Type SrcTy, | 351 void AssemblerX86Base<Machine>::movsx(Type SrcTy, |
345 typename Traits::GPRRegister dst, | 352 typename Traits::GPRRegister dst, |
346 typename Traits::GPRRegister src) { | 353 typename Traits::GPRRegister src) { |
347 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 354 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
348 bool ByteSized = isByteSizedType(SrcTy); | 355 bool ByteSized = isByteSizedType(SrcTy); |
349 emitRexRB(RexTypeForceRexW, dst, SrcTy, src); | 356 emitRexRB(RexTypeForceRexW, dst, SrcTy, src); |
350 if (ByteSized || SrcTy == IceType_i16) { | 357 if (ByteSized || SrcTy == IceType_i16) { |
351 emitUint8(0x0F); | 358 emitUint8(0x0F); |
352 emitUint8(ByteSized ? 0xBE : 0xBF); | 359 emitUint8(ByteSized ? 0xBE : 0xBF); |
353 } else { | 360 } else { |
354 assert(Traits::Is64Bit && SrcTy == IceType_i32); | 361 assert(Traits::Is64Bit && SrcTy == IceType_i32); |
355 emitUint8(0x63); | 362 emitUint8(0x63); |
356 } | 363 } |
357 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); | 364 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); |
358 } | 365 } |
359 | 366 |
360 template <class Machine> | 367 template <class Machine> |
361 void AssemblerX86Base<Machine>::movsx(Type SrcTy, | 368 void AssemblerX86Base<Machine>::movsx(Type SrcTy, |
362 typename Traits::GPRRegister dst, | 369 typename Traits::GPRRegister dst, |
363 const typename Traits::Address &src) { | 370 const typename Traits::Address &src) { |
364 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 371 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
365 bool ByteSized = isByteSizedType(SrcTy); | 372 bool ByteSized = isByteSizedType(SrcTy); |
| 373 emitAddrSizeOverridePrefix(); |
366 emitRex(SrcTy, src, RexTypeForceRexW, dst); | 374 emitRex(SrcTy, src, RexTypeForceRexW, dst); |
367 if (ByteSized || SrcTy == IceType_i16) { | 375 if (ByteSized || SrcTy == IceType_i16) { |
368 emitUint8(0x0F); | 376 emitUint8(0x0F); |
369 emitUint8(ByteSized ? 0xBE : 0xBF); | 377 emitUint8(ByteSized ? 0xBE : 0xBF); |
370 } else { | 378 } else { |
371 assert(Traits::Is64Bit && SrcTy == IceType_i32); | 379 assert(Traits::Is64Bit && SrcTy == IceType_i32); |
372 emitUint8(0x63); | 380 emitUint8(0x63); |
373 } | 381 } |
374 emitOperand(gprEncoding(dst), src); | 382 emitOperand(gprEncoding(dst), src); |
375 } | 383 } |
376 | 384 |
377 template <class Machine> | 385 template <class Machine> |
378 void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst, | 386 void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst, |
379 const typename Traits::Address &src) { | 387 const typename Traits::Address &src) { |
380 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 388 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
381 assert(Ty == IceType_i16 || Ty == IceType_i32); | 389 assert(Ty == IceType_i16 || Ty == IceType_i32); |
382 if (Ty == IceType_i16) | 390 if (Ty == IceType_i16) |
383 emitOperandSizeOverride(); | 391 emitOperandSizeOverride(); |
| 392 emitAddrSizeOverridePrefix(); |
384 emitRex(Ty, src, dst); | 393 emitRex(Ty, src, dst); |
385 emitUint8(0x8D); | 394 emitUint8(0x8D); |
386 emitOperand(gprEncoding(dst), src); | 395 emitOperand(gprEncoding(dst), src); |
387 } | 396 } |
388 | 397 |
389 template <class Machine> | 398 template <class Machine> |
390 void AssemblerX86Base<Machine>::cmov(Type Ty, | 399 void AssemblerX86Base<Machine>::cmov(Type Ty, |
391 typename Traits::Cond::BrCond cond, | 400 typename Traits::Cond::BrCond cond, |
392 typename Traits::GPRRegister dst, | 401 typename Traits::GPRRegister dst, |
393 typename Traits::GPRRegister src) { | 402 typename Traits::GPRRegister src) { |
(...skipping 11 matching lines...) Expand all Loading... |
405 template <class Machine> | 414 template <class Machine> |
406 void AssemblerX86Base<Machine>::cmov(Type Ty, | 415 void AssemblerX86Base<Machine>::cmov(Type Ty, |
407 typename Traits::Cond::BrCond cond, | 416 typename Traits::Cond::BrCond cond, |
408 typename Traits::GPRRegister dst, | 417 typename Traits::GPRRegister dst, |
409 const typename Traits::Address &src) { | 418 const typename Traits::Address &src) { |
410 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 419 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
411 if (Ty == IceType_i16) | 420 if (Ty == IceType_i16) |
412 emitOperandSizeOverride(); | 421 emitOperandSizeOverride(); |
413 else | 422 else |
414 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); | 423 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); |
| 424 emitAddrSizeOverridePrefix(); |
415 emitRex(Ty, src, dst); | 425 emitRex(Ty, src, dst); |
416 emitUint8(0x0F); | 426 emitUint8(0x0F); |
417 emitUint8(0x40 + cond); | 427 emitUint8(0x40 + cond); |
418 emitOperand(gprEncoding(dst), src); | 428 emitOperand(gprEncoding(dst), src); |
419 } | 429 } |
420 | 430 |
421 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() { | 431 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() { |
422 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 432 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
423 emitUint8(0xF3); | 433 emitUint8(0xF3); |
424 emitUint8(0xA4); | 434 emitUint8(0xA4); |
425 } | 435 } |
426 | 436 |
427 template <class Machine> | 437 template <class Machine> |
428 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, | 438 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, |
429 const typename Traits::Address &src) { | 439 const typename Traits::Address &src) { |
430 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 440 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
431 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 441 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 442 emitAddrSizeOverridePrefix(); |
432 emitRex(RexTypeIrrelevant, src, dst); | 443 emitRex(RexTypeIrrelevant, src, dst); |
433 emitUint8(0x0F); | 444 emitUint8(0x0F); |
434 emitUint8(0x10); | 445 emitUint8(0x10); |
435 emitOperand(gprEncoding(dst), src); | 446 emitOperand(gprEncoding(dst), src); |
436 } | 447 } |
437 | 448 |
438 template <class Machine> | 449 template <class Machine> |
439 void AssemblerX86Base<Machine>::movss(Type Ty, | 450 void AssemblerX86Base<Machine>::movss(Type Ty, |
440 const typename Traits::Address &dst, | 451 const typename Traits::Address &dst, |
441 typename Traits::XmmRegister src) { | 452 typename Traits::XmmRegister src) { |
442 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 453 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
443 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 454 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 455 emitAddrSizeOverridePrefix(); |
444 emitRex(RexTypeIrrelevant, dst, src); | 456 emitRex(RexTypeIrrelevant, dst, src); |
445 emitUint8(0x0F); | 457 emitUint8(0x0F); |
446 emitUint8(0x11); | 458 emitUint8(0x11); |
447 emitOperand(gprEncoding(src), dst); | 459 emitOperand(gprEncoding(src), dst); |
448 } | 460 } |
449 | 461 |
450 template <class Machine> | 462 template <class Machine> |
451 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, | 463 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, |
452 typename Traits::XmmRegister src) { | 464 typename Traits::XmmRegister src) { |
453 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 465 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
(...skipping 15 matching lines...) Expand all Loading... |
469 emitUint8(0x6E); | 481 emitUint8(0x6E); |
470 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); | 482 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); |
471 } | 483 } |
472 | 484 |
473 template <class Machine> | 485 template <class Machine> |
474 void AssemblerX86Base<Machine>::movd(Type SrcTy, | 486 void AssemblerX86Base<Machine>::movd(Type SrcTy, |
475 typename Traits::XmmRegister dst, | 487 typename Traits::XmmRegister dst, |
476 const typename Traits::Address &src) { | 488 const typename Traits::Address &src) { |
477 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 489 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
478 emitUint8(0x66); | 490 emitUint8(0x66); |
| 491 emitAddrSizeOverridePrefix(); |
479 emitRex(SrcTy, src, dst); | 492 emitRex(SrcTy, src, dst); |
480 emitUint8(0x0F); | 493 emitUint8(0x0F); |
481 emitUint8(0x6E); | 494 emitUint8(0x6E); |
482 emitOperand(gprEncoding(dst), src); | 495 emitOperand(gprEncoding(dst), src); |
483 } | 496 } |
484 | 497 |
485 template <class Machine> | 498 template <class Machine> |
486 void AssemblerX86Base<Machine>::movd(Type DestTy, | 499 void AssemblerX86Base<Machine>::movd(Type DestTy, |
487 typename Traits::GPRRegister dst, | 500 typename Traits::GPRRegister dst, |
488 typename Traits::XmmRegister src) { | 501 typename Traits::XmmRegister src) { |
489 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 502 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
490 emitUint8(0x66); | 503 emitUint8(0x66); |
491 emitRexRB(DestTy, src, dst); | 504 emitRexRB(DestTy, src, dst); |
492 emitUint8(0x0F); | 505 emitUint8(0x0F); |
493 emitUint8(0x7E); | 506 emitUint8(0x7E); |
494 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); | 507 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); |
495 } | 508 } |
496 | 509 |
497 template <class Machine> | 510 template <class Machine> |
498 void AssemblerX86Base<Machine>::movd(Type DestTy, | 511 void AssemblerX86Base<Machine>::movd(Type DestTy, |
499 const typename Traits::Address &dst, | 512 const typename Traits::Address &dst, |
500 typename Traits::XmmRegister src) { | 513 typename Traits::XmmRegister src) { |
501 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 514 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
502 emitUint8(0x66); | 515 emitUint8(0x66); |
| 516 emitAddrSizeOverridePrefix(); |
503 emitRex(DestTy, dst, src); | 517 emitRex(DestTy, dst, src); |
504 emitUint8(0x0F); | 518 emitUint8(0x0F); |
505 emitUint8(0x7E); | 519 emitUint8(0x7E); |
506 emitOperand(gprEncoding(src), dst); | 520 emitOperand(gprEncoding(src), dst); |
507 } | 521 } |
508 | 522 |
509 template <class Machine> | 523 template <class Machine> |
510 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, | 524 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, |
511 typename Traits::XmmRegister src) { | 525 typename Traits::XmmRegister src) { |
512 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 526 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
513 emitUint8(0xF3); | 527 emitUint8(0xF3); |
514 emitRexRB(RexTypeIrrelevant, dst, src); | 528 emitRexRB(RexTypeIrrelevant, dst, src); |
515 emitUint8(0x0F); | 529 emitUint8(0x0F); |
516 emitUint8(0x7E); | 530 emitUint8(0x7E); |
517 emitXmmRegisterOperand(dst, src); | 531 emitXmmRegisterOperand(dst, src); |
518 } | 532 } |
519 | 533 |
520 template <class Machine> | 534 template <class Machine> |
521 void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst, | 535 void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst, |
522 typename Traits::XmmRegister src) { | 536 typename Traits::XmmRegister src) { |
523 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 537 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
524 emitUint8(0x66); | 538 emitUint8(0x66); |
| 539 emitAddrSizeOverridePrefix(); |
525 emitRex(RexTypeIrrelevant, dst, src); | 540 emitRex(RexTypeIrrelevant, dst, src); |
526 emitUint8(0x0F); | 541 emitUint8(0x0F); |
527 emitUint8(0xD6); | 542 emitUint8(0xD6); |
528 emitOperand(gprEncoding(src), dst); | 543 emitOperand(gprEncoding(src), dst); |
529 } | 544 } |
530 | 545 |
531 template <class Machine> | 546 template <class Machine> |
532 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, | 547 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, |
533 const typename Traits::Address &src) { | 548 const typename Traits::Address &src) { |
534 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 549 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
535 emitUint8(0xF3); | 550 emitUint8(0xF3); |
| 551 emitAddrSizeOverridePrefix(); |
536 emitRex(RexTypeIrrelevant, src, dst); | 552 emitRex(RexTypeIrrelevant, src, dst); |
537 emitUint8(0x0F); | 553 emitUint8(0x0F); |
538 emitUint8(0x7E); | 554 emitUint8(0x7E); |
539 emitOperand(gprEncoding(dst), src); | 555 emitOperand(gprEncoding(dst), src); |
540 } | 556 } |
541 | 557 |
542 template <class Machine> | 558 template <class Machine> |
543 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, | 559 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, |
544 typename Traits::XmmRegister src) { | 560 typename Traits::XmmRegister src) { |
545 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 561 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
546 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 562 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
547 emitRexRB(RexTypeIrrelevant, dst, src); | 563 emitRexRB(RexTypeIrrelevant, dst, src); |
548 emitUint8(0x0F); | 564 emitUint8(0x0F); |
549 emitUint8(0x58); | 565 emitUint8(0x58); |
550 emitXmmRegisterOperand(dst, src); | 566 emitXmmRegisterOperand(dst, src); |
551 } | 567 } |
552 | 568 |
553 template <class Machine> | 569 template <class Machine> |
554 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, | 570 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, |
555 const typename Traits::Address &src) { | 571 const typename Traits::Address &src) { |
556 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 572 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
557 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 573 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 574 emitAddrSizeOverridePrefix(); |
558 emitRex(RexTypeIrrelevant, src, dst); | 575 emitRex(RexTypeIrrelevant, src, dst); |
559 emitUint8(0x0F); | 576 emitUint8(0x0F); |
560 emitUint8(0x58); | 577 emitUint8(0x58); |
561 emitOperand(gprEncoding(dst), src); | 578 emitOperand(gprEncoding(dst), src); |
562 } | 579 } |
563 | 580 |
564 template <class Machine> | 581 template <class Machine> |
565 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, | 582 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, |
566 typename Traits::XmmRegister src) { | 583 typename Traits::XmmRegister src) { |
567 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 584 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
568 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 585 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
569 emitRexRB(RexTypeIrrelevant, dst, src); | 586 emitRexRB(RexTypeIrrelevant, dst, src); |
570 emitUint8(0x0F); | 587 emitUint8(0x0F); |
571 emitUint8(0x5C); | 588 emitUint8(0x5C); |
572 emitXmmRegisterOperand(dst, src); | 589 emitXmmRegisterOperand(dst, src); |
573 } | 590 } |
574 | 591 |
575 template <class Machine> | 592 template <class Machine> |
576 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, | 593 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, |
577 const typename Traits::Address &src) { | 594 const typename Traits::Address &src) { |
578 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 595 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
579 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 596 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 597 emitAddrSizeOverridePrefix(); |
580 emitRex(RexTypeIrrelevant, src, dst); | 598 emitRex(RexTypeIrrelevant, src, dst); |
581 emitUint8(0x0F); | 599 emitUint8(0x0F); |
582 emitUint8(0x5C); | 600 emitUint8(0x5C); |
583 emitOperand(gprEncoding(dst), src); | 601 emitOperand(gprEncoding(dst), src); |
584 } | 602 } |
585 | 603 |
586 template <class Machine> | 604 template <class Machine> |
587 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, | 605 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, |
588 typename Traits::XmmRegister src) { | 606 typename Traits::XmmRegister src) { |
589 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 607 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
590 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 608 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
591 emitRexRB(RexTypeIrrelevant, dst, src); | 609 emitRexRB(RexTypeIrrelevant, dst, src); |
592 emitUint8(0x0F); | 610 emitUint8(0x0F); |
593 emitUint8(0x59); | 611 emitUint8(0x59); |
594 emitXmmRegisterOperand(dst, src); | 612 emitXmmRegisterOperand(dst, src); |
595 } | 613 } |
596 | 614 |
597 template <class Machine> | 615 template <class Machine> |
598 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, | 616 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, |
599 const typename Traits::Address &src) { | 617 const typename Traits::Address &src) { |
600 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 618 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
601 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 619 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 620 emitAddrSizeOverridePrefix(); |
602 emitRex(RexTypeIrrelevant, src, dst); | 621 emitRex(RexTypeIrrelevant, src, dst); |
603 emitUint8(0x0F); | 622 emitUint8(0x0F); |
604 emitUint8(0x59); | 623 emitUint8(0x59); |
605 emitOperand(gprEncoding(dst), src); | 624 emitOperand(gprEncoding(dst), src); |
606 } | 625 } |
607 | 626 |
608 template <class Machine> | 627 template <class Machine> |
609 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, | 628 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, |
610 typename Traits::XmmRegister src) { | 629 typename Traits::XmmRegister src) { |
611 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 630 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
612 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 631 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
613 emitRexRB(RexTypeIrrelevant, dst, src); | 632 emitRexRB(RexTypeIrrelevant, dst, src); |
614 emitUint8(0x0F); | 633 emitUint8(0x0F); |
615 emitUint8(0x5E); | 634 emitUint8(0x5E); |
616 emitXmmRegisterOperand(dst, src); | 635 emitXmmRegisterOperand(dst, src); |
617 } | 636 } |
618 | 637 |
619 template <class Machine> | 638 template <class Machine> |
620 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, | 639 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, |
621 const typename Traits::Address &src) { | 640 const typename Traits::Address &src) { |
622 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 641 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
623 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 642 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 643 emitAddrSizeOverridePrefix(); |
624 emitRex(RexTypeIrrelevant, src, dst); | 644 emitRex(RexTypeIrrelevant, src, dst); |
625 emitUint8(0x0F); | 645 emitUint8(0x0F); |
626 emitUint8(0x5E); | 646 emitUint8(0x5E); |
627 emitOperand(gprEncoding(dst), src); | 647 emitOperand(gprEncoding(dst), src); |
628 } | 648 } |
629 | 649 |
630 template <class Machine> | 650 template <class Machine> |
631 template <typename T, typename> | 651 template <typename T, typename> |
632 void AssemblerX86Base<Machine>::fld(Type Ty, const typename T::Address &src) { | 652 void AssemblerX86Base<Machine>::fld(Type Ty, const typename T::Address &src) { |
633 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 653 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 654 emitAddrSizeOverridePrefix(); |
634 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); | 655 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); |
635 emitOperand(0, src); | 656 emitOperand(0, src); |
636 } | 657 } |
637 | 658 |
638 template <class Machine> | 659 template <class Machine> |
639 template <typename T, typename> | 660 template <typename T, typename> |
640 void AssemblerX86Base<Machine>::fstp(Type Ty, const typename T::Address &dst) { | 661 void AssemblerX86Base<Machine>::fstp(Type Ty, const typename T::Address &dst) { |
641 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 662 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 663 emitAddrSizeOverridePrefix(); |
642 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); | 664 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); |
643 emitOperand(3, dst); | 665 emitOperand(3, dst); |
644 } | 666 } |
645 | 667 |
646 template <class Machine> | 668 template <class Machine> |
647 template <typename T, typename> | 669 template <typename T, typename> |
648 void AssemblerX86Base<Machine>::fstp(typename T::X87STRegister st) { | 670 void AssemblerX86Base<Machine>::fstp(typename T::X87STRegister st) { |
649 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 671 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
650 emitUint8(0xDD); | 672 emitUint8(0xDD); |
651 emitUint8(0xD8 + st); | 673 emitUint8(0xD8 + st); |
(...skipping 16 matching lines...) Expand all Loading... |
668 emitRexRB(RexTypeIrrelevant, dst, src); | 690 emitRexRB(RexTypeIrrelevant, dst, src); |
669 emitUint8(0x0F); | 691 emitUint8(0x0F); |
670 emitUint8(0x10); | 692 emitUint8(0x10); |
671 emitXmmRegisterOperand(dst, src); | 693 emitXmmRegisterOperand(dst, src); |
672 } | 694 } |
673 | 695 |
674 template <class Machine> | 696 template <class Machine> |
675 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst, | 697 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst, |
676 const typename Traits::Address &src) { | 698 const typename Traits::Address &src) { |
677 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 699 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 700 emitAddrSizeOverridePrefix(); |
678 emitRex(RexTypeIrrelevant, src, dst); | 701 emitRex(RexTypeIrrelevant, src, dst); |
679 emitUint8(0x0F); | 702 emitUint8(0x0F); |
680 emitUint8(0x10); | 703 emitUint8(0x10); |
681 emitOperand(gprEncoding(dst), src); | 704 emitOperand(gprEncoding(dst), src); |
682 } | 705 } |
683 | 706 |
684 template <class Machine> | 707 template <class Machine> |
685 void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst, | 708 void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst, |
686 typename Traits::XmmRegister src) { | 709 typename Traits::XmmRegister src) { |
687 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 710 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 711 emitAddrSizeOverridePrefix(); |
688 emitRex(RexTypeIrrelevant, dst, src); | 712 emitRex(RexTypeIrrelevant, dst, src); |
689 emitUint8(0x0F); | 713 emitUint8(0x0F); |
690 emitUint8(0x11); | 714 emitUint8(0x11); |
691 emitOperand(gprEncoding(src), dst); | 715 emitOperand(gprEncoding(src), dst); |
692 } | 716 } |
693 | 717 |
694 template <class Machine> | 718 template <class Machine> |
695 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, | 719 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, |
696 typename Traits::XmmRegister src) { | 720 typename Traits::XmmRegister src) { |
697 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 721 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
698 emitUint8(0x66); | 722 emitUint8(0x66); |
699 emitRexRB(RexTypeIrrelevant, dst, src); | 723 emitRexRB(RexTypeIrrelevant, dst, src); |
700 emitUint8(0x0F); | 724 emitUint8(0x0F); |
701 if (isByteSizedArithType(Ty)) { | 725 if (isByteSizedArithType(Ty)) { |
702 emitUint8(0xFC); | 726 emitUint8(0xFC); |
703 } else if (Ty == IceType_i16) { | 727 } else if (Ty == IceType_i16) { |
704 emitUint8(0xFD); | 728 emitUint8(0xFD); |
705 } else { | 729 } else { |
706 emitUint8(0xFE); | 730 emitUint8(0xFE); |
707 } | 731 } |
708 emitXmmRegisterOperand(dst, src); | 732 emitXmmRegisterOperand(dst, src); |
709 } | 733 } |
710 | 734 |
711 template <class Machine> | 735 template <class Machine> |
712 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, | 736 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, |
713 const typename Traits::Address &src) { | 737 const typename Traits::Address &src) { |
714 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 738 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
715 emitUint8(0x66); | 739 emitUint8(0x66); |
| 740 emitAddrSizeOverridePrefix(); |
716 emitRex(RexTypeIrrelevant, src, dst); | 741 emitRex(RexTypeIrrelevant, src, dst); |
717 emitUint8(0x0F); | 742 emitUint8(0x0F); |
718 if (isByteSizedArithType(Ty)) { | 743 if (isByteSizedArithType(Ty)) { |
719 emitUint8(0xFC); | 744 emitUint8(0xFC); |
720 } else if (Ty == IceType_i16) { | 745 } else if (Ty == IceType_i16) { |
721 emitUint8(0xFD); | 746 emitUint8(0xFD); |
722 } else { | 747 } else { |
723 emitUint8(0xFE); | 748 emitUint8(0xFE); |
724 } | 749 } |
725 emitOperand(gprEncoding(dst), src); | 750 emitOperand(gprEncoding(dst), src); |
(...skipping 10 matching lines...) Expand all Loading... |
736 emitUint8(0xDB); | 761 emitUint8(0xDB); |
737 emitXmmRegisterOperand(dst, src); | 762 emitXmmRegisterOperand(dst, src); |
738 } | 763 } |
739 | 764 |
740 template <class Machine> | 765 template <class Machine> |
741 void AssemblerX86Base<Machine>::pand(Type /* Ty */, | 766 void AssemblerX86Base<Machine>::pand(Type /* Ty */, |
742 typename Traits::XmmRegister dst, | 767 typename Traits::XmmRegister dst, |
743 const typename Traits::Address &src) { | 768 const typename Traits::Address &src) { |
744 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 769 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
745 emitUint8(0x66); | 770 emitUint8(0x66); |
| 771 emitAddrSizeOverridePrefix(); |
746 emitRex(RexTypeIrrelevant, src, dst); | 772 emitRex(RexTypeIrrelevant, src, dst); |
747 emitUint8(0x0F); | 773 emitUint8(0x0F); |
748 emitUint8(0xDB); | 774 emitUint8(0xDB); |
749 emitOperand(gprEncoding(dst), src); | 775 emitOperand(gprEncoding(dst), src); |
750 } | 776 } |
751 | 777 |
752 template <class Machine> | 778 template <class Machine> |
753 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, | 779 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, |
754 typename Traits::XmmRegister dst, | 780 typename Traits::XmmRegister dst, |
755 typename Traits::XmmRegister src) { | 781 typename Traits::XmmRegister src) { |
756 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 782 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
757 emitUint8(0x66); | 783 emitUint8(0x66); |
758 emitRexRB(RexTypeIrrelevant, dst, src); | 784 emitRexRB(RexTypeIrrelevant, dst, src); |
759 emitUint8(0x0F); | 785 emitUint8(0x0F); |
760 emitUint8(0xDF); | 786 emitUint8(0xDF); |
761 emitXmmRegisterOperand(dst, src); | 787 emitXmmRegisterOperand(dst, src); |
762 } | 788 } |
763 | 789 |
764 template <class Machine> | 790 template <class Machine> |
765 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, | 791 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, |
766 typename Traits::XmmRegister dst, | 792 typename Traits::XmmRegister dst, |
767 const typename Traits::Address &src) { | 793 const typename Traits::Address &src) { |
768 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 794 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
769 emitUint8(0x66); | 795 emitUint8(0x66); |
| 796 emitAddrSizeOverridePrefix(); |
770 emitRex(RexTypeIrrelevant, src, dst); | 797 emitRex(RexTypeIrrelevant, src, dst); |
771 emitUint8(0x0F); | 798 emitUint8(0x0F); |
772 emitUint8(0xDF); | 799 emitUint8(0xDF); |
773 emitOperand(gprEncoding(dst), src); | 800 emitOperand(gprEncoding(dst), src); |
774 } | 801 } |
775 | 802 |
776 template <class Machine> | 803 template <class Machine> |
777 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, | 804 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, |
778 typename Traits::XmmRegister src) { | 805 typename Traits::XmmRegister src) { |
779 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 806 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
780 emitUint8(0x66); | 807 emitUint8(0x66); |
781 emitRexRB(RexTypeIrrelevant, dst, src); | 808 emitRexRB(RexTypeIrrelevant, dst, src); |
782 emitUint8(0x0F); | 809 emitUint8(0x0F); |
783 if (Ty == IceType_i16) { | 810 if (Ty == IceType_i16) { |
784 emitUint8(0xD5); | 811 emitUint8(0xD5); |
785 } else { | 812 } else { |
786 assert(Ty == IceType_i32); | 813 assert(Ty == IceType_i32); |
787 emitUint8(0x38); | 814 emitUint8(0x38); |
788 emitUint8(0x40); | 815 emitUint8(0x40); |
789 } | 816 } |
790 emitXmmRegisterOperand(dst, src); | 817 emitXmmRegisterOperand(dst, src); |
791 } | 818 } |
792 | 819 |
793 template <class Machine> | 820 template <class Machine> |
794 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, | 821 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, |
795 const typename Traits::Address &src) { | 822 const typename Traits::Address &src) { |
796 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 823 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
797 emitUint8(0x66); | 824 emitUint8(0x66); |
| 825 emitAddrSizeOverridePrefix(); |
798 emitRex(RexTypeIrrelevant, src, dst); | 826 emitRex(RexTypeIrrelevant, src, dst); |
799 emitUint8(0x0F); | 827 emitUint8(0x0F); |
800 if (Ty == IceType_i16) { | 828 if (Ty == IceType_i16) { |
801 emitUint8(0xD5); | 829 emitUint8(0xD5); |
802 } else { | 830 } else { |
803 assert(Ty == IceType_i32); | 831 assert(Ty == IceType_i32); |
804 emitUint8(0x38); | 832 emitUint8(0x38); |
805 emitUint8(0x40); | 833 emitUint8(0x40); |
806 } | 834 } |
807 emitOperand(gprEncoding(dst), src); | 835 emitOperand(gprEncoding(dst), src); |
(...skipping 10 matching lines...) Expand all Loading... |
818 emitUint8(0xF4); | 846 emitUint8(0xF4); |
819 emitXmmRegisterOperand(dst, src); | 847 emitXmmRegisterOperand(dst, src); |
820 } | 848 } |
821 | 849 |
822 template <class Machine> | 850 template <class Machine> |
823 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */, | 851 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */, |
824 typename Traits::XmmRegister dst, | 852 typename Traits::XmmRegister dst, |
825 const typename Traits::Address &src) { | 853 const typename Traits::Address &src) { |
826 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 854 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
827 emitUint8(0x66); | 855 emitUint8(0x66); |
| 856 emitAddrSizeOverridePrefix(); |
828 emitRex(RexTypeIrrelevant, src, dst); | 857 emitRex(RexTypeIrrelevant, src, dst); |
829 emitUint8(0x0F); | 858 emitUint8(0x0F); |
830 emitUint8(0xF4); | 859 emitUint8(0xF4); |
831 emitOperand(gprEncoding(dst), src); | 860 emitOperand(gprEncoding(dst), src); |
832 } | 861 } |
833 | 862 |
834 template <class Machine> | 863 template <class Machine> |
835 void AssemblerX86Base<Machine>::por(Type /* Ty */, | 864 void AssemblerX86Base<Machine>::por(Type /* Ty */, |
836 typename Traits::XmmRegister dst, | 865 typename Traits::XmmRegister dst, |
837 typename Traits::XmmRegister src) { | 866 typename Traits::XmmRegister src) { |
838 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 867 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
839 emitUint8(0x66); | 868 emitUint8(0x66); |
840 emitRexRB(RexTypeIrrelevant, dst, src); | 869 emitRexRB(RexTypeIrrelevant, dst, src); |
841 emitUint8(0x0F); | 870 emitUint8(0x0F); |
842 emitUint8(0xEB); | 871 emitUint8(0xEB); |
843 emitXmmRegisterOperand(dst, src); | 872 emitXmmRegisterOperand(dst, src); |
844 } | 873 } |
845 | 874 |
846 template <class Machine> | 875 template <class Machine> |
847 void AssemblerX86Base<Machine>::por(Type /* Ty */, | 876 void AssemblerX86Base<Machine>::por(Type /* Ty */, |
848 typename Traits::XmmRegister dst, | 877 typename Traits::XmmRegister dst, |
849 const typename Traits::Address &src) { | 878 const typename Traits::Address &src) { |
850 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 879 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
851 emitUint8(0x66); | 880 emitUint8(0x66); |
| 881 emitAddrSizeOverridePrefix(); |
852 emitRex(RexTypeIrrelevant, src, dst); | 882 emitRex(RexTypeIrrelevant, src, dst); |
853 emitUint8(0x0F); | 883 emitUint8(0x0F); |
854 emitUint8(0xEB); | 884 emitUint8(0xEB); |
855 emitOperand(gprEncoding(dst), src); | 885 emitOperand(gprEncoding(dst), src); |
856 } | 886 } |
857 | 887 |
858 template <class Machine> | 888 template <class Machine> |
859 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, | 889 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, |
860 typename Traits::XmmRegister src) { | 890 typename Traits::XmmRegister src) { |
861 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 891 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
862 emitUint8(0x66); | 892 emitUint8(0x66); |
863 emitRexRB(RexTypeIrrelevant, dst, src); | 893 emitRexRB(RexTypeIrrelevant, dst, src); |
864 emitUint8(0x0F); | 894 emitUint8(0x0F); |
865 if (isByteSizedArithType(Ty)) { | 895 if (isByteSizedArithType(Ty)) { |
866 emitUint8(0xF8); | 896 emitUint8(0xF8); |
867 } else if (Ty == IceType_i16) { | 897 } else if (Ty == IceType_i16) { |
868 emitUint8(0xF9); | 898 emitUint8(0xF9); |
869 } else { | 899 } else { |
870 emitUint8(0xFA); | 900 emitUint8(0xFA); |
871 } | 901 } |
872 emitXmmRegisterOperand(dst, src); | 902 emitXmmRegisterOperand(dst, src); |
873 } | 903 } |
874 | 904 |
875 template <class Machine> | 905 template <class Machine> |
876 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, | 906 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, |
877 const typename Traits::Address &src) { | 907 const typename Traits::Address &src) { |
878 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 908 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
879 emitUint8(0x66); | 909 emitUint8(0x66); |
| 910 emitAddrSizeOverridePrefix(); |
880 emitRex(RexTypeIrrelevant, src, dst); | 911 emitRex(RexTypeIrrelevant, src, dst); |
881 emitUint8(0x0F); | 912 emitUint8(0x0F); |
882 if (isByteSizedArithType(Ty)) { | 913 if (isByteSizedArithType(Ty)) { |
883 emitUint8(0xF8); | 914 emitUint8(0xF8); |
884 } else if (Ty == IceType_i16) { | 915 } else if (Ty == IceType_i16) { |
885 emitUint8(0xF9); | 916 emitUint8(0xF9); |
886 } else { | 917 } else { |
887 emitUint8(0xFA); | 918 emitUint8(0xFA); |
888 } | 919 } |
889 emitOperand(gprEncoding(dst), src); | 920 emitOperand(gprEncoding(dst), src); |
(...skipping 10 matching lines...) Expand all Loading... |
900 emitUint8(0xEF); | 931 emitUint8(0xEF); |
901 emitXmmRegisterOperand(dst, src); | 932 emitXmmRegisterOperand(dst, src); |
902 } | 933 } |
903 | 934 |
904 template <class Machine> | 935 template <class Machine> |
905 void AssemblerX86Base<Machine>::pxor(Type /* Ty */, | 936 void AssemblerX86Base<Machine>::pxor(Type /* Ty */, |
906 typename Traits::XmmRegister dst, | 937 typename Traits::XmmRegister dst, |
907 const typename Traits::Address &src) { | 938 const typename Traits::Address &src) { |
908 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 939 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
909 emitUint8(0x66); | 940 emitUint8(0x66); |
| 941 emitAddrSizeOverridePrefix(); |
910 emitRex(RexTypeIrrelevant, src, dst); | 942 emitRex(RexTypeIrrelevant, src, dst); |
911 emitUint8(0x0F); | 943 emitUint8(0x0F); |
912 emitUint8(0xEF); | 944 emitUint8(0xEF); |
913 emitOperand(gprEncoding(dst), src); | 945 emitOperand(gprEncoding(dst), src); |
914 } | 946 } |
915 | 947 |
916 template <class Machine> | 948 template <class Machine> |
917 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, | 949 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, |
918 typename Traits::XmmRegister src) { | 950 typename Traits::XmmRegister src) { |
919 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 951 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
920 emitUint8(0x66); | 952 emitUint8(0x66); |
921 emitRexRB(RexTypeIrrelevant, dst, src); | 953 emitRexRB(RexTypeIrrelevant, dst, src); |
922 emitUint8(0x0F); | 954 emitUint8(0x0F); |
923 if (Ty == IceType_i16) { | 955 if (Ty == IceType_i16) { |
924 emitUint8(0xF1); | 956 emitUint8(0xF1); |
925 } else { | 957 } else { |
926 assert(Ty == IceType_i32); | 958 assert(Ty == IceType_i32); |
927 emitUint8(0xF2); | 959 emitUint8(0xF2); |
928 } | 960 } |
929 emitXmmRegisterOperand(dst, src); | 961 emitXmmRegisterOperand(dst, src); |
930 } | 962 } |
931 | 963 |
932 template <class Machine> | 964 template <class Machine> |
933 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, | 965 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, |
934 const typename Traits::Address &src) { | 966 const typename Traits::Address &src) { |
935 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 967 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
936 emitUint8(0x66); | 968 emitUint8(0x66); |
| 969 emitAddrSizeOverridePrefix(); |
937 emitRex(RexTypeIrrelevant, src, dst); | 970 emitRex(RexTypeIrrelevant, src, dst); |
938 emitUint8(0x0F); | 971 emitUint8(0x0F); |
939 if (Ty == IceType_i16) { | 972 if (Ty == IceType_i16) { |
940 emitUint8(0xF1); | 973 emitUint8(0xF1); |
941 } else { | 974 } else { |
942 assert(Ty == IceType_i32); | 975 assert(Ty == IceType_i32); |
943 emitUint8(0xF2); | 976 emitUint8(0xF2); |
944 } | 977 } |
945 emitOperand(gprEncoding(dst), src); | 978 emitOperand(gprEncoding(dst), src); |
946 } | 979 } |
(...skipping 30 matching lines...) Expand all Loading... |
977 emitUint8(0xE2); | 1010 emitUint8(0xE2); |
978 } | 1011 } |
979 emitXmmRegisterOperand(dst, src); | 1012 emitXmmRegisterOperand(dst, src); |
980 } | 1013 } |
981 | 1014 |
982 template <class Machine> | 1015 template <class Machine> |
983 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, | 1016 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, |
984 const typename Traits::Address &src) { | 1017 const typename Traits::Address &src) { |
985 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1018 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
986 emitUint8(0x66); | 1019 emitUint8(0x66); |
| 1020 emitAddrSizeOverridePrefix(); |
987 emitRex(RexTypeIrrelevant, src, dst); | 1021 emitRex(RexTypeIrrelevant, src, dst); |
988 emitUint8(0x0F); | 1022 emitUint8(0x0F); |
989 if (Ty == IceType_i16) { | 1023 if (Ty == IceType_i16) { |
990 emitUint8(0xE1); | 1024 emitUint8(0xE1); |
991 } else { | 1025 } else { |
992 assert(Ty == IceType_i32); | 1026 assert(Ty == IceType_i32); |
993 emitUint8(0xE2); | 1027 emitUint8(0xE2); |
994 } | 1028 } |
995 emitOperand(gprEncoding(dst), src); | 1029 emitOperand(gprEncoding(dst), src); |
996 } | 1030 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1029 emitUint8(0xD2); | 1063 emitUint8(0xD2); |
1030 } | 1064 } |
1031 emitXmmRegisterOperand(dst, src); | 1065 emitXmmRegisterOperand(dst, src); |
1032 } | 1066 } |
1033 | 1067 |
1034 template <class Machine> | 1068 template <class Machine> |
1035 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, | 1069 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, |
1036 const typename Traits::Address &src) { | 1070 const typename Traits::Address &src) { |
1037 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1071 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1038 emitUint8(0x66); | 1072 emitUint8(0x66); |
| 1073 emitAddrSizeOverridePrefix(); |
1039 emitRex(RexTypeIrrelevant, src, dst); | 1074 emitRex(RexTypeIrrelevant, src, dst); |
1040 emitUint8(0x0F); | 1075 emitUint8(0x0F); |
1041 if (Ty == IceType_i16) { | 1076 if (Ty == IceType_i16) { |
1042 emitUint8(0xD1); | 1077 emitUint8(0xD1); |
1043 } else if (Ty == IceType_f64) { | 1078 } else if (Ty == IceType_f64) { |
1044 emitUint8(0xD3); | 1079 emitUint8(0xD3); |
1045 } else { | 1080 } else { |
1046 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); | 1081 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); |
1047 emitUint8(0xD2); | 1082 emitUint8(0xD2); |
1048 } | 1083 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1081 emitUint8(0x0F); | 1116 emitUint8(0x0F); |
1082 emitUint8(0x58); | 1117 emitUint8(0x58); |
1083 emitXmmRegisterOperand(dst, src); | 1118 emitXmmRegisterOperand(dst, src); |
1084 } | 1119 } |
1085 | 1120 |
1086 template <class Machine> | 1121 template <class Machine> |
1087 void AssemblerX86Base<Machine>::addps(Type /* Ty */, | 1122 void AssemblerX86Base<Machine>::addps(Type /* Ty */, |
1088 typename Traits::XmmRegister dst, | 1123 typename Traits::XmmRegister dst, |
1089 const typename Traits::Address &src) { | 1124 const typename Traits::Address &src) { |
1090 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1125 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1126 emitAddrSizeOverridePrefix(); |
1091 emitRex(RexTypeIrrelevant, src, dst); | 1127 emitRex(RexTypeIrrelevant, src, dst); |
1092 emitUint8(0x0F); | 1128 emitUint8(0x0F); |
1093 emitUint8(0x58); | 1129 emitUint8(0x58); |
1094 emitOperand(gprEncoding(dst), src); | 1130 emitOperand(gprEncoding(dst), src); |
1095 } | 1131 } |
1096 | 1132 |
1097 template <class Machine> | 1133 template <class Machine> |
1098 void AssemblerX86Base<Machine>::subps(Type /* Ty */, | 1134 void AssemblerX86Base<Machine>::subps(Type /* Ty */, |
1099 typename Traits::XmmRegister dst, | 1135 typename Traits::XmmRegister dst, |
1100 typename Traits::XmmRegister src) { | 1136 typename Traits::XmmRegister src) { |
1101 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1137 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1102 emitRexRB(RexTypeIrrelevant, dst, src); | 1138 emitRexRB(RexTypeIrrelevant, dst, src); |
1103 emitUint8(0x0F); | 1139 emitUint8(0x0F); |
1104 emitUint8(0x5C); | 1140 emitUint8(0x5C); |
1105 emitXmmRegisterOperand(dst, src); | 1141 emitXmmRegisterOperand(dst, src); |
1106 } | 1142 } |
1107 | 1143 |
1108 template <class Machine> | 1144 template <class Machine> |
1109 void AssemblerX86Base<Machine>::subps(Type /* Ty */, | 1145 void AssemblerX86Base<Machine>::subps(Type /* Ty */, |
1110 typename Traits::XmmRegister dst, | 1146 typename Traits::XmmRegister dst, |
1111 const typename Traits::Address &src) { | 1147 const typename Traits::Address &src) { |
1112 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1148 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1149 emitAddrSizeOverridePrefix(); |
1113 emitRex(RexTypeIrrelevant, src, dst); | 1150 emitRex(RexTypeIrrelevant, src, dst); |
1114 emitUint8(0x0F); | 1151 emitUint8(0x0F); |
1115 emitUint8(0x5C); | 1152 emitUint8(0x5C); |
1116 emitOperand(gprEncoding(dst), src); | 1153 emitOperand(gprEncoding(dst), src); |
1117 } | 1154 } |
1118 | 1155 |
1119 template <class Machine> | 1156 template <class Machine> |
1120 void AssemblerX86Base<Machine>::divps(Type /* Ty */, | 1157 void AssemblerX86Base<Machine>::divps(Type /* Ty */, |
1121 typename Traits::XmmRegister dst, | 1158 typename Traits::XmmRegister dst, |
1122 typename Traits::XmmRegister src) { | 1159 typename Traits::XmmRegister src) { |
1123 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1160 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1124 emitRexRB(RexTypeIrrelevant, dst, src); | 1161 emitRexRB(RexTypeIrrelevant, dst, src); |
1125 emitUint8(0x0F); | 1162 emitUint8(0x0F); |
1126 emitUint8(0x5E); | 1163 emitUint8(0x5E); |
1127 emitXmmRegisterOperand(dst, src); | 1164 emitXmmRegisterOperand(dst, src); |
1128 } | 1165 } |
1129 | 1166 |
1130 template <class Machine> | 1167 template <class Machine> |
1131 void AssemblerX86Base<Machine>::divps(Type /* Ty */, | 1168 void AssemblerX86Base<Machine>::divps(Type /* Ty */, |
1132 typename Traits::XmmRegister dst, | 1169 typename Traits::XmmRegister dst, |
1133 const typename Traits::Address &src) { | 1170 const typename Traits::Address &src) { |
1134 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1171 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1172 emitAddrSizeOverridePrefix(); |
1135 emitRex(RexTypeIrrelevant, src, dst); | 1173 emitRex(RexTypeIrrelevant, src, dst); |
1136 emitUint8(0x0F); | 1174 emitUint8(0x0F); |
1137 emitUint8(0x5E); | 1175 emitUint8(0x5E); |
1138 emitOperand(gprEncoding(dst), src); | 1176 emitOperand(gprEncoding(dst), src); |
1139 } | 1177 } |
1140 | 1178 |
1141 template <class Machine> | 1179 template <class Machine> |
1142 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, | 1180 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, |
1143 typename Traits::XmmRegister dst, | 1181 typename Traits::XmmRegister dst, |
1144 typename Traits::XmmRegister src) { | 1182 typename Traits::XmmRegister src) { |
1145 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1183 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1146 emitRexRB(RexTypeIrrelevant, dst, src); | 1184 emitRexRB(RexTypeIrrelevant, dst, src); |
1147 emitUint8(0x0F); | 1185 emitUint8(0x0F); |
1148 emitUint8(0x59); | 1186 emitUint8(0x59); |
1149 emitXmmRegisterOperand(dst, src); | 1187 emitXmmRegisterOperand(dst, src); |
1150 } | 1188 } |
1151 | 1189 |
1152 template <class Machine> | 1190 template <class Machine> |
1153 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, | 1191 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, |
1154 typename Traits::XmmRegister dst, | 1192 typename Traits::XmmRegister dst, |
1155 const typename Traits::Address &src) { | 1193 const typename Traits::Address &src) { |
1156 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1194 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1195 emitAddrSizeOverridePrefix(); |
1157 emitRex(RexTypeIrrelevant, src, dst); | 1196 emitRex(RexTypeIrrelevant, src, dst); |
1158 emitUint8(0x0F); | 1197 emitUint8(0x0F); |
1159 emitUint8(0x59); | 1198 emitUint8(0x59); |
1160 emitOperand(gprEncoding(dst), src); | 1199 emitOperand(gprEncoding(dst), src); |
1161 } | 1200 } |
1162 | 1201 |
1163 template <class Machine> | 1202 template <class Machine> |
1164 void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst, | 1203 void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst, |
1165 typename Traits::XmmRegister src) { | 1204 typename Traits::XmmRegister src) { |
1166 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1205 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1167 if (!isFloat32Asserting32Or64(Ty)) | 1206 if (!isFloat32Asserting32Or64(Ty)) |
1168 emitUint8(0x66); | 1207 emitUint8(0x66); |
1169 emitRexRB(RexTypeIrrelevant, dst, src); | 1208 emitRexRB(RexTypeIrrelevant, dst, src); |
1170 emitUint8(0x0F); | 1209 emitUint8(0x0F); |
1171 emitUint8(0x5D); | 1210 emitUint8(0x5D); |
1172 emitXmmRegisterOperand(dst, src); | 1211 emitXmmRegisterOperand(dst, src); |
1173 } | 1212 } |
1174 | 1213 |
1175 template <class Machine> | 1214 template <class Machine> |
1176 void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst, | 1215 void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst, |
1177 const typename Traits::Address &src) { | 1216 const typename Traits::Address &src) { |
1178 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1217 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1179 if (!isFloat32Asserting32Or64(Ty)) | 1218 if (!isFloat32Asserting32Or64(Ty)) |
1180 emitUint8(0x66); | 1219 emitUint8(0x66); |
| 1220 emitAddrSizeOverridePrefix(); |
1181 emitRex(RexTypeIrrelevant, src, dst); | 1221 emitRex(RexTypeIrrelevant, src, dst); |
1182 emitUint8(0x0F); | 1222 emitUint8(0x0F); |
1183 emitUint8(0x5D); | 1223 emitUint8(0x5D); |
1184 emitOperand(gprEncoding(dst), src); | 1224 emitOperand(gprEncoding(dst), src); |
1185 } | 1225 } |
1186 | 1226 |
1187 template <class Machine> | 1227 template <class Machine> |
1188 void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst, | 1228 void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst, |
1189 typename Traits::XmmRegister src) { | 1229 typename Traits::XmmRegister src) { |
1190 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1230 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1191 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 1231 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
1192 emitRexRB(RexTypeIrrelevant, dst, src); | 1232 emitRexRB(RexTypeIrrelevant, dst, src); |
1193 emitUint8(0x0F); | 1233 emitUint8(0x0F); |
1194 emitUint8(0x5D); | 1234 emitUint8(0x5D); |
1195 emitXmmRegisterOperand(dst, src); | 1235 emitXmmRegisterOperand(dst, src); |
1196 } | 1236 } |
1197 | 1237 |
1198 template <class Machine> | 1238 template <class Machine> |
1199 void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst, | 1239 void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst, |
1200 const typename Traits::Address &src) { | 1240 const typename Traits::Address &src) { |
1201 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1241 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1202 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 1242 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 1243 emitAddrSizeOverridePrefix(); |
1203 emitRex(RexTypeIrrelevant, src, dst); | 1244 emitRex(RexTypeIrrelevant, src, dst); |
1204 emitUint8(0x0F); | 1245 emitUint8(0x0F); |
1205 emitUint8(0x5D); | 1246 emitUint8(0x5D); |
1206 emitOperand(gprEncoding(dst), src); | 1247 emitOperand(gprEncoding(dst), src); |
1207 } | 1248 } |
1208 | 1249 |
1209 template <class Machine> | 1250 template <class Machine> |
1210 void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst, | 1251 void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst, |
1211 typename Traits::XmmRegister src) { | 1252 typename Traits::XmmRegister src) { |
1212 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1253 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1213 if (!isFloat32Asserting32Or64(Ty)) | 1254 if (!isFloat32Asserting32Or64(Ty)) |
1214 emitUint8(0x66); | 1255 emitUint8(0x66); |
1215 emitRexRB(RexTypeIrrelevant, dst, src); | 1256 emitRexRB(RexTypeIrrelevant, dst, src); |
1216 emitUint8(0x0F); | 1257 emitUint8(0x0F); |
1217 emitUint8(0x5F); | 1258 emitUint8(0x5F); |
1218 emitXmmRegisterOperand(dst, src); | 1259 emitXmmRegisterOperand(dst, src); |
1219 } | 1260 } |
1220 | 1261 |
1221 template <class Machine> | 1262 template <class Machine> |
1222 void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst, | 1263 void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst, |
1223 const typename Traits::Address &src) { | 1264 const typename Traits::Address &src) { |
1224 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1265 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1225 if (!isFloat32Asserting32Or64(Ty)) | 1266 if (!isFloat32Asserting32Or64(Ty)) |
1226 emitUint8(0x66); | 1267 emitUint8(0x66); |
| 1268 emitAddrSizeOverridePrefix(); |
1227 emitRex(RexTypeIrrelevant, src, dst); | 1269 emitRex(RexTypeIrrelevant, src, dst); |
1228 emitUint8(0x0F); | 1270 emitUint8(0x0F); |
1229 emitUint8(0x5F); | 1271 emitUint8(0x5F); |
1230 emitOperand(gprEncoding(dst), src); | 1272 emitOperand(gprEncoding(dst), src); |
1231 } | 1273 } |
1232 | 1274 |
1233 template <class Machine> | 1275 template <class Machine> |
1234 void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst, | 1276 void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst, |
1235 typename Traits::XmmRegister src) { | 1277 typename Traits::XmmRegister src) { |
1236 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1278 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1237 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 1279 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
1238 emitRexRB(RexTypeIrrelevant, dst, src); | 1280 emitRexRB(RexTypeIrrelevant, dst, src); |
1239 emitUint8(0x0F); | 1281 emitUint8(0x0F); |
1240 emitUint8(0x5F); | 1282 emitUint8(0x5F); |
1241 emitXmmRegisterOperand(dst, src); | 1283 emitXmmRegisterOperand(dst, src); |
1242 } | 1284 } |
1243 | 1285 |
1244 template <class Machine> | 1286 template <class Machine> |
1245 void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst, | 1287 void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst, |
1246 const typename Traits::Address &src) { | 1288 const typename Traits::Address &src) { |
1247 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1289 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1248 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 1290 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 1291 emitAddrSizeOverridePrefix(); |
1249 emitRex(RexTypeIrrelevant, src, dst); | 1292 emitRex(RexTypeIrrelevant, src, dst); |
1250 emitUint8(0x0F); | 1293 emitUint8(0x0F); |
1251 emitUint8(0x5F); | 1294 emitUint8(0x5F); |
1252 emitOperand(gprEncoding(dst), src); | 1295 emitOperand(gprEncoding(dst), src); |
1253 } | 1296 } |
1254 | 1297 |
1255 template <class Machine> | 1298 template <class Machine> |
1256 void AssemblerX86Base<Machine>::andnps(Type Ty, | 1299 void AssemblerX86Base<Machine>::andnps(Type Ty, |
1257 typename Traits::XmmRegister dst, | 1300 typename Traits::XmmRegister dst, |
1258 typename Traits::XmmRegister src) { | 1301 typename Traits::XmmRegister src) { |
1259 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1302 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1260 if (!isFloat32Asserting32Or64(Ty)) | 1303 if (!isFloat32Asserting32Or64(Ty)) |
1261 emitUint8(0x66); | 1304 emitUint8(0x66); |
1262 emitRexRB(RexTypeIrrelevant, dst, src); | 1305 emitRexRB(RexTypeIrrelevant, dst, src); |
1263 emitUint8(0x0F); | 1306 emitUint8(0x0F); |
1264 emitUint8(0x55); | 1307 emitUint8(0x55); |
1265 emitXmmRegisterOperand(dst, src); | 1308 emitXmmRegisterOperand(dst, src); |
1266 } | 1309 } |
1267 | 1310 |
1268 template <class Machine> | 1311 template <class Machine> |
1269 void AssemblerX86Base<Machine>::andnps(Type Ty, | 1312 void AssemblerX86Base<Machine>::andnps(Type Ty, |
1270 typename Traits::XmmRegister dst, | 1313 typename Traits::XmmRegister dst, |
1271 const typename Traits::Address &src) { | 1314 const typename Traits::Address &src) { |
1272 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1315 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1273 if (!isFloat32Asserting32Or64(Ty)) | 1316 if (!isFloat32Asserting32Or64(Ty)) |
1274 emitUint8(0x66); | 1317 emitUint8(0x66); |
| 1318 emitAddrSizeOverridePrefix(); |
1275 emitRex(RexTypeIrrelevant, src, dst); | 1319 emitRex(RexTypeIrrelevant, src, dst); |
1276 emitUint8(0x0F); | 1320 emitUint8(0x0F); |
1277 emitUint8(0x55); | 1321 emitUint8(0x55); |
1278 emitOperand(gprEncoding(dst), src); | 1322 emitOperand(gprEncoding(dst), src); |
1279 } | 1323 } |
1280 | 1324 |
1281 template <class Machine> | 1325 template <class Machine> |
1282 void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst, | 1326 void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst, |
1283 typename Traits::XmmRegister src) { | 1327 typename Traits::XmmRegister src) { |
1284 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1328 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1285 if (!isFloat32Asserting32Or64(Ty)) | 1329 if (!isFloat32Asserting32Or64(Ty)) |
1286 emitUint8(0x66); | 1330 emitUint8(0x66); |
1287 emitRexRB(RexTypeIrrelevant, dst, src); | 1331 emitRexRB(RexTypeIrrelevant, dst, src); |
1288 emitUint8(0x0F); | 1332 emitUint8(0x0F); |
1289 emitUint8(0x54); | 1333 emitUint8(0x54); |
1290 emitXmmRegisterOperand(dst, src); | 1334 emitXmmRegisterOperand(dst, src); |
1291 } | 1335 } |
1292 | 1336 |
1293 template <class Machine> | 1337 template <class Machine> |
1294 void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst, | 1338 void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst, |
1295 const typename Traits::Address &src) { | 1339 const typename Traits::Address &src) { |
1296 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1340 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1297 if (!isFloat32Asserting32Or64(Ty)) | 1341 if (!isFloat32Asserting32Or64(Ty)) |
1298 emitUint8(0x66); | 1342 emitUint8(0x66); |
| 1343 emitAddrSizeOverridePrefix(); |
1299 emitRex(RexTypeIrrelevant, src, dst); | 1344 emitRex(RexTypeIrrelevant, src, dst); |
1300 emitUint8(0x0F); | 1345 emitUint8(0x0F); |
1301 emitUint8(0x54); | 1346 emitUint8(0x54); |
1302 emitOperand(gprEncoding(dst), src); | 1347 emitOperand(gprEncoding(dst), src); |
1303 } | 1348 } |
1304 | 1349 |
1305 template <class Machine> | 1350 template <class Machine> |
1306 void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst, | 1351 void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst, |
1307 typename Traits::XmmRegister src) { | 1352 typename Traits::XmmRegister src) { |
1308 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1353 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1309 if (!isFloat32Asserting32Or64(Ty)) | 1354 if (!isFloat32Asserting32Or64(Ty)) |
1310 emitUint8(0x66); | 1355 emitUint8(0x66); |
1311 emitRexRB(RexTypeIrrelevant, dst, src); | 1356 emitRexRB(RexTypeIrrelevant, dst, src); |
1312 emitUint8(0x0F); | 1357 emitUint8(0x0F); |
1313 emitUint8(0x56); | 1358 emitUint8(0x56); |
1314 emitXmmRegisterOperand(dst, src); | 1359 emitXmmRegisterOperand(dst, src); |
1315 } | 1360 } |
1316 | 1361 |
1317 template <class Machine> | 1362 template <class Machine> |
1318 void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst, | 1363 void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst, |
1319 const typename Traits::Address &src) { | 1364 const typename Traits::Address &src) { |
1320 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1365 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1321 if (!isFloat32Asserting32Or64(Ty)) | 1366 if (!isFloat32Asserting32Or64(Ty)) |
1322 emitUint8(0x66); | 1367 emitUint8(0x66); |
| 1368 emitAddrSizeOverridePrefix(); |
1323 emitRex(RexTypeIrrelevant, src, dst); | 1369 emitRex(RexTypeIrrelevant, src, dst); |
1324 emitUint8(0x0F); | 1370 emitUint8(0x0F); |
1325 emitUint8(0x56); | 1371 emitUint8(0x56); |
1326 emitOperand(gprEncoding(dst), src); | 1372 emitOperand(gprEncoding(dst), src); |
1327 } | 1373 } |
1328 | 1374 |
1329 template <class Machine> | 1375 template <class Machine> |
1330 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, | 1376 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, |
1331 typename Traits::XmmRegister dst, | 1377 typename Traits::XmmRegister dst, |
1332 typename Traits::XmmRegister src) { | 1378 typename Traits::XmmRegister src) { |
1333 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1379 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1334 emitUint8(0x66); | 1380 emitUint8(0x66); |
1335 emitRexRB(RexTypeIrrelevant, dst, src); | 1381 emitRexRB(RexTypeIrrelevant, dst, src); |
1336 emitUint8(0x0F); | 1382 emitUint8(0x0F); |
1337 emitUint8(0x38); | 1383 emitUint8(0x38); |
1338 emitUint8(0x14); | 1384 emitUint8(0x14); |
1339 emitXmmRegisterOperand(dst, src); | 1385 emitXmmRegisterOperand(dst, src); |
1340 } | 1386 } |
1341 | 1387 |
1342 template <class Machine> | 1388 template <class Machine> |
1343 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, | 1389 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, |
1344 typename Traits::XmmRegister dst, | 1390 typename Traits::XmmRegister dst, |
1345 const typename Traits::Address &src) { | 1391 const typename Traits::Address &src) { |
1346 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1392 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1347 emitUint8(0x66); | 1393 emitUint8(0x66); |
| 1394 emitAddrSizeOverridePrefix(); |
1348 emitRex(RexTypeIrrelevant, src, dst); | 1395 emitRex(RexTypeIrrelevant, src, dst); |
1349 emitUint8(0x0F); | 1396 emitUint8(0x0F); |
1350 emitUint8(0x38); | 1397 emitUint8(0x38); |
1351 emitUint8(0x14); | 1398 emitUint8(0x14); |
1352 emitOperand(gprEncoding(dst), src); | 1399 emitOperand(gprEncoding(dst), src); |
1353 } | 1400 } |
1354 | 1401 |
1355 template <class Machine> | 1402 template <class Machine> |
1356 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, | 1403 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, |
1357 typename Traits::XmmRegister dst, | 1404 typename Traits::XmmRegister dst, |
1358 typename Traits::XmmRegister src) { | 1405 typename Traits::XmmRegister src) { |
1359 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1406 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1360 emitUint8(0x66); | 1407 emitUint8(0x66); |
1361 emitRexRB(RexTypeIrrelevant, dst, src); | 1408 emitRexRB(RexTypeIrrelevant, dst, src); |
1362 emitUint8(0x0F); | 1409 emitUint8(0x0F); |
1363 emitUint8(0x38); | 1410 emitUint8(0x38); |
1364 emitUint8(0x10); | 1411 emitUint8(0x10); |
1365 emitXmmRegisterOperand(dst, src); | 1412 emitXmmRegisterOperand(dst, src); |
1366 } | 1413 } |
1367 | 1414 |
1368 template <class Machine> | 1415 template <class Machine> |
1369 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, | 1416 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, |
1370 typename Traits::XmmRegister dst, | 1417 typename Traits::XmmRegister dst, |
1371 const typename Traits::Address &src) { | 1418 const typename Traits::Address &src) { |
1372 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1419 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1373 emitUint8(0x66); | 1420 emitUint8(0x66); |
| 1421 emitAddrSizeOverridePrefix(); |
1374 emitRex(RexTypeIrrelevant, src, dst); | 1422 emitRex(RexTypeIrrelevant, src, dst); |
1375 emitUint8(0x0F); | 1423 emitUint8(0x0F); |
1376 emitUint8(0x38); | 1424 emitUint8(0x38); |
1377 emitUint8(0x10); | 1425 emitUint8(0x10); |
1378 emitOperand(gprEncoding(dst), src); | 1426 emitOperand(gprEncoding(dst), src); |
1379 } | 1427 } |
1380 | 1428 |
1381 template <class Machine> | 1429 template <class Machine> |
1382 void AssemblerX86Base<Machine>::cmpps( | 1430 void AssemblerX86Base<Machine>::cmpps( |
1383 Type Ty, typename Traits::XmmRegister dst, typename Traits::XmmRegister src, | 1431 Type Ty, typename Traits::XmmRegister dst, typename Traits::XmmRegister src, |
1384 typename Traits::Cond::CmppsCond CmpCondition) { | 1432 typename Traits::Cond::CmppsCond CmpCondition) { |
1385 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1433 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1386 if (Ty == IceType_f64) | 1434 if (Ty == IceType_f64) |
1387 emitUint8(0x66); | 1435 emitUint8(0x66); |
1388 emitRexRB(RexTypeIrrelevant, dst, src); | 1436 emitRexRB(RexTypeIrrelevant, dst, src); |
1389 emitUint8(0x0F); | 1437 emitUint8(0x0F); |
1390 emitUint8(0xC2); | 1438 emitUint8(0xC2); |
1391 emitXmmRegisterOperand(dst, src); | 1439 emitXmmRegisterOperand(dst, src); |
1392 emitUint8(CmpCondition); | 1440 emitUint8(CmpCondition); |
1393 } | 1441 } |
1394 | 1442 |
1395 template <class Machine> | 1443 template <class Machine> |
1396 void AssemblerX86Base<Machine>::cmpps( | 1444 void AssemblerX86Base<Machine>::cmpps( |
1397 Type Ty, typename Traits::XmmRegister dst, | 1445 Type Ty, typename Traits::XmmRegister dst, |
1398 const typename Traits::Address &src, | 1446 const typename Traits::Address &src, |
1399 typename Traits::Cond::CmppsCond CmpCondition) { | 1447 typename Traits::Cond::CmppsCond CmpCondition) { |
1400 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1448 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1401 if (Ty == IceType_f64) | 1449 if (Ty == IceType_f64) |
1402 emitUint8(0x66); | 1450 emitUint8(0x66); |
| 1451 emitAddrSizeOverridePrefix(); |
1403 emitRex(RexTypeIrrelevant, src, dst); | 1452 emitRex(RexTypeIrrelevant, src, dst); |
1404 emitUint8(0x0F); | 1453 emitUint8(0x0F); |
1405 emitUint8(0xC2); | 1454 emitUint8(0xC2); |
1406 emitOperand(gprEncoding(dst), src); | 1455 emitOperand(gprEncoding(dst), src); |
1407 emitUint8(CmpCondition); | 1456 emitUint8(CmpCondition); |
1408 } | 1457 } |
1409 | 1458 |
1410 template <class Machine> | 1459 template <class Machine> |
1411 void AssemblerX86Base<Machine>::sqrtps(typename Traits::XmmRegister dst) { | 1460 void AssemblerX86Base<Machine>::sqrtps(typename Traits::XmmRegister dst) { |
1412 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1461 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1523 emitUint8(imm.value()); | 1572 emitUint8(imm.value()); |
1524 } | 1573 } |
1525 | 1574 |
1526 template <class Machine> | 1575 template <class Machine> |
1527 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, | 1576 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, |
1528 typename Traits::XmmRegister dst, | 1577 typename Traits::XmmRegister dst, |
1529 const typename Traits::Address &src, | 1578 const typename Traits::Address &src, |
1530 const Immediate &imm) { | 1579 const Immediate &imm) { |
1531 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1580 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1532 emitUint8(0x66); | 1581 emitUint8(0x66); |
| 1582 emitAddrSizeOverridePrefix(); |
1533 emitRex(RexTypeIrrelevant, src, dst); | 1583 emitRex(RexTypeIrrelevant, src, dst); |
1534 emitUint8(0x0F); | 1584 emitUint8(0x0F); |
1535 emitUint8(0x70); | 1585 emitUint8(0x70); |
1536 emitOperand(gprEncoding(dst), src); | 1586 emitOperand(gprEncoding(dst), src); |
1537 assert(imm.is_uint8()); | 1587 assert(imm.is_uint8()); |
1538 emitUint8(imm.value()); | 1588 emitUint8(imm.value()); |
1539 } | 1589 } |
1540 | 1590 |
1541 template <class Machine> | 1591 template <class Machine> |
1542 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, | 1592 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, |
1543 typename Traits::XmmRegister dst, | 1593 typename Traits::XmmRegister dst, |
1544 typename Traits::XmmRegister src, | 1594 typename Traits::XmmRegister src, |
1545 const Immediate &imm) { | 1595 const Immediate &imm) { |
1546 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1596 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1547 emitRexRB(RexTypeIrrelevant, dst, src); | 1597 emitRexRB(RexTypeIrrelevant, dst, src); |
1548 emitUint8(0x0F); | 1598 emitUint8(0x0F); |
1549 emitUint8(0xC6); | 1599 emitUint8(0xC6); |
1550 emitXmmRegisterOperand(dst, src); | 1600 emitXmmRegisterOperand(dst, src); |
1551 assert(imm.is_uint8()); | 1601 assert(imm.is_uint8()); |
1552 emitUint8(imm.value()); | 1602 emitUint8(imm.value()); |
1553 } | 1603 } |
1554 | 1604 |
1555 template <class Machine> | 1605 template <class Machine> |
1556 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, | 1606 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, |
1557 typename Traits::XmmRegister dst, | 1607 typename Traits::XmmRegister dst, |
1558 const typename Traits::Address &src, | 1608 const typename Traits::Address &src, |
1559 const Immediate &imm) { | 1609 const Immediate &imm) { |
1560 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1610 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1611 emitAddrSizeOverridePrefix(); |
1561 emitRex(RexTypeIrrelevant, src, dst); | 1612 emitRex(RexTypeIrrelevant, src, dst); |
1562 emitUint8(0x0F); | 1613 emitUint8(0x0F); |
1563 emitUint8(0xC6); | 1614 emitUint8(0xC6); |
1564 emitOperand(gprEncoding(dst), src); | 1615 emitOperand(gprEncoding(dst), src); |
1565 assert(imm.is_uint8()); | 1616 assert(imm.is_uint8()); |
1566 emitUint8(imm.value()); | 1617 emitUint8(imm.value()); |
1567 } | 1618 } |
1568 | 1619 |
1569 template <class Machine> | 1620 template <class Machine> |
1570 void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) { | 1621 void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) { |
(...skipping 14 matching lines...) Expand all Loading... |
1585 emitUint8(0x0F); | 1636 emitUint8(0x0F); |
1586 emitUint8(0x5B); | 1637 emitUint8(0x5B); |
1587 emitXmmRegisterOperand(dst, src); | 1638 emitXmmRegisterOperand(dst, src); |
1588 } | 1639 } |
1589 | 1640 |
1590 template <class Machine> | 1641 template <class Machine> |
1591 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */, | 1642 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */, |
1592 typename Traits::XmmRegister dst, | 1643 typename Traits::XmmRegister dst, |
1593 const typename Traits::Address &src) { | 1644 const typename Traits::Address &src) { |
1594 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1645 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1646 emitAddrSizeOverridePrefix(); |
1595 emitRex(RexTypeIrrelevant, src, dst); | 1647 emitRex(RexTypeIrrelevant, src, dst); |
1596 emitUint8(0x0F); | 1648 emitUint8(0x0F); |
1597 emitUint8(0x5B); | 1649 emitUint8(0x5B); |
1598 emitOperand(gprEncoding(dst), src); | 1650 emitOperand(gprEncoding(dst), src); |
1599 } | 1651 } |
1600 | 1652 |
1601 template <class Machine> | 1653 template <class Machine> |
1602 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, | 1654 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, |
1603 typename Traits::XmmRegister dst, | 1655 typename Traits::XmmRegister dst, |
1604 typename Traits::XmmRegister src) { | 1656 typename Traits::XmmRegister src) { |
1605 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1657 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1606 emitUint8(0xF3); | 1658 emitUint8(0xF3); |
1607 emitRexRB(RexTypeIrrelevant, dst, src); | 1659 emitRexRB(RexTypeIrrelevant, dst, src); |
1608 emitUint8(0x0F); | 1660 emitUint8(0x0F); |
1609 emitUint8(0x5B); | 1661 emitUint8(0x5B); |
1610 emitXmmRegisterOperand(dst, src); | 1662 emitXmmRegisterOperand(dst, src); |
1611 } | 1663 } |
1612 | 1664 |
1613 template <class Machine> | 1665 template <class Machine> |
1614 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, | 1666 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, |
1615 typename Traits::XmmRegister dst, | 1667 typename Traits::XmmRegister dst, |
1616 const typename Traits::Address &src) { | 1668 const typename Traits::Address &src) { |
1617 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1669 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1618 emitUint8(0xF3); | 1670 emitUint8(0xF3); |
| 1671 emitAddrSizeOverridePrefix(); |
1619 emitRex(RexTypeIrrelevant, src, dst); | 1672 emitRex(RexTypeIrrelevant, src, dst); |
1620 emitUint8(0x0F); | 1673 emitUint8(0x0F); |
1621 emitUint8(0x5B); | 1674 emitUint8(0x5B); |
1622 emitOperand(gprEncoding(dst), src); | 1675 emitOperand(gprEncoding(dst), src); |
1623 } | 1676 } |
1624 | 1677 |
1625 template <class Machine> | 1678 template <class Machine> |
1626 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, | 1679 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, |
1627 typename Traits::XmmRegister dst, | 1680 typename Traits::XmmRegister dst, |
1628 Type SrcTy, | 1681 Type SrcTy, |
1629 typename Traits::GPRRegister src) { | 1682 typename Traits::GPRRegister src) { |
1630 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1683 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1631 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); | 1684 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); |
1632 emitRexRB(SrcTy, dst, src); | 1685 emitRexRB(SrcTy, dst, src); |
1633 emitUint8(0x0F); | 1686 emitUint8(0x0F); |
1634 emitUint8(0x2A); | 1687 emitUint8(0x2A); |
1635 emitXmmRegisterOperand(dst, src); | 1688 emitXmmRegisterOperand(dst, src); |
1636 } | 1689 } |
1637 | 1690 |
1638 template <class Machine> | 1691 template <class Machine> |
1639 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, | 1692 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, |
1640 typename Traits::XmmRegister dst, | 1693 typename Traits::XmmRegister dst, |
1641 Type SrcTy, | 1694 Type SrcTy, |
1642 const typename Traits::Address &src) { | 1695 const typename Traits::Address &src) { |
1643 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1696 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1644 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); | 1697 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); |
| 1698 emitAddrSizeOverridePrefix(); |
1645 emitRex(SrcTy, src, dst); | 1699 emitRex(SrcTy, src, dst); |
1646 emitUint8(0x0F); | 1700 emitUint8(0x0F); |
1647 emitUint8(0x2A); | 1701 emitUint8(0x2A); |
1648 emitOperand(gprEncoding(dst), src); | 1702 emitOperand(gprEncoding(dst), src); |
1649 } | 1703 } |
1650 | 1704 |
1651 template <class Machine> | 1705 template <class Machine> |
1652 void AssemblerX86Base<Machine>::cvtfloat2float( | 1706 void AssemblerX86Base<Machine>::cvtfloat2float( |
1653 Type SrcTy, typename Traits::XmmRegister dst, | 1707 Type SrcTy, typename Traits::XmmRegister dst, |
1654 typename Traits::XmmRegister src) { | 1708 typename Traits::XmmRegister src) { |
1655 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1709 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1656 // ss2sd or sd2ss | 1710 // ss2sd or sd2ss |
1657 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); | 1711 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
1658 emitRexRB(RexTypeIrrelevant, dst, src); | 1712 emitRexRB(RexTypeIrrelevant, dst, src); |
1659 emitUint8(0x0F); | 1713 emitUint8(0x0F); |
1660 emitUint8(0x5A); | 1714 emitUint8(0x5A); |
1661 emitXmmRegisterOperand(dst, src); | 1715 emitXmmRegisterOperand(dst, src); |
1662 } | 1716 } |
1663 | 1717 |
1664 template <class Machine> | 1718 template <class Machine> |
1665 void AssemblerX86Base<Machine>::cvtfloat2float( | 1719 void AssemblerX86Base<Machine>::cvtfloat2float( |
1666 Type SrcTy, typename Traits::XmmRegister dst, | 1720 Type SrcTy, typename Traits::XmmRegister dst, |
1667 const typename Traits::Address &src) { | 1721 const typename Traits::Address &src) { |
1668 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1722 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1669 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); | 1723 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1724 emitAddrSizeOverridePrefix(); |
1670 emitRex(RexTypeIrrelevant, src, dst); | 1725 emitRex(RexTypeIrrelevant, src, dst); |
1671 emitUint8(0x0F); | 1726 emitUint8(0x0F); |
1672 emitUint8(0x5A); | 1727 emitUint8(0x5A); |
1673 emitOperand(gprEncoding(dst), src); | 1728 emitOperand(gprEncoding(dst), src); |
1674 } | 1729 } |
1675 | 1730 |
1676 template <class Machine> | 1731 template <class Machine> |
1677 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy, | 1732 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy, |
1678 typename Traits::GPRRegister dst, | 1733 typename Traits::GPRRegister dst, |
1679 Type SrcTy, | 1734 Type SrcTy, |
1680 typename Traits::XmmRegister src) { | 1735 typename Traits::XmmRegister src) { |
1681 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1736 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1682 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); | 1737 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
1683 emitRexRB(DestTy, dst, src); | 1738 emitRexRB(DestTy, dst, src); |
1684 emitUint8(0x0F); | 1739 emitUint8(0x0F); |
1685 emitUint8(0x2C); | 1740 emitUint8(0x2C); |
1686 emitXmmRegisterOperand(dst, src); | 1741 emitXmmRegisterOperand(dst, src); |
1687 } | 1742 } |
1688 | 1743 |
1689 template <class Machine> | 1744 template <class Machine> |
1690 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy, | 1745 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy, |
1691 typename Traits::GPRRegister dst, | 1746 typename Traits::GPRRegister dst, |
1692 Type SrcTy, | 1747 Type SrcTy, |
1693 const typename Traits::Address &src) { | 1748 const typename Traits::Address &src) { |
1694 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1749 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1695 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); | 1750 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1751 emitAddrSizeOverridePrefix(); |
1696 emitRex(DestTy, src, dst); | 1752 emitRex(DestTy, src, dst); |
1697 emitUint8(0x0F); | 1753 emitUint8(0x0F); |
1698 emitUint8(0x2C); | 1754 emitUint8(0x2C); |
1699 emitOperand(gprEncoding(dst), src); | 1755 emitOperand(gprEncoding(dst), src); |
1700 } | 1756 } |
1701 | 1757 |
1702 template <class Machine> | 1758 template <class Machine> |
1703 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, | 1759 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, |
1704 typename Traits::XmmRegister b) { | 1760 typename Traits::XmmRegister b) { |
1705 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1761 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1706 if (Ty == IceType_f64) | 1762 if (Ty == IceType_f64) |
1707 emitUint8(0x66); | 1763 emitUint8(0x66); |
1708 emitRexRB(RexTypeIrrelevant, a, b); | 1764 emitRexRB(RexTypeIrrelevant, a, b); |
1709 emitUint8(0x0F); | 1765 emitUint8(0x0F); |
1710 emitUint8(0x2E); | 1766 emitUint8(0x2E); |
1711 emitXmmRegisterOperand(a, b); | 1767 emitXmmRegisterOperand(a, b); |
1712 } | 1768 } |
1713 | 1769 |
1714 template <class Machine> | 1770 template <class Machine> |
1715 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, | 1771 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, |
1716 const typename Traits::Address &b) { | 1772 const typename Traits::Address &b) { |
1717 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1773 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1718 if (Ty == IceType_f64) | 1774 if (Ty == IceType_f64) |
1719 emitUint8(0x66); | 1775 emitUint8(0x66); |
| 1776 emitAddrSizeOverridePrefix(); |
1720 emitRex(RexTypeIrrelevant, b, a); | 1777 emitRex(RexTypeIrrelevant, b, a); |
1721 emitUint8(0x0F); | 1778 emitUint8(0x0F); |
1722 emitUint8(0x2E); | 1779 emitUint8(0x2E); |
1723 emitOperand(gprEncoding(a), b); | 1780 emitOperand(gprEncoding(a), b); |
1724 } | 1781 } |
1725 | 1782 |
1726 template <class Machine> | 1783 template <class Machine> |
1727 void AssemblerX86Base<Machine>::movmskpd(typename Traits::GPRRegister dst, | 1784 void AssemblerX86Base<Machine>::movmskpd(typename Traits::GPRRegister dst, |
1728 typename Traits::XmmRegister src) { | 1785 typename Traits::XmmRegister src) { |
1729 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1786 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
(...skipping 13 matching lines...) Expand all Loading... |
1743 emitUint8(0x50); | 1800 emitUint8(0x50); |
1744 emitXmmRegisterOperand(dst, src); | 1801 emitXmmRegisterOperand(dst, src); |
1745 } | 1802 } |
1746 | 1803 |
1747 template <class Machine> | 1804 template <class Machine> |
1748 void AssemblerX86Base<Machine>::sqrtss(Type Ty, | 1805 void AssemblerX86Base<Machine>::sqrtss(Type Ty, |
1749 typename Traits::XmmRegister dst, | 1806 typename Traits::XmmRegister dst, |
1750 const typename Traits::Address &src) { | 1807 const typename Traits::Address &src) { |
1751 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1808 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1752 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 1809 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 1810 emitAddrSizeOverridePrefix(); |
1753 emitRex(RexTypeIrrelevant, src, dst); | 1811 emitRex(RexTypeIrrelevant, src, dst); |
1754 emitUint8(0x0F); | 1812 emitUint8(0x0F); |
1755 emitUint8(0x51); | 1813 emitUint8(0x51); |
1756 emitOperand(gprEncoding(dst), src); | 1814 emitOperand(gprEncoding(dst), src); |
1757 } | 1815 } |
1758 | 1816 |
1759 template <class Machine> | 1817 template <class Machine> |
1760 void AssemblerX86Base<Machine>::sqrtss(Type Ty, | 1818 void AssemblerX86Base<Machine>::sqrtss(Type Ty, |
1761 typename Traits::XmmRegister dst, | 1819 typename Traits::XmmRegister dst, |
1762 typename Traits::XmmRegister src) { | 1820 typename Traits::XmmRegister src) { |
1763 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1821 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1764 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 1822 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
1765 emitRexRB(RexTypeIrrelevant, dst, src); | 1823 emitRexRB(RexTypeIrrelevant, dst, src); |
1766 emitUint8(0x0F); | 1824 emitUint8(0x0F); |
1767 emitUint8(0x51); | 1825 emitUint8(0x51); |
1768 emitXmmRegisterOperand(dst, src); | 1826 emitXmmRegisterOperand(dst, src); |
1769 } | 1827 } |
1770 | 1828 |
1771 template <class Machine> | 1829 template <class Machine> |
1772 void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst, | 1830 void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst, |
1773 const typename Traits::Address &src) { | 1831 const typename Traits::Address &src) { |
1774 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1832 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1775 if (!isFloat32Asserting32Or64(Ty)) | 1833 if (!isFloat32Asserting32Or64(Ty)) |
1776 emitUint8(0x66); | 1834 emitUint8(0x66); |
| 1835 emitAddrSizeOverridePrefix(); |
1777 emitRex(RexTypeIrrelevant, src, dst); | 1836 emitRex(RexTypeIrrelevant, src, dst); |
1778 emitUint8(0x0F); | 1837 emitUint8(0x0F); |
1779 emitUint8(0x57); | 1838 emitUint8(0x57); |
1780 emitOperand(gprEncoding(dst), src); | 1839 emitOperand(gprEncoding(dst), src); |
1781 } | 1840 } |
1782 | 1841 |
1783 template <class Machine> | 1842 template <class Machine> |
1784 void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst, | 1843 void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst, |
1785 typename Traits::XmmRegister src) { | 1844 typename Traits::XmmRegister src) { |
1786 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1845 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
(...skipping 26 matching lines...) Expand all Loading... |
1813 template <class Machine> | 1872 template <class Machine> |
1814 void AssemblerX86Base<Machine>::insertps(Type Ty, | 1873 void AssemblerX86Base<Machine>::insertps(Type Ty, |
1815 typename Traits::XmmRegister dst, | 1874 typename Traits::XmmRegister dst, |
1816 const typename Traits::Address &src, | 1875 const typename Traits::Address &src, |
1817 const Immediate &imm) { | 1876 const Immediate &imm) { |
1818 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1877 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1819 assert(imm.is_uint8()); | 1878 assert(imm.is_uint8()); |
1820 assert(isVectorFloatingType(Ty)); | 1879 assert(isVectorFloatingType(Ty)); |
1821 (void)Ty; | 1880 (void)Ty; |
1822 emitUint8(0x66); | 1881 emitUint8(0x66); |
| 1882 emitAddrSizeOverridePrefix(); |
1823 emitRex(RexTypeIrrelevant, src, dst); | 1883 emitRex(RexTypeIrrelevant, src, dst); |
1824 emitUint8(0x0F); | 1884 emitUint8(0x0F); |
1825 emitUint8(0x3A); | 1885 emitUint8(0x3A); |
1826 emitUint8(0x21); | 1886 emitUint8(0x21); |
1827 emitOperand(gprEncoding(dst), src); | 1887 emitOperand(gprEncoding(dst), src); |
1828 emitUint8(imm.value()); | 1888 emitUint8(imm.value()); |
1829 } | 1889 } |
1830 | 1890 |
1831 template <class Machine> | 1891 template <class Machine> |
1832 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, | 1892 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, |
(...skipping 14 matching lines...) Expand all Loading... |
1847 emitUint8(imm.value()); | 1907 emitUint8(imm.value()); |
1848 } | 1908 } |
1849 | 1909 |
1850 template <class Machine> | 1910 template <class Machine> |
1851 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, | 1911 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, |
1852 const typename Traits::Address &src, | 1912 const typename Traits::Address &src, |
1853 const Immediate &imm) { | 1913 const Immediate &imm) { |
1854 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1914 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1855 assert(imm.is_uint8()); | 1915 assert(imm.is_uint8()); |
1856 emitUint8(0x66); | 1916 emitUint8(0x66); |
| 1917 emitAddrSizeOverridePrefix(); |
1857 emitRex(RexTypeIrrelevant, src, dst); | 1918 emitRex(RexTypeIrrelevant, src, dst); |
1858 emitUint8(0x0F); | 1919 emitUint8(0x0F); |
1859 if (Ty == IceType_i16) { | 1920 if (Ty == IceType_i16) { |
1860 emitUint8(0xC4); | 1921 emitUint8(0xC4); |
1861 } else { | 1922 } else { |
1862 emitUint8(0x3A); | 1923 emitUint8(0x3A); |
1863 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); | 1924 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); |
1864 } | 1925 } |
1865 emitOperand(gprEncoding(dst), src); | 1926 emitOperand(gprEncoding(dst), src); |
1866 emitUint8(imm.value()); | 1927 emitUint8(imm.value()); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1921 } | 1982 } |
1922 emitXmmRegisterOperand(dst, src); | 1983 emitXmmRegisterOperand(dst, src); |
1923 } | 1984 } |
1924 | 1985 |
1925 template <class Machine> | 1986 template <class Machine> |
1926 void AssemblerX86Base<Machine>::pcmpeq(Type Ty, | 1987 void AssemblerX86Base<Machine>::pcmpeq(Type Ty, |
1927 typename Traits::XmmRegister dst, | 1988 typename Traits::XmmRegister dst, |
1928 const typename Traits::Address &src) { | 1989 const typename Traits::Address &src) { |
1929 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1990 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1930 emitUint8(0x66); | 1991 emitUint8(0x66); |
| 1992 emitAddrSizeOverridePrefix(); |
1931 emitRex(RexTypeIrrelevant, src, dst); | 1993 emitRex(RexTypeIrrelevant, src, dst); |
1932 emitUint8(0x0F); | 1994 emitUint8(0x0F); |
1933 if (isByteSizedArithType(Ty)) { | 1995 if (isByteSizedArithType(Ty)) { |
1934 emitUint8(0x74); | 1996 emitUint8(0x74); |
1935 } else if (Ty == IceType_i16) { | 1997 } else if (Ty == IceType_i16) { |
1936 emitUint8(0x75); | 1998 emitUint8(0x75); |
1937 } else { | 1999 } else { |
1938 emitUint8(0x76); | 2000 emitUint8(0x76); |
1939 } | 2001 } |
1940 emitOperand(gprEncoding(dst), src); | 2002 emitOperand(gprEncoding(dst), src); |
(...skipping 16 matching lines...) Expand all Loading... |
1957 } | 2019 } |
1958 emitXmmRegisterOperand(dst, src); | 2020 emitXmmRegisterOperand(dst, src); |
1959 } | 2021 } |
1960 | 2022 |
1961 template <class Machine> | 2023 template <class Machine> |
1962 void AssemblerX86Base<Machine>::pcmpgt(Type Ty, | 2024 void AssemblerX86Base<Machine>::pcmpgt(Type Ty, |
1963 typename Traits::XmmRegister dst, | 2025 typename Traits::XmmRegister dst, |
1964 const typename Traits::Address &src) { | 2026 const typename Traits::Address &src) { |
1965 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2027 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
1966 emitUint8(0x66); | 2028 emitUint8(0x66); |
| 2029 emitAddrSizeOverridePrefix(); |
1967 emitRex(RexTypeIrrelevant, src, dst); | 2030 emitRex(RexTypeIrrelevant, src, dst); |
1968 emitUint8(0x0F); | 2031 emitUint8(0x0F); |
1969 if (isByteSizedArithType(Ty)) { | 2032 if (isByteSizedArithType(Ty)) { |
1970 emitUint8(0x64); | 2033 emitUint8(0x64); |
1971 } else if (Ty == IceType_i16) { | 2034 } else if (Ty == IceType_i16) { |
1972 emitUint8(0x65); | 2035 emitUint8(0x65); |
1973 } else { | 2036 } else { |
1974 emitUint8(0x66); | 2037 emitUint8(0x66); |
1975 } | 2038 } |
1976 emitOperand(gprEncoding(dst), src); | 2039 emitOperand(gprEncoding(dst), src); |
(...skipping 11 matching lines...) Expand all Loading... |
1988 emitUint8(0x0B); | 2051 emitUint8(0x0B); |
1989 emitXmmRegisterOperand(dst, src); | 2052 emitXmmRegisterOperand(dst, src); |
1990 // Mask precision exeption. | 2053 // Mask precision exeption. |
1991 emitUint8(static_cast<uint8_t>(mode) | 0x8); | 2054 emitUint8(static_cast<uint8_t>(mode) | 0x8); |
1992 } | 2055 } |
1993 | 2056 |
1994 template <class Machine> | 2057 template <class Machine> |
1995 template <typename T, typename> | 2058 template <typename T, typename> |
1996 void AssemblerX86Base<Machine>::fnstcw(const typename T::Address &dst) { | 2059 void AssemblerX86Base<Machine>::fnstcw(const typename T::Address &dst) { |
1997 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2060 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2061 emitAddrSizeOverridePrefix(); |
1998 emitUint8(0xD9); | 2062 emitUint8(0xD9); |
1999 emitOperand(7, dst); | 2063 emitOperand(7, dst); |
2000 } | 2064 } |
2001 | 2065 |
2002 template <class Machine> | 2066 template <class Machine> |
2003 template <typename T, typename> | 2067 template <typename T, typename> |
2004 void AssemblerX86Base<Machine>::fldcw(const typename T::Address &src) { | 2068 void AssemblerX86Base<Machine>::fldcw(const typename T::Address &src) { |
2005 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2069 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2070 emitAddrSizeOverridePrefix(); |
2006 emitUint8(0xD9); | 2071 emitUint8(0xD9); |
2007 emitOperand(5, src); | 2072 emitOperand(5, src); |
2008 } | 2073 } |
2009 | 2074 |
2010 template <class Machine> | 2075 template <class Machine> |
2011 template <typename T, typename> | 2076 template <typename T, typename> |
2012 void AssemblerX86Base<Machine>::fistpl(const typename T::Address &dst) { | 2077 void AssemblerX86Base<Machine>::fistpl(const typename T::Address &dst) { |
2013 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2078 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2079 emitAddrSizeOverridePrefix(); |
2014 emitUint8(0xDF); | 2080 emitUint8(0xDF); |
2015 emitOperand(7, dst); | 2081 emitOperand(7, dst); |
2016 } | 2082 } |
2017 | 2083 |
2018 template <class Machine> | 2084 template <class Machine> |
2019 template <typename T, typename> | 2085 template <typename T, typename> |
2020 void AssemblerX86Base<Machine>::fistps(const typename T::Address &dst) { | 2086 void AssemblerX86Base<Machine>::fistps(const typename T::Address &dst) { |
2021 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2087 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2088 emitAddrSizeOverridePrefix(); |
2022 emitUint8(0xDB); | 2089 emitUint8(0xDB); |
2023 emitOperand(3, dst); | 2090 emitOperand(3, dst); |
2024 } | 2091 } |
2025 | 2092 |
2026 template <class Machine> | 2093 template <class Machine> |
2027 template <typename T, typename> | 2094 template <typename T, typename> |
2028 void AssemblerX86Base<Machine>::fildl(const typename T::Address &src) { | 2095 void AssemblerX86Base<Machine>::fildl(const typename T::Address &src) { |
2029 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2096 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2097 emitAddrSizeOverridePrefix(); |
2030 emitUint8(0xDF); | 2098 emitUint8(0xDF); |
2031 emitOperand(5, src); | 2099 emitOperand(5, src); |
2032 } | 2100 } |
2033 | 2101 |
2034 template <class Machine> | 2102 template <class Machine> |
2035 template <typename T, typename> | 2103 template <typename T, typename> |
2036 void AssemblerX86Base<Machine>::filds(const typename T::Address &src) { | 2104 void AssemblerX86Base<Machine>::filds(const typename T::Address &src) { |
2037 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2105 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2106 emitAddrSizeOverridePrefix(); |
2038 emitUint8(0xDB); | 2107 emitUint8(0xDB); |
2039 emitOperand(0, src); | 2108 emitOperand(0, src); |
2040 } | 2109 } |
2041 | 2110 |
2042 template <class Machine> | 2111 template <class Machine> |
2043 template <typename, typename> | 2112 template <typename, typename> |
2044 void AssemblerX86Base<Machine>::fincstp() { | 2113 void AssemblerX86Base<Machine>::fincstp() { |
2045 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2114 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2046 emitUint8(0xD9); | 2115 emitUint8(0xD9); |
2047 emitUint8(0xF7); | 2116 emitUint8(0xF7); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2083 | 2152 |
2084 template <class Machine> | 2153 template <class Machine> |
2085 template <uint32_t Tag> | 2154 template <uint32_t Tag> |
2086 void AssemblerX86Base<Machine>::arith_int( | 2155 void AssemblerX86Base<Machine>::arith_int( |
2087 Type Ty, typename Traits::GPRRegister reg, | 2156 Type Ty, typename Traits::GPRRegister reg, |
2088 const typename Traits::Address &address) { | 2157 const typename Traits::Address &address) { |
2089 static_assert(Tag < 8, "Tag must be between 0..7"); | 2158 static_assert(Tag < 8, "Tag must be between 0..7"); |
2090 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2159 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2091 if (Ty == IceType_i16) | 2160 if (Ty == IceType_i16) |
2092 emitOperandSizeOverride(); | 2161 emitOperandSizeOverride(); |
| 2162 emitAddrSizeOverridePrefix(); |
2093 emitRex(Ty, address, reg); | 2163 emitRex(Ty, address, reg); |
2094 if (isByteSizedType(Ty)) | 2164 if (isByteSizedType(Ty)) |
2095 emitUint8(Tag * 8 + 2); | 2165 emitUint8(Tag * 8 + 2); |
2096 else | 2166 else |
2097 emitUint8(Tag * 8 + 3); | 2167 emitUint8(Tag * 8 + 3); |
2098 emitOperand(gprEncoding(reg), address); | 2168 emitOperand(gprEncoding(reg), address); |
2099 } | 2169 } |
2100 | 2170 |
2101 template <class Machine> | 2171 template <class Machine> |
2102 template <uint32_t Tag> | 2172 template <uint32_t Tag> |
2103 void AssemblerX86Base<Machine>::arith_int( | 2173 void AssemblerX86Base<Machine>::arith_int( |
2104 Type Ty, const typename Traits::Address &address, | 2174 Type Ty, const typename Traits::Address &address, |
2105 typename Traits::GPRRegister reg) { | 2175 typename Traits::GPRRegister reg) { |
2106 static_assert(Tag < 8, "Tag must be between 0..7"); | 2176 static_assert(Tag < 8, "Tag must be between 0..7"); |
2107 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2177 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2108 if (Ty == IceType_i16) | 2178 if (Ty == IceType_i16) |
2109 emitOperandSizeOverride(); | 2179 emitOperandSizeOverride(); |
| 2180 emitAddrSizeOverridePrefix(); |
2110 emitRex(Ty, address, reg); | 2181 emitRex(Ty, address, reg); |
2111 if (isByteSizedType(Ty)) | 2182 if (isByteSizedType(Ty)) |
2112 emitUint8(Tag * 8 + 0); | 2183 emitUint8(Tag * 8 + 0); |
2113 else | 2184 else |
2114 emitUint8(Tag * 8 + 1); | 2185 emitUint8(Tag * 8 + 1); |
2115 emitOperand(gprEncoding(reg), address); | 2186 emitOperand(gprEncoding(reg), address); |
2116 } | 2187 } |
2117 | 2188 |
2118 template <class Machine> | 2189 template <class Machine> |
2119 template <uint32_t Tag> | 2190 template <uint32_t Tag> |
2120 void AssemblerX86Base<Machine>::arith_int( | 2191 void AssemblerX86Base<Machine>::arith_int( |
2121 Type Ty, const typename Traits::Address &address, const Immediate &imm) { | 2192 Type Ty, const typename Traits::Address &address, const Immediate &imm) { |
2122 static_assert(Tag < 8, "Tag must be between 0..7"); | 2193 static_assert(Tag < 8, "Tag must be between 0..7"); |
2123 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2194 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2124 if (Ty == IceType_i16) | 2195 if (Ty == IceType_i16) |
2125 emitOperandSizeOverride(); | 2196 emitOperandSizeOverride(); |
| 2197 emitAddrSizeOverridePrefix(); |
2126 emitRex(Ty, address, RexRegIrrelevant); | 2198 emitRex(Ty, address, RexRegIrrelevant); |
2127 if (isByteSizedType(Ty)) { | 2199 if (isByteSizedType(Ty)) { |
2128 emitComplexI8(Tag, address, imm); | 2200 emitComplexI8(Tag, address, imm); |
2129 } else { | 2201 } else { |
2130 emitComplex(Ty, Tag, address, imm); | 2202 emitComplex(Ty, Tag, address, imm); |
2131 } | 2203 } |
2132 } | 2204 } |
2133 | 2205 |
2134 template <class Machine> | 2206 template <class Machine> |
2135 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg, | 2207 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2177 emitRegisterOperand(gprEncoding(reg1), gprEncoding(reg2)); | 2249 emitRegisterOperand(gprEncoding(reg1), gprEncoding(reg2)); |
2178 } | 2250 } |
2179 | 2251 |
2180 template <class Machine> | 2252 template <class Machine> |
2181 void AssemblerX86Base<Machine>::test(Type Ty, | 2253 void AssemblerX86Base<Machine>::test(Type Ty, |
2182 const typename Traits::Address &addr, | 2254 const typename Traits::Address &addr, |
2183 typename Traits::GPRRegister reg) { | 2255 typename Traits::GPRRegister reg) { |
2184 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2256 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2185 if (Ty == IceType_i16) | 2257 if (Ty == IceType_i16) |
2186 emitOperandSizeOverride(); | 2258 emitOperandSizeOverride(); |
| 2259 emitAddrSizeOverridePrefix(); |
2187 emitRex(Ty, addr, reg); | 2260 emitRex(Ty, addr, reg); |
2188 if (isByteSizedType(Ty)) | 2261 if (isByteSizedType(Ty)) |
2189 emitUint8(0x84); | 2262 emitUint8(0x84); |
2190 else | 2263 else |
2191 emitUint8(0x85); | 2264 emitUint8(0x85); |
2192 emitOperand(gprEncoding(reg), addr); | 2265 emitOperand(gprEncoding(reg), addr); |
2193 } | 2266 } |
2194 | 2267 |
2195 template <class Machine> | 2268 template <class Machine> |
2196 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg, | 2269 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2229 | 2302 |
2230 template <class Machine> | 2303 template <class Machine> |
2231 void AssemblerX86Base<Machine>::test(Type Ty, | 2304 void AssemblerX86Base<Machine>::test(Type Ty, |
2232 const typename Traits::Address &addr, | 2305 const typename Traits::Address &addr, |
2233 const Immediate &immediate) { | 2306 const Immediate &immediate) { |
2234 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2307 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2235 // If the immediate is short, we only test the byte addr to keep the encoding | 2308 // If the immediate is short, we only test the byte addr to keep the encoding |
2236 // short. | 2309 // short. |
2237 if (immediate.is_uint8()) { | 2310 if (immediate.is_uint8()) { |
2238 // Use zero-extended 8-bit immediate. | 2311 // Use zero-extended 8-bit immediate. |
| 2312 emitAddrSizeOverridePrefix(); |
2239 emitRex(Ty, addr, RexRegIrrelevant); | 2313 emitRex(Ty, addr, RexRegIrrelevant); |
2240 emitUint8(0xF6); | 2314 emitUint8(0xF6); |
2241 emitOperand(0, addr); | 2315 emitOperand(0, addr); |
2242 emitUint8(immediate.value() & 0xFF); | 2316 emitUint8(immediate.value() & 0xFF); |
2243 } else { | 2317 } else { |
2244 if (Ty == IceType_i16) | 2318 if (Ty == IceType_i16) |
2245 emitOperandSizeOverride(); | 2319 emitOperandSizeOverride(); |
| 2320 emitAddrSizeOverridePrefix(); |
2246 emitRex(Ty, addr, RexRegIrrelevant); | 2321 emitRex(Ty, addr, RexRegIrrelevant); |
2247 emitUint8(0xF7); | 2322 emitUint8(0xF7); |
2248 emitOperand(0, addr); | 2323 emitOperand(0, addr); |
2249 emitImmediate(Ty, immediate); | 2324 emitImmediate(Ty, immediate); |
2250 } | 2325 } |
2251 } | 2326 } |
2252 | 2327 |
2253 template <class Machine> | 2328 template <class Machine> |
2254 void AssemblerX86Base<Machine>::And(Type Ty, typename Traits::GPRRegister dst, | 2329 void AssemblerX86Base<Machine>::And(Type Ty, typename Traits::GPRRegister dst, |
2255 typename Traits::GPRRegister src) { | 2330 typename Traits::GPRRegister src) { |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2512 emitUint8(0xF7); | 2587 emitUint8(0xF7); |
2513 emitRegisterOperand(6, gprEncoding(reg)); | 2588 emitRegisterOperand(6, gprEncoding(reg)); |
2514 } | 2589 } |
2515 | 2590 |
2516 template <class Machine> | 2591 template <class Machine> |
2517 void AssemblerX86Base<Machine>::div(Type Ty, | 2592 void AssemblerX86Base<Machine>::div(Type Ty, |
2518 const typename Traits::Address &addr) { | 2593 const typename Traits::Address &addr) { |
2519 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2594 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2520 if (Ty == IceType_i16) | 2595 if (Ty == IceType_i16) |
2521 emitOperandSizeOverride(); | 2596 emitOperandSizeOverride(); |
| 2597 emitAddrSizeOverridePrefix(); |
2522 emitRex(Ty, addr, RexRegIrrelevant); | 2598 emitRex(Ty, addr, RexRegIrrelevant); |
2523 if (isByteSizedArithType(Ty)) | 2599 if (isByteSizedArithType(Ty)) |
2524 emitUint8(0xF6); | 2600 emitUint8(0xF6); |
2525 else | 2601 else |
2526 emitUint8(0xF7); | 2602 emitUint8(0xF7); |
2527 emitOperand(6, addr); | 2603 emitOperand(6, addr); |
2528 } | 2604 } |
2529 | 2605 |
2530 template <class Machine> | 2606 template <class Machine> |
2531 void AssemblerX86Base<Machine>::idiv(Type Ty, | 2607 void AssemblerX86Base<Machine>::idiv(Type Ty, |
2532 typename Traits::GPRRegister reg) { | 2608 typename Traits::GPRRegister reg) { |
2533 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2609 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2534 if (Ty == IceType_i16) | 2610 if (Ty == IceType_i16) |
2535 emitOperandSizeOverride(); | 2611 emitOperandSizeOverride(); |
2536 emitRexB(Ty, reg); | 2612 emitRexB(Ty, reg); |
2537 if (isByteSizedArithType(Ty)) | 2613 if (isByteSizedArithType(Ty)) |
2538 emitUint8(0xF6); | 2614 emitUint8(0xF6); |
2539 else | 2615 else |
2540 emitUint8(0xF7); | 2616 emitUint8(0xF7); |
2541 emitRegisterOperand(7, gprEncoding(reg)); | 2617 emitRegisterOperand(7, gprEncoding(reg)); |
2542 } | 2618 } |
2543 | 2619 |
2544 template <class Machine> | 2620 template <class Machine> |
2545 void AssemblerX86Base<Machine>::idiv(Type Ty, | 2621 void AssemblerX86Base<Machine>::idiv(Type Ty, |
2546 const typename Traits::Address &addr) { | 2622 const typename Traits::Address &addr) { |
2547 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2623 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2548 if (Ty == IceType_i16) | 2624 if (Ty == IceType_i16) |
2549 emitOperandSizeOverride(); | 2625 emitOperandSizeOverride(); |
| 2626 emitAddrSizeOverridePrefix(); |
2550 emitRex(Ty, addr, RexRegIrrelevant); | 2627 emitRex(Ty, addr, RexRegIrrelevant); |
2551 if (isByteSizedArithType(Ty)) | 2628 if (isByteSizedArithType(Ty)) |
2552 emitUint8(0xF6); | 2629 emitUint8(0xF6); |
2553 else | 2630 else |
2554 emitUint8(0xF7); | 2631 emitUint8(0xF7); |
2555 emitOperand(7, addr); | 2632 emitOperand(7, addr); |
2556 } | 2633 } |
2557 | 2634 |
2558 template <class Machine> | 2635 template <class Machine> |
2559 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, | 2636 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, |
(...skipping 10 matching lines...) Expand all Loading... |
2570 } | 2647 } |
2571 | 2648 |
2572 template <class Machine> | 2649 template <class Machine> |
2573 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, | 2650 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, |
2574 const typename Traits::Address &address) { | 2651 const typename Traits::Address &address) { |
2575 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2652 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2576 assert(Ty == IceType_i16 || Ty == IceType_i32 || | 2653 assert(Ty == IceType_i16 || Ty == IceType_i32 || |
2577 (Traits::Is64Bit && Ty == IceType_i64)); | 2654 (Traits::Is64Bit && Ty == IceType_i64)); |
2578 if (Ty == IceType_i16) | 2655 if (Ty == IceType_i16) |
2579 emitOperandSizeOverride(); | 2656 emitOperandSizeOverride(); |
| 2657 emitAddrSizeOverridePrefix(); |
2580 emitRex(Ty, address, reg); | 2658 emitRex(Ty, address, reg); |
2581 emitUint8(0x0F); | 2659 emitUint8(0x0F); |
2582 emitUint8(0xAF); | 2660 emitUint8(0xAF); |
2583 emitOperand(gprEncoding(reg), address); | 2661 emitOperand(gprEncoding(reg), address); |
2584 } | 2662 } |
2585 | 2663 |
2586 template <class Machine> | 2664 template <class Machine> |
2587 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, | 2665 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, |
2588 const Immediate &imm) { | 2666 const Immediate &imm) { |
2589 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2667 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
(...skipping 25 matching lines...) Expand all Loading... |
2615 emitUint8(0xF7); | 2693 emitUint8(0xF7); |
2616 emitRegisterOperand(5, gprEncoding(reg)); | 2694 emitRegisterOperand(5, gprEncoding(reg)); |
2617 } | 2695 } |
2618 | 2696 |
2619 template <class Machine> | 2697 template <class Machine> |
2620 void AssemblerX86Base<Machine>::imul(Type Ty, | 2698 void AssemblerX86Base<Machine>::imul(Type Ty, |
2621 const typename Traits::Address &address) { | 2699 const typename Traits::Address &address) { |
2622 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2700 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2623 if (Ty == IceType_i16) | 2701 if (Ty == IceType_i16) |
2624 emitOperandSizeOverride(); | 2702 emitOperandSizeOverride(); |
| 2703 emitAddrSizeOverridePrefix(); |
2625 emitRex(Ty, address, RexRegIrrelevant); | 2704 emitRex(Ty, address, RexRegIrrelevant); |
2626 if (isByteSizedArithType(Ty)) | 2705 if (isByteSizedArithType(Ty)) |
2627 emitUint8(0xF6); | 2706 emitUint8(0xF6); |
2628 else | 2707 else |
2629 emitUint8(0xF7); | 2708 emitUint8(0xF7); |
2630 emitOperand(5, address); | 2709 emitOperand(5, address); |
2631 } | 2710 } |
2632 | 2711 |
2633 template <class Machine> | 2712 template <class Machine> |
2634 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, | 2713 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, |
(...skipping 16 matching lines...) Expand all Loading... |
2651 } | 2730 } |
2652 | 2731 |
2653 template <class Machine> | 2732 template <class Machine> |
2654 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, | 2733 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, |
2655 const typename Traits::Address &address, | 2734 const typename Traits::Address &address, |
2656 const Immediate &imm) { | 2735 const Immediate &imm) { |
2657 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2736 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2658 assert(Ty == IceType_i16 || Ty == IceType_i32); | 2737 assert(Ty == IceType_i16 || Ty == IceType_i32); |
2659 if (Ty == IceType_i16) | 2738 if (Ty == IceType_i16) |
2660 emitOperandSizeOverride(); | 2739 emitOperandSizeOverride(); |
| 2740 emitAddrSizeOverridePrefix(); |
2661 emitRex(Ty, address, dst); | 2741 emitRex(Ty, address, dst); |
2662 if (imm.is_int8()) { | 2742 if (imm.is_int8()) { |
2663 emitUint8(0x6B); | 2743 emitUint8(0x6B); |
2664 emitOperand(gprEncoding(dst), address); | 2744 emitOperand(gprEncoding(dst), address); |
2665 emitUint8(imm.value() & 0xFF); | 2745 emitUint8(imm.value() & 0xFF); |
2666 } else { | 2746 } else { |
2667 emitUint8(0x69); | 2747 emitUint8(0x69); |
2668 emitOperand(gprEncoding(dst), address); | 2748 emitOperand(gprEncoding(dst), address); |
2669 emitImmediate(Ty, imm); | 2749 emitImmediate(Ty, imm); |
2670 } | 2750 } |
(...skipping 11 matching lines...) Expand all Loading... |
2682 emitUint8(0xF7); | 2762 emitUint8(0xF7); |
2683 emitRegisterOperand(4, gprEncoding(reg)); | 2763 emitRegisterOperand(4, gprEncoding(reg)); |
2684 } | 2764 } |
2685 | 2765 |
2686 template <class Machine> | 2766 template <class Machine> |
2687 void AssemblerX86Base<Machine>::mul(Type Ty, | 2767 void AssemblerX86Base<Machine>::mul(Type Ty, |
2688 const typename Traits::Address &address) { | 2768 const typename Traits::Address &address) { |
2689 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2769 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2690 if (Ty == IceType_i16) | 2770 if (Ty == IceType_i16) |
2691 emitOperandSizeOverride(); | 2771 emitOperandSizeOverride(); |
| 2772 emitAddrSizeOverridePrefix(); |
2692 emitRex(Ty, address, RexRegIrrelevant); | 2773 emitRex(Ty, address, RexRegIrrelevant); |
2693 if (isByteSizedArithType(Ty)) | 2774 if (isByteSizedArithType(Ty)) |
2694 emitUint8(0xF6); | 2775 emitUint8(0xF6); |
2695 else | 2776 else |
2696 emitUint8(0xF7); | 2777 emitUint8(0xF7); |
2697 emitOperand(4, address); | 2778 emitOperand(4, address); |
2698 } | 2779 } |
2699 | 2780 |
2700 template <class Machine> | 2781 template <class Machine> |
2701 template <typename, typename> | 2782 template <typename, typename> |
2702 void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) { | 2783 void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) { |
2703 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2784 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2704 emitUint8(0x40 + reg); | 2785 emitUint8(0x40 + reg); |
2705 } | 2786 } |
2706 | 2787 |
2707 template <class Machine> | 2788 template <class Machine> |
2708 void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) { | 2789 void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) { |
2709 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2790 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2791 emitAddrSizeOverridePrefix(); |
2710 emitRex(IceType_i32, address, RexRegIrrelevant); | 2792 emitRex(IceType_i32, address, RexRegIrrelevant); |
2711 emitUint8(0xFF); | 2793 emitUint8(0xFF); |
2712 emitOperand(0, address); | 2794 emitOperand(0, address); |
2713 } | 2795 } |
2714 | 2796 |
2715 template <class Machine> | 2797 template <class Machine> |
2716 template <typename, typename> | 2798 template <typename, typename> |
2717 void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) { | 2799 void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) { |
2718 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2800 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2719 emitUint8(0x48 + reg); | 2801 emitUint8(0x48 + reg); |
2720 } | 2802 } |
2721 | 2803 |
2722 template <class Machine> | 2804 template <class Machine> |
2723 void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) { | 2805 void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) { |
2724 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2806 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2807 emitAddrSizeOverridePrefix(); |
2725 emitRex(IceType_i32, address, RexRegIrrelevant); | 2808 emitRex(IceType_i32, address, RexRegIrrelevant); |
2726 emitUint8(0xFF); | 2809 emitUint8(0xFF); |
2727 emitOperand(1, address); | 2810 emitOperand(1, address); |
2728 } | 2811 } |
2729 | 2812 |
2730 template <class Machine> | 2813 template <class Machine> |
2731 void AssemblerX86Base<Machine>::rol(Type Ty, typename Traits::GPRRegister reg, | 2814 void AssemblerX86Base<Machine>::rol(Type Ty, typename Traits::GPRRegister reg, |
2732 const Immediate &imm) { | 2815 const Immediate &imm) { |
2733 emitGenericShift(0, Ty, reg, imm); | 2816 emitGenericShift(0, Ty, reg, imm); |
2734 } | 2817 } |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2837 } | 2920 } |
2838 | 2921 |
2839 template <class Machine> | 2922 template <class Machine> |
2840 void AssemblerX86Base<Machine>::shld(Type Ty, | 2923 void AssemblerX86Base<Machine>::shld(Type Ty, |
2841 const typename Traits::Address &operand, | 2924 const typename Traits::Address &operand, |
2842 typename Traits::GPRRegister src) { | 2925 typename Traits::GPRRegister src) { |
2843 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2926 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2844 assert(Ty == IceType_i16 || Ty == IceType_i32); | 2927 assert(Ty == IceType_i16 || Ty == IceType_i32); |
2845 if (Ty == IceType_i16) | 2928 if (Ty == IceType_i16) |
2846 emitOperandSizeOverride(); | 2929 emitOperandSizeOverride(); |
| 2930 emitAddrSizeOverridePrefix(); |
2847 emitRex(Ty, operand, src); | 2931 emitRex(Ty, operand, src); |
2848 emitUint8(0x0F); | 2932 emitUint8(0x0F); |
2849 emitUint8(0xA5); | 2933 emitUint8(0xA5); |
2850 emitOperand(gprEncoding(src), operand); | 2934 emitOperand(gprEncoding(src), operand); |
2851 } | 2935 } |
2852 | 2936 |
2853 template <class Machine> | 2937 template <class Machine> |
2854 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst, | 2938 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst, |
2855 typename Traits::GPRRegister src) { | 2939 typename Traits::GPRRegister src) { |
2856 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2940 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
(...skipping 23 matching lines...) Expand all Loading... |
2880 } | 2964 } |
2881 | 2965 |
2882 template <class Machine> | 2966 template <class Machine> |
2883 void AssemblerX86Base<Machine>::shrd(Type Ty, | 2967 void AssemblerX86Base<Machine>::shrd(Type Ty, |
2884 const typename Traits::Address &dst, | 2968 const typename Traits::Address &dst, |
2885 typename Traits::GPRRegister src) { | 2969 typename Traits::GPRRegister src) { |
2886 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2970 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2887 assert(Ty == IceType_i16 || Ty == IceType_i32); | 2971 assert(Ty == IceType_i16 || Ty == IceType_i32); |
2888 if (Ty == IceType_i16) | 2972 if (Ty == IceType_i16) |
2889 emitOperandSizeOverride(); | 2973 emitOperandSizeOverride(); |
| 2974 emitAddrSizeOverridePrefix(); |
2890 emitRex(Ty, dst, src); | 2975 emitRex(Ty, dst, src); |
2891 emitUint8(0x0F); | 2976 emitUint8(0x0F); |
2892 emitUint8(0xAD); | 2977 emitUint8(0xAD); |
2893 emitOperand(gprEncoding(src), dst); | 2978 emitOperand(gprEncoding(src), dst); |
2894 } | 2979 } |
2895 | 2980 |
2896 template <class Machine> | 2981 template <class Machine> |
2897 void AssemblerX86Base<Machine>::neg(Type Ty, typename Traits::GPRRegister reg) { | 2982 void AssemblerX86Base<Machine>::neg(Type Ty, typename Traits::GPRRegister reg) { |
2898 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2983 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2899 if (Ty == IceType_i16) | 2984 if (Ty == IceType_i16) |
2900 emitOperandSizeOverride(); | 2985 emitOperandSizeOverride(); |
2901 emitRexB(Ty, reg); | 2986 emitRexB(Ty, reg); |
2902 if (isByteSizedArithType(Ty)) | 2987 if (isByteSizedArithType(Ty)) |
2903 emitUint8(0xF6); | 2988 emitUint8(0xF6); |
2904 else | 2989 else |
2905 emitUint8(0xF7); | 2990 emitUint8(0xF7); |
2906 emitRegisterOperand(3, gprEncoding(reg)); | 2991 emitRegisterOperand(3, gprEncoding(reg)); |
2907 } | 2992 } |
2908 | 2993 |
2909 template <class Machine> | 2994 template <class Machine> |
2910 void AssemblerX86Base<Machine>::neg(Type Ty, | 2995 void AssemblerX86Base<Machine>::neg(Type Ty, |
2911 const typename Traits::Address &addr) { | 2996 const typename Traits::Address &addr) { |
2912 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2997 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2913 if (Ty == IceType_i16) | 2998 if (Ty == IceType_i16) |
2914 emitOperandSizeOverride(); | 2999 emitOperandSizeOverride(); |
| 3000 emitAddrSizeOverridePrefix(); |
2915 emitRex(Ty, addr, RexRegIrrelevant); | 3001 emitRex(Ty, addr, RexRegIrrelevant); |
2916 if (isByteSizedArithType(Ty)) | 3002 if (isByteSizedArithType(Ty)) |
2917 emitUint8(0xF6); | 3003 emitUint8(0xF6); |
2918 else | 3004 else |
2919 emitUint8(0xF7); | 3005 emitUint8(0xF7); |
2920 emitOperand(3, addr); | 3006 emitOperand(3, addr); |
2921 } | 3007 } |
2922 | 3008 |
2923 template <class Machine> | 3009 template <class Machine> |
2924 void AssemblerX86Base<Machine>::notl(typename Traits::GPRRegister reg) { | 3010 void AssemblerX86Base<Machine>::notl(typename Traits::GPRRegister reg) { |
(...skipping 10 matching lines...) Expand all Loading... |
2935 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); | 3021 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); |
2936 emitRexB(Ty, reg); | 3022 emitRexB(Ty, reg); |
2937 emitUint8(0x0F); | 3023 emitUint8(0x0F); |
2938 emitUint8(0xC8 | gprEncoding(reg)); | 3024 emitUint8(0xC8 | gprEncoding(reg)); |
2939 } | 3025 } |
2940 | 3026 |
2941 template <class Machine> | 3027 template <class Machine> |
2942 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, | 3028 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, |
2943 typename Traits::GPRRegister src) { | 3029 typename Traits::GPRRegister src) { |
2944 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3030 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2945 assert(Ty == IceType_i16 || Ty == IceType_i32); | 3031 assert(Ty == IceType_i16 || Ty == IceType_i32 || |
| 3032 (Traits::Is64Bit && Ty == IceType_i64)); |
2946 if (Ty == IceType_i16) | 3033 if (Ty == IceType_i16) |
2947 emitOperandSizeOverride(); | 3034 emitOperandSizeOverride(); |
2948 emitRexRB(Ty, dst, src); | 3035 emitRexRB(Ty, dst, src); |
2949 emitUint8(0x0F); | 3036 emitUint8(0x0F); |
2950 emitUint8(0xBC); | 3037 emitUint8(0xBC); |
2951 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); | 3038 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); |
2952 } | 3039 } |
2953 | 3040 |
2954 template <class Machine> | 3041 template <class Machine> |
2955 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, | 3042 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, |
2956 const typename Traits::Address &src) { | 3043 const typename Traits::Address &src) { |
2957 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3044 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2958 assert(Ty == IceType_i16 || Ty == IceType_i32); | 3045 assert(Ty == IceType_i16 || Ty == IceType_i32 || |
| 3046 (Traits::Is64Bit && Ty == IceType_i64)); |
2959 if (Ty == IceType_i16) | 3047 if (Ty == IceType_i16) |
2960 emitOperandSizeOverride(); | 3048 emitOperandSizeOverride(); |
| 3049 emitAddrSizeOverridePrefix(); |
2961 emitRex(Ty, src, dst); | 3050 emitRex(Ty, src, dst); |
2962 emitUint8(0x0F); | 3051 emitUint8(0x0F); |
2963 emitUint8(0xBC); | 3052 emitUint8(0xBC); |
2964 emitOperand(gprEncoding(dst), src); | 3053 emitOperand(gprEncoding(dst), src); |
2965 } | 3054 } |
2966 | 3055 |
2967 template <class Machine> | 3056 template <class Machine> |
2968 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, | 3057 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, |
2969 typename Traits::GPRRegister src) { | 3058 typename Traits::GPRRegister src) { |
2970 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3059 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2971 assert(Ty == IceType_i16 || Ty == IceType_i32); | 3060 assert(Ty == IceType_i16 || Ty == IceType_i32 || |
| 3061 (Traits::Is64Bit && Ty == IceType_i64)); |
2972 if (Ty == IceType_i16) | 3062 if (Ty == IceType_i16) |
2973 emitOperandSizeOverride(); | 3063 emitOperandSizeOverride(); |
2974 emitRexRB(Ty, dst, src); | 3064 emitRexRB(Ty, dst, src); |
2975 emitUint8(0x0F); | 3065 emitUint8(0x0F); |
2976 emitUint8(0xBD); | 3066 emitUint8(0xBD); |
2977 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); | 3067 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); |
2978 } | 3068 } |
2979 | 3069 |
2980 template <class Machine> | 3070 template <class Machine> |
2981 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, | 3071 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, |
2982 const typename Traits::Address &src) { | 3072 const typename Traits::Address &src) { |
2983 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3073 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
2984 assert(Ty == IceType_i16 || Ty == IceType_i32); | 3074 assert(Ty == IceType_i16 || Ty == IceType_i32 || |
| 3075 (Traits::Is64Bit && Ty == IceType_i64)); |
2985 if (Ty == IceType_i16) | 3076 if (Ty == IceType_i16) |
2986 emitOperandSizeOverride(); | 3077 emitOperandSizeOverride(); |
| 3078 emitAddrSizeOverridePrefix(); |
2987 emitRex(Ty, src, dst); | 3079 emitRex(Ty, src, dst); |
2988 emitUint8(0x0F); | 3080 emitUint8(0x0F); |
2989 emitUint8(0xBD); | 3081 emitUint8(0xBD); |
2990 emitOperand(gprEncoding(dst), src); | 3082 emitOperand(gprEncoding(dst), src); |
2991 } | 3083 } |
2992 | 3084 |
2993 template <class Machine> | 3085 template <class Machine> |
2994 void AssemblerX86Base<Machine>::bt(typename Traits::GPRRegister base, | 3086 void AssemblerX86Base<Machine>::bt(typename Traits::GPRRegister base, |
2995 typename Traits::GPRRegister offset) { | 3087 typename Traits::GPRRegister offset) { |
2996 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3088 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3191 template <class Machine> | 3283 template <class Machine> |
3192 void AssemblerX86Base<Machine>::cmpxchg(Type Ty, | 3284 void AssemblerX86Base<Machine>::cmpxchg(Type Ty, |
3193 const typename Traits::Address &address, | 3285 const typename Traits::Address &address, |
3194 typename Traits::GPRRegister reg, | 3286 typename Traits::GPRRegister reg, |
3195 bool Locked) { | 3287 bool Locked) { |
3196 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3288 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
3197 if (Ty == IceType_i16) | 3289 if (Ty == IceType_i16) |
3198 emitOperandSizeOverride(); | 3290 emitOperandSizeOverride(); |
3199 if (Locked) | 3291 if (Locked) |
3200 emitUint8(0xF0); | 3292 emitUint8(0xF0); |
| 3293 emitAddrSizeOverridePrefix(); |
3201 emitRex(Ty, address, reg); | 3294 emitRex(Ty, address, reg); |
3202 emitUint8(0x0F); | 3295 emitUint8(0x0F); |
3203 if (isByteSizedArithType(Ty)) | 3296 if (isByteSizedArithType(Ty)) |
3204 emitUint8(0xB0); | 3297 emitUint8(0xB0); |
3205 else | 3298 else |
3206 emitUint8(0xB1); | 3299 emitUint8(0xB1); |
3207 emitOperand(gprEncoding(reg), address); | 3300 emitOperand(gprEncoding(reg), address); |
3208 } | 3301 } |
3209 | 3302 |
3210 template <class Machine> | 3303 template <class Machine> |
3211 void AssemblerX86Base<Machine>::cmpxchg8b( | 3304 void AssemblerX86Base<Machine>::cmpxchg8b( |
3212 const typename Traits::Address &address, bool Locked) { | 3305 const typename Traits::Address &address, bool Locked) { |
3213 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3306 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
3214 if (Locked) | 3307 if (Locked) |
3215 emitUint8(0xF0); | 3308 emitUint8(0xF0); |
| 3309 emitAddrSizeOverridePrefix(); |
3216 emitRex(IceType_i32, address, RexRegIrrelevant); | 3310 emitRex(IceType_i32, address, RexRegIrrelevant); |
3217 emitUint8(0x0F); | 3311 emitUint8(0x0F); |
3218 emitUint8(0xC7); | 3312 emitUint8(0xC7); |
3219 emitOperand(1, address); | 3313 emitOperand(1, address); |
3220 } | 3314 } |
3221 | 3315 |
3222 template <class Machine> | 3316 template <class Machine> |
3223 void AssemblerX86Base<Machine>::xadd(Type Ty, | 3317 void AssemblerX86Base<Machine>::xadd(Type Ty, |
3224 const typename Traits::Address &addr, | 3318 const typename Traits::Address &addr, |
3225 typename Traits::GPRRegister reg, | 3319 typename Traits::GPRRegister reg, |
3226 bool Locked) { | 3320 bool Locked) { |
3227 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3321 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
3228 if (Ty == IceType_i16) | 3322 if (Ty == IceType_i16) |
3229 emitOperandSizeOverride(); | 3323 emitOperandSizeOverride(); |
3230 if (Locked) | 3324 if (Locked) |
3231 emitUint8(0xF0); | 3325 emitUint8(0xF0); |
| 3326 emitAddrSizeOverridePrefix(); |
3232 emitRex(Ty, addr, reg); | 3327 emitRex(Ty, addr, reg); |
3233 emitUint8(0x0F); | 3328 emitUint8(0x0F); |
3234 if (isByteSizedArithType(Ty)) | 3329 if (isByteSizedArithType(Ty)) |
3235 emitUint8(0xC0); | 3330 emitUint8(0xC0); |
3236 else | 3331 else |
3237 emitUint8(0xC1); | 3332 emitUint8(0xC1); |
3238 emitOperand(gprEncoding(reg), addr); | 3333 emitOperand(gprEncoding(reg), addr); |
3239 } | 3334 } |
3240 | 3335 |
3241 template <class Machine> | 3336 template <class Machine> |
(...skipping 19 matching lines...) Expand all Loading... |
3261 } | 3356 } |
3262 } | 3357 } |
3263 | 3358 |
3264 template <class Machine> | 3359 template <class Machine> |
3265 void AssemblerX86Base<Machine>::xchg(Type Ty, | 3360 void AssemblerX86Base<Machine>::xchg(Type Ty, |
3266 const typename Traits::Address &addr, | 3361 const typename Traits::Address &addr, |
3267 typename Traits::GPRRegister reg) { | 3362 typename Traits::GPRRegister reg) { |
3268 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3363 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
3269 if (Ty == IceType_i16) | 3364 if (Ty == IceType_i16) |
3270 emitOperandSizeOverride(); | 3365 emitOperandSizeOverride(); |
| 3366 emitAddrSizeOverridePrefix(); |
3271 emitRex(Ty, addr, reg); | 3367 emitRex(Ty, addr, reg); |
3272 if (isByteSizedArithType(Ty)) | 3368 if (isByteSizedArithType(Ty)) |
3273 emitUint8(0x86); | 3369 emitUint8(0x86); |
3274 else | 3370 else |
3275 emitUint8(0x87); | 3371 emitUint8(0x87); |
3276 emitOperand(gprEncoding(reg), addr); | 3372 emitOperand(gprEncoding(reg), addr); |
3277 } | 3373 } |
3278 | 3374 |
3279 template <class Machine> void AssemblerX86Base<Machine>::iaca_start() { | 3375 template <class Machine> void AssemblerX86Base<Machine>::iaca_start() { |
3280 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 3376 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3493 (void)shifter; | 3589 (void)shifter; |
3494 if (Ty == IceType_i16) | 3590 if (Ty == IceType_i16) |
3495 emitOperandSizeOverride(); | 3591 emitOperandSizeOverride(); |
3496 emitRexB(Ty, operand.rm()); | 3592 emitRexB(Ty, operand.rm()); |
3497 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); | 3593 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); |
3498 emitOperand(rm, operand); | 3594 emitOperand(rm, operand); |
3499 } | 3595 } |
3500 | 3596 |
3501 } // end of namespace X86Internal | 3597 } // end of namespace X86Internal |
3502 } // end of namespace Ice | 3598 } // end of namespace Ice |
OLD | NEW |