1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-03 13:20:26 +02:00

ALPHA: Implement lightning Alpha port.

* include/lightning/jit_alpha.h, lib/jit_alpha-cpu.c,
        lib/jit_alpha-fpu.c, lib/jit_alpha-sz.c, lib/jit_alpha.c:
	New files implementing a lightning Alpha port. Thanks
	to Trent Nelson and snakebit.net staff for providing access
	to an Alpha system.

        * check/float.tst, check/lightning.c, configure.ac,
        include/lightning.h, include/lightning/Makefile.am,
        include/lightning/jit_private.h, lib/Makefile.am,
        lib/jit_disasm.c, lib/jit_size.c, lib/lightning.c:
	Minor changes to adapt for the new Alpha port.
This commit is contained in:
pcpa 2014-08-10 11:48:35 -03:00
parent 53dd28d682
commit 05b88d9d45
16 changed files with 5979 additions and 12 deletions

View file

@ -1,3 +1,17 @@
2014-08-10 Paulo Andrade <pcpa@gnu.org>
* include/lightning/jit_alpha.h, lib/jit_alpha-cpu.c,
lib/jit_alpha-fpu.c, lib/jit_alpha-sz.c, lib/jit_alpha.c:
New files implementing a lightning Alpha port. Thanks
to Trent Nelson and snakebit.net staff for providing access
to an Alpha system.
* check/float.tst, check/lightning.c, configure.ac,
include/lightning.h, include/lightning/Makefile.am,
include/lightning/jit_private.h, lib/Makefile.am,
lib/jit_disasm.c, lib/jit_size.c, lib/lightning.c:
Minor changes to adapt for the new Alpha port.
2014-08-10 Paulo Andrade <pcpa@gnu.org> 2014-08-10 Paulo Andrade <pcpa@gnu.org>
* lib/lightning.c: Always mark JIT_RET and JIT_FRET as * lib/lightning.c: Always mark JIT_RET and JIT_FRET as

View file

@ -16,17 +16,25 @@ ok:
#if __mips__ || __sparc__ || __hppa__ #if __mips__ || __sparc__ || __hppa__
# define wnan x7f # define wnan x7f
#elif __arm__ || __aarch64__ #elif __arm__ || __aarch64__ || __alpha__
# define wnan 0 # define wnan 0
#else #else
# define wnan x80 # define wnan x80
#endif #endif
#if __mips__ || __arm__ || __ppc__ || __sparc__ || __hppa__ || __aarch64__ || __s390x__ #if __mips__ || __arm__ || __ppc__ || __sparc__ || __hppa__ || __aarch64__ || __s390x__
# define wpinf x7f # define wpinf x7f
#elif __alpha__
/* (at least) bug compatible with gcc 4.2.3 -ieee */
# define wpinf 0
#else #else
# define wpinf x80 # define wpinf x80
#endif #endif
#define wninf x80 #if __alpha__
/* (at least) bug compatible with gcc 4.2.3 -ieee */
# define wninf 0
#else
# define wninf x80
#endif
/* ensure result is correct and 0 or 1 in the result register */ /* ensure result is correct and 0 or 1 in the result register */
#define xtcmp(l, t, op, r0, f0, f1, li, ri) \ #define xtcmp(l, t, op, r0, f0, f1, li, ri) \

View file

@ -36,7 +36,7 @@
#endif #endif
/* The label_t identifier clashes with a system definitions */ /* The label_t identifier clashes with a system definitions */
#if defined(_AIX) || defined(__sun__) #if defined(_AIX) || defined(__sun__) || defined(__osf__)
# define label_t l_label_t # define label_t l_label_t
#endif #endif
@ -44,6 +44,8 @@
# define DL_HANDLE RTLD_NEXT # define DL_HANDLE RTLD_NEXT
#elif defined(__sgi) #elif defined(__sgi)
static void *DL_HANDLE; static void *DL_HANDLE;
#elif defined(__osf__)
# define DL_HANDLE NULL
#else #else
# define DL_HANDLE RTLD_DEFAULT # define DL_HANDLE RTLD_DEFAULT
#endif #endif
@ -4144,6 +4146,11 @@ main(int argc, char *argv[])
opt_short += snprintf(cmdline + opt_short, opt_short += snprintf(cmdline + opt_short,
sizeof(cmdline) - opt_short, sizeof(cmdline) - opt_short,
" -D__s390x__=1"); " -D__s390x__=1");
#endif
#if defined(__alpha__)
opt_short += snprintf(cmdline + opt_short,
sizeof(cmdline) - opt_short,
" -D__alpha__=1");
#endif #endif
if ((parser.fp = popen(cmdline, "r")) == NULL) if ((parser.fp = popen(cmdline, "r")) == NULL)
error("cannot execute %s", cmdline); error("cannot execute %s", cmdline);

View file

@ -23,6 +23,10 @@ AC_CONFIG_MACRO_DIR(m4)
AC_CONFIG_HEADERS(config.h) AC_CONFIG_HEADERS(config.h)
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LIBTOOL
case "$target_cpu" in case "$target_cpu" in
ia64) ia64)
case "$host_os" in case "$host_os" in
@ -39,16 +43,25 @@ case "$target_cpu" in
CFLAGS="$CFLAGS -D__c99 -Drestrict=";; CFLAGS="$CFLAGS -D__c99 -Drestrict=";;
*) ;; *) ;;
esac ;; esac ;;
alpha*)
case "$host_os" in
osf*)
# Get proper varargs and mmap prototypes and definitions
CFLAGS="$CFLAGS -D_ANSI_C_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_OSF_SOURCE -D_POSIX_C_SOURCE=199309L"
# Want to generate NaN with 0.0/0.0 and Inf with 1.0/0.0
if test x$GCC = "xyes"; then
CFLAGS="$CFLAGS -mieee"
else
CFLAGS="$CFLAGS -ieee_with_no_inexact"
fi ;;
*) ;;
esac ;;
*) ;; *) ;;
esac esac
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LIBTOOL
AC_CHECK_FUNCS(mremap ffsl getopt_long_only isnan isinf,,) AC_CHECK_FUNCS(mremap ffsl getopt_long_only isnan isinf,,)
AC_CHECK_HEADERS([getopt.h],,,) AC_CHECK_HEADERS([getopt.h stdint.h],,,)
AC_ARG_ENABLE(disassembler, AC_ARG_ENABLE(disassembler,
AS_HELP_STRING([--enable-disassembler], AS_HELP_STRING([--enable-disassembler],
@ -100,7 +113,7 @@ AC_ARG_ENABLE(devel-get-jit-size,
AM_CONDITIONAL(get_jit_size, [test $GET_JIT_SIZE = yes]) AM_CONDITIONAL(get_jit_size, [test $GET_JIT_SIZE = yes])
case "$host_os" in case "$host_os" in
*bsd*) SHLIB="" ;; *bsd*|osf*) SHLIB="" ;;
*hpux*) SHLIB="-ldld" ;; *hpux*) SHLIB="-ldld" ;;
*) SHLIB="-ldl" ;; *) SHLIB="-ldl" ;;
esac esac
@ -117,6 +130,7 @@ case "$target_cpu" in
hppa*) cpu=hppa ;; hppa*) cpu=hppa ;;
aarch64) cpu=aarch64 ;; aarch64) cpu=aarch64 ;;
s390x) cpu=s390x ;; s390x) cpu=s390x ;;
alpha*) cpu=alpha ;;
*) ;; *) ;;
esac esac
AM_CONDITIONAL(cpu_arm, [test cpu-$cpu = cpu-arm]) AM_CONDITIONAL(cpu_arm, [test cpu-$cpu = cpu-arm])
@ -128,6 +142,7 @@ AM_CONDITIONAL(cpu_ia64, [test cpu-$cpu = cpu-ia64])
AM_CONDITIONAL(cpu_hppa, [test cpu-$cpu = cpu-hppa]) AM_CONDITIONAL(cpu_hppa, [test cpu-$cpu = cpu-hppa])
AM_CONDITIONAL(cpu_aarch64, [test cpu-$cpu = cpu-aarch64]) AM_CONDITIONAL(cpu_aarch64, [test cpu-$cpu = cpu-aarch64])
AM_CONDITIONAL(cpu_s390x, [test cpu-$cpu = cpu-s390x]) AM_CONDITIONAL(cpu_s390x, [test cpu-$cpu = cpu-s390x])
AM_CONDITIONAL(cpu_alpha, [test cpu-$cpu = cpu-alpha])
# Test x87 if both, x87 and sse2 available # Test x87 if both, x87 and sse2 available
ac_cv_test_x86_x87= ac_cv_test_x86_x87=
@ -221,7 +236,7 @@ AM_CONDITIONAL(test_x86_x87, [test x$ac_cv_test_x86_x87 = xyes])
AM_CONDITIONAL(test_arm_arm, [test x$ac_cv_test_arm_arm = xyes]) AM_CONDITIONAL(test_arm_arm, [test x$ac_cv_test_arm_arm = xyes])
AM_CONDITIONAL(test_arm_swf, [test x$ac_cv_test_arm_swf = xyes]) AM_CONDITIONAL(test_arm_swf, [test x$ac_cv_test_arm_swf = xyes])
AM_CONDITIONAL(test_nodata, [test cpu-$cpu = cpu-mips -o cpu-$cpu = cpu-ppc -o cpu-$cpu = cpu-sparc -o cpu-$cpu = cpu-x86 -o cpu-$cpu = cpu-ia64 -o cpu-$cpu = cpu-hppa -o cpu-$cpu = cpu-s390x]) AM_CONDITIONAL(test_nodata, [test cpu-$cpu = cpu-mips -o cpu-$cpu = cpu-ppc -o cpu-$cpu = cpu-sparc -o cpu-$cpu = cpu-x86 -o cpu-$cpu = cpu-ia64 -o cpu-$cpu = cpu-hppa -o cpu-$cpu = cpu-s390x -o cpu-$cpu = cpu-alpha])
if test $cpu = arm; then if test $cpu = arm; then
AC_CHECK_LIB(m, sqrtf, , AC_CHECK_LIB(m, sqrtf, ,

View file

@ -26,12 +26,17 @@
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #if HAVE_STDINT_H
# include <stdint.h>
#endif
#include <string.h> #include <string.h>
#if defined(__hpux) && defined(__hppa__) #if defined(__hpux) && defined(__hppa__)
# include <machine/param.h> # include <machine/param.h>
#endif #endif
#if defined(__alpha__) && defined(__osf__)
# include <machine/endian.h>
#endif
#ifndef __WORDSIZE #ifndef __WORDSIZE
# if defined(WORDSIZE) /* ppc darwin */ # if defined(WORDSIZE) /* ppc darwin */
@ -137,6 +142,8 @@ typedef jit_int32_t jit_fpr_t;
# include <lightning/jit_aarch64.h> # include <lightning/jit_aarch64.h>
#elif defined(__s390x__) #elif defined(__s390x__)
# include <lightning/jit_s390x.h> # include <lightning/jit_s390x.h>
#elif defined(__alpha__)
# include <lightning/jit_alpha.h>
#endif #endif
#define jit_flag_node 0x00000001 /* patch node not absolute */ #define jit_flag_node 0x00000001 /* patch node not absolute */

View file

@ -55,3 +55,7 @@ if cpu_s390x
lightning_include_HEADERS = \ lightning_include_HEADERS = \
jit_s390x.h jit_s390x.h
endif endif
if cpu_alpha
lightning_include_HEADERS = \
jit_alpha.h
endif

View file

@ -0,0 +1,107 @@
/*
* Copyright (C) 2014 Free Software Foundation, Inc.
*
* This file is part of GNU lightning.
*
* GNU lightning is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU lightning 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 Lesser General Public
* License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#ifndef _jit_alpha_h
#define _jit_alpha_h
#define JIT_HASH_CONSTS 1
#define JIT_NUM_OPERANDS 3
/*
* Types
*/
#define JIT_FP _FP
typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 6)
#define jit_r(i) (_S0 + (i))
#define jit_r_num() 3
#define jit_v(i) (_S3 + (i))
#define jit_v_num() 3
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 6)
#define jit_f(i) (_F2 + (i))
#define jit_f_num() 8
/* Volatile - Assembly temporary register */
_AT,
/* Volatile - Return value register */
_V0,
/* Volatile - Temporary registers */
_T0, _T1, _T2, _T3,
_T4, _T5, _T6, _T7,
_T8, _T9, _T10, _T11,
/* FIXME Use callee save register for r0-r2 (instead of 12+ JIT_RN
* and 6 JIT_VN because division must call a function)
* FIX would be to create proper functions that do not clobber
* registers and inject/inline them in the jit */
#define JIT_R0 _S0
#define JIT_R1 _S1
#define JIT_R2 _S2
#define JIT_V0 _S3
#define JIT_V1 _S4
#define JIT_V2 _S5
/* Nonvolatile - Saved registers */
_S0, _S1, _S2, _S3,
_S4, _S5,
/* Nonvolatile - Frame pointer */
_FP,
/* Volatile - Argument registers */
_A5, _A4, _A3, _A2,
_A1, _A0,
/* Volatile - Return address register */
_RA,
/* Volatile - Temporary register */
_PV,
/* Nonvolatile - Global pointer */
_GP,
/* Nonvolatile - Stack pointer */
_SP,
/* Constant RAZ / writes ignored */
_ZERO,
#define JIT_F0 _F2
#define JIT_F1 _F3
#define JIT_F2 _F4
#define JIT_F3 _F5
#define JIT_F4 _F6
#define JIT_F5 _F7
#define JIT_F6 _F8
#define JIT_F7 _F9
/* Volatile - Return value register (real part) */
_F0,
/* Volatile - Return value register (imaginary part) */
_F1,
/* Nonvolatile - Saved registers */
_F2, _F3, _F4, _F5,
_F6, _F7, _F8, _F9,
/* Volatile - Temporary registers */
_F10, _F11, _F12, _F13,
_F14, _F15,
/* Volatile - Argument registers */
_F21, _F20, _F19, _F18,
_F17, _F16,
/* Volatile - Temporary registers */
_F22, _F23, _R24, _F25,
_F26, _F27, _F28, _F29,
_F30,
/* Constant - RAZ / writes ignored */
_F31,
/* Lightning internal invalid register identifier */
_NOREG,
#define JIT_NOREG _NOREG
} jit_reg_t;
#endif /* _jit_alpha_h */

View file

@ -116,6 +116,11 @@ typedef jit_uint64_t jit_regset_t;
# define JIT_RET _R2 # define JIT_RET _R2
# define JIT_FRET _F0 # define JIT_FRET _F0
typedef jit_uint32_t jit_regset_t; typedef jit_uint32_t jit_regset_t;
#elif defined(__alpha__)
# define JIT_SP _SP
# define JIT_RET _V0
# define JIT_FRET _F0
typedef jit_uint64_t jit_regset_t;
#endif #endif
#define jit_size(vector) (sizeof(vector) / sizeof((vector)[0])) #define jit_size(vector) (sizeof(vector) / sizeof((vector)[0]))
@ -355,7 +360,7 @@ struct jit_compiler {
jit_int32_t rout; /* first output register */ jit_int32_t rout; /* first output register */
jit_int32_t breg; /* base register for prolog/epilog */ jit_int32_t breg; /* base register for prolog/epilog */
#endif #endif
#if __mips__ || __ia64__ #if __mips__ || __ia64__ || __alpha__
jit_int32_t carry; jit_int32_t carry;
#define jit_carry _jitc->carry #define jit_carry _jitc->carry
#endif #endif

View file

@ -36,6 +36,10 @@ EXTRA_DIST = \
jit_aarch64-cpu.c \ jit_aarch64-cpu.c \
jit_aarch64-fpu.c \ jit_aarch64-fpu.c \
jit_aarch64-sz.c \ jit_aarch64-sz.c \
jit_alpha.c \
jit_alpha-cpu.c \
jit_alpha-fpu.c \
jit_alpha-sz.c \
jit_arm.c \ jit_arm.c \
jit_arm-cpu.c \ jit_arm-cpu.c \
jit_arm-swf.c \ jit_arm-swf.c \

2641
lib/jit_alpha-cpu.c Normal file

File diff suppressed because it is too large Load diff

1538
lib/jit_alpha-fpu.c Normal file

File diff suppressed because it is too large Load diff

350
lib/jit_alpha-sz.c Normal file
View file

@ -0,0 +1,350 @@
#if __WORDSIZE == 64
#define JIT_INSTR_MAX 76
0,
0,
0,
0,
0,
0,
0,
76,
0,
4,
32,
12,
40,
28,
28,
4,
32,
12,
40,
28,
28,
4,
32,
44,
56,
12,
32,
48,
72,
48,
72,
56,
56,
56,
56,
48,
72,
48,
72,
4,
32,
4,
32,
4,
32,
4,
4,
4,
4,
4,
4,
4,
4,
4,
4,
4,
8,
4,
8,
4,
4,
4,
4,
4,
8,
4,
8,
4,
8,
4,
8,
8,
12,
4,
32,
8,
8,
8,
8,
8,
8,
36,
12,
40,
4,
32,
12,
40,
4,
32,
4,
32,
12,
40,
4,
32,
16,
12,
8,
4,
16,
12,
8,
4,
8,
4,
16,
12,
8,
4,
4,
32,
4,
32,
4,
32,
4,
32,
8,
4,
8,
4,
8,
4,
8,
4,
8,
8,
8,
12,
8,
12,
8,
12,
8,
40,
8,
12,
8,
12,
8,
12,
8,
12,
8,
36,
8,
8,
8,
8,
28,
32,
16,
16,
28,
32,
16,
16,
28,
32,
16,
16,
28,
32,
16,
16,
0,
36,
8,
36,
68,
0,
8,
32,
8,
32,
8,
32,
8,
32,
4,
4,
8,
32,
56,
32,
56,
32,
56,
32,
56,
32,
56,
32,
56,
32,
56,
32,
56,
32,
56,
32,
56,
32,
56,
32,
56,
20,
44,
20,
44,
16,
16,
12,
4,
4,
24,
4,
32,
8,
4,
4,
32,
8,
4,
24,
48,
24,
48,
24,
48,
24,
48,
24,
48,
28,
52,
28,
52,
28,
52,
28,
52,
28,
52,
28,
52,
28,
52,
12,
36,
12,
36,
0,
8,
28,
8,
28,
8,
28,
8,
28,
4,
4,
8,
32,
52,
32,
52,
32,
52,
32,
52,
32,
52,
32,
52,
32,
52,
32,
52,
32,
52,
32,
52,
32,
52,
32,
52,
20,
40,
20,
40,
16,
16,
12,
4,
4,
20,
4,
32,
8,
4,
4,
32,
8,
4,
24,
44,
24,
44,
24,
44,
24,
44,
24,
44,
28,
48,
28,
48,
28,
48,
28,
48,
28,
48,
28,
48,
28,
48,
12,
32,
12,
32,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
#endif /* __WORDSIZE */

1253
lib/jit_alpha.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -100,6 +100,10 @@ jit_init_debug(char *progname)
disasm_info.mach = bfd_mach_s390_64; disasm_info.mach = bfd_mach_s390_64;
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG; disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
disasm_info.disassembler_options = "zarch"; disasm_info.disassembler_options = "zarch";
# endif
# if defined(__alpha__)
disasm_info.arch = bfd_arch_alpha;
disasm_info.mach = bfd_mach_alpha_ev6;
# endif # endif
disasm_info.print_address_func = disasm_print_address; disasm_info.print_address_func = disasm_print_address;
@ -117,7 +121,13 @@ jit_init_debug(char *progname)
if (bfd_get_file_flags(disasm_bfd) & DYNAMIC) { if (bfd_get_file_flags(disasm_bfd) & DYNAMIC) {
dyn_storage = bfd_get_dynamic_symtab_upper_bound(disasm_bfd); dyn_storage = bfd_get_dynamic_symtab_upper_bound(disasm_bfd);
# if defined(__alpha__)
/* XXX */
if (dyn_storage < 0)
dyn_storage = 0;
# else
assert(dyn_storage >= 0); assert(dyn_storage >= 0);
# endif
} }
else else
dyn_storage = 0; dyn_storage = 0;

View file

@ -48,6 +48,8 @@ static jit_int16_t _szs[jit_code_x86_retval_d + 1] = {
# include "jit_aarch64-sz.c" # include "jit_aarch64-sz.c"
# elif defined(__s390x__) # elif defined(__s390x__)
# include "jit_s390x-sz.c" # include "jit_s390x-sz.c"
# elif defined(__alpha__)
# include "jit_alpha-sz.c"
# endif # endif
#endif #endif
}; };

View file

@ -3113,4 +3113,6 @@ _patch_register(jit_state_t *_jit, jit_node_t *node, jit_node_t *link,
# include "jit_aarch64.c" # include "jit_aarch64.c"
#elif defined(__s390x__) #elif defined(__s390x__)
# include "jit_s390x.c" # include "jit_s390x.c"
#elif defined(__alpha__)
# include "jit_alpha.c"
#endif #endif