mach.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*
  2. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. * See the copyright notice in the ACK home directory, in the file "Copyright".
  4. *
  5. */
  6. #include <stdlib.h>
  7. #include <limits.h>
  8. #ifndef NORCSID
  9. static char rcsid[]= "$Id$" ;
  10. #endif
  11. int framesize;
  12. /*
  13. * machine dependent back end routines for the Zilog Z80.
  14. */
  15. con_part(int sz, word w)
  16. {
  17. while (part_size % sz)
  18. part_size++;
  19. if (part_size == TEM_WSIZE)
  20. part_flush();
  21. if (sz == 1) {
  22. w &= 0xFF;
  23. w <<= 8*(3-part_size);
  24. part_word |= w;
  25. } else if (sz == 2) {
  26. w &= 0xFFFF;
  27. if (part_size == 0) {
  28. /* Shift 8 for m68k2, 16 otherwise */
  29. w <<= 4 * TEM_WSIZE;
  30. }
  31. part_word |= w;
  32. } else {
  33. assert(sz == TEM_WSIZE);
  34. part_word = w;
  35. }
  36. part_size += sz;
  37. }
  38. con_mult(word sz)
  39. {
  40. if (argval != 4)
  41. fatal("bad icon/ucon size");
  42. fprintf(codefile,".data4 %s\n", str);
  43. }
  44. #define CODE_GENERATOR
  45. #define IEEEFLOAT
  46. #define FL_MSL_AT_LOW_ADDRESS 1
  47. #define FL_MSW_AT_LOW_ADDRESS 1
  48. #define FL_MSB_AT_LOW_ADDRESS 1
  49. #include <con_float>
  50. prolog(full nlocals)
  51. {
  52. int ss = nlocals + 8;
  53. fprintf(codefile, "addi sp, sp, %d\n", -ss);
  54. fprintf(codefile, "stw fp, %d(sp)\n", nlocals);
  55. fprintf(codefile, "mfspr r0, lr\n"
  56. "stw r0, %d(sp)\n", nlocals+4);
  57. fprintf(codefile, "addi fp, sp, %d\n", nlocals);
  58. framesize = nlocals;
  59. }
  60. mes(word type)
  61. {
  62. int argt ;
  63. switch ( (int)type ) {
  64. case ms_ext :
  65. for (;;) {
  66. switch ( argt=getarg(
  67. ptyp(sp_cend)|ptyp(sp_pnam)|sym_ptyp) ) {
  68. case sp_cend :
  69. return ;
  70. default:
  71. strarg(argt) ;
  72. fprintf(codefile,".define %s\n",argstr) ;
  73. break ;
  74. }
  75. }
  76. default :
  77. while ( getarg(any_ptyp) != sp_cend ) ;
  78. break ;
  79. }
  80. }
  81. char *segname[] = {
  82. ".sect .text",
  83. ".sect .data",
  84. ".sect .rom",
  85. ".sect .bss"
  86. };
  87. #ifdef REGVARS
  88. static int savedregsi[32];
  89. static int numsaved;
  90. /* Initialise regvar system for one function. */
  91. i_regsave()
  92. {
  93. int i;
  94. fprintf(codefile, "! i_regsave()\n");
  95. for (i=0; i<32; i++)
  96. savedregsi[i] = INT_MAX;
  97. numsaved = 0;
  98. }
  99. /* Mark a register as being saved. */
  100. regsave(const char* regname, full offset, int size)
  101. {
  102. int regnum = atoi(regname+1);
  103. savedregsi[regnum] = offset;
  104. numsaved++;
  105. fprintf(codefile, "! %d is saved in %s\n", offset, regname);
  106. #if 0
  107. fprintf(codefile, "stwu %s, -4(sp)\n", regname);
  108. if (offset >= 0)
  109. fprintf(codefile, "lwz %s, %d(fp)\n", regname, offset);
  110. #endif
  111. }
  112. /* Finish saving ragisters. */
  113. void saveloadregs(const char* ops, const char* opm)
  114. {
  115. int offset = -(framesize + numsaved*4);
  116. int reg = 32;
  117. /* Check for the possibility of a multiple. */
  118. do
  119. {
  120. reg--;
  121. }
  122. while ((reg > 0) && (savedregsi[reg] != INT_MAX));
  123. if (reg < 31)
  124. {
  125. fprintf(codefile, "%s r%d, %d(fp)\n", opm, reg+1, offset);
  126. offset += (31-reg)*4;
  127. }
  128. /* Saved everything else singly. */
  129. while (reg > 0)
  130. {
  131. if (savedregsi[reg] != INT_MAX)
  132. {
  133. fprintf(codefile, "%s r%d, %d(fp)\n", ops, reg, offset);
  134. offset += 4;
  135. }
  136. reg--;
  137. }
  138. }
  139. f_regsave()
  140. {
  141. int i;
  142. fprintf(codefile, "! f_regsave()\n");
  143. fprintf(codefile, "addi sp, sp, %d\n", -numsaved*4);
  144. saveloadregs("stw", "stmw");
  145. for (i=0; i<32; i++)
  146. if ((savedregsi[i] != INT_MAX) && (savedregsi[i] > 0))
  147. fprintf(codefile, "lwz r%d, %d(fp)\n", i, savedregsi[i]);
  148. }
  149. /* Restore all saved registers. */
  150. regreturn()
  151. {
  152. fprintf(codefile, "! regreturn()\n");
  153. saveloadregs("lwz", "lmw");
  154. }
  155. /* Calculate the score of a given register. */
  156. int regscore(full offset, int size, int type, int frequency, int totype)
  157. {
  158. int score;
  159. fprintf(codefile, "! regscore(%ld, %d, %d, %d, %d)\n", offset, size, type, frequency, totype);
  160. if (size != 4)
  161. return -1;
  162. /* Per use: 6 bytes (on average)
  163. * Overhead in prologue: 4 bytes, plus 4 if a parameter
  164. * Overhead in epilogue: 0 bytes
  165. */
  166. score = frequency*6 - 4 - ((offset>=0) ? 4 : 0);
  167. fprintf(codefile, "! local at offset %d has regvar score %d\n", offset, score);
  168. return score;
  169. }
  170. #endif