retitle 272829 Linux mips/mipsel port of gprolog
tags 272829 +patch
thanks
The appended patch adds support for Linux mips/mipsel. (It also removes
a redundant -Wall in BCFLAGS.)
Thiemo
diff -uprN gprolog-1.2.18.old/debian/control gprolog-1.2.18/debian/control
--- gprolog-1.2.18.old/debian/control 2005-10-30 21:49:13.000000000 +0100
+++ gprolog-1.2.18/debian/control 2005-10-28 22:07:03.000000000 +0200
@@ -8,7 +8,7 @@ Build-Depends: debhelper (>= 3.0), autoc
Build-Depends-Indep: imagemagick, tetex-bin, tetex-extra, gsfonts, hevea (>=
1.07), texinfo, debhelper (>= 3.0), autoconf (>= 2.52), autotools-dev
Package: gprolog
-Architecture: i386 amd64 sparc mips alpha powerpc
+Architecture: i386 amd64 sparc mips mipsel alpha powerpc
Depends: ${shlibs:Depends}, gcc-3.3
Recommends: gprolog-doc
Conflicts:
diff -uprN gprolog-1.2.18.old/debian/rules gprolog-1.2.18/debian/rules
--- gprolog-1.2.18.old/debian/rules 2005-10-30 21:49:13.000000000 +0100
+++ gprolog-1.2.18/debian/rules 2005-10-30 21:51:41.000000000 +0100
@@ -37,7 +37,7 @@ version=$(shell pwd | sed -e 's;.*/;;' -
SRCDIR=src/src
DBGFLAGS=-O3 -fomit-frame-pointer
-BCFLAGS=-funsigned-char -Wall
+BCFLAGS=-funsigned-char
# =============================================================================
diff -uprN gprolog-1.2.18.old/src/src/EnginePl/engine1.c
gprolog-1.2.18/src/src/EnginePl/engine1.c
--- gprolog-1.2.18.old/src/src/EnginePl/engine1.c 2005-10-30
21:49:12.000000000 +0100
+++ gprolog-1.2.18/src/src/EnginePl/engine1.c 2005-10-28 22:08:36.000000000
+0200
@@ -69,7 +69,7 @@ Call_Compiled(CodePtr codep)
_asm mov ebx, reg_bank
-#elif defined(M_mips_irix)
+#elif defined(M_mips_irix) || defined(M_mips_linux)
register WamWord *rb asm("$16") = reg_bank;
ensure_reserved = (WamWord *) rb; /* to avoid gcc warning */
diff -uprN gprolog-1.2.18.old/src/src/EnginePl/gp_config.h.in
gprolog-1.2.18/src/src/EnginePl/gp_config.h.in
--- gprolog-1.2.18.old/src/src/EnginePl/gp_config.h.in 2005-10-30
21:49:12.000000000 +0100
+++ gprolog-1.2.18/src/src/EnginePl/gp_config.h.in 2005-10-28
22:09:13.000000000 +0200
@@ -128,6 +128,9 @@
/* Define if the system is an mips/irix */
#undef M_mips_irix
+/* Define if the system is an mips/linux */
+#undef M_mips_linux
+
/* Define if the system is an alpha/linux */
#undef M_alpha_linux
diff -uprN gprolog-1.2.18.old/src/src/EnginePl/machine.c
gprolog-1.2.18/src/src/EnginePl/machine.c
--- gprolog-1.2.18.old/src/src/EnginePl/machine.c 2005-10-30
21:49:12.000000000 +0100
+++ gprolog-1.2.18/src/src/EnginePl/machine.c 2005-10-30 21:32:51.000000000
+0100
@@ -386,7 +386,7 @@ M_Allocate_Stacks(void)
}
#if defined(M_sparc_solaris) || defined(M_ix86_solaris) || \
- defined(M_ix86_sco) || defined(M_x86_64_linux)
+ defined(M_ix86_sco) || defined(M_mips_linux) || defined(M_x86_64_linux)
{
struct sigaction act;
@@ -479,6 +479,10 @@ SIGSEGV_Handler(WamWord *addr)
void
SIGSEGV_Handler(int sig, int code, struct sigcontext *scp)
+#elif defined(M_mips_linux)
+void
+SIGSEGV_Handler(int sig, siginfo_t *sip, void *scp)
+
#elif defined(M_x86_64_linux)
void
SIGSEGV_Handler(int sig, siginfo_t *sip, void *scp)
@@ -506,6 +510,10 @@ SIGSEGV_Handler(int sig)
WamWord *addr = (WamWord *) scp.cr2;
+#elif defined(M_mips_linux)
+
+ WamWord *addr = (WamWord *) sip->si_addr;
+
#elif defined(M_x86_64_linux)
WamWord *addr = (WamWord *) sip->si_addr;
diff -uprN gprolog-1.2.18.old/src/src/EnginePl/machine.h
gprolog-1.2.18/src/src/EnginePl/machine.h
--- gprolog-1.2.18.old/src/src/EnginePl/machine.h 2005-10-30
21:49:12.000000000 +0100
+++ gprolog-1.2.18/src/src/EnginePl/machine.h 2005-10-28 22:11:25.000000000
+0200
@@ -101,7 +101,7 @@ void M_Check_Magic_Words(void); /* not c
# define M_USED_REGS {"g6", "g7", 0}
-#elif defined(M_mips_irix)
+#elif defined(M_mips_irix) || defined(M_mips_linux)
#define M_USED_REGS {"$16", "$17", "$18", "$19", "$20", \
"$21", "$22", "$23", 0}
diff -uprN gprolog-1.2.18.old/src/src/EnginePl/obj_chain.c
gprolog-1.2.18/src/src/EnginePl/obj_chain.c
--- gprolog-1.2.18.old/src/src/EnginePl/obj_chain.c 2005-10-30
21:49:12.000000000 +0100
+++ gprolog-1.2.18/src/src/EnginePl/obj_chain.c 2005-10-28 22:11:04.000000000
+0200
@@ -208,7 +208,7 @@ Find_Linked_Objects(void)
(*p->fct_init) ();
#if defined(M_powerpc_linux) || defined(M_alpha_linux) ||
defined(M_powerpc_bsd) ||\
- defined(M_mips_irix)
+ defined(M_mips_irix) || defined(M_mips_linux)
p = (ObjChain *) ((long *) p + 1);
#elif 0
p = (ObjChain *) ((char *) p + 1);
diff -uprN gprolog-1.2.18.old/src/src/Ma2Asm/Makefile.in
gprolog-1.2.18/src/src/Ma2Asm/Makefile.in
--- gprolog-1.2.18.old/src/src/Ma2Asm/Makefile.in 2003-02-11
14:39:47.000000000 +0100
+++ gprolog-1.2.18/src/src/Ma2Asm/Makefile.in 2005-10-28 22:12:50.000000000
+0200
@@ -14,7 +14,7 @@ [EMAIL PROTECTED]@: ma2asm.c ma_protos.h
[EMAIL PROTECTED]@: ma2asm_inst.c ma_parser.h ../EnginePl/wam_regs.h \
ix86_any.c ix86_win32.c powerpc_any.c sparc_any.c \
- mips_irix.c alpha_any.c x86_64_any.c
+ mips_irix.c mips_linux.c alpha_any.c x86_64_any.c
$(CC) $(CFLAGS) -c ma2asm_inst.c
[EMAIL PROTECTED]@: [EMAIL PROTECTED]@ [EMAIL PROTECTED]@ \
diff -uprN gprolog-1.2.18.old/src/src/Ma2Asm/ma2asm_inst.c
gprolog-1.2.18/src/src/Ma2Asm/ma2asm_inst.c
--- gprolog-1.2.18.old/src/src/Ma2Asm/ma2asm_inst.c 2005-10-30
21:49:13.000000000 +0100
+++ gprolog-1.2.18/src/src/Ma2Asm/ma2asm_inst.c 2005-10-28 22:14:26.000000000
+0200
@@ -65,10 +65,14 @@
#include "alpha_any.c"
-#elif defined(M_mips) /* FIXME: was M_mips_irix... OK? */
+#elif defined(M_mips_irix)
#include "mips_irix.c"
+#elif defined(M_mips_linux)
+
+#include "mips_linux.c"
+
#elif defined(M_powerpc)
#include "powerpc_any.c"
diff -uprN gprolog-1.2.18.old/src/src/Ma2Asm/mips_linux.c
gprolog-1.2.18/src/src/Ma2Asm/mips_linux.c
--- gprolog-1.2.18.old/src/src/Ma2Asm/mips_linux.c 1970-01-01
01:00:00.000000000 +0100
+++ gprolog-1.2.18/src/src/Ma2Asm/mips_linux.c 2005-10-30 21:27:58.000000000
+0100
@@ -0,0 +1,1254 @@
+/*-------------------------------------------------------------------------*
+ * GNU Prolog *
+ * *
+ * Part : mini-assembler to assembler translator *
+ * File : mips_linux.c *
+ * Descr.: translation file for Linux on MIPS *
+ * Author: Thiemo Seufer *
+ * *
+ * Derived from the mips_irix.c support, with the original copyright *
+ * notice: *
+ * *
+ * Author: Alexander Diemand, Daniel Diaz *
+ * *
+ * Copyright (C) 1999 Daniel Diaz *
+ * *
+ * GNU Prolog is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU General Public License as published by the *
+ * Free Software Foundation; either version 2, or any later version. *
+ * *
+ * GNU Prolog is distributed in the hope that it will be useful, but *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc. *
+ * 59 Temple Place - Suite 330, Boston, MA 02111, USA. *
+ *-------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+
+/*---------------------------------*
+ * Constants *
+ *---------------------------------*/
+
+#define STRING_PREFIX ".LC"
+
+#define MAX_C_ARGS_IN_C_CODE 32
+
+/*---------------------------------*
+ * Type Definitions *
+ *---------------------------------*/
+
+/*---------------------------------*
+ * Global Variables *
+ *---------------------------------*/
+
+char asm_reg_bank[16];
+char asm_reg_e[16];
+char asm_reg_b[16];
+char asm_reg_cp[16];
+
+int w_label = 0;
+
+static char dbl_arg_buffer[8192] = "\0"; /* a temp buffer for the double
arguments */
+
+char act_routine[512] = "\0"; /* remembers the actual routine we are building
*/
+
+int inPrologCode = 0; /* whether we are currently compiling a prolog code */
+
+ /* variables for ma_parser.c / ma2asm.c */
+
+char *comment_prefix = "#";
+char *local_symb_prefix = ".L";
+int strings_need_null = 1;
+int call_c_reverse_args = 0;
+
+char *inline_asm_data[] = { NULL };
+
+int double_args;
+int seen_int_arg;
+int double_pad;
+
+/*---------------------------------*
+ * Function Prototypes *
+ *---------------------------------*/
+
+
+/*-------------------------------------------------------------------------*
+ * INLINED CODE *
+ * *
+ *-------------------------------------------------------------------------*/
+/* all %s will be replaced with the function's name
+ * all %d will be replaced with the current nb_inlines
+ */
+static long nb_inlines = 0;
+static char *def_inlines[] = {
+ /* name code */
+ 0, 0 /* end of list */
+};
+
+
+
+/*-------------------------------------------------------------------------*
+ * MAKE_INLINE *
+ * *
+ *-------------------------------------------------------------------------*/
+/* when it finds a function to inline it will do so immediatly and return 1
+ * else it fails and returns 0
+ */
+static int
+make_inline(char *fct_name, int nb_args)
+{
+ char *fp;
+ int counter;
+
+ return 0; /* not yet */
+
+ /* user can set an environment variable to control this */
+ if (!getenv("GPROLOG_ASM_INLINE"))
+ return 0;
+
+ counter = 0;
+ while (def_inlines[counter])
+ {
+ if (strcmp(fct_name, def_inlines[counter]) == 0)
+ {
+ /* found code to inline, emit */
+ fp = def_inlines[++counter];
+ while (*fp != '\0')
+ {
+ if (*fp == '%' && *(fp + 1) == 's')
+ {
+ String_Out(fct_name);
+ fp++;
+ }
+ else if (*fp == '%' && *(fp + 1) == 'd')
+ {
+ Int_Out(nb_inlines);
+ fp++;
+ }
+ else
+ {
+ Char_Out(*fp);
+ }
+ fp++;
+ }
+ nb_inlines++;
+ return 1;
+ }
+ counter++;
+ }
+ return 0;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * ASM_START *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Asm_Start(void)
+{
+#ifdef MAP_REG_BANK
+ sprintf(asm_reg_bank, "%s", MAP_REG_BANK);
+#else
+ strcpy(asm_reg_bank, "$16");
+#endif
+
+#ifdef MAP_REG_E
+ sprintf(asm_reg_e, "%s", MAP_REG_E);
+#else
+/* strcpy(asm_reg_e,"$21"); */
+ sprintf(asm_reg_e, "%d(%s)", MAP_OFFSET_E, asm_reg_bank);
+#endif
+
+#ifdef MAP_REG_B
+ sprintf(asm_reg_b, "%s", MAP_REG_B);
+#else
+/* sprintf(asm_reg_b,"$18"); */
+ sprintf(asm_reg_b, "%d(%s)", MAP_OFFSET_B, asm_reg_bank);
+#endif
+
+#ifdef MAP_REG_CP
+ sprintf(asm_reg_cp, "%s", MAP_REG_CP);
+#else
+/* sprintf(asm_reg_cp,"$20"); */
+ sprintf(asm_reg_cp, "%d(%s)", MAP_OFFSET_CP, asm_reg_bank);
+#endif
+
+ Inst_Printf(".option", "pic2"); /* gcc uses this */
+ Inst_Printf("#.set", "noat");
+ Inst_Printf("#.set", "noreorder"); /* let the assembler reorder
instructions */
+
+ Inst_Printf("# asm_reg_bank ", asm_reg_bank);
+ Inst_Printf("# asm_reg_e ", asm_reg_e);
+ Inst_Printf("# asm_reg_b ", asm_reg_b);
+ Inst_Printf("# asm_reg_cp ", asm_reg_cp);
+
+ Label_Printf("\t.section\t.text");
+
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * ASM_STOP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Asm_Stop(void)
+{
+ /* we are printing the fixed doubles at the end of the file,
+ * they will appear in the data section */
+ if (dbl_arg_buffer[0] != '\0')
+ {
+ Label_Printf(".section\t.rodata");
+ Label_Printf(dbl_arg_buffer);
+ dbl_arg_buffer[0] = '\0';
+ }
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CODE_START *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Code_Start(char *label, int prolog, int global)
+{
+
+ if (act_routine[0] != '\0')
+ Code_Stop(); /* we first have to close the previous code */
+
+ Inst_Printf(".text", "");
+ Inst_Printf(".align", "2");
+ Inst_Printf(".ent", "%s", label);
+ if (global)
+ Inst_Printf(".globl", "%s", label);
+
+ Label(label);
+
+ /* remember this label */
+ strcpy(act_routine, label);
+
+ if (prolog)
+ {
+ /* prolog code does not need any stack space */
+ inPrologCode = 1;
+ Inst_Printf(".frame", "$sp,0,$31");
+ Inst_Printf(".mask", "0x00000000,0");
+ Inst_Printf(".fmask", "0x00000000,0");
+ }
+ else
+ {
+ /* for c code we need to save some registers */
+ inPrologCode = 0;
+ /* */
+ Inst_Printf(".frame", "$sp,%d,$31", MAX_C_ARGS_IN_C_CODE * 4 + 16);
+ Inst_Printf(".mask", "0x10000000,-16");
+ Inst_Printf(".fmask", "0x00000000,0");
+ Inst_Printf(".set", "noreorder");
+ Inst_Printf(".cpload", "$25");
+ Inst_Printf(".set", "reorder");
+ Inst_Printf("subu", "$sp,%d", MAX_C_ARGS_IN_C_CODE * 4 + 16);
+ Inst_Printf(".cprestore", "%d", MAX_C_ARGS_IN_C_CODE * 4 + 4);
+ Inst_Printf("sw", "$31,%d($sp)", MAX_C_ARGS_IN_C_CODE * 4 + 0);
+ }
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CODE_STOP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Code_Stop(void)
+{
+ Inst_Printf(".end", "%s", act_routine);
+
+ act_routine[0] = '\0';
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * LABEL *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Label(char *label)
+{
+ Label_Printf("\n%s:", label);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * RELOAD_E_IN_REGISTER *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Reload_E_In_Register(void)
+{
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * PL_JUMP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Pl_Jump(char *label)
+{
+ Inst_Printf("la", "$25,%s", label);
+ Inst_Printf("jr", "$25");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * PREP_CP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Prep_CP(void)
+{
+#ifdef MAP_REG_CP
+ Inst_Printf("la", "%s,.Lcont%d", asm_reg_cp, w_label); /* CP =
.Lcont%d */
+#else
+ Inst_Printf("la", "$13,.Lcont%d", w_label);
+ Inst_Printf("sw", "$13,%s", asm_reg_cp); /* CP = .Lcont%d */
+#endif
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * HERE_CP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Here_CP(void)
+{
+ Label_Printf(".Lcont%d:", w_label++);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * PL_CALL *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Pl_Call(char *label)
+{
+ Prep_CP();
+ Pl_Jump(label);
+ Here_CP();
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * PL_FAIL *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Pl_Fail(void)
+{
+#ifdef MAP_REG_B
+ Inst_Printf("lw", "$25,-4(%s)", asm_reg_b);
+#else
+ Inst_Printf("lw", "$13,%s", asm_reg_b);
+ Inst_Printf("lw", "$25,-4($13)");
+#endif
+ Inst_Printf("jr", "$25");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * PL_RET *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Pl_Ret(void)
+{
+ Inst_Printf(".align", "3");
+ Inst_Printf("# nop", ""); /* I don't really know why, but it helps ;-) */
+#ifdef MAP_REG_CP
+ Inst_Printf("move", "$25,%s", asm_reg_cp);
+#else
+ Inst_Printf("lw", "$25,%s", asm_reg_cp);
+#endif
+ Inst_Printf("jr", "$25");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * JUMP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Jump(char *label)
+{
+ Inst_Printf("la", "$25,%s", label);
+ Inst_Printf("jr", "$25");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_FROM_REG_X *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_From_Reg_X(int index)
+{
+ Inst_Printf("lw", "$24,%d(%s)", 4 * index, asm_reg_bank); /* asm_reg_bank
*/
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_FROM_REG_Y *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_From_Reg_Y(int index)
+{
+#ifdef MAP_REG_E
+ Inst_Printf("lw", "$24,%d(%s)", Y_OFFSET(index), asm_reg_e);
+#else
+ Inst_Printf("lw", "$13,%s", asm_reg_e);
+ Inst_Printf("lw", "$24,%d($13)", Y_OFFSET(index));
+#endif
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_TO_REG_X *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_To_Reg_X(int index)
+{
+ Inst_Printf("sw", "$24,%d(%s)", 4 * index, asm_reg_bank);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_TO_REG_Y *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_To_Reg_Y(int index)
+{
+#ifdef MAP_REG_E
+ Inst_Printf("sw", "$24,%d(%s)", Y_OFFSET(index), asm_reg_e);
+#else
+ Inst_Printf("lw", "$13,%s", asm_reg_e);
+ Inst_Printf("sw", "$24,%d($13)", Y_OFFSET(index));
+#endif
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_START *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Call_C_Start(char *fct_name, int fc, int nb_args, char **p_inline)
+{
+ double_args = 0;
+ seen_int_arg = 0;
+ double_pad = 0;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_ARG_INT *
+ * *
+ *-------------------------------------------------------------------------*/
+int
+Call_C_Arg_Int(int offset, long int_val)
+{
+ seen_int_arg = 1;
+
+ switch (offset + double_args)
+ {
+ case 0:
+ Inst_Printf("li", "$4,%d", int_val);
+ break;
+ case 1:
+ Inst_Printf("li", "$5,%d", int_val);
+ break;
+ case 2:
+ Inst_Printf("li", "$6,%d", int_val);
+ break;
+ case 3:
+ Inst_Printf("li", "$7,%d", int_val);
+ break;
+ default:
+ Inst_Printf("li", "$24,%d", int_val);
+ Inst_Printf("sw", "$24,%d($sp)", (offset + double_args + double_pad) *
4);
+ }
+ return 1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_ARG_DOUBLE *
+ * *
+ *-------------------------------------------------------------------------*/
+int
+Call_C_Arg_Double(int offset, double dbl_val)
+{
+ char buf[1024];
+
+ sprintf(buf, "\t.align 3\n.LD%d:\n\t.double %1.20e\n", w_label++,
+ dbl_val);
+ strcat(dbl_arg_buffer, buf);
+ Inst_Printf("la", "$24,.LD%d", (w_label - 1));
+ if (!seen_int_arg && (double_args == 0 || double_args == 1))
+ {
+ switch (offset)
+ {
+ case 0:
+ Inst_Printf("l.d", "$f12,($24)");
+ break;
+ case 1:
+ Inst_Printf("l.d", "$f14,($24)");
+ break;
+ default:
+ /* shall never happen */
+ break;
+ }
+ }
+ else
+ {
+ if ((offset + double_args) & 1)
+ {
+ double_pad++;
+ }
+ Inst_Printf("l.d", "$f4,($24)");
+ Inst_Printf("s.d", "$f4,%d($sp)", (offset + double_args + double_pad) *
4);
+ }
+ double_args++;
+ return 1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_ARG_STRING *
+ * *
+ *-------------------------------------------------------------------------*/
+int
+Call_C_Arg_String(int offset, int str_no)
+{
+ seen_int_arg = 1;
+
+ switch (offset + double_args)
+ {
+ case 0:
+ Inst_Printf("la", "$4,%s%d", STRING_PREFIX, str_no);
+ break;
+ case 1:
+ Inst_Printf("la", "$5,%s%d", STRING_PREFIX, str_no);
+ break;
+ case 2:
+ Inst_Printf("la", "$6,%s%d", STRING_PREFIX, str_no);
+ break;
+ case 3:
+ Inst_Printf("la", "$7,%s%d", STRING_PREFIX, str_no);
+ break;
+ default:
+ Inst_Printf("la", "$24,%s%d", STRING_PREFIX, str_no);
+ Inst_Printf("sw", "$24,%d($sp)", (offset + double_args + double_pad) *
4);
+ }
+ return 1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_ARG_MEM_L *
+ * *
+ *-------------------------------------------------------------------------*/
+int
+Call_C_Arg_Mem_L(int offset, int adr_of, char *name, int index)
+{
+ char dest[8];
+
+ seen_int_arg = 1;
+
+ switch (offset + double_args)
+ {
+ case 0:
+ sprintf(dest, "%s", "$4");
+ break;
+ case 1:
+ sprintf(dest, "%s", "$5");
+ break;
+ case 2:
+ sprintf(dest, "%s", "$6");
+ break;
+ case 3:
+ sprintf(dest, "%s", "$7");
+ break;
+ default:
+ sprintf(dest, "%s", "$24");
+ break;
+ }
+
+ if (!adr_of)
+ {
+ Inst_Printf("la", "$25,%s", name);
+ Inst_Printf("lw", "%s,%d($25)", dest, index * 4);
+ }
+ else
+ {
+ Inst_Printf("la", "%s,%s+%d", dest, name, index * 4);
+ }
+ if ((offset + double_args) > 3)
+ {
+ Inst_Printf("sw", "%s,%d($sp)", dest, (offset + double_args +
double_pad) * 4);
+ }
+ return 1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_ARG_REG_X *
+ * *
+ *-------------------------------------------------------------------------*/
+int
+Call_C_Arg_Reg_X(int offset, int adr_of, int index)
+{
+ char dest[8];
+
+ seen_int_arg = 1;
+
+ switch (offset + double_args)
+ {
+ case 0:
+ sprintf(dest, "%s", "$4");
+ break;
+ case 1:
+ sprintf(dest, "%s", "$5");
+ break;
+ case 2:
+ sprintf(dest, "%s", "$6");
+ break;
+ case 3:
+ sprintf(dest, "%s", "$7");
+ break;
+ default:
+ sprintf(dest, "%s", "$24");
+ break;
+ }
+
+ if (!adr_of)
+ {
+ Inst_Printf("lw", "%s,%d(%s)", dest, index * 4, asm_reg_bank);
+ }
+ else
+ {
+ if (index == 0)
+ {
+ Inst_Printf("move", "%s,%s", dest, asm_reg_bank);
+ }
+ else
+ {
+ Inst_Printf("la", "%s,%d(%s)", dest, index * 4, asm_reg_bank);
+ }
+ }
+ if ((offset + double_args) > 3)
+ {
+ Inst_Printf("sw", "%s,%d($sp)", dest, (offset + double_args +
double_pad) * 4);
+ }
+ return 1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_ARG_REG_Y *
+ * *
+ *-------------------------------------------------------------------------*/
+int
+Call_C_Arg_Reg_Y(int offset, int adr_of, int index)
+{
+ char dest[8];
+
+ seen_int_arg = 1;
+
+ switch (offset + double_args)
+ {
+ case 0:
+ sprintf(dest, "%s", "$4");
+ break;
+ case 1:
+ sprintf(dest, "%s", "$5");
+ break;
+ case 2:
+ sprintf(dest, "%s", "$6");
+ break;
+ case 3:
+ sprintf(dest, "%s", "$7");
+ break;
+ default:
+ sprintf(dest, "%s", "$24");
+ break;
+ }
+
+ if (!adr_of)
+ {
+#ifdef MAP_REG_E
+ Inst_Printf("lw", "%s,%d(%s)", dest, Y_OFFSET(index), asm_reg_e);
+#else
+ Inst_Printf("lw", "$12,%s", asm_reg_e);
+ Inst_Printf("lw", "%s,%d($12)", dest, Y_OFFSET(index));
+#endif
+ }
+ else
+ {
+#ifdef MAP_REG_E
+ Inst_Printf("la", "%s,%d(%s)", dest, Y_OFFSET(index), asm_reg_e);
+#else
+ Inst_Printf("lw", "$12,%s", asm_reg_e);
+ Inst_Printf("la", "%s,%d($12)", dest, Y_OFFSET(index));
+#endif
+ }
+ if ((offset + double_args) > 3)
+ {
+ Inst_Printf("sw", "%s,%d($sp)", dest, (offset + double_args +
double_pad) * 4);
+ }
+
+ return 1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_ARG_FOREIGN_L *
+ * *
+ *-------------------------------------------------------------------------*/
+int
+Call_C_Arg_Foreign_L(int offset, int adr_of, int index)
+{
+ char dest[8];
+
+ seen_int_arg = 1;
+
+ switch (offset + double_args)
+ {
+ case 0:
+ sprintf(dest, "%s", "$4");
+ break;
+ case 1:
+ sprintf(dest, "%s", "$5");
+ break;
+ case 2:
+ sprintf(dest, "%s", "$6");
+ break;
+ case 3:
+ sprintf(dest, "%s", "$7");
+ break;
+ default:
+ sprintf(dest, "%s", "$24");
+ break;
+ }
+
+ Inst_Printf("la", "$2,foreign_long");
+ if (!adr_of)
+ {
+ Inst_Printf("lw", "%s,%d($2)", dest, index * 4);
+ }
+ else
+ {
+ Inst_Printf("la", "%s,%d($2)", dest, index * 4);
+ }
+ if ((offset + double_args) > 3)
+ {
+ Inst_Printf("sw", "%s,%d($sp)", dest, (offset + double_args +
double_pad) * 4);
+ }
+ return 1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_ARG_FOREIGN_D *
+ * *
+ *-------------------------------------------------------------------------*/
+int
+Call_C_Arg_Foreign_D(int offset, int adr_of, int index)
+{
+ char *dest;
+
+ if (adr_of)
+ {
+ seen_int_arg = 1;
+
+ switch (offset + double_args)
+ {
+ case 0:
+ dest = "$4";
+ break;
+ case 1:
+ dest = "$5";
+ break;
+ case 2:
+ dest = "$6";
+ break;
+ case 3:
+ dest = "$7";
+ break;
+ default:
+ dest = "$24";
+ break;
+ }
+ Inst_Printf("la", "%s,foreign_double", dest);
+ Inst_Printf("addu", "%s,%d", dest, index * 8);
+ if ((offset + double_args) > 3)
+ {
+ Inst_Printf("sw", "%s,%d($sp)", dest, (offset + double_args +
double_pad) * 4);
+ }
+ }
+ else
+ {
+ Inst_Printf("la", "$24,foreign_double");
+ if (!seen_int_arg && (double_args == 0 || double_args == 1))
+ {
+ switch (offset)
+ {
+ case 0:
+ dest = "$f12";
+ break;
+ case 1:
+ dest = "$f14";
+ break;
+ default:
+ /* shall never happen */
+ break;
+ }
+ Inst_Printf("l.d", "%s,%d($24)", dest, index * 8);
+ }
+ else
+ {
+ dest = "$f4";
+ Inst_Printf("l.d", "%s,%d($24)", dest, index * 8);
+ if ((offset + double_args) & 1)
+ {
+ double_pad++;
+ }
+ Inst_Printf("s.d", "%s,%d($sp)", dest, (offset + double_args +
double_pad) * 4);
+ }
+ double_args++;
+ }
+ return 1;
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_INVOKE *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Call_C_Invoke(char *fct_name, int nb_args)
+{
+/* if (!make_inline (fct_name, nb_args)) { */
+ Inst_Printf("sw", "$gp,%d($sp)", MAX_C_ARGS_IN_C_CODE * 4 + 4);
+ Inst_Printf("sw", "$31,%d($sp)", MAX_C_ARGS_IN_C_CODE * 4 + 0);
+ Inst_Printf("la", "$25,%s", fct_name);
+ Inst_Printf("jalr", "$25");
+ Inst_Printf("lw", "$gp,%d($sp)", MAX_C_ARGS_IN_C_CODE * 4 + 4);
+ Inst_Printf("lw", "$31,%d($sp)", MAX_C_ARGS_IN_C_CODE * 4 + 0);
+/* } */
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CALL_C_STOP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Call_C_Stop(char *fct_name, int nb_args, char **p_inline)
+{
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * JUMP_RET *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Jump_Ret(void)
+{
+ Inst_Printf("move", "$25,$2");
+ Inst_Printf("jr", "$25");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * FAIL_RET *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Fail_Ret(void)
+{
+ Inst_Printf("bne", "$2,$0,.Lcont%d", w_label);
+ Pl_Fail();
+ Label_Printf(".Lcont%d:", w_label++);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_RET_TO_MEM_L *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_Ret_To_Mem_L(char *name, int index)
+{
+ Inst_Printf("la", "$13,%s", name);
+ Inst_Printf("sw", "$2,%d($13)", index * 4);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_RET_TO_REG_X *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_Ret_To_Reg_X(int index)
+{ /* same as Move_To_Reg_X */
+ Inst_Printf("sw", "$2,%d(%s)", index * 4, asm_reg_bank);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_RET_TO_REG_Y *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_Ret_To_Reg_Y(int index)
+{ /* same as Move_To_Reg_Y */
+#ifdef MAP_REG_E
+ Inst_Printf("sw", "$2,%d(%s)", Y_OFFSET(index), asm_reg_e);
+#else
+ Inst_Printf("lw", "$13,%s", asm_reg_e);
+ Inst_Printf("sw", "$2,%d($13)", Y_OFFSET(index));
+#endif
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_RET_TO_FOREIGN_L *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_Ret_To_Foreign_L(int index)
+{
+ Inst_Printf("la", "$13,foreign_long");
+ Inst_Printf("sw", "$2,%d($13)", index * 4);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * MOVE_RET_TO_FOREIGN_D *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Move_Ret_To_Foreign_D(int index)
+{
+ Inst_Printf("la", "$13,foreign_double");
+ Inst_Printf("s.d", "$f0,%d($13)", index * 8);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * CMP_RET_AND_INT *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Cmp_Ret_And_Int(long int_val)
+{
+ Inst_Printf("li", "$24,%d", int_val);
+ Inst_Printf("sub", "$12,$2,$24"); /* $2 - $24 -> $12 */
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * JUMP_IF_EQUAL *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Jump_If_Equal(char *label)
+{
+ Inst_Printf("beqz", "$12,%s", label); /* $12 == 0 */
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * JUMP_IF_GREATER *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Jump_If_Greater(char *label)
+{
+ Inst_Printf("bgtz", "$12,%s", label); /* $12 > 0 */
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * C_RET *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+C_Ret(void)
+{
+ Inst_Printf("lw", "$gp,%d($sp)", MAX_C_ARGS_IN_C_CODE * 4 + 4);
+ Inst_Printf("lw", "$31,%d($sp)", MAX_C_ARGS_IN_C_CODE * 4 + 0);
+ Inst_Printf("addiu", "$sp,%d", MAX_C_ARGS_IN_C_CODE * 4 + 16);
+ Inst_Printf("jr", "$31");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * DICO_STRING_START *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Dico_String_Start(int nb_consts)
+{
+ Label_Printf(".section\t.rodata");
+ Inst_Printf(".align", "3");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * DICO_STRING *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Dico_String(int str_no, char *asciiz)
+{
+
+ Label_Printf("%s%d:", STRING_PREFIX, str_no);
+ Inst_Printf(".ascii", "%s", asciiz);
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * DICO_STRING_STOP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Dico_String_Stop(int nb_consts)
+{
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * DICO_LONG_START *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Dico_Long_Start(int nb_longs)
+{
+ Label_Printf(".section\t.sdata");
+ Inst_Printf(".align", "3");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * DICO_LONG *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Dico_Long(char *name, int global, VType vtype, long value)
+{
+ switch (vtype)
+ {
+ case NONE:
+ value = 1; /* then in case ARRAY_SIZE */
+ case ARRAY_SIZE:
+ Label_Printf(".section\t.bss");
+ if (!global)
+ {
+ Label_Printf("%s:", name);
+ Inst_Printf(".align", "3");
+ Inst_Printf(".space", "%d", value * 4);
+ /* Inst_Printf(".popsection",""); */
+ }
+ else
+ {
+ Inst_Printf(".comm", "%s,%d", name, value * 4);
+ }
+ break;
+
+ case INITIAL_VALUE:
+ Label_Printf(".section\t.rodata");
+ if (global)
+ {
+ Inst_Printf(".globl", "%s", name);
+ Inst_Printf(".align", "3");
+ Inst_Printf(".size", "%s,4", name);
+ Label_Printf("%s:", name);
+ Inst_Printf(".word", "%d", value);
+ }
+ else
+ {
+ Inst_Printf(".align", "3");
+ Inst_Printf(".size", "%s,4", name);
+ Label_Printf("%s:", name);
+ Inst_Printf(".word", "%d", value);
+ }
+ break;
+ }
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * DICO_LONG_STOP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Dico_Long_Stop(int nb_longs)
+{
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * DATA_START *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Data_Start(char *initializer_fct)
+{
+ /* last routine has to be closed first */
+ if (act_routine[0] != '\0')
+ {
+ Inst_Printf("jr", "$31");
+ Inst_Printf(".end", "%s", act_routine);
+
+ act_routine[0] = '\0';
+ }
+
+ if (initializer_fct == NULL)
+ return;
+
+ Label_Printf("\t.section\t.rodata");
+ Label_Printf("\t.data");
+ Inst_Printf(".align", "3");
+ Inst_Printf(".size", "obj_chain_start,16");
+ Label_Printf("obj_chain_start:");
+
+ Inst_Printf(".word", "%d", OBJ_CHAIN_MAGIC_1);
+ Inst_Printf(".word", "%d", OBJ_CHAIN_MAGIC_2);
+ Inst_Printf(".word", "obj_chain_stop");
+ Inst_Printf(".word", "%s", initializer_fct);
+
+ Inst_Printf(".align", "3");
+ Inst_Printf(".size", "obj_chain_stop,4");
+ Label_Printf("obj_chain_stop:");
+ Inst_Printf(".word", "obj_chain_start");
+}
+
+
+
+
+/*-------------------------------------------------------------------------*
+ * DATA_STOP *
+ * *
+ *-------------------------------------------------------------------------*/
+void
+Data_Stop(char *initializer_fct)
+{
+ if (initializer_fct == NULL)
+ return;
+}
diff -uprN gprolog-1.2.18.old/src/src/configure.in
gprolog-1.2.18/src/src/configure.in
--- gprolog-1.2.18.old/src/src/configure.in 2005-10-30 21:49:13.000000000
+0100
+++ gprolog-1.2.18/src/src/configure.in 2005-10-28 22:06:20.000000000 +0200
@@ -308,7 +308,7 @@ else
WIN32=no
case "$host_cpu" in
- mips) AC_DEFINE(M_mips);;
+ mips*) AC_DEFINE(M_mips);;
alpha*) AC_DEFINE(M_alpha);;
sparc*) AC_DEFINE(M_sparc);;
i*86) AC_DEFINE(M_ix86);;
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]