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

Side by Side Diff: src/IceInstX8632.cpp

Issue 390443005: Lower bitmanip intrinsics, assuming absence of BMI/SSE4.2 for now. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: stuff Created 6 years, 5 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
OLDNEW
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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 : InstX8632(Func, InstX8632::Label, 0, NULL), 114 : InstX8632(Func, InstX8632::Label, 0, NULL),
115 Number(Target->makeNextLabelNumber()) {} 115 Number(Target->makeNextLabelNumber()) {}
116 116
117 IceString InstX8632Label::getName(const Cfg *Func) const { 117 IceString InstX8632Label::getName(const Cfg *Func) const {
118 char buf[30]; 118 char buf[30];
119 snprintf(buf, llvm::array_lengthof(buf), "%u", Number); 119 snprintf(buf, llvm::array_lengthof(buf), "%u", Number);
120 return ".L" + Func->getFunctionName() + "$__" + buf; 120 return ".L" + Func->getFunctionName() + "$__" + buf;
121 } 121 }
122 122
123 InstX8632Br::InstX8632Br(Cfg *Func, CfgNode *TargetTrue, CfgNode *TargetFalse, 123 InstX8632Br::InstX8632Br(Cfg *Func, CfgNode *TargetTrue, CfgNode *TargetFalse,
124 InstX8632Label *Label, InstX8632Br::BrCond Condition) 124 InstX8632Label *Label, InstX8632::BrCond Condition)
125 : InstX8632(Func, InstX8632::Br, 0, NULL), Condition(Condition), 125 : InstX8632(Func, InstX8632::Br, 0, NULL), Condition(Condition),
126 TargetTrue(TargetTrue), TargetFalse(TargetFalse), Label(Label) {} 126 TargetTrue(TargetTrue), TargetFalse(TargetFalse), Label(Label) {}
127 127
128 InstX8632Call::InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget) 128 InstX8632Call::InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget)
129 : InstX8632(Func, InstX8632::Call, 1, Dest) { 129 : InstX8632(Func, InstX8632::Call, 1, Dest) {
130 HasSideEffects = true; 130 HasSideEffects = true;
131 addSource(CallTarget); 131 addSource(CallTarget);
132 } 132 }
133 133
134 InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source) 134 InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source)
135 : InstX8632(Func, InstX8632::Cdq, 1, Dest) { 135 : InstX8632(Func, InstX8632::Cdq, 1, Dest) {
136 assert(Dest->getRegNum() == TargetX8632::Reg_edx); 136 assert(Dest->getRegNum() == TargetX8632::Reg_edx);
137 assert(llvm::isa<Variable>(Source)); 137 assert(llvm::isa<Variable>(Source));
138 assert(llvm::dyn_cast<Variable>(Source)->getRegNum() == TargetX8632::Reg_eax); 138 assert(llvm::dyn_cast<Variable>(Source)->getRegNum() == TargetX8632::Reg_eax);
139 addSource(Source); 139 addSource(Source);
140 } 140 }
141 141
142 InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source,
143 InstX8632::BrCond Condition)
144 : InstX8632(Func, InstX8632::Cmov, 2, Dest), Condition(Condition) {
145 // The final result is either the original Dest, or Source, so mark
146 // both as sources.
147 addSource(Dest);
148 addSource(Source);
149 }
150
142 InstX8632Cmpxchg::InstX8632Cmpxchg(Cfg *Func, Operand *DestOrAddr, 151 InstX8632Cmpxchg::InstX8632Cmpxchg(Cfg *Func, Operand *DestOrAddr,
143 Variable *Eax, Variable *Desired, 152 Variable *Eax, Variable *Desired,
144 bool Locked) 153 bool Locked)
145 : InstX8632Lockable(Func, InstX8632::Cmpxchg, 3, 154 : InstX8632Lockable(Func, InstX8632::Cmpxchg, 3,
146 llvm::dyn_cast<Variable>(DestOrAddr), Locked) { 155 llvm::dyn_cast<Variable>(DestOrAddr), Locked) {
147 assert(Eax->getRegNum() == TargetX8632::Reg_eax); 156 assert(Eax->getRegNum() == TargetX8632::Reg_eax);
148 addSource(DestOrAddr); 157 addSource(DestOrAddr);
149 addSource(Eax); 158 addSource(Eax);
150 addSource(Desired); 159 addSource(Desired);
151 } 160 }
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 template <> const char *InstX8632Imul::Opcode = "imul"; 454 template <> const char *InstX8632Imul::Opcode = "imul";
446 template <> const char *InstX8632Mulps::Opcode = "mulps"; 455 template <> const char *InstX8632Mulps::Opcode = "mulps";
447 template <> const char *InstX8632Mulss::Opcode = "mulss"; 456 template <> const char *InstX8632Mulss::Opcode = "mulss";
448 template <> const char *InstX8632Div::Opcode = "div"; 457 template <> const char *InstX8632Div::Opcode = "div";
449 template <> const char *InstX8632Divps::Opcode = "divps"; 458 template <> const char *InstX8632Divps::Opcode = "divps";
450 template <> const char *InstX8632Idiv::Opcode = "idiv"; 459 template <> const char *InstX8632Idiv::Opcode = "idiv";
451 template <> const char *InstX8632Divss::Opcode = "divss"; 460 template <> const char *InstX8632Divss::Opcode = "divss";
452 template <> const char *InstX8632Shl::Opcode = "shl"; 461 template <> const char *InstX8632Shl::Opcode = "shl";
453 template <> const char *InstX8632Shr::Opcode = "shr"; 462 template <> const char *InstX8632Shr::Opcode = "shr";
454 template <> const char *InstX8632Sar::Opcode = "sar"; 463 template <> const char *InstX8632Sar::Opcode = "sar";
464 template <> const char *InstX8632Bsf::Opcode = "bsf";
465 template <> const char *InstX8632Bsr::Opcode = "bsr";
455 466
456 template <> void InstX8632Addss::emit(const Cfg *Func) const { 467 template <> void InstX8632Addss::emit(const Cfg *Func) const {
457 char buf[30]; 468 char buf[30];
458 snprintf(buf, llvm::array_lengthof(buf), "add%s", 469 snprintf(buf, llvm::array_lengthof(buf), "add%s",
459 TypeX8632Attributes[getDest()->getType()].SdSsString); 470 TypeX8632Attributes[getDest()->getType()].SdSsString);
460 emitTwoAddress(buf, this, Func); 471 emitTwoAddress(buf, this, Func);
461 } 472 }
462 473
463 template <> void InstX8632Subss::emit(const Cfg *Func) const { 474 template <> void InstX8632Subss::emit(const Cfg *Func) const {
464 char buf[30]; 475 char buf[30];
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 Str << "\tcdq\n"; 590 Str << "\tcdq\n";
580 } 591 }
581 592
582 void InstX8632Cdq::dump(const Cfg *Func) const { 593 void InstX8632Cdq::dump(const Cfg *Func) const {
583 Ostream &Str = Func->getContext()->getStrDump(); 594 Ostream &Str = Func->getContext()->getStrDump();
584 dumpDest(Func); 595 dumpDest(Func);
585 Str << " = cdq." << getSrc(0)->getType() << " "; 596 Str << " = cdq." << getSrc(0)->getType() << " ";
586 dumpSources(Func); 597 dumpSources(Func);
587 } 598 }
588 599
600 void InstX8632Cmov::emit(const Cfg *Func) const {
601 Ostream &Str = Func->getContext()->getStrEmit();
602 Str << "\t";
603 assert(Condition != Br_None);
Jim Stichnoth 2014/07/14 23:20:45 Add an assert that Dest is a physical register.
jvoung (off chromium) 2014/07/15 21:30:23 Done.
604 Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "\t";
605 getDest()->emit(Func);
606 Str << ", ";
607 getSrc(1)->emit(Func);
608 Str << "\n";
609 }
610
611 void InstX8632Cmov::dump(const Cfg *Func) const {
612 Ostream &Str = Func->getContext()->getStrDump();
613 Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << ".";
614 Str << getDest()->getType() << " ";
615 dumpDest(Func);
616 Str << ", ";
617 dumpSources(Func);
618 }
619
589 void InstX8632Cmpxchg::emit(const Cfg *Func) const { 620 void InstX8632Cmpxchg::emit(const Cfg *Func) const {
590 Ostream &Str = Func->getContext()->getStrEmit(); 621 Ostream &Str = Func->getContext()->getStrEmit();
591 assert(getSrcSize() == 3); 622 assert(getSrcSize() == 3);
592 if (Locked) { 623 if (Locked) {
593 Str << "\tlock"; 624 Str << "\tlock";
594 } 625 }
595 Str << "\tcmpxchg\t"; 626 Str << "\tcmpxchg\t";
596 getSrc(0)->emit(Func); 627 getSrc(0)->emit(Func);
597 Str << ", "; 628 Str << ", ";
598 getSrc(2)->emit(Func); 629 getSrc(2)->emit(Func);
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 default: 1221 default:
1191 Str << "???"; 1222 Str << "???";
1192 break; 1223 break;
1193 } 1224 }
1194 Str << "("; 1225 Str << "(";
1195 Var->dump(Func); 1226 Var->dump(Func);
1196 Str << ")"; 1227 Str << ")";
1197 } 1228 }
1198 1229
1199 } // end of namespace Ice 1230 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698