| OLD | NEW |
| 1 //===- subzero/src/IceInstARM32.cpp - ARM32 instruction implementation ----===// | 1 //===- subzero/src/IceInstARM32.cpp - ARM32 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 /// \file | 10 /// \file |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 template <> const char *InstARM32Rev::Opcode = "rev"; | 396 template <> const char *InstARM32Rev::Opcode = "rev"; |
| 397 template <> const char *InstARM32Sxt::Opcode = "sxt"; // still requires b/h | 397 template <> const char *InstARM32Sxt::Opcode = "sxt"; // still requires b/h |
| 398 template <> const char *InstARM32Uxt::Opcode = "uxt"; // still requires b/h | 398 template <> const char *InstARM32Uxt::Opcode = "uxt"; // still requires b/h |
| 399 // FP | 399 // FP |
| 400 template <> const char *InstARM32Vsqrt::Opcode = "vsqrt"; | 400 template <> const char *InstARM32Vsqrt::Opcode = "vsqrt"; |
| 401 // Mov-like ops | 401 // Mov-like ops |
| 402 template <> const char *InstARM32Ldr::Opcode = "ldr"; | 402 template <> const char *InstARM32Ldr::Opcode = "ldr"; |
| 403 template <> const char *InstARM32Mov::Opcode = "mov"; | 403 template <> const char *InstARM32Mov::Opcode = "mov"; |
| 404 // FP | 404 // FP |
| 405 template <> const char *InstARM32Vldr::Opcode = "vldr"; | 405 template <> const char *InstARM32Vldr::Opcode = "vldr"; |
| 406 template <> const char *InstARM32Vmov::Opcode = "vmov"; | |
| 407 // Three-addr ops | 406 // Three-addr ops |
| 408 template <> const char *InstARM32Adc::Opcode = "adc"; | 407 template <> const char *InstARM32Adc::Opcode = "adc"; |
| 409 template <> const char *InstARM32Add::Opcode = "add"; | 408 template <> const char *InstARM32Add::Opcode = "add"; |
| 410 template <> const char *InstARM32And::Opcode = "and"; | 409 template <> const char *InstARM32And::Opcode = "and"; |
| 411 template <> const char *InstARM32Asr::Opcode = "asr"; | 410 template <> const char *InstARM32Asr::Opcode = "asr"; |
| 412 template <> const char *InstARM32Bic::Opcode = "bic"; | 411 template <> const char *InstARM32Bic::Opcode = "bic"; |
| 413 template <> const char *InstARM32Eor::Opcode = "eor"; | 412 template <> const char *InstARM32Eor::Opcode = "eor"; |
| 414 template <> const char *InstARM32Lsl::Opcode = "lsl"; | 413 template <> const char *InstARM32Lsl::Opcode = "lsl"; |
| 415 template <> const char *InstARM32Lsr::Opcode = "lsr"; | 414 template <> const char *InstARM32Lsr::Opcode = "lsr"; |
| 416 template <> const char *InstARM32Mul::Opcode = "mul"; | 415 template <> const char *InstARM32Mul::Opcode = "mul"; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 Str << ", "; | 490 Str << ", "; |
| 492 getSrc(0)->emit(Func); | 491 getSrc(0)->emit(Func); |
| 493 } | 492 } |
| 494 | 493 |
| 495 template <> void InstARM32Vldr::emitIAS(const Cfg *Func) const { | 494 template <> void InstARM32Vldr::emitIAS(const Cfg *Func) const { |
| 496 assert(getSrcSize() == 1); | 495 assert(getSrcSize() == 1); |
| 497 (void)Func; | 496 (void)Func; |
| 498 llvm_unreachable("Not yet implemented"); | 497 llvm_unreachable("Not yet implemented"); |
| 499 } | 498 } |
| 500 | 499 |
| 501 template <> void InstARM32Vmov::emit(const Cfg *Func) const { | 500 void InstARM32Vmov::emitMultiDestSingleSource(const Cfg *Func) const { |
| 502 if (!BuildDefs::dump()) | 501 if (!BuildDefs::dump()) |
| 503 return; | 502 return; |
| 504 assert(CondARM32::AL == getPredicate()); | |
| 505 Ostream &Str = Func->getContext()->getStrEmit(); | 503 Ostream &Str = Func->getContext()->getStrEmit(); |
| 506 assert(getSrcSize() == 1); | 504 Variable *Dest0 = getDest(); |
| 505 Operand *Src0 = getSrc(0); |
| 506 |
| 507 assert(Dest0->hasReg()); |
| 508 assert(Dest1->hasReg()); |
| 509 assert(!llvm::isa<OperandARM32Mem>(Src0)); |
| 510 |
| 511 Str << "\t" |
| 512 << "vmov" |
| 513 << "\t"; |
| 514 Dest0->emit(Func); |
| 515 Str << ", "; |
| 516 Dest1->emit(Func); |
| 517 Str << ", "; |
| 518 Src0->emit(Func); |
| 519 } |
| 520 |
| 521 void InstARM32Vmov::emitSingleDestMultiSource(const Cfg *Func) const { |
| 522 if (!BuildDefs::dump()) |
| 523 return; |
| 524 Ostream &Str = Func->getContext()->getStrEmit(); |
| 525 Variable *Dest0 = getDest(); |
| 526 Operand *Src0 = getSrc(0); |
| 527 Operand *Src1 = getSrc(1); |
| 528 |
| 529 assert(Dest0->hasReg()); |
| 530 assert(!llvm::isa<OperandARM32Mem>(Src0)); |
| 531 assert(!llvm::isa<OperandARM32Mem>(Src1)); |
| 532 |
| 533 Str << "\t" |
| 534 << "vmov" |
| 535 << "\t"; |
| 536 Dest0->emit(Func); |
| 537 Str << ", "; |
| 538 Src0->emit(Func); |
| 539 Str << ", "; |
| 540 Src1->emit(Func); |
| 541 } |
| 542 |
| 543 void InstARM32Vmov::emitSingleDestSingleSource(const Cfg *Func) const { |
| 544 if (!BuildDefs::dump()) |
| 545 return; |
| 546 Ostream &Str = Func->getContext()->getStrEmit(); |
| 507 Variable *Dest = getDest(); | 547 Variable *Dest = getDest(); |
| 508 if (Dest->hasReg()) { | 548 if (Dest->hasReg()) { |
| 509 IceString ActualOpcode = Opcode; | 549 IceString ActualOpcode = "vmov"; |
| 510 Operand *Src0 = getSrc(0); | 550 Operand *Src0 = getSrc(0); |
| 511 if (const auto *Src0V = llvm::dyn_cast<Variable>(Src0)) { | 551 if (const auto *Src0V = llvm::dyn_cast<Variable>(Src0)) { |
| 512 if (!Src0V->hasReg()) { | 552 if (!Src0V->hasReg()) { |
| 513 ActualOpcode = IceString("vldr"); | 553 ActualOpcode = IceString("vldr"); |
| 514 } | 554 } |
| 515 } else { | 555 } else { |
| 516 if (llvm::isa<OperandARM32Mem>(Src0)) | 556 if (llvm::isa<OperandARM32Mem>(Src0)) |
| 517 ActualOpcode = IceString("vldr"); | 557 ActualOpcode = IceString("vldr"); |
| 518 } | 558 } |
| 519 Str << "\t" << ActualOpcode << "\t"; | 559 Str << "\t" << ActualOpcode << "\t"; |
| 520 getDest()->emit(Func); | 560 getDest()->emit(Func); |
| 521 Str << ", "; | 561 Str << ", "; |
| 522 getSrc(0)->emit(Func); | 562 getSrc(0)->emit(Func); |
| 523 } else { | 563 } else { |
| 524 Variable *Src0 = llvm::cast<Variable>(getSrc(0)); | 564 Variable *Src0 = llvm::cast<Variable>(getSrc(0)); |
| 525 assert(Src0->hasReg()); | 565 assert(Src0->hasReg()); |
| 526 Str << "\t" | 566 Str << "\t" |
| 527 "vstr" | 567 "vstr" |
| 528 "\t"; | 568 "\t"; |
| 529 Src0->emit(Func); | 569 Src0->emit(Func); |
| 530 Str << ", "; | 570 Str << ", "; |
| 531 Dest->emit(Func); | 571 Dest->emit(Func); |
| 532 } | 572 } |
| 533 } | 573 } |
| 534 | 574 |
| 535 template <> void InstARM32Vmov::emitIAS(const Cfg *Func) const { | 575 void InstARM32Vmov::emit(const Cfg *Func) const { |
| 576 if (!BuildDefs::dump()) |
| 577 return; |
| 578 assert(CondARM32::AL == getPredicate()); |
| 579 assert(isMultiDest() + isMultiSource() <= 1 && "Invalid vmov type."); |
| 580 if (isMultiDest()) { |
| 581 emitMultiDestSingleSource(Func); |
| 582 return; |
| 583 } |
| 584 |
| 585 if (isMultiSource()) { |
| 586 emitSingleDestMultiSource(Func); |
| 587 return; |
| 588 } |
| 589 |
| 590 emitSingleDestSingleSource(Func); |
| 591 } |
| 592 |
| 593 void InstARM32Vmov::emitIAS(const Cfg *Func) const { |
| 536 assert(getSrcSize() == 1); | 594 assert(getSrcSize() == 1); |
| 537 (void)Func; | 595 (void)Func; |
| 538 llvm_unreachable("Not yet implemented"); | 596 llvm_unreachable("Not yet implemented"); |
| 539 } | 597 } |
| 540 | 598 |
| 599 void InstARM32Vmov::dump(const Cfg *Func) const { |
| 600 if (!BuildDefs::dump()) |
| 601 return; |
| 602 Ostream &Str = Func->getContext()->getStrDump(); |
| 603 dumpOpcodePred(Str, "vmov", getDest()->getType()); |
| 604 Str << " "; |
| 605 dumpDest(Func); |
| 606 Str << ", "; |
| 607 dumpSources(Func); |
| 608 } |
| 609 |
| 541 void InstARM32Br::emit(const Cfg *Func) const { | 610 void InstARM32Br::emit(const Cfg *Func) const { |
| 542 if (!BuildDefs::dump()) | 611 if (!BuildDefs::dump()) |
| 543 return; | 612 return; |
| 544 Ostream &Str = Func->getContext()->getStrEmit(); | 613 Ostream &Str = Func->getContext()->getStrEmit(); |
| 545 Str << "\t" | 614 Str << "\t" |
| 546 << "b" << getPredicate() << "\t"; | 615 << "b" << getPredicate() << "\t"; |
| 547 if (Label) { | 616 if (Label) { |
| 548 Str << Label->getName(Func); | 617 Str << Label->getName(Func); |
| 549 } else { | 618 } else { |
| 550 if (isUnconditionalBranch()) { | 619 if (isUnconditionalBranch()) { |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 if (getShiftOp() != kNoShift) { | 1151 if (getShiftOp() != kNoShift) { |
| 1083 Str << ", " << InstARM32ShiftAttributes[getShiftOp()].EmitString << " "; | 1152 Str << ", " << InstARM32ShiftAttributes[getShiftOp()].EmitString << " "; |
| 1084 if (Func) | 1153 if (Func) |
| 1085 getShiftAmt()->dump(Func); | 1154 getShiftAmt()->dump(Func); |
| 1086 else | 1155 else |
| 1087 getShiftAmt()->dump(Str); | 1156 getShiftAmt()->dump(Str); |
| 1088 } | 1157 } |
| 1089 } | 1158 } |
| 1090 | 1159 |
| 1091 } // end of namespace Ice | 1160 } // end of namespace Ice |
| OLD | NEW |