| OLD | NEW |
| 1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// | 1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// |
| 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 implements the InstX8632 and OperandX8632 classes, | 10 // This file implements the InstX8632 and OperandX8632 classes, |
| (...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 // operands. | 722 // operands. |
| 723 Ostream &Str = Func->getContext()->getStrEmit(); | 723 Ostream &Str = Func->getContext()->getStrEmit(); |
| 724 assert(getSrcSize() == 1); | 724 assert(getSrcSize() == 1); |
| 725 Str << "\tmovups\t"; | 725 Str << "\tmovups\t"; |
| 726 getDest()->emit(Func); | 726 getDest()->emit(Func); |
| 727 Str << ", "; | 727 Str << ", "; |
| 728 getSrc(0)->emit(Func); | 728 getSrc(0)->emit(Func); |
| 729 Str << "\n"; | 729 Str << "\n"; |
| 730 } | 730 } |
| 731 | 731 |
| 732 void InstX8632Movp::dump(const Cfg *Func) const { |
| 733 Ostream &Str = Func->getContext()->getStrDump(); |
| 734 Str << "movups." << getDest()->getType() << " "; |
| 735 dumpDest(Func); |
| 736 Str << ", "; |
| 737 dumpSources(Func); |
| 738 } |
| 739 |
| 732 void InstX8632Movq::emit(const Cfg *Func) const { | 740 void InstX8632Movq::emit(const Cfg *Func) const { |
| 733 Ostream &Str = Func->getContext()->getStrEmit(); | 741 Ostream &Str = Func->getContext()->getStrEmit(); |
| 734 assert(getSrcSize() == 1); | 742 assert(getSrcSize() == 1); |
| 735 assert(getDest()->getType() == IceType_i64 || | 743 assert(getDest()->getType() == IceType_i64 || |
| 736 getDest()->getType() == IceType_f64); | 744 getDest()->getType() == IceType_f64); |
| 737 Str << "\tmovq\t"; | 745 Str << "\tmovq\t"; |
| 738 getDest()->emit(Func); | 746 getDest()->emit(Func); |
| 739 Str << ", "; | 747 Str << ", "; |
| 740 getSrc(0)->emit(Func); | 748 getSrc(0)->emit(Func); |
| 741 Str << "\n"; | 749 Str << "\n"; |
| 742 } | 750 } |
| 743 | 751 |
| 744 void InstX8632Movp::dump(const Cfg *Func) const { | |
| 745 Ostream &Str = Func->getContext()->getStrDump(); | |
| 746 Str << "movups." << getDest()->getType() << " "; | |
| 747 dumpDest(Func); | |
| 748 Str << ", "; | |
| 749 dumpSources(Func); | |
| 750 } | |
| 751 | |
| 752 void InstX8632Movq::dump(const Cfg *Func) const { | 752 void InstX8632Movq::dump(const Cfg *Func) const { |
| 753 Ostream &Str = Func->getContext()->getStrDump(); | 753 Ostream &Str = Func->getContext()->getStrDump(); |
| 754 Str << "movq." << getDest()->getType() << " "; | 754 Str << "movq." << getDest()->getType() << " "; |
| 755 dumpDest(Func); | 755 dumpDest(Func); |
| 756 Str << ", "; | 756 Str << ", "; |
| 757 dumpSources(Func); | 757 dumpSources(Func); |
| 758 } | 758 } |
| 759 | 759 |
| 760 void InstX8632Movsx::emit(const Cfg *Func) const { | 760 void InstX8632Movsx::emit(const Cfg *Func) const { |
| 761 Ostream &Str = Func->getContext()->getStrEmit(); | 761 Ostream &Str = Func->getContext()->getStrEmit(); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 870 Ostream &Str = Func->getContext()->getStrDump(); | 870 Ostream &Str = Func->getContext()->getStrDump(); |
| 871 dumpDest(Func); | 871 dumpDest(Func); |
| 872 Str << " = pop." << getDest()->getType() << " "; | 872 Str << " = pop." << getDest()->getType() << " "; |
| 873 } | 873 } |
| 874 | 874 |
| 875 void InstX8632Push::emit(const Cfg *Func) const { | 875 void InstX8632Push::emit(const Cfg *Func) const { |
| 876 Ostream &Str = Func->getContext()->getStrEmit(); | 876 Ostream &Str = Func->getContext()->getStrEmit(); |
| 877 assert(getSrcSize() == 1); | 877 assert(getSrcSize() == 1); |
| 878 Type Ty = getSrc(0)->getType(); | 878 Type Ty = getSrc(0)->getType(); |
| 879 Variable *Var = llvm::dyn_cast<Variable>(getSrc(0)); | 879 Variable *Var = llvm::dyn_cast<Variable>(getSrc(0)); |
| 880 if ((Ty == IceType_f32 || Ty == IceType_f64) && Var && Var->hasReg()) { | 880 if ((isVectorType(Ty) || Ty == IceType_f32 || Ty == IceType_f64) && Var && |
| 881 Var->hasReg()) { |
| 881 // The xmm registers can't be directly pushed, so we fake it by | 882 // The xmm registers can't be directly pushed, so we fake it by |
| 882 // decrementing esp and then storing to [esp]. | 883 // decrementing esp and then storing to [esp]. |
| 883 Str << "\tsub\tesp, " << typeWidthInBytes(Ty) << "\n"; | 884 Str << "\tsub\tesp, " << typeWidthInBytes(Ty) << "\n"; |
| 884 if (!SuppressStackAdjustment) | 885 if (!SuppressStackAdjustment) |
| 885 Func->getTarget()->updateStackAdjustment(typeWidthInBytes(Ty)); | 886 Func->getTarget()->updateStackAdjustment(typeWidthInBytes(Ty)); |
| 886 Str << "\tmov" << TypeX8632Attributes[Ty].SdSsString << "\t" | 887 if (isVectorType(Ty)) { |
| 887 << TypeX8632Attributes[Ty].WidthString << " [esp], "; | 888 Str << "\tmovups\txmmword ptr [esp], "; |
| 889 } else { |
| 890 Str << "\tmov" << TypeX8632Attributes[Ty].SdSsString << "\t" |
| 891 << TypeX8632Attributes[Ty].WidthString << " [esp], "; |
| 892 } |
| 888 getSrc(0)->emit(Func); | 893 getSrc(0)->emit(Func); |
| 889 Str << "\n"; | 894 Str << "\n"; |
| 890 } else if (Ty == IceType_f64 && (!Var || !Var->hasReg())) { | 895 } else if (Ty == IceType_f64 && (!Var || !Var->hasReg())) { |
| 891 // A double on the stack has to be pushed as two halves. Push the | 896 // A double on the stack has to be pushed as two halves. Push the |
| 892 // upper half followed by the lower half for little-endian. TODO: | 897 // upper half followed by the lower half for little-endian. TODO: |
| 893 // implement. | 898 // implement. |
| 894 llvm_unreachable("Missing support for pushing doubles from memory"); | 899 llvm_unreachable("Missing support for pushing doubles from memory"); |
| 895 } else { | 900 } else { |
| 896 Str << "\tpush\t"; | 901 Str << "\tpush\t"; |
| 897 getSrc(0)->emit(Func); | 902 getSrc(0)->emit(Func); |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 default: | 1073 default: |
| 1069 Str << "???"; | 1074 Str << "???"; |
| 1070 break; | 1075 break; |
| 1071 } | 1076 } |
| 1072 Str << "("; | 1077 Str << "("; |
| 1073 Var->dump(Func); | 1078 Var->dump(Func); |
| 1074 Str << ")"; | 1079 Str << ")"; |
| 1075 } | 1080 } |
| 1076 | 1081 |
| 1077 } // end of namespace Ice | 1082 } // end of namespace Ice |
| OLD | NEW |