home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / config / i386 / jit-icode.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  7KB  |  243 lines

  1. /* i386/jit-icode.h
  2.  * Define the instructions which are present on the i386.
  3.  *
  4.  * Copyright (c) 1996 Systems Architecture Research Centre,
  5.  *           City University, London, UK.
  6.  *
  7.  * See the file "license.terms" for information on usage and redistribution
  8.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  9.  *
  10.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, June 1996.
  11.  */
  12.  
  13. #ifndef __icode_h
  14. #define __icode_h
  15.  
  16. /*
  17.  * Refs and int/long registers are equivalent.
  18.  */
  19. #define    HAVE_ref_eq_int
  20. #undef    HAVE_ref_eq_long
  21.  
  22. /*
  23.  * These must be defined for any architecture.
  24.  */
  25. #define    HAVE_spill_int            spill_Rxx
  26. #define    HAVE_reload_int            reload_Rxx
  27. #define    HAVE_spill_float        fspill_Rxx
  28. #define    HAVE_reload_float        freload_Rxx
  29. #define    HAVE_spill_double        fspilll_Rxx
  30. #define    HAVE_reload_double        freloadl_Rxx
  31. #define    HAVE_prologue            prologue_xxx
  32. #define    HAVE_epilogue            epilogue_xxx
  33.  
  34. #define    HAVE_move_int_const        move_RxC
  35. #define    HAVE_move_int            move_RxR
  36. #define    HAVE_move_float_const        fmove_RxC
  37. #define    HAVE_move_float            fmove_RxR
  38. #define    HAVE_move_double_const        fmovel_RxC
  39. #define    HAVE_move_double        fmovel_RxR
  40. #define    HAVE_move_label_const        move_RxL
  41.  
  42. #define    HAVE_add_int            add_RRR
  43. #define    HAVE_sub_int            sub_RRR
  44. #define    HAVE_mul_int            mul_RRR
  45. #define    HAVE_div_int            div_RRR
  46. #define    HAVE_rem_int            rem_RRR
  47. #define    HAVE_and_int            and_RRR
  48. #define    HAVE_or_int            or_RRR
  49. #define    HAVE_xor_int            xor_RRR
  50. #define    HAVE_ashr_int            ashr_RRR
  51. #define    HAVE_lshr_int            lshr_RRR
  52. #define    HAVE_lshl_int            lshl_RRR
  53.  
  54. #define    HAVE_add_float            fadd_RRR
  55. #define    HAVE_sub_float            fsub_RRR
  56. #define    HAVE_mul_float            fmul_RRR
  57. #define    HAVE_div_float            fdiv_RRR
  58.  
  59. #define    HAVE_add_double            faddl_RRR
  60. #define    HAVE_sub_double            fsubl_RRR
  61. #define    HAVE_mul_double            fmull_RRR
  62. #define    HAVE_div_double            fdivl_RRR
  63.  
  64. #define    HAVE_load_int            load_RxR
  65. #define    HAVE_store_int            store_xRR
  66.  
  67. #define    HAVE_load_float            fload_RxR
  68. #define    HAVE_store_float        fstore_RxR
  69. #define    HAVE_load_double        floadl_RxR
  70. #define    HAVE_store_double        fstorel_RxR
  71.  
  72. #define    HAVE_pusharg_int        push_xxR
  73. #define    HAVE_pusharg_float        fpush_xxR
  74. #define    HAVE_pusharg_double        fpushl_xxR
  75. #define    HAVE_popargs            popargs_xxC
  76.  
  77. #define    HAVE_cmp_int            cmp_xRR
  78.  
  79. #define    HAVE_branch            branch_xCC
  80. #define    HAVE_branch_indirect        branch_indirect_xRC
  81. #define    HAVE_call_ref            call_xCC
  82. #define    HAVE_call            call_xRC
  83. #define    HAVE_ret            ret_xxx
  84. #define    HAVE_return_int            return_Rxx
  85. #define    HAVE_return_long        returnl_Rxx
  86. #define    HAVE_return_float        freturn_Rxx
  87. #define    HAVE_return_double        freturnl_Rxx
  88.  
  89. #define    HAVE_set_label            set_label_xxC
  90. #define    HAVE_build_key            set_word_xxC
  91. #define    HAVE_build_code_ref        set_wordpc_xxC
  92.  
  93. #define    HAVE_cvt_int_double        cvtid_RxR
  94. #define    HAVE_cvt_long_double        cvtld_RxR
  95. #define    HAVE_cvt_float_int        cvtfi_RxR
  96. #define    HAVE_cvt_double_int        cvtdi_RxR
  97. #define    HAVE_cvt_float_long        cvtfl_RxR
  98. #define    HAVE_cvt_double_long        cvtdl_RxR
  99. #define    HAVE_cvt_long_float        cvtlf_RxR
  100. #define    HAVE_cvt_int_float        cvtif_RxR
  101. #define    HAVE_cvt_float_double        cvtfd_RxR
  102. #define    HAVE_cvt_double_float        cvtdf_RxR
  103.  
  104. /*
  105.  * These are sometimes optional (if long operators are defined)
  106.  */
  107. #define    HAVE_adc_int            adc_RRR
  108. #define    HAVE_sbc_int            sbc_RRR
  109.  
  110. /*
  111.  * These are optional but help to optimise the code generated.
  112.  */
  113. #define    HAVE_add_int_const        add_RRC
  114. #define    HAVE_sub_int_const        sub_RRC
  115.  
  116. #define    HAVE_cmp_int_const        cmp_xRC
  117.  
  118. #define    HAVE_pusharg_int_const        push_xxC
  119.  
  120. #define    HAVE_load_int_addregconst    load_RRC
  121. #define    HAVE_store_int_addregconst    store_xRRC
  122.  
  123. #define    HAVE_load_byte            loadb_RxR
  124. #define    HAVE_load_char            loadc_RxR
  125. #define    HAVE_load_short            loads_RxR
  126. #define    HAVE_store_byte            storeb_xRR
  127. #define    HAVE_store_char            storeb_xRR    /* Same as byte */
  128. #define    HAVE_store_short        stores_xRR
  129. #define    HAVE_lshl_int_const        lshl_RRC
  130.  
  131. /*
  132.  * These are optional if the architecture supports them.
  133.  */
  134. #undef    HAVE_mul_int_const
  135. #undef    HAVE_swap_int
  136. #undef    HAVE_neg_int
  137. #undef    HAVE_and_int_const
  138. #undef    HAVE_ashr_int_const
  139. #undef    HAVE_lshr_int_const
  140.  
  141. #undef    HAVE_cmpg_float
  142. #undef    HAVE_cmpg_double
  143. #undef    HAVE_cmpl_float
  144. #undef    HAVE_cmpl_double
  145.  
  146. #undef    HAVE_move_long_const
  147. #undef    HAVE_move_long
  148.  
  149. #undef    HAVE_add_long
  150. #undef    HAVE_sub_long
  151. #undef    HAVE_mul_long
  152. #undef    HAVE_div_long
  153. #undef    HAVE_rem_long
  154. #undef    HAVE_neg_long
  155. #undef    HAVE_and_long
  156. #undef    HAVE_or_long
  157. #undef    HAVE_xor_long
  158. #undef    HAVE_ashr_long
  159. #undef    HAVE_lshl_long
  160. #undef    HAVE_lshr_long
  161.  
  162. #undef    HAVE_load_long
  163. #undef    HAVE_store_long
  164.  
  165. #undef    HAVE_pusharg_long
  166.  
  167. #undef    HAVE_cmp_long
  168.  
  169. #undef    HAVE_neg_float
  170. #undef    HAVE_neg_double
  171. #undef    HAVE_rem_float
  172. #undef    HAVE_rem_double
  173.  
  174. #undef    HAVE_cvt_int_long
  175. #undef    HAVE_cvt_int_byte
  176. #undef    HAVE_cvt_int_char
  177. #undef    HAVE_cvt_int_short
  178. #undef    HAVE_cvt_long_int
  179.  
  180. /*
  181.  * Change various branches into one branch type.
  182.  */
  183. #define    branch_a(l)    branch(l, ba)
  184. #define    branch_eq(l)    branch(l, beq)
  185. #define    branch_ne(l)    branch(l, bne)
  186. #define    branch_lt(l)    branch(l, blt)
  187. #define    branch_le(l)    branch(l, ble)
  188. #define    branch_gt(l)    branch(l, bgt)
  189. #define    branch_ge(l)    branch(l, bge)
  190.  
  191. /*
  192.  * These are for handling unknown types.
  193.  */
  194. #define    move_any            move_int
  195. #define    move_anylong            move_long
  196. #define    pusharg_any            pusharg_int
  197. #define    pusharg_anylong            pusharg_long
  198. #define    load_any            load_int
  199. #define    load_anylong            load_long
  200. #define    store_any            store_int
  201. #define    store_anylong            store_long
  202.  
  203. /*
  204.  * These are architecture specific.
  205.  * References may be int's or long's depending on the machine.
  206.  */
  207. #if defined(HAVE_ref_eq_int)
  208. #define    move_ref_const            move_int_const
  209. #define    move_ref            move_int
  210. #define    load_ref            load_int
  211. #define    store_ref            store_int
  212. #define    pusharg_ref            pusharg_int
  213. #define    pusharg_ref_const        pusharg_int_const
  214. #define    add_ref_const            add_int_const
  215. #define    add_ref                add_int
  216. #define    cmp_ref_const            cmp_int_const
  217. #define    cmp_ref                cmp_int
  218. #define    return_ref            return_int
  219. #elif defined(HAVE_ref_eq_long)
  220. #define    move_ref_const            move_long_const
  221. #define    move_ref            move_long
  222. #define    load_ref            load_long
  223. #define    store_ref            store_long
  224. #define    pusharg_ref            pusharg_long
  225. #define    pusharg_ref_const        pusharg_long_const
  226. #define    add_ref_const            add_long_const
  227. #define    add_ref                add_long
  228. #define    cmp_ref_const            cmp_long_const
  229. #define    cmp_ref                cmp_long
  230. #define    return_ref            return_long
  231. #endif
  232.  
  233. /*
  234.  * These are always the same.
  235.  */
  236. #define    returnarg_int()            (&returninfo[returnInt])
  237. #define    returnarg_long()        (&returninfo[returnLong])
  238. #define    returnarg_float()        (&returninfo[returnFloat])
  239. #define    returnarg_double()        (&returninfo[returnDouble])
  240. #define    returnarg_ref()            (&returninfo[returnRef])
  241.  
  242. #endif
  243.