optab.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "l.h"
  2. Optab optab[] =
  3. {
  4. /* add */ AADD, C_REG, C_REG, 0,1, 4, OOP, 0, 0,
  5. /* sub */ ASUB, C_REG, C_REG, 0,5, 4, OOP, 0, 0x20,
  6. /* sll */ ASLL, C_REG, C_REG, 0,0, 4, OOP, 1, 0,
  7. /* slt */ ASLT, C_REG, C_REG, 0,0, 4, OOP, 2, 0,
  8. /* sltu */ ASLTU, C_REG, C_REG, 0,0, 4, OOP, 3, 0,
  9. /* xor */ AXOR, C_REG, C_REG, 0,5, 4, OOP, 4, 0,
  10. /* srl */ ASRL, C_REG, C_REG, 0,0, 4, OOP, 5, 0,
  11. /* sra */ ASRA, C_REG, C_REG, 0,0, 4, OOP, 5, 0x20,
  12. /* or */ AOR, C_REG, C_REG, 0,5, 4, OOP, 6, 0,
  13. /* and */ AAND, C_REG, C_REG, 0,5, 4, OOP, 7, 0,
  14. /* mul */ AMUL, C_REG, C_REG, 0,0, 4, OOP, 0, 0x01,
  15. /* mulh */ AMULH, C_REG, C_REG, 0,0, 4, OOP, 1, 0x01,
  16. /* mulhsu */ AMULHSU, C_REG, C_REG, 0,0, 4, OOP, 2, 0x01,
  17. /* mulhu */ AMULHU, C_REG, C_REG, 0,0, 4, OOP, 3, 0x01,
  18. /* div */ ADIV, C_REG, C_REG, 0,0, 4, OOP, 4, 0x01,
  19. /* divu */ ADIVU, C_REG, C_REG, 0,0, 4, OOP, 5, 0x01,
  20. /* rem */ AREM, C_REG, C_REG, 0,0, 4, OOP, 6, 0x01,
  21. /* remu */ AREMU, C_REG, C_REG, 0,0, 4, OOP, 7, 0x01,
  22. /* addw */ AADDW, C_REG, C_REG, 0,22, 4, OOP_32, 0, 0,
  23. /* subw */ ASUBW, C_REG, C_REG, 0,22, 4, OOP_32, 0, 0x20,
  24. /* sllw */ ASLLW, C_REG, C_REG, 0,0, 4, OOP_32, 1, 0,
  25. /* srlw */ ASRLW, C_REG, C_REG, 0,0, 4, OOP_32, 5, 0,
  26. /* sraw */ ASRAW, C_REG, C_REG, 0,0, 4, OOP_32, 5, 0x20,
  27. /* mulw */ AMULW, C_REG, C_REG, 0,0, 4, OOP_32, 0, 0x01,
  28. /* divw */ ADIVW, C_REG, C_REG, 0,0, 4, OOP_32, 4, 0x01,
  29. /* divuw */ ADIVUW, C_REG, C_REG, 0,0, 4, OOP_32, 5, 0x01,
  30. /* remw */ AREMW, C_REG, C_REG, 0,0, 4, OOP_32, 6, 0x01,
  31. /* remuw */ AREMUW, C_REG, C_REG, 0,0, 4, OOP_32, 7, 0x01,
  32. /* slli */ ASLL, C_SCON, C_REG, 1,8, 4, OOP_IMM, 1, 0,
  33. /* srli */ ASRL, C_SCON, C_REG, 1,9, 4, OOP_IMM, 5, 0,
  34. /* srai */ ASRA, C_SCON, C_REG, 1,9, 4, OOP_IMM, 5, 0x20,
  35. /* addi */ AADD, C_SCON, C_REG, 2,10, 4, OOP_IMM, 0, 0,
  36. /* slti */ ASLT, C_SCON, C_REG, 2,0, 4, OOP_IMM, 2, 0,
  37. /* sltiu */ ASLTU, C_SCON, C_REG, 2,0, 4, OOP_IMM, 3, 0,
  38. /* xori */ AXOR, C_SCON, C_REG, 2,0, 4, OOP_IMM, 4, 0,
  39. /* ori */ AOR, C_SCON, C_REG, 2,0, 4, OOP_IMM, 6, 0,
  40. /* andi */ AAND, C_SCON, C_REG, 2,13, 4, OOP_IMM, 7, 0,
  41. /* addiw */ AADDW, C_SCON, C_REG, 2,23, 4, OOP_IMM_32, 0, 0,
  42. /* slliw */ ASLLW, C_SCON, C_REG, 2,0, 4, OOP_IMM_32, 1, 0,
  43. /* srliw */ ASRLW, C_SCON, C_REG, 2,0, 4, OOP_IMM_32, 5, 0,
  44. /* sraiw */ ASRAW, C_SCON, C_REG, 2,0, 4, OOP_IMM_32, 5, 0x20,
  45. /* beq */ ABEQ, C_REG, C_SBRA, 3,14, 4, OBRANCH, 0, 0,
  46. /* bne */ ABNE, C_REG, C_SBRA, 3,15, 4, OBRANCH, 1, 0,
  47. /* blt */ ABLT, C_REG, C_SBRA, 3,0, 4, OBRANCH, 4, 0,
  48. /* bge */ ABGE, C_REG, C_SBRA, 3,0, 4, OBRANCH, 5, 0,
  49. /* bltu */ ABLTU, C_REG, C_SBRA, 3,0, 4, OBRANCH, 6, 0,
  50. /* bgeu */ ABGEU, C_REG, C_SBRA, 3,0, 4, OBRANCH, 7, 0,
  51. /* jal */ AJAL, C_NONE, C_SBRA, 4,11, 4, OJAL, 0, REGLINK,
  52. /* jal */ AJMP, C_NONE, C_SBRA, 4,12, 4, OJAL, 0, REGZERO,
  53. /* jal */ AJAL, C_NONE, C_LBRA, 18,0, 8, OJALR, 0, REGLINK,
  54. /* jal */ AJMP, C_NONE, C_LBRA, 18,0, 8, OJALR, 0, REGZERO,
  55. /* jalr */ AJAL, C_NONE, C_SOREG, 5,3, 4, OJALR, 0, REGLINK,
  56. /* jalr */ AJMP, C_NONE, C_SOREG, 5,4, 4, OJALR, 0, REGZERO,
  57. /* sb */ AMOVB, C_ZREG, C_SOREG, 6,0, 4, OSTORE, 0, 0,
  58. /* sb */ AMOVBU, C_ZREG, C_SOREG, 6,0, 4, OSTORE, 0, 0,
  59. /* sh */ AMOVH, C_ZREG, C_SOREG, 6,0, 4, OSTORE, 1, 0,
  60. /* sw */ AMOVW, C_ZREG, C_SOREG, 6,19, 4, OSTORE, 2, 0,
  61. /* sd */ AMOV, C_ZREG, C_SOREG, 6,25, 4, OSTORE, 3, 0,
  62. /* fsw */ AMOVF, C_FREG, C_SOREG, 6,20, 4, OSTORE_FP, 2, 0,
  63. /* fsd */ AMOVD, C_FREG, C_SOREG, 6,21, 4, OSTORE_FP, 3, 0,
  64. /* sb */ AMOVB, C_ZREG, C_LEXT, 12,0, 8, OSTORE, 0, 0,
  65. /* sb */ AMOVBU, C_ZREG, C_LEXT, 12,0, 8, OSTORE, 0, 0,
  66. /* sh */ AMOVH, C_ZREG, C_LEXT, 12,0, 8, OSTORE, 1, 0,
  67. /* sw */ AMOVW, C_ZREG, C_LEXT, 12,0, 8, OSTORE, 2, 0,
  68. /* sd */ AMOV, C_ZREG, C_LEXT, 12,0, 8, OSTORE, 3, 0,
  69. /* fsw */ AMOVF, C_FREG, C_LEXT, 12,0, 8, OSTORE_FP, 2, 0,
  70. /* fsd */ AMOVD, C_FREG, C_LEXT, 12,0, 8, OSTORE_FP, 3, 0,
  71. /* sb */ AMOVB, C_ZREG, C_LOREG, 15,0, 12, OSTORE, 0, 0,
  72. /* sb */ AMOVBU, C_ZREG, C_LOREG, 15,0, 12, OSTORE, 0, 0,
  73. /* sh */ AMOVH, C_ZREG, C_LOREG, 15,0, 12, OSTORE, 1, 0,
  74. /* sw */ AMOVW, C_ZREG, C_LOREG, 15,0, 12, OSTORE, 2, 0,
  75. /* sd */ AMOV, C_ZREG, C_LOREG, 15,0, 12, OSTORE, 3, 0,
  76. /* fsw */ AMOVF, C_FREG, C_LOREG, 15,0, 12, OSTORE_FP, 2, 0,
  77. /* fsd */ AMOVD, C_FREG, C_LOREG, 15,0, 12, OSTORE_FP, 3, 0,
  78. /* lb */ AMOVB, C_SOREG, C_REG, 7,0, 4, OLOAD, 0, 0,
  79. /* lh */ AMOVH, C_SOREG, C_REG, 7,0, 4, OLOAD, 1, 0,
  80. /* lw */ AMOVW, C_SOREG, C_REG, 7,16, 4, OLOAD, 2, 0,
  81. /* ld */ AMOV, C_SOREG, C_REG, 7,24, 4, OLOAD, 3, 0,
  82. /* lbu */ AMOVBU, C_SOREG, C_REG, 7,0, 4, OLOAD, 4, 0,
  83. /* lhu */ AMOVHU, C_SOREG, C_REG, 7,0, 4, OLOAD, 5, 0,
  84. /* lwu */ AMOVWU, C_SOREG, C_REG, 7,0, 4, OLOAD, 6, 0,
  85. /* flw */ AMOVF, C_SOREG, C_FREG, 7,17, 4, OLOAD_FP, 2, 0,
  86. /* fld */ AMOVD, C_SOREG, C_FREG, 7,18, 4, OLOAD_FP, 3, 0,
  87. /* lui */ AMOV, C_UCON, C_REG, 8,7, 4, OLUI, 0, 0,
  88. /* lb */ AMOVB, C_LEXT, C_REG, 13,0, 8, OLOAD, 0, 0,
  89. /* lh */ AMOVH, C_LEXT, C_REG, 13,0, 8, OLOAD, 1, 0,
  90. /* lw */ AMOVW, C_LEXT, C_REG, 13,0, 8, OLOAD, 2, 0,
  91. /* ld */ AMOV, C_LEXT, C_REG, 13,0, 8, OLOAD, 3, 0,
  92. /* lbu */ AMOVBU, C_LEXT, C_REG, 13,0, 8, OLOAD, 4, 0,
  93. /* lhu */ AMOVHU, C_LEXT, C_REG, 13,0, 8, OLOAD, 5, 0,
  94. /* lwu */ AMOVWU, C_LEXT, C_REG, 13,0, 8, OLOAD, 6, 0,
  95. /* flw */ AMOVF, C_LEXT, C_FREG, 13,0, 8, OLOAD_FP, 2, 0,
  96. /* fld */ AMOVD, C_LEXT, C_FREG, 13,0, 8, OLOAD_FP, 3, 0,
  97. /* lb */ AMOVB, C_LOREG, C_REG, 16,0, 12, OLOAD, 0, 0,
  98. /* lh */ AMOVH, C_LOREG, C_REG, 16,0, 12, OLOAD, 1, 0,
  99. /* lw */ AMOVW, C_LOREG, C_REG, 16,0, 12, OLOAD, 2, 0,
  100. /* ld */ AMOV, C_LOREG, C_REG, 16,0, 12, OLOAD, 3, 0,
  101. /* lbu */ AMOVBU, C_LOREG, C_REG, 16,0, 12, OLOAD, 4, 0,
  102. /* lhu */ AMOVHU, C_LOREG, C_REG, 16,0, 12, OLOAD, 5, 0,
  103. /* lwu */ AMOVWU, C_LOREG, C_REG, 16,0, 12, OLOAD, 6, 0,
  104. /* flw */ AMOVF, C_LOREG, C_FREG, 16,0, 12, OLOAD_FP, 2, 0,
  105. /* fld */ AMOVD, C_LOREG, C_FREG, 16,0, 12, OLOAD_FP, 3, 0,
  106. /* addi */ AMOVW, C_SCON, C_REG, 11,6, 4, OOP_IMM, 0, 0,
  107. /* addi */ AMOVW, C_SECON, C_REG, 11,0, 4, OOP_IMM, 0, 0,
  108. /* addi */ AMOVW, C_SACON, C_REG, 11,0, 4, OOP_IMM, 0, 0,
  109. /* lui,addi */ AMOVW, C_LCON, C_REG, 9,0, 8, OOP_IMM, 0, 0,
  110. /* lui,addi */ AMOVW, C_LECON, C_REG, 9,0, 8, OOP_IMM, 0, 0,
  111. /* ",",add */ AMOVW, C_LACON, C_REG, 14,0, 12, OOP_IMM, 0, 0,
  112. /* add */ AMOV, C_REG, C_REG, 0,2, 4, OOP, 0, 0,
  113. /* addi */ AMOV, C_SCON, C_REG, 11,6, 4, OOP_IMM, 0, 0,
  114. /* addi */ AMOV, C_SECON, C_REG, 11,0, 4, OOP_IMM, 0, 0,
  115. /* addi */ AMOV, C_SACON, C_REG, 11,0, 4, OOP_IMM, 0, 0,
  116. /* lui,addi */ AMOV, C_LCON, C_REG, 9,0, 8, OOP_IMM, 0, 0,
  117. /* lui,addi */ AMOV, C_LECON, C_REG, 20,0, 8, OOP_IMM, 0, 0,
  118. /* lui,s[rl]ai */ AMOV, C_VCON, C_REG, 21,0, 8, OOP_IMM, 5, 0x20,
  119. /* ",",add */ AMOV, C_LACON, C_REG, 14,0, 12, OOP_IMM, 0, 0,
  120. /* ",",add */ AADD, C_LCON, C_REG, 14,0, 12, OOP_IMM, 0, 0,
  121. /* ",",and */ AAND, C_LCON, C_REG, 14,0, 12, OOP_IMM, 7, 0,
  122. /* ",",or */ AOR, C_LCON, C_REG, 14,0, 12, OOP_IMM, 6, 0,
  123. /* ",",xor */ AXOR, C_LCON, C_REG, 14,0, 12, OOP_IMM, 4, 0,
  124. /* addiw */ AMOVW, C_REG, C_REG, 19,23, 4, OOP_IMM_32, 0, 0,
  125. /* andi */ AMOVBU, C_ZREG, C_REG, 10,0, 4, OOP_IMM, 7, 0xFF,
  126. /* slli,srli */ AMOVHU, C_ZREG, C_REG, 10,0, 8, OOP_IMM, 5, 16,
  127. /* slli,srli */ AMOVWU, C_ZREG, C_REG, 10,0, 8, OOP_IMM, 5, 0,
  128. /* slli,srai */ AMOVB, C_ZREG, C_REG, 10,0, 8, OOP_IMM, 5, 24+(0x20<<5),
  129. /* slli,srai */ AMOVH, C_ZREG, C_REG, 10,0, 8, OOP_IMM, 5, 16+(0x20<<5),
  130. ASYS, C_NONE, C_SCON, 24,0, 4, OSYSTEM, 0, 0,
  131. ACSRRW, C_CTLREG, C_REG, 22,0, 4, OSYSTEM, 1, 0,
  132. ACSRRS, C_CTLREG, C_REG, 22,0, 4, OSYSTEM, 2, 0,
  133. ACSRRC, C_CTLREG, C_REG, 22,0, 4, OSYSTEM, 3, 0,
  134. ACSRRWI, C_CTLREG, C_REG, 22,0, 4, OSYSTEM, 5, 0,
  135. ACSRRSI, C_CTLREG, C_REG, 22,0, 4, OSYSTEM, 6, 0,
  136. ACSRRCI, C_CTLREG, C_REG, 22,0, 4, OSYSTEM, 7, 0,
  137. AADDF, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x7, 0x00,
  138. ASUBF, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x7, 0x04,
  139. AMULF, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x7, 0x08,
  140. ADIVF, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x7, 0x0c,
  141. AADDD, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x7, 0x01,
  142. ASUBD, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x7, 0x05,
  143. AMULD, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x7, 0x09,
  144. ADIVD, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x7, 0x0d,
  145. ACMPEQF, C_FREG, C_REG, 0,0, 4, OOP_FP, 0x2, 0x50,
  146. ACMPLEF, C_FREG, C_REG, 0,0, 4, OOP_FP, 0x0, 0x50,
  147. ACMPLTF, C_FREG, C_REG, 0,0, 4, OOP_FP, 0x1, 0x50,
  148. ACMPEQD, C_FREG, C_REG, 0,0, 4, OOP_FP, 0x2, 0x51,
  149. ACMPLED, C_FREG, C_REG, 0,0, 4, OOP_FP, 0x0, 0x51,
  150. ACMPLTD, C_FREG, C_REG, 0,0, 4, OOP_FP, 0x1, 0x51,
  151. /* float move */ AMOVF, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x0, 0x10,
  152. /* dbl move */ AMOVD, C_FREG, C_FREG, 0,0, 4, OOP_FP, 0x0, 0x11,
  153. /* float->dbl */ AMOVFD, C_FREG, C_FREG, 17,0, 4, OOP_FP, 0x0, 0x21,
  154. /* dbl->float */ AMOVDF, C_FREG, C_FREG, 17,0, 4, OOP_FP, 0x1, 0x20,
  155. /* float->int */ AMOVFW, C_FREG, C_REG, 17,0, 4, OOP_FP, 0x0, 0x60,
  156. /* dbl->int */ AMOVDW, C_FREG, C_REG, 17,0, 4, OOP_FP, 0x0, 0x61,
  157. /* int->float */ AMOVWF, C_REG, C_FREG, 17,0, 4, OOP_FP, 0x0, 0x68,
  158. /* uint->float */ AMOVUF, C_REG, C_FREG, 17,0, 4, OOP_FP, 0x1, 0x68,
  159. /* int->dbl */ AMOVWD, C_REG, C_FREG, 17,0, 4, OOP_FP, 0x0, 0x69,
  160. /* uint->dbl */ AMOVUD, C_REG, C_FREG, 17,0, 4, OOP_FP, 0x1, 0x69,
  161. /* float->vlong*/ AMOVFV, C_FREG, C_REG, 17,0, 4, OOP_FP, 0x2, 0x60,
  162. /* dbl->vlong */ AMOVDV, C_FREG, C_REG, 17,0, 4, OOP_FP, 0x2, 0x61,
  163. /* vlong->float*/ AMOVVF, C_REG, C_FREG, 17,0, 4, OOP_FP, 0x2, 0x68,
  164. /* uvlong->float*/ AMOVUVF, C_REG, C_FREG, 17,0, 4, OOP_FP, 0x3, 0x68,
  165. /* vlong->dbl */ AMOVVD, C_REG, C_FREG, 17,0, 4, OOP_FP, 0x2, 0x69,
  166. /* uvlong->dbl */ AMOVUVD, C_REG, C_FREG, 17,0, 4, OOP_FP, 0x3, 0x69,
  167. /* - */ AWORD, C_NONE, C_LCON, 25,0, 4, 0, 0, 0,
  168. /* - */ ATEXT, C_LEXT, C_LCON, 26,0, 0, 0, 0, 0,
  169. /* - */ AXXX, C_NONE, C_NONE, 0,0, 0, 0, 0, 0,
  170. };