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

Side by Side Diff: src/IceInstX8632.h

Issue 574133002: Add initial integrated assembler w/ some Xmm ops. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: remove duplicate pxor, and use enum Created 6 years, 3 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/IceInst.cpp ('k') | src/IceInstX8632.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceInstX8632.h - Low-level x86 instructions --*- C++ -*-===// 1 //===- subzero/src/IceInstX8632.h - Low-level x86 instructions --*- C++ -*-===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file declares the InstX8632 and OperandX8632 classes and 10 // This file declares the InstX8632 and OperandX8632 classes and
11 // their subclasses. This represents the machine instructions and 11 // their subclasses. This represents the machine instructions and
12 // operands used for x86-32 code selection. 12 // operands used for x86-32 code selection.
13 // 13 //
14 //===----------------------------------------------------------------------===// 14 //===----------------------------------------------------------------------===//
15 15
16 #ifndef SUBZERO_SRC_ICEINSTX8632_H 16 #ifndef SUBZERO_SRC_ICEINSTX8632_H
17 #define SUBZERO_SRC_ICEINSTX8632_H 17 #define SUBZERO_SRC_ICEINSTX8632_H
18 18
19 #include "assembler_ia32.h"
19 #include "IceDefs.h" 20 #include "IceDefs.h"
20 #include "IceInst.h" 21 #include "IceInst.h"
21 #include "IceConditionCodesX8632.h" 22 #include "IceConditionCodesX8632.h"
22 #include "IceInstX8632.def" 23 #include "IceInstX8632.def"
23 #include "IceOperand.h" 24 #include "IceOperand.h"
24 25
25 namespace Ice { 26 namespace Ice {
26 27
27 class TargetX8632; 28 class TargetX8632;
28 29
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 uint16_t Shift = 0, 69 uint16_t Shift = 0,
69 SegmentRegisters SegmentReg = DefaultSegment) { 70 SegmentRegisters SegmentReg = DefaultSegment) {
70 return new (Func->allocate<OperandX8632Mem>()) 71 return new (Func->allocate<OperandX8632Mem>())
71 OperandX8632Mem(Func, Ty, Base, Offset, Index, Shift, SegmentReg); 72 OperandX8632Mem(Func, Ty, Base, Offset, Index, Shift, SegmentReg);
72 } 73 }
73 Variable *getBase() const { return Base; } 74 Variable *getBase() const { return Base; }
74 Constant *getOffset() const { return Offset; } 75 Constant *getOffset() const { return Offset; }
75 Variable *getIndex() const { return Index; } 76 Variable *getIndex() const { return Index; }
76 uint16_t getShift() const { return Shift; } 77 uint16_t getShift() const { return Shift; }
77 SegmentRegisters getSegmentRegister() const { return SegmentReg; } 78 SegmentRegisters getSegmentRegister() const { return SegmentReg; }
79 x86::Address toAsmAddress(Assembler *Asm) const;
78 virtual void emit(const Cfg *Func) const; 80 virtual void emit(const Cfg *Func) const;
79 using OperandX8632::dump; 81 using OperandX8632::dump;
80 virtual void dump(const Cfg *Func, Ostream &Str) const; 82 virtual void dump(const Cfg *Func, Ostream &Str) const;
81 83
82 static bool classof(const Operand *Operand) { 84 static bool classof(const Operand *Operand) {
83 return Operand->getKind() == static_cast<OperandKind>(kMem); 85 return Operand->getKind() == static_cast<OperandKind>(kMem);
84 } 86 }
85 87
86 private: 88 private:
87 OperandX8632Mem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, 89 OperandX8632Mem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset,
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 391
390 // AdjustStack instruction - subtracts esp by the given amount and 392 // AdjustStack instruction - subtracts esp by the given amount and
391 // updates the stack offset during code emission. 393 // updates the stack offset during code emission.
392 class InstX8632AdjustStack : public InstX8632 { 394 class InstX8632AdjustStack : public InstX8632 {
393 public: 395 public:
394 static InstX8632AdjustStack *create(Cfg *Func, SizeT Amount, Variable *Esp) { 396 static InstX8632AdjustStack *create(Cfg *Func, SizeT Amount, Variable *Esp) {
395 return new (Func->allocate<InstX8632AdjustStack>()) 397 return new (Func->allocate<InstX8632AdjustStack>())
396 InstX8632AdjustStack(Func, Amount, Esp); 398 InstX8632AdjustStack(Func, Amount, Esp);
397 } 399 }
398 virtual void emit(const Cfg *Func) const; 400 virtual void emit(const Cfg *Func) const;
401 virtual void emitIAS(const Cfg *Func) const;
399 virtual void dump(const Cfg *Func) const; 402 virtual void dump(const Cfg *Func) const;
400 static bool classof(const Inst *Inst) { return isClassof(Inst, Adjuststack); } 403 static bool classof(const Inst *Inst) { return isClassof(Inst, Adjuststack); }
401 404
402 private: 405 private:
403 InstX8632AdjustStack(Cfg *Func, SizeT Amount, Variable *Esp); 406 InstX8632AdjustStack(Cfg *Func, SizeT Amount, Variable *Esp);
404 InstX8632AdjustStack(const InstX8632AdjustStack &) LLVM_DELETED_FUNCTION; 407 InstX8632AdjustStack(const InstX8632AdjustStack &) LLVM_DELETED_FUNCTION;
405 InstX8632AdjustStack &operator=(const InstX8632AdjustStack &) 408 InstX8632AdjustStack &operator=(const InstX8632AdjustStack &)
406 LLVM_DELETED_FUNCTION; 409 LLVM_DELETED_FUNCTION;
407 SizeT Amount; 410 SizeT Amount;
408 }; 411 };
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 } 474 }
472 virtual void emit(const Cfg *Func) const { 475 virtual void emit(const Cfg *Func) const {
473 Ostream &Str = Func->getContext()->getStrEmit(); 476 Ostream &Str = Func->getContext()->getStrEmit();
474 assert(getSrcSize() == 1); 477 assert(getSrcSize() == 1);
475 Str << "\t" << Opcode << "\t"; 478 Str << "\t" << Opcode << "\t";
476 getDest()->emit(Func); 479 getDest()->emit(Func);
477 Str << ", "; 480 Str << ", ";
478 getSrc(0)->emit(Func); 481 getSrc(0)->emit(Func);
479 Str << "\n"; 482 Str << "\n";
480 } 483 }
484 virtual void emitIAS(const Cfg *Func) const { emit(Func); }
481 virtual void dump(const Cfg *Func) const { 485 virtual void dump(const Cfg *Func) const {
482 Ostream &Str = Func->getContext()->getStrDump(); 486 Ostream &Str = Func->getContext()->getStrDump();
483 dumpDest(Func); 487 dumpDest(Func);
484 Str << " = " << Opcode << "." << getDest()->getType() << " "; 488 Str << " = " << Opcode << "." << getDest()->getType() << " ";
485 dumpSources(Func); 489 dumpSources(Func);
486 } 490 }
487 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } 491 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
488 492
489 private: 493 private:
490 InstX8632Unaryop(Cfg *Func, Variable *Dest, Operand *Src) 494 InstX8632Unaryop(Cfg *Func, Variable *Dest, Operand *Src)
491 : InstX8632(Func, K, 1, Dest) { 495 : InstX8632(Func, K, 1, Dest) {
492 addSource(Src); 496 addSource(Src);
493 } 497 }
494 InstX8632Unaryop(const InstX8632Unaryop &) LLVM_DELETED_FUNCTION; 498 InstX8632Unaryop(const InstX8632Unaryop &) LLVM_DELETED_FUNCTION;
495 InstX8632Unaryop &operator=(const InstX8632Unaryop &) LLVM_DELETED_FUNCTION; 499 InstX8632Unaryop &operator=(const InstX8632Unaryop &) LLVM_DELETED_FUNCTION;
496 virtual ~InstX8632Unaryop() {} 500 virtual ~InstX8632Unaryop() {}
497 static const char *Opcode; 501 static const char *Opcode;
498 }; 502 };
499 503
504 void emitIASVarOperandTyXMM(const Cfg *Func, Type Ty, const Variable *Var,
505 const Operand *Src,
506 const x86::AssemblerX86::TypedXmmEmitters &Emitter);
507
508 template <InstX8632::InstKindX8632 K>
509 class InstX8632UnaryopXmm : public InstX8632 {
510 public:
511 static InstX8632UnaryopXmm *create(Cfg *Func, Variable *Dest, Operand *Src) {
512 return new (Func->allocate<InstX8632UnaryopXmm>())
513 InstX8632UnaryopXmm(Func, Dest, Src);
514 }
515 virtual void emit(const Cfg *Func) const {
516 Ostream &Str = Func->getContext()->getStrEmit();
517 assert(getSrcSize() == 1);
518 Str << "\t" << Opcode << "\t";
519 getDest()->emit(Func);
520 Str << ", ";
521 getSrc(0)->emit(Func);
522 Str << "\n";
523 }
524 virtual void emitIAS(const Cfg *Func) const {
525 Type Ty = getDest()->getType();
526 assert(getSrcSize() == 1);
527 emitIASVarOperandTyXMM(Func, Ty, getDest(), getSrc(0), Emitter);
528 }
529 virtual void dump(const Cfg *Func) const {
530 Ostream &Str = Func->getContext()->getStrDump();
531 dumpDest(Func);
532 Str << " = " << Opcode << "." << getDest()->getType() << " ";
533 dumpSources(Func);
534 }
535 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
536
537 private:
538 InstX8632UnaryopXmm(Cfg *Func, Variable *Dest, Operand *Src)
539 : InstX8632(Func, K, 1, Dest) {
540 addSource(Src);
541 }
542 InstX8632UnaryopXmm(const InstX8632UnaryopXmm &) LLVM_DELETED_FUNCTION;
543 InstX8632UnaryopXmm &
544 operator=(const InstX8632UnaryopXmm &) LLVM_DELETED_FUNCTION;
545 virtual ~InstX8632UnaryopXmm() {}
546 static const char *Opcode;
547 static const x86::AssemblerX86::TypedXmmEmitters Emitter;
548 };
549
500 // See the definition of emitTwoAddress() for a description of 550 // See the definition of emitTwoAddress() for a description of
501 // ShiftHack. 551 // ShiftHack.
502 void emitTwoAddress(const char *Opcode, const Inst *Inst, const Cfg *Func, 552 void emitTwoAddress(const char *Opcode, const Inst *Inst, const Cfg *Func,
503 bool ShiftHack = false); 553 bool ShiftHack = false);
504 554
505 template <InstX8632::InstKindX8632 K, bool ShiftHack = false> 555 template <InstX8632::InstKindX8632 K, bool ShiftHack = false>
506 class InstX8632Binop : public InstX8632 { 556 class InstX8632Binop : public InstX8632 {
507 public: 557 public:
508 // Create an ordinary binary-op instruction like add or sub. 558 // Create an ordinary binary-op instruction like add or sub.
509 static InstX8632Binop *create(Cfg *Func, Variable *Dest, Operand *Source) { 559 static InstX8632Binop *create(Cfg *Func, Variable *Dest, Operand *Source) {
(...skipping 16 matching lines...) Expand all
526 : InstX8632(Func, K, 2, Dest) { 576 : InstX8632(Func, K, 2, Dest) {
527 addSource(Dest); 577 addSource(Dest);
528 addSource(Source); 578 addSource(Source);
529 } 579 }
530 InstX8632Binop(const InstX8632Binop &) LLVM_DELETED_FUNCTION; 580 InstX8632Binop(const InstX8632Binop &) LLVM_DELETED_FUNCTION;
531 InstX8632Binop &operator=(const InstX8632Binop &) LLVM_DELETED_FUNCTION; 581 InstX8632Binop &operator=(const InstX8632Binop &) LLVM_DELETED_FUNCTION;
532 virtual ~InstX8632Binop() {} 582 virtual ~InstX8632Binop() {}
533 static const char *Opcode; 583 static const char *Opcode;
534 }; 584 };
535 585
586 template <InstX8632::InstKindX8632 K, bool NeedsElementType>
587 class InstX8632BinopXmm : public InstX8632 {
588 public:
589 // Create an XMM binary-op instruction like addss or addps.
590 static InstX8632BinopXmm *create(Cfg *Func, Variable *Dest, Operand *Source) {
591 return new (Func->allocate<InstX8632BinopXmm>())
592 InstX8632BinopXmm(Func, Dest, Source);
593 }
594 virtual void emit(const Cfg *Func) const {
595 const bool ShiftHack = false;
596 emitTwoAddress(Opcode, this, Func, ShiftHack);
597 }
598 virtual void emitIAS(const Cfg *Func) const {
599 Type Ty = getDest()->getType();
600 if (NeedsElementType)
601 Ty = typeElementType(Ty);
602 assert(getSrcSize() == 2);
603 emitIASVarOperandTyXMM(Func, Ty, getDest(), getSrc(1), Emitter);
604 }
605 virtual void dump(const Cfg *Func) const {
606 Ostream &Str = Func->getContext()->getStrDump();
607 dumpDest(Func);
608 Str << " = " << Opcode << "." << getDest()->getType() << " ";
609 dumpSources(Func);
610 }
611 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
612
613 private:
614 InstX8632BinopXmm(Cfg *Func, Variable *Dest, Operand *Source)
615 : InstX8632(Func, K, 2, Dest) {
616 addSource(Dest);
617 addSource(Source);
618 }
619 InstX8632BinopXmm(const InstX8632BinopXmm &) LLVM_DELETED_FUNCTION;
620 InstX8632BinopXmm &operator=(const InstX8632BinopXmm &) LLVM_DELETED_FUNCTION;
621 virtual ~InstX8632BinopXmm() {}
622 static const char *Opcode;
623 static const x86::AssemblerX86::TypedXmmEmitters Emitter;
624 };
625
536 template <InstX8632::InstKindX8632 K> class InstX8632Ternop : public InstX8632 { 626 template <InstX8632::InstKindX8632 K> class InstX8632Ternop : public InstX8632 {
537 public: 627 public:
538 // Create a ternary-op instruction like div or idiv. 628 // Create a ternary-op instruction like div or idiv.
539 static InstX8632Ternop *create(Cfg *Func, Variable *Dest, Operand *Source1, 629 static InstX8632Ternop *create(Cfg *Func, Variable *Dest, Operand *Source1,
540 Operand *Source2) { 630 Operand *Source2) {
541 return new (Func->allocate<InstX8632Ternop>()) 631 return new (Func->allocate<InstX8632Ternop>())
542 InstX8632Ternop(Func, Dest, Source1, Source2); 632 InstX8632Ternop(Func, Dest, Source1, Source2);
543 } 633 }
544 virtual void emit(const Cfg *Func) const { 634 virtual void emit(const Cfg *Func) const {
545 Ostream &Str = Func->getContext()->getStrEmit(); 635 Ostream &Str = Func->getContext()->getStrEmit();
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 740
651 static const char *Opcode; 741 static const char *Opcode;
652 }; 742 };
653 743
654 typedef InstX8632Inplaceop<InstX8632::Bswap> InstX8632Bswap; 744 typedef InstX8632Inplaceop<InstX8632::Bswap> InstX8632Bswap;
655 typedef InstX8632Inplaceop<InstX8632::Neg> InstX8632Neg; 745 typedef InstX8632Inplaceop<InstX8632::Neg> InstX8632Neg;
656 typedef InstX8632Unaryop<InstX8632::Bsf> InstX8632Bsf; 746 typedef InstX8632Unaryop<InstX8632::Bsf> InstX8632Bsf;
657 typedef InstX8632Unaryop<InstX8632::Bsr> InstX8632Bsr; 747 typedef InstX8632Unaryop<InstX8632::Bsr> InstX8632Bsr;
658 typedef InstX8632Unaryop<InstX8632::Lea> InstX8632Lea; 748 typedef InstX8632Unaryop<InstX8632::Lea> InstX8632Lea;
659 typedef InstX8632Unaryop<InstX8632::Movd> InstX8632Movd; 749 typedef InstX8632Unaryop<InstX8632::Movd> InstX8632Movd;
660 typedef InstX8632Unaryop<InstX8632::Sqrtss> InstX8632Sqrtss; 750 typedef InstX8632UnaryopXmm<InstX8632::Sqrtss> InstX8632Sqrtss;
661 // Cbwdq instruction - wrapper for cbw, cwd, and cdq 751 // Cbwdq instruction - wrapper for cbw, cwd, and cdq
662 typedef InstX8632Unaryop<InstX8632::Cbwdq> InstX8632Cbwdq; 752 typedef InstX8632Unaryop<InstX8632::Cbwdq> InstX8632Cbwdq;
663 // Move/assignment instruction - wrapper for mov/movss/movsd. 753 // Move/assignment instruction - wrapper for mov/movss/movsd.
664 typedef InstX8632Movlike<InstX8632::Mov> InstX8632Mov; 754 typedef InstX8632Movlike<InstX8632::Mov> InstX8632Mov;
665 // Move packed - copy 128 bit values between XMM registers, or mem128 755 // Move packed - copy 128 bit values between XMM registers, or mem128
666 // and XMM registers. 756 // and XMM registers.
667 typedef InstX8632Movlike<InstX8632::Movp> InstX8632Movp; 757 typedef InstX8632Movlike<InstX8632::Movp> InstX8632Movp;
668 // Movq - copy between XMM registers, or mem64 and XMM registers. 758 // Movq - copy between XMM registers, or mem64 and XMM registers.
669 typedef InstX8632Movlike<InstX8632::Movq> InstX8632Movq; 759 typedef InstX8632Movlike<InstX8632::Movq> InstX8632Movq;
670 typedef InstX8632Binop<InstX8632::Add> InstX8632Add; 760 typedef InstX8632Binop<InstX8632::Add> InstX8632Add;
671 typedef InstX8632Binop<InstX8632::Addps> InstX8632Addps; 761 typedef InstX8632BinopXmm<InstX8632::Addps, true> InstX8632Addps;
672 typedef InstX8632Binop<InstX8632::Adc> InstX8632Adc; 762 typedef InstX8632Binop<InstX8632::Adc> InstX8632Adc;
673 typedef InstX8632Binop<InstX8632::Addss> InstX8632Addss; 763 typedef InstX8632BinopXmm<InstX8632::Addss, false> InstX8632Addss;
674 typedef InstX8632Binop<InstX8632::Padd> InstX8632Padd; 764 typedef InstX8632BinopXmm<InstX8632::Padd, true> InstX8632Padd;
675 typedef InstX8632Binop<InstX8632::Sub> InstX8632Sub; 765 typedef InstX8632Binop<InstX8632::Sub> InstX8632Sub;
676 typedef InstX8632Binop<InstX8632::Subps> InstX8632Subps; 766 typedef InstX8632BinopXmm<InstX8632::Subps, true> InstX8632Subps;
677 typedef InstX8632Binop<InstX8632::Subss> InstX8632Subss; 767 typedef InstX8632BinopXmm<InstX8632::Subss, false> InstX8632Subss;
678 typedef InstX8632Binop<InstX8632::Sbb> InstX8632Sbb; 768 typedef InstX8632Binop<InstX8632::Sbb> InstX8632Sbb;
679 typedef InstX8632Binop<InstX8632::Psub> InstX8632Psub; 769 typedef InstX8632BinopXmm<InstX8632::Psub, true> InstX8632Psub;
680 typedef InstX8632Binop<InstX8632::And> InstX8632And; 770 typedef InstX8632Binop<InstX8632::And> InstX8632And;
681 typedef InstX8632Binop<InstX8632::Pand> InstX8632Pand; 771 typedef InstX8632BinopXmm<InstX8632::Pand, false> InstX8632Pand;
682 typedef InstX8632Binop<InstX8632::Pandn> InstX8632Pandn; 772 typedef InstX8632BinopXmm<InstX8632::Pandn, false> InstX8632Pandn;
683 typedef InstX8632Binop<InstX8632::Or> InstX8632Or; 773 typedef InstX8632Binop<InstX8632::Or> InstX8632Or;
684 typedef InstX8632Binop<InstX8632::Por> InstX8632Por; 774 typedef InstX8632BinopXmm<InstX8632::Por, false> InstX8632Por;
685 typedef InstX8632Binop<InstX8632::Xor> InstX8632Xor; 775 typedef InstX8632Binop<InstX8632::Xor> InstX8632Xor;
686 typedef InstX8632Binop<InstX8632::Pxor> InstX8632Pxor; 776 typedef InstX8632BinopXmm<InstX8632::Pxor, false> InstX8632Pxor;
687 typedef InstX8632Binop<InstX8632::Imul> InstX8632Imul; 777 typedef InstX8632Binop<InstX8632::Imul> InstX8632Imul;
688 typedef InstX8632Binop<InstX8632::Mulps> InstX8632Mulps; 778 typedef InstX8632BinopXmm<InstX8632::Mulps, true> InstX8632Mulps;
689 typedef InstX8632Binop<InstX8632::Mulss> InstX8632Mulss; 779 typedef InstX8632BinopXmm<InstX8632::Mulss, false> InstX8632Mulss;
690 typedef InstX8632Binop<InstX8632::Pmull> InstX8632Pmull; 780 typedef InstX8632Binop<InstX8632::Pmull> InstX8632Pmull;
691 typedef InstX8632Binop<InstX8632::Pmuludq> InstX8632Pmuludq; 781 typedef InstX8632BinopXmm<InstX8632::Pmuludq, false> InstX8632Pmuludq;
692 typedef InstX8632Binop<InstX8632::Divps> InstX8632Divps; 782 typedef InstX8632BinopXmm<InstX8632::Divps, true> InstX8632Divps;
693 typedef InstX8632Binop<InstX8632::Divss> InstX8632Divss; 783 typedef InstX8632BinopXmm<InstX8632::Divss, false> InstX8632Divss;
694 typedef InstX8632Binop<InstX8632::Rol, true> InstX8632Rol; 784 typedef InstX8632Binop<InstX8632::Rol, true> InstX8632Rol;
695 typedef InstX8632Binop<InstX8632::Shl, true> InstX8632Shl; 785 typedef InstX8632Binop<InstX8632::Shl, true> InstX8632Shl;
696 typedef InstX8632Binop<InstX8632::Psll> InstX8632Psll; 786 typedef InstX8632Binop<InstX8632::Psll> InstX8632Psll;
697 typedef InstX8632Binop<InstX8632::Shr, true> InstX8632Shr; 787 typedef InstX8632Binop<InstX8632::Shr, true> InstX8632Shr;
698 typedef InstX8632Binop<InstX8632::Sar, true> InstX8632Sar; 788 typedef InstX8632Binop<InstX8632::Sar, true> InstX8632Sar;
699 typedef InstX8632Binop<InstX8632::Psra> InstX8632Psra; 789 typedef InstX8632Binop<InstX8632::Psra> InstX8632Psra;
700 typedef InstX8632Binop<InstX8632::Pcmpeq> InstX8632Pcmpeq; 790 typedef InstX8632Binop<InstX8632::Pcmpeq> InstX8632Pcmpeq;
701 typedef InstX8632Binop<InstX8632::Pcmpgt> InstX8632Pcmpgt; 791 typedef InstX8632Binop<InstX8632::Pcmpgt> InstX8632Pcmpgt;
702 // TODO: movss is only a binary operation when the source and dest 792 // TODO: movss is only a binary operation when the source and dest
703 // operands are both registers. In other cases, it behaves like a copy 793 // operands are both registers. In other cases, it behaves like a copy
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 // Cmpps instruction - compare packed singled-precision floating point 911 // Cmpps instruction - compare packed singled-precision floating point
822 // values 912 // values
823 class InstX8632Cmpps : public InstX8632 { 913 class InstX8632Cmpps : public InstX8632 {
824 public: 914 public:
825 static InstX8632Cmpps *create(Cfg *Func, Variable *Dest, Operand *Source, 915 static InstX8632Cmpps *create(Cfg *Func, Variable *Dest, Operand *Source,
826 CondX86::CmppsCond Condition) { 916 CondX86::CmppsCond Condition) {
827 return new (Func->allocate<InstX8632Cmpps>()) 917 return new (Func->allocate<InstX8632Cmpps>())
828 InstX8632Cmpps(Func, Dest, Source, Condition); 918 InstX8632Cmpps(Func, Dest, Source, Condition);
829 } 919 }
830 virtual void emit(const Cfg *Func) const; 920 virtual void emit(const Cfg *Func) const;
921 virtual void emitIAS(const Cfg *Func) const;
831 virtual void dump(const Cfg *Func) const; 922 virtual void dump(const Cfg *Func) const;
832 static bool classof(const Inst *Inst) { return isClassof(Inst, Cmpps); } 923 static bool classof(const Inst *Inst) { return isClassof(Inst, Cmpps); }
833 924
834 private: 925 private:
835 InstX8632Cmpps(Cfg *Func, Variable *Dest, Operand *Source, 926 InstX8632Cmpps(Cfg *Func, Variable *Dest, Operand *Source,
836 CondX86::CmppsCond Cond); 927 CondX86::CmppsCond Cond);
837 InstX8632Cmpps(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION; 928 InstX8632Cmpps(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION;
838 InstX8632Cmpps &operator=(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION; 929 InstX8632Cmpps &operator=(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION;
839 virtual ~InstX8632Cmpps() {} 930 virtual ~InstX8632Cmpps() {}
840 931
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 }; 1025 };
935 1026
936 // ucomiss/ucomisd - floating-point compare instruction. 1027 // ucomiss/ucomisd - floating-point compare instruction.
937 class InstX8632Ucomiss : public InstX8632 { 1028 class InstX8632Ucomiss : public InstX8632 {
938 public: 1029 public:
939 static InstX8632Ucomiss *create(Cfg *Func, Operand *Src1, Operand *Src2) { 1030 static InstX8632Ucomiss *create(Cfg *Func, Operand *Src1, Operand *Src2) {
940 return new (Func->allocate<InstX8632Ucomiss>()) 1031 return new (Func->allocate<InstX8632Ucomiss>())
941 InstX8632Ucomiss(Func, Src1, Src2); 1032 InstX8632Ucomiss(Func, Src1, Src2);
942 } 1033 }
943 virtual void emit(const Cfg *Func) const; 1034 virtual void emit(const Cfg *Func) const;
1035 virtual void emitIAS(const Cfg *Func) const;
944 virtual void dump(const Cfg *Func) const; 1036 virtual void dump(const Cfg *Func) const;
945 static bool classof(const Inst *Inst) { return isClassof(Inst, Ucomiss); } 1037 static bool classof(const Inst *Inst) { return isClassof(Inst, Ucomiss); }
946 1038
947 private: 1039 private:
948 InstX8632Ucomiss(Cfg *Func, Operand *Src1, Operand *Src2); 1040 InstX8632Ucomiss(Cfg *Func, Operand *Src1, Operand *Src2);
949 InstX8632Ucomiss(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION; 1041 InstX8632Ucomiss(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION;
950 InstX8632Ucomiss &operator=(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION; 1042 InstX8632Ucomiss &operator=(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION;
951 virtual ~InstX8632Ucomiss() {} 1043 virtual ~InstX8632Ucomiss() {}
952 }; 1044 };
953 1045
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 // Nop instructions of varying length 1193 // Nop instructions of varying length
1102 class InstX8632Nop : public InstX8632 { 1194 class InstX8632Nop : public InstX8632 {
1103 public: 1195 public:
1104 // TODO: Replace with enum. 1196 // TODO: Replace with enum.
1105 typedef unsigned NopVariant; 1197 typedef unsigned NopVariant;
1106 1198
1107 static InstX8632Nop *create(Cfg *Func, NopVariant Variant) { 1199 static InstX8632Nop *create(Cfg *Func, NopVariant Variant) {
1108 return new (Func->allocate<InstX8632Nop>()) InstX8632Nop(Func, Variant); 1200 return new (Func->allocate<InstX8632Nop>()) InstX8632Nop(Func, Variant);
1109 } 1201 }
1110 virtual void emit(const Cfg *Func) const; 1202 virtual void emit(const Cfg *Func) const;
1203 virtual void emitIAS(const Cfg *Func) const;
1111 virtual void dump(const Cfg *Func) const; 1204 virtual void dump(const Cfg *Func) const;
1112 static bool classof(const Inst *Inst) { return isClassof(Inst, Nop); } 1205 static bool classof(const Inst *Inst) { return isClassof(Inst, Nop); }
1113 1206
1114 private: 1207 private:
1115 InstX8632Nop(Cfg *Func, SizeT Length); 1208 InstX8632Nop(Cfg *Func, SizeT Length);
1116 InstX8632Nop(const InstX8632Nop &) LLVM_DELETED_FUNCTION; 1209 InstX8632Nop(const InstX8632Nop &) LLVM_DELETED_FUNCTION;
1117 InstX8632Nop &operator=(const InstX8632Nop &) LLVM_DELETED_FUNCTION; 1210 InstX8632Nop &operator=(const InstX8632Nop &) LLVM_DELETED_FUNCTION;
1118 virtual ~InstX8632Nop() {} 1211 virtual ~InstX8632Nop() {}
1119 1212
1120 NopVariant Variant; 1213 NopVariant Variant;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 InstX8632Fstp &operator=(const InstX8632Fstp &) LLVM_DELETED_FUNCTION; 1246 InstX8632Fstp &operator=(const InstX8632Fstp &) LLVM_DELETED_FUNCTION;
1154 virtual ~InstX8632Fstp() {} 1247 virtual ~InstX8632Fstp() {}
1155 }; 1248 };
1156 1249
1157 class InstX8632Pop : public InstX8632 { 1250 class InstX8632Pop : public InstX8632 {
1158 public: 1251 public:
1159 static InstX8632Pop *create(Cfg *Func, Variable *Dest) { 1252 static InstX8632Pop *create(Cfg *Func, Variable *Dest) {
1160 return new (Func->allocate<InstX8632Pop>()) InstX8632Pop(Func, Dest); 1253 return new (Func->allocate<InstX8632Pop>()) InstX8632Pop(Func, Dest);
1161 } 1254 }
1162 virtual void emit(const Cfg *Func) const; 1255 virtual void emit(const Cfg *Func) const;
1256 virtual void emitIAS(const Cfg *Func) const;
1163 virtual void dump(const Cfg *Func) const; 1257 virtual void dump(const Cfg *Func) const;
1164 static bool classof(const Inst *Inst) { return isClassof(Inst, Pop); } 1258 static bool classof(const Inst *Inst) { return isClassof(Inst, Pop); }
1165 1259
1166 private: 1260 private:
1167 InstX8632Pop(Cfg *Func, Variable *Dest); 1261 InstX8632Pop(Cfg *Func, Variable *Dest);
1168 InstX8632Pop(const InstX8632Pop &) LLVM_DELETED_FUNCTION; 1262 InstX8632Pop(const InstX8632Pop &) LLVM_DELETED_FUNCTION;
1169 InstX8632Pop &operator=(const InstX8632Pop &) LLVM_DELETED_FUNCTION; 1263 InstX8632Pop &operator=(const InstX8632Pop &) LLVM_DELETED_FUNCTION;
1170 virtual ~InstX8632Pop() {} 1264 virtual ~InstX8632Pop() {}
1171 }; 1265 };
1172 1266
(...skipping 19 matching lines...) Expand all
1192 // Ret instruction. Currently only supports the "ret" version that 1286 // Ret instruction. Currently only supports the "ret" version that
1193 // does not pop arguments. This instruction takes a Source operand 1287 // does not pop arguments. This instruction takes a Source operand
1194 // (for non-void returning functions) for liveness analysis, though 1288 // (for non-void returning functions) for liveness analysis, though
1195 // a FakeUse before the ret would do just as well. 1289 // a FakeUse before the ret would do just as well.
1196 class InstX8632Ret : public InstX8632 { 1290 class InstX8632Ret : public InstX8632 {
1197 public: 1291 public:
1198 static InstX8632Ret *create(Cfg *Func, Variable *Source = NULL) { 1292 static InstX8632Ret *create(Cfg *Func, Variable *Source = NULL) {
1199 return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source); 1293 return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source);
1200 } 1294 }
1201 virtual void emit(const Cfg *Func) const; 1295 virtual void emit(const Cfg *Func) const;
1296 virtual void emitIAS(const Cfg *Func) const;
1202 virtual void dump(const Cfg *Func) const; 1297 virtual void dump(const Cfg *Func) const;
1203 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); } 1298 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); }
1204 1299
1205 private: 1300 private:
1206 InstX8632Ret(Cfg *Func, Variable *Source); 1301 InstX8632Ret(Cfg *Func, Variable *Source);
1207 InstX8632Ret(const InstX8632Ret &) LLVM_DELETED_FUNCTION; 1302 InstX8632Ret(const InstX8632Ret &) LLVM_DELETED_FUNCTION;
1208 InstX8632Ret &operator=(const InstX8632Ret &) LLVM_DELETED_FUNCTION; 1303 InstX8632Ret &operator=(const InstX8632Ret &) LLVM_DELETED_FUNCTION;
1209 virtual ~InstX8632Ret() {} 1304 virtual ~InstX8632Ret() {}
1210 }; 1305 };
1211 1306
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 template <> void InstX8632Pmuludq::emit(const Cfg *Func) const; 1374 template <> void InstX8632Pmuludq::emit(const Cfg *Func) const;
1280 template <> void InstX8632Psll::emit(const Cfg *Func) const; 1375 template <> void InstX8632Psll::emit(const Cfg *Func) const;
1281 template <> void InstX8632Psra::emit(const Cfg *Func) const; 1376 template <> void InstX8632Psra::emit(const Cfg *Func) const;
1282 template <> void InstX8632Psub::emit(const Cfg *Func) const; 1377 template <> void InstX8632Psub::emit(const Cfg *Func) const;
1283 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const; 1378 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const;
1284 template <> void InstX8632Subss::emit(const Cfg *Func) const; 1379 template <> void InstX8632Subss::emit(const Cfg *Func) const;
1285 1380
1286 } // end of namespace Ice 1381 } // end of namespace Ice
1287 1382
1288 #endif // SUBZERO_SRC_ICEINSTX8632_H 1383 #endif // SUBZERO_SRC_ICEINSTX8632_H
OLDNEW
« no previous file with comments | « src/IceInst.cpp ('k') | src/IceInstX8632.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698