OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 // | 4 // |
5 // Modified by the Subzero authors. | 5 // Modified by the Subzero authors. |
6 // | 6 // |
7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// | 7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// |
8 // | 8 // |
9 // The Subzero Code Generator | 9 // The Subzero Code Generator |
10 // | 10 // |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 llvm_unreachable("Use movzxw or movsxw instead."); | 251 llvm_unreachable("Use movzxw or movsxw instead."); |
252 } | 252 } |
253 | 253 |
254 void AssemblerX86::movw(const Address &dst, GPRRegister src) { | 254 void AssemblerX86::movw(const Address &dst, GPRRegister src) { |
255 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 255 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
256 EmitOperandSizeOverride(); | 256 EmitOperandSizeOverride(); |
257 EmitUint8(0x89); | 257 EmitUint8(0x89); |
258 EmitOperand(src, dst); | 258 EmitOperand(src, dst); |
259 } | 259 } |
260 | 260 |
261 void AssemblerX86::leal(GPRRegister dst, const Address &src) { | 261 void AssemblerX86::lea(Type Ty, GPRRegister dst, const Address &src) { |
262 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 262 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 263 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 264 if (Ty == IceType_i16) |
| 265 EmitOperandSizeOverride(); |
263 EmitUint8(0x8D); | 266 EmitUint8(0x8D); |
264 EmitOperand(dst, src); | 267 EmitOperand(dst, src); |
265 } | 268 } |
266 | 269 |
267 void AssemblerX86::cmov(CondX86::BrCond cond, GPRRegister dst, | 270 void AssemblerX86::cmov(CondX86::BrCond cond, GPRRegister dst, |
268 GPRRegister src) { | 271 GPRRegister src) { |
269 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 272 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
270 EmitUint8(0x0F); | 273 EmitUint8(0x0F); |
271 EmitUint8(0x40 + cond); | 274 EmitUint8(0x40 + cond); |
272 EmitRegisterOperand(dst, src); | 275 EmitRegisterOperand(dst, src); |
(...skipping 27 matching lines...) Expand all Loading... |
300 EmitUint8(0x0F); | 303 EmitUint8(0x0F); |
301 EmitUint8(0x11); | 304 EmitUint8(0x11); |
302 EmitXmmRegisterOperand(src, dst); | 305 EmitXmmRegisterOperand(src, dst); |
303 } | 306 } |
304 | 307 |
305 void AssemblerX86::movd(XmmRegister dst, GPRRegister src) { | 308 void AssemblerX86::movd(XmmRegister dst, GPRRegister src) { |
306 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 309 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
307 EmitUint8(0x66); | 310 EmitUint8(0x66); |
308 EmitUint8(0x0F); | 311 EmitUint8(0x0F); |
309 EmitUint8(0x6E); | 312 EmitUint8(0x6E); |
310 EmitOperand(dst, Operand(src)); | 313 EmitRegisterOperand(dst, src); |
| 314 } |
| 315 |
| 316 void AssemblerX86::movd(XmmRegister dst, const Address &src) { |
| 317 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 318 EmitUint8(0x66); |
| 319 EmitUint8(0x0F); |
| 320 EmitUint8(0x6E); |
| 321 EmitOperand(dst, src); |
311 } | 322 } |
312 | 323 |
313 void AssemblerX86::movd(GPRRegister dst, XmmRegister src) { | 324 void AssemblerX86::movd(GPRRegister dst, XmmRegister src) { |
314 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 325 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
315 EmitUint8(0x66); | 326 EmitUint8(0x66); |
316 EmitUint8(0x0F); | 327 EmitUint8(0x0F); |
317 EmitUint8(0x7E); | 328 EmitUint8(0x7E); |
318 EmitOperand(src, Operand(dst)); | 329 EmitRegisterOperand(src, dst); |
| 330 } |
| 331 |
| 332 void AssemblerX86::movd(const Address &dst, XmmRegister src) { |
| 333 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 334 EmitUint8(0x66); |
| 335 EmitUint8(0x0F); |
| 336 EmitUint8(0x7E); |
| 337 EmitOperand(src, dst); |
319 } | 338 } |
320 | 339 |
321 void AssemblerX86::movq(const Address &dst, XmmRegister src) { | 340 void AssemblerX86::movq(const Address &dst, XmmRegister src) { |
322 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 341 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
323 EmitUint8(0x66); | 342 EmitUint8(0x66); |
324 EmitUint8(0x0F); | 343 EmitUint8(0x0F); |
325 EmitUint8(0xD6); | 344 EmitUint8(0xD6); |
326 EmitOperand(src, Operand(dst)); | 345 EmitOperand(src, Operand(dst)); |
327 } | 346 } |
328 | 347 |
(...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 EmitUint8(imm.value() & 0xFF); | 1506 EmitUint8(imm.value() & 0xFF); |
1488 } | 1507 } |
1489 | 1508 |
1490 void AssemblerX86::shrd(const Address &dst, GPRRegister src) { | 1509 void AssemblerX86::shrd(const Address &dst, GPRRegister src) { |
1491 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1510 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1492 EmitUint8(0x0F); | 1511 EmitUint8(0x0F); |
1493 EmitUint8(0xAD); | 1512 EmitUint8(0xAD); |
1494 EmitOperand(src, Operand(dst)); | 1513 EmitOperand(src, Operand(dst)); |
1495 } | 1514 } |
1496 | 1515 |
1497 void AssemblerX86::negl(GPRRegister reg) { | 1516 void AssemblerX86::neg(Type Ty, GPRRegister reg) { |
1498 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1517 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1499 EmitUint8(0xF7); | 1518 if (Ty == IceType_i16) |
1500 EmitOperand(3, Operand(reg)); | 1519 EmitOperandSizeOverride(); |
| 1520 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1521 EmitUint8(0xF6); |
| 1522 else |
| 1523 EmitUint8(0xF7); |
| 1524 EmitRegisterOperand(3, reg); |
| 1525 } |
| 1526 |
| 1527 void AssemblerX86::neg(Type Ty, const Address &addr) { |
| 1528 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1529 if (Ty == IceType_i16) |
| 1530 EmitOperandSizeOverride(); |
| 1531 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1532 EmitUint8(0xF6); |
| 1533 else |
| 1534 EmitUint8(0xF7); |
| 1535 EmitOperand(3, addr); |
1501 } | 1536 } |
1502 | 1537 |
1503 void AssemblerX86::notl(GPRRegister reg) { | 1538 void AssemblerX86::notl(GPRRegister reg) { |
1504 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1539 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1505 EmitUint8(0xF7); | 1540 EmitUint8(0xF7); |
1506 EmitUint8(0xD0 | reg); | 1541 EmitUint8(0xD0 | reg); |
1507 } | 1542 } |
1508 | 1543 |
1509 void AssemblerX86::bsrl(GPRRegister dst, GPRRegister src) { | 1544 void AssemblerX86::bswap(Type Ty, GPRRegister reg) { |
1510 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1545 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1546 assert(Ty == IceType_i32); |
| 1547 EmitUint8(0x0F); |
| 1548 EmitUint8(0xC8 | reg); |
| 1549 } |
| 1550 |
| 1551 void AssemblerX86::bsf(Type Ty, GPRRegister dst, GPRRegister src) { |
| 1552 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1553 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 1554 if (Ty == IceType_i16) |
| 1555 EmitOperandSizeOverride(); |
| 1556 EmitUint8(0x0F); |
| 1557 EmitUint8(0xBC); |
| 1558 EmitRegisterOperand(dst, src); |
| 1559 } |
| 1560 |
| 1561 void AssemblerX86::bsf(Type Ty, GPRRegister dst, const Address &src) { |
| 1562 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1563 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 1564 if (Ty == IceType_i16) |
| 1565 EmitOperandSizeOverride(); |
| 1566 EmitUint8(0x0F); |
| 1567 EmitUint8(0xBC); |
| 1568 EmitOperand(dst, src); |
| 1569 } |
| 1570 |
| 1571 void AssemblerX86::bsr(Type Ty, GPRRegister dst, GPRRegister src) { |
| 1572 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1573 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 1574 if (Ty == IceType_i16) |
| 1575 EmitOperandSizeOverride(); |
1511 EmitUint8(0x0F); | 1576 EmitUint8(0x0F); |
1512 EmitUint8(0xBD); | 1577 EmitUint8(0xBD); |
1513 EmitRegisterOperand(dst, src); | 1578 EmitRegisterOperand(dst, src); |
1514 } | 1579 } |
1515 | 1580 |
| 1581 void AssemblerX86::bsr(Type Ty, GPRRegister dst, const Address &src) { |
| 1582 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1583 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 1584 if (Ty == IceType_i16) |
| 1585 EmitOperandSizeOverride(); |
| 1586 EmitUint8(0x0F); |
| 1587 EmitUint8(0xBD); |
| 1588 EmitOperand(dst, src); |
| 1589 } |
| 1590 |
1516 void AssemblerX86::bt(GPRRegister base, GPRRegister offset) { | 1591 void AssemblerX86::bt(GPRRegister base, GPRRegister offset) { |
1517 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1592 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1518 EmitUint8(0x0F); | 1593 EmitUint8(0x0F); |
1519 EmitUint8(0xA3); | 1594 EmitUint8(0xA3); |
1520 EmitRegisterOperand(offset, base); | 1595 EmitRegisterOperand(offset, base); |
1521 } | 1596 } |
1522 | 1597 |
1523 void AssemblerX86::ret() { | 1598 void AssemblerX86::ret() { |
1524 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1599 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1525 EmitUint8(0xC3); | 1600 EmitUint8(0xC3); |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1854 void AssemblerX86::EmitGenericShift(int rm, const Operand &operand, | 1929 void AssemblerX86::EmitGenericShift(int rm, const Operand &operand, |
1855 GPRRegister shifter) { | 1930 GPRRegister shifter) { |
1856 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1931 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1857 assert(shifter == RegX8632::Encoded_Reg_ecx); | 1932 assert(shifter == RegX8632::Encoded_Reg_ecx); |
1858 EmitUint8(0xD3); | 1933 EmitUint8(0xD3); |
1859 EmitOperand(rm, Operand(operand)); | 1934 EmitOperand(rm, Operand(operand)); |
1860 } | 1935 } |
1861 | 1936 |
1862 } // end of namespace x86 | 1937 } // end of namespace x86 |
1863 } // end of namespace Ice | 1938 } // end of namespace Ice |
OLD | NEW |