[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 217/437: Adjust lightning to work on ppc AIX.
From: |
Andy Wingo |
Subject: |
[Guile-commits] 217/437: Adjust lightning to work on ppc AIX. |
Date: |
Mon, 2 Jul 2018 05:14:24 -0400 (EDT) |
wingo pushed a commit to branch lightning
in repository guile.
commit 3e5a12f747f75e7f36de69e285197437bae1dbf0
Author: pcpa <address@hidden>
Date: Fri Jun 7 21:27:52 2013 -0300
Adjust lightning to work on ppc AIX.
Many thanks to Trent Nelson from snakebite.org for giving access to a
build farm with several different architectures and operating systems.
* check/lightning.c, lib/jit_disasm.c, lib/jit_ppc-cpu.c,
lib/jit_ppc-fpu.c, lib/jit_ppc.c, include/lightning.h,
include/lightning/jit_ppc.h, include/lightning/jit_private.h:
Adapt code to work on 32 bit AIX ppc using gcc. Most changes
are basically to adapt the elf64 logic to 32 bit, as it does
not use the same convention of 32 bit Darwin ppc.
* check/stack.tst: Add a fake memcpy function to the test
case if running under AIX, as it is not available to dlsym.
* configure.ac: Check for getopt.h header, not available in
AIX.
---
ChangeLog | 15 ++++++++
check/lightning.c | 65 ++++++++++++++++++++++++-------
check/stack.tst | 30 ++++++++++++++-
configure.ac | 2 +
include/lightning.h | 24 ++++++++++--
include/lightning/jit_ppc.h | 6 +--
include/lightning/jit_private.h | 2 +-
lib/jit_disasm.c | 6 ++-
lib/jit_ppc-cpu.c | 84 +++++++++++++++++++++++------------------
lib/jit_ppc-fpu.c | 2 +-
lib/jit_ppc.c | 31 ++++++++-------
11 files changed, 189 insertions(+), 78 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 1c0afba..24e97d7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2013-07-01 Paulo Andrade <address@hidden>
+
+ * check/lightning.c, lib/jit_disasm.c, lib/jit_ppc-cpu.c,
+ lib/jit_ppc-fpu.c, lib/jit_ppc.c, include/lightning.h,
+ include/lightning/jit_ppc.h, include/lightning/jit_private.h:
+ Adapt code to work on 32 bit AIX ppc using gcc. Most changes
+ are basically to adapt the elf64 logic to 32 bit, as it does
+ not use the same convention of 32 bit Darwin ppc.
+
+ * check/stack.tst: Add a fake memcpy function to the test
+ case if running under AIX, as it is not available to dlsym.
+
+ * configure.ac: Check for getopt.h header, not available in
+ AIX.
+
2013-06-01 Paulo Andrade <address@hidden>
* include/lightning/jit_hppa.h, lib/jit_hppa-cpu.c,
diff --git a/check/lightning.c b/check/lightning.c
index bf1e126..6ffbdc5 100644
--- a/check/lightning.c
+++ b/check/lightning.c
@@ -15,7 +15,15 @@
* Paulo Cesar Pereira de Andrade
*/
-#include <getopt.h>
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if HAVE_GETOPT_H
+# include <getopt.h>
+#else
+# include <unistd.h>
+#endif
#include <stdio.h>
#include <stdarg.h>
#include <lightning.h>
@@ -25,6 +33,11 @@
# include <fpu_control.h>
#endif
+/* The label_t identifier clashes with a definition in sys/types.h */
+#if defined(_AIX)
+# define label_t l_label_t
+#endif
+
#if defined(__GNUC__)
# define noreturn __attribute__ ((noreturn))
# define printf_format(f, v) __attribute__ ((format (printf, f, v)))
@@ -3769,25 +3782,34 @@ rehash(hash_t *hash)
static void
usage(void)
{
+#if HAVE_GETOPT_H
fprintf(stderr, "\
Usage: %s [jit assembler options] file [jit program options]\n\
Jit assembler options:\n\
-help Display this information\n\
-v[0-3] Verbose output level\n\
-D<macro>[=<val>] Preprocessor options\n"
-#if defined(__i386__) && __WORDSIZE == 32
+# if defined(__i386__) && __WORDSIZE == 32
" -mx87=1 Force using x87 when sse2 available\n"
-#endif
-#if defined(__i386__) || defined(__x86_64__)
+# endif
+# if defined(__i386__) || defined(__x86_64__)
" -msse4_1=0 Do not use sse4_1 instructions when available\n"
-#endif
-#if defined(__arm__)
+# endif
+# if defined(__arm__)
" -mcpu=<val> Force cpu version (4, 5, 6 or 7)\n\
-mthumb[=0|1] Enable or disable thumb\n\
-mvfp=<val> Set vpf version (0 to disable)\n\
-mneon[=0|1] Enable or disable neon\n"
-#endif
+# endif
, progname);
+#else
+ fprintf(stderr, "\
+Usage: %s [jit assembler options] file [jit program options]\n\
+Jit assembler options:\n\
+ -h Display this information\n\
+ -v Verbose output level\n\
+ -D<macro>[=<val>] Preprocessor options\n", progname);
+#endif
finish_jit();
exit(1);
}
@@ -3795,23 +3817,26 @@ Jit assembler options:\n\
int
main(int argc, char *argv[])
{
+#if HAVE_GETOPT_H
static const char *short_options = "v::";
static struct option long_options[] = {
{ "help", 0, 0, 'h' },
-#if defined(__i386__) && __WORDSIZE == 32
+# if defined(__i386__) && __WORDSIZE == 32
{ "mx87", 2, 0, '7' },
-#endif
-#if defined(__i386__) || defined(__x86_64__)
+# endif
+# if defined(__i386__) || defined(__x86_64__)
{ "msse4_1", 2, 0, '4' },
-#endif
-#if defined(__arm__)
+# endif
+# if defined(__arm__)
{ "mcpu", 2, 0, 'c' },
{ "mthumb", 2, 0, 't' },
{ "mvfp", 2, 0, 'f' },
{ "mneon", 2, 0, 'n' },
-#endif
+# endif
{ 0, 0, 0, 0 }
};
+#else
+#endif /* HAVE_GETOPT_H */
int offset;
char *endptr;
int opt_index;
@@ -3822,6 +3847,7 @@ main(int argc, char *argv[])
init_jit(progname);
+#if HAVE_GETOPT_H
for (;;) {
if ((opt_short = getopt_long_only(argc, argv, short_options,
long_options, &opt_index)) < 0)
@@ -3903,6 +3929,14 @@ main(int argc, char *argv[])
#endif
}
}
+#else
+ while ((opt_short = getopt(argc, argv, "hv")) >= 0) {
+ if (opt_short == 'v')
+ ++flag_verbose;
+ else
+ usage();
+ }
+#endif
opt_index = optind;
if (opt_index < 0 || opt_index >= argc)
@@ -3980,6 +4014,11 @@ main(int argc, char *argv[])
sizeof(cmdline) - opt_short,
" -D__hppa__=1");
#endif
+#if defined(_AIX)
+ opt_short += snprintf(cmdline + opt_short,
+ sizeof(cmdline) - opt_short,
+ " -D_AIX=1");
+#endif
if ((parser.fp = popen(cmdline, "r")) == NULL)
error("cannot execute %s", cmdline);
diff --git a/check/stack.tst b/check/stack.tst
index be63dc3..e699719 100644
--- a/check/stack.tst
+++ b/check/stack.tst
@@ -181,7 +181,7 @@ test##T##_##N:
\
pushargr %v1 \
pushargr %v0 \
pushargi $(N * szof##T) \
- finishi @memcpy \
+ finishi MEMCPY \
/* stack buffer for next function in %v2 */ \
allocai $(M * szof##T) $index \
addi %v2 %fp $index \
@@ -235,7 +235,7 @@ test##T##_17:
\
pushargr %v1 \
pushargr %v2 \
pushargi $(16 * szof##T) \
- finishi @memcpy \
+ finishi MEMCPY \
/* call next function */ \
prepare \
pushargr %v2 \
@@ -286,6 +286,32 @@ ok:
.code
jmpi main
+#if _AIX
+# define MEMCPY memcpy
+/* error: Function not implemented (memcpy) */
+ name memcpy
+memcpy:
+ prolog
+ arg $dst
+ arg $src
+ arg $len
+ getarg %r0 $dst
+ getarg %r1 $src
+ getarg %r2 $len
+ movr %v1 %r0
+ blti memcpy_done %r2 1
+memcpy_loop:
+ subi %r2 %r2 1
+ ldxr_c %v0 %r1 %r2
+ stxr_c %r2 %r0 %v0
+ bgti memcpy_loop %r2 0
+memcpy_done:
+ retr %v1
+ epilog
+#else
+# define MEMCPY @memcpy
+#endif
+
FILL(_c)
FILL(_s)
FILL(_i)
diff --git a/configure.ac b/configure.ac
index 4c78588..edbb072 100644
--- a/configure.ac
+++ b/configure.ac
@@ -27,6 +27,8 @@ AC_PROG_LIBTOOL
AC_CHECK_FUNCS(mremap,,)
+AC_CHECK_HEADERS([getopt.h],,,)
+
AC_ARG_ENABLE(disassembler,
AS_HELP_STRING([--enable-disassembler],
[Enable jit disassembler using binutils]),
diff --git a/include/lightning.h b/include/lightning.h
index 3ff4748..ef21a15 100644
--- a/include/lightning.h
+++ b/include/lightning.h
@@ -28,16 +28,32 @@
#include <string.h>
#ifndef __WORDSIZE
-# define __WORDSIZE WORDSIZE
+# if defined(_AIX)
+# define __WORDSIZE (__SIZEOF_POINTER__ << 3)
+# else
+# define __WORDSIZE WORDSIZE
+# endif
#endif
#ifndef __BYTE_ORDER
-# define __BYTE_ORDER BYTE_ORDER
+# if defined(_AIX)
+# define __BYTE_ORDER __BYTE_ORDER__
+# else
+# define __BYTE_ORDER BYTE_ORDER
+# endif
#endif
#ifndef __LITTLE_ENDIAN
-# define __LITTLE_ENDIAN LITTLE_ENDIAN
+# if defined(_AIX)
+# define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__
+# else
+# define __LITTLE_ENDIAN LITTLE_ENDIAN
+# endif
#endif
#ifndef __BIG_ENDIAN
-# define __BIG_ENDIAN BIG_ENDIAN
+# if defined(_AIX)
+# define __BIG_ENDIAN __ORDER_BIG_ENDIAN__
+# else
+# define __BIG_ENDIAN BIG_ENDIAN
+# endif
#endif
typedef signed char jit_int8_t;
diff --git a/include/lightning/jit_ppc.h b/include/lightning/jit_ppc.h
index c4380e2..daca61c 100644
--- a/include/lightning/jit_ppc.h
+++ b/include/lightning/jit_ppc.h
@@ -28,7 +28,7 @@ typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 8)
#define jit_r(i) (_R11 + (i))
#define jit_r_num() 3
-#if __WORDSIZE == 32
+#if __ppc__
# define jit_v(i) (_R30 - (i))
# define jit_v_num() 17
#else
@@ -39,7 +39,7 @@ typedef enum {
#define jit_f(i) (_F14 + (i))
#define jit_f_num() 6
_R0,
-#if __WORDSIZE == 32
+#if __ppc__
# define JIT_R0 _R11
# define JIT_R1 _R12
# define JIT_R2 _R13
@@ -63,7 +63,7 @@ typedef enum {
#define JIT_V11 jit_v(11)
#define JIT_V12 jit_v(12)
#define JIT_V13 jit_v(13)
-#if __WORDSIZE == 32
+#if __ppc__
# define JIT_V14 jit_v(14)
# define JIT_V15 jit_v(15)
# define JIT_V16 jit_v(16)
diff --git a/include/lightning/jit_private.h b/include/lightning/jit_private.h
index 75dc1b7..f8d6cc2 100644
--- a/include/lightning/jit_private.h
+++ b/include/lightning/jit_private.h
@@ -405,7 +405,7 @@ struct jit_compiler {
jit_int32_t values[1024]; /* pending constants */
jit_word_t patches[2048];
} consts;
-#elif __powerpc64__ || __ia64__
+#elif __powerpc__ || __ia64__
/* Keep track of prolog addresses, just for the sake of making
* jit that starts with a jump to a "main" label work like other
* backends. */
diff --git a/lib/jit_disasm.c b/lib/jit_disasm.c
index 3708886..eb85f6e 100644
--- a/lib/jit_disasm.c
+++ b/lib/jit_disasm.c
@@ -81,12 +81,16 @@ jit_init_debug(void)
if (jit_cpu.thumb)
disasm_info.disassembler_options = "force-thumb";
# endif
-# if defined(__powerpc64__)
+# if defined(__powerpc__)
disasm_info.arch = bfd_arch_powerpc;
disasm_info.mach = bfd_mach_ppc64;
+ disassemble_init_powerpc(&disasm_info);
+# if defined(__powerpc64__)
disasm_info.disassembler_options = "64";
+# endif
disassemble_init_powerpc(&disasm_info);
# endif
+
# if defined(__sparc__)
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
# endif
diff --git a/lib/jit_ppc-cpu.c b/lib/jit_ppc-cpu.c
index 5abbf58..eca8581 100644
--- a/lib/jit_ppc-cpu.c
+++ b/lib/jit_ppc-cpu.c
@@ -35,7 +35,11 @@
# define fpr_save_area 64
# define alloca_offset -(gpr_save_area + fpr_save_area)
# define ii(i) *_jit->pc.ui++ = i
-# define il(i) *_jit->pc.ul++ = i
+# if __WORDSIZE == 32
+# define iw(i) *_jit->pc.ui++ = i
+# else
+# define iw(i) *_jit->pc.ul++ = i
+# endif
# define can_sign_extend_short_p(im) ((im) >= -32768 && (im) <= 32767)
# define can_zero_extend_short_p(im) ((im) >= 0 && (im) <= 65535)
# define can_sign_extend_jump_p(im) ((im) >= -33554432 && (im) <= 33554431)
@@ -45,9 +49,11 @@
# define _R11_REGNO 11
# define _FP_REGNO 31
# if __WORDSIZE == 32
+# define ldr(r0,r1) ldr_i(r0,r1)
# define ldxi(r0,r1,i0) ldxi_i(r0,r1,i0)
# define stxi(i0,r0,r1) stxi_i(i0,r0,r1)
# else
+# define ldr(r0,r1) ldr_l(r0,r1)
# define ldxi(r0,r1,i0) ldxi_l(r0,r1,i0)
# define stxi(i0,r0,r1) stxi_l(i0,r0,r1)
# endif
@@ -2992,26 +2998,26 @@ _jmpi_p(jit_state_t *_jit, jit_word_t i0)
static void
_callr(jit_state_t *_jit, jit_int32_t r0)
{
-# if __WORDSIZE == 64
- stxi(40, _SP_REGNO, _R2_REGNO);
+# if __powerpc__
+ stxi(sizeof(void*) * 5, _SP_REGNO, _R2_REGNO);
/* FIXME Pretend to not know about r11? */
if (r0 == _R0_REGNO) {
movr(_R11_REGNO, _R0_REGNO);
- ldxi(_R2_REGNO, _R11_REGNO, 8);
- ldxi(_R11_REGNO, _R11_REGNO, 16);
+ ldxi(_R2_REGNO, _R11_REGNO, sizeof(void*));
+ ldxi(_R11_REGNO, _R11_REGNO, sizeof(void*) * 2);
}
else {
- ldxi(_R2_REGNO, r0, 8);
- ldxi(_R11_REGNO, r0, 16);
+ ldxi(_R2_REGNO, r0, sizeof(void*));
+ ldxi(_R11_REGNO, r0, sizeof(void*) * 2);
}
- LDX(r0, _R0_REGNO, r0);
+ ldr(r0, r0);
# endif
MTCTR(r0);
BCTRL();
-# if __WORDSIZE == 64
- ldxi(_R2_REGNO, _SP_REGNO, 40);
+# if __powerpc__
+ ldxi(_R2_REGNO, _SP_REGNO, sizeof(void*) * 5);
# endif
}
@@ -3019,11 +3025,11 @@ _callr(jit_state_t *_jit, jit_int32_t r0)
static void
_calli(jit_state_t *_jit, jit_word_t i0)
{
-# if __WORDSIZE == 32
+# if __ppc__
jit_word_t d;
# endif
jit_int32_t reg;
-# if __WORDSIZE == 32
+# if __ppc__
d = (i0 - _jit->pc.w) & ~3;
if (can_sign_extend_jump_p(d))
BL(d);
@@ -3050,7 +3056,7 @@ _calli_p(jit_state_t *_jit, jit_word_t i0)
return (w);
}
-# if __WORDSIZE == 64
+# if __powerpc__
/* order is not guaranteed to be sequential */
static jit_int32_t save[] = {
_R14, _R15, _R16, _R17, _R18, _R19, _R20, _R21, _R22,
@@ -3074,7 +3080,7 @@ _prolog(jit_state_t *_jit, jit_node_t *node)
/* params >= %r31+params_offset+(8*sizeof(jit_word_t))
* alloca < %r31-80 */
-# if __WORDSIZE == 32
+#if __ppc__
/* save any clobbered callee save gpr register */
regno = jit_regset_scan1(&_jitc->function->regset, _R14);
if (regno == ULONG_MAX || regno > _R31)
@@ -3086,23 +3092,26 @@ _prolog(jit_state_t *_jit, jit_node_t *node)
}
stxi(8, _SP_REGNO, _R0_REGNO);
- movr(_FP_REGNO, _SP_REGNO);
-
- STWU(_SP_REGNO, _SP_REGNO, -_jitc->function->stack);
-# else
- stxi(16, _SP_REGNO, _R0_REGNO);
- offset = -144;
- for (regno = 0; regno < jit_size(save); regno++, offset += 8) {
+#else /* __powerpc__ */
+ stxi(sizeof(void*) * 2, _SP_REGNO, _R0_REGNO);
+ offset = -gpr_save_area;
+ for (regno = 0; regno < jit_size(save); regno++, offset += sizeof(void*)) {
if (jit_regset_tstbit(&_jitc->function->regset, save[regno]))
stxi(offset, _SP_REGNO, rn(save[regno]));
}
for (offset = 0; offset < 8; offset++) {
if (jit_regset_tstbit(&_jitc->function->regset, _F14 + offset))
- stxi_d(-(152 + offset * 8), _SP_REGNO, rn(_F14 + offset));
+ stxi_d(-(gpr_save_area + 8 + offset * 8),
+ _SP_REGNO, rn(_F14 + offset));
}
- stxi(-8, _SP_REGNO, _FP_REGNO);
+ stxi(-(sizeof(void*)), _SP_REGNO, _FP_REGNO);
+#endif
+
movr(_FP_REGNO, _SP_REGNO);
+#if __WORDSIZE == 32
+ STWU(_SP_REGNO, _SP_REGNO, -_jitc->function->stack);
+#else
STDU(_SP_REGNO, _SP_REGNO, -_jitc->function->stack);
#endif
}
@@ -3113,7 +3122,7 @@ _epilog(jit_state_t *_jit, jit_node_t *node)
unsigned long regno;
jit_word_t offset;
-#if __WORDSIZE == 32
+#if __ppc__
LWZ(_SP_REGNO, _SP_REGNO, 0);
ldxi(_R0_REGNO, _SP_REGNO, 8);
@@ -3128,21 +3137,22 @@ _epilog(jit_state_t *_jit, jit_node_t *node)
ldxi_d(rn(_F14 + offset), _SP_REGNO, -fpr_save_area + offset * 8);
}
-#else
+#else /* __powerpc__ */
addi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
- ldxi(_R0_REGNO, _SP_REGNO, 16);
- offset = -144;
- for (regno = 0; regno < jit_size(save); regno++, offset += 8) {
+ ldxi(_R0_REGNO, _SP_REGNO, sizeof(void*) * 2);
+ offset = -gpr_save_area;
+ for (regno = 0; regno < jit_size(save); regno++, offset += sizeof(void*)) {
if (jit_regset_tstbit(&_jitc->function->regset, save[regno]))
ldxi(rn(save[regno]), _SP_REGNO, offset);
}
for (offset = 0; offset < 8; offset++) {
if (jit_regset_tstbit(&_jitc->function->regset, _F14 + offset))
- ldxi_d(rn(_F14 + offset), _SP_REGNO, -(152 + offset * 8));
+ ldxi_d(rn(_F14 + offset), _SP_REGNO,
+ -(gpr_save_area + 8 + offset * 8));
}
MTLR(_R0_REGNO);
- ldxi(_FP_REGNO, _SP_REGNO, -8);
+ ldxi(_FP_REGNO, _SP_REGNO, -(sizeof(void*)));
#endif
BLR();
@@ -3169,24 +3179,24 @@ _patch_at(jit_state_t *_jit, jit_word_t instr,
jit_word_t label)
u.i[0] = (u.i[0] & ~0xfffd) | (d & 0xfffe);
break;
case 18: /* Bx */
-# if __powerpc64__
+#if __powerpc__
if (_jitc->jump && (!(u.i[0] & 1))) { /* jmpi label */
/* zero is used for toc and env, so, quick check
* if this is a "jmpi main" like initial jit
* instruction */
if (((long *)label)[1] == 0 && ((long *)label)[2] == 0) {
for (d = 0; d < _jitc->prolog.offset; d++) {
- /* not so pretty, but hides powerpc64
+ /* not so pretty, but hides powerpc
* specific abi intrinsics and/or
* implementation from user */
if (_jitc->prolog.ptr[d] == label) {
- label += 24;
+ label += sizeof(void*) * 3;
break;
}
}
}
}
-# endif
+#endif
d = label - instr;
assert(!(d & 3));
if (!can_sign_extend_jump_p(d)) {
@@ -3197,13 +3207,13 @@ _patch_at(jit_state_t *_jit, jit_word_t instr,
jit_word_t label)
u.i[0] = (u.i[0] & ~0x3fffffd) | (d & 0x3fffffe);
break;
case 15: /* LI */
-# if __WORDSIZE == 32
+#if __WORDSIZE == 32
assert(!(u.i[0] & 0x1f0000));
u.i[0] = (u.i[0] & ~0xffff) | ((label >> 16) & 0xffff);
assert((u.i[1] & 0xfc000000) >> 26 == 24); /* ORI */
assert(((u.i[1] >> 16) & 0x1f) == ((u.i[1] >> 21) & 0x1f));
u.i[1] = (u.i[1] & ~0xffff) | (label & 0xffff);
-# else
+#else
assert(!(u.i[0] & 0x1f0000));
u.i[0] = (u.i[0] & ~0xffff) | ((label >> 48) & 0xffff);
assert((u.i[1] & 0xfc000000) >> 26 == 24); /* ORI */
@@ -3221,7 +3231,7 @@ _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t
label)
assert((u.i[5] & 0xfc000000) >> 26 == 24); /* ORI */
assert(((u.i[5] >> 16) & 0x1f) == ((u.i[5] >> 21) & 0x1f));
u.i[5] = (u.i[5] & ~0xffff) | (label & 0xffff);
-# endif
+#endif
break;
default:
assert(!"unhandled branch opcode");
diff --git a/lib/jit_ppc-fpu.c b/lib/jit_ppc-fpu.c
index 5dd93f5..75d552a 100644
--- a/lib/jit_ppc-fpu.c
+++ b/lib/jit_ppc-fpu.c
@@ -21,7 +21,7 @@
static void _FA(jit_state_t*,int,int,int,int,int,int,int);
#define FXFL(o,m,b,x) _FXFL(_jit,o,m,b,x,0)
#define FXFL_(o,m,b,x) _FXFL(_jit,o,m,b,x,1)
-static void _FXFL(jit_state_t*,int,int,int,int,int);
+static void _FXFL(jit_state_t*,int,int,int,int,int) maybe_unused;
# define FABS(d,b) FX(63,d,0,b,264)
# define FABS_(d,b) FX_(63,d,0,b,264)
diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c
index 89782f9..a2e6401 100644
--- a/lib/jit_ppc.c
+++ b/lib/jit_ppc.c
@@ -37,7 +37,7 @@ extern void __clear_cache(void *, void *);
*/
jit_register_t _rvs[] = {
{ rc(gpr) | 0, "r0" },
-#if __WORDSIZE == 32
+#if __ppc__
{ rc(gpr) | 11, "r11" },
{ rc(gpr) | 12, "r12" },
{ rc(gpr) | 13, "r13" },
@@ -761,7 +761,7 @@ _emit_code(jit_state_t *_jit)
jit_node_t *node;
jit_word_t word;
jit_word_t patch_offset;
-#if __powerpc64__
+#if __powerpc__
jit_word_t prolog_offset;
#endif
} undo;
@@ -773,13 +773,13 @@ _emit_code(jit_state_t *_jit)
undo.word = 0;
undo.node = NULL;
undo.patch_offset = 0;
-#if __powerpc64__
- undo.prolog_offset = 0;
+#if __powerpc__
+ undo.prolog_offset = 0;
/* code may start with a jump so add an initial function descriptor */
- il(_jit->pc.w + 24); /* addr */
- il(0); /* toc */
- il(0); /* env */
+ iw(_jit->pc.w + sizeof(void*) * 3); /* addr */
+ iw(0); /* toc */
+ iw(0); /* env */
#endif
#define case_rr(name, type) \
@@ -1233,8 +1233,8 @@ _emit_code(jit_state_t *_jit)
jmpr(rn(node->u.w));
break;
case jit_code_jmpi:
-#if __powerpc64__
- if (_jit->pc.uc == _jit->code.ptr + 24)
+#if __powerpc__
+ if (_jit->pc.uc == _jit->code.ptr + sizeof(void*) * 3)
_jitc->jump = 1;
#endif
temp = node->u.n;
@@ -1268,12 +1268,12 @@ _emit_code(jit_state_t *_jit)
undo.node = node;
undo.word = _jit->pc.w;
undo.patch_offset = _jitc->patches.offset;
-#if __powerpc64__
+#if __powerpc__
undo.prolog_offset = _jitc->prolog.offset;
#endif
restart_function:
_jitc->again = 0;
-#if __powerpc64__
+#if __powerpc__
if (_jitc->jump) {
/* remember prolog to hide offset adjustment for a jump
* to the start of a function, what is expected to be
@@ -1287,9 +1287,9 @@ _emit_code(jit_state_t *_jit)
}
_jitc->prolog.ptr[_jitc->prolog.offset++] = _jit->pc.w;
/* function descriptor */
- il(_jit->pc.w + 24); /* addr */
- il(0); /* toc */
- il(0); /* env */
+ iw(_jit->pc.w + sizeof(void*) * 3); /* addr */
+ iw(0); /* toc */
+ iw(0); /* env */
}
#endif
prolog(node);
@@ -1307,7 +1307,7 @@ _emit_code(jit_state_t *_jit)
node = undo.node;
_jit->pc.w = undo.word;
_jitc->patches.offset = undo.patch_offset;
-#if __powerpc64__
+#if __powerpc__
_jitc->prolog.offset = undo.prolog_offset;
#endif
goto restart_function;
@@ -1393,7 +1393,6 @@ static void
_patch(jit_state_t *_jit, jit_word_t instr, jit_node_t *node)
{
jit_int32_t flag;
- jit_word_t *patches;
assert(node->flag & jit_flag_node);
if (node->code == jit_code_movi)
- [Guile-commits] 05/437: use autoheader like every other package in this world, (continued)
- [Guile-commits] 05/437: use autoheader like every other package in this world, Andy Wingo, 2018/07/02
- [Guile-commits] 341/437: Add missing float rsbi strings, Andy Wingo, 2018/07/02
- [Guile-commits] 296/437: ALPHA: Implement lightning Alpha port., Andy Wingo, 2018/07/02
- [Guile-commits] 207/437: Correct race condition if register is written more than once, Andy Wingo, 2018/07/02
- [Guile-commits] 394/437: Move multiply defined macro to a single header file., Andy Wingo, 2018/07/02
- [Guile-commits] 366/437: Correct inconsistency with jit_regno_patch, Andy Wingo, 2018/07/02
- [Guile-commits] 421/437: Remove documentation from embedded GNU lightning, Andy Wingo, 2018/07/02
- [Guile-commits] 195/437: Minor updates when testing on a prototype, quadcore Loongson mips., Andy Wingo, 2018/07/02
- [Guile-commits] 332/437: Add test case to check possible issues with 2 contexts, Andy Wingo, 2018/07/02
- [Guile-commits] 189/437: Pass all but the (not yet implemented) qmul and qdiv tests in sparc, Andy Wingo, 2018/07/02
- [Guile-commits] 217/437: Adjust lightning to work on ppc AIX.,
Andy Wingo <=
- [Guile-commits] 223/437: Build and pass all tests on big endian Irix mips using the n32 abi., Andy Wingo, 2018/07/02
- [Guile-commits] 205/437: Properly split instruction groups for predicate registers., Andy Wingo, 2018/07/02
- [Guile-commits] 391/437: aarch64: Correct va_list offsets and double load., Andy Wingo, 2018/07/02
- [Guile-commits] 304/437: Correct typo in documentation., Andy Wingo, 2018/07/02
- [Guile-commits] 409/437: Correct binutils version detection, Andy Wingo, 2018/07/02
- [Guile-commits] 310/437: Allow jit_jmpi on an immediate constant address., Andy Wingo, 2018/07/02
- [Guile-commits] 264/437: ARM: Do not use ldrt/strt by default, Andy Wingo, 2018/07/02
- [Guile-commits] 244/437: HPPA: Correct bogus logic when calling function pointers., Andy Wingo, 2018/07/02
- [Guile-commits] 273/437: x86: Ensure the x87 stack is empty when calling a function., Andy Wingo, 2018/07/02
- [Guile-commits] 126/437: Cleanup on preparation for lightning rework., Andy Wingo, 2018/07/02