table 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* sparc desciptor table for ACK target optimizer */
  2. MAXOP 3;
  3. OPC_TERMINATOR '\t';
  4. %%;
  5. /* useful addressing modes-> */
  6. NUM,NUM1,NUM2 {is_number(VAL) };
  7. REG {VAL[0] == '%' };
  8. A,B,X,Y,Z {TRUE };
  9. REG_NO_O7 {VAL[0] == '%' && (VAL[1] != 'o' || VAL[2] != '7')};
  10. NO_O7 {no_o7(VAL) };
  11. %%;
  12. /* optimization patterns-> */
  13. /* tricky because we cannot optimize an instruction that lives in a delay slot */
  14. /* usage of delay slot: */
  15. ANY X,Y,Z : st REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
  16. -> ANY X,Y,Z : call A : st REG_NO_O7,NO_O7 ;
  17. ANY X,Y : st REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
  18. -> ANY X,Y : call A : st REG_NO_O7,NO_O7 ;
  19. ANY X : st REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
  20. -> ANY X : call A : st REG_NO_O7,NO_O7 ;
  21. ANY X,Y,Z : mov REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
  22. -> ANY X,Y,Z : call A : mov REG_NO_O7,NO_O7 ;
  23. ANY X,Y : mov REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
  24. -> ANY X,Y : call A : mov REG_NO_O7,NO_O7 ;
  25. ANY X : mov REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
  26. -> ANY X : call A : mov REG_NO_O7,NO_O7 ;
  27. ANY X,Y,Z : st REG,B : b A : nop {no_delay(ANY)}
  28. -> ANY X,Y,Z : b A : st REG,B ;
  29. ANY X,Y : st REG,B : b A : nop {no_delay(ANY)}
  30. -> ANY X,Y : b A : st REG,B ;
  31. ANY X : st REG,B : b A : nop {no_delay(ANY)}
  32. -> ANY X : b A : st REG,B ;
  33. /* inc/dec: */
  34. ANY X,Y,Z : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
  35. -> ANY X,Y,Z ;
  36. ANY X,Y : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
  37. -> ANY X,Y ;
  38. ANY X : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
  39. -> ANY X ;
  40. ANY X,Y,Z : inc 0,REG {no_delay(ANY)} -> ANY X,Y,Z ;
  41. ANY X,Y : inc 0,REG {no_delay(ANY)} -> ANY X,Y ;
  42. ANY X : inc 0,REG {no_delay(ANY)} -> ANY X ;
  43. ANY X,Y,Z : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
  44. -> ANY X,Y,Z : inc NUM2,REG ;
  45. ANY X,Y : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
  46. -> ANY X,Y : inc NUM2,REG ;
  47. ANY X : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
  48. -> ANY X : inc NUM2,REG ;
  49. ANY X,Y,Z : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
  50. -> ANY X,Y,Z : dec NUM2,REG ;
  51. ANY X,Y : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
  52. -> ANY X,Y : dec NUM2,REG ;
  53. ANY X : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
  54. -> ANY X : dec NUM2,REG ;
  55. /* misc: */
  56. ANY X,Y,Z : ld A,REG : ld A,REG1 {no_delay(ANY)}
  57. -> ANY X,Y,Z : ld A,REG : mov REG,REG1 ;
  58. ANY X,Y : ld A,REG : ld A,REG1 {no_delay(ANY)}
  59. -> ANY X,Y : ld A,REG : mov REG,REG1 ;
  60. ANY X : ld A,REG : ld A,REG1 {no_delay(ANY)}
  61. -> ANY X : ld A,REG : mov REG,REG1 ;
  62. ANY X,Y,Z : st REG,A : ld A,REG1 {no_delay(ANY)}
  63. -> ANY X,Y,Z : st REG,A : mov REG,REG1 ;
  64. ANY X,Y : st REG,A : ld A,REG1 {no_delay(ANY)}
  65. -> ANY X,Y : st REG,A : mov REG,REG1 ;
  66. ANY X : st REG,A : ld A,REG1 {no_delay(ANY)}
  67. -> ANY X : st REG,A : mov REG,REG1 ;
  68. %%;
  69. /* auxiliary routines: */
  70. int is_number(s)
  71. register char *s;
  72. {
  73. while (*s != '\0') {
  74. if (*s < '0' || *s++ > '9') return FALSE;
  75. }
  76. return TRUE;
  77. }
  78. int bigger(s,s1,s2)
  79. char *s,*s1,*s2;
  80. {
  81. int n = atoi(s),n1 = atoi(s1);
  82. if (n >= n1) {
  83. sprintf(s2,"%d",n-n1);
  84. return TRUE;
  85. }
  86. return FALSE;
  87. }
  88. int smaller(s,s1,s2)
  89. char *s,*s1,*s2;
  90. {
  91. int n = atoi(s),n1 = atoi(s1);
  92. if (n < n1) {
  93. sprintf(s2,"%d",n1-n);
  94. return TRUE;
  95. }
  96. return FALSE;
  97. }
  98. int no_delay(s)
  99. char *s;
  100. {
  101. return s[0] != 'b' && s[0] != 'j' && s[0] != 'r' &&
  102. s[1] != 'b' && s[0] != 'c';
  103. }
  104. int no_o7(s)
  105. char *s;
  106. {
  107. for (;;) {
  108. while (*s && *s != '%') s++;
  109. if (*s) {
  110. if (*++s == 'o') {
  111. if (*++s == '7') return FALSE;
  112. }
  113. }
  114. else break;
  115. }
  116. return TRUE;
  117. }