1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-03 02:36:19 +02:00

Beginnings of ARMv7 backend

This commit is contained in:
Andy Wingo 2019-05-17 10:59:59 +02:00
parent 0da87968d1
commit b71ddba1f7
3 changed files with 2660 additions and 4814 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012-2018 Free Software Foundation, Inc.
* Copyright (C) 2012-2019 Free Software Foundation, Inc.
*
* This file is part of GNU lightning.
*
@ -20,108 +20,113 @@
#ifndef _jit_arm_h
#define _jit_arm_h
#define JIT_HASH_CONSTS 0
#define JIT_NUM_OPERANDS 3
/*
* Types
*/
#define jit_swf_p() (jit_cpu.vfp == 0)
#define jit_hardfp_p() jit_cpu.abi
#define jit_ldrt_strt_p() jit_cpu.ldrt_strt
#define JIT_NEEDS_LITERAL_POOL 1
#define JIT_FP _R11
typedef enum {
#define jit_r(i) (_R4 + (i))
#define jit_r_num() 3
#define jit_v(i) (_R7 + (i))
#define jit_v_num() 3
#define jit_f(i) (jit_cpu.abi ? _D8 + ((i)<<1) : _D0 - ((i)<<1))
#define jit_f_num() 8
_R12, /* ip - temporary */
#define JIT_R0 _R4
#define JIT_R1 _R5
#define JIT_R2 _R6
_R4, /* r4 - variable */
_R5, /* r5 - variable */
_R6, /* r6 - variable */
#define JIT_V0 _R7
#define JIT_V1 _R8
#define JIT_V2 _R9
_R7, /* r7 - variable */
_R8, /* r8 - variable */
_R9, /* r9 - variable */
_R10, /* sl - stack limit */
_R11, /* fp - frame pointer */
_R13, /* sp - stack pointer */
_R14, /* lr - link register */
_R15, /* pc - program counter */
_R3, /* r3 - argument/result */
_R2, /* r2 - argument/result */
_R1, /* r1 - argument/result */
_R0, /* r0 - argument/result */
#define JIT_F0 (jit_hardfp_p() ? _D8 : _D0)
#define JIT_F1 (jit_hardfp_p() ? _D9 : _D1)
#define JIT_F2 (jit_hardfp_p() ? _D10 : _D2)
#define JIT_F3 (jit_hardfp_p() ? _D11 : _D3)
#define JIT_F4 (jit_hardfp_p() ? _D12 : _D4)
#define JIT_F5 (jit_hardfp_p() ? _D13 : _D5)
#define JIT_F6 (jit_hardfp_p() ? _D14 : _D6)
#define JIT_F7 (jit_hardfp_p() ? _D15 : _D7)
_S16, _D8 = _S16, _Q4 = _D8,
_S17,
_S18, _D9 = _S18,
_S19,
_S20, _D10 = _S20, _Q5 = _D10,
_S21,
_S22, _D11 = _S22,
_S23,
_S24, _D12 = _S24, _Q6 = _D12,
_S25,
_S26, _D13 = _S26,
_S27,
_S28, _D14 = _S28, _Q7 = _D14,
_S29,
_S30, _D15 = _S30,
_S31,
_S15,
_S14, _D7 = _S14,
_S13,
_S12, _D6 = _S12, _Q3 = _D6,
_S11,
_S10, _D5 = _S10,
_S9,
_S8, _D4 = _S8, _Q2 = _D4,
_S7,
_S6, _D3 = _S6,
_S5,
_S4, _D2 = _S4, _Q1 = _D2,
_S3,
_S2, _D1 = _S2,
_S1,
_S0, _D0 = _S0, _Q0 = _D0,
_NOREG,
#define JIT_NOREG _NOREG
} jit_reg_t;
#define _R0 JIT_GPR(0)
#define _R1 JIT_GPR(1)
#define _R2 JIT_GPR(2)
#define _R3 JIT_GPR(3)
#define _R4 JIT_GPR(4)
#define _R5 JIT_GPR(5)
#define _R6 JIT_GPR(6)
#define _R7 JIT_GPR(7)
#define _R8 JIT_GPR(8)
#define _R9 JIT_GPR(9)
#define _R10 JIT_GPR(10)
#define _R11 JIT_GPR(11)
#define _R12 JIT_GPR(12)
#define _R13 JIT_GPR(13)
#define _R14 JIT_GPR(14)
#define _R15 JIT_GPR(15)
typedef struct {
uint32_t version : 4;
uint32_t extend : 1;
/* only generate thumb instructions for thumb2 */
uint32_t thumb : 1;
uint32_t vfp : 3;
uint32_t neon : 1;
uint32_t abi : 2;
/* use strt+offset instead of str.w?
* on special cases it causes a SIGILL at least on qemu, probably
* due to some memory ordering constraint not being respected, so,
* disable by default */
uint32_t ldrt_strt : 1;
} jit_cpu_t;
#define _D0 JIT_FPR(0)
#define _D1 JIT_FPR(2)
#define _D2 JIT_FPR(4)
#define _D3 JIT_FPR(6)
#define _D4 JIT_FPR(8)
#define _D5 JIT_FPR(10)
#define _D6 JIT_FPR(12)
#define _D7 JIT_FPR(14)
#define _D8 JIT_FPR(16)
#define _D9 JIT_FPR(18)
#define _D10 JIT_FPR(20)
#define _D11 JIT_FPR(22)
#define _D12 JIT_FPR(24)
#define _D13 JIT_FPR(26)
#define _D14 JIT_FPR(28)
#define _D15 JIT_FPR(30)
#define _S0 JIT_FPR(0)
#define _S1 JIT_FPR(1)
#define _S2 JIT_FPR(2)
#define _S3 JIT_FPR(3)
#define _S4 JIT_FPR(4)
#define _S5 JIT_FPR(5)
#define _S6 JIT_FPR(6)
#define _S7 JIT_FPR(7)
#define _S8 JIT_FPR(8)
#define _S9 JIT_FPR(9)
#define _S10 JIT_FPR(10)
#define _S11 JIT_FPR(11)
#define _S12 JIT_FPR(12)
#define _S13 JIT_FPR(13)
#define _S14 JIT_FPR(14)
#define _S15 JIT_FPR(15)
#define _S16 JIT_FPR(16)
#define _S17 JIT_FPR(17)
#define _S18 JIT_FPR(18)
#define _S19 JIT_FPR(19)
#define _S20 JIT_FPR(20)
#define _S21 JIT_FPR(21)
#define _S22 JIT_FPR(22)
#define _S23 JIT_FPR(23)
#define _S24 JIT_FPR(24)
#define _S25 JIT_FPR(25)
#define _S26 JIT_FPR(26)
#define _S27 JIT_FPR(27)
#define _S28 JIT_FPR(28)
#define _S29 JIT_FPR(29)
#define _S30 JIT_FPR(30)
#define _S31 JIT_FPR(31)
#define _SP _R13
#define _LR _R14
#define _PC _R15
#define JIT_R0 _R0
#define JIT_R1 _R1
#define JIT_R2 _R2
#define JIT_R3 _R3
#define JIT_V0 _R4
#define JIT_V1 _R5
#define JIT_V2 _R6
#define JIT_V3 _R7
#define JIT_V4 _R8
#define JIT_V5 _R9
#define JIT_V6 _R10
#define JIT_V7 _R11
#define JIT_F0 _D0
#define JIT_F1 _D1
#define JIT_F2 _D2
#define JIT_F3 _D3
#define JIT_F4 _D4
#define JIT_F5 _D5
#define JIT_F6 _D6
#define JIT_F7 _D7
#define JIT_VF0 _D8
#define JIT_VF1 _D9
#define JIT_VF2 _D10
#define JIT_VF3 _D11
#define JIT_VF4 _D12
#define JIT_VF5 _D13
#define JIT_VF6 _D14
#define JIT_VF7 _D15
#define JIT_PLATFORM_CALLEE_SAVE_GPRS _LR
/*
* Initialization
*/
JIT_API jit_cpu_t jit_cpu;
#endif /* _jit_arm_h */