liveness_set.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "BasicBlock.h"
  2. #include "machine_x86.h"
  3. /* DU bit definitions for each reg value - including index registers */
  4. LivenessSet duReg[] = { {},
  5. //AH AL . . AX, BH
  6. {rAH,rAL,rAX},{rCH,rCL,rCX},{rDH,rDL,rDX},{rBH,rBL,rBX},
  7. /* uint16_t regs */
  8. {rSP},{rBP},{rSI},{rDI},
  9. /* seg regs */
  10. {rES},{rCS},{rSS},{rDS},
  11. /* uint8_t regs */
  12. {rAL},{rCL},{rDL},{rBL},
  13. {rAH},{rCH},{rDH},{rBH},
  14. /* tmp reg */
  15. {rTMP},{rTMP2},
  16. /* index regs */
  17. {rBX,rSI},{rBX,rDI},{rBP,rSI},{rBP,rDI},
  18. {rSI},{rDI},{rBP},{rBX}
  19. };
  20. LivenessSet &LivenessSet::setReg(int r)
  21. {
  22. this->reset();
  23. *this |= duReg[r];
  24. return *this;
  25. }
  26. LivenessSet &LivenessSet::clrReg(int r)
  27. {
  28. return *this -= duReg[r];
  29. }
  30. LivenessSet &LivenessSet::addReg(int r)
  31. {
  32. *this |= duReg[r];
  33. // postProcessCompositeRegs();
  34. return *this;
  35. }
  36. bool LivenessSet::testRegAndSubregs(int r) const
  37. {
  38. return (*this & duReg[r]).any();
  39. }
  40. void LivenessSet::postProcessCompositeRegs()
  41. {
  42. if(testReg(rAL) and testReg(rAH))
  43. registers.insert(rAX);
  44. if(testReg(rCL) and testReg(rCH))
  45. registers.insert(rCX);
  46. if(testReg(rDL) and testReg(rDH))
  47. registers.insert(rDX);
  48. if(testReg(rBL) and testReg(rBH))
  49. registers.insert(rBX);
  50. }