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

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: review 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
« no previous file with comments | « src/IceInstX8632.h ('k') | src/IceTargetLoweringX8632.h » ('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.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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 } 87 }
88 } 88 }
89 89
90 InstX8632Mul::InstX8632Mul(Cfg *Func, Variable *Dest, Variable *Source1, 90 InstX8632Mul::InstX8632Mul(Cfg *Func, Variable *Dest, Variable *Source1,
91 Operand *Source2) 91 Operand *Source2)
92 : InstX8632(Func, InstX8632::Mul, 2, Dest) { 92 : InstX8632(Func, InstX8632::Mul, 2, Dest) {
93 addSource(Source1); 93 addSource(Source1);
94 addSource(Source2); 94 addSource(Source2);
95 } 95 }
96 96
97 InstX8632Neg::InstX8632Neg(Cfg *Func, Operand *SrcDest)
98 : InstX8632(Func, InstX8632::Neg, 1, llvm::dyn_cast<Variable>(SrcDest)) {
99 addSource(SrcDest);
100 }
101
97 InstX8632Shld::InstX8632Shld(Cfg *Func, Variable *Dest, Variable *Source1, 102 InstX8632Shld::InstX8632Shld(Cfg *Func, Variable *Dest, Variable *Source1,
98 Variable *Source2) 103 Variable *Source2)
99 : InstX8632(Func, InstX8632::Shld, 3, Dest) { 104 : InstX8632(Func, InstX8632::Shld, 3, Dest) {
100 addSource(Dest); 105 addSource(Dest);
101 addSource(Source1); 106 addSource(Source1);
102 addSource(Source2); 107 addSource(Source2);
103 } 108 }
104 109
105 InstX8632Shrd::InstX8632Shrd(Cfg *Func, Variable *Dest, Variable *Source1, 110 InstX8632Shrd::InstX8632Shrd(Cfg *Func, Variable *Dest, Variable *Source1,
106 Variable *Source2) 111 Variable *Source2)
107 : InstX8632(Func, InstX8632::Shrd, 3, Dest) { 112 : InstX8632(Func, InstX8632::Shrd, 3, Dest) {
108 addSource(Dest); 113 addSource(Dest);
109 addSource(Source1); 114 addSource(Source1);
110 addSource(Source2); 115 addSource(Source2);
111 } 116 }
112 117
113 InstX8632Label::InstX8632Label(Cfg *Func, TargetX8632 *Target) 118 InstX8632Label::InstX8632Label(Cfg *Func, TargetX8632 *Target)
114 : InstX8632(Func, InstX8632::Label, 0, NULL), 119 : InstX8632(Func, InstX8632::Label, 0, NULL),
115 Number(Target->makeNextLabelNumber()) {} 120 Number(Target->makeNextLabelNumber()) {}
116 121
117 IceString InstX8632Label::getName(const Cfg *Func) const { 122 IceString InstX8632Label::getName(const Cfg *Func) const {
118 char buf[30]; 123 char buf[30];
119 snprintf(buf, llvm::array_lengthof(buf), "%u", Number); 124 snprintf(buf, llvm::array_lengthof(buf), "%u", Number);
120 return ".L" + Func->getFunctionName() + "$__" + buf; 125 return ".L" + Func->getFunctionName() + "$__" + buf;
121 } 126 }
122 127
123 InstX8632Br::InstX8632Br(Cfg *Func, CfgNode *TargetTrue, CfgNode *TargetFalse, 128 InstX8632Br::InstX8632Br(Cfg *Func, CfgNode *TargetTrue, CfgNode *TargetFalse,
124 InstX8632Label *Label, InstX8632Br::BrCond Condition) 129 InstX8632Label *Label, InstX8632::BrCond Condition)
125 : InstX8632(Func, InstX8632::Br, 0, NULL), Condition(Condition), 130 : InstX8632(Func, InstX8632::Br, 0, NULL), Condition(Condition),
126 TargetTrue(TargetTrue), TargetFalse(TargetFalse), Label(Label) {} 131 TargetTrue(TargetTrue), TargetFalse(TargetFalse), Label(Label) {}
127 132
128 InstX8632Call::InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget) 133 InstX8632Call::InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget)
129 : InstX8632(Func, InstX8632::Call, 1, Dest) { 134 : InstX8632(Func, InstX8632::Call, 1, Dest) {
130 HasSideEffects = true; 135 HasSideEffects = true;
131 addSource(CallTarget); 136 addSource(CallTarget);
132 } 137 }
133 138
134 InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source) 139 InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source)
135 : InstX8632(Func, InstX8632::Cdq, 1, Dest) { 140 : InstX8632(Func, InstX8632::Cdq, 1, Dest) {
136 assert(Dest->getRegNum() == TargetX8632::Reg_edx); 141 assert(Dest->getRegNum() == TargetX8632::Reg_edx);
137 assert(llvm::isa<Variable>(Source)); 142 assert(llvm::isa<Variable>(Source));
138 assert(llvm::dyn_cast<Variable>(Source)->getRegNum() == TargetX8632::Reg_eax); 143 assert(llvm::dyn_cast<Variable>(Source)->getRegNum() == TargetX8632::Reg_eax);
139 addSource(Source); 144 addSource(Source);
140 } 145 }
141 146
147 InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source,
148 InstX8632::BrCond Condition)
149 : InstX8632(Func, InstX8632::Cmov, 2, Dest), Condition(Condition) {
150 // The final result is either the original Dest, or Source, so mark
151 // both as sources.
152 addSource(Dest);
153 addSource(Source);
154 }
155
142 InstX8632Cmpxchg::InstX8632Cmpxchg(Cfg *Func, Operand *DestOrAddr, 156 InstX8632Cmpxchg::InstX8632Cmpxchg(Cfg *Func, Operand *DestOrAddr,
143 Variable *Eax, Variable *Desired, 157 Variable *Eax, Variable *Desired,
144 bool Locked) 158 bool Locked)
145 : InstX8632Lockable(Func, InstX8632::Cmpxchg, 3, 159 : InstX8632Lockable(Func, InstX8632::Cmpxchg, 3,
146 llvm::dyn_cast<Variable>(DestOrAddr), Locked) { 160 llvm::dyn_cast<Variable>(DestOrAddr), Locked) {
147 assert(Eax->getRegNum() == TargetX8632::Reg_eax); 161 assert(Eax->getRegNum() == TargetX8632::Reg_eax);
148 addSource(DestOrAddr); 162 addSource(DestOrAddr);
149 addSource(Eax); 163 addSource(Eax);
150 addSource(Desired); 164 addSource(Desired);
151 } 165 }
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 return false; 304 return false;
291 if (getDest()->hasReg() && getDest()->getRegNum() == Src->getRegNum()) { 305 if (getDest()->hasReg() && getDest()->getRegNum() == Src->getRegNum()) {
292 return true; 306 return true;
293 } 307 }
294 if (!getDest()->hasReg() && !Src->hasReg() && 308 if (!getDest()->hasReg() && !Src->hasReg() &&
295 Dest->getStackOffset() == Src->getStackOffset()) 309 Dest->getStackOffset() == Src->getStackOffset())
296 return true; 310 return true;
297 return false; 311 return false;
298 } 312 }
299 313
300 InstX8632Sqrtss::InstX8632Sqrtss(Cfg *Func, Variable *Dest, Operand *Source)
301 : InstX8632(Func, InstX8632::Sqrtss, 1, Dest) {
302 addSource(Source);
303 }
304
305 InstX8632Ret::InstX8632Ret(Cfg *Func, Variable *Source) 314 InstX8632Ret::InstX8632Ret(Cfg *Func, Variable *Source)
306 : InstX8632(Func, InstX8632::Ret, Source ? 1 : 0, NULL) { 315 : InstX8632(Func, InstX8632::Ret, Source ? 1 : 0, NULL) {
307 if (Source) 316 if (Source)
308 addSource(Source); 317 addSource(Source);
309 } 318 }
310 319
311 InstX8632Xadd::InstX8632Xadd(Cfg *Func, Operand *Dest, Variable *Source, 320 InstX8632Xadd::InstX8632Xadd(Cfg *Func, Operand *Dest, Variable *Source,
312 bool Locked) 321 bool Locked)
313 : InstX8632Lockable(Func, InstX8632::Xadd, 2, 322 : InstX8632Lockable(Func, InstX8632::Xadd, 2,
314 llvm::dyn_cast<Variable>(Dest), Locked) { 323 llvm::dyn_cast<Variable>(Dest), Locked) {
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 if (ShiftReg && ShiftReg->getRegNum() == TargetX8632::Reg_ecx) { 431 if (ShiftReg && ShiftReg->getRegNum() == TargetX8632::Reg_ecx) {
423 Str << "cl"; 432 Str << "cl";
424 EmittedSrc1 = true; 433 EmittedSrc1 = true;
425 } 434 }
426 } 435 }
427 if (!EmittedSrc1) 436 if (!EmittedSrc1)
428 Inst->getSrc(1)->emit(Func); 437 Inst->getSrc(1)->emit(Func);
429 Str << "\n"; 438 Str << "\n";
430 } 439 }
431 440
432 template <> const char *InstX8632Neg::Opcode = "neg"; 441 template <> const char *InstX8632Bsf::Opcode = "bsf";
442 template <> const char *InstX8632Bsr::Opcode = "bsr";
443 template <> const char *InstX8632Sqrtss::Opcode = "sqrtss";
433 template <> const char *InstX8632Add::Opcode = "add"; 444 template <> const char *InstX8632Add::Opcode = "add";
434 template <> const char *InstX8632Addps::Opcode = "addps"; 445 template <> const char *InstX8632Addps::Opcode = "addps";
435 template <> const char *InstX8632Adc::Opcode = "adc"; 446 template <> const char *InstX8632Adc::Opcode = "adc";
436 template <> const char *InstX8632Addss::Opcode = "addss"; 447 template <> const char *InstX8632Addss::Opcode = "addss";
437 template <> const char *InstX8632Sub::Opcode = "sub"; 448 template <> const char *InstX8632Sub::Opcode = "sub";
438 template <> const char *InstX8632Subps::Opcode = "subps"; 449 template <> const char *InstX8632Subps::Opcode = "subps";
439 template <> const char *InstX8632Subss::Opcode = "subss"; 450 template <> const char *InstX8632Subss::Opcode = "subss";
440 template <> const char *InstX8632Sbb::Opcode = "sbb"; 451 template <> const char *InstX8632Sbb::Opcode = "sbb";
441 template <> const char *InstX8632And::Opcode = "and"; 452 template <> const char *InstX8632And::Opcode = "and";
442 template <> const char *InstX8632Or::Opcode = "or"; 453 template <> const char *InstX8632Or::Opcode = "or";
443 template <> const char *InstX8632Xor::Opcode = "xor"; 454 template <> const char *InstX8632Xor::Opcode = "xor";
444 template <> const char *InstX8632Pxor::Opcode = "pxor"; 455 template <> const char *InstX8632Pxor::Opcode = "pxor";
445 template <> const char *InstX8632Imul::Opcode = "imul"; 456 template <> const char *InstX8632Imul::Opcode = "imul";
446 template <> const char *InstX8632Mulps::Opcode = "mulps"; 457 template <> const char *InstX8632Mulps::Opcode = "mulps";
447 template <> const char *InstX8632Mulss::Opcode = "mulss"; 458 template <> const char *InstX8632Mulss::Opcode = "mulss";
448 template <> const char *InstX8632Div::Opcode = "div"; 459 template <> const char *InstX8632Div::Opcode = "div";
449 template <> const char *InstX8632Divps::Opcode = "divps"; 460 template <> const char *InstX8632Divps::Opcode = "divps";
450 template <> const char *InstX8632Idiv::Opcode = "idiv"; 461 template <> const char *InstX8632Idiv::Opcode = "idiv";
451 template <> const char *InstX8632Divss::Opcode = "divss"; 462 template <> const char *InstX8632Divss::Opcode = "divss";
452 template <> const char *InstX8632Shl::Opcode = "shl"; 463 template <> const char *InstX8632Shl::Opcode = "shl";
453 template <> const char *InstX8632Shr::Opcode = "shr"; 464 template <> const char *InstX8632Shr::Opcode = "shr";
454 template <> const char *InstX8632Sar::Opcode = "sar"; 465 template <> const char *InstX8632Sar::Opcode = "sar";
455 466
467 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const {
468 Ostream &Str = Func->getContext()->getStrEmit();
469 assert(getSrcSize() == 1);
470 Type Ty = getSrc(0)->getType();
471 assert(Ty == IceType_f32 || Ty == IceType_f64);
472 Str << "\tsqrt" << TypeX8632Attributes[Ty].SdSsString << "\t";
473 getDest()->emit(Func);
474 Str << ", ";
475 getSrc(0)->emit(Func);
476 Str << "\n";
477 }
478
456 template <> void InstX8632Addss::emit(const Cfg *Func) const { 479 template <> void InstX8632Addss::emit(const Cfg *Func) const {
457 char buf[30]; 480 char buf[30];
458 snprintf(buf, llvm::array_lengthof(buf), "add%s", 481 snprintf(buf, llvm::array_lengthof(buf), "add%s",
459 TypeX8632Attributes[getDest()->getType()].SdSsString); 482 TypeX8632Attributes[getDest()->getType()].SdSsString);
460 emitTwoAddress(buf, this, Func); 483 emitTwoAddress(buf, this, Func);
461 } 484 }
462 485
463 template <> void InstX8632Subss::emit(const Cfg *Func) const { 486 template <> void InstX8632Subss::emit(const Cfg *Func) const {
464 char buf[30]; 487 char buf[30];
465 snprintf(buf, llvm::array_lengthof(buf), "sub%s", 488 snprintf(buf, llvm::array_lengthof(buf), "sub%s",
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 Str << "\n"; 539 Str << "\n";
517 } 540 }
518 541
519 void InstX8632Mul::dump(const Cfg *Func) const { 542 void InstX8632Mul::dump(const Cfg *Func) const {
520 Ostream &Str = Func->getContext()->getStrDump(); 543 Ostream &Str = Func->getContext()->getStrDump();
521 dumpDest(Func); 544 dumpDest(Func);
522 Str << " = mul." << getDest()->getType() << " "; 545 Str << " = mul." << getDest()->getType() << " ";
523 dumpSources(Func); 546 dumpSources(Func);
524 } 547 }
525 548
549 void InstX8632Neg::emit(const Cfg *Func) const {
550 Ostream &Str = Func->getContext()->getStrEmit();
551 assert(getSrcSize() == 1);
552 Str << "\tneg\t";
553 getSrc(0)->emit(Func);
554 Str << "\n";
555 }
556
557 void InstX8632Neg::dump(const Cfg *Func) const {
558 Ostream &Str = Func->getContext()->getStrDump();
559 dumpDest(Func);
560 Str << " = neg." << getDest()->getType() << " ";
561 dumpSources(Func);
562 }
563
526 void InstX8632Shld::emit(const Cfg *Func) const { 564 void InstX8632Shld::emit(const Cfg *Func) const {
527 Ostream &Str = Func->getContext()->getStrEmit(); 565 Ostream &Str = Func->getContext()->getStrEmit();
528 assert(getSrcSize() == 3); 566 assert(getSrcSize() == 3);
529 assert(getDest() == getSrc(0)); 567 assert(getDest() == getSrc(0));
530 Str << "\tshld\t"; 568 Str << "\tshld\t";
531 getDest()->emit(Func); 569 getDest()->emit(Func);
532 Str << ", "; 570 Str << ", ";
533 getSrc(1)->emit(Func); 571 getSrc(1)->emit(Func);
534 Str << ", "; 572 Str << ", ";
535 if (Variable *ShiftReg = llvm::dyn_cast<Variable>(getSrc(2))) { 573 if (Variable *ShiftReg = llvm::dyn_cast<Variable>(getSrc(2))) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 Str << "\tcdq\n"; 617 Str << "\tcdq\n";
580 } 618 }
581 619
582 void InstX8632Cdq::dump(const Cfg *Func) const { 620 void InstX8632Cdq::dump(const Cfg *Func) const {
583 Ostream &Str = Func->getContext()->getStrDump(); 621 Ostream &Str = Func->getContext()->getStrDump();
584 dumpDest(Func); 622 dumpDest(Func);
585 Str << " = cdq." << getSrc(0)->getType() << " "; 623 Str << " = cdq." << getSrc(0)->getType() << " ";
586 dumpSources(Func); 624 dumpSources(Func);
587 } 625 }
588 626
627 void InstX8632Cmov::emit(const Cfg *Func) const {
628 Ostream &Str = Func->getContext()->getStrEmit();
629 Str << "\t";
630 assert(Condition != Br_None);
631 assert(getDest()->hasReg());
632 Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "\t";
633 getDest()->emit(Func);
634 Str << ", ";
635 getSrc(1)->emit(Func);
636 Str << "\n";
637 }
638
639 void InstX8632Cmov::dump(const Cfg *Func) const {
640 Ostream &Str = Func->getContext()->getStrDump();
641 Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << ".";
642 Str << getDest()->getType() << " ";
643 dumpDest(Func);
644 Str << ", ";
645 dumpSources(Func);
646 }
647
589 void InstX8632Cmpxchg::emit(const Cfg *Func) const { 648 void InstX8632Cmpxchg::emit(const Cfg *Func) const {
590 Ostream &Str = Func->getContext()->getStrEmit(); 649 Ostream &Str = Func->getContext()->getStrEmit();
591 assert(getSrcSize() == 3); 650 assert(getSrcSize() == 3);
592 if (Locked) { 651 if (Locked) {
593 Str << "\tlock"; 652 Str << "\tlock";
594 } 653 }
595 Str << "\tcmpxchg\t"; 654 Str << "\tcmpxchg\t";
596 getSrc(0)->emit(Func); 655 getSrc(0)->emit(Func);
597 Str << ", "; 656 Str << ", ";
598 getSrc(2)->emit(Func); 657 getSrc(2)->emit(Func);
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 Str << "\tret\n"; 1059 Str << "\tret\n";
1001 } 1060 }
1002 1061
1003 void InstX8632Ret::dump(const Cfg *Func) const { 1062 void InstX8632Ret::dump(const Cfg *Func) const {
1004 Ostream &Str = Func->getContext()->getStrDump(); 1063 Ostream &Str = Func->getContext()->getStrDump();
1005 Type Ty = (getSrcSize() == 0 ? IceType_void : getSrc(0)->getType()); 1064 Type Ty = (getSrcSize() == 0 ? IceType_void : getSrc(0)->getType());
1006 Str << "ret." << Ty << " "; 1065 Str << "ret." << Ty << " ";
1007 dumpSources(Func); 1066 dumpSources(Func);
1008 } 1067 }
1009 1068
1010 void InstX8632Sqrtss::emit(const Cfg *Func) const {
1011 Ostream &Str = Func->getContext()->getStrEmit();
1012 assert(getSrcSize() == 1);
1013 Type Ty = getSrc(0)->getType();
1014 assert(Ty == IceType_f32 || Ty == IceType_f64);
1015 Str << "\tsqrt" << TypeX8632Attributes[Ty].SdSsString << "\t";
1016 getDest()->emit(Func);
1017 Str << ", ";
1018 getSrc(0)->emit(Func);
1019 Str << "\n";
1020 }
1021
1022 void InstX8632Sqrtss::dump(const Cfg *Func) const {
1023 Ostream &Str = Func->getContext()->getStrDump();
1024 dumpDest(Func);
1025 Str << " = sqrt." << getDest()->getType() << " ";
1026 dumpSources(Func);
1027 }
1028
1029 void InstX8632Xadd::emit(const Cfg *Func) const { 1069 void InstX8632Xadd::emit(const Cfg *Func) const {
1030 Ostream &Str = Func->getContext()->getStrEmit(); 1070 Ostream &Str = Func->getContext()->getStrEmit();
1031 if (Locked) { 1071 if (Locked) {
1032 Str << "\tlock"; 1072 Str << "\tlock";
1033 } 1073 }
1034 Str << "\txadd\t"; 1074 Str << "\txadd\t";
1035 getSrc(0)->emit(Func); 1075 getSrc(0)->emit(Func);
1036 Str << ", "; 1076 Str << ", ";
1037 getSrc(1)->emit(Func); 1077 getSrc(1)->emit(Func);
1038 Str << "\n"; 1078 Str << "\n";
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 default: 1230 default:
1191 Str << "???"; 1231 Str << "???";
1192 break; 1232 break;
1193 } 1233 }
1194 Str << "("; 1234 Str << "(";
1195 Var->dump(Func); 1235 Var->dump(Func);
1196 Str << ")"; 1236 Str << ")";
1197 } 1237 }
1198 1238
1199 } // end of namespace Ice 1239 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceInstX8632.h ('k') | src/IceTargetLoweringX8632.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698