Chromium Code Reviews

Side by Side Diff: src/IceInstX8632.h

Issue 476323004: Start adding an integrated assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: make fixups part of address Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
« 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 "IceInstX8632.def" 22 #include "IceInstX8632.def"
22 #include "IceOperand.h" 23 #include "IceOperand.h"
23 24
24 namespace Ice { 25 namespace Ice {
25 26
26 class TargetX8632; 27 class TargetX8632;
27 28
28 // OperandX8632 extends the Operand hierarchy. Its subclasses are 29 // OperandX8632 extends the Operand hierarchy. Its subclasses are
(...skipping 35 matching lines...)
64 uint16_t Shift = 0, 65 uint16_t Shift = 0,
65 SegmentRegisters SegmentReg = DefaultSegment) { 66 SegmentRegisters SegmentReg = DefaultSegment) {
66 return new (Func->allocate<OperandX8632Mem>()) 67 return new (Func->allocate<OperandX8632Mem>())
67 OperandX8632Mem(Func, Ty, Base, Offset, Index, Shift, SegmentReg); 68 OperandX8632Mem(Func, Ty, Base, Offset, Index, Shift, SegmentReg);
68 } 69 }
69 Variable *getBase() const { return Base; } 70 Variable *getBase() const { return Base; }
70 Constant *getOffset() const { return Offset; } 71 Constant *getOffset() const { return Offset; }
71 Variable *getIndex() const { return Index; } 72 Variable *getIndex() const { return Index; }
72 uint16_t getShift() const { return Shift; } 73 uint16_t getShift() const { return Shift; }
73 SegmentRegisters getSegmentRegister() const { return SegmentReg; } 74 SegmentRegisters getSegmentRegister() const { return SegmentReg; }
75 x86::Address convertToAsmAddress(Assembler *Asm) const;
74 virtual void emit(const Cfg *Func) const; 76 virtual void emit(const Cfg *Func) const;
75 virtual void dump(const Cfg *Func) const; 77 virtual void dump(const Cfg *Func) const;
76 78
77 static bool classof(const Operand *Operand) { 79 static bool classof(const Operand *Operand) {
78 return Operand->getKind() == static_cast<OperandKind>(kMem); 80 return Operand->getKind() == static_cast<OperandKind>(kMem);
79 } 81 }
80 82
81 private: 83 private:
82 OperandX8632Mem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, 84 OperandX8632Mem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset,
83 Variable *Index, uint16_t Shift, SegmentRegisters SegmentReg); 85 Variable *Index, uint16_t Shift, SegmentRegisters SegmentReg);
(...skipping 137 matching lines...)
221 223
222 enum BrCond { 224 enum BrCond {
223 #define X(tag, dump, emit) tag, 225 #define X(tag, dump, emit) tag,
224 ICEINSTX8632BR_TABLE 226 ICEINSTX8632BR_TABLE
225 #undef X 227 #undef X
226 Br_None 228 Br_None
227 }; 229 };
228 230
229 static const char *getWidthString(Type Ty); 231 static const char *getWidthString(Type Ty);
230 virtual void emit(const Cfg *Func) const = 0; 232 virtual void emit(const Cfg *Func) const = 0;
233 virtual void emitIAS(const Cfg *Func) const;
231 virtual void dump(const Cfg *Func) const; 234 virtual void dump(const Cfg *Func) const;
232 235
233 protected: 236 protected:
234 InstX8632(Cfg *Func, InstKindX8632 Kind, SizeT Maxsrcs, Variable *Dest) 237 InstX8632(Cfg *Func, InstKindX8632 Kind, SizeT Maxsrcs, Variable *Dest)
235 : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {} 238 : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {}
236 virtual ~InstX8632() {} 239 virtual ~InstX8632() {}
237 static bool isClassof(const Inst *Inst, InstKindX8632 MyKind) { 240 static bool isClassof(const Inst *Inst, InstKindX8632 MyKind) {
238 return Inst->getKind() == static_cast<InstKind>(MyKind); 241 return Inst->getKind() == static_cast<InstKind>(MyKind);
239 } 242 }
240 243
(...skipping 104 matching lines...)
345 348
346 // AdjustStack instruction - subtracts esp by the given amount and 349 // AdjustStack instruction - subtracts esp by the given amount and
347 // updates the stack offset during code emission. 350 // updates the stack offset during code emission.
348 class InstX8632AdjustStack : public InstX8632 { 351 class InstX8632AdjustStack : public InstX8632 {
349 public: 352 public:
350 static InstX8632AdjustStack *create(Cfg *Func, SizeT Amount) { 353 static InstX8632AdjustStack *create(Cfg *Func, SizeT Amount) {
351 return new (Func->allocate<InstX8632AdjustStack>()) 354 return new (Func->allocate<InstX8632AdjustStack>())
352 InstX8632AdjustStack(Func, Amount); 355 InstX8632AdjustStack(Func, Amount);
353 } 356 }
354 virtual void emit(const Cfg *Func) const; 357 virtual void emit(const Cfg *Func) const;
358 virtual void emitIAS(const Cfg *Func) const;
355 virtual void dump(const Cfg *Func) const; 359 virtual void dump(const Cfg *Func) const;
356 static bool classof(const Inst *Inst) { return isClassof(Inst, Adjuststack); } 360 static bool classof(const Inst *Inst) { return isClassof(Inst, Adjuststack); }
357 361
358 private: 362 private:
359 InstX8632AdjustStack(Cfg *Func, SizeT Amount); 363 InstX8632AdjustStack(Cfg *Func, SizeT Amount);
360 InstX8632AdjustStack(const InstX8632AdjustStack &) LLVM_DELETED_FUNCTION; 364 InstX8632AdjustStack(const InstX8632AdjustStack &) LLVM_DELETED_FUNCTION;
361 InstX8632AdjustStack &operator=(const InstX8632AdjustStack &) 365 InstX8632AdjustStack &operator=(const InstX8632AdjustStack &)
362 LLVM_DELETED_FUNCTION; 366 LLVM_DELETED_FUNCTION;
363 SizeT Amount; 367 SizeT Amount;
364 }; 368 };
365 369
366 // Call instruction. Arguments should have already been pushed. 370 // Call instruction. Arguments should have already been pushed.
367 class InstX8632Call : public InstX8632 { 371 class InstX8632Call : public InstX8632 {
368 public: 372 public:
369 static InstX8632Call *create(Cfg *Func, Variable *Dest, Operand *CallTarget) { 373 static InstX8632Call *create(Cfg *Func, Variable *Dest, Operand *CallTarget) {
370 return new (Func->allocate<InstX8632Call>()) 374 return new (Func->allocate<InstX8632Call>())
371 InstX8632Call(Func, Dest, CallTarget); 375 InstX8632Call(Func, Dest, CallTarget);
372 } 376 }
373 Operand *getCallTarget() const { return getSrc(0); } 377 Operand *getCallTarget() const { return getSrc(0); }
374 virtual void emit(const Cfg *Func) const; 378 virtual void emit(const Cfg *Func) const;
379 virtual void emitIAS(const Cfg *Func) const;
375 virtual void dump(const Cfg *Func) const; 380 virtual void dump(const Cfg *Func) const;
376 static bool classof(const Inst *Inst) { return isClassof(Inst, Call); } 381 static bool classof(const Inst *Inst) { return isClassof(Inst, Call); }
377 382
378 private: 383 private:
379 InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget); 384 InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget);
380 InstX8632Call(const InstX8632Call &) LLVM_DELETED_FUNCTION; 385 InstX8632Call(const InstX8632Call &) LLVM_DELETED_FUNCTION;
381 InstX8632Call &operator=(const InstX8632Call &) LLVM_DELETED_FUNCTION; 386 InstX8632Call &operator=(const InstX8632Call &) LLVM_DELETED_FUNCTION;
382 virtual ~InstX8632Call() {} 387 virtual ~InstX8632Call() {}
383 }; 388 };
384 389
385 // Instructions of the form x := op(x). 390 // Instructions of the form x := op(x).
386 template <InstX8632::InstKindX8632 K> 391 template <InstX8632::InstKindX8632 K>
387 class InstX8632Inplaceop : public InstX8632 { 392 class InstX8632Inplaceop : public InstX8632 {
388 public: 393 public:
389 static InstX8632Inplaceop *create(Cfg *Func, Operand *SrcDest) { 394 static InstX8632Inplaceop *create(Cfg *Func, Operand *SrcDest) {
390 return new (Func->allocate<InstX8632Inplaceop>()) 395 return new (Func->allocate<InstX8632Inplaceop>())
391 InstX8632Inplaceop(Func, SrcDest); 396 InstX8632Inplaceop(Func, SrcDest);
392 } 397 }
393 virtual void emit(const Cfg *Func) const { 398 virtual void emit(const Cfg *Func) const {
394 Ostream &Str = Func->getContext()->getStrEmit(); 399 Ostream &Str = Func->getContext()->getStrEmit();
395 assert(getSrcSize() == 1); 400 assert(getSrcSize() == 1);
396 Str << "\t" << Opcode << "\t"; 401 Str << "\t" << Opcode << "\t";
397 getSrc(0)->emit(Func); 402 getSrc(0)->emit(Func);
398 Str << "\n"; 403 Str << "\n";
399 } 404 }
405 virtual void emitIAS(const Cfg *Func) const { emit(Func); }
400 virtual void dump(const Cfg *Func) const { 406 virtual void dump(const Cfg *Func) const {
401 Ostream &Str = Func->getContext()->getStrDump(); 407 Ostream &Str = Func->getContext()->getStrDump();
402 dumpDest(Func); 408 dumpDest(Func);
403 Str << " = " << Opcode << "." << getDest()->getType() << " "; 409 Str << " = " << Opcode << "." << getDest()->getType() << " ";
404 dumpSources(Func); 410 dumpSources(Func);
405 } 411 }
406 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } 412 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
407 413
408 private: 414 private:
409 InstX8632Inplaceop(Cfg *Func, Operand *SrcDest) 415 InstX8632Inplaceop(Cfg *Func, Operand *SrcDest)
(...skipping 17 matching lines...)
427 } 433 }
428 virtual void emit(const Cfg *Func) const { 434 virtual void emit(const Cfg *Func) const {
429 Ostream &Str = Func->getContext()->getStrEmit(); 435 Ostream &Str = Func->getContext()->getStrEmit();
430 assert(getSrcSize() == 1); 436 assert(getSrcSize() == 1);
431 Str << "\t" << Opcode << "\t"; 437 Str << "\t" << Opcode << "\t";
432 getDest()->emit(Func); 438 getDest()->emit(Func);
433 Str << ", "; 439 Str << ", ";
434 getSrc(0)->emit(Func); 440 getSrc(0)->emit(Func);
435 Str << "\n"; 441 Str << "\n";
436 } 442 }
443 virtual void emitIAS(const Cfg *Func) const { emit(Func); }
437 virtual void dump(const Cfg *Func) const { 444 virtual void dump(const Cfg *Func) const {
438 Ostream &Str = Func->getContext()->getStrDump(); 445 Ostream &Str = Func->getContext()->getStrDump();
439 dumpDest(Func); 446 dumpDest(Func);
440 Str << " = " << Opcode << "." << getDest()->getType() << " "; 447 Str << " = " << Opcode << "." << getDest()->getType() << " ";
441 dumpSources(Func); 448 dumpSources(Func);
442 } 449 }
443 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } 450 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
444 451
445 private: 452 private:
446 InstX8632Unaryop(Cfg *Func, Variable *Dest, Operand *Src) 453 InstX8632Unaryop(Cfg *Func, Variable *Dest, Operand *Src)
(...skipping 15 matching lines...)
462 class InstX8632Binop : public InstX8632 { 469 class InstX8632Binop : public InstX8632 {
463 public: 470 public:
464 // Create an ordinary binary-op instruction like add or sub. 471 // Create an ordinary binary-op instruction like add or sub.
465 static InstX8632Binop *create(Cfg *Func, Variable *Dest, Operand *Source) { 472 static InstX8632Binop *create(Cfg *Func, Variable *Dest, Operand *Source) {
466 return new (Func->allocate<InstX8632Binop>()) 473 return new (Func->allocate<InstX8632Binop>())
467 InstX8632Binop(Func, Dest, Source); 474 InstX8632Binop(Func, Dest, Source);
468 } 475 }
469 virtual void emit(const Cfg *Func) const { 476 virtual void emit(const Cfg *Func) const {
470 emitTwoAddress(Opcode, this, Func, ShiftHack); 477 emitTwoAddress(Opcode, this, Func, ShiftHack);
471 } 478 }
479 virtual void emitIAS(const Cfg *Func) const { emit(Func); }
472 virtual void dump(const Cfg *Func) const { 480 virtual void dump(const Cfg *Func) const {
473 Ostream &Str = Func->getContext()->getStrDump(); 481 Ostream &Str = Func->getContext()->getStrDump();
474 dumpDest(Func); 482 dumpDest(Func);
475 Str << " = " << Opcode << "." << getDest()->getType() << " "; 483 Str << " = " << Opcode << "." << getDest()->getType() << " ";
476 dumpSources(Func); 484 dumpSources(Func);
477 } 485 }
478 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } 486 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
479 487
480 private: 488 private:
481 InstX8632Binop(Cfg *Func, Variable *Dest, Operand *Source) 489 InstX8632Binop(Cfg *Func, Variable *Dest, Operand *Source)
(...skipping 19 matching lines...)
501 Ostream &Str = Func->getContext()->getStrEmit(); 509 Ostream &Str = Func->getContext()->getStrEmit();
502 assert(getSrcSize() == 3); 510 assert(getSrcSize() == 3);
503 Str << "\t" << Opcode << "\t"; 511 Str << "\t" << Opcode << "\t";
504 getDest()->emit(Func); 512 getDest()->emit(Func);
505 Str << ", "; 513 Str << ", ";
506 getSrc(1)->emit(Func); 514 getSrc(1)->emit(Func);
507 Str << ", "; 515 Str << ", ";
508 getSrc(2)->emit(Func); 516 getSrc(2)->emit(Func);
509 Str << "\n"; 517 Str << "\n";
510 } 518 }
519 virtual void emitIAS(const Cfg *Func) const { emit(Func); }
511 virtual void dump(const Cfg *Func) const { 520 virtual void dump(const Cfg *Func) const {
512 Ostream &Str = Func->getContext()->getStrDump(); 521 Ostream &Str = Func->getContext()->getStrDump();
513 dumpDest(Func); 522 dumpDest(Func);
514 Str << " = " << Opcode << "." << getDest()->getType() << " "; 523 Str << " = " << Opcode << "." << getDest()->getType() << " ";
515 dumpSources(Func); 524 dumpSources(Func);
516 } 525 }
517 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } 526 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
518 527
519 private: 528 private:
520 InstX8632Ternop(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2) 529 InstX8632Ternop(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2)
(...skipping 21 matching lines...)
542 Ostream &Str = Func->getContext()->getStrEmit(); 551 Ostream &Str = Func->getContext()->getStrEmit();
543 assert(getSrcSize() == 2); 552 assert(getSrcSize() == 2);
544 Str << "\t" << Opcode << "\t"; 553 Str << "\t" << Opcode << "\t";
545 getDest()->emit(Func); 554 getDest()->emit(Func);
546 Str << ", "; 555 Str << ", ";
547 getSrc(0)->emit(Func); 556 getSrc(0)->emit(Func);
548 Str << ", "; 557 Str << ", ";
549 getSrc(1)->emit(Func); 558 getSrc(1)->emit(Func);
550 Str << "\n"; 559 Str << "\n";
551 } 560 }
561 virtual void emitIAS(const Cfg *Func) const { emit(Func); }
552 virtual void dump(const Cfg *Func) const { 562 virtual void dump(const Cfg *Func) const {
553 Ostream &Str = Func->getContext()->getStrDump(); 563 Ostream &Str = Func->getContext()->getStrDump();
554 dumpDest(Func); 564 dumpDest(Func);
555 Str << " = " << Opcode << "." << getDest()->getType() << " "; 565 Str << " = " << Opcode << "." << getDest()->getType() << " ";
556 dumpSources(Func); 566 dumpSources(Func);
557 } 567 }
558 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } 568 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
559 569
560 private: 570 private:
561 InstX8632ThreeAddressop(Cfg *Func, Variable *Dest, Operand *Source0, 571 InstX8632ThreeAddressop(Cfg *Func, Variable *Dest, Operand *Source0,
(...skipping 17 matching lines...)
579 class InstX8632Movlike : public InstX8632 { 589 class InstX8632Movlike : public InstX8632 {
580 public: 590 public:
581 static InstX8632Movlike *create(Cfg *Func, Variable *Dest, Operand *Source) { 591 static InstX8632Movlike *create(Cfg *Func, Variable *Dest, Operand *Source) {
582 return new (Func->allocate<InstX8632Movlike>()) 592 return new (Func->allocate<InstX8632Movlike>())
583 InstX8632Movlike(Func, Dest, Source); 593 InstX8632Movlike(Func, Dest, Source);
584 } 594 }
585 virtual bool isRedundantAssign() const { 595 virtual bool isRedundantAssign() const {
586 return checkForRedundantAssign(getDest(), getSrc(0)); 596 return checkForRedundantAssign(getDest(), getSrc(0));
587 } 597 }
588 virtual void emit(const Cfg *Func) const; 598 virtual void emit(const Cfg *Func) const;
599 virtual void emitIAS(const Cfg *Func) const { emit(Func); }
589 virtual void dump(const Cfg *Func) const { 600 virtual void dump(const Cfg *Func) const {
590 Ostream &Str = Func->getContext()->getStrDump(); 601 Ostream &Str = Func->getContext()->getStrDump();
591 Str << Opcode << "." << getDest()->getType() << " "; 602 Str << Opcode << "." << getDest()->getType() << " ";
592 dumpDest(Func); 603 dumpDest(Func);
593 Str << ", "; 604 Str << ", ";
594 dumpSources(Func); 605 dumpSources(Func);
595 } 606 }
596 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } 607 static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
597 608
598 private: 609 private:
(...skipping 155 matching lines...)
754 765
755 // Conditional move instruction. 766 // Conditional move instruction.
756 class InstX8632Cmov : public InstX8632 { 767 class InstX8632Cmov : public InstX8632 {
757 public: 768 public:
758 static InstX8632Cmov *create(Cfg *Func, Variable *Dest, Operand *Source, 769 static InstX8632Cmov *create(Cfg *Func, Variable *Dest, Operand *Source,
759 BrCond Cond) { 770 BrCond Cond) {
760 return new (Func->allocate<InstX8632Cmov>()) 771 return new (Func->allocate<InstX8632Cmov>())
761 InstX8632Cmov(Func, Dest, Source, Cond); 772 InstX8632Cmov(Func, Dest, Source, Cond);
762 } 773 }
763 virtual void emit(const Cfg *Func) const; 774 virtual void emit(const Cfg *Func) const;
775 virtual void emitIAS(const Cfg *Func) const;
764 virtual void dump(const Cfg *Func) const; 776 virtual void dump(const Cfg *Func) const;
765 static bool classof(const Inst *Inst) { return isClassof(Inst, Cmov); } 777 static bool classof(const Inst *Inst) { return isClassof(Inst, Cmov); }
766 778
767 private: 779 private:
768 InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source, BrCond Cond); 780 InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source, BrCond Cond);
769 InstX8632Cmov(const InstX8632Cmov &) LLVM_DELETED_FUNCTION; 781 InstX8632Cmov(const InstX8632Cmov &) LLVM_DELETED_FUNCTION;
770 InstX8632Cmov &operator=(const InstX8632Cmov &) LLVM_DELETED_FUNCTION; 782 InstX8632Cmov &operator=(const InstX8632Cmov &) LLVM_DELETED_FUNCTION;
771 virtual ~InstX8632Cmov() {} 783 virtual ~InstX8632Cmov() {}
772 784
773 BrCond Condition; 785 BrCond Condition;
774 }; 786 };
775 787
776 // Cmpps instruction - compare packed singled-precision floating point 788 // Cmpps instruction - compare packed singled-precision floating point
777 // values 789 // values
778 class InstX8632Cmpps : public InstX8632 { 790 class InstX8632Cmpps : public InstX8632 {
779 public: 791 public:
780 enum CmppsCond { 792 enum CmppsCond {
781 #define X(tag, emit) tag, 793 #define X(tag, emit) tag,
782 ICEINSTX8632CMPPS_TABLE 794 ICEINSTX8632CMPPS_TABLE
783 #undef X 795 #undef X
784 Cmpps_Invalid 796 Cmpps_Invalid
785 }; 797 };
786 798
787 static InstX8632Cmpps *create(Cfg *Func, Variable *Dest, Operand *Source, 799 static InstX8632Cmpps *create(Cfg *Func, Variable *Dest, Operand *Source,
788 CmppsCond Condition) { 800 CmppsCond Condition) {
789 return new (Func->allocate<InstX8632Cmpps>()) 801 return new (Func->allocate<InstX8632Cmpps>())
790 InstX8632Cmpps(Func, Dest, Source, Condition); 802 InstX8632Cmpps(Func, Dest, Source, Condition);
791 } 803 }
792 virtual void emit(const Cfg *Func) const; 804 virtual void emit(const Cfg *Func) const;
805 virtual void emitIAS(const Cfg *Func) const;
793 virtual void dump(const Cfg *Func) const; 806 virtual void dump(const Cfg *Func) const;
794 static bool classof(const Inst *Inst) { return isClassof(Inst, Cmpps); } 807 static bool classof(const Inst *Inst) { return isClassof(Inst, Cmpps); }
795 808
796 private: 809 private:
797 InstX8632Cmpps(Cfg *Func, Variable *Dest, Operand *Source, CmppsCond Cond); 810 InstX8632Cmpps(Cfg *Func, Variable *Dest, Operand *Source, CmppsCond Cond);
798 InstX8632Cmpps(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION; 811 InstX8632Cmpps(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION;
799 InstX8632Cmpps &operator=(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION; 812 InstX8632Cmpps &operator=(const InstX8632Cmpps &) LLVM_DELETED_FUNCTION;
800 virtual ~InstX8632Cmpps() {} 813 virtual ~InstX8632Cmpps() {}
801 814
802 CmppsCond Condition; 815 CmppsCond Condition;
(...skipping 74 matching lines...)
877 }; 890 };
878 891
879 // cmp - Integer compare instruction. 892 // cmp - Integer compare instruction.
880 class InstX8632Icmp : public InstX8632 { 893 class InstX8632Icmp : public InstX8632 {
881 public: 894 public:
882 static InstX8632Icmp *create(Cfg *Func, Operand *Src1, Operand *Src2) { 895 static InstX8632Icmp *create(Cfg *Func, Operand *Src1, Operand *Src2) {
883 return new (Func->allocate<InstX8632Icmp>()) 896 return new (Func->allocate<InstX8632Icmp>())
884 InstX8632Icmp(Func, Src1, Src2); 897 InstX8632Icmp(Func, Src1, Src2);
885 } 898 }
886 virtual void emit(const Cfg *Func) const; 899 virtual void emit(const Cfg *Func) const;
900 virtual void emitIAS(const Cfg *Func) const;
887 virtual void dump(const Cfg *Func) const; 901 virtual void dump(const Cfg *Func) const;
888 static bool classof(const Inst *Inst) { return isClassof(Inst, Icmp); } 902 static bool classof(const Inst *Inst) { return isClassof(Inst, Icmp); }
889 903
890 private: 904 private:
891 InstX8632Icmp(Cfg *Func, Operand *Src1, Operand *Src2); 905 InstX8632Icmp(Cfg *Func, Operand *Src1, Operand *Src2);
892 InstX8632Icmp(const InstX8632Icmp &) LLVM_DELETED_FUNCTION; 906 InstX8632Icmp(const InstX8632Icmp &) LLVM_DELETED_FUNCTION;
893 InstX8632Icmp &operator=(const InstX8632Icmp &) LLVM_DELETED_FUNCTION; 907 InstX8632Icmp &operator=(const InstX8632Icmp &) LLVM_DELETED_FUNCTION;
894 virtual ~InstX8632Icmp() {} 908 virtual ~InstX8632Icmp() {}
895 }; 909 };
896 910
897 // ucomiss/ucomisd - floating-point compare instruction. 911 // ucomiss/ucomisd - floating-point compare instruction.
898 class InstX8632Ucomiss : public InstX8632 { 912 class InstX8632Ucomiss : public InstX8632 {
899 public: 913 public:
900 static InstX8632Ucomiss *create(Cfg *Func, Operand *Src1, Operand *Src2) { 914 static InstX8632Ucomiss *create(Cfg *Func, Operand *Src1, Operand *Src2) {
901 return new (Func->allocate<InstX8632Ucomiss>()) 915 return new (Func->allocate<InstX8632Ucomiss>())
902 InstX8632Ucomiss(Func, Src1, Src2); 916 InstX8632Ucomiss(Func, Src1, Src2);
903 } 917 }
904 virtual void emit(const Cfg *Func) const; 918 virtual void emit(const Cfg *Func) const;
919 virtual void emitIAS(const Cfg *Func) const;
905 virtual void dump(const Cfg *Func) const; 920 virtual void dump(const Cfg *Func) const;
906 static bool classof(const Inst *Inst) { return isClassof(Inst, Ucomiss); } 921 static bool classof(const Inst *Inst) { return isClassof(Inst, Ucomiss); }
907 922
908 private: 923 private:
909 InstX8632Ucomiss(Cfg *Func, Operand *Src1, Operand *Src2); 924 InstX8632Ucomiss(Cfg *Func, Operand *Src1, Operand *Src2);
910 InstX8632Ucomiss(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION; 925 InstX8632Ucomiss(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION;
911 InstX8632Ucomiss &operator=(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION; 926 InstX8632Ucomiss &operator=(const InstX8632Ucomiss &) LLVM_DELETED_FUNCTION;
912 virtual ~InstX8632Ucomiss() {} 927 virtual ~InstX8632Ucomiss() {}
913 }; 928 };
914 929
(...skipping 108 matching lines...)
1023 1038
1024 // Movsx - copy from a narrower integer type to a wider integer 1039 // Movsx - copy from a narrower integer type to a wider integer
1025 // type, with sign extension. 1040 // type, with sign extension.
1026 class InstX8632Movsx : public InstX8632 { 1041 class InstX8632Movsx : public InstX8632 {
1027 public: 1042 public:
1028 static InstX8632Movsx *create(Cfg *Func, Variable *Dest, Operand *Source) { 1043 static InstX8632Movsx *create(Cfg *Func, Variable *Dest, Operand *Source) {
1029 return new (Func->allocate<InstX8632Movsx>()) 1044 return new (Func->allocate<InstX8632Movsx>())
1030 InstX8632Movsx(Func, Dest, Source); 1045 InstX8632Movsx(Func, Dest, Source);
1031 } 1046 }
1032 virtual void emit(const Cfg *Func) const; 1047 virtual void emit(const Cfg *Func) const;
1048 virtual void emitIAS(const Cfg *Func) const;
1033 virtual void dump(const Cfg *Func) const; 1049 virtual void dump(const Cfg *Func) const;
1034 static bool classof(const Inst *Inst) { return isClassof(Inst, Movsx); } 1050 static bool classof(const Inst *Inst) { return isClassof(Inst, Movsx); }
1035 1051
1036 private: 1052 private:
1037 InstX8632Movsx(Cfg *Func, Variable *Dest, Operand *Source); 1053 InstX8632Movsx(Cfg *Func, Variable *Dest, Operand *Source);
1038 InstX8632Movsx(const InstX8632Movsx &) LLVM_DELETED_FUNCTION; 1054 InstX8632Movsx(const InstX8632Movsx &) LLVM_DELETED_FUNCTION;
1039 InstX8632Movsx &operator=(const InstX8632Movsx &) LLVM_DELETED_FUNCTION; 1055 InstX8632Movsx &operator=(const InstX8632Movsx &) LLVM_DELETED_FUNCTION;
1040 virtual ~InstX8632Movsx() {} 1056 virtual ~InstX8632Movsx() {}
1041 }; 1057 };
1042 1058
1043 // Movsx - copy from a narrower integer type to a wider integer 1059 // Movsx - copy from a narrower integer type to a wider integer
1044 // type, with zero extension. 1060 // type, with zero extension.
1045 class InstX8632Movzx : public InstX8632 { 1061 class InstX8632Movzx : public InstX8632 {
1046 public: 1062 public:
1047 static InstX8632Movzx *create(Cfg *Func, Variable *Dest, Operand *Source) { 1063 static InstX8632Movzx *create(Cfg *Func, Variable *Dest, Operand *Source) {
1048 return new (Func->allocate<InstX8632Movzx>()) 1064 return new (Func->allocate<InstX8632Movzx>())
1049 InstX8632Movzx(Func, Dest, Source); 1065 InstX8632Movzx(Func, Dest, Source);
1050 } 1066 }
1051 virtual void emit(const Cfg *Func) const; 1067 virtual void emit(const Cfg *Func) const;
1068 virtual void emitIAS(const Cfg *Func) const;
1052 virtual void dump(const Cfg *Func) const; 1069 virtual void dump(const Cfg *Func) const;
1053 static bool classof(const Inst *Inst) { return isClassof(Inst, Movzx); } 1070 static bool classof(const Inst *Inst) { return isClassof(Inst, Movzx); }
1054 1071
1055 private: 1072 private:
1056 InstX8632Movzx(Cfg *Func, Variable *Dest, Operand *Source); 1073 InstX8632Movzx(Cfg *Func, Variable *Dest, Operand *Source);
1057 InstX8632Movzx(const InstX8632Movzx &) LLVM_DELETED_FUNCTION; 1074 InstX8632Movzx(const InstX8632Movzx &) LLVM_DELETED_FUNCTION;
1058 InstX8632Movzx &operator=(const InstX8632Movzx &) LLVM_DELETED_FUNCTION; 1075 InstX8632Movzx &operator=(const InstX8632Movzx &) LLVM_DELETED_FUNCTION;
1059 virtual ~InstX8632Movzx() {} 1076 virtual ~InstX8632Movzx() {}
1060 }; 1077 };
1061 1078
1062 // Nop instructions of varying length 1079 // Nop instructions of varying length
1063 class InstX8632Nop : public InstX8632 { 1080 class InstX8632Nop : public InstX8632 {
1064 public: 1081 public:
1065 // TODO: Replace with enum. 1082 // TODO: Replace with enum.
1066 typedef unsigned NopVariant; 1083 typedef unsigned NopVariant;
1067 1084
1068 static InstX8632Nop *create(Cfg *Func, NopVariant Variant) { 1085 static InstX8632Nop *create(Cfg *Func, NopVariant Variant) {
1069 return new (Func->allocate<InstX8632Nop>()) InstX8632Nop(Func, Variant); 1086 return new (Func->allocate<InstX8632Nop>()) InstX8632Nop(Func, Variant);
1070 } 1087 }
1071 virtual void emit(const Cfg *Func) const; 1088 virtual void emit(const Cfg *Func) const;
1089 virtual void emitIAS(const Cfg *Func) const;
1072 virtual void dump(const Cfg *Func) const; 1090 virtual void dump(const Cfg *Func) const;
1073 static bool classof(const Inst *Inst) { return isClassof(Inst, Nop); } 1091 static bool classof(const Inst *Inst) { return isClassof(Inst, Nop); }
1074 1092
1075 private: 1093 private:
1076 InstX8632Nop(Cfg *Func, SizeT Length); 1094 InstX8632Nop(Cfg *Func, SizeT Length);
1077 InstX8632Nop(const InstX8632Nop &) LLVM_DELETED_FUNCTION; 1095 InstX8632Nop(const InstX8632Nop &) LLVM_DELETED_FUNCTION;
1078 InstX8632Nop &operator=(const InstX8632Nop &) LLVM_DELETED_FUNCTION; 1096 InstX8632Nop &operator=(const InstX8632Nop &) LLVM_DELETED_FUNCTION;
1079 virtual ~InstX8632Nop() {} 1097 virtual ~InstX8632Nop() {}
1080 1098
1081 NopVariant Variant; 1099 NopVariant Variant;
(...skipping 32 matching lines...)
1114 InstX8632Fstp &operator=(const InstX8632Fstp &) LLVM_DELETED_FUNCTION; 1132 InstX8632Fstp &operator=(const InstX8632Fstp &) LLVM_DELETED_FUNCTION;
1115 virtual ~InstX8632Fstp() {} 1133 virtual ~InstX8632Fstp() {}
1116 }; 1134 };
1117 1135
1118 class InstX8632Pop : public InstX8632 { 1136 class InstX8632Pop : public InstX8632 {
1119 public: 1137 public:
1120 static InstX8632Pop *create(Cfg *Func, Variable *Dest) { 1138 static InstX8632Pop *create(Cfg *Func, Variable *Dest) {
1121 return new (Func->allocate<InstX8632Pop>()) InstX8632Pop(Func, Dest); 1139 return new (Func->allocate<InstX8632Pop>()) InstX8632Pop(Func, Dest);
1122 } 1140 }
1123 virtual void emit(const Cfg *Func) const; 1141 virtual void emit(const Cfg *Func) const;
1142 virtual void emitIAS(const Cfg *Func) const;
1124 virtual void dump(const Cfg *Func) const; 1143 virtual void dump(const Cfg *Func) const;
1125 static bool classof(const Inst *Inst) { return isClassof(Inst, Pop); } 1144 static bool classof(const Inst *Inst) { return isClassof(Inst, Pop); }
1126 1145
1127 private: 1146 private:
1128 InstX8632Pop(Cfg *Func, Variable *Dest); 1147 InstX8632Pop(Cfg *Func, Variable *Dest);
1129 InstX8632Pop(const InstX8632Pop &) LLVM_DELETED_FUNCTION; 1148 InstX8632Pop(const InstX8632Pop &) LLVM_DELETED_FUNCTION;
1130 InstX8632Pop &operator=(const InstX8632Pop &) LLVM_DELETED_FUNCTION; 1149 InstX8632Pop &operator=(const InstX8632Pop &) LLVM_DELETED_FUNCTION;
1131 virtual ~InstX8632Pop() {} 1150 virtual ~InstX8632Pop() {}
1132 }; 1151 };
1133 1152
(...skipping 19 matching lines...)
1153 // Ret instruction. Currently only supports the "ret" version that 1172 // Ret instruction. Currently only supports the "ret" version that
1154 // does not pop arguments. This instruction takes a Source operand 1173 // does not pop arguments. This instruction takes a Source operand
1155 // (for non-void returning functions) for liveness analysis, though 1174 // (for non-void returning functions) for liveness analysis, though
1156 // a FakeUse before the ret would do just as well. 1175 // a FakeUse before the ret would do just as well.
1157 class InstX8632Ret : public InstX8632 { 1176 class InstX8632Ret : public InstX8632 {
1158 public: 1177 public:
1159 static InstX8632Ret *create(Cfg *Func, Variable *Source = NULL) { 1178 static InstX8632Ret *create(Cfg *Func, Variable *Source = NULL) {
1160 return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source); 1179 return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source);
1161 } 1180 }
1162 virtual void emit(const Cfg *Func) const; 1181 virtual void emit(const Cfg *Func) const;
1182 virtual void emitIAS(const Cfg *Func) const;
1163 virtual void dump(const Cfg *Func) const; 1183 virtual void dump(const Cfg *Func) const;
1164 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); } 1184 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); }
1165 1185
1166 private: 1186 private:
1167 InstX8632Ret(Cfg *Func, Variable *Source); 1187 InstX8632Ret(Cfg *Func, Variable *Source);
1168 InstX8632Ret(const InstX8632Ret &) LLVM_DELETED_FUNCTION; 1188 InstX8632Ret(const InstX8632Ret &) LLVM_DELETED_FUNCTION;
1169 InstX8632Ret &operator=(const InstX8632Ret &) LLVM_DELETED_FUNCTION; 1189 InstX8632Ret &operator=(const InstX8632Ret &) LLVM_DELETED_FUNCTION;
1170 virtual ~InstX8632Ret() {} 1190 virtual ~InstX8632Ret() {}
1171 }; 1191 };
1172 1192
(...skipping 64 matching lines...)
1237 template <> void InstX8632Pextr::emit(const Cfg *Func) const; 1257 template <> void InstX8632Pextr::emit(const Cfg *Func) const;
1238 template <> void InstX8632Pinsr::emit(const Cfg *Func) const; 1258 template <> void InstX8632Pinsr::emit(const Cfg *Func) const;
1239 template <> void InstX8632Pmull::emit(const Cfg *Func) const; 1259 template <> void InstX8632Pmull::emit(const Cfg *Func) const;
1240 template <> void InstX8632Pmuludq::emit(const Cfg *Func) const; 1260 template <> void InstX8632Pmuludq::emit(const Cfg *Func) const;
1241 template <> void InstX8632Psll::emit(const Cfg *Func) const; 1261 template <> void InstX8632Psll::emit(const Cfg *Func) const;
1242 template <> void InstX8632Psra::emit(const Cfg *Func) const; 1262 template <> void InstX8632Psra::emit(const Cfg *Func) const;
1243 template <> void InstX8632Psub::emit(const Cfg *Func) const; 1263 template <> void InstX8632Psub::emit(const Cfg *Func) const;
1244 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const; 1264 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const;
1245 template <> void InstX8632Subss::emit(const Cfg *Func) const; 1265 template <> void InstX8632Subss::emit(const Cfg *Func) const;
1246 1266
1267 // Same with emitIAS() methods.
1268 template <> void InstX8632Adc::emitIAS(const Cfg *Func) const;
1269 template <> void InstX8632Add::emitIAS(const Cfg *Func) const;
1270 template <> void InstX8632Addps::emitIAS(const Cfg *Func) const;
1271 template <> void InstX8632Addss::emitIAS(const Cfg *Func) const;
1272 template <> void InstX8632And::emitIAS(const Cfg *Func) const;
1273 template <> void InstX8632Cbwdq::emitIAS(const Cfg *Func) const;
1274 template <> void InstX8632Divps::emitIAS(const Cfg *Func) const;
1275 template <> void InstX8632Divss::emitIAS(const Cfg *Func) const;
1276 template <> void InstX8632Mulps::emitIAS(const Cfg *Func) const;
1277 template <> void InstX8632Mulss::emitIAS(const Cfg *Func) const;
1278 template <> void InstX8632Padd::emitIAS(const Cfg *Func) const;
1279 template <> void InstX8632Psub::emitIAS(const Cfg *Func) const;
1280 template <> void InstX8632Or::emitIAS(const Cfg *Func) const;
1281 template <> void InstX8632Sbb::emitIAS(const Cfg *Func) const;
1282 template <> void InstX8632Sqrtss::emitIAS(const Cfg *Func) const;
1283 template <> void InstX8632Sub::emitIAS(const Cfg *Func) const;
1284 template <> void InstX8632Subps::emitIAS(const Cfg *Func) const;
1285 template <> void InstX8632Subss::emitIAS(const Cfg *Func) const;
1286 template <> void InstX8632Xor::emitIAS(const Cfg *Func) const;
1287
1247 } // end of namespace Ice 1288 } // end of namespace Ice
1248 1289
1249 #endif // SUBZERO_SRC_ICEINSTX8632_H 1290 #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