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

  1. /*
  2.  * code.h
  3.  * Define the instruction codes macros.
  4.  *
  5.  * Copyright (c) 1996 Systems Architecture Research Centre,
  6.  *                 City University, London, UK.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, May 1996.
  12.  */
  13.  
  14. #ifndef __code_h
  15. #define    __code_h
  16.  
  17. #include "config.h"
  18.  
  19. #if defined(HAVE_REMAINDER)
  20. #elif defined(HAVE_FMOD)
  21. #define    remainder fmod
  22. #else
  23. #error "Need some form of remainder"
  24. #endif
  25. #if !defined(HAVE_REMAINDERF)
  26. #define    remainderf(a, b) (float)remainder((double)a, (double)b)
  27. #endif
  28.  
  29.  
  30. /*
  31.  * Some compilers do not have internal support for 64bit integers
  32.  */
  33. #if defined(HAVE_NATIVE_INT64)
  34.  
  35. #define    move_long_const(t, c)            (t)[0].v.tlong = (c)
  36. #define    add_long(t, f1, f2)            (t)[0].v.tlong = (f1)[0].v.tlong + (f2)[0].v.tlong
  37. #define    sub_long(t, f1, f2)            (t)[0].v.tlong = (f1)[0].v.tlong - (f2)[0].v.tlong
  38. #define    mul_long(t, f1, f2)            (t)[0].v.tlong = (f1)[0].v.tlong * (f2)[0].v.tlong
  39. #define    div_long(t, f1, f2)            (t)[0].v.tlong = (f1)[0].v.tlong / (f2)[0].v.tlong
  40. #define    rem_long(t, f1, f2)            (t)[0].v.tlong = (f1)[0].v.tlong % (f2)[0].v.tlong
  41. #define    neg_long(t, f)                (t)[0].v.tlong = -(f)[0].v.tlong
  42.  
  43. #define    and_long(t, f1, f2)            (t)[0].v.tlong = (f1)[0].v.tlong & (f2)[0].v.tlong
  44. #define    or_long(t, f1, f2)            (t)[0].v.tlong = (f1)[0].v.tlong | (f2)[0].v.tlong
  45. #define    xor_long(t, f1, f2)            (t)[0].v.tlong = (f1)[0].v.tlong ^ (f2)[0].v.tlong
  46.  
  47. #define    lshl_long(t, f1, f2)            (t)[0].v.tlong = ((f1)[0].v.tlong) << ((f2)[0].v.tint & 63)
  48. #define    ashr_long(t, f1, f2)            (t)[0].v.tlong = ((int64)(f1)[0].v.tlong) >> ((f2)[0].v.tint & 63)
  49. #define    lshr_long(t, f1, f2)            (t)[0].v.tlong = ((uint64)(f1)[0].v.tlong) >> ((f2)[0].v.tint & 63)
  50.  
  51. #define    cmp_long(t, f1, f2)            lcc = ((f2)[0].v.tlong) - ((f1)[0].v.tlong); \
  52.                         (t)[0].v.tint = (lcc < 0 ? -1 : lcc > 0 ? 1 : 0)
  53.  
  54.  
  55. #define    cvt_int_long(t, f)            (t)[0].v.tlong = (f)[0].v.tint
  56. #define    cvt_long_int(t, f)            (t)[0].v.tint = (f)[0].v.tlong
  57. #define    cvt_long_float(t, f)            (t)[0].v.tfloat = (f)[0].v.tlong
  58. #define    cvt_long_double(t, f)            (t)[0].v.tdouble = (f)[0].v.tlong
  59. #define    cvt_float_long(t, f)            (t)[0].v.tlong = (f)[0].v.tfloat
  60. #define    cvt_double_long(t, f)            (t)[0].v.tlong = (f)[0].v.tdouble
  61.  
  62. #else
  63.  
  64. #define    move_long_const(t, c)            (t)[0].v.tlong = soft_moveconst((c))
  65. #define    add_long(t, f1, f2)            (t)[0].v.tlong = soft_ladd((f1)[0].v.tlong, (f2)[0].v.tlong)
  66. #define    sub_long(t, f1, f2)            (t)[0].v.tlong = soft_lsub((f1)[0].v.tlong, (f2)[0].v.tlong)
  67. #define    mul_long(t, f1, f2)            (t)[0].v.tlong = soft_lmul((f1)[0].v.tlong, (f2)[0].v.tlong)
  68. #define    div_long(t, f1, f2)            (t)[0].v.tlong = soft_ldiv((f1)[0].v.tlong, (f2)[0].v.tlong)
  69. #define    rem_long(t, f1, f2)            (t)[0].v.tlong = soft_lrem((f1)[0].v.tlong, (f2)[0].v.tlong)
  70. #define    neg_long(t, f)                (t)[0].v.tlong = soft_lneg((f)[0].v.tlong)
  71.  
  72. #define    and_long(t, f1, f2)            (t)[0].v.tlong = soft_land((f1)[0].v.tlong, (f2)[0].v.tlong)
  73. #define    or_long(t, f1, f2)            (t)[0].v.tlong = soft_lor((f1)[0].v.tlong, (f2)[0].v.tlong)
  74. #define    xor_long(t, f1, f2)            (t)[0].v.tlong = soft_lxor((f1)[0].v.tlong, (f2)[0].v.tlong)
  75.  
  76. #define    lshl_long(t, f1, f2)            (t)[0].v.tlong = soft_llshl(((f1)[0].v.tlong), ((f2)[0].v.tint & 63))
  77. #define    ashr_long(t, f1, f2)            (t)[0].v.tlong = soft_lashr(((f1)[0].v.tlong), ((f2)[0].v.tint & 63))
  78. #define    lshr_long(t, f1, f2)            (t)[0].v.tlong = soft_llshr(((f1)[0].v.tlong), ((f2)[0].v.tint & 63))
  79.  
  80. #define    cmp_long(t, f1, f2)            (t)[0].v.tint = soft_lcmp(((f2)[0].v.tlong), ((f1)[0].v.tlong))
  81.  
  82. #define    cvt_int_long(t, f)            (t)[0].v.tlong = soft_cvtil((f)[0].v.tint)
  83. #define    cvt_long_int(t, f)            (t)[0].v.tint = soft_cvtli((f)[0].v.tlong)
  84. #define    cvt_long_float(t, f)            (t)[0].v.tfloat = soft_cvtlf((f)[0].v.tlong)
  85. #define    cvt_long_double(t, f)            (t)[0].v.tdouble = soft_cvtld((f)[0].v.tlong)
  86. #define    cvt_float_long(t, f)            (t)[0].v.tlong = soft_cvtfl((f)[0].v.tfloat)
  87. #define    cvt_double_long(t, f)            (t)[0].v.tlong = soft_cvtdl((f)[0].v.tdouble)
  88.  
  89. #endif
  90.  
  91.  
  92. #define    move_int_const(t, c)            (t)[0].v.tint = c;
  93. #define    move_ref_const                move_int_const
  94. #define    move_label_const            move_ref_const
  95.  
  96. #define    move_int(t, f)                (t)[0].v.tint = (f)[0].v.tint
  97. #define    move_ref                move_int
  98. #define    move_any                move_long
  99.  
  100. #define    swap_int(t1, t2)            {               \
  101.                           jint tmp = (t1)[0].v.tint;   \
  102.                           (t1)[0].v.tint = (t2)[0].v.tint; \
  103.                           (t2)[0].v.tint = tmp;        \
  104.                         }
  105.  
  106. #define    load_int(t, f)                (t)[0].v.tint = *(jint*)((f)[0].v.taddr)
  107. #define    load_ref                load_int
  108. #define    load_any                load_int
  109. #define    load_byte(t, f)                (t)[0].v.tint = *(jbyte*)((f)[0].v.taddr)
  110. #define    load_char(t, f)                (t)[0].v.tint = *(jchar*)((f)[0].v.taddr)
  111.  
  112. #define    store_int(t, f)                *(jint*)((t)[0].v.taddr) = ((f)[0].v.tint)
  113. #define    store_ref                store_int
  114. #define    store_any                store_int
  115. #define    store_byte(t, f)            *(jbyte*)((t)[0].v.taddr) = ((f)[0].v.tint)
  116. #define    store_char(t, f)            *(jchar*)((t)[0].v.taddr) = ((f)[0].v.tint)
  117.  
  118. #define    add_int_const(t, f, c)            (t)[0].v.tint = ((f)[0].v.tint) + (c)
  119. #define    add_ref_const                add_int_const
  120. #define    sub_int_const(t, f, c)            (t)[0].v.tint = ((f)[0].v.tint) - (c)
  121. #define    mul_int_const(t, f, c)            (t)[0].v.tint = ((f)[0].v.tint) * (c)
  122.  
  123. #define    add_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) + ((f2)[0].v.tint)
  124. #define    add_ref                    add_int
  125. #define    sub_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) - ((f2)[0].v.tint)
  126. #define    mul_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) * ((f2)[0].v.tint)
  127. #define    div_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) / ((f2)[0].v.tint)
  128. #define    rem_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) % ((f2)[0].v.tint)
  129. #define    neg_int(t, f)                (t)[0].v.tint = -((f)[0].v.tint)
  130. #define    lshl_int_const(t, f, c)            (t)[0].v.tint = ((f)[0].v.tint) << (c & 31)
  131. #define    lshl_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) << ((f2)[0].v.tint & 31)
  132. #define    ashr_int(t, f1, f2)            (t)[0].v.tint = ((int32)(f1)[0].v.tint) >> ((f2)[0].v.tint & 31)
  133. #define    lshr_int(t, f1, f2)            (t)[0].v.tint = ((uint32)(f1)[0].v.tint) >> ((f2)[0].v.tint & 31)
  134. #define    and_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) & ((f2)[0].v.tint)
  135. #define    or_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) | ((f2)[0].v.tint)
  136. #define    xor_int(t, f1, f2)            (t)[0].v.tint = ((f1)[0].v.tint) ^ ((f2)[0].v.tint)
  137.  
  138. #define    cvt_int_byte(t, f)            (t)[0].v.tint = (((f)[0].v.tint) << 24) >> 24
  139. #define    cvt_int_char(t, f)            (t)[0].v.tint = ((f)[0].v.tint) & 0xFF
  140. #define    cvt_int_short(t, f)            (t)[0].v.tint = (((f)[0].v.tint) << 16) >> 16
  141.  
  142. #define    cmp_int_const(t, f, c)            cc = ((f)[0].v.tint) - (c)
  143. #define    cmp_ref_const                cmp_int_const
  144. #define    cmp_int(t, f1, f2)            cc = ((f1)[0].v.tint) - ((f2)[0].v.tint)
  145. #define    cmp_ref                    cmp_int
  146.  
  147. #define    branch_indirect(w)            w
  148. #define    branch_a(w)                w
  149. #define    branch_eq(w)                if (cc == 0) w
  150. #define    branch_ne(w)                if (cc != 0) w
  151. #define    branch_lt(w)                if (cc < 0) w
  152. #define    branch_le(w)                if (cc <= 0) w
  153. #define    branch_gt(w)                if (cc > 0) w
  154. #define    branch_ge(w)                if (cc >= 0) w
  155.  
  156. #define    call(m)                    virtualMachine((methods*)(m)[0].v.taddr, &lcl[meth->localsz+sp])
  157. #define    ret()                    goto end
  158.  
  159. #define    returnarg_int()                (retarg)
  160. #define    returnarg_ref                returnarg_int
  161.  
  162. #define    pusharg_int_const(c)            /* Not needed for interpreter */
  163. #define    pusharg_int(f)                /* Not needed for interpreter */
  164. #define    pusharg_ref                pusharg_int
  165. #define    pusharg_ref_const            pusharg_int_const
  166. #define    pusharg_any(f)                /* Not needed for interpreter */
  167. #define    pusharg_anylong(f)            /* Not needed for interpreter */
  168. #define    popargs(n)                /* Not needed for interpreter */
  169.  
  170. #define    method_arg(i)                'I'
  171.  
  172. #define    return_int(s)                (s)[0].v.tint = retarg[0].v.tint
  173. #define    return_long(s)                (s)[0].v.tlong = retarg[0].v.tlong
  174. #define    return_float(s)                (s)[0].v.tfloat = retarg[0].v.tfloat
  175. #define    return_double(s)            (s)[0].v.tdouble = retarg[0].v.tdouble
  176. #define    return_ref(s)                (s)[0].v.taddr = retarg[0].v.taddr
  177.  
  178. #define    monitor_enter()                /* Not needed for interpreter */
  179. #define    monitor_exit()                /* Not needed for interpreter */
  180.  
  181. #define    start_function()            /* Not needed for interpreter */
  182. #define    start_basic_block()            /* Not needed for interpreter */
  183. #define    end_basic_block()            /* Not needed for interpreter */
  184. #define    end_function()                /* Not needed for interpreter */
  185.  
  186. #define    set_label(l)                label_##l:
  187. #define    reference_code_label(l)            npc = (l)
  188. #define    reference_label(l)            goto label_##l
  189. #define    reference_table_label(l)        (jint)&code[npc]
  190. #define    stored_code_label(l)            npc = (l)[0].v.tint
  191. #define    table_code_label(l)            npc = (l)[0].v.tint + pc
  192.  
  193. #define    load_key(t, f)                (t)[0].v.tint = \
  194.     ((((uint8*)(f)->v.taddr)[0] << 24) | (((uint8*)(f)->v.taddr)[1] << 16) | \
  195.     (((uint8*)(f)->v.taddr)[2] << 8) | ((uint8*)(f)->v.taddr)[3])
  196. #define    load_code_ref                load_key
  197.  
  198. #define    breakpoint()                abort()
  199.  
  200. #define    move_double(t, f)            (t)[0].v.tdouble = (f)[0].v.tdouble
  201. #define    move_double_const(t, c)            (t)[0].v.tdouble = (c)
  202. #define    move_float(t, f)            (t)[0].v.tfloat = (f)[0].v.tfloat
  203. #define    move_float_const(t, c)            (t)[0].v.tfloat = (c)
  204. #define    move_long(t, f)                (t)[0].v.tlong = (f)[0].v.tlong
  205. #define    move_anylong                move_long
  206.  
  207. #define    load_short(t, f)            (t)[0].v.tint = *(jshort*)((f)[0].v.taddr)
  208. #define    load_long(t, f)                (t)[0].v.tlong = *(jlong*)((f)[0].v.taddr)
  209. #define    load_anylong                load_long
  210. #define    load_float(t, f)            (t)[0].v.tfloat = *(jfloat*)((f)[0].v.taddr)
  211. #define    load_double(t, f)            (t)[0].v.tdouble = *(jdouble*)((f)[0].v.taddr)
  212.  
  213. #define    store_short(t, f)            *(jshort*)((t)[0].v.taddr) = ((f)[0].v.tint)
  214. #define    store_long(t, f)            *(jlong*)((t)[0].v.taddr) = ((f)[0].v.tlong)
  215. #define    store_anylong                store_long
  216. #define    store_float(t, f)            *(jfloat*)((t)[0].v.taddr) = ((f)[0].v.tfloat)
  217. #define    store_double(t, f)            *(jdouble*)((t)[0].v.taddr) = ((f)[0].v.tdouble)
  218.  
  219. #define    add_float(t, f1, f2)            (t)[0].v.tfloat = (f1)[0].v.tfloat + (f2)[0].v.tfloat
  220. #define    add_double(t, f1, f2)            (t)[0].v.tdouble = (f1)[0].v.tdouble + (f2)[0].v.tdouble
  221. #define    sub_float(t, f1, f2)            (t)[0].v.tfloat = (f1)[0].v.tfloat - (f2)[0].v.tfloat
  222. #define    sub_double(t, f1, f2)            (t)[0].v.tdouble = (f1)[0].v.tdouble - (f2)[0].v.tdouble
  223. #define    mul_float(t, f1, f2)            (t)[0].v.tfloat = (f1)[0].v.tfloat * (f2)[0].v.tfloat
  224. #define    mul_double(t, f1, f2)            (t)[0].v.tdouble = (f1)[0].v.tdouble * (f2)[0].v.tdouble
  225. #define    div_float(t, f1, f2)            (t)[0].v.tfloat = (f1)[0].v.tfloat / (f2)[0].v.tfloat
  226. #define    div_double(t, f1, f2)            (t)[0].v.tdouble = (f1)[0].v.tdouble / (f2)[0].v.tdouble
  227. #define    rem_float(t, f1, f2)            (t)[0].v.tfloat = remainderf((f1)[0].v.tfloat, (f2)[0].v.tfloat)
  228. #define    rem_double(t, f1, f2)            (t)[0].v.tdouble = remainder((f1)[0].v.tdouble, (f2)[0].v.tdouble)
  229. #define    neg_float(t, f)                (t)[0].v.tfloat = -(f)[0].v.tfloat
  230. #define    neg_double(t, f)            (t)[0].v.tdouble = -(f)[0].v.tdouble
  231.  
  232. #define    cmpg_float(t, f1, f2)            (t)[0].v.tint = soft_fcmpg((f1)[0].v.tfloat, (f2)[0].v.tfloat)
  233. #define    cmpg_double(t, f1, f2)            (t)[0].v.tint = soft_dcmpg((f1)[0].v.tdouble, (f2)[0].v.tdouble)
  234. #define    cmpl_float(t, f1, f2)            (t)[0].v.tint = soft_fcmpl((f1)[0].v.tfloat, (f2)[0].v.tfloat)
  235. #define    cmpl_double(t, f1, f2)            (t)[0].v.tint = soft_dcmpl((f1)[0].v.tdouble, (f2)[0].v.tdouble)
  236.  
  237. #define    cvt_int_float(t, f)            (t)[0].v.tfloat = (f)[0].v.tint
  238. #define    cvt_int_double(t, f)            (t)[0].v.tdouble = (f)[0].v.tint
  239. #define    cvt_float_int(t, f)            (t)[0].v.tint = (f)[0].v.tfloat
  240. #define    cvt_float_double(t, f)            (t)[0].v.tdouble = (f)[0].v.tfloat
  241. #define    cvt_double_int(t, f)            (t)[0].v.tint = (f)[0].v.tdouble
  242. #define    cvt_double_float(t, f)            (t)[0].v.tfloat = (f)[0].v.tdouble
  243.  
  244. #define    returnarg_double            returnarg_int
  245. #define    returnarg_float                returnarg_int
  246. #define    returnarg_long                returnarg_int
  247.  
  248. #define    softcall_lookupmethod(r, n, t)        (r)[0].v.taddr = soft_lookupmethod((t)[0].v.taddr, (n))
  249. #define    softcall_new(r, t)            (r)[0].v.taddr = soft_new((t)[0].v.taddr)
  250. #define    softcall_newarray(r, s, t)        (r)[0].v.taddr = soft_newarray(t, (s)[0].v.tint)
  251. #define    softcall_anewarray(r, s, t)        (r)[0].v.taddr = soft_anewarray((t)[0].v.taddr, (s)[0].v.tint)
  252. #define    softcall_athrow(s)            soft_athrow((s)[0].v.taddr)
  253. #define    softcall_checkcast(o, t)        soft_checkcast((t)[0].v.taddr, (o)[0].v.taddr)
  254. #define    softcall_instanceof(r, o, t)        (r)[0].v.tint = soft_instanceof((t)[0].v.taddr, (o)[0].v.taddr)
  255. #define    softcall_monitorenter(o)        soft_monitorenter((o)[0].v.taddr)
  256. #define    softcall_monitorexit(o)            soft_monitorexit((o)[0].v.taddr)
  257. #define    softcall_multianewarray(r, z, s, t)    (r)[0].v.taddr = soft_multianewarray((t)[0].v.taddr, z, s)
  258.  
  259. #define    softcall_badarrayindex()        soft_badarrayindex()
  260.  
  261. #define    adjustpc(a)                /* Not needed for interpreter */
  262.  
  263. #endif
  264.