Authors: Andreas Krall
Reinhard Grafl
- $Id: jit.c 603 2003-11-11 22:13:33Z twisti $
+ $Id: jit.c 631 2003-11-14 09:21:47Z stefan $
*/
{ ICMD_LNEG, TYPE_LONG, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
(functionptr) builtin_lneg, SUPPORT_LONG && SUPPORT_LONG_ADD, true },
{ ICMD_LMUL, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MULDIV, false },
+ (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MUL, false },
{ ICMD_FREM, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, ICMD_BUILTIN2,
(functionptr) builtin_frem, SUPPORT_FLOAT && SUPPORT_FMOD, true },
{ ICMD_DREM, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE, ICMD_BUILTIN2,
(functionptr) builtin_f2i, SUPPORT_FLOAT && SUPPORT_FICVT, true },
{ ICMD_D2I, TYPE_DOUBLE, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
(functionptr) builtin_d2i, SUPPORT_DOUBLE && SUPPORT_FICVT, true },
- { 0, 0, 0, 0, 0, NULL, false, false },
-};
-
-
-static stdopdescriptorold stdopdescriptortable[] = {
- { JAVA_IADD, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_ISUB, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_IMUL, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_ISHL, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_ISHR, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_IUSHR, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_IAND, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_IOR, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_IXOR, TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
- { JAVA_INEG, TYPE_INT, TYPE_VOID,TYPE_INT, NULL, true, false },
-
- { JAVA_LADD, TYPE_LONG, TYPE_LONG, TYPE_LONG,
- (functionptr) builtin_ladd , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
- { JAVA_LSUB, TYPE_LONG, TYPE_LONG, TYPE_LONG,
- (functionptr) builtin_lsub , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
- { JAVA_LMUL, TYPE_LONG, TYPE_LONG, TYPE_LONG,
- (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MULDIV, false },
- { JAVA_LSHL, TYPE_LONG, TYPE_INT, TYPE_LONG,
- (functionptr) builtin_lshl , SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
- { JAVA_LSHR, TYPE_LONG, TYPE_INT, TYPE_LONG,
- (functionptr) builtin_lshr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
- { JAVA_LUSHR, TYPE_LONG, TYPE_INT, TYPE_LONG,
- (functionptr) builtin_lushr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
- { JAVA_LAND, TYPE_LONG, TYPE_LONG, TYPE_LONG,
- (functionptr) builtin_land, SUPPORT_LONG && SUPPORT_LONG_LOG, false },
- { JAVA_LOR, TYPE_LONG, TYPE_LONG, TYPE_LONG,
- (functionptr) builtin_lor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
- { JAVA_LXOR, TYPE_LONG, TYPE_LONG, TYPE_LONG,
- (functionptr) builtin_lxor, SUPPORT_LONG && SUPPORT_LONG_LOG, false },
- { JAVA_LNEG, TYPE_LONG, TYPE_VOID, TYPE_LONG,
- (functionptr) builtin_lneg, SUPPORT_LONG && SUPPORT_LONG_ADD, false },
- { JAVA_LCMP, TYPE_LONG, TYPE_LONG, TYPE_INT,
- (functionptr) builtin_lcmp, SUPPORT_LONG && SUPPORT_LONG_CMP, false },
-
- { JAVA_FADD, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT,
- (functionptr) builtin_fadd, SUPPORT_FLOAT, true },
- { JAVA_FSUB, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT,
- (functionptr) builtin_fsub, SUPPORT_FLOAT, true },
- { JAVA_FMUL, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT,
- (functionptr) builtin_fmul, SUPPORT_FLOAT, true },
- { JAVA_FDIV, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT,
- (functionptr) builtin_fdiv, SUPPORT_FLOAT, true },
- { JAVA_FREM, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT,
- (functionptr) builtin_frem, SUPPORT_FLOAT, true },
- { JAVA_FNEG, TYPE_FLOAT, TYPE_VOID, TYPE_FLOAT,
- (functionptr) builtin_fneg, SUPPORT_FLOAT, true },
- { JAVA_FCMPL, TYPE_FLOAT, TYPE_FLOAT, TYPE_INT,
- (functionptr) builtin_fcmpl, SUPPORT_FLOAT, true },
- { JAVA_FCMPG, TYPE_FLOAT, TYPE_FLOAT, TYPE_INT,
- (functionptr) builtin_fcmpg, SUPPORT_FLOAT, true },
-
- { JAVA_DADD, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE,
- (functionptr) builtin_dadd, SUPPORT_DOUBLE, true },
- { JAVA_DSUB, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE,
- (functionptr) builtin_dsub, SUPPORT_DOUBLE, true },
- { JAVA_DMUL, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE,
- (functionptr) builtin_dmul, SUPPORT_DOUBLE, true },
- { JAVA_DDIV, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE,
- (functionptr) builtin_ddiv, SUPPORT_DOUBLE, true },
- { JAVA_DREM, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE,
- (functionptr) builtin_drem, SUPPORT_DOUBLE, true },
- { JAVA_DNEG, TYPE_DOUBLE, TYPE_VOID, TYPE_DOUBLE,
- (functionptr) builtin_dneg, SUPPORT_DOUBLE, true },
- { JAVA_DCMPL, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_INT,
- (functionptr) builtin_dcmpl, SUPPORT_DOUBLE, true },
- { JAVA_DCMPG, TYPE_DOUBLE, TYPE_DOUBLE, TYPE_INT,
- (functionptr) builtin_dcmpg, SUPPORT_DOUBLE, true },
-
- { JAVA_INT2BYTE, TYPE_INT, TYPE_VOID, TYPE_INT, NULL, true,false },
- { JAVA_INT2CHAR, TYPE_INT, TYPE_VOID, TYPE_INT, NULL, true,false },
- { JAVA_INT2SHORT, TYPE_INT, TYPE_VOID, TYPE_INT, NULL, true,false },
- { JAVA_I2L, TYPE_INT, TYPE_VOID, TYPE_LONG,
- (functionptr) builtin_i2l, SUPPORT_LONG && SUPPORT_LONG_ICVT, false },
- { JAVA_I2F, TYPE_INT, TYPE_VOID, TYPE_FLOAT,
- (functionptr) builtin_i2f, SUPPORT_FLOAT, true },
- { JAVA_I2D, TYPE_INT, TYPE_VOID, TYPE_DOUBLE,
- (functionptr) builtin_i2d, SUPPORT_DOUBLE, true },
- { JAVA_L2I, TYPE_LONG, TYPE_VOID, TYPE_INT,
- (functionptr) builtin_l2i, SUPPORT_LONG && SUPPORT_LONG_ICVT, false },
- { JAVA_L2F, TYPE_LONG, TYPE_VOID, TYPE_FLOAT,
- (functionptr) builtin_l2f, SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT, true },
- { JAVA_L2D, TYPE_LONG, TYPE_VOID, TYPE_DOUBLE,
- (functionptr) builtin_l2d, SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT, true },
- { JAVA_F2I, TYPE_FLOAT, TYPE_VOID, TYPE_INT,
- (functionptr) builtin_f2i, SUPPORT_FLOAT, true },
- { JAVA_F2L, TYPE_FLOAT, TYPE_VOID, TYPE_LONG,
- (functionptr) builtin_f2l, SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_FCVT, true },
- { JAVA_F2D, TYPE_FLOAT, TYPE_VOID, TYPE_DOUBLE,
- (functionptr) builtin_f2d, SUPPORT_FLOAT && SUPPORT_DOUBLE, true },
- { JAVA_D2I, TYPE_DOUBLE, TYPE_VOID, TYPE_INT,
- (functionptr) builtin_d2i, SUPPORT_DOUBLE, true },
- { JAVA_D2L, TYPE_DOUBLE, TYPE_VOID, TYPE_LONG,
- (functionptr) builtin_d2l, SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_FCVT, true },
- { JAVA_D2F, TYPE_DOUBLE, TYPE_VOID, TYPE_FLOAT,
- (functionptr) builtin_d2f, SUPPORT_DOUBLE && SUPPORT_FLOAT, true },
- { 0, 0, 0, 0, NULL, false, false },
+ { 255, 0, 0, 0, 0, NULL, true, false },
};
#endif /* USEBUILTINTABLE */
/* functions for compiler initialisation and finalisation *********************/
#ifdef USEBUILTINTABLE
+
static int stdopcompare(const void *a, const void *b)
{
stdopdescriptor *o1 = (stdopdescriptor *) a;
}
-
-static inline void testsort()
+static inline void sort_builtintable()
{
int len;
- len = sizeof(stdopdescriptortable) / sizeof(stdopdescriptor);
- qsort(stdopdescriptortable, len, sizeof(stdopdescriptor), stdopcompare);
len = sizeof(builtintable) / sizeof(stdopdescriptor);
qsort(builtintable, len, sizeof(stdopdescriptor), stdopcompare);
}
+
+
+stdopdescriptor *find_builtin(int icmd)
+{
+ stdopdescriptor *first = builtintable;
+ stdopdescriptor *last = builtintable + sizeof(builtintable) / sizeof(stdopdescriptor);
+ int len = last - first;
+ int half;
+ stdopdescriptor *middle;
+
+ while (len > 0) {
+ half = len / 2;
+ middle = first + half;
+ if (middle->opcode < icmd) {
+ first = middle + 1;
+ len -= half + 1;
+ } else
+ len = half;
+ }
+ return first;
+}
+
#endif
int i;
#ifdef USEBUILTINTABLE
- testsort();
+ sort_builtintable();
#endif
#if defined(__ALPHA__)