1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-28 05:50:30 +02:00

Add the jit_callee_save_p interface and extra register definitions.

* check/self.c, check/self.ok: New files implementing simple
	consistency check assertions. At first validating some macros
	that use values from different sources agree.

	* check/Makefile.am: Update for the new test case.

	* include/lightning.h,  lib/lightning.c: Add the new
	jit_callee_save_p() call, that is intended to be used when
	writing complex code using lightning, so that one does not
	need to verify what backend is being used, or have access to
	private data, to query if a register is callee save or not;
	on several backends the scratch registers are actually callee
	save.

	* include/lightning/jit_aarch64.h, include/lightning/jit_arm.h,
	include/lightning/jit_hppa.h, include/lightning/jit_mips.h,
	include/lightning/jit_ppc.h, include/lightning/jit_sparc.h,
	include/lightning/jit_x86.h: Add an explicit definition for
	JIT_R3-JIT_Rn, JIT_V3-JIT_Vn and JIT_F6-JIT_Fn when applicable.
	This allows one to write code based on "#if defined(JIT_XN)"
	and therefore, not need to check what is the current backend
	or have access to private data structures. This is particularly
	useful when writing virtual machines with several specialized,
	global registers.

	* lib/jit_ia64.c: Properly flag the callee save general
	purpose registers as such, so that jit_callee_save_p() works
	as intended.
This commit is contained in:
pcpa 2013-09-10 21:41:49 -03:00
parent 15a3ec2567
commit a62f405751
14 changed files with 228 additions and 98 deletions

View file

@ -39,7 +39,7 @@ typedef enum {
#endif
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 13)
#define jit_f(i) (_F14 + (i))
#define jit_f_num() 6
#define jit_f_num() 8
_R0,
#if __ppc__
# define JIT_R0 _R11
@ -77,33 +77,8 @@ typedef enum {
#define JIT_FP _R31
_R31,
#define JIT_RA0 _R3
#define JIT_RA1 _R4
#define JIT_RA2 _R5
#define JIT_RA3 _R6
#define JIT_RA4 _R7
#define JIT_RA5 _R8
#define JIT_RA6 _R9
#define JIT_RA7 _R10
_R10, _R9, _R8, _R7, _R6, _R5, _R4, _R3,
_F0,
#define JIT_FS0 _F14
#define JIT_FS1 _F15
#define JIT_FS2 _F16
#define JIT_FS3 _F17
#define JIT_FS4 _F18
#define JIT_FS5 _F19
#define JIT_FS6 _F20
#define JIT_FS7 _F21
#define JIT_FS8 _F22
#define JIT_FS9 _F23
#define JIT_FS10 _F24
#define JIT_FS11 _F25
#define JIT_FS12 _F26
#define JIT_FS13 _F27
#define JIT_FS14 _F28
#define JIT_FS15 _F29
#define JIT_FS16 _F30
#define JIT_FS17 _F31
_F14, _F15, _F16, _F17, _F18, _F19, _F20, _F21,
#define JIT_F0 _F14
#define JIT_F1 _F15
@ -111,23 +86,13 @@ typedef enum {
#define JIT_F3 _F17
#define JIT_F4 _F18
#define JIT_F5 _F19
/* FIXME _F20-_F31 not (easily) accesible and only _F14-_F21
#define JIT_F6 _F20
#define JIT_F7 _F21
/* FIXME _F20-_F31 not (easily) accessible and only _F14-_F21
* saved/restored (if used) */
_F22, _F23, _F24, _F25, _F26, _F27, _F28, _F29,
_F30, _F31,
#define JIT_FA0 _F1
#define JIT_FA1 _F2
#define JIT_FA2 _F3
#define JIT_FA3 _F4
#define JIT_FA4 _F5
#define JIT_FA5 _F6
#define JIT_FA6 _F7
#define JIT_FA7 _F8
#define JIT_FA8 _F9
#define JIT_FA9 _F10
#define JIT_FA10 _F11
#define JIT_FA11 _F12
#define JIT_FA12 _F13
_F13, _F12, _F11, _F10, _F9, _F8, _F7, _F6,
_F5, _F4, _F3, _F2, _F1,
_NOREG,