mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-05 11:40:20 +02:00
Change _ASM_SAFETY register width check to accept valid alternate values.
The checks were moved from i386/asm.h to i386/asm-{32,64}.h, as well as some macros from core-{32,64}.h. Now it checks if the value is in the range of a valid register, and in the proper register class, what should prevent the common mistake of calling a jit*r_x macro passing an immediate as argument. Now it pass lightning's make check in i386/x86_64, as well as all test cases in http://code.google.com/p/exl/source/browse/trunk/check/lightning when compiled with -D_ASM_SAFETY.
This commit is contained in:
parent
d4a2a1ba07
commit
8665ce16da
6 changed files with 103 additions and 36 deletions
|
@ -543,8 +543,10 @@ typedef union jit_code {
|
|||
#define jit_extr_i_ul(d, rs) jit_movr_i(d, rs)
|
||||
|
||||
/* Unary */
|
||||
#ifndef jit_movi_l
|
||||
#define jit_movi_l(d, rs) jit_movi_i((d), (rs))
|
||||
#define jit_movr_l(d, rs) jit_movr_i((d), (rs))
|
||||
#endif
|
||||
|
||||
/* Stack */
|
||||
#define jit_pushr_l(rs) jit_pushr_i(rs)
|
||||
|
|
|
@ -43,11 +43,59 @@
|
|||
* + sr/sm = a star preceding a register or memory
|
||||
*/
|
||||
|
||||
#if defined(_ASM_SAFETY)
|
||||
#define _r1(R) ( ((R) & ~3) == _AL || ((R) & ~3) == _AH ? _rN(R) : JITFAIL( "8-bit register required"))
|
||||
#if !_ASM_SAFETY
|
||||
# define _r1(R) _rN(R)
|
||||
# define _r2(R) _rN(R)
|
||||
# define _r4(R) _rN(R)
|
||||
# define _r8(R) _rN(R)
|
||||
# define _rM(R) _rN(R)
|
||||
# define _rX(R) _rN(R)
|
||||
#else
|
||||
/* _r1() used to check only for _AL and _AH but there is
|
||||
* usage of _CL and _DL when _*AX is already an operand */
|
||||
# define _r1(R) \
|
||||
/* Valid 32 bit register? */ \
|
||||
((!((R) & ~0x77) \
|
||||
/* 32, 16 or 8 bit register? */ \
|
||||
&& (((_rC(R) == 0x40 || _rC(R) == 0x30 || _rC(R) == 0x10) \
|
||||
/* Yes. Register is _AL, _CL or _DL? */ \
|
||||
&& ( (_rN(R) | 0x10) == _AL \
|
||||
|| (_rN(R) | 0x10) == _CL \
|
||||
|| (_rN(R) | 0x10) == _DL)) \
|
||||
/* No. Register is _AH? */ \
|
||||
|| ((_rC(R) == 0x20 && (_rN(R) | 0x20) == _AH)))) \
|
||||
? _rN(R) : JITFAIL("bad 8-bit register " #R))
|
||||
# define _r2(R) \
|
||||
/* Valid 32 bit register? */ \
|
||||
((!((R) & ~0x77) \
|
||||
/* 32, 16 or 8 bit register? */ \
|
||||
&& (_rC(R) == 0x40 || _rC(R) == 0x30 || _rC(R) == 0x10)) \
|
||||
? _rN(R) : JITFAIL("bad 16-bit register " #R))
|
||||
# define _r4(R) \
|
||||
/* Valid 32 bit register? */ \
|
||||
((!((R) & ~0x77) \
|
||||
/* 32, 16 or 8 bit register? */ \
|
||||
&& (_rC(R) == 0x40 || _rC(R) == 0x30 || _rC(R) == 0x10)) \
|
||||
? _rN(R) : JITFAIL("bad 32-bit register " #R))
|
||||
# define _r8(R) \
|
||||
JITFAIL("bad 64-bit register " #R)
|
||||
# define _rM(R) \
|
||||
/* Valid MMX register? */ \
|
||||
((!((R) & ~0x67) && _rC(R) == 0x60) \
|
||||
? _rN(R) : JITFAIL("bad MMX register " #R))
|
||||
# define _rX(R) \
|
||||
/* Valid SSE register? */ \
|
||||
((!((R) & ~0x77) && _rC(R) == 0x70) \
|
||||
? _rN(R) : JITFAIL("bad SSE register " #R))
|
||||
#endif
|
||||
|
||||
#define _rA(R) _r4(R)
|
||||
#define _rA(R) _r4(R)
|
||||
|
||||
#define jit_check8(rs) ((_rN(rs) | _AL) == _AL)
|
||||
#define jit_reg8(rs) \
|
||||
((jit_reg16(rs) == _SI || jit_reg16(rs) == _DI) \
|
||||
? _AL : (_rN(rs) | _AL))
|
||||
#define jit_reg16(rs) (_rN(rs) | _AX)
|
||||
|
||||
/* Use RIP-addressing in 64-bit mode, if possible */
|
||||
#define _r_X( R, D,B,I,S,O) (_r0P(I) ? (_r0P(B) ? _r_D (R,D ) : \
|
||||
|
|
|
@ -43,8 +43,57 @@
|
|||
* + sr/sm = a star preceding a register or memory
|
||||
*/
|
||||
|
||||
#if !_ASM_SAFETY
|
||||
# define _r1(R) _rN(R)
|
||||
# define _r2(R) _rN(R)
|
||||
# define _r4(R) _rN(R)
|
||||
# define _r8(R) _rN(R)
|
||||
# define _rM(R) _rN(R)
|
||||
# define _rX(R) _rN(R)
|
||||
#else
|
||||
# define _r1(R) \
|
||||
/* Valid 64 bit register? */ \
|
||||
((!((R) & ~0xff) \
|
||||
/* 64, 32, 16 or 8 bit register? */ \
|
||||
&& (_rC(R) == 0x50 || _rC(R) == 0x40 \
|
||||
|| _rC(R) == 0x30 || _rC(R) == 0x10)) \
|
||||
? _rN(R) : JITFAIL("bad 8-bit register " #R))
|
||||
# define _r2(R) \
|
||||
/* Valid 64 bit register? */ \
|
||||
((!((R) & ~0xff) \
|
||||
/* 64, 32, 16 or 8 bit register? */ \
|
||||
&& (_rC(R) == 0x50 || _rC(R) == 0x40 \
|
||||
|| _rC(R) == 0x30 || _rC(R) == 0x10)) \
|
||||
? _rN(R) : JITFAIL("bad 16-bit register " #R))
|
||||
# define _r4(R) \
|
||||
/* Valid 64 bit register? */ \
|
||||
((!((R) & ~0xff) \
|
||||
/* 64, 32, 16 or 8 bit register? */ \
|
||||
&& (_rC(R) == 0x50 || _rC(R) == 0x40 \
|
||||
|| _rC(R) == 0x30 || _rC(R) == 0x10)) \
|
||||
? _rN(R) : JITFAIL("bad 32-bit register " #R))
|
||||
# define _r8(R) \
|
||||
/* Valid 64 bit register? */ \
|
||||
((!((R) & ~0xff) \
|
||||
/* 64, 32, 16 or 8 bit register? */ \
|
||||
&& (_rC(R) == 0x50 || _rC(R) == 0x40 \
|
||||
|| _rC(R) == 0x30 || _rC(R) == 0x10)) \
|
||||
? _rN(R) : JITFAIL("bad 64-bit register " #R))
|
||||
# define _rM(R) \
|
||||
/* Valid MMX* register? */ \
|
||||
((!((R) & ~0x6f) && _rC(R) == 0x60) \
|
||||
? _rN(R) : JITFAIL("bad MMX register " #R))
|
||||
# define _rX(R) \
|
||||
/* Valid SSE2 register? */ \
|
||||
((!((R) & ~0x7f) && _rC(R) == 0x70) \
|
||||
? _rN(R) : JITFAIL("bad SSE2 register " #R))
|
||||
#endif
|
||||
|
||||
#define _rA(R) _r8(R)
|
||||
#define _rA(R) _r8(R)
|
||||
|
||||
#define jit_check8(rs) 1
|
||||
#define jit_reg8(rs) (_rR(rs) | _AL)
|
||||
#define jit_reg16(rs) (_rR(rs) | _AX)
|
||||
|
||||
/* Use RIP-addressing in 64-bit mode, if possible */
|
||||
#if 0
|
||||
|
@ -125,16 +174,6 @@
|
|||
#define _R15 0x5F
|
||||
#define _RIP -2
|
||||
|
||||
#if defined(_ASM_SAFETY)
|
||||
#define _r1(R) ( ((unsigned) _rC((R) - 16)) < (0x30 - 16) ? _rN(R) : JITFAIL( "8-bit register required"))
|
||||
|
||||
#if 0
|
||||
#define _r8(R) ( (_rC(R) == 0x50) ? _rN(R) : JITFAIL("64-bit register required"))
|
||||
#else
|
||||
#define _r8(R) ( (_rC(R) == 0x50) ? _rN(R) : _r4(R))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define _r1e8lP(R) ((int)(R) >= _SPL && (int)(R) <= _DIL)
|
||||
|
||||
#define DECWr(RD) (_d16(), _REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b001 ,_r2(RD) ))
|
||||
|
|
|
@ -129,20 +129,6 @@ typedef _uc jit_insn;
|
|||
#define _rN(R) ((R) & 0x07)
|
||||
#define _rXP(R) ((R) > 0 && _rR(R) > 7)
|
||||
|
||||
#if !defined(_ASM_SAFETY)
|
||||
#define _r1(R) _rN(R)
|
||||
#define _r2(R) _rN(R)
|
||||
#define _r4(R) _rN(R)
|
||||
#define _r8(R) _rN(R)
|
||||
#define _rM(R) _rN(R)
|
||||
#define _rX(R) _rN(R)
|
||||
#else
|
||||
#define _r2(R) ( (_rC(R) == 0x30) ? _rN(R) : JITFAIL("16-bit register required"))
|
||||
#define _r4(R) ( (_rC(R) == 0x40) ? _rN(R) : JITFAIL("32-bit register required"))
|
||||
#define _rM(R) ( (_rC(R) == 0x60) ? _rN(R) : JITFAIL("MMX register required"))
|
||||
#define _rX(R) ( (_rC(R) == 0x70) ? _rN(R) : JITFAIL("SSE register required"))
|
||||
#endif
|
||||
|
||||
#define _rbpP(R) (_rR(R) == _rR(_EBP))
|
||||
#define _rspP(R) (_rR(R) == _rR(_ESP))
|
||||
#define _rbp13P(R) (_rN(R) == _rN(_EBP))
|
||||
|
|
|
@ -122,11 +122,6 @@ struct jit_local_state {
|
|||
#define jit_patch_at(jump_pc,v) jit_patch_long_at(jump_pc, v)
|
||||
|
||||
/* Memory */
|
||||
|
||||
#define jit_check8(rs) ( (rs) <= _EBX )
|
||||
#define jit_reg8(rs) ( ((rs) == _SI || (rs) == _DI) ? _AL : (_rN(rs) | _AL ))
|
||||
#define jit_reg16(rs) ( _rN(rs) | _AX )
|
||||
|
||||
#define jit_replace(s, rep, op) \
|
||||
(jit_pushr_i(rep), \
|
||||
MOVLrr((s), (rep)), \
|
||||
|
|
|
@ -241,9 +241,6 @@ static int jit_arg_reg_order[] = { _EDI, _ESI, _EDX, _ECX, _R8D, _R9D };
|
|||
/* Memory */
|
||||
|
||||
/* Used to implement ldc, stc, ... We have SIL and friends which simplify it all. */
|
||||
#define jit_check8(rs) 1
|
||||
#define jit_reg8(rs) (_rR(rs) | _AL )
|
||||
#define jit_reg16(rs) (_rR(rs) | _AX )
|
||||
#define jit_movbrm(rs, dd, db, di, ds) MOVBrm(jit_reg8(rs), dd, db, di, ds)
|
||||
|
||||
#define jit_ldr_c(d, rs) MOVSBQmr(0, (rs), 0, 0, (d))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue