PeepsMD.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "BackEnd.h"
  6. // PeepsMD::Init
  7. void
  8. PeepsMD::Init(Peeps *peeps)
  9. {
  10. this->peeps = peeps;
  11. }
  12. // PeepsMD::ProcessImplicitRegs
  13. // Note: only do calls for now
  14. void
  15. PeepsMD::ProcessImplicitRegs(IR::Instr *instr)
  16. {
  17. if (LowererMD::IsCall(instr))
  18. {
  19. this->peeps->ClearReg(RegEAX);
  20. this->peeps->ClearReg(RegECX);
  21. this->peeps->ClearReg(RegEDX);
  22. this->peeps->ClearReg(RegXMM0);
  23. this->peeps->ClearReg(RegXMM1);
  24. this->peeps->ClearReg(RegXMM2);
  25. this->peeps->ClearReg(RegXMM3);
  26. this->peeps->ClearReg(RegXMM4);
  27. this->peeps->ClearReg(RegXMM5);
  28. this->peeps->ClearReg(RegXMM6);
  29. this->peeps->ClearReg(RegXMM7);
  30. }
  31. else if (instr->m_opcode == Js::OpCode::IMUL)
  32. {
  33. this->peeps->ClearReg(RegEDX);
  34. }
  35. else if (instr->m_opcode == Js::OpCode::IDIV || instr->m_opcode == Js::OpCode::DIV)
  36. {
  37. if (instr->GetDst()->AsRegOpnd()->GetReg() == RegEDX)
  38. {
  39. this->peeps->ClearReg(RegEAX);
  40. }
  41. else
  42. {
  43. Assert(instr->GetDst()->AsRegOpnd()->GetReg() == RegEAX);
  44. this->peeps->ClearReg(RegEDX);
  45. }
  46. }
  47. }
  48. void
  49. PeepsMD::PeepAssign(IR::Instr *instr)
  50. {
  51. IR::Opnd *src = instr->GetSrc1();
  52. IR::Opnd *dst = instr->GetDst();
  53. if (instr->m_opcode == Js::OpCode::MOV && src->IsIntConstOpnd()
  54. && src->AsIntConstOpnd()->GetValue() == 0 && dst->IsRegOpnd())
  55. {
  56. Assert(instr->GetSrc2() == NULL);
  57. instr->m_opcode = Js::OpCode::XOR;
  58. instr->ReplaceSrc1(dst);
  59. instr->SetSrc2(dst);
  60. } else if ((instr->m_opcode == Js::OpCode::MOVSD || instr->m_opcode == Js::OpCode::MOVSS || instr->m_opcode == Js::OpCode::MOVUPS) && src->IsRegOpnd() && dst->IsRegOpnd())
  61. {
  62. // MOVAPS has 1 byte shorter encoding
  63. instr->m_opcode = Js::OpCode::MOVAPS;
  64. }
  65. else if (instr->m_opcode == Js::OpCode::MOVSD_ZERO)
  66. {
  67. instr->m_opcode = Js::OpCode::XORPS;
  68. instr->SetSrc1(dst);
  69. instr->SetSrc2(dst);
  70. }
  71. }