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

Side by Side Diff: src/assembler_ia32.cpp

Issue 595093002: Handle "inplace" ops and unary ops w/ assembler (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: format Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/assembler_ia32.h ('k') | tests_lit/llvm2ice_tests/vector-ops.ll » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/assembler_ia32.h ('k') | tests_lit/llvm2ice_tests/vector-ops.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698