| 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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 const Immediate &imm) { | 200 const Immediate &imm) { |
| 201 assert(Ty != IceType_i64 && "i64 not supported yet."); | 201 assert(Ty != IceType_i64 && "i64 not supported yet."); |
| 202 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 202 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 203 if (Ty == IceType_i16) | 203 if (Ty == IceType_i16) |
| 204 emitOperandSizeOverride(); | 204 emitOperandSizeOverride(); |
| 205 emitRexB(Ty, dst); | 205 emitRexB(Ty, dst); |
| 206 if (isByteSizedType(Ty)) { | 206 if (isByteSizedType(Ty)) { |
| 207 emitUint8(0xB0 + gprEncoding(dst)); | 207 emitUint8(0xB0 + gprEncoding(dst)); |
| 208 emitUint8(imm.value() & 0xFF); | 208 emitUint8(imm.value() & 0xFF); |
| 209 } else { | 209 } else { |
| 210 // TODO(jpp): When removing the assertion above ensure that in x86-64 we |
| 211 // emit a 64-bit immediate. |
| 210 emitUint8(0xB8 + gprEncoding(dst)); | 212 emitUint8(0xB8 + gprEncoding(dst)); |
| 211 emitImmediate(Ty, imm); | 213 emitImmediate(Ty, imm); |
| 212 } | 214 } |
| 213 } | 215 } |
| 214 | 216 |
| 215 template <class Machine> | 217 template <class Machine> |
| 216 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, | 218 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, |
| 217 typename Traits::GPRRegister src) { | 219 typename Traits::GPRRegister src) { |
| 218 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 220 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 219 if (Ty == IceType_i16) | 221 if (Ty == IceType_i16) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 emitOperand(0, dst); | 274 emitOperand(0, dst); |
| 273 emitUint8(imm.value() & 0xFF); | 275 emitUint8(imm.value() & 0xFF); |
| 274 } else { | 276 } else { |
| 275 emitUint8(0xC7); | 277 emitUint8(0xC7); |
| 276 emitOperand(0, dst); | 278 emitOperand(0, dst); |
| 277 emitImmediate(Ty, imm); | 279 emitImmediate(Ty, imm); |
| 278 } | 280 } |
| 279 } | 281 } |
| 280 | 282 |
| 281 template <class Machine> | 283 template <class Machine> |
| 284 template <typename T> |
| 285 typename std::enable_if<T::Is64Bit, void>::type |
| 286 AssemblerX86Base<Machine>::movabs(const typename Traits::GPRRegister Dst, |
| 287 uint64_t Imm64) { |
| 288 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 289 const bool NeedsRexW = (Imm64 & ~0xFFFFFFFFull) != 0; |
| 290 const Type RexType = NeedsRexW ? RexTypeForceRexW : RexTypeIrrelevant; |
| 291 emitRexB(RexType, Dst); |
| 292 emitUint8(0xB8 | gprEncoding(Dst)); |
| 293 // When emitting Imm64, we don't have to mask out the upper 32 bits for |
| 294 // emitInt32 will/should only emit a 32-bit constant. In reality, we are |
| 295 // paranoid, so we go ahead an mask the upper bits out anyway. |
| 296 emitInt32(Imm64 & 0xFFFFFFFF); |
| 297 if (NeedsRexW) |
| 298 emitInt32((Imm64 >> 32) & 0xFFFFFFFF); |
| 299 } |
| 300 |
| 301 template <class Machine> |
| 282 void AssemblerX86Base<Machine>::movzx(Type SrcTy, | 302 void AssemblerX86Base<Machine>::movzx(Type SrcTy, |
| 283 typename Traits::GPRRegister dst, | 303 typename Traits::GPRRegister dst, |
| 284 typename Traits::GPRRegister src) { | 304 typename Traits::GPRRegister src) { |
| 305 if (Traits::Is64Bit && SrcTy == IceType_i32) { |
| 306 // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit |
| 307 // operand to 64-bit. |
| 308 mov(IceType_i32, dst, src); |
| 309 return; |
| 310 } |
| 311 |
| 285 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 312 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 286 bool ByteSized = isByteSizedType(SrcTy); | 313 bool ByteSized = isByteSizedType(SrcTy); |
| 287 assert(ByteSized || SrcTy == IceType_i16); | 314 assert(ByteSized || SrcTy == IceType_i16); |
| 288 emitRexRB(RexTypeIrrelevant, dst, SrcTy, src); | 315 emitRexRB(RexTypeIrrelevant, dst, SrcTy, src); |
| 289 emitUint8(0x0F); | 316 emitUint8(0x0F); |
| 290 emitUint8(ByteSized ? 0xB6 : 0xB7); | 317 emitUint8(ByteSized ? 0xB6 : 0xB7); |
| 291 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); | 318 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); |
| 292 } | 319 } |
| 293 | 320 |
| 294 template <class Machine> | 321 template <class Machine> |
| 295 void AssemblerX86Base<Machine>::movzx(Type SrcTy, | 322 void AssemblerX86Base<Machine>::movzx(Type SrcTy, |
| 296 typename Traits::GPRRegister dst, | 323 typename Traits::GPRRegister dst, |
| 297 const typename Traits::Address &src) { | 324 const typename Traits::Address &src) { |
| 325 if (Traits::Is64Bit && SrcTy == IceType_i32) { |
| 326 // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit |
| 327 // operand to 64-bit. |
| 328 mov(IceType_i32, dst, src); |
| 329 return; |
| 330 } |
| 331 |
| 298 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 332 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 299 bool ByteSized = isByteSizedType(SrcTy); | 333 bool ByteSized = isByteSizedType(SrcTy); |
| 300 assert(ByteSized || SrcTy == IceType_i16); | 334 assert(ByteSized || SrcTy == IceType_i16); |
| 301 emitRex(SrcTy, src, RexTypeIrrelevant, dst); | 335 emitRex(SrcTy, src, RexTypeIrrelevant, dst); |
| 302 emitUint8(0x0F); | 336 emitUint8(0x0F); |
| 303 emitUint8(ByteSized ? 0xB6 : 0xB7); | 337 emitUint8(ByteSized ? 0xB6 : 0xB7); |
| 304 emitOperand(gprEncoding(dst), src); | 338 emitOperand(gprEncoding(dst), src); |
| 305 } | 339 } |
| 306 | 340 |
| 307 template <class Machine> | 341 template <class Machine> |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 | 386 |
| 353 template <class Machine> | 387 template <class Machine> |
| 354 void AssemblerX86Base<Machine>::cmov(Type Ty, | 388 void AssemblerX86Base<Machine>::cmov(Type Ty, |
| 355 typename Traits::Cond::BrCond cond, | 389 typename Traits::Cond::BrCond cond, |
| 356 typename Traits::GPRRegister dst, | 390 typename Traits::GPRRegister dst, |
| 357 typename Traits::GPRRegister src) { | 391 typename Traits::GPRRegister src) { |
| 358 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 392 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 359 if (Ty == IceType_i16) | 393 if (Ty == IceType_i16) |
| 360 emitOperandSizeOverride(); | 394 emitOperandSizeOverride(); |
| 361 else | 395 else |
| 362 assert(Ty == IceType_i32); | 396 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); |
| 363 emitRexRB(Ty, dst, src); | 397 emitRexRB(Ty, dst, src); |
| 364 emitUint8(0x0F); | 398 emitUint8(0x0F); |
| 365 emitUint8(0x40 + cond); | 399 emitUint8(0x40 + cond); |
| 366 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); | 400 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); |
| 367 } | 401 } |
| 368 | 402 |
| 369 template <class Machine> | 403 template <class Machine> |
| 370 void AssemblerX86Base<Machine>::cmov(Type Ty, | 404 void AssemblerX86Base<Machine>::cmov(Type Ty, |
| 371 typename Traits::Cond::BrCond cond, | 405 typename Traits::Cond::BrCond cond, |
| 372 typename Traits::GPRRegister dst, | 406 typename Traits::GPRRegister dst, |
| 373 const typename Traits::Address &src) { | 407 const typename Traits::Address &src) { |
| 374 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 408 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 375 if (Ty == IceType_i16) | 409 if (Ty == IceType_i16) |
| 376 emitOperandSizeOverride(); | 410 emitOperandSizeOverride(); |
| 377 else | 411 else |
| 378 assert(Ty == IceType_i32); | 412 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); |
| 379 emitRex(Ty, src, dst); | 413 emitRex(Ty, src, dst); |
| 380 emitUint8(0x0F); | 414 emitUint8(0x0F); |
| 381 emitUint8(0x40 + cond); | 415 emitUint8(0x40 + cond); |
| 382 emitOperand(gprEncoding(dst), src); | 416 emitOperand(gprEncoding(dst), src); |
| 383 } | 417 } |
| 384 | 418 |
| 385 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() { | 419 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() { |
| 386 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 420 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 387 emitUint8(0xF3); | 421 emitUint8(0xF3); |
| 388 emitUint8(0xA4); | 422 emitUint8(0xA4); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 416 typename Traits::XmmRegister src) { | 450 typename Traits::XmmRegister src) { |
| 417 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 451 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 418 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 452 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 419 emitRexRB(RexTypeIrrelevant, src, dst); | 453 emitRexRB(RexTypeIrrelevant, src, dst); |
| 420 emitUint8(0x0F); | 454 emitUint8(0x0F); |
| 421 emitUint8(0x11); | 455 emitUint8(0x11); |
| 422 emitXmmRegisterOperand(src, dst); | 456 emitXmmRegisterOperand(src, dst); |
| 423 } | 457 } |
| 424 | 458 |
| 425 template <class Machine> | 459 template <class Machine> |
| 426 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst, | 460 void AssemblerX86Base<Machine>::movd(Type SrcTy, |
| 461 typename Traits::XmmRegister dst, |
| 427 typename Traits::GPRRegister src) { | 462 typename Traits::GPRRegister src) { |
| 428 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 463 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 429 emitUint8(0x66); | 464 emitUint8(0x66); |
| 430 emitRexRB(RexTypeIrrelevant, dst, src); | 465 emitRexRB(SrcTy, dst, src); |
| 431 emitUint8(0x0F); | 466 emitUint8(0x0F); |
| 432 emitUint8(0x6E); | 467 emitUint8(0x6E); |
| 433 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); | 468 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); |
| 434 } | 469 } |
| 435 | 470 |
| 436 template <class Machine> | 471 template <class Machine> |
| 437 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst, | 472 void AssemblerX86Base<Machine>::movd(Type SrcTy, |
| 473 typename Traits::XmmRegister dst, |
| 438 const typename Traits::Address &src) { | 474 const typename Traits::Address &src) { |
| 439 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 475 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 440 emitUint8(0x66); | 476 emitUint8(0x66); |
| 441 emitRex(RexTypeIrrelevant, src, dst); | 477 emitRex(SrcTy, src, dst); |
| 442 emitUint8(0x0F); | 478 emitUint8(0x0F); |
| 443 emitUint8(0x6E); | 479 emitUint8(0x6E); |
| 444 emitOperand(gprEncoding(dst), src); | 480 emitOperand(gprEncoding(dst), src); |
| 445 } | 481 } |
| 446 | 482 |
| 447 template <class Machine> | 483 template <class Machine> |
| 448 void AssemblerX86Base<Machine>::movd(typename Traits::GPRRegister dst, | 484 void AssemblerX86Base<Machine>::movd(Type DestTy, |
| 485 typename Traits::GPRRegister dst, |
| 449 typename Traits::XmmRegister src) { | 486 typename Traits::XmmRegister src) { |
| 450 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 487 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 451 emitUint8(0x66); | 488 emitUint8(0x66); |
| 452 emitRexRB(RexTypeIrrelevant, src, dst); | 489 emitRexRB(DestTy, src, dst); |
| 453 emitUint8(0x0F); | 490 emitUint8(0x0F); |
| 454 emitUint8(0x7E); | 491 emitUint8(0x7E); |
| 455 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); | 492 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); |
| 456 } | 493 } |
| 457 | 494 |
| 458 template <class Machine> | 495 template <class Machine> |
| 459 void AssemblerX86Base<Machine>::movd(const typename Traits::Address &dst, | 496 void AssemblerX86Base<Machine>::movd(Type DestTy, |
| 497 const typename Traits::Address &dst, |
| 460 typename Traits::XmmRegister src) { | 498 typename Traits::XmmRegister src) { |
| 461 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 499 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 462 emitUint8(0x66); | 500 emitUint8(0x66); |
| 463 emitRex(RexTypeIrrelevant, dst, src); | 501 emitRex(DestTy, dst, src); |
| 464 emitUint8(0x0F); | 502 emitUint8(0x0F); |
| 465 emitUint8(0x7E); | 503 emitUint8(0x7E); |
| 466 emitOperand(gprEncoding(src), dst); | 504 emitOperand(gprEncoding(src), dst); |
| 467 } | 505 } |
| 468 | 506 |
| 469 template <class Machine> | 507 template <class Machine> |
| 470 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, | 508 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, |
| 471 typename Traits::XmmRegister src) { | 509 typename Traits::XmmRegister src) { |
| 472 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 510 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 473 emitUint8(0xF3); | 511 emitUint8(0xF3); |
| (...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1336 emitXmmRegisterOperand(dst, src); | 1374 emitXmmRegisterOperand(dst, src); |
| 1337 } | 1375 } |
| 1338 | 1376 |
| 1339 template <class Machine> | 1377 template <class Machine> |
| 1340 void AssemblerX86Base<Machine>::set1ps(typename Traits::XmmRegister dst, | 1378 void AssemblerX86Base<Machine>::set1ps(typename Traits::XmmRegister dst, |
| 1341 typename Traits::GPRRegister tmp1, | 1379 typename Traits::GPRRegister tmp1, |
| 1342 const Immediate &imm) { | 1380 const Immediate &imm) { |
| 1343 // Load 32-bit immediate value into tmp1. | 1381 // Load 32-bit immediate value into tmp1. |
| 1344 mov(IceType_i32, tmp1, imm); | 1382 mov(IceType_i32, tmp1, imm); |
| 1345 // Move value from tmp1 into dst. | 1383 // Move value from tmp1 into dst. |
| 1346 movd(dst, tmp1); | 1384 movd(IceType_i32, dst, tmp1); |
| 1347 // Broadcast low lane into other three lanes. | 1385 // Broadcast low lane into other three lanes. |
| 1348 shufps(RexTypeIrrelevant, dst, dst, Immediate(0x0)); | 1386 shufps(RexTypeIrrelevant, dst, dst, Immediate(0x0)); |
| 1349 } | 1387 } |
| 1350 | 1388 |
| 1351 template <class Machine> | 1389 template <class Machine> |
| 1352 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, | 1390 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, |
| 1353 typename Traits::XmmRegister dst, | 1391 typename Traits::XmmRegister dst, |
| 1354 typename Traits::XmmRegister src, | 1392 typename Traits::XmmRegister src, |
| 1355 const Immediate &imm) { | 1393 const Immediate &imm) { |
| 1356 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1394 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1480 emitUint8(0xF3); | 1518 emitUint8(0xF3); |
| 1481 emitRex(RexTypeIrrelevant, src, dst); | 1519 emitRex(RexTypeIrrelevant, src, dst); |
| 1482 emitUint8(0x0F); | 1520 emitUint8(0x0F); |
| 1483 emitUint8(0x5B); | 1521 emitUint8(0x5B); |
| 1484 emitOperand(gprEncoding(dst), src); | 1522 emitOperand(gprEncoding(dst), src); |
| 1485 } | 1523 } |
| 1486 | 1524 |
| 1487 template <class Machine> | 1525 template <class Machine> |
| 1488 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, | 1526 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, |
| 1489 typename Traits::XmmRegister dst, | 1527 typename Traits::XmmRegister dst, |
| 1528 Type SrcTy, |
| 1490 typename Traits::GPRRegister src) { | 1529 typename Traits::GPRRegister src) { |
| 1491 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1530 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1492 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); | 1531 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); |
| 1493 emitRexRB(RexTypeIrrelevant, dst, src); | 1532 emitRexRB(SrcTy, dst, src); |
| 1494 emitUint8(0x0F); | 1533 emitUint8(0x0F); |
| 1495 emitUint8(0x2A); | 1534 emitUint8(0x2A); |
| 1496 emitXmmRegisterOperand(dst, src); | 1535 emitXmmRegisterOperand(dst, src); |
| 1497 } | 1536 } |
| 1498 | 1537 |
| 1499 template <class Machine> | 1538 template <class Machine> |
| 1500 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, | 1539 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, |
| 1501 typename Traits::XmmRegister dst, | 1540 typename Traits::XmmRegister dst, |
| 1541 Type SrcTy, |
| 1502 const typename Traits::Address &src) { | 1542 const typename Traits::Address &src) { |
| 1503 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1543 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1504 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); | 1544 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); |
| 1505 emitRex(RexTypeIrrelevant, src, dst); | 1545 emitRex(SrcTy, src, dst); |
| 1506 emitUint8(0x0F); | 1546 emitUint8(0x0F); |
| 1507 emitUint8(0x2A); | 1547 emitUint8(0x2A); |
| 1508 emitOperand(gprEncoding(dst), src); | 1548 emitOperand(gprEncoding(dst), src); |
| 1509 } | 1549 } |
| 1510 | 1550 |
| 1511 template <class Machine> | 1551 template <class Machine> |
| 1512 void AssemblerX86Base<Machine>::cvtfloat2float( | 1552 void AssemblerX86Base<Machine>::cvtfloat2float( |
| 1513 Type SrcTy, typename Traits::XmmRegister dst, | 1553 Type SrcTy, typename Traits::XmmRegister dst, |
| 1514 typename Traits::XmmRegister src) { | 1554 typename Traits::XmmRegister src) { |
| 1515 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1555 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1527 const typename Traits::Address &src) { | 1567 const typename Traits::Address &src) { |
| 1528 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1568 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1529 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); | 1569 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1530 emitRex(RexTypeIrrelevant, src, dst); | 1570 emitRex(RexTypeIrrelevant, src, dst); |
| 1531 emitUint8(0x0F); | 1571 emitUint8(0x0F); |
| 1532 emitUint8(0x5A); | 1572 emitUint8(0x5A); |
| 1533 emitOperand(gprEncoding(dst), src); | 1573 emitOperand(gprEncoding(dst), src); |
| 1534 } | 1574 } |
| 1535 | 1575 |
| 1536 template <class Machine> | 1576 template <class Machine> |
| 1537 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy, | 1577 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy, |
| 1538 typename Traits::GPRRegister dst, | 1578 typename Traits::GPRRegister dst, |
| 1579 Type SrcTy, |
| 1539 typename Traits::XmmRegister src) { | 1580 typename Traits::XmmRegister src) { |
| 1540 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1581 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1541 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); | 1582 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1542 emitRexRB(RexTypeIrrelevant, dst, src); | 1583 emitRexRB(DestTy, dst, src); |
| 1543 emitUint8(0x0F); | 1584 emitUint8(0x0F); |
| 1544 emitUint8(0x2C); | 1585 emitUint8(0x2C); |
| 1545 emitXmmRegisterOperand(dst, src); | 1586 emitXmmRegisterOperand(dst, src); |
| 1546 } | 1587 } |
| 1547 | 1588 |
| 1548 template <class Machine> | 1589 template <class Machine> |
| 1549 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy, | 1590 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy, |
| 1550 typename Traits::GPRRegister dst, | 1591 typename Traits::GPRRegister dst, |
| 1592 Type SrcTy, |
| 1551 const typename Traits::Address &src) { | 1593 const typename Traits::Address &src) { |
| 1552 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1594 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1553 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); | 1595 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1554 emitRex(RexTypeIrrelevant, src, dst); | 1596 emitRex(DestTy, src, dst); |
| 1555 emitUint8(0x0F); | 1597 emitUint8(0x0F); |
| 1556 emitUint8(0x2C); | 1598 emitUint8(0x2C); |
| 1557 emitOperand(gprEncoding(dst), src); | 1599 emitOperand(gprEncoding(dst), src); |
| 1558 } | 1600 } |
| 1559 | 1601 |
| 1560 template <class Machine> | 1602 template <class Machine> |
| 1561 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, | 1603 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, |
| 1562 typename Traits::XmmRegister b) { | 1604 typename Traits::XmmRegister b) { |
| 1563 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 1605 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 1564 if (Ty == IceType_f64) | 1606 if (Ty == IceType_f64) |
| (...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2394 emitOperandSizeOverride(); | 2436 emitOperandSizeOverride(); |
| 2395 emitUint8(0x99); | 2437 emitUint8(0x99); |
| 2396 } | 2438 } |
| 2397 | 2439 |
| 2398 template <class Machine> void AssemblerX86Base<Machine>::cdq() { | 2440 template <class Machine> void AssemblerX86Base<Machine>::cdq() { |
| 2399 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2441 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2400 emitUint8(0x99); | 2442 emitUint8(0x99); |
| 2401 } | 2443 } |
| 2402 | 2444 |
| 2403 template <class Machine> | 2445 template <class Machine> |
| 2446 template <typename T> |
| 2447 typename std::enable_if<T::Is64Bit, void>::type |
| 2448 AssemblerX86Base<Machine>::cqo() { |
| 2449 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2450 emitRexB(RexTypeForceRexW, RexRegIrrelevant); |
| 2451 emitUint8(0x99); |
| 2452 } |
| 2453 |
| 2454 template <class Machine> |
| 2404 void AssemblerX86Base<Machine>::div(Type Ty, typename Traits::GPRRegister reg) { | 2455 void AssemblerX86Base<Machine>::div(Type Ty, typename Traits::GPRRegister reg) { |
| 2405 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2456 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2406 if (Ty == IceType_i16) | 2457 if (Ty == IceType_i16) |
| 2407 emitOperandSizeOverride(); | 2458 emitOperandSizeOverride(); |
| 2408 emitRexB(Ty, reg); | 2459 emitRexB(Ty, reg); |
| 2409 if (isByteSizedArithType(Ty)) | 2460 if (isByteSizedArithType(Ty)) |
| 2410 emitUint8(0xF6); | 2461 emitUint8(0xF6); |
| 2411 else | 2462 else |
| 2412 emitUint8(0xF7); | 2463 emitUint8(0xF7); |
| 2413 emitRegisterOperand(6, gprEncoding(reg)); | 2464 emitRegisterOperand(6, gprEncoding(reg)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2452 emitUint8(0xF6); | 2503 emitUint8(0xF6); |
| 2453 else | 2504 else |
| 2454 emitUint8(0xF7); | 2505 emitUint8(0xF7); |
| 2455 emitOperand(7, addr); | 2506 emitOperand(7, addr); |
| 2456 } | 2507 } |
| 2457 | 2508 |
| 2458 template <class Machine> | 2509 template <class Machine> |
| 2459 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, | 2510 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, |
| 2460 typename Traits::GPRRegister src) { | 2511 typename Traits::GPRRegister src) { |
| 2461 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2512 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2462 assert(Ty == IceType_i16 || Ty == IceType_i32); | 2513 assert(Ty == IceType_i16 || Ty == IceType_i32 || |
| 2514 (Traits::Is64Bit && Ty == IceType_i64)); |
| 2463 if (Ty == IceType_i16) | 2515 if (Ty == IceType_i16) |
| 2464 emitOperandSizeOverride(); | 2516 emitOperandSizeOverride(); |
| 2465 emitRexRB(Ty, dst, src); | 2517 emitRexRB(Ty, dst, src); |
| 2466 emitUint8(0x0F); | 2518 emitUint8(0x0F); |
| 2467 emitUint8(0xAF); | 2519 emitUint8(0xAF); |
| 2468 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); | 2520 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); |
| 2469 } | 2521 } |
| 2470 | 2522 |
| 2471 template <class Machine> | 2523 template <class Machine> |
| 2472 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, | 2524 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, |
| 2473 const typename Traits::Address &address) { | 2525 const typename Traits::Address &address) { |
| 2474 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2526 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2475 assert(Ty == IceType_i16 || Ty == IceType_i32); | 2527 assert(Ty == IceType_i16 || Ty == IceType_i32 || |
| 2528 (Traits::Is64Bit && Ty == IceType_i64)); |
| 2476 if (Ty == IceType_i16) | 2529 if (Ty == IceType_i16) |
| 2477 emitOperandSizeOverride(); | 2530 emitOperandSizeOverride(); |
| 2478 emitRex(Ty, address, reg); | 2531 emitRex(Ty, address, reg); |
| 2479 emitUint8(0x0F); | 2532 emitUint8(0x0F); |
| 2480 emitUint8(0xAF); | 2533 emitUint8(0xAF); |
| 2481 emitOperand(gprEncoding(reg), address); | 2534 emitOperand(gprEncoding(reg), address); |
| 2482 } | 2535 } |
| 2483 | 2536 |
| 2484 template <class Machine> | 2537 template <class Machine> |
| 2485 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, | 2538 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2783 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2836 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2784 emitRexB(IceType_i32, reg); | 2837 emitRexB(IceType_i32, reg); |
| 2785 emitUint8(0xF7); | 2838 emitUint8(0xF7); |
| 2786 emitUint8(0xD0 | gprEncoding(reg)); | 2839 emitUint8(0xD0 | gprEncoding(reg)); |
| 2787 } | 2840 } |
| 2788 | 2841 |
| 2789 template <class Machine> | 2842 template <class Machine> |
| 2790 void AssemblerX86Base<Machine>::bswap(Type Ty, | 2843 void AssemblerX86Base<Machine>::bswap(Type Ty, |
| 2791 typename Traits::GPRRegister reg) { | 2844 typename Traits::GPRRegister reg) { |
| 2792 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2845 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2793 assert(Ty == IceType_i32); | 2846 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); |
| 2794 (void)Ty; | |
| 2795 emitRexB(Ty, reg); | 2847 emitRexB(Ty, reg); |
| 2796 emitUint8(0x0F); | 2848 emitUint8(0x0F); |
| 2797 emitUint8(0xC8 | gprEncoding(reg)); | 2849 emitUint8(0xC8 | gprEncoding(reg)); |
| 2798 } | 2850 } |
| 2799 | 2851 |
| 2800 template <class Machine> | 2852 template <class Machine> |
| 2801 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, | 2853 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, |
| 2802 typename Traits::GPRRegister src) { | 2854 typename Traits::GPRRegister src) { |
| 2803 AssemblerBuffer::EnsureCapacity ensured(&Buffer); | 2855 AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| 2804 assert(Ty == IceType_i16 || Ty == IceType_i32); | 2856 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3282 (void)shifter; | 3334 (void)shifter; |
| 3283 if (Ty == IceType_i16) | 3335 if (Ty == IceType_i16) |
| 3284 emitOperandSizeOverride(); | 3336 emitOperandSizeOverride(); |
| 3285 emitRexB(Ty, operand.rm()); | 3337 emitRexB(Ty, operand.rm()); |
| 3286 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); | 3338 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); |
| 3287 emitOperand(rm, operand); | 3339 emitOperand(rm, operand); |
| 3288 } | 3340 } |
| 3289 | 3341 |
| 3290 } // end of namespace X86Internal | 3342 } // end of namespace X86Internal |
| 3291 } // end of namespace Ice | 3343 } // end of namespace Ice |
| OLD | NEW |