[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lightning] [PATCH] Export argument registers
From: |
Paulo César Pereira de Andrade |
Subject: |
Re: [Lightning] [PATCH] Export argument registers |
Date: |
Mon, 14 Oct 2019 09:58:03 -0300 |
Em sex, 11 de out de 2019 às 15:26, Paul Cercueil
<address@hidden> escreveu:
Hi,
> Provide the JIT_A_NUM and JIT_A(n) macros to target the registers that
> are dedicated to register passing in function calls.
>
> These registers are safe to be used as long as it is understood that
> they will be trashed as soon as a function is called, and must not be
> used to pass parameters to a function (jit_pushargr/i should be used
> instead).
>
> Signed-off-by: Paul Cercueil <address@hidden>
> ---
> include/lightning.h.in | 2 ++
> include/lightning/jit_aarch64.h | 10 ++++++++++
> include/lightning/jit_alpha.h | 8 ++++++++
> include/lightning/jit_arm.h | 6 ++++++
> include/lightning/jit_hppa.h | 6 ++++++
> include/lightning/jit_ia64.h | 10 ++++++++++
> include/lightning/jit_mips.h | 14 ++++++++++++++
> include/lightning/jit_ppc.h | 10 ++++++++++
> include/lightning/jit_riscv.h | 10 ++++++++++
> include/lightning/jit_s390.h | 6 ++++++
> include/lightning/jit_sparc.h | 10 ++++++++++
> include/lightning/jit_x86.h | 15 +++++++++++++++
> 12 files changed, 107 insertions(+)
>
> diff --git a/include/lightning.h.in b/include/lightning.h.in
> index fe3abe9..00ecde4 100644
> --- a/include/lightning.h.in
> +++ b/include/lightning.h.in
> @@ -157,9 +157,11 @@ typedef jit_int32_t jit_fpr_t;
>
> #define JIT_R(index) jit_r(index)
> #define JIT_V(index) jit_v(index)
> +#define JIT_A(index) jit_a(index)
> #define JIT_F(index) jit_f(index)
> #define JIT_R_NUM jit_r_num()
> #define JIT_V_NUM jit_v_num()
> +#define JIT_A_NUM jit_a_num()
> #define JIT_F_NUM jit_f_num()
>
> #define JIT_DISABLE_DATA 1 /* force synthesize of constants */
> diff --git a/include/lightning/jit_aarch64.h b/include/lightning/jit_aarch64.h
> index 6e7d8be..3e32c75 100644
> --- a/include/lightning/jit_aarch64.h
> +++ b/include/lightning/jit_aarch64.h
> @@ -32,6 +32,8 @@ typedef enum {
> #define jit_r_num() 7
> #define jit_v(i) (_R19 + (i))
> #define jit_v_num() 10
> +#define jit_a_num() 8
> +#define jit_a(i) (_V0 - (i))
> #define jit_f(i) (_V8 + (i))
> #define jit_f_num() 8
> #define JIT_R0 _R9
> @@ -80,6 +82,14 @@ typedef enum {
> /* callee save */
> _V8, _V9, _V10, _V11,
> _V12, _V13, _V14, _V15,
> +#define JIT_A0 _V0
> +#define JIT_A1 _V1
> +#define JIT_A2 _V2
> +#define JIT_A3 _V3
> +#define JIT_A4 _V4
> +#define JIT_A5 _V5
> +#define JIT_A6 _V6
> +#define JIT_A7 _V7
> _V7, _V6, _V5, _V4, /* arguments */
> _V3, _V2, _V1, _V0,
> _NOREG,
> diff --git a/include/lightning/jit_alpha.h b/include/lightning/jit_alpha.h
> index 9bae343..6bab63f 100644
> --- a/include/lightning/jit_alpha.h
> +++ b/include/lightning/jit_alpha.h
> @@ -32,6 +32,8 @@ typedef enum {
> #define jit_r_num() 3
> #define jit_v(i) (_S3 + (i))
> #define jit_v_num() 3
> +#define jit_a(i) (_A0 - (i))
> +#define jit_a_num() 6
> #define jit_f(i) (_F2 + (i))
> #define jit_f_num() 8
> /* Volatile - Assembly temporary register */
> @@ -57,6 +59,12 @@ typedef enum {
> _S4, _S5,
> /* Nonvolatile - Frame pointer */
> _FP,
> +#define JIT_A0 _A0
> +#define JIT_A1 _A1
> +#define JIT_A2 _A2
> +#define JIT_A3 _A3
> +#define JIT_A4 _A4
> +#define JIT_A5 _A5
> /* Volatile - Argument registers */
> _A5, _A4, _A3, _A2,
> _A1, _A0,
> diff --git a/include/lightning/jit_arm.h b/include/lightning/jit_arm.h
> index 81451f1..7fa2417 100644
> --- a/include/lightning/jit_arm.h
> +++ b/include/lightning/jit_arm.h
> @@ -36,6 +36,8 @@ typedef enum {
> #define jit_r_num() 3
> #define jit_v(i) (_R7 + (i))
> #define jit_v_num() 3
> +#define jit_a(i) (_R0 - (i))
> +#define jit_a_num() 4
> #define jit_f(i) (jit_cpu.abi ? _D8 + ((i)<<1) : _D0 -
> ((i)<<1))
> #define jit_f_num() 8
> _R12, /* ip - temporary */
> @@ -56,6 +58,10 @@ typedef enum {
> _R13, /* sp - stack pointer */
> _R14, /* lr - link register */
> _R15, /* pc - program counter */
> +#define JIT_A3 _R3
> +#define JIT_A2 _R2
> +#define JIT_A1 _R1
> +#define JIT_A0 _R0
> _R3, /* r3 - argument/result */
> _R2, /* r2 - argument/result */
> _R1, /* r1 - argument/result */
> diff --git a/include/lightning/jit_hppa.h b/include/lightning/jit_hppa.h
> index ddc3950..cf88876 100644
> --- a/include/lightning/jit_hppa.h
> +++ b/include/lightning/jit_hppa.h
> @@ -34,6 +34,8 @@ typedef enum {
> #define jit_r(n) ((n) < 3 ? _R4 + (n) : _R10 + (n) - 3)
> #define jit_v_num() 11
> #define jit_v(n) ((n) < 3 ? _R7 + (n) : _R11 + (n) - 3)
> +#define jit_a_num() 4
> +#define jit_a(n) (_R26 - (n))
> #define jit_f_num() 8
> #define jit_f(n) (_F12 - (n))
> #define JIT_FP _R3
> @@ -74,6 +76,10 @@ typedef enum {
> _R16,
> _R17,
> _R18,
> +#define JIT_A0 _R26
> +#define JIT_A1 _R25
> +#define JIT_A2 _R24
> +#define JIT_A3 _R23
> _R23, /* arg3 */
> _R24, /* arg2 */
> _R25, /* arg1 */
> diff --git a/include/lightning/jit_ia64.h b/include/lightning/jit_ia64.h
> index 718f191..01231d2 100644
> --- a/include/lightning/jit_ia64.h
> +++ b/include/lightning/jit_ia64.h
> @@ -40,6 +40,8 @@ typedef enum {
> #define jit_r(n) (_R40 + (n))
> #define jit_v_num() 4
> #define jit_v(n) (_R44 + (n))
> +#define jit_a_num() 8
> +#define jit_a(n) (_R39 - (n))
> _R0, /* constant - Always 0 */
> _R1, /* special - Global Data pointer (gp) */
> /* r2-r3 - scratch - Use with 22-bit immediate add - scratch */
> @@ -55,6 +57,14 @@ typedef enum {
> _R31, _R30,
> _R29, _R28, _R27, _R26, _R25, _R24, _R23, _R22,
> _R21, _R20, _R19, _R18, _R17, _R16, _R15, _R14,
> +#define JIT_A0 _R39
> +#define JIT_A1 _R38
> +#define JIT_A2 _R37
> +#define JIT_A3 _R36
> +#define JIT_A4 _R35
> +#define JIT_A5 _R34
> +#define JIT_A6 _R33
> +#define JIT_A7 _R32
> /* r32-r39 - aka in0-in7 - Incoming register arguments */
> _R32, _R33, _R34, _R35, _R36, _R37, _R38, _R39,
> /* r40-r127 - loc0...locn,out0...outn */
> diff --git a/include/lightning/jit_mips.h b/include/lightning/jit_mips.h
> index eb7d783..a927af4 100644
> --- a/include/lightning/jit_mips.h
> +++ b/include/lightning/jit_mips.h
> @@ -40,6 +40,12 @@ typedef enum {
> #endif
> #define jit_v(i) (_S0 + (i))
> #define jit_v_num() 8
> +# define jit_a(i) (_A0 - (i))
> +#if NEW_ABI
> +# define jit_a_num() 8
> +#else
> +# define jit_a_num() 4
> +#endif
> #define jit_f(i) (_F0 + (i))
> #if NEW_ABI
> # define jit_f_num() 6
> @@ -84,8 +90,16 @@ typedef enum {
> _GP,
> _SP, _FP,
> #if NEW_ABI
> +#define JIT_A7 _A7
> +#define JIT_A6 _A6
> +#define JIT_A5 _A5
> +#define JIT_A4 _A4
> _A7, _A6, _A5, _A4,
> #endif
> +#define JIT_A3 _A3
> +#define JIT_A2 _A2
> +#define JIT_A1 _A1
> +#define JIT_A0 _A0
> _A3, _A2, _A1, _A0,
> #define JIT_F0 _F0
> #define JIT_F1 _F2
> diff --git a/include/lightning/jit_ppc.h b/include/lightning/jit_ppc.h
> index f1bdbcb..0c0b08f 100644
> --- a/include/lightning/jit_ppc.h
> +++ b/include/lightning/jit_ppc.h
> @@ -31,6 +31,8 @@ typedef enum {
> #define jit_r_num() 3
> #define jit_v(i) (_R27 - (i))
> #define jit_v_num() 14
> +#define jit_a(i) (_R3 - (i))
> +#define jit_a_num() 8
> #define jit_f(i) (_F14 + (i))
> #define jit_f_num() 8
> _R0,
> @@ -58,6 +60,14 @@ typedef enum {
> _R1,
> #define JIT_FP _R31
> _R31,
> +#define JIT_A0 _R3
> +#define JIT_A1 _R4
> +#define JIT_A2 _R5
> +#define JIT_A3 _R6
> +#define JIT_A4 _R7
> +#define JIT_A5 _R8
> +#define JIT_A6 _R9
> +#define JIT_A7 _R10
> _R10, _R9, _R8, _R7, _R6, _R5, _R4, _R3,
> _F0,
> _F14, _F15, _F16, _F17, _F18, _F19, _F20, _F21,
> diff --git a/include/lightning/jit_riscv.h b/include/lightning/jit_riscv.h
> index 1b4f93d..39cd6a1 100644
> --- a/include/lightning/jit_riscv.h
> +++ b/include/lightning/jit_riscv.h
> @@ -32,6 +32,8 @@ typedef enum {
> #define jit_r_num() 7
> #define jit_v(i) (JIT_V0 + (i))
> #define jit_v_num() 11
> +#define jit_a(i) (JIT_A0 - (i))
> +#define jit_a_num() 8
> #define jit_f(i) (JIT_F0 + (i))
> #define jit_f_num() 12
> _ZERO, /* x0 - Hard-wired zero --- */
> @@ -84,6 +86,14 @@ typedef enum {
> _S9, /* x25 - Saved register (CalleE save) */
> _S10, /* x26 - Saved register (CalleE save) */
> _S11, /* x27 - Saved register (CalleE save) */
> +#define JIT_A0 _A0
> +#define JIT_A1 _A1
> +#define JIT_A2 _A2
> +#define JIT_A3 _A3
> +#define JIT_A4 _A4
> +#define JIT_A5 _A5
> +#define JIT_A6 _A6
> +#define JIT_A7 _A7
> _A7, /* x17 - Function argument (CalleR save) */
> _A6, /* x16 - Function argument (CalleR save) */
> _A5, /* x15 - Function argument (CalleR save) */
> diff --git a/include/lightning/jit_s390.h b/include/lightning/jit_s390.h
> index 6ab196b..6ae9b73 100644
> --- a/include/lightning/jit_s390.h
> +++ b/include/lightning/jit_s390.h
> @@ -32,6 +32,8 @@ typedef enum {
> #define jit_r_num() 3
> #define jit_v(i) (_R11 + ((i) << 1))
> #define jit_v_num() 3
> +#define jit_a(i) (_R2 - (i))
> +#define jit_a_num() 4
> #define jit_f(i) (_F8 + (i))
> #define jit_f_num() 6
> #define JIT_R0 _R12
> @@ -44,6 +46,10 @@ typedef enum {
> _R12, /* Saved, GOT */
> _R11, _R10, _R9, _R8, /* Saved */
> _R7, /* Saved */
> +#define JIT_A0 _R2
> +#define JIT_A1 _R3
> +#define JIT_A2 _R4
> +#define JIT_A3 _R5
> _R6, /* Saved, parameter */
> _R5, _R4, _R3, /* Parameter passing */
> _R2, /* Volatile, parameter and return value */
> diff --git a/include/lightning/jit_sparc.h b/include/lightning/jit_sparc.h
> index bee440b..97aa20b 100644
> --- a/include/lightning/jit_sparc.h
> +++ b/include/lightning/jit_sparc.h
> @@ -32,6 +32,8 @@ typedef enum {
> #define jit_r_num() 3
> #define jit_v(i) (_L0 + (i))
> #define jit_v_num() 8
> +#define jit_a(i) (_I0 + (i))
> +#define jit_a_num() 8
> #if __WORDSIZE == 32
> # define jit_f(i) (_F0 + ((i) << 1))
> # define jit_f_num() 8
> @@ -53,6 +55,14 @@ typedef enum {
> _G0, _G1, _G2, _G3, _G4, _G5, _G6, _G7,
> _O0, _O1, _O2, _O3, _O4, _O5, _SP, _O7,
> _L0, _L1, _L2, _L3, _L4, _L5, _L6, _L7,
> +#define JIT_A0 _I0
> +#define JIT_A1 _I1
> +#define JIT_A2 _I2
> +#define JIT_A3 _I3
> +#define JIT_A4 _I4
> +#define JIT_A5 _I5
> +#define JIT_A6 _I6
> +#define JIT_A7 _I7
> _I0, _I1, _I2, _I3, _I4, _I5, _FP, _I7,
> #if __WORDSIZE == 32
> # define JIT_F0 _F0
> diff --git a/include/lightning/jit_x86.h b/include/lightning/jit_x86.h
> index a278d06..122cf69 100644
> --- a/include/lightning/jit_x86.h
> +++ b/include/lightning/jit_x86.h
> @@ -48,6 +48,7 @@ typedef enum {
> # define jit_v_num() 3
> # define jit_f(i) (jit_cpu.sse2 ? _XMM0 + (i) : _ST0 + (i))
> # define jit_f_num() (jit_cpu.sse2 ? 8 : 6)
> +# define jit_a_num() 0
> # define JIT_R0 _RAX
> # define JIT_R1 _RCX
> # define JIT_R2 _RDX
> @@ -71,9 +72,11 @@ typedef enum {
> # define jit_r(i) (_RAX + (i))
> # define jit_r_num() 3
> # define jit_v(i) (_RBX + (i))
> +# define jit_a(i) (_RCX - (i))
> # define jit_v_num() 7
> # define jit_f(index) (_XMM4 + (index))
> # define jit_f_num() 12
> +# define jit_a_num() 4
> # define JIT_R0 _RAX
> # define JIT_R1 _R10
> # define JIT_R2 _R11
> @@ -91,6 +94,10 @@ typedef enum {
> /* Nonvolatile */
> _RBX, _RDI, _RSI,
> _R12, _R13, _R14, _R15,
> +# define JIT_A0 _RCX
> +# define JIT_A1 _RDX
> +# define JIT_A2 _R8
> +# define JIT_A3 _R9
> /* Volatile - Integer arguments (4 to 1) */
> _R9, _R8, _RDX, _RCX,
> /* Nonvolatile */
> @@ -119,7 +126,9 @@ typedef enum {
> # define jit_r(i) (_RAX + (i))
> # define jit_r_num() 3
> # define jit_v(i) (_RBX + (i))
> +# define jit_a(i) (_RDI - (i))
> # define jit_v_num() 5
> +# define jit_a_num() 6
> # define jit_f(index) (_XMM8 + (index))
> # define jit_f_num() 8
> # define JIT_R0 _RAX
> @@ -132,6 +141,12 @@ typedef enum {
> # define JIT_V3 _R15
> # define JIT_V4 _R12
> _RBX, _R13, _R14, _R15, _R12,
> +# define JIT_A0 _RDI
> +# define JIT_A1 _RSI
> +# define JIT_A2 _RDX
> +# define JIT_A3 _RCX
> +# define JIT_A4 _R8
> +# define JIT_A5 _R9
> _R9, _R8, _RCX, _RDX, _RSI, _RDI,
> _RSP, _RBP,
> # define JIT_F0 _XMM8
> --
> 2.23.0
This feature already existed on earlier versions of lightning 2,
and was droped due to being close to unmaintenable. Maybe you want
to revive it :)
Can you describe use cases of it?
Either way, I imagine it is to have extra long lived registers. If
not, I suggest using jit_get_reg and jit_unget_reg while generating the
IR. A register value returned by jit_get_reg before calling jit_emit
should be used for an as small as possible code range, and avoid using
it in branches (for example, use only to jump over an instruction).
Basically, jit_get_reg as exported will generate a spill/reload in the
range it is used. And then, when calling jit_emit, it will check these
registers, and if safe, will remove the spill/reload.
Using JIT_Ax (and JIT_FAx) might break badly when there are variadic
functions involved, and argument registers are already in the pool of
temporaries returned by jit_get_reg. Just that jit_get_reg should
prevent bugs by checking possible clobbers.
Thanks!
Paulo