[kaffe] CVS kaffe (guilhem): Integer optimization fix
Kaffe CVS
cvs-commits at kaffe.org
Mon Apr 11 10:49:58 PDT 2005
PatchSet 5672
Date: 2005/04/11 17:43:41
Author: guilhem
Branch: HEAD
Tag: (none)
Log:
Integer optimization fix
2005-04-11 Rei Odaira <ray at is.s.u-tokyo.ac.jp>
* kaffe/kaffevm/jit3/icode.c
(div_int_const_optimize): Fixed rounding.
* test/regression/NegativeDivideConst.java:
Check the rounding result.
Members:
ChangeLog:1.3838->1.3839
kaffe/kaffevm/jit3/icode.c:INITIAL->1.52
test/regression/NegativeDivideConst.java:1.1->1.2
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3838 kaffe/ChangeLog:1.3839
--- kaffe/ChangeLog:1.3838 Mon Apr 11 14:46:09 2005
+++ kaffe/ChangeLog Mon Apr 11 17:43:41 2005
@@ -1,3 +1,11 @@
+2005-04-11 Rei Odaira <ray at is.s.u-tokyo.ac.jp>
+
+ * kaffe/kaffevm/jit3/icode.c
+ (div_int_const_optimize): Fixed rounding.
+
+ * test/regression/NegativeDivideConst.java:
+ Check the rounding result.
+
2005-04-11 Guilhem Lavaux <guilhem at kaffe.org>
Rei Odaira <ray at is.s.u-tokyo.ac.jp>
===================================================================
Checking out kaffe/kaffe/kaffevm/jit3/icode.c
RCS: /home/cvs/kaffe/kaffe/kaffe/kaffevm/jit3/icode.c,v
VERS: 1.52
***************
--- /dev/null Sun Aug 4 19:57:58 2002
+++ kaffe/kaffe/kaffevm/jit3/icode.c Mon Apr 11 17:49:58 2005
@@ -0,0 +1,5340 @@
+/* icode.c
+ * Define the instructions.
+ *
+ * Copyright (c) 1996, 1997
+ * Transvirtual Technologies, Inc. All rights reserved.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file.
+ */
+
+#include "config.h"
+#include "config-std.h"
+#include "config-mem.h"
+#include "gtypes.h"
+#include "slots.h"
+#include "seq.h"
+#include "md.h"
+#include "registers.h"
+#include "basecode.h"
+#include "labels.h"
+#include "constpool.h"
+#include "icode.h"
+#include "soft.h"
+#include "access.h"
+#include "object.h"
+#include "constants.h"
+#include "classMethod.h"
+#include "gc.h"
+#include "itypes.h"
+#include "locks.h"
+#include "machine.h"
+#include "codeproto.h"
+#include "thread.h"
+#include "jthread.h"
+#include "support.h"
+#include "code-analyse.h"
+#include "funcs.h"
+#include "kaffe_jni.h"
+
+#if defined(HAVE_branch_and_link)
+#define blink 0x8000000
+#else
+#define blink 0
+#endif
+
+/*
+ * This flag can turn off array bounds checking.
+ * - for experimental purposes only.
+ */
+int noArrayBoundsChecks = 0;
+
+#if defined(WORDS_BIGENDIAN)
+#define LSLOT(_s) ((_s)+1)
+#define HSLOT(_s) (_s)
+#else
+#define LSLOT(_s) (_s)
+#define HSLOT(_s) ((_s)+1)
+#endif
+
+bool used_ieee_rounding;
+bool used_ieee_division;
+
+sequence* lastSpill;
+
+#define MAXLABTAB 64
+label* labtab[MAXLABTAB];
+
+static void _call_soft(void *routine, int profiled);
+
+/* ----------------------------------------------------------------------- */
+/* Register loads and spills. */
+/* */
+
+#if defined(HAVE_spill_int)
+
+void
+spill_int(SlotData* src)
+{
+ sequence s;
+ seq_dst(&s) = src;
+ seq_value(&s, 1) = slotOffsetNoSpill(src, Rint);
+ HAVE_spill_int(&s);
+}
+#endif
+
+#if defined(HAVE_reload_int)
+
+void
+reload_int(SlotData* dst)
+{
+ sequence s;
+ seq_dst(&s) = dst;
+ seq_value(&s, 1) = slotOffsetNoSpill(dst, Rint);
+ HAVE_reload_int(&s);
+}
+#endif
+
+#if defined(HAVE_spill_ref)
+
+void
+spill_ref(SlotData* src)
+{
+ sequence s;
+ seq_dst(&s) = src;
+ seq_value(&s, 1) = slotOffsetNoSpill(src, Rref);
+ HAVE_spill_ref(&s);
+}
+#endif
+
+#if defined(HAVE_reload_ref)
+
+void
+reload_ref(SlotData* dst)
+{
+ sequence s;
+ seq_dst(&s) = dst;
+ seq_value(&s, 1) = slotOffsetNoSpill(dst, Rref);
+ HAVE_reload_ref(&s);
+}
+#endif
+
+#if defined(HAVE_spill_long)
+
+void
+spill_long(SlotData* src)
+{
+ sequence s;
+ seq_dst(&s) = src;
+ seq_value(&s, 1) = slotOffsetNoSpill(src, Rlong);
+ HAVE_spill_long(&s);
+}
+#endif
+
+#if defined(HAVE_reload_long)
+
+void
+reload_long(SlotData* dst)
+{
+ sequence s;
+ seq_dst(&s) = dst;
+ seq_value(&s, 1) = slotOffsetNoSpill(dst, Rlong);
+ HAVE_reload_long(&s);
+}
+#endif
+
+#if defined(HAVE_spill_float)
+
+void
+spill_float(SlotData* src)
+{
+ sequence s;
+ seq_dst(&s) = src;
+ seq_value(&s, 1) = slotOffsetNoSpill(src, Rfloat);
+ HAVE_spill_float(&s);
+}
+#endif
+
+#if defined(HAVE_reload_float)
+
+void
+reload_float(SlotData* dst)
+{
+ sequence s;
+ seq_dst(&s) = dst;
+ seq_value(&s, 1) = slotOffsetNoSpill(dst, Rfloat);
+ HAVE_reload_float(&s);
+}
+#endif
+
+#if defined(HAVE_spill_double)
+
+void
+spill_double(SlotData* src)
+{
+ sequence s;
+ seq_dst(&s) = src;
+ seq_value(&s, 1) = slotOffsetNoSpill(src, Rdouble);
+ HAVE_spill_double(&s);
+}
+#endif
+
+#if defined(HAVE_reload_double)
+
+void
+reload_double(SlotData* dst)
+{
+ sequence s;
+ seq_dst(&s) = dst;
+ seq_value(&s, 1) = slotOffsetNoSpill(dst, Rdouble);
+ HAVE_reload_double(&s);
+}
+#endif
+
+void
+copyslots(SlotInfo* dst, SlotInfo* src, int type)
+{
+ slot_slot_slot(dst, NULL, src, slotAlias, Tcopy);
+ activeSeq->u[1].value.i = type;
+}
+
+void
+copylslots(SlotInfo* dst, SlotInfo* src, int type)
+{
+ lslot_lslot_lslot(dst, NULL, src, slotAlias, Tcopy);
+ activeSeq->u[1].value.i = type;
+}
+
+/* ----------------------------------------------------------------------- */
+/* Prologues and epilogues. */
+/* */
+
+void
+prologue(Method* meth)
+{
+ label* l;
+
+ used_ieee_rounding = false;
+ used_ieee_division = false;
+
+ l = KaffeJIT3_newLabel();
+ l->type = Lnull;
+ l->at = 0;
+ l->to = 0;
+ l->from = 0;
+
+ setupSlotsForBasicBlock();
+ setupGlobalRegisters();
+ setupArgumentRegisters();
+
+ /* Emit prologue code */
+ slot_const_const(NULL, (jword)l, (jword)meth, HAVE_prologue, Tnull);
+ slot_const_const(NULL, (jword)createSpillMask(), SR_START, doReload, Tnull);
+
+#if defined(ENABLE_JVMPI)
+ {
+ SlotInfo *tmp;
+
+ slot_alloctmp(tmp);
+ if( METHOD_IS_STATIC(meth) )
+ move_ref_const(tmp, NULL);
+ else
+ move_ref(tmp, local(0));
+ softcall_enter_method(tmp, meth);
+ slot_freetmp(tmp);
+ }
+#endif
+}
+
+void
+check_stack_limit(void)
+{
+#if defined(STACK_LIMIT)
+#if defined(HAVE_check_stack_limit_constpool)
+ label* l;
+ constpool* c;
+
+ l = KaffeJIT3_newLabel();
+ c = KaffeJIT3_newConstant(CPref, soft_stackoverflow);
+ l->type = Lexternal;
+ l->at = 0;
+ l->to = (uintp)c;
+ l->from = 0;
+
+ slot_slot_const(NULL, stack_limit, (jword)l, HAVE_check_stack_limit_constpool, Tnull);
+#elif defined(HAVE_check_stack_limit)
+ label* l;
+
+ l = KaffeJIT3_newLabel();
+ l->type = Lexternal;
+ l->at = 0;
+ l->to = (uintp)soft_stackoverflow;
+ l->from = 0;
+
+ slot_slot_const(NULL, stack_limit, (jword)l, HAVE_check_stack_limit, Tnull);
+#endif
+#endif /* STACK_LIMIT */
+}
+
+void
+exception_prologue(void)
+{
+ label* l;
+
+ l = KaffeJIT3_newLabel();
+ l->type = Lnull;
+ l->at = 0;
+ l->to = 0;
+ l->from = 0;
+
+ /* Emit exception prologue code */
+ slot_const_const(NULL, (jword)l, 0, HAVE_exception_prologue, Tnull);
+ slot_const_const(NULL, (jword)createSpillMask(), SR_EXCEPTION, doReload, Tnull);
+}
+
+void
+epilogue(Method* meth UNUSED)
+{
+ label* l;
+
+ l = KaffeJIT3_newLabel();
+ l->type = Lnull; /* Lnegframe|Labsolute|Lgeneral */
+ l->at = 0;
+ l->to = 0;
+ l->from = 0;
+#if defined(TRACE_METHOD_END)
+ if (Kaffe_JavaVMArgs.enableVerboseCall != 0) {
+ begin_func_sync();
+ call_soft(soft_end);
+ popargs();
+ end_func_sync();
+ }
+#endif
+
+ slot_const_const(NULL, (jword)l, 0, HAVE_epilogue, Tnull);
+}
+
+void
+ret(void)
+{
+ label *l;
+
+ l = KaffeJIT3_newLabel();
+ l->at = 0;
+ l->to = 0;
+ l->from = 0;
+
+ /* Jump to epilogue */
+ l->type = Lepilogue;
+ branch (l, ba);
+}
+
+
+/* ----------------------------------------------------------------------- */
+/* Conditional monitor management. */
+/* */
+
+void
+mon_enter(methods* meth, SlotInfo* obj)
+{
+ /* Emit monitor entry if required */
+ if ((meth->accflags & ACC_SYNCHRONISED) == 0) {
+ return;
+ }
+#if defined(HAVE_mon_enter)
+ {
+ label* l;
+
+ begin_func_sync();
+ l = KaffeJIT3_newLabel();
+ l->type = Lexternal;
+ l->at = 0;
+ l->to = (uintp)slowLockObject;
+ l->from = 0;
+ if (METHOD_IS_STATIC(meth) == 0) {
+ meth = NULL;
+ }
+ else {
+ obj = NULL;
+ }
+ slot_slot_slot_const_const(NULL, NULL, obj, (jword)meth, (jword)l, HAVE_mon_enter, Tnull);
+ end_func_sync();
+ }
+#else
+ begin_func_sync();
+ if ((meth->accflags & ACC_STATIC) != 0) {
+ pusharg_class_const(meth->class, 0);
+ }
+ else {
+ pusharg_ref(obj, 0);
+ }
+ call_soft(lockObject);
+ popargs();
+ end_func_sync();
+#endif
+}
+
+void
+mon_exit(methods* meth, SlotInfo* obj)
+{
+ /* Emit monitor entry if required */
+ if ((meth->accflags & ACC_SYNCHRONISED) == 0) {
+ return;
+ }
+#if defined(HAVE_mon_exit)
+ {
+ label* l;
+
+ begin_func_sync();
+ l = KaffeJIT3_newLabel();
+ l->type = Lexternal;
+ l->at = 0;
+ l->to = (uintp)slowUnlockObject;
+ l->from = 0;
+ if (METHOD_IS_STATIC(meth) == 0) {
+ meth = NULL;
+ }
+ else {
+ obj = NULL;
+ }
+ slot_slot_slot_const_const(NULL, NULL, obj, (jword)meth, (jword)l, HAVE_mon_exit, Tnull);
+ end_func_sync();
+ }
+#else
+ begin_func_sync();
+ if (METHOD_IS_STATIC(meth) != 0) {
+ pusharg_class_const(meth->class, 0);
+ }
+ else {
+ pusharg_ref(obj, 0);
+ }
+ call_soft(unlockObject);
+ popargs();
+ end_func_sync();
+#endif
+}
+
+void
+softcall_monitorenter(SlotInfo* mon)
+{
+#if defined(HAVE_mon_enter)
+ label* l;
+
+ l = KaffeJIT3_newLabel();
+ l->type = Lexternal;
+ l->at = 0;
+ l->to = (uintp)slowLockObject;
+ l->from = 0;
+ slot_slot_slot_const_const(NULL, NULL, mon, 0, (jword)l, HAVE_mon_enter, Tnull);
+#else
+ pusharg_ref(mon, 0);
+ call_soft(lockObject);
+ popargs();
+#endif
+}
+
+void
+softcall_monitorexit(SlotInfo* mon)
+{
+#if defined(HAVE_mon_exit)
+ label* l;
+
+ l = KaffeJIT3_newLabel();
+ l->type = Lexternal;
+ l->at = 0;
+ l->to = (uintp)slowUnlockObject;
+ l->from = 0;
+ slot_slot_slot_const_const(NULL, NULL, mon, 0, (jword)l, HAVE_mon_exit, Tnull);
+#else
+ pusharg_ref(mon, 0);
+ call_soft(unlockObject);
+ popargs();
+#endif
+}
+
+/* ----------------------------------------------------------------------- */
+/* Basic block and instruction management. */
+/* */
+
+void
+mark_all_writes(void)
+{
+ int i;
+ SlotData* sd;
+
+ /* We must reference all slots sequence since they may be used */
+ for (i = maxslot - 1; i >= 0; i--) {
+ sd = slotinfo[i].slot;
+ if (sd->wseq != 0) {
+ sd->wseq->refed = 1;
+ }
+ }
+}
+
+void
+_start_sub_block(void)
+{
+ slot_const_const(NULL, (jword)createSpillMask(), SR_SUBBASIC, doReload, Tnull);
+ setupSlotsForBasicBlock();
+}
+
+void
+_start_basic_block(void)
+{
+ slot_const_const(NULL, (jword)createSpillMask(), SR_BASIC, doReload, Tnull);
+ setupSlotsForBasicBlock();
+}
+
+void
+_end_sub_block(void)
+{
+ mark_all_writes();
+ slot_const_const(NULL, (jword)createSpillMask(), SR_SUBBASIC, doSpill, Tnull);
+}
+
+void
+_end_basic_block(void)
+{
+ mark_all_writes();
+ slot_const_const(NULL, (jword)createSpillMask(), SR_BASIC, doSpill, Tnull);
+}
+
+void
+_syncRegisters(uintp stk UNUSED, uintp temp UNUSED)
+{
+ slot_const_const(NULL, (jword)createSpillMask(), SR_SYNC, doSpill, Tnull);
+}
+
+void
+_start_instruction(uintp _pc)
+{
+ slot_const_const(NULL, 0, _pc, startInsn, Tnull);
+}
+
+void
+_start_exception_block(uintp stk)
+{
+ /* Exception blocks act like function returns - the return
+ * value is the exception object.
+ */
+ start_basic_block();
+ exception_prologue();
+ return_ref(&localinfo[stk]);
+}
+
+/*
+ * Begin a register/slot syncronization - this is the point we will
+ * store all our cached values back to where they belong. We don't know
+ * which values to store yet - this is decided at the end_sync point.
+ */
+void
+begin_sync(void)
+{
+ assert(lastSpill == 0);
+ slot_const_const(NULL, 0, SR_BASIC, doSpill, Tnull);
+ lastSpill = activeSeq;
+}
+
+void
+end_sync(void)
+{
+ /* Make sure a sync is in progress */
+ assert(lastSpill != 0);
+ lastSpill->u[1].smask = createSpillMask();
+ lastSpill = NULL;
+ mark_all_writes();
+}
+
+void
+begin_func_sync(void)
+{
+ assert(lastSpill == 0);
+ slot_const_const(NULL, 0, SR_FUNCTION, doSpill, Tnull);
+ lastSpill = activeSeq;
+
+ /* If we might throw and catch and exception we better make everything
+ * is written which should be.
+ */
+ if (canCatch(ANY)) {
+ mark_all_writes();
+ }
+}
+
+void
+end_func_sync(void)
+{
+ SlotData** mask;
+
+ /* Build a mask of the slots to spill and reload */
+ mask = createSpillMask();
+
+ /* Save the slots to spill */
+ assert(lastSpill != 0);
+ lastSpill->u[1].smask = mask;
+ lastSpill = NULL;
+
+ /* Create a reload and save the slots to reload */
+ slot_const_const(NULL, (jword)mask, SR_FUNCTION, doReload, Tnull);
+}
+
+
+/* ----------------------------------------------------------------------- */
+/* Moves. */
+/* */
+
+void
+move_int_const(SlotInfo* dst, jint val)
+{
+#if defined(HAVE_move_int_const)
+ if (HAVE_move_int_const_rangecheck(val)) {
+ slot_slot_const(dst, NULL, val, HAVE_move_int_const, Tconst);
+ }
+ else
+#endif
+ {
+ constpool *c;
+ label* l;
+
+ c = KaffeJIT3_newConstant(CPint, val);
+ l = KaffeJIT3_newLabel();
+ l->type = Lconstant;
+ l->at = 0;
+ l->to = (uintp)c;
+ l->from = 0;
+
+#if defined(HAVE_load_constpool_int)
+ slot_slot_const(dst, 0, (jword)l, HAVE_load_constpool_int, Tnull);
+#else
+ {
+ SlotInfo* tmp;
+ slot_alloctmp(tmp);
+ move_label_const(tmp, l);
+ load_int(dst, tmp);
+ slot_freetmp(tmp);
+ }
+#endif
+ }
+}
+
+void
+move_ref_const(SlotInfo* dst, void *val)
+{
+#if defined(HAVE_move_ref_const)
+ if (HAVE_move_ref_const_rangecheck(val)) {
+ slot_slot_const(dst, NULL, (jword)val, HAVE_move_ref_const, Tconst);
+ }
+ else
+#endif
+ {
+ constpool *c;
+ label* l;
+
+ c = KaffeJIT3_newConstant(CPref, val);
+ l = KaffeJIT3_newLabel();
+ l->type = Lconstant;
+ l->at = 0;
+ l->to = (uintp)c;
+ l->from = 0;
+
+#if defined(HAVE_load_constpool_ref)
+ slot_slot_const(dst, 0, (jword)l, HAVE_load_constpool_ref, Tnull);
+#else
+ {
+ SlotInfo* tmp;
+ slot_alloctmp(tmp);
+ move_label_const(tmp, l);
+ load_ref(dst, tmp);
+ slot_freetmp(tmp);
+ }
+#endif
+ }
+}
+
+void
+move_string_const(SlotInfo* dst, void *val)
+{
+#if 1
+ move_ref_const(dst, val);
+#else
+ label* l;
+ constpool *c;
+ SlotInfo* tmp;
+
+ c = KaffeJIT3_newConstant(CPstring, val);
+ l = KaffeJIT3_newLabel();
+ l->type = Lconstant;
+ l->at = 0;
+ l->to = (uintp)c;
+ l->from = 0;
+
+#if defined(HAVE_load_constpool_ref)
+ slot_slot_const(dst, 0, (jword)l, HAVE_load_constpool_ref, Tnull);
+#else
+ slot_alloctmp(tmp);
+ move_label_const(tmp, l);
+ load_ref(dst, tmp);
+ slot_freetmp(tmp);
+#endif
+
+#endif
+}
+
+void
+move_long_const(SlotInfo* dst, jlong val)
+{
+#if defined(HAVE_move_long_const)
+ if (HAVE_move_long_const_rangecheck(val)) {
+ lslot_slot_lconst(dst, 0, val, HAVE_move_long_const, Tconst);
+ }
+ else {
+ constpool *c;
+ label* l;
+ SlotInfo* tmp;
+
+ c = KaffeJIT3_newConstant(CPlong, val);
+ l = KaffeJIT3_newLabel();
+ l->type = Lconstant;
+ l->at = 0;
+ l->to = (uintp)c;
+ l->from = 0;
+
+
+#if defined(HAVE_load_constpool_long)
+ slot_slot_const(dst, 0, (jword)l, HAVE_load_constpool_long, Tnull);
+#else
+ slot_alloctmp(tmp);
+ move_label_const(tmp, l);
+ load_long(dst, tmp);
+ slot_freetmp(tmp);
+#endif
+ }
+#else
+
+#if defined(WORDS_BIGENDIAN)
+ /*
+ * Switch the ordering so that we get a better register allocation
+ * ordering and don't have to swap immediately afterwards. (sigh)
+ */
+ move_int_const(HSLOT(dst), (jint)((val >> 32) & 0xFFFFFFFF));
+ move_int_const(LSLOT(dst), (jint)(val & 0xFFFFFFFF));
+#else
+ move_int_const(LSLOT(dst), (jint)(val & 0xFFFFFFFF));
+ move_int_const(HSLOT(dst), (jint)((val >> 32) & 0xFFFFFFFF));
+#endif
+
+#endif
+}
+
+void
+move_float_const(SlotInfo* dst, float val)
+{
+#if defined(HAVE_move_float_const)
+ if (HAVE_move_float_const_rangecheck(val)) {
+ slot_slot_fconst(dst, NULL, val, HAVE_move_float_const, Tconst);
+ }
+ else
+#endif
+ {
+ constpool *c;
+ label* l;
+
+ c = KaffeJIT3_newConstant(CPfloat, val);
+ l = KaffeJIT3_newLabel();
+ l->type = Lconstant;
+ l->at = 0;
+ l->to = (uintp)c;
+ l->from = 0;
+
+#if defined(HAVE_load_constpool_float)
+ slot_slot_const(dst, NULL, (jword)l, HAVE_load_constpool_float, Tnull);
+#else
+ {
+ SlotInfo* tmp;
+ slot_alloctmp(tmp);
+ move_label_const(tmp, l);
+ load_float(dst, tmp);
+ slot_freetmp(tmp);
+ }
+#endif
+ }
+}
+
+void
+move_double_const(SlotInfo* dst, jdouble val)
+{
+#if defined(HAVE_move_double_const)
+ if (HAVE_move_double_const_rangecheck(val)) {
+ lslot_slot_fconst(dst, NULL, val, HAVE_move_double_const, Tconst);
+ }
+ else
+#endif
+ {
+ constpool *c;
+ label* l;
+
+ c = KaffeJIT3_newConstant(CPdouble, val);
+ l = KaffeJIT3_newLabel();
+ l->type = Lconstant;
+ l->at = 0;
+ l->to = (uintp)c;
+ l->from = 0;
+
+#if defined(HAVE_load_constpool_double)
+ lslot_lslot_const(dst, 0, (jword)l, HAVE_load_constpool_double, Tnull);
+#else
+ {
+ SlotInfo* tmp;
+ slot_alloctmp(tmp);
+ move_label_const(tmp, l);
+ load_double(dst, tmp);
+ slot_freetmp(tmp);
+ }
+#endif
+ }
+}
+
+#if defined(HAVE_move_any)
+void
+move_any(SlotInfo* dst, SlotInfo* src)
+{
+ if (dst == src) {
+ }
+ else if (isGlobal(dst->slot)) {
+ slot_slot_slot(dst, NULL, src, HAVE_move_any, Tcopy);
+ }
+ else {
+ copyslots(dst, src, Rref);
+ }
+}
+#endif
+
+#if defined(HAVE_move_int)
+void
+move_int(SlotInfo* dst, SlotInfo* src)
+{
+ if (dst == src) {
+ }
+#if defined(HAVE_move_int_const)
+ else if (slot_type(src) == Tconst) {
+ move_int_const(dst, slot_value(src)->i);
+ }
+#endif
+ else if (isGlobal(dst->slot)) {
+ slot_slot_slot(dst, NULL, src, HAVE_move_int, Tcopy);
+ }
+ else {
+ copyslots(dst, src, Rint);
+ }
+}
+#endif
+
+void
+move_ref(SlotInfo* dst, SlotInfo* src)
+{
+ if (dst == src) {
+ }
+#if defined(HAVE_move_ref_const)
+ else if (slot_type(src) == Tconst) {
+ move_ref_const(dst, slot_value(src)->l);
+ }
+#endif
+ else if (isGlobal(dst->slot)) {
+ slot_slot_slot(dst, NULL, src, HAVE_move_ref, Tcopy);
+ }
+ else {
+ copyslots(dst, src, Rref);
+ }
+}
+
+void
+move_anylong(SlotInfo* dst, SlotInfo* src)
+{
+#if defined(HAVE_move_anylong)
+ lslot_lslot_lslot(dst, 0, src, HAVE_move_anylong, Tcopy);
+#else
+ assert(LSLOT(dst) != HSLOT(src));
+ move_any(LSLOT(dst), LSLOT(src));
+ move_any(HSLOT(dst), HSLOT(src));
+#endif
+}
+
+void
+move_long(SlotInfo* dst, SlotInfo* src)
+{
+#if defined(HAVE_move_long)
+ lslot_lslot_lslot(dst, 0, src, HAVE_move_long, Tcopy);
+#else
+ assert(LSLOT(dst) != HSLOT(src));
+ move_int(LSLOT(dst), LSLOT(src));
+ move_int(HSLOT(dst), HSLOT(src));
+#endif
+}
+
+void
+move_float(SlotInfo* dst, SlotInfo* src)
+{
+ if (dst == src) {
+ }
+#if defined(HAVE_move_float_const)
+ else if (slot_type(src) == Tconst) {
+ move_float_const(dst, slot_value(src)->f);
+ }
+#endif
+ else if (isGlobal(dst->slot)) {
+#if defined(HAVE_move_float)
+ slot_slot_slot(dst, NULL, src, HAVE_move_float, Tcopy);
+#elif defined(HAVE_NO_FLOATING_POINT)
+ move_int(dst, src);
+#else
+ ABORT();
+#endif
+ }
+ else {
+ copyslots(dst, src, Rfloat);
+ }
+}
+
+void
+move_double(SlotInfo* dst, SlotInfo* src)
+{
+ if (dst == src) {
+ }
+#if defined(HAVE_move_double_const)
+ else if (slot_type(src) == Tconst) {
+ move_double_const(dst, slot_value(src)->d);
+ }
+#endif
+ else if (isGlobal(dst->slot)) {
+#if defined(HAVE_move_double)
+ lslot_lslot_lslot(dst, NULL, src, HAVE_move_double, Tcopy);
+#elif defined(HAVE_NO_FLOATING_POINT) || defined(PS2LINUX)
+ move_long(dst, src);
+#else
+ ABORT();
+#endif
+ }
+ else {
+ copylslots(dst, src, Rdouble);
+ }
+}
+
+#if defined(HAVE_move_label_const)
+void
+move_label_const(SlotInfo* dst, label* lab)
+{
+ slot_slot_const(dst, NULL, (jword)lab, HAVE_move_label_const, Tnull);
+}
+#endif
+
+void
+swap_any(SlotInfo* src, SlotInfo* src2)
+{
+#if defined(HAVE_swap_any)
+ slot_slot_slot(src, 0, src2, HAVE_swap_any, Tcomplex);
+#else
+ SlotInfo* tmp;
+ slot_alloctmp(tmp);
+ move_ref(tmp, src);
+ move_ref(src, src2);
+ move_ref(src2, tmp);
+ slot_freetmp(tmp);
+#endif
+}
+
+/* ----------------------------------------------------------------------- */
+/* Arithmetic operators - add, sub, etc. */
+/* */
+
+
+#if defined(HAVE_adc_int)
+void
+adc_int(SlotInfo* dst, SlotInfo* src, SlotInfo* src2)
+{
+ slot_slot_slot(dst, src, src2, HAVE_adc_int, Tcomplex);
+}
+#endif
*** Patch too long, truncated ***
More information about the kaffe
mailing list