reg.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. typedef struct Reg Reg;
  2. typedef struct Rgn Rgn;
  3. typedef struct Bits Bits;
  4. typedef struct Var Var;
  5. #define BITS 5
  6. #define NVAR (BITS*sizeof(ulong)*8)
  7. struct Bits
  8. {
  9. ulong b[BITS];
  10. };
  11. struct Var
  12. {
  13. long offset;
  14. Sym* sym;
  15. char type;
  16. char etype;
  17. };
  18. struct Reg
  19. {
  20. long pc;
  21. Bits set;
  22. Bits use1;
  23. Bits use2;
  24. Bits refbehind;
  25. Bits refahead;
  26. Bits calbehind;
  27. Bits calahead;
  28. Bits regdiff;
  29. Bits act;
  30. ulong regu;
  31. long loop; /* could be shorter */
  32. union
  33. {
  34. Reg* log5;
  35. int active;
  36. };
  37. Reg* p1;
  38. Reg* p2;
  39. Reg* p2link;
  40. Reg* s1;
  41. Reg* s2;
  42. Reg* link;
  43. Prog* prog;
  44. };
  45. #define R ((Reg*)0)
  46. struct Rgn
  47. {
  48. Reg* enter;
  49. short costr;
  50. short costa;
  51. short varno;
  52. short regno;
  53. };
  54. #define BLOAD(r) band(bnot(r->refbehind), r->refahead)
  55. #define BSTORE(r) band(bnot(r->calbehind), r->calahead)
  56. #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z])
  57. #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z])
  58. #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32))
  59. #define CLOAD 8
  60. #define CREF 5
  61. #define CTEST 2
  62. #define CXREF 3
  63. #define CINF 1000
  64. #define LOOP 3
  65. Bits externs;
  66. Bits params;
  67. Bits addrs;
  68. Bits zbits;
  69. ulong regbits;
  70. #define B_INDIR (1<<0)
  71. #define B_ADDR (1<<1)
  72. int mvbits;
  73. int changer;
  74. int changea;
  75. Reg* firstr;
  76. Reg* lastr;
  77. Reg zreg;
  78. Reg* freer;
  79. Rgn region[NRGN];
  80. Rgn* rgp;
  81. Var var[NVAR];
  82. void peep(void);
  83. void excise(Reg*);
  84. Reg* uniqp(Reg*);
  85. Reg* uniqs(Reg*);
  86. int findtst(Reg*, Prog*, int);
  87. int setcc(Prog*, Prog*);
  88. int compat(Adr*, Adr*);
  89. int aregind(Adr*);
  90. int asize(int);
  91. int usedin(int, Adr*);
  92. Reg* findccr(Reg*);
  93. int setccr(Prog*);
  94. Reg* findop(Reg*, int, int, int);
  95. int regtyp(int);
  96. int anyvar(Adr*);
  97. int subprop(Reg*);
  98. int copyprop(Reg*);
  99. int copy1(Adr*, Adr*, Reg*, int);
  100. int copyu(Prog*, Adr*, Adr*);
  101. int copyas(Adr*, Adr*);
  102. int tasas(Adr*, Adr*);
  103. int copyau(Adr*, Adr*);
  104. int copysub(Adr*, Adr*, Adr*, Prog*, int);
  105. ulong RtoB(int);
  106. ulong AtoB(int);
  107. ulong FtoB(int);
  108. int BtoR(ulong);
  109. int BtoA(ulong);
  110. int BtoF(ulong);
  111. Reg* rega(void);
  112. int rcmp(void*, void*);
  113. void regopt(Prog*);
  114. void addmove(Reg*, int, int, int);
  115. Bits mkvar(Adr*, int);
  116. void prop(Reg*, Bits, Bits);
  117. int loopit(Reg*);
  118. void synch(Reg*, Bits);
  119. ulong allreg(ulong, Rgn*);
  120. void paint1(Reg*, int);
  121. ulong paint2(Reg*, int);
  122. void paint3(Reg*, int, ulong, int);
  123. void addreg(Adr*, int);
  124. /*
  125. * bits.c
  126. */
  127. Bits bor(Bits, Bits);
  128. Bits band(Bits, Bits);
  129. Bits bnot(Bits);
  130. int bany(Bits*);
  131. int bnum(Bits);
  132. Bits blsh(int);
  133. int beq(Bits, Bits);