diff --git a/lightening/arm-cpu.c b/lightening/arm-cpu.c index 9d44699b9..923db7bbf 100644 --- a/lightening/arm-cpu.c +++ b/lightening/arm-cpu.c @@ -14,311 +14,300 @@ * License for more details. * * Authors: - * Paulo Cesar Pereira de Andrade + * Paulo Cesar Pereira de Andrade */ -#if PROTO -# define stxi(i0,r0,r1) stxi_i(i0,r0,r1) -# define ldxi(r0,r1,i0) ldxi_i(r0,r1,i0) -# define ldr(r0,r1) ldr_i(r0,r1) -# define _s20P(d) ((d) >= -(int)0x80000 && d <= 0x7ffff) -# define _s24P(d) ((d) >= -(int)0x800000 && d <= 0x7fffff) -# define _u3(v) ((v) & 0x7) -# define _u4(v) ((v) & 0xf) -# define _u5(v) ((v) & 0x1f) -# define _u8(v) ((v) & 0xff) -# define _u12(v) ((v) & 0xfff) -# define _u13(v) ((v) & 0x1fff) -# define _u16(v) ((v) & 0xffff) -# define _u24(v) ((v) & 0xffffff) -# define jit_thumb_p() jit_cpu.thumb -# define jit_no_set_flags() _jitc->no_set_flags -# define jit_armv5_p() (jit_cpu.version >= 5) -# define jit_armv5e_p() (jit_cpu.version > 5 || (jit_cpu.version == 5 && jit_cpu.extend)) -# define jit_armv6_p() (jit_cpu.version >= 6) -# define jit_armv7r_p() 0 -# define stack_framesize 48 -extern int __aeabi_idivmod(int, int); -extern unsigned __aeabi_uidivmod(unsigned, unsigned); -# define _R0_REGNO 0x00 -# define _R1_REGNO 0x01 -# define _R2_REGNO 0x02 -# define _R3_REGNO 0x03 -# define _R4_REGNO 0x04 -# define _R5_REGNO 0x05 -# define _R6_REGNO 0x06 -# define _R7_REGNO 0x07 -# define _R8_REGNO 0x08 -# define _R9_REGNO 0x09 -# define _R10_REGNO 0x0a -# define _R11_REGNO 0x0b -# define _R12_REGNO 0x0c -# define _R13_REGNO 0x0d -# define _R14_REGNO 0x0e -# define _R15_REGNO 0x0f -# define _FP_REGNO _R11_REGNO -# define _SP_REGNO _R13_REGNO -# define _LR_REGNO _R14_REGNO -# define _PC_REGNO _R15_REGNO -# define ARM_CC_EQ 0x00000000 /* Z=1 */ -# define ARM_CC_NE 0x10000000 /* Z=0 */ -# define ARM_CC_HS 0x20000000 /* C=1 */ -# define ARM_CC_CS ARM_CC_HS -# define ARM_CC_LO 0x30000000 /* C=0 */ -# define ARM_CC_CC ARM_CC_LO -# define ARM_CC_MI 0x40000000 /* N=1 */ -# define ARM_CC_PL 0x50000000 /* N=0 */ -# define ARM_CC_VS 0x60000000 /* V=1 */ -# define ARM_CC_VC 0x70000000 /* V=0 */ -# define ARM_CC_HI 0x80000000 /* C=1 && Z=0 */ -# define ARM_CC_LS 0x90000000 /* C=0 || Z=1 */ -# define ARM_CC_GE 0xa0000000 /* N=V */ -# define ARM_CC_LT 0xb0000000 /* N!=V */ -# define ARM_CC_GT 0xc0000000 /* Z=0 && N=V */ -# define ARM_CC_LE 0xd0000000 /* Z=1 || N!=V */ -# define ARM_CC_AL 0xe0000000 /* always */ -# define ARM_CC_NV 0xf0000000 /* reserved */ -# define THUMB2_IT 0 -# define THUMB2_ITT 1 -# define THUMB2_ITE 2 -# define THUMB2_ITTT 3 -# define THUMB2_ITET 4 -# define THUMB2_ITTE 5 -# define THUMB2_ITEE 6 -# define THUMB2_ITTTT 7 -# define THUMB2_ITETT 8 -# define THUMB2_ITTET 9 -# define THUMB2_ITEET 10 -# define THUMB2_ITTTE 11 -# define THUMB2_ITETE 12 -# define THUMB2_ITTEE 13 -# define THUMB2_ITEEE 14 -# define ARM_MOV 0x01a00000 -# define THUMB_MOV 0x4600 -# define ARM_MOVWI 0x03000000 /* v6t2, v7 */ -# define THUMB_MOVI 0x2000 -# define THUMB2_MOVI 0xf0400000 -# define THUMB2_MOVWI 0xf2400000 -# define ARM_MOVTI 0x03400000 -# define THUMB2_MOVTI 0xf2c00000 -# define ARM_MVN 0x01e00000 -# define THUMB_MVN 0x43c0 -# define THUMB2_MVN 0xea600000 -# define THUMB2_MVNI 0xf0600000 -# define ARM_I 0x02000000 /* immediate */ -# define ARM_S 0x00100000 /* set flags */ -# define ARM_ADD 0x00800000 -# define THUMB_ADD 0x1800 -# define THUMB_ADDX 0x4400 -# define THUMB2_ADD 0xeb000000 -# define THUMB_ADDI3 0x1c00 -# define THUMB_ADDI8 0x3000 -# define THUMB2_ADDI 0xf1000000 -# define THUMB2_ADDWI 0xf2000000 -# define ARM_ADC 0x00a00000 -# define THUMB_ADC 0x4140 -# define THUMB2_ADC 0xeb400000 -# define THUMB2_ADCI 0xf1400000 -# define ARM_SUB 0x00400000 -# define THUMB_SUB 0x1a00 -# define THUMB2_SUB 0xeba00000 -# define THUMB_SUBI3 0x1e00 -# define THUMB_SUBI8 0x3800 -# define THUMB2_SUBI 0xf1a00000 -# define THUMB2_SUBWI 0xf2a00000 -# define ARM_SBC 0x00c00000 -# define THUMB_SBC 0x4180 -# define THUMB2_SBC 0xeb600000 -# define THUMB2_SBCI 0xf1600000 -# define ARM_RSB 0x00600000 -# define THUMB_RSBI 0x4240 -# define THUMB2_RSBI 0xf1c00000 -# define ARM_MUL 0x00000090 -# define THUMB_MUL 0x4340 -# define THUMB2_MUL 0xfb00f000 -# define ARM_UMULL 0x00800090 -# define THUMB2_UMULL 0xfba00000 -# define ARM_SMULL 0x00c00090 -# define THUMB2_SMULL 0xfb800000 -# define THUMB2_SDIV 0xfb90f0f0 -# define THUMB2_UDIV 0xfbb0f0f0 -# define ARM_AND 0x00000000 -# define THUMB_AND 0x4000 -# define THUMB2_AND 0xea000000 -# define THUMB2_ANDI 0xf0000000 -# define ARM_BIC 0x01c00000 -# define THUMB2_BIC 0xea200000 -# define THUMB2_BICI 0xf0200000 -# define ARM_ORR 0x01800000 -# define THUMB_ORR 0x4300 -# define THUMB2_ORR 0xea400000 -# define THUMB2_ORRI 0xf0400000 -# define ARM_EOR 0x00200000 -# define THUMB_EOR 0x4040 -# define THUMB2_EOR 0xea800000 -# define THUMB2_EORI 0xf0800000 +#define _s20P(d) ((d) >= -(int)0x80000 && d <= 0x7ffff) +#define _s24P(d) ((d) >= -(int)0x800000 && d <= 0x7fffff) +#define _u3(v) ((v) & 0x7) +#define _u4(v) ((v) & 0xf) +#define _u5(v) ((v) & 0x1f) +#define _u8(v) ((v) & 0xff) +#define _u12(v) ((v) & 0xfff) +#define _u13(v) ((v) & 0x1fff) +#define _u16(v) ((v) & 0xffff) +#define _u24(v) ((v) & 0xffffff) +extern int __aeabi_idivmod(int, int); +extern unsigned __aeabi_uidivmod(unsigned, unsigned); +# define _R0_REGNO 0x00 +# define _R1_REGNO 0x01 +# define _R2_REGNO 0x02 +# define _R3_REGNO 0x03 +# define _R4_REGNO 0x04 +# define _R5_REGNO 0x05 +# define _R6_REGNO 0x06 +# define _R7_REGNO 0x07 +# define _R8_REGNO 0x08 +# define _R9_REGNO 0x09 +# define _R10_REGNO 0x0a +# define _R11_REGNO 0x0b +# define _R12_REGNO 0x0c +# define _R13_REGNO 0x0d +# define _R14_REGNO 0x0e +# define _R15_REGNO 0x0f +# define _FP_REGNO _R11_REGNO +# define _SP_REGNO _R13_REGNO +# define _LR_REGNO _R14_REGNO +# define _PC_REGNO _R15_REGNO +# define ARM_CC_EQ 0x00000000 /* Z=1 */ +# define ARM_CC_NE 0x10000000 /* Z=0 */ +# define ARM_CC_HS 0x20000000 /* C=1 */ +# define ARM_CC_CS ARM_CC_HS +# define ARM_CC_LO 0x30000000 /* C=0 */ +# define ARM_CC_CC ARM_CC_LO +# define ARM_CC_MI 0x40000000 /* N=1 */ +# define ARM_CC_PL 0x50000000 /* N=0 */ +# define ARM_CC_VS 0x60000000 /* V=1 */ +# define ARM_CC_VC 0x70000000 /* V=0 */ +# define ARM_CC_HI 0x80000000 /* C=1 && Z=0 */ +# define ARM_CC_LS 0x90000000 /* C=0 || Z=1 */ +# define ARM_CC_GE 0xa0000000 /* N=V */ +# define ARM_CC_LT 0xb0000000 /* N!=V */ +# define ARM_CC_GT 0xc0000000 /* Z=0 && N=V */ +# define ARM_CC_LE 0xd0000000 /* Z=1 || N!=V */ +# define ARM_CC_AL 0xe0000000 /* always */ +# define ARM_CC_NV 0xf0000000 /* reserved */ +# define THUMB2_IT 0 +# define THUMB2_ITT 1 +# define THUMB2_ITE 2 +# define THUMB2_ITTT 3 +# define THUMB2_ITET 4 +# define THUMB2_ITTE 5 +# define THUMB2_ITEE 6 +# define THUMB2_ITTTT 7 +# define THUMB2_ITETT 8 +# define THUMB2_ITTET 9 +# define THUMB2_ITEET 10 +# define THUMB2_ITTTE 11 +# define THUMB2_ITETE 12 +# define THUMB2_ITTEE 13 +# define THUMB2_ITEEE 14 +# define ARM_MOV 0x01a00000 +# define THUMB_MOV 0x4600 +# define ARM_MOVWI 0x03000000 /* v6t2, v7 */ +# define THUMB_MOVI 0x2000 +# define THUMB2_MOVI 0xf0400000 +# define THUMB2_MOVWI 0xf2400000 +# define ARM_MOVTI 0x03400000 +# define THUMB2_MOVTI 0xf2c00000 +# define ARM_MVN 0x01e00000 +# define THUMB_MVN 0x43c0 +# define THUMB2_MVN 0xea600000 +# define THUMB2_MVNI 0xf0600000 +# define ARM_I 0x02000000 /* immediate */ +# define ARM_S 0x00100000 /* set flags */ +# define ARM_ADD 0x00800000 +# define THUMB_ADD 0x1800 +# define THUMB_ADDX 0x4400 +# define THUMB2_ADD 0xeb000000 +# define THUMB_ADDI3 0x1c00 +# define THUMB_ADDI8 0x3000 +# define THUMB2_ADDI 0xf1000000 +# define THUMB2_ADDWI 0xf2000000 +# define ARM_ADC 0x00a00000 +# define THUMB_ADC 0x4140 +# define THUMB2_ADC 0xeb400000 +# define THUMB2_ADCI 0xf1400000 +# define ARM_SUB 0x00400000 +# define THUMB_SUB 0x1a00 +# define THUMB2_SUB 0xeba00000 +# define THUMB_SUBI3 0x1e00 +# define THUMB_SUBI8 0x3800 +# define THUMB2_SUBI 0xf1a00000 +# define THUMB2_SUBWI 0xf2a00000 +# define ARM_SBC 0x00c00000 +# define THUMB_SBC 0x4180 +# define THUMB2_SBC 0xeb600000 +# define THUMB2_SBCI 0xf1600000 +# define ARM_RSB 0x00600000 +# define THUMB_RSBI 0x4240 +# define THUMB2_RSBI 0xf1c00000 +# define ARM_MUL 0x00000090 +# define THUMB_MUL 0x4340 +# define THUMB2_MUL 0xfb00f000 +# define ARM_UMULL 0x00800090 +# define THUMB2_UMULL 0xfba00000 +# define ARM_SMULL 0x00c00090 +# define THUMB2_SMULL 0xfb800000 +# define THUMB2_SDIV 0xfb90f0f0 +# define THUMB2_UDIV 0xfbb0f0f0 +# define ARM_AND 0x00000000 +# define THUMB_AND 0x4000 +# define THUMB2_AND 0xea000000 +# define THUMB2_ANDI 0xf0000000 +# define ARM_BIC 0x01c00000 +# define THUMB2_BIC 0xea200000 +# define THUMB2_BICI 0xf0200000 +# define ARM_ORR 0x01800000 +# define THUMB_ORR 0x4300 +# define THUMB2_ORR 0xea400000 +# define THUMB2_ORRI 0xf0400000 +# define ARM_EOR 0x00200000 +# define THUMB_EOR 0x4040 +# define THUMB2_EOR 0xea800000 +# define THUMB2_EORI 0xf0800000 /* >> ARMv6* */ -# define ARM_REV 0x06bf0f30 -# define THUMB_REV 0xba00 -# define THUMB2_REV 0xfa90f080 -# define ARM_REV16 0x06bf0fb0 -# define THUMB_REV16 0xba40 -# define THUMB2_REV16 0xfa90f090 -# define ARM_SXTB 0x06af0070 -# define THUMB_SXTB 0xb240 -# define THUMB2_SXTB 0xfa40f080 -# define ARM_UXTB 0x06ef0070 -# define THUMB_UXTB 0xb2c0 -# define THUMB2_UXTB 0xfa50f080 -# define ARM_SXTH 0x06bf0070 -# define THUMB_SXTH 0xb200 -# define THUMB2_SXTH 0xfa00f080 -# define ARM_UXTH 0x06ff0070 -# define THUMB_UXTH 0xb280 -# define THUMB2_UXTH 0xfa10f080 -# define ARM_XTR8 0x00000400 /* ?xt? rotate 8 bits */ -# define ARM_XTR16 0x00000800 /* ?xt? rotate 16 bits */ -# define ARM_XTR24 0x00000c00 /* ?xt? rotate 24 bits */ +# define ARM_REV 0x06bf0f30 +# define THUMB_REV 0xba00 +# define THUMB2_REV 0xfa90f080 +# define ARM_REV16 0x06bf0fb0 +# define THUMB_REV16 0xba40 +# define THUMB2_REV16 0xfa90f090 +# define ARM_SXTB 0x06af0070 +# define THUMB_SXTB 0xb240 +# define THUMB2_SXTB 0xfa40f080 +# define ARM_UXTB 0x06ef0070 +# define THUMB_UXTB 0xb2c0 +# define THUMB2_UXTB 0xfa50f080 +# define ARM_SXTH 0x06bf0070 +# define THUMB_SXTH 0xb200 +# define THUMB2_SXTH 0xfa00f080 +# define ARM_UXTH 0x06ff0070 +# define THUMB_UXTH 0xb280 +# define THUMB2_UXTH 0xfa10f080 +# define ARM_XTR8 0x00000400 /* ?xt? rotate 8 bits */ +# define ARM_XTR16 0x00000800 /* ?xt? rotate 16 bits */ +# define ARM_XTR24 0x00000c00 /* ?xt? rotate 24 bits */ /* << ARMv6* */ -# define ARM_SHIFT 0x01a00000 -# define ARM_R 0x00000010 /* register shift */ -# define ARM_LSL 0x00000000 -# define THUMB_LSL 0x4080 -# define THUMB2_LSL 0xfa00f000 -# define THUMB_LSLI 0x0000 -# define THUMB2_LSLI 0xea4f0000 -# define ARM_LSR 0x00000020 -# define THUMB_LSR 0x40c0 -# define THUMB2_LSR 0xfa20f000 -# define THUMB_LSRI 0x0800 -# define THUMB2_LSRI 0xea4f0010 -# define ARM_ASR 0x00000040 -# define THUMB_ASR 0x4100 -# define THUMB2_ASR 0xfa40f000 -# define THUMB_ASRI 0x1000 -# define THUMB2_ASRI 0xea4f0020 -# define ARM_ROR 0x00000060 -# define ARM_CMP 0x01500000 -# define THUMB_CMP 0x4280 -# define THUMB_CMPX 0x4500 -# define THUMB2_CMP 0xebb00000 -# define THUMB_CMPI 0x2800 -# define THUMB2_CMPI 0xf1b00000 -# define ARM_CMN 0x01700000 -# define THUMB_CMN 0x42c0 -# define THUMB2_CMN 0xeb100000 -# define THUMB2_CMNI 0xf1100000 -# define ARM_TST 0x01100000 -# define THUMB_TST 0x4200 -# define THUMB2_TST 0xea100000 -# define THUMB2_TSTI 0xf0100000 -# define ARM_TEQ 0x01300000 +# define ARM_SHIFT 0x01a00000 +# define ARM_R 0x00000010 /* register shift */ +# define ARM_LSL 0x00000000 +# define THUMB_LSL 0x4080 +# define THUMB2_LSL 0xfa00f000 +# define THUMB_LSLI 0x0000 +# define THUMB2_LSLI 0xea4f0000 +# define ARM_LSR 0x00000020 +# define THUMB_LSR 0x40c0 +# define THUMB2_LSR 0xfa20f000 +# define THUMB_LSRI 0x0800 +# define THUMB2_LSRI 0xea4f0010 +# define ARM_ASR 0x00000040 +# define THUMB_ASR 0x4100 +# define THUMB2_ASR 0xfa40f000 +# define THUMB_ASRI 0x1000 +# define THUMB2_ASRI 0xea4f0020 +# define ARM_ROR 0x00000060 +# define ARM_CMP 0x01500000 +# define THUMB_CMP 0x4280 +# define THUMB_CMPX 0x4500 +# define THUMB2_CMP 0xebb00000 +# define THUMB_CMPI 0x2800 +# define THUMB2_CMPI 0xf1b00000 +# define ARM_CMN 0x01700000 +# define THUMB_CMN 0x42c0 +# define THUMB2_CMN 0xeb100000 +# define THUMB2_CMNI 0xf1100000 +# define ARM_TST 0x01100000 +# define THUMB_TST 0x4200 +# define THUMB2_TST 0xea100000 +# define THUMB2_TSTI 0xf0100000 +# define ARM_TEQ 0x01300000 /* branch */ -# define ARM_BX 0x012fff10 -# define ARM_BLX 0x012fff30 -# define THUMB_BLX 0x4780 -# define ARM_BLXI 0xfa000000 -# define THUMB2_BLXI 0xf000c000 -# define ARM_B 0x0a000000 -# define THUMB_CC_B 0xd000 -# define THUMB_B 0xe000 -# define THUMB2_CC_B 0xf0008000 -# define THUMB2_B 0xf0009000 -# define ARM_BLI 0x0b000000 -# define THUMB2_BLI 0xf000d000 +# define ARM_BX 0x012fff10 +# define ARM_BLX 0x012fff30 +# define THUMB_BLX 0x4780 +# define ARM_BLXI 0xfa000000 +# define THUMB2_BLXI 0xf000c000 +# define ARM_B 0x0a000000 +# define THUMB_CC_B 0xd000 +# define THUMB_B 0xe000 +# define THUMB2_CC_B 0xf0008000 +# define THUMB2_B 0xf0009000 +# define ARM_BLI 0x0b000000 +# define THUMB2_BLI 0xf000d000 /* ldr/str */ -# define ARM_P 0x00800000 /* positive offset */ -# define THUMB2_P 0x00000400 -# define THUMB2_U 0x00000200 -# define THUMB2_W 0x00000100 -# define ARM_LDRSB 0x011000d0 -# define THUMB_LDRSB 0x5600 -# define THUMB2_LDRSB 0xf9100000 -# define ARM_LDRSBI 0x015000d0 -# define THUMB2_LDRSBI 0xf9100c00 -# define THUMB2_LDRSBWI 0xf9900000 -# define ARM_LDRB 0x07500000 -# define THUMB_LDRB 0x5c00 -# define THUMB2_LDRB 0xf8100000 -# define ARM_LDRBI 0x05500000 -# define THUMB_LDRBI 0x7800 -# define THUMB2_LDRBI 0xf8100c00 -# define THUMB2_LDRBWI 0xf8900000 -# define ARM_LDRSH 0x011000f0 -# define THUMB_LDRSH 0x5e00 -# define THUMB2_LDRSH 0xf9300000 -# define ARM_LDRSHI 0x015000f0 -# define THUMB2_LDRSHI 0xf9300c00 -# define THUMB2_LDRSHWI 0xf9b00000 -# define ARM_LDRH 0x011000b0 -# define THUMB_LDRH 0x5a00 -# define THUMB2_LDRH 0xf8300000 -# define ARM_LDRHI 0x015000b0 -# define THUMB_LDRHI 0x8800 -# define THUMB2_LDRHI 0xf8300c00 -# define THUMB2_LDRHWI 0xf8b00000 -# define ARM_LDR 0x07100000 -# define THUMB_LDR 0x5800 -# define THUMB2_LDR 0xf8500000 -# define ARM_LDRI 0x05100000 -# define THUMB_LDRI 0x6800 -# define THUMB_LDRISP 0x9800 -# define THUMB2_LDRI 0xf8500c00 -# define THUMB2_LDRWI 0xf8d00000 -# define ARM_LDRD 0x010000d0 -# define ARM_LDRDI 0x014000d0 -# define THUMB2_LDRDI 0xe8500000 -# define ARM_STRB 0x07400000 -# define THUMB_STRB 0x5400 -# define THUMB2_STRB 0xf8000000 -# define ARM_STRBI 0x05400000 -# define THUMB_STRBI 0x7000 -# define THUMB2_STRBI 0xf8000c00 -# define THUMB2_STRBWI 0xf8800000 -# define ARM_STRH 0x010000b0 -# define THUMB_STRH 0x5200 -# define THUMB2_STRH 0xf8200000 -# define ARM_STRHI 0x014000b0 -# define THUMB_STRHI 0x8000 -# define THUMB2_STRHI 0xf8200c00 -# define THUMB2_STRHWI 0xf8a00000 -# define ARM_STR 0x07000000 -# define THUMB_STR 0x5000 -# define THUMB2_STR 0xf8400000 -# define ARM_STRI 0x05000000 -# define THUMB_STRI 0x6000 -# define THUMB2_STRWI 0xf8c00000 -# define THUMB_STRISP 0x9000 -# define THUMB2_STRI 0xf8400c00 -# define ARM_STRD 0x010000f0 -# define ARM_STRDI 0x014000f0 -# define THUMB2_STRDI 0xe8400000 +# define ARM_P 0x00800000 /* positive offset */ +# define THUMB2_P 0x00000400 +# define THUMB2_U 0x00000200 +# define THUMB2_W 0x00000100 +# define ARM_LDRSB 0x011000d0 +# define THUMB_LDRSB 0x5600 +# define THUMB2_LDRSB 0xf9100000 +# define ARM_LDRSBI 0x015000d0 +# define THUMB2_LDRSBI 0xf9100c00 +# define THUMB2_LDRSBWI 0xf9900000 +# define ARM_LDRB 0x07500000 +# define THUMB_LDRB 0x5c00 +# define THUMB2_LDRB 0xf8100000 +# define ARM_LDRBI 0x05500000 +# define THUMB_LDRBI 0x7800 +# define THUMB2_LDRBI 0xf8100c00 +# define THUMB2_LDRBWI 0xf8900000 +# define ARM_LDRSH 0x011000f0 +# define THUMB_LDRSH 0x5e00 +# define THUMB2_LDRSH 0xf9300000 +# define ARM_LDRSHI 0x015000f0 +# define THUMB2_LDRSHI 0xf9300c00 +# define THUMB2_LDRSHWI 0xf9b00000 +# define ARM_LDRH 0x011000b0 +# define THUMB_LDRH 0x5a00 +# define THUMB2_LDRH 0xf8300000 +# define ARM_LDRHI 0x015000b0 +# define THUMB_LDRHI 0x8800 +# define THUMB2_LDRHI 0xf8300c00 +# define THUMB2_LDRHWI 0xf8b00000 +# define ARM_LDR 0x07100000 +# define THUMB_LDR 0x5800 +# define THUMB2_LDR 0xf8500000 +# define ARM_LDRI 0x05100000 +# define THUMB_LDRI 0x6800 +# define THUMB_LDRISP 0x9800 +# define THUMB2_LDRI 0xf8500c00 +# define THUMB2_LDRWI 0xf8d00000 +# define ARM_LDRD 0x010000d0 +# define ARM_LDRDI 0x014000d0 +# define THUMB2_LDRDI 0xe8500000 +# define ARM_STRB 0x07400000 +# define THUMB_STRB 0x5400 +# define THUMB2_STRB 0xf8000000 +# define ARM_STRBI 0x05400000 +# define THUMB_STRBI 0x7000 +# define THUMB2_STRBI 0xf8000c00 +# define THUMB2_STRBWI 0xf8800000 +# define ARM_STRH 0x010000b0 +# define THUMB_STRH 0x5200 +# define THUMB2_STRH 0xf8200000 +# define ARM_STRHI 0x014000b0 +# define THUMB_STRHI 0x8000 +# define THUMB2_STRHI 0xf8200c00 +# define THUMB2_STRHWI 0xf8a00000 +# define ARM_STR 0x07000000 +# define THUMB_STR 0x5000 +# define THUMB2_STR 0xf8400000 +# define ARM_STRI 0x05000000 +# define THUMB_STRI 0x6000 +# define THUMB2_STRWI 0xf8c00000 +# define THUMB_STRISP 0x9000 +# define THUMB2_STRI 0xf8400c00 +# define ARM_STRD 0x010000f0 +# define ARM_STRDI 0x014000f0 +# define THUMB2_STRDI 0xe8400000 /* ldm/stm */ -# define ARM_M 0x08000000 -# define ARM_M_L 0x00100000 /* load; store if not set */ -# define ARM_M_I 0x00800000 /* inc; dec if not set */ -# define ARM_M_B 0x01000000 /* before; after if not set */ -# define ARM_M_U 0x00200000 /* update Rn */ -# define THUMB2_LDM_W 0x00200000 -# define THUMB2_LDM_P 0x00008000 -# define THUMB2_LDM_M 0x00004000 -# define THUMB_LDMIA 0xc800 -# define THUMB2_LDMIA 0xe8900000 -# define THUMB2_LDMB 0xe9100000 -# define THUMB_PUSH 0xb400 -# define THUMB2_PUSH 0xe92d0000 -# define THUMB_POP 0xbc00 -# define THUMB2_POP 0xe8bd0000 -# define ii(i) *_jit->pc.ui++ = i -# define is(i) *_jit->pc.us++ = i +# define ARM_M 0x08000000 +# define ARM_M_L 0x00100000 /* load; store if not set */ +# define ARM_M_I 0x00800000 /* inc; dec if not set */ +# define ARM_M_B 0x01000000 /* before; after if not set */ +# define ARM_M_U 0x00200000 /* update Rn */ +# define THUMB2_LDM_W 0x00200000 +# define THUMB2_LDM_P 0x00008000 +# define THUMB2_LDM_M 0x00004000 +# define THUMB_LDMIA 0xc800 +# define THUMB2_LDMIA 0xe8900000 +# define THUMB2_LDMB 0xe9100000 +# define THUMB_PUSH 0xb400 +# define THUMB2_PUSH 0xe92d0000 +# define THUMB_POP 0xbc00 +# define THUMB2_POP 0xe8bd0000 +# define ii(i) *_jit->pc.ui++ = i +# define is(i) *_jit->pc.us++ = i # if __BYTE_ORDER == __LITTLE_ENDIAN -# define iss(i, j) do { is(j); is(i); } while (0) -# define code2thumb(t0, t1, c0, c1) do { t1 = c0; t0 = c1; } while (0) -# define thumb2code(t0, t1, c0, c1) do { c0 = t1; c1 = t0; } while (0) +# define iss(i, j) do { is(j); is(i); } while (0) +# define code2thumb(t0, t1, c0, c1) do { t1 = c0; t0 = c1; } while (0) +# define thumb2code(t0, t1, c0, c1) do { c0 = t1; c1 = t0; } while (0) # else -# define iss(i, j) do { is(i); is(j); } while (0) -# define code2thumb(t0, t1, c0, c1) do { t0 = c0; t1 = c1; } while (0) -# define thumb2code(t0, t1, c0, c1) do { c0 = t0; c1 = t1; } while (0) +# define iss(i, j) do { is(i); is(j); } while (0) +# define code2thumb(t0, t1, c0, c1) do { t0 = c0; t1 = c1; } while (0) +# define thumb2code(t0, t1, c0, c1) do { c0 = t0; c1 = t1; } while (0) # endif static int encode_arm_immediate(unsigned int v); static int encode_thumb_immediate(unsigned int v); @@ -326,817 +315,817 @@ static int encode_thumb_word_immediate(unsigned int v); static int encode_thumb_jump(int v); static int encode_thumb_cc_jump(int v); static int encode_thumb_shift(int v, int type) maybe_unused; -# define corrr(cc,o,rn,rd,rm) _corrr(_jit,cc,o,rn,rd,rm) +# define corrr(cc,o,rn,rd,rm) _corrr(_jit,cc,o,rn,rd,rm) static void _corrr(jit_state_t*,int,int,int,int,int); -# define corri(cc,o,rn,rd,im) _corri(_jit,cc,o,rn,rd,im) +# define corri(cc,o,rn,rd,im) _corri(_jit,cc,o,rn,rd,im) static void _corri(jit_state_t*,int,int,int,int,int); -#define corri8(cc,o,rn,rt,im) _corri8(_jit,cc,o,rn,rt,im) +#define corri8(cc,o,rn,rt,im) _corri8(_jit,cc,o,rn,rt,im) static void _corri8(jit_state_t*,int,int,int,int,int); -# define torrr(o,rn,rd,rm) _torrr(_jit,o,rn,rd,rm) +# define torrr(o,rn,rd,rm) _torrr(_jit,o,rn,rd,rm) static void _torrr(jit_state_t*,int,int,int,int); -# define torrrs(o,rn,rd,rm,im) _torrrs(_jit,o,rn,rd,rm,im) +# define torrrs(o,rn,rd,rm,im) _torrrs(_jit,o,rn,rd,rm,im) static void _torrrs(jit_state_t*,int,int,int,int,int) maybe_unused; -# define torxr(o,rn,rt,rm) _torxr(_jit,o,rn,rt,rm) +# define torxr(o,rn,rt,rm) _torxr(_jit,o,rn,rt,rm) static void _torxr(jit_state_t*,int,int,int,int); -# define torrrr(o,rn,rl,rh,rm) _torrrr(_jit,o,rn,rl,rh,rm) +# define torrrr(o,rn,rl,rh,rm) _torrrr(_jit,o,rn,rl,rh,rm) static void _torrrr(jit_state_t*,int,int,int,int,int) maybe_unused; -# define torrri8(o,rn,rt,rt2,im) _torrri8(_jit,o,rn,rt,rt2,im) +# define torrri8(o,rn,rt,rt2,im) _torrri8(_jit,o,rn,rt,rt2,im) static void _torrri8(jit_state_t*,int,int,int,int,int) maybe_unused; -# define coriw(cc,o,rd,im) _coriw(_jit,cc,o,rd,im) +# define coriw(cc,o,rd,im) _coriw(_jit,cc,o,rd,im) static void _coriw(jit_state_t*,int,int,int,int); -# define torri(o,rd,rn,im) _torri(_jit,o,rd,rn,im) +# define torri(o,rd,rn,im) _torri(_jit,o,rd,rn,im) static void _torri(jit_state_t*,int,int,int,int); -# define torri8(o,rn,rt,im) _torri8(_jit,o,rn,rt,im) +# define torri8(o,rn,rt,im) _torri8(_jit,o,rn,rt,im) static void _torri8(jit_state_t*,int,int,int,int); -# define torri12(o,rn,rt,im) _torri12(_jit,o,rn,rt,im) +# define torri12(o,rn,rt,im) _torri12(_jit,o,rn,rt,im) static void _torri12(jit_state_t*,int,int,int,int); -# define tshift(o,rd,rm,im) _tshift(_jit,o,rd,rm,im) +# define tshift(o,rd,rm,im) _tshift(_jit,o,rd,rm,im) static void _tshift(jit_state_t*,int,int,int,int); -# define toriw(o,rd,im) _toriw(_jit,o,rd,im) +# define toriw(o,rd,im) _toriw(_jit,o,rd,im) static void _toriw(jit_state_t*,int,int,int); -# define tc8(cc,im) _tc8(_jit,cc,im) +# define tc8(cc,im) _tc8(_jit,cc,im) static void _tc8(jit_state_t*,int,int) maybe_unused; -# define t11(im) _t11(_jit,im) +# define t11(im) _t11(_jit,im) static void _t11(jit_state_t*,int); -# define tcb(cc,im) _tcb(_jit,cc,im) +# define tcb(cc,im) _tcb(_jit,cc,im) static void _tcb(jit_state_t*,int,int); -# define blxi(im) _blxi(_jit,im) +# define blxi(im) _blxi(_jit,im) static void _blxi(jit_state_t*,int) maybe_unused; -# define tb(o,im) _tb(_jit,o,im) +# define tb(o,im) _tb(_jit,o,im) static void _tb(jit_state_t*,int,int); -# define corrrr(cc,o,rh,rl,rm,rn) _corrrr(_jit,cc,o,rh,rl,rm,rn) +# define corrrr(cc,o,rh,rl,rm,rn) _corrrr(_jit,cc,o,rh,rl,rm,rn) static void _corrrr(jit_state_t*,int,int,int,int,int,int); -# define corrrs(cc,o,rn,rd,rm,im) _corrrs(_jit,cc,o,rn,rd,rm,im) +# define corrrs(cc,o,rn,rd,rm,im) _corrrs(_jit,cc,o,rn,rd,rm,im) static void _corrrs(jit_state_t*,int,int,int,int,int,int); -# define cshift(cc,o,rd,rm,rn,im) _cshift(_jit,cc,o,rd,rm,rn,im) +# define cshift(cc,o,rd,rm,rn,im) _cshift(_jit,cc,o,rd,rm,rn,im) static void _cshift(jit_state_t*,int,int,int,int,int,int); -# define cb(cc,o,im) _cb(_jit,cc,o,im) +# define cb(cc,o,im) _cb(_jit,cc,o,im) static void _cb(jit_state_t*,int,int,int); -# define cbx(cc,o,rm) _cbx(_jit,cc,o,rm) +# define cbx(cc,o,rm) _cbx(_jit,cc,o,rm) static void _cbx(jit_state_t*,int,int,int); -# define corl(cc,o,r0,i0) _corl(_jit,cc,o,r0,i0) +# define corl(cc,o,r0,i0) _corl(_jit,cc,o,r0,i0) static void _corl(jit_state_t*,int,int,int,int); -# define c6orr(cc,o,r0,r1) _c6orr(_jit,cc,o,r0,r1) +# define c6orr(cc,o,r0,r1) _c6orr(_jit,cc,o,r0,r1) static void _c6orr(jit_state_t*,int,int,int,int); -# define tcit(cc,it) _tcit(_jit,cc,it) +# define tcit(cc,it) _tcit(_jit,cc,it) static void _tcit(jit_state_t*,unsigned int,int); -# define IT(cc) tcit(cc,THUMB2_IT) -# define ITT(cc) tcit(cc,THUMB2_ITT) -# define ITE(cc) tcit(cc,THUMB2_ITE) -# define ITTT(cc) tcit(cc,THUMB2_ITTT) -# define ITTE(cc) tcit(cc,THUMB2_ITTE) -# define ITET(cc) tcit(cc,THUMB2_ITET) -# define ITEE(cc) tcit(cc,THUMB2_ITEE) -# define ITTTT(cc) tcit(cc,THUMB2_ITTTT) -# define ITETT(cc) tcit(cc,THUMB2_ITETT) -# define ITTET(cc) tcit(cc,THUMB2_ITTET) -# define ITEET(cc) tcit(cc,THUMB2_ITEET) -# define ITTTE(cc) tcit(cc,THUMB2_ITTTE) -# define ITETE(cc) tcit(cc,THUMB2_ITETE) -# define ITTEE(cc) tcit(cc,THUMB2_ITTEE) -# define ITEEE(cc) tcit(cc,THUMB2_ITEEE) -# define tpp(o,im) _tpp(_jit,o,im) +# define IT(cc) tcit(cc,THUMB2_IT) +# define ITT(cc) tcit(cc,THUMB2_ITT) +# define ITE(cc) tcit(cc,THUMB2_ITE) +# define ITTT(cc) tcit(cc,THUMB2_ITTT) +# define ITTE(cc) tcit(cc,THUMB2_ITTE) +# define ITET(cc) tcit(cc,THUMB2_ITET) +# define ITEE(cc) tcit(cc,THUMB2_ITEE) +# define ITTTT(cc) tcit(cc,THUMB2_ITTTT) +# define ITETT(cc) tcit(cc,THUMB2_ITETT) +# define ITTET(cc) tcit(cc,THUMB2_ITTET) +# define ITEET(cc) tcit(cc,THUMB2_ITEET) +# define ITTTE(cc) tcit(cc,THUMB2_ITTTE) +# define ITETE(cc) tcit(cc,THUMB2_ITETE) +# define ITTEE(cc) tcit(cc,THUMB2_ITTEE) +# define ITEEE(cc) tcit(cc,THUMB2_ITEEE) +# define tpp(o,im) _tpp(_jit,o,im) static void _tpp(jit_state_t*,int,int); -# define torl(o,rn,im) _torl(_jit,o,rn,im) +# define torl(o,rn,im) _torl(_jit,o,rn,im) static void _torl(jit_state_t*,int,int,int) maybe_unused; -# define CC_MOV(cc,rd,rm) corrr(cc,ARM_MOV,0,rd,rm) -# define MOV(rd,rm) CC_MOV(ARM_CC_AL,rd,rm) -# define T1_MOV(rd,rm) is(THUMB_MOV|((_u4(rd)&8)<<4)|(_u4(rm)<<3)|(rd&7)) -# define T2_MOV(rd,rm) T2_ORR(rd,_R15_REGNO,rm) -# define CC_MOVI(cc,rd,im) corri(cc,ARM_MOV|ARM_I,0,rd,im) -# define MOVI(rd,im) CC_MOVI(ARM_CC_AL,rd,im) -# define CC_MOVWI(cc,rd,im) coriw(cc,ARM_MOVWI,rd,im) -# define MOVWI(rd,im) CC_MOVWI(ARM_CC_AL,rd,im) -# define T1_MOVI(rd,im) is(THUMB_MOVI|(_u3(rd)<<8)|_u8(im)) -# define T2_MOVI(rd,im) torri(THUMB2_MOVI,_R15_REGNO,rd,im) -# define T2_MOVWI(rd,im) toriw(THUMB2_MOVWI,rd,im) -# define CC_MOVTI(cc,rd,im) coriw(cc,ARM_MOVTI,rd,im) -# define MOVTI(rd,im) CC_MOVTI(ARM_CC_AL,rd,im) -# define T2_MOVTI(rd,im) toriw(THUMB2_MOVTI,rd,im) -# define CC_MVN(cc,rd,rm) corrr(cc,ARM_MVN,0,rd,rm) -# define MVN(rd,rm) CC_MVN(ARM_CC_AL,rd,rm) -# define T1_MVN(rd,rm) is(THUMB_MVN|(_u3(rm)<<3)|_u3(rd)) -# define T2_MVN(rd,rm) torrr(THUMB2_MVN,_R15_REGNO,rd,rm) -# define CC_MVNI(cc,rd,im) corri(cc,ARM_MVN|ARM_I,0,rd,im) -# define MVNI(rd,im) CC_MVNI(ARM_CC_AL,rd,im) -# define T2_MVNI(rd,im) torri(THUMB2_MVNI,_R15_REGNO,rd,im) -# define CC_NOT(cc,rd,rm) CC_MVN(cc,rd,rm) -# define NOT(rd,rm) CC_NOT(ARM_CC_AL,rd,rm) -# define T1_NOT(rd,rm) T1_MVN(rd,rm) -# define T2_NOT(rd,rm) T2_MVN(rd,rm) -# define NOP() MOV(_R0_REGNO, _R0_REGNO) -# define T1_NOP() is(0xbf00) -# define CC_ADD(cc,rd,rn,rm) corrr(cc,ARM_ADD,rn,rd,rm) -# define ADD(rd,rn,rm) CC_ADD(ARM_CC_AL,rd,rn,rm) -# define T1_ADD(rd,rn,rm) is(THUMB_ADD|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rd)) -# define T1_ADDX(rdn,rm) is(THUMB_ADDX|((_u4(rdn)&8)<<4)|(_u4(rm)<<3)|(rdn&7)) -# define T2_ADD(rd,rn,rm) torrr(THUMB2_ADD,rn,rd,rm) -# define CC_ADDI(cc,rd,rn,im) corri(cc,ARM_ADD|ARM_I,rn,rd,im) -# define ADDI(rd,rn,im) CC_ADDI(ARM_CC_AL,rd,rn,im) -# define T1_ADDI3(rd,rn,im) is(THUMB_ADDI3|(_u3(im)<<6)|(_u3(rn)<<3)|_u3(rd)) -# define T1_ADDI8(rdn,im) is(THUMB_ADDI8|(_u3(rdn)<<8)|_u8(im)) -# define T2_ADDI(rd,rn,im) torri(THUMB2_ADDI,rn,rd,im) -# define T2_ADDWI(rd,rn,im) torri(THUMB2_ADDWI,rn,rd,im) -# define CC_ADDS(cc,rd,rn,rm) corrr(cc,ARM_ADD|ARM_S,rn,rd,rm) -# define ADDS(rd,rn,rm) CC_ADDS(ARM_CC_AL,rd,rn,rm) -# define T2_ADDS(rd,rn,rm) torrr(THUMB2_ADD|ARM_S,rn,rd,rm) -# define ADDSI(rd,rn,im) corri(ARM_CC_AL,ARM_ADD|ARM_S|ARM_I,rn,rd,im) -# define T2_ADDSI(rd,rn,im) torri(THUMB2_ADDI|ARM_S,rn,rd,im) -# define CC_ADC(cc,rd,rn,rm) corrr(cc,ARM_ADC,rn,rd,rm) -# define ADC(rd,rn,rm) CC_ADC(ARM_CC_AL,rd,rn,rm) -# define T1_ADC(rdn,rm) is(THUMB_ADC|(_u3(rm)<<3)|_u3(rdn)) -# define T2_ADC(rd,rn,rm) torrr(THUMB2_ADC,rn,rd,rm) -# define CC_ADCI(cc,rd,rn,im) corri(cc,ARM_ADC|ARM_I,rn,rd,im) -# define ADCI(rd,rn,im) CC_ADCI(ARM_CC_AL,rd,rn,im) -# define T2_ADCI(rd,rn,im) torri(THUMB2_ADCI,rn,rd,im) -# define CC_ADCS(cc,rd,rn,rm) corrr(cc,ARM_ADC|ARM_S,rn,rd,rm) -# define ADCS(rd,rn,rm) CC_ADCS(ARM_CC_AL,rd,rn,rm) -# define T2_ADCS(rd,rn,rm) torrr(THUMB2_ADC|ARM_S,rn,rd,rm) -# define CC_ADCSI(cc,rd,rn,im) corri(cc,ARM_ADC|ARM_S|ARM_I,rn,rd,im) -# define ADCSI(rd,rn,im) CC_ADCSI(ARM_CC_AL,rd,rn,im) -# define T2_ADCSI(rd,rn,im) torri(THUMB2_ADCI|ARM_S,rn,rd,im) -# define CC_SUB(cc,rd,rn,rm) corrr(cc,ARM_SUB,rn,rd,rm) -# define SUB(rd,rn,rm) CC_SUB(ARM_CC_AL,rd,rn,rm) -# define T1_SUB(rd,rn,rm) is(THUMB_SUB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rd)) -# define T2_SUB(rd,rn,rm) torrr(THUMB2_SUB,rn,rd,rm) -# define CC_SUBI(cc,rd,rn,im) corri(cc,ARM_SUB|ARM_I,rn,rd,im) -# define SUBI(rd,rn,im) CC_SUBI(ARM_CC_AL,rd,rn,im) -# define T1_SUBI3(rd,rn,im) is(THUMB_SUBI3|(_u3(im)<<6)|(_u3(rn)<<3)|_u3(rd)) -# define T1_SUBI8(rdn,im) is(THUMB_SUBI8|(_u3(rdn)<<8)|_u8(im)) -# define T2_SUBI(rd,rn,im) torri(THUMB2_SUBI,rn,rd,im) -# define T2_SUBWI(rd,rn,im) torri(THUMB2_SUBWI,rn,rd,im) -# define CC_SUBS(cc,rd,rn,rm) corrr(cc,ARM_SUB|ARM_S,rn,rd,rm) -# define SUBS(rd,rn,rm) CC_SUBS(ARM_CC_AL,rd,rn,rm) -# define T2_SUBS(rd,rn,rm) torrr(THUMB2_SUB|ARM_S,rn,rd,rm) -# define CC_SUBSI(cc,rd,rn,im) corri(cc,ARM_SUB|ARM_S|ARM_I,rn,rd,im) -# define SUBSI(rd,rn,im) CC_SUBSI(ARM_CC_AL,rd,rn,im) -# define T2_SUBSI(rd,rn,im) torri(THUMB2_SUBI|ARM_S,rn,rd,im) -# define CC_SBC(cc,rd,rn,rm) corrr(cc,ARM_SBC,rn,rd,rm) -# define SBC(rd,rn,rm) CC_SBC(ARM_CC_AL,rd,rn,rm) -# define T1_SBC(rdn,rm) is(THUMB_SBC|(_u3(rm)<<3)|_u3(rdn)) -# define T2_SBC(rd,rn,rm) torrr(THUMB2_SBC,rn,rd,rm) -# define CC_SBCI(cc,rd,rn,im) corri(cc,ARM_SBC|ARM_I,rn,rd,im) -# define SBCI(rd,rn,im) CC_SBCI(ARM_CC_AL,rd,rn,im) -# define T2_SBCI(rd,rn,im) torri(THUMB2_SBCI,rn,rd,im) -# define CC_SBCS(cc,rd,rn,rm) corrr(cc,ARM_SBC|ARM_S,rn,rd,rm) -# define SBCS(rd,rn,rm) CC_SBCS(ARM_CC_AL,rd,rn,rm) -# define T2_SBCS(rd,rn,rm) torrr(THUMB2_SBC|ARM_S,rn,rd,rm) -# define CC_SBCSI(cc,rd,rn,im) corri(cc,ARM_SBC|ARM_S|ARM_I,rn,rd,im) -# define SBCSI(rd,rn,im) CC_SBCSI(ARM_CC_AL,rd,rn,im) -# define T2_SBCSI(rd,rn,im) torri(THUMB2_SBCI|ARM_S,rn,rd,im) -# define CC_RSB(cc,rd,rn,rm) corrr(cc,ARM_RSB,rn,rd,rm) -# define RSB(rd,rn,rm) CC_RSB(ARM_CC_AL,rd,rn,rm) -# define T2_RSB(rd,rn,rm) torrr(THUMB2_RSB,rn,rd,rm) -# define CC_RSBI(cc,rd,rn,im) corri(cc,ARM_RSB|ARM_I,rn,rd,im) -# define RSBI(rd,rn,im) CC_RSBI(ARM_CC_AL,rd,rn,im) -# define T1_RSBI(rd,rn) is(THUMB_RSBI|(_u3(rn)<<3)|_u3(rd)) -# define T2_RSBI(rd,rn,im) torri(THUMB2_RSBI,rn,rd,im) -# define CC_MUL(cc,rl,rn,rm) corrrr(cc,ARM_MUL,rl,0,rm,rn) -# define MUL(rl,rn,rm) CC_MUL(ARM_CC_AL,rl,rn,rm) -# define T1_MUL(rdm,rn) is(THUMB_MUL|(_u3(rn)<<3)|_u3(rdm)) -# define T2_MUL(rd,rn,rm) torrr(THUMB2_MUL,rn,rd,rm) -# define CC_SMULL(cc,rl,rh,rn,rm) corrrr(cc,ARM_SMULL,rh,rl,rm,rn) -# define SMULL(rl,rh,rn,rm) CC_SMULL(ARM_CC_AL,rl,rh,rn,rm) -# define T2_SMULL(rl,rh,rn,rm) torrrr(THUMB2_SMULL,rn,rl,rh,rm) -# define CC_UMULL(cc,rl,rh,rn,rm) corrrr(cc,ARM_UMULL,rh,rl,rm,rn) -# define UMULL(rl,rh,rn,rm) CC_UMULL(ARM_CC_AL,rl,rh,rn,rm) -# define T2_UMULL(rl,rh,rn,rm) torrrr(THUMB2_UMULL,rn,rl,rh,rm) -# define T2_SDIV(rd,rn,rm) torrr(THUMB2_SDIV,rn,rd,rm) -# define T2_UDIV(rd,rn,rm) torrr(THUMB2_UDIV,rn,rd,rm) -# define CC_AND(cc,rd,rn,rm) corrr(cc,ARM_AND,rn,rd,rm) -# define AND(rd,rn,rm) CC_AND(ARM_CC_AL,rd,rn,rm) -# define T1_AND(rdn,rm) is(THUMB_AND|(_u3(rm)<<3)|_u3(rdn)) -# define T2_AND(rd,rn,rm) torrr(THUMB2_AND,rn,rd,rm) -# define CC_ANDI(cc,rd,rn,im) corri(cc,ARM_AND|ARM_I,rn,rd,im) -# define ANDI(rd,rn,im) CC_ANDI(ARM_CC_AL,rd,rn,im) -# define T2_ANDI(rd,rn,im) torri(THUMB2_ANDI,rn,rd,im) -# define CC_ANDS(cc,rd,rn,rm) corrr(cc,ARM_AND|ARM_S,rn,rd,rm) -# define ANDS(rd,rn,rm) CC_ANDS(ARM_CC_AL,rd,rn,rm) -# define T2_ANDS(rd,rn,rm) torrr(THUMB2_AND|ARM_S,rn,rd,rm) -# define CC_ANDSI(cc,rd,rn,im) corri(cc,ARM_AND|ARM_S|ARM_I,rn,rd,im) -# define ANDSI(rd,rn,im) CC_ANDSI(ARM_CC_AL,rd,rn,im) -# define T2_ANDSI(rd,rn,im) torri(ARM_CC_AL,THUMB2_ANDI|ARM_S,rn,rd,im) -# define CC_BIC(cc,rd,rn,rm) corrr(cc,ARM_BIC,rn,rd,rm) -# define BIC(rd,rn,rm) CC_BIC(ARM_CC_AL,rd,rn,rm) -# define T2_BIC(rd,rn,rm) torrr(THUMB2_BIC,rn,rd,rm) -# define CC_BICI(cc,rd,rn,im) corri(cc,ARM_BIC|ARM_I,rn,rd,im) -# define BICI(rd,rn,im) CC_BICI(ARM_CC_AL,rd,rn,im) -# define T2_BICI(rd,rn,im) torri(THUMB2_BICI,rn,rd,im) -# define CC_BICS(cc,rd,rn,rm) corrr(cc,ARM_BIC|ARM_S,rn,rd,rm) -# define BICS(rd,rn,rm) CC_BICS(ARM_CC_AL,rd,rn,rm) -# define T2_BICS(rd,rn,rm) torrr(THUMB2_BIC|ARM_S,rn,rd,rm) -# define CC_BICSI(cc,rd,rn,im) corri(cc,ARM_BIC|ARM_S|ARM_I,rn,rd,im) -# define BICSI(rd,rn,im) CC_BICSI(ARM_CC_AL,rd,rn,im) -# define T2_BICSI(rd,rn,im) torri(ARM_CC_AL,THUMB2_BICI|ARM_S,rn,rd,im) -# define CC_ORR(cc,rd,rn,rm) corrr(cc,ARM_ORR,rn,rd,rm) -# define ORR(rd,rn,rm) CC_ORR(ARM_CC_AL,rd,rn,rm) -# define T1_ORR(rdn,rm) is(THUMB_ORR|(_u3(rm)<<3)|_u3(rdn)) -# define T2_ORR(rd,rn,rm) torrr(THUMB2_ORR,rn,rd,rm) -# define CC_ORR_SI(cc,rd,rn,rt,sh,im) corrrs(cc,ARM_ORR|sh,rn,rd,rm,im) -# define ORR_SI(r0,r1,r2,sh,im) CC_ORR_SI(ARM_CC_AL,r0,r1,r2,sh,im) -# define CC_ORRI(cc,rd,rn,im) corri(cc,ARM_ORR|ARM_I,rn,rd,im) -# define ORRI(rd,rn,im) CC_ORRI(ARM_CC_AL,rd,rn,im) -# define T2_ORRI(rd,rn,im) torri(THUMB2_ORRI,rn,rd,im) -# define CC_EOR(cc,rd,rn,rm) corrr(cc,ARM_EOR,rn,rd,rm) -# define EOR(rd,rn,rm) CC_EOR(ARM_CC_AL,rd,rn,rm) -# define T1_EOR(rdn,rm) is(THUMB_EOR|(_u3(rm)<<3)|_u3(rdn)) -# define T2_EOR(rd,rn,rm) torrr(THUMB2_EOR,rn,rd,rm) -# define CC_EOR_SI(cc,rd,rn,rm,sh,im) corrrs(cc,ARM_EOR|sh,rn,rd,rm,im) -# define EOR_SI(r0,r1,r2,sh,im) CC_EOR_SI(ARM_CC_AL,r0,r1,r2,sh,im) -# define CC_EORI(cc,rd,rn,im) corri(cc,ARM_EOR|ARM_I,rn,rd,im) -# define EORI(rd,rn,im) CC_EORI(ARM_CC_AL,rd,rn,im) -# define T2_EORI(rd,rn,im) torri(THUMB2_EORI,rn,rd,im) -# define CC_REV(cc,rd,rm) c6orr(cc,ARM_REV,rd,rm) -# define REV(rd,rm) CC_REV(ARM_CC_AL,rd,rm) -# define T1_REV(rd,rm) is(THUMB_REV|(_u3(rm)<<3)|_u3(rd)) -# define T2_REV(rd,rm) torrr(THUMB2_REV,rm,rd,rm) -# define CC_REV16(cc,rd,rm) c6orr(cc,ARM_REV16,rd,rm) -# define REV16(rd,rm) CC_REV16(ARM_CC_AL,rd,rm) -# define T1_REV16(rd,rm) is(THUMB_REV16|(_u3(rm)<<3)|_u3(rd)) -# define T2_REV16(rd,rm) torrr(THUMB2_REV16,rm,rd,rm) -# define CC_SXTB(cc,rd,rm) c6orr(cc,ARM_SXTB,rd,rm) -# define SXTB(rd,rm) CC_SXTB(ARM_CC_AL,rd,rm) -# define T1_SXTB(rd,rm) is(THUMB_SXTB|(_u3(rm)<<3)|_u3(rd)) -# define T2_SXTB(rd,rm) torrr(THUMB2_SXTB,_R15_REGNO,rd,rm) -# define CC_UXTB(cc,rd,rm) c6orr(cc,ARM_UXTB,rd,rm) -# define UXTB(rd,rm) CC_UXTB(ARM_CC_AL,rd,rm) -# define T1_UXTB(rd,rm) is(THUMB_UXTB|(_u3(rm)<<3)|_u3(rd)) -# define T2_UXTB(rd,rm) torrr(THUMB2_UXTB,_R15_REGNO,rd,rm) -# define CC_SXTH(cc,rd,rm) c6orr(cc,ARM_SXTH,rd,rm) -# define SXTH(rd,rm) CC_SXTH(ARM_CC_AL,rd,rm) -# define T1_SXTH(rd,rm) is(THUMB_SXTH|(_u3(rm)<<3)|_u3(rd)) -# define T2_SXTH(rd,rm) torrr(THUMB2_SXTH,_R15_REGNO,rd,rm) -# define CC_UXTH(cc,rd,rm) c6orr(cc,ARM_UXTH,rd,rm) -# define UXTH(rd,rm) CC_UXTH(ARM_CC_AL,rd,rm) -# define T1_UXTH(rd,rm) is(THUMB_UXTH|(_u3(rm)<<3)|_u3(rd)) -# define T2_UXTH(rd,rm) torrr(THUMB2_UXTH,_R15_REGNO,rd,rm) -# define CC_SHIFT(cc,o,rd,rm,rn,im) cshift(cc,o,rd,rm,rn,im) -# define CC_LSL(cc,rd,rn,rm) CC_SHIFT(cc,ARM_LSL|ARM_R,rd,rm,rn,0) -# define LSL(rd,rn,rm) CC_LSL(ARM_CC_AL,rd,rn,rm) -# define T1_LSL(rdn,rm) is(THUMB_LSL|(_u3(rm)<<3)|_u3(rdn)) -# define T2_LSL(rd,rn,rm) torrr(THUMB2_LSL,rn,rd,rm) -# define CC_LSLI(cc,rd,rn,im) CC_SHIFT(cc,ARM_LSL,rd,0,rn,im) -# define LSLI(rd,rn,im) CC_LSLI(ARM_CC_AL,rd,rn,im) -# define T1_LSLI(rd,rm,im) is(THUMB_LSLI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd)) -# define T2_LSLI(rd,rm,im) tshift(THUMB2_LSLI,rd,rm,im) -# define CC_LSR(cc,rd,rn,rm) CC_SHIFT(cc,ARM_LSR|ARM_R,rd,rm,rn,0) -# define LSR(rd,rn,rm) CC_LSR(ARM_CC_AL,rd,rn,rm) -# define T1_LSR(rdn,rm) is(THUMB_LSR|(_u3(rm)<<3)|_u3(rdn)) -# define T2_LSR(rd,rn,rm) torrr(THUMB2_LSR,rn,rd,rm) -# define CC_LSRI(cc,rd,rn,im) CC_SHIFT(cc,ARM_LSR,rd,0,rn,im) -# define LSRI(rd,rn,im) CC_LSRI(ARM_CC_AL,rd,rn,im) -# define T1_LSRI(rd,rm,im) is(THUMB_LSRI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd)) -# define T2_LSRI(rd,rm,im) tshift(THUMB2_LSRI,rd,rm,im) -# define CC_ASR(cc,rd,rn,rm) CC_SHIFT(cc,ARM_ASR|ARM_R,rd,rm,rn,0) -# define ASR(rd,rn,rm) CC_ASR(ARM_CC_AL,rd,rn,rm) -# define T1_ASR(rdn,rm) is(THUMB_ASR|(_u3(rm)<<3)|_u3(rdn)) -# define T2_ASR(rd,rn,rm) torrr(THUMB2_ASR,rn,rd,rm) -# define CC_ASRI(cc,rd,rn,im) CC_SHIFT(cc,ARM_ASR,rd,0,rn,im) -# define ASRI(rd,rn,im) CC_ASRI(ARM_CC_AL,rd,rn,im) -# define T1_ASRI(rd,rm,im) is(THUMB_ASRI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd)) -# define T2_ASRI(rd,rm,im) tshift(THUMB2_ASRI,rd,rm,im) -# define CC_CMP(cc,rn,rm) corrr(cc,ARM_CMP,rn,0,rm) -# define CMP(rn,rm) CC_CMP(ARM_CC_AL,rn,rm) -# define T1_CMP(rn,rm) is(THUMB_CMP|(_u3(rm)<<3)|_u3(rn)) -# define T1_CMPX(rn,rm) is(THUMB_CMPX|((_u4(rn)&8)<<4)|(_u4(rm)<<3)|(rn&7)) -# define T2_CMP(rn,rm) torrr(THUMB2_CMP,rn,_R15_REGNO,rm) -# define CC_CMPI(cc,rn,im) corri(cc,ARM_CMP|ARM_I,rn,0,im) -# define CMPI(rn,im) CC_CMPI(ARM_CC_AL,rn,im) -# define T1_CMPI(rn,im) is(THUMB_CMPI|(_u3(rn)<<8)|_u8(im)) -# define T2_CMPI(rn,im) torri(THUMB2_CMPI,rn,_R15_REGNO,im) -# define CC_CMN(cc,rn,rm) corrr(cc,ARM_CMN,rn,0,rm) -# define CMN(rn,rm) CC_CMN(ARM_CC_AL,rn,rm) -# define T1_CMN(rn,rm) is(THUMB_CMN|(_u3(rm)<<3)|_u3(rm)) -# define T2_CMN(rn,rm) torrr(THUMB2_CMN,rn,_R15_REGNO,rm) -# define CC_CMNI(cc,rn,im) corri(cc,ARM_CMN|ARM_I,rn,0,im) -# define CMNI(rn,im) CC_CMNI(ARM_CC_AL,rn,im) -# define T2_CMNI(rn,im) torri(THUMB2_CMNI,rn,_R15_REGNO,im) -# define CC_TST(cc,rn,rm) corrr(cc,ARM_TST,rn,r0,rm) -# define TST(rn,rm) CC_TST(ARM_CC_AL,rn,rm) -# define T1_TST(rn,rm) is(THUMB_TST|(_u3(rm)<<3)|_u3(rn)) -# define T2_TST(rn,rm) torrr(THUMB2_TST,rn,_R15_REGNO,rm) -# define CC_TSTI(cc,rn,im) corri(cc,ARM_TST|ARM_I,rn,0,im) -# define TSTI(rn,im) CC_TSTI(ARM_CC_AL,rn,im) -# define T2_TSTI(rn,im) torri(THUMB2_TSTI,rn,_R15_REGNO,im) -# define CC_TEQ(cc,rn,rm) corrr(cc,ARM_TEQ,rn,0,rm) -# define TEQ(rn,rm) CC_TEQ(ARM_CC_AL,rn,rm) -# define CC_TEQI(cc,rm,im) corri(cc,ARM_TEQ|ARM_I,rn,0,im) -# define TEQI(rn,im) CC_TEQI(ARM_CC_AL,rn,im) -# define CC_BX(cc,rm) cbx(cc,ARM_BX,rm) -# define BX(rm) CC_BX(ARM_CC_AL,rm) -# define T1_BX(rm) is(0x4700|(_u4(rm)<<3)) -# define CC_BLX(cc,rm) cbx(cc,ARM_BLX,rm) -# define BLX(rm) CC_BLX(ARM_CC_AL,rm) -# define T1_BLX(rm) is(THUMB_BLX|(_u4(rm)<<3)) -# define BLXI(im) blxi(im) -# define T2_BLXI(im) tb(THUMB2_BLXI,im) -# define CC_B(cc,im) cb(cc,ARM_B,im) -# define B(im) CC_B(ARM_CC_AL,im) -# define T1_CC_B(cc,im) tc8(cc,im) -# define T1_B(im) t11(im) -# define T2_CC_B(cc,im) tcb(cc,im) -# define T2_B(im) tb(THUMB2_B,im) -# define CC_BLI(cc,im) cb(cc,ARM_BLI,im) -# define BLI(im) CC_BLI(ARM_CC_AL,im) -# define T2_BLI(im) tb(THUMB2_BLI,im) -# define CC_LDRSB(cc,rt,rn,rm) corrr(cc,ARM_LDRSB|ARM_P,rn,rt,rm) -# define LDRSB(rt,rn,rm) CC_LDRSB(ARM_CC_AL,rt,rn,rm) -# define T1_LDRSB(rt,rn,rm) is(THUMB_LDRSB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_LDRSB(rt,rn,rm) torxr(THUMB2_LDRSB,rn,rt,rm) -# define CC_LDRSBN(cc,rt,rn,rm) corrr(cc,ARM_LDRSB,rn,rt,rm) -# define LDRSBN(rt,rn,rm) CC_LDRSBN(ARM_CC_AL,rt,rn,rm) -# define CC_LDRSBI(cc,rt,rn,im) corri8(cc,ARM_LDRSBI|ARM_P,rn,rt,im) -# define LDRSBI(rt,rn,im) CC_LDRSBI(ARM_CC_AL,rt,rn,im) -# define T2_LDRSBI(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_U,rn,rt,im) -# define T2_LDRSBWI(rt,rn,im) torri12(THUMB2_LDRSBWI,rn,rt,im) -# define CC_LDRSBIN(cc,rt,rn,im) corri8(cc,ARM_LDRSBI,rn,rt,im) -# define LDRSBIN(rt,rn,im) CC_LDRSBIN(ARM_CC_AL,rt,rn,im) -# define T2_LDRSBIN(rt,rn,im) torri8(THUMB2_LDRSBI,rn,rt,im) -# define CC_LDRB(cc,rt,rn,rm) corrr(cc,ARM_LDRB|ARM_P,rn,rt,rm) -# define LDRB(rt,rn,rm) CC_LDRB(ARM_CC_AL,rt,rn,rm) -# define T1_LDRB(rt,rn,rm) is(THUMB_LDRB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_LDRB(rt,rn,rm) torxr(THUMB2_LDRB,rn,rt,rm) -# define CC_LDRBN(cc,rt,rn,rm) corrr(cc,ARM_LDRB,rn,rt,rm) -# define LDRBN(rt,rn,rm) CC_LDRBN(ARM_CC_AL,rt,rn,rm) -# define CC_LDRBI(cc,rt,rn,im) corri(cc,ARM_LDRBI|ARM_P,rn,rt,im) -# define LDRBI(rt,rn,im) CC_LDRBI(ARM_CC_AL,rt,rn,im) -# define T1_LDRBI(rt,rn,im) is(THUMB_LDRBI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_LDRBI(rt,rn,im) torri8(THUMB2_LDRBI|THUMB2_U,rn,rt,im) -# define T2_LDRBWI(rt,rn,im) torri12(THUMB2_LDRBWI,rn,rt,im) -# define CC_LDRBIN(cc,rt,rn,im) corri(cc,ARM_LDRBI,rn,rt,im) -# define LDRBIN(rt,rn,im) CC_LDRBIN(ARM_CC_AL,rt,rn,im) -# define T2_LDRBIN(rt,rn,im) torri8(THUMB2_LDRBI,rn,rt,im) -# define CC_LDRSH(cc,rt,rn,rm) corrr(cc,ARM_LDRSH|ARM_P,rn,rt,rm) -# define LDRSH(rt,rn,rm) CC_LDRSH(ARM_CC_AL,rt,rn,rm) -# define T1_LDRSH(rt,rn,rm) is(THUMB_LDRSH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_LDRSH(rt,rn,rm) torxr(THUMB2_LDRSH,rn,rt,rm) -# define CC_LDRSHN(cc,rt,rn,rm) corrr(cc,ARM_LDRSH,rn,rt,rm) -# define LDRSHN(rt,rn,rm) CC_LDRSHN(ARM_CC_AL,rt,rn,rm) -# define CC_LDRSHI(cc,rt,rn,im) corri8(cc,ARM_LDRSHI|ARM_P,rn,rt,im) -# define LDRSHI(rt,rn,im) CC_LDRSHI(ARM_CC_AL,rt,rn,im) -# define T2_LDRSHI(rt,rn,im) torri8(THUMB2_LDRSHI|THUMB2_U,rn,rt,im) -# define T2_LDRSHWI(rt,rn,im) torri12(THUMB2_LDRSHWI,rn,rt,im) -# define CC_LDRSHIN(cc,rt,rn,im) corri8(cc,ARM_LDRSHI,rn,rt,im) -# define LDRSHIN(rt,rn,im) CC_LDRSHIN(ARM_CC_AL,rt,rn,im) -# define T2_LDRSHIN(rt,rn,im) torri8(THUMB2_LDRSHI,rn,rt,im) -# define CC_LDRH(cc,rt,rn,rm) corrr(cc,ARM_LDRH|ARM_P,rn,rt,rm) -# define LDRH(rt,rn,rm) CC_LDRH(ARM_CC_AL,rt,rn,rm) -# define T1_LDRH(rt,rn,rm) is(THUMB_LDRH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_LDRH(rt,rn,rm) torxr(THUMB2_LDRH,rn,rt,rm) -# define CC_LDRHN(cc,rt,rn,rm) corrr(cc,ARM_LDRH,rn,rt,rm) -# define LDRHN(rt,rn,rm) CC_LDRHN(ARM_CC_AL,rt,rn,rm) -# define CC_LDRHI(cc,rt,rn,im) corri8(cc,ARM_LDRHI|ARM_P,rn,rt,im) -# define LDRHI(rt,rn,im) CC_LDRHI(ARM_CC_AL,rt,rn,im) -# define T1_LDRHI(rt,rn,im) is(THUMB_LDRHI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_LDRHI(rt,rn,im) torri8(THUMB2_LDRHI|THUMB2_U,rn,rt,im) -# define T2_LDRHWI(rt,rn,im) torri12(THUMB2_LDRHWI,rn,rt,im) -# define CC_LDRHIN(cc,rt,rn,im) corri8(cc,ARM_LDRHI,rn,rt,im) -# define LDRHIN(rt,rn,im) CC_LDRHIN(ARM_CC_AL,rt,rn,im) -# define T2_LDRHIN(rt,rn,im) torri8(THUMB2_LDRHI,rn,rt,im) -# define CC_LDR(cc,rt,rn,rm) corrr(cc,ARM_LDR|ARM_P,rn,rt,rm) -# define LDR(rt,rn,rm) CC_LDR(ARM_CC_AL,rt,rn,rm) -# define T1_LDR(rt,rn,rm) is(THUMB_LDR|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_LDR(rt,rn,rm) torxr(THUMB2_LDR,rn,rt,rm) -# define CC_LDRN(cc,rt,rn,rm) corrr(cc,ARM_LDR,rn,rt,rm) -# define LDRN(rt,rn,rm) CC_LDRN(ARM_CC_AL,rt,rn,rm) -# define CC_LDRI(cc,rt,rn,im) corri(cc,ARM_LDRI|ARM_P,rn,rt,im) -# define LDRI(rt,rn,im) CC_LDRI(ARM_CC_AL,rt,rn,im) -# define T1_LDRI(rt,rn,im) is(THUMB_LDRI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T1_LDRISP(rt,im) is(THUMB_LDRISP|(_u3(rt)<<8)|_u8(im)) -# define T2_LDRI(rt,rn,im) torri8(THUMB2_LDRI|THUMB2_U,rn,rt,im) -# define T2_LDRWI(rt,rn,im) torri12(THUMB2_LDRWI,rn,rt,im) -# define CC_LDRIN(cc,rt,rn,im) corri(cc,ARM_LDRI,rn,rt,im) -# define LDRIN(rt,rn,im) CC_LDRIN(ARM_CC_AL,rt,rn,im) -# define T2_LDRIN(rt,rn,im) torri8(THUMB2_LDRI,rn,rt,im) -# define CC_LDRD(cc,rt,rn,rm) corrr(cc,ARM_LDRD|ARM_P,rn,rt,rm) -# define LDRD(rt,rn,rm) CC_LDRD(ARM_CC_AL,rt,rn,rm) -# define T2_LDRDI(rt,rt2,rn,im) torrri8(THUMB2_LDRDI|ARM_P,rn,rt,rt2,im) -# define CC_LDRDN(cc,rt,rn,rm) corrr(cc,ARM_LDRD,rn,rt,rm) -# define LDRDN(rd,rn,rm) CC_LDRDN(ARM_CC_AL,rt,rn,rm) -# define CC_LDRDI(cc,rt,rn,im) corri8(cc,ARM_LDRDI|ARM_P,rn,rt,im) -# define LDRDI(rt,rn,im) CC_LDRDI(ARM_CC_AL,rt,rn,im) -# define CC_LDRDIN(cc,rt,rn,im) corri8(cc,ARM_LDRDI,rn,rt,im) -# define LDRDIN(rt,rn,im) CC_LDRDIN(ARM_CC_AL,rt,rn,im) -# define T2_LDRDIN(rt,rt2,rn,im) torrri8(THUMB2_LDRDI,rn,rt,rt2,im) -# define CC_STRB(cc,rt,rn,rm) corrr(cc,ARM_STRB|ARM_P,rn,rt,rm) -# define STRB(rt,rn,rm) CC_STRB(ARM_CC_AL,rt,rn,rm) -# define T1_STRB(rt,rn,rm) is(THUMB_STRB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_STRB(rt,rn,rm) torxr(THUMB2_STRB,rn,rt,rm) -# define CC_STRBN(cc,rt,rn,rm) corrr(cc,ARM_STRB,rn,rt,rm) -# define STRBN(rt,rn,rm) CC_STRBN(ARM_CC_AL,rt,rn,rm) -# define CC_STRBI(cc,rt,rn,im) corri(cc,ARM_STRBI|ARM_P,rn,rt,im) -# define STRBI(rt,rn,im) CC_STRBI(ARM_CC_AL,rt,rn,im) -# define T1_STRBI(rt,rn,im) is(THUMB_STRBI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_STRBI(rt,rn,im) torri8(THUMB2_STRBI|THUMB2_U,rn,rt,im) -# define T2_STRBWI(rt,rn,im) torri12(THUMB2_STRBWI,rn,rt,im) -# define CC_STRBIN(cc,rt,rn,im) corri(cc,ARM_STRBI,rn,rt,im) -# define STRBIN(rt,rn,im) CC_STRBIN(ARM_CC_AL,rt,rn,im) -# define T2_STRBIN(rt,rn,im) torri8(THUMB2_STRBI,rn,rt,im) -# define CC_STRH(cc,rt,rn,rm) corrr(cc,ARM_STRH|ARM_P,rn,rt,rm) -# define STRH(rt,rn,rm) CC_STRH(ARM_CC_AL,rt,rn,rm) -# define T1_STRH(rt,rn,rm) is(THUMB_STRH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_STRH(rt,rn,rm) torxr(THUMB2_STRH,rn,rt,rm) -# define CC_STRHN(cc,rt,rn,rm) corrr(cc,ARM_STRH,rn,rt,rm) -# define STRHN(rt,rn,rm) CC_STRHN(ARM_CC_AL,rt,rn,rm) -# define CC_STRHI(cc,rt,rn,im) corri8(cc,ARM_STRHI|ARM_P,rn,rt,im) -# define STRHI(rt,rn,im) CC_STRHI(ARM_CC_AL,rt,rn,im) -# define T1_STRHI(rt,rn,im) is(THUMB_STRHI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_STRHI(rt,rn,im) torri8(THUMB2_STRHI|THUMB2_U,rn,rt,im) -# define T2_STRHWI(rt,rn,im) torri12(THUMB2_STRHWI,rn,rt,im) -# define CC_STRHIN(cc,rt,rn,im) corri8(cc,ARM_STRHI,rn,rt,im) -# define STRHIN(rt,rn,im) CC_STRHIN(ARM_CC_AL,rt,rn,im) -# define T2_STRHIN(rt,rn,im) torri8(THUMB2_STRHI,rn,rt,im) -# define CC_STR(cc,rt,rn,rm) corrr(cc,ARM_STR|ARM_P,rn,rt,rm) -# define STR(rt,rn,rm) CC_STR(ARM_CC_AL,rt,rn,rm) -# define T1_STR(rt,rn,rm) is(THUMB_STR|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T2_STR(rt,rn,rm) torxr(THUMB2_STR,rn,rt,rm) -# define CC_STRN(cc,rt,rn,rm) corrr(cc,ARM_STR,rn,rt,rm) -# define STRN(rt,rn,rm) CC_STRN(ARM_CC_AL,rt,rn,rm) -# define CC_STRI(cc,rt,rn,im) corri(cc,ARM_STRI|ARM_P,rn,rt,im) -# define STRI(rt,rn,im) CC_STRI(ARM_CC_AL,rt,rn,im) -# define T1_STRI(rt,rn,im) is(THUMB_STRI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) -# define T1_STRISP(rt,im) is(THUMB_STRISP|(_u3(rt)<<8)|(_u8(im))) -# define T2_STRI(rt,rn,im) torri8(THUMB2_STRI|THUMB2_U,rn,rt,im) -# define T2_STRWI(rt,rn,im) torri12(THUMB2_STRWI,rn,rt,im) -# define CC_STRIN(cc,rt,rn,im) corri(cc,ARM_STRI,rn,rt,im) -# define STRIN(rt,rn,im) CC_STRIN(ARM_CC_AL,rt,rn,im) -# define T2_STRIN(rt,rn,im) torri8(THUMB2_STRI,rn,rt,im) -# define CC_STRD(cc,rt,rn,rm) corrr(cc,ARM_STRD|ARM_P,rn,rt,rm) -# define STRD(rt,rn,rm) CC_STRD(ARM_CC_AL,rt,rn,rm) -# define CC_STRDN(cc,rt,rn,rm) corrr(cc,ARM_STRD,rn,rt,rm) -# define STRDN(rt,rn,rm) CC_STRDN(ARM_CC_AL,rt,rn,rm) -# define CC_STRDI(cc,rt,rn,im) corri8(cc,ARM_STRDI|ARM_P,rn,rt,im) -# define STRDI(rt,rn,im) CC_STRDI(ARM_CC_AL,rt,rn,im) -# define T2_STRDI(rt,rt2,rn,im) torrri8(THUMB2_STRDI|ARM_P,rn,rt,rt2,im) -# define CC_STRDIN(cc,rt,rn,im) corri8(cc,ARM_STRDI,rn,rt,im) -# define STRDIN(rt,rn,im) CC_STRDIN(ARM_CC_AL,rt,rn,im) -# define T2_STRDIN(rt,rt2,rn,im) torrri8(THUMB2_STRDI,rn,rt,rt2,im) -# define CC_LDMIA(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I,rn,im) -# define LDMIA(rn,im) CC_LDMIA(ARM_CC_AL,rn,im) -# define CC_LDM(cc,rn,im) CC_LDMIA(cc,rn,im) -# define LDM(rn,im) LDMIA(rn,im) -# define T1_LDMIA(rn,im) is(THUMB_LDMIA|(_u3(rn)<<8)|im) -# define T2_LDMIA(rn,im) torl(THUMB2_LDMIA,rn,im) -# define CC_LDMIA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_U,rn,im) -# define LDMIA_U(rn,im) CC_LDMIA_U(ARM_CC_AL,rn,im) -# define LDM_U(r0,i0) LDMIA_U(r0,i0) -# define CC_LDMIB(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_B,rn,im) -# define LDMIB(rn,im) CC_LDMIB(ARM_CC_AL,rn,im) -# define CC_LDMIB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_B|ARM_M_U,rn,im) -# define LDMIB_U(rn,im) CC_LDMIB_U(ARM_CC_AL,rn,im) -# define CC_LDMDA(cc,rn,im) corl(cc,ARM_M|ARM_M_L,rn,im) -# define LDMDA(rn,im) CC_LDMDA(ARM_CC_AL,rn,im) -# define CC_LDMDA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_U,rn,im) -# define LDMDA_U(rn,im) CC_LDMDA_U(ARM_CC_AL,rn,im) -# define CC_LDMDB(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_B,rn,im) -# define LDMDB(rn,im) CC_LDMDB(ARM_CC_AL,rn,im) -# define T2_LDMDB(rn,im) torl(THUMB2_LDMDB,rn,im) -# define CC_LDMDB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_B|ARM_M_U,rn,im) -# define LDMDB_U(rn,im) CC_LDMDB_U(ARM_CC_AL,rn,im) -# define CC_STMIA(cc,rn,im) corl(cc,ARM_M|ARM_M_I,rn,im) -# define STMIA(rn,im) CC_STMIA(ARM_CC_AL,rn,im) -# define CC_STM(cc,rn,im) CC_STMIA(cc,rn,im) -# define STM(rn,im) STMIA(rn,im) -# define CC_STMIA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_U,rn,im) -# define STMIA_U(rn,im) CC_STMIA_U(ARM_CC_AL,rn,im) -# define CC_STM_U(cc,rn,im) CC_STMIA_U(cc,rn,im) -# define STM_U(rn,im) STMIA_U(rn,im) -# define CC_STMIB(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_B,rn,im) -# define STMIB(rn,im) CC_STMIB(ARM_CC_AL,rn,im) -# define CC_STMIB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_B|ARM_M_U,rn,im) -# define STMIB_U(rn,im) CC_STMIB_U(ARM_CC_AL,rn,im) -# define CC_STMDA(cc,rn,im) corl(cc,ARM_M,rn,im) -# define STMDA(rn,im) CC_STMDA(ARM_CC_AL,rn,im) -# define CC_STMDA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_U,rn,im) -# define STMDA_U(rn,im) CC_STMDA_U(ARM_CC_AL,rn,im) -# define CC_STMDB(cc,rn,im) corl(cc,ARM_M|ARM_M_B,rn,im) -# define STMDB(rn,im) CC_STMDB(ARM_CC_AL,rn,im) -# define CC_STMDB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_B|ARM_M_U,rn,im) -# define STMDB_U(rn,im) CC_STMDB_U(ARM_CC_AL,rn,im) -# define CC_PUSH(cc,im) CC_STMDB_U(cc,_SP_REGNO,im) -# define PUSH(im) STMDB_U(_SP_REGNO,im) -# define T1_PUSH(im) is(THUMB_PUSH|((im&0x4000)>>6)|(im&0xff)) -# define T2_PUSH(im) tpp(THUMB2_PUSH,im) -# define CC_POP(cc,im) LDMIA_U(cc,_SP_REGNO,im) -# define POP(im) LDMIA_U(_SP_REGNO,im) -# define T1_POP(im) is(THUMB_POP|((im&0x8000)>>7)|(im&0xff)) -# define T2_POP(im) tpp(THUMB2_POP,im) -# define jit_get_reg_args() \ - do { \ - (void)jit_get_reg(_R0|jit_class_named|jit_class_gpr); \ - (void)jit_get_reg(_R1|jit_class_named|jit_class_gpr); \ - (void)jit_get_reg(_R2|jit_class_named|jit_class_gpr); \ - (void)jit_get_reg(_R3|jit_class_named|jit_class_gpr); \ +# define CC_MOV(cc,rd,rm) corrr(cc,ARM_MOV,0,rd,rm) +# define MOV(rd,rm) CC_MOV(ARM_CC_AL,rd,rm) +# define T1_MOV(rd,rm) is(THUMB_MOV|((_u4(rd)&8)<<4)|(_u4(rm)<<3)|(rd&7)) +# define T2_MOV(rd,rm) T2_ORR(rd,_R15_REGNO,rm) +# define CC_MOVI(cc,rd,im) corri(cc,ARM_MOV|ARM_I,0,rd,im) +# define MOVI(rd,im) CC_MOVI(ARM_CC_AL,rd,im) +# define CC_MOVWI(cc,rd,im) coriw(cc,ARM_MOVWI,rd,im) +# define MOVWI(rd,im) CC_MOVWI(ARM_CC_AL,rd,im) +# define T1_MOVI(rd,im) is(THUMB_MOVI|(_u3(rd)<<8)|_u8(im)) +# define T2_MOVI(rd,im) torri(THUMB2_MOVI,_R15_REGNO,rd,im) +# define T2_MOVWI(rd,im) toriw(THUMB2_MOVWI,rd,im) +# define CC_MOVTI(cc,rd,im) coriw(cc,ARM_MOVTI,rd,im) +# define MOVTI(rd,im) CC_MOVTI(ARM_CC_AL,rd,im) +# define T2_MOVTI(rd,im) toriw(THUMB2_MOVTI,rd,im) +# define CC_MVN(cc,rd,rm) corrr(cc,ARM_MVN,0,rd,rm) +# define MVN(rd,rm) CC_MVN(ARM_CC_AL,rd,rm) +# define T1_MVN(rd,rm) is(THUMB_MVN|(_u3(rm)<<3)|_u3(rd)) +# define T2_MVN(rd,rm) torrr(THUMB2_MVN,_R15_REGNO,rd,rm) +# define CC_MVNI(cc,rd,im) corri(cc,ARM_MVN|ARM_I,0,rd,im) +# define MVNI(rd,im) CC_MVNI(ARM_CC_AL,rd,im) +# define T2_MVNI(rd,im) torri(THUMB2_MVNI,_R15_REGNO,rd,im) +# define CC_NOT(cc,rd,rm) CC_MVN(cc,rd,rm) +# define NOT(rd,rm) CC_NOT(ARM_CC_AL,rd,rm) +# define T1_NOT(rd,rm) T1_MVN(rd,rm) +# define T2_NOT(rd,rm) T2_MVN(rd,rm) +# define NOP() MOV(_R0_REGNO, _R0_REGNO) +# define T1_NOP() is(0xbf00) +# define CC_ADD(cc,rd,rn,rm) corrr(cc,ARM_ADD,rn,rd,rm) +# define ADD(rd,rn,rm) CC_ADD(ARM_CC_AL,rd,rn,rm) +# define T1_ADD(rd,rn,rm) is(THUMB_ADD|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rd)) +# define T1_ADDX(rdn,rm) is(THUMB_ADDX|((_u4(rdn)&8)<<4)|(_u4(rm)<<3)|(rdn&7)) +# define T2_ADD(rd,rn,rm) torrr(THUMB2_ADD,rn,rd,rm) +# define CC_ADDI(cc,rd,rn,im) corri(cc,ARM_ADD|ARM_I,rn,rd,im) +# define ADDI(rd,rn,im) CC_ADDI(ARM_CC_AL,rd,rn,im) +# define T1_ADDI3(rd,rn,im) is(THUMB_ADDI3|(_u3(im)<<6)|(_u3(rn)<<3)|_u3(rd)) +# define T1_ADDI8(rdn,im) is(THUMB_ADDI8|(_u3(rdn)<<8)|_u8(im)) +# define T2_ADDI(rd,rn,im) torri(THUMB2_ADDI,rn,rd,im) +# define T2_ADDWI(rd,rn,im) torri(THUMB2_ADDWI,rn,rd,im) +# define CC_ADDS(cc,rd,rn,rm) corrr(cc,ARM_ADD|ARM_S,rn,rd,rm) +# define ADDS(rd,rn,rm) CC_ADDS(ARM_CC_AL,rd,rn,rm) +# define T2_ADDS(rd,rn,rm) torrr(THUMB2_ADD|ARM_S,rn,rd,rm) +# define ADDSI(rd,rn,im) corri(ARM_CC_AL,ARM_ADD|ARM_S|ARM_I,rn,rd,im) +# define T2_ADDSI(rd,rn,im) torri(THUMB2_ADDI|ARM_S,rn,rd,im) +# define CC_ADC(cc,rd,rn,rm) corrr(cc,ARM_ADC,rn,rd,rm) +# define ADC(rd,rn,rm) CC_ADC(ARM_CC_AL,rd,rn,rm) +# define T1_ADC(rdn,rm) is(THUMB_ADC|(_u3(rm)<<3)|_u3(rdn)) +# define T2_ADC(rd,rn,rm) torrr(THUMB2_ADC,rn,rd,rm) +# define CC_ADCI(cc,rd,rn,im) corri(cc,ARM_ADC|ARM_I,rn,rd,im) +# define ADCI(rd,rn,im) CC_ADCI(ARM_CC_AL,rd,rn,im) +# define T2_ADCI(rd,rn,im) torri(THUMB2_ADCI,rn,rd,im) +# define CC_ADCS(cc,rd,rn,rm) corrr(cc,ARM_ADC|ARM_S,rn,rd,rm) +# define ADCS(rd,rn,rm) CC_ADCS(ARM_CC_AL,rd,rn,rm) +# define T2_ADCS(rd,rn,rm) torrr(THUMB2_ADC|ARM_S,rn,rd,rm) +# define CC_ADCSI(cc,rd,rn,im) corri(cc,ARM_ADC|ARM_S|ARM_I,rn,rd,im) +# define ADCSI(rd,rn,im) CC_ADCSI(ARM_CC_AL,rd,rn,im) +# define T2_ADCSI(rd,rn,im) torri(THUMB2_ADCI|ARM_S,rn,rd,im) +# define CC_SUB(cc,rd,rn,rm) corrr(cc,ARM_SUB,rn,rd,rm) +# define SUB(rd,rn,rm) CC_SUB(ARM_CC_AL,rd,rn,rm) +# define T1_SUB(rd,rn,rm) is(THUMB_SUB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rd)) +# define T2_SUB(rd,rn,rm) torrr(THUMB2_SUB,rn,rd,rm) +# define CC_SUBI(cc,rd,rn,im) corri(cc,ARM_SUB|ARM_I,rn,rd,im) +# define SUBI(rd,rn,im) CC_SUBI(ARM_CC_AL,rd,rn,im) +# define T1_SUBI3(rd,rn,im) is(THUMB_SUBI3|(_u3(im)<<6)|(_u3(rn)<<3)|_u3(rd)) +# define T1_SUBI8(rdn,im) is(THUMB_SUBI8|(_u3(rdn)<<8)|_u8(im)) +# define T2_SUBI(rd,rn,im) torri(THUMB2_SUBI,rn,rd,im) +# define T2_SUBWI(rd,rn,im) torri(THUMB2_SUBWI,rn,rd,im) +# define CC_SUBS(cc,rd,rn,rm) corrr(cc,ARM_SUB|ARM_S,rn,rd,rm) +# define SUBS(rd,rn,rm) CC_SUBS(ARM_CC_AL,rd,rn,rm) +# define T2_SUBS(rd,rn,rm) torrr(THUMB2_SUB|ARM_S,rn,rd,rm) +# define CC_SUBSI(cc,rd,rn,im) corri(cc,ARM_SUB|ARM_S|ARM_I,rn,rd,im) +# define SUBSI(rd,rn,im) CC_SUBSI(ARM_CC_AL,rd,rn,im) +# define T2_SUBSI(rd,rn,im) torri(THUMB2_SUBI|ARM_S,rn,rd,im) +# define CC_SBC(cc,rd,rn,rm) corrr(cc,ARM_SBC,rn,rd,rm) +# define SBC(rd,rn,rm) CC_SBC(ARM_CC_AL,rd,rn,rm) +# define T1_SBC(rdn,rm) is(THUMB_SBC|(_u3(rm)<<3)|_u3(rdn)) +# define T2_SBC(rd,rn,rm) torrr(THUMB2_SBC,rn,rd,rm) +# define CC_SBCI(cc,rd,rn,im) corri(cc,ARM_SBC|ARM_I,rn,rd,im) +# define SBCI(rd,rn,im) CC_SBCI(ARM_CC_AL,rd,rn,im) +# define T2_SBCI(rd,rn,im) torri(THUMB2_SBCI,rn,rd,im) +# define CC_SBCS(cc,rd,rn,rm) corrr(cc,ARM_SBC|ARM_S,rn,rd,rm) +# define SBCS(rd,rn,rm) CC_SBCS(ARM_CC_AL,rd,rn,rm) +# define T2_SBCS(rd,rn,rm) torrr(THUMB2_SBC|ARM_S,rn,rd,rm) +# define CC_SBCSI(cc,rd,rn,im) corri(cc,ARM_SBC|ARM_S|ARM_I,rn,rd,im) +# define SBCSI(rd,rn,im) CC_SBCSI(ARM_CC_AL,rd,rn,im) +# define T2_SBCSI(rd,rn,im) torri(THUMB2_SBCI|ARM_S,rn,rd,im) +# define CC_RSB(cc,rd,rn,rm) corrr(cc,ARM_RSB,rn,rd,rm) +# define RSB(rd,rn,rm) CC_RSB(ARM_CC_AL,rd,rn,rm) +# define T2_RSB(rd,rn,rm) torrr(THUMB2_RSB,rn,rd,rm) +# define CC_RSBI(cc,rd,rn,im) corri(cc,ARM_RSB|ARM_I,rn,rd,im) +# define RSBI(rd,rn,im) CC_RSBI(ARM_CC_AL,rd,rn,im) +# define T1_RSBI(rd,rn) is(THUMB_RSBI|(_u3(rn)<<3)|_u3(rd)) +# define T2_RSBI(rd,rn,im) torri(THUMB2_RSBI,rn,rd,im) +# define CC_MUL(cc,rl,rn,rm) corrrr(cc,ARM_MUL,rl,0,rm,rn) +# define MUL(rl,rn,rm) CC_MUL(ARM_CC_AL,rl,rn,rm) +# define T1_MUL(rdm,rn) is(THUMB_MUL|(_u3(rn)<<3)|_u3(rdm)) +# define T2_MUL(rd,rn,rm) torrr(THUMB2_MUL,rn,rd,rm) +# define CC_SMULL(cc,rl,rh,rn,rm) corrrr(cc,ARM_SMULL,rh,rl,rm,rn) +# define SMULL(rl,rh,rn,rm) CC_SMULL(ARM_CC_AL,rl,rh,rn,rm) +# define T2_SMULL(rl,rh,rn,rm) torrrr(THUMB2_SMULL,rn,rl,rh,rm) +# define CC_UMULL(cc,rl,rh,rn,rm) corrrr(cc,ARM_UMULL,rh,rl,rm,rn) +# define UMULL(rl,rh,rn,rm) CC_UMULL(ARM_CC_AL,rl,rh,rn,rm) +# define T2_UMULL(rl,rh,rn,rm) torrrr(THUMB2_UMULL,rn,rl,rh,rm) +# define T2_SDIV(rd,rn,rm) torrr(THUMB2_SDIV,rn,rd,rm) +# define T2_UDIV(rd,rn,rm) torrr(THUMB2_UDIV,rn,rd,rm) +# define CC_AND(cc,rd,rn,rm) corrr(cc,ARM_AND,rn,rd,rm) +# define AND(rd,rn,rm) CC_AND(ARM_CC_AL,rd,rn,rm) +# define T1_AND(rdn,rm) is(THUMB_AND|(_u3(rm)<<3)|_u3(rdn)) +# define T2_AND(rd,rn,rm) torrr(THUMB2_AND,rn,rd,rm) +# define CC_ANDI(cc,rd,rn,im) corri(cc,ARM_AND|ARM_I,rn,rd,im) +# define ANDI(rd,rn,im) CC_ANDI(ARM_CC_AL,rd,rn,im) +# define T2_ANDI(rd,rn,im) torri(THUMB2_ANDI,rn,rd,im) +# define CC_ANDS(cc,rd,rn,rm) corrr(cc,ARM_AND|ARM_S,rn,rd,rm) +# define ANDS(rd,rn,rm) CC_ANDS(ARM_CC_AL,rd,rn,rm) +# define T2_ANDS(rd,rn,rm) torrr(THUMB2_AND|ARM_S,rn,rd,rm) +# define CC_ANDSI(cc,rd,rn,im) corri(cc,ARM_AND|ARM_S|ARM_I,rn,rd,im) +# define ANDSI(rd,rn,im) CC_ANDSI(ARM_CC_AL,rd,rn,im) +# define T2_ANDSI(rd,rn,im) torri(ARM_CC_AL,THUMB2_ANDI|ARM_S,rn,rd,im) +# define CC_BIC(cc,rd,rn,rm) corrr(cc,ARM_BIC,rn,rd,rm) +# define BIC(rd,rn,rm) CC_BIC(ARM_CC_AL,rd,rn,rm) +# define T2_BIC(rd,rn,rm) torrr(THUMB2_BIC,rn,rd,rm) +# define CC_BICI(cc,rd,rn,im) corri(cc,ARM_BIC|ARM_I,rn,rd,im) +# define BICI(rd,rn,im) CC_BICI(ARM_CC_AL,rd,rn,im) +# define T2_BICI(rd,rn,im) torri(THUMB2_BICI,rn,rd,im) +# define CC_BICS(cc,rd,rn,rm) corrr(cc,ARM_BIC|ARM_S,rn,rd,rm) +# define BICS(rd,rn,rm) CC_BICS(ARM_CC_AL,rd,rn,rm) +# define T2_BICS(rd,rn,rm) torrr(THUMB2_BIC|ARM_S,rn,rd,rm) +# define CC_BICSI(cc,rd,rn,im) corri(cc,ARM_BIC|ARM_S|ARM_I,rn,rd,im) +# define BICSI(rd,rn,im) CC_BICSI(ARM_CC_AL,rd,rn,im) +# define T2_BICSI(rd,rn,im) torri(ARM_CC_AL,THUMB2_BICI|ARM_S,rn,rd,im) +# define CC_ORR(cc,rd,rn,rm) corrr(cc,ARM_ORR,rn,rd,rm) +# define ORR(rd,rn,rm) CC_ORR(ARM_CC_AL,rd,rn,rm) +# define T1_ORR(rdn,rm) is(THUMB_ORR|(_u3(rm)<<3)|_u3(rdn)) +# define T2_ORR(rd,rn,rm) torrr(THUMB2_ORR,rn,rd,rm) +# define CC_ORR_SI(cc,rd,rn,rt,sh,im) corrrs(cc,ARM_ORR|sh,rn,rd,rm,im) +# define ORR_SI(r0,r1,r2,sh,im) CC_ORR_SI(ARM_CC_AL,r0,r1,r2,sh,im) +# define CC_ORRI(cc,rd,rn,im) corri(cc,ARM_ORR|ARM_I,rn,rd,im) +# define ORRI(rd,rn,im) CC_ORRI(ARM_CC_AL,rd,rn,im) +# define T2_ORRI(rd,rn,im) torri(THUMB2_ORRI,rn,rd,im) +# define CC_EOR(cc,rd,rn,rm) corrr(cc,ARM_EOR,rn,rd,rm) +# define EOR(rd,rn,rm) CC_EOR(ARM_CC_AL,rd,rn,rm) +# define T1_EOR(rdn,rm) is(THUMB_EOR|(_u3(rm)<<3)|_u3(rdn)) +# define T2_EOR(rd,rn,rm) torrr(THUMB2_EOR,rn,rd,rm) +# define CC_EOR_SI(cc,rd,rn,rm,sh,im) corrrs(cc,ARM_EOR|sh,rn,rd,rm,im) +# define EOR_SI(r0,r1,r2,sh,im) CC_EOR_SI(ARM_CC_AL,r0,r1,r2,sh,im) +# define CC_EORI(cc,rd,rn,im) corri(cc,ARM_EOR|ARM_I,rn,rd,im) +# define EORI(rd,rn,im) CC_EORI(ARM_CC_AL,rd,rn,im) +# define T2_EORI(rd,rn,im) torri(THUMB2_EORI,rn,rd,im) +# define CC_REV(cc,rd,rm) c6orr(cc,ARM_REV,rd,rm) +# define REV(rd,rm) CC_REV(ARM_CC_AL,rd,rm) +# define T1_REV(rd,rm) is(THUMB_REV|(_u3(rm)<<3)|_u3(rd)) +# define T2_REV(rd,rm) torrr(THUMB2_REV,rm,rd,rm) +# define CC_REV16(cc,rd,rm) c6orr(cc,ARM_REV16,rd,rm) +# define REV16(rd,rm) CC_REV16(ARM_CC_AL,rd,rm) +# define T1_REV16(rd,rm) is(THUMB_REV16|(_u3(rm)<<3)|_u3(rd)) +# define T2_REV16(rd,rm) torrr(THUMB2_REV16,rm,rd,rm) +# define CC_SXTB(cc,rd,rm) c6orr(cc,ARM_SXTB,rd,rm) +# define SXTB(rd,rm) CC_SXTB(ARM_CC_AL,rd,rm) +# define T1_SXTB(rd,rm) is(THUMB_SXTB|(_u3(rm)<<3)|_u3(rd)) +# define T2_SXTB(rd,rm) torrr(THUMB2_SXTB,_R15_REGNO,rd,rm) +# define CC_UXTB(cc,rd,rm) c6orr(cc,ARM_UXTB,rd,rm) +# define UXTB(rd,rm) CC_UXTB(ARM_CC_AL,rd,rm) +# define T1_UXTB(rd,rm) is(THUMB_UXTB|(_u3(rm)<<3)|_u3(rd)) +# define T2_UXTB(rd,rm) torrr(THUMB2_UXTB,_R15_REGNO,rd,rm) +# define CC_SXTH(cc,rd,rm) c6orr(cc,ARM_SXTH,rd,rm) +# define SXTH(rd,rm) CC_SXTH(ARM_CC_AL,rd,rm) +# define T1_SXTH(rd,rm) is(THUMB_SXTH|(_u3(rm)<<3)|_u3(rd)) +# define T2_SXTH(rd,rm) torrr(THUMB2_SXTH,_R15_REGNO,rd,rm) +# define CC_UXTH(cc,rd,rm) c6orr(cc,ARM_UXTH,rd,rm) +# define UXTH(rd,rm) CC_UXTH(ARM_CC_AL,rd,rm) +# define T1_UXTH(rd,rm) is(THUMB_UXTH|(_u3(rm)<<3)|_u3(rd)) +# define T2_UXTH(rd,rm) torrr(THUMB2_UXTH,_R15_REGNO,rd,rm) +# define CC_SHIFT(cc,o,rd,rm,rn,im) cshift(cc,o,rd,rm,rn,im) +# define CC_LSL(cc,rd,rn,rm) CC_SHIFT(cc,ARM_LSL|ARM_R,rd,rm,rn,0) +# define LSL(rd,rn,rm) CC_LSL(ARM_CC_AL,rd,rn,rm) +# define T1_LSL(rdn,rm) is(THUMB_LSL|(_u3(rm)<<3)|_u3(rdn)) +# define T2_LSL(rd,rn,rm) torrr(THUMB2_LSL,rn,rd,rm) +# define CC_LSLI(cc,rd,rn,im) CC_SHIFT(cc,ARM_LSL,rd,0,rn,im) +# define LSLI(rd,rn,im) CC_LSLI(ARM_CC_AL,rd,rn,im) +# define T1_LSLI(rd,rm,im) is(THUMB_LSLI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd)) +# define T2_LSLI(rd,rm,im) tshift(THUMB2_LSLI,rd,rm,im) +# define CC_LSR(cc,rd,rn,rm) CC_SHIFT(cc,ARM_LSR|ARM_R,rd,rm,rn,0) +# define LSR(rd,rn,rm) CC_LSR(ARM_CC_AL,rd,rn,rm) +# define T1_LSR(rdn,rm) is(THUMB_LSR|(_u3(rm)<<3)|_u3(rdn)) +# define T2_LSR(rd,rn,rm) torrr(THUMB2_LSR,rn,rd,rm) +# define CC_LSRI(cc,rd,rn,im) CC_SHIFT(cc,ARM_LSR,rd,0,rn,im) +# define LSRI(rd,rn,im) CC_LSRI(ARM_CC_AL,rd,rn,im) +# define T1_LSRI(rd,rm,im) is(THUMB_LSRI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd)) +# define T2_LSRI(rd,rm,im) tshift(THUMB2_LSRI,rd,rm,im) +# define CC_ASR(cc,rd,rn,rm) CC_SHIFT(cc,ARM_ASR|ARM_R,rd,rm,rn,0) +# define ASR(rd,rn,rm) CC_ASR(ARM_CC_AL,rd,rn,rm) +# define T1_ASR(rdn,rm) is(THUMB_ASR|(_u3(rm)<<3)|_u3(rdn)) +# define T2_ASR(rd,rn,rm) torrr(THUMB2_ASR,rn,rd,rm) +# define CC_ASRI(cc,rd,rn,im) CC_SHIFT(cc,ARM_ASR,rd,0,rn,im) +# define ASRI(rd,rn,im) CC_ASRI(ARM_CC_AL,rd,rn,im) +# define T1_ASRI(rd,rm,im) is(THUMB_ASRI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd)) +# define T2_ASRI(rd,rm,im) tshift(THUMB2_ASRI,rd,rm,im) +# define CC_CMP(cc,rn,rm) corrr(cc,ARM_CMP,rn,0,rm) +# define CMP(rn,rm) CC_CMP(ARM_CC_AL,rn,rm) +# define T1_CMP(rn,rm) is(THUMB_CMP|(_u3(rm)<<3)|_u3(rn)) +# define T1_CMPX(rn,rm) is(THUMB_CMPX|((_u4(rn)&8)<<4)|(_u4(rm)<<3)|(rn&7)) +# define T2_CMP(rn,rm) torrr(THUMB2_CMP,rn,_R15_REGNO,rm) +# define CC_CMPI(cc,rn,im) corri(cc,ARM_CMP|ARM_I,rn,0,im) +# define CMPI(rn,im) CC_CMPI(ARM_CC_AL,rn,im) +# define T1_CMPI(rn,im) is(THUMB_CMPI|(_u3(rn)<<8)|_u8(im)) +# define T2_CMPI(rn,im) torri(THUMB2_CMPI,rn,_R15_REGNO,im) +# define CC_CMN(cc,rn,rm) corrr(cc,ARM_CMN,rn,0,rm) +# define CMN(rn,rm) CC_CMN(ARM_CC_AL,rn,rm) +# define T1_CMN(rn,rm) is(THUMB_CMN|(_u3(rm)<<3)|_u3(rm)) +# define T2_CMN(rn,rm) torrr(THUMB2_CMN,rn,_R15_REGNO,rm) +# define CC_CMNI(cc,rn,im) corri(cc,ARM_CMN|ARM_I,rn,0,im) +# define CMNI(rn,im) CC_CMNI(ARM_CC_AL,rn,im) +# define T2_CMNI(rn,im) torri(THUMB2_CMNI,rn,_R15_REGNO,im) +# define CC_TST(cc,rn,rm) corrr(cc,ARM_TST,rn,r0,rm) +# define TST(rn,rm) CC_TST(ARM_CC_AL,rn,rm) +# define T1_TST(rn,rm) is(THUMB_TST|(_u3(rm)<<3)|_u3(rn)) +# define T2_TST(rn,rm) torrr(THUMB2_TST,rn,_R15_REGNO,rm) +# define CC_TSTI(cc,rn,im) corri(cc,ARM_TST|ARM_I,rn,0,im) +# define TSTI(rn,im) CC_TSTI(ARM_CC_AL,rn,im) +# define T2_TSTI(rn,im) torri(THUMB2_TSTI,rn,_R15_REGNO,im) +# define CC_TEQ(cc,rn,rm) corrr(cc,ARM_TEQ,rn,0,rm) +# define TEQ(rn,rm) CC_TEQ(ARM_CC_AL,rn,rm) +# define CC_TEQI(cc,rm,im) corri(cc,ARM_TEQ|ARM_I,rn,0,im) +# define TEQI(rn,im) CC_TEQI(ARM_CC_AL,rn,im) +# define CC_BX(cc,rm) cbx(cc,ARM_BX,rm) +# define BX(rm) CC_BX(ARM_CC_AL,rm) +# define T1_BX(rm) is(0x4700|(_u4(rm)<<3)) +# define CC_BLX(cc,rm) cbx(cc,ARM_BLX,rm) +# define BLX(rm) CC_BLX(ARM_CC_AL,rm) +# define T1_BLX(rm) is(THUMB_BLX|(_u4(rm)<<3)) +# define BLXI(im) blxi(im) +# define T2_BLXI(im) tb(THUMB2_BLXI,im) +# define CC_B(cc,im) cb(cc,ARM_B,im) +# define B(im) CC_B(ARM_CC_AL,im) +# define T1_CC_B(cc,im) tc8(cc,im) +# define T1_B(im) t11(im) +# define T2_CC_B(cc,im) tcb(cc,im) +# define T2_B(im) tb(THUMB2_B,im) +# define CC_BLI(cc,im) cb(cc,ARM_BLI,im) +# define BLI(im) CC_BLI(ARM_CC_AL,im) +# define T2_BLI(im) tb(THUMB2_BLI,im) +# define CC_LDRSB(cc,rt,rn,rm) corrr(cc,ARM_LDRSB|ARM_P,rn,rt,rm) +# define LDRSB(rt,rn,rm) CC_LDRSB(ARM_CC_AL,rt,rn,rm) +# define T1_LDRSB(rt,rn,rm) is(THUMB_LDRSB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_LDRSB(rt,rn,rm) torxr(THUMB2_LDRSB,rn,rt,rm) +# define CC_LDRSBN(cc,rt,rn,rm) corrr(cc,ARM_LDRSB,rn,rt,rm) +# define LDRSBN(rt,rn,rm) CC_LDRSBN(ARM_CC_AL,rt,rn,rm) +# define CC_LDRSBI(cc,rt,rn,im) corri8(cc,ARM_LDRSBI|ARM_P,rn,rt,im) +# define LDRSBI(rt,rn,im) CC_LDRSBI(ARM_CC_AL,rt,rn,im) +# define T2_LDRSBI(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_U,rn,rt,im) +# define T2_LDRSBWI(rt,rn,im) torri12(THUMB2_LDRSBWI,rn,rt,im) +# define CC_LDRSBIN(cc,rt,rn,im) corri8(cc,ARM_LDRSBI,rn,rt,im) +# define LDRSBIN(rt,rn,im) CC_LDRSBIN(ARM_CC_AL,rt,rn,im) +# define T2_LDRSBIN(rt,rn,im) torri8(THUMB2_LDRSBI,rn,rt,im) +# define CC_LDRB(cc,rt,rn,rm) corrr(cc,ARM_LDRB|ARM_P,rn,rt,rm) +# define LDRB(rt,rn,rm) CC_LDRB(ARM_CC_AL,rt,rn,rm) +# define T1_LDRB(rt,rn,rm) is(THUMB_LDRB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_LDRB(rt,rn,rm) torxr(THUMB2_LDRB,rn,rt,rm) +# define CC_LDRBN(cc,rt,rn,rm) corrr(cc,ARM_LDRB,rn,rt,rm) +# define LDRBN(rt,rn,rm) CC_LDRBN(ARM_CC_AL,rt,rn,rm) +# define CC_LDRBI(cc,rt,rn,im) corri(cc,ARM_LDRBI|ARM_P,rn,rt,im) +# define LDRBI(rt,rn,im) CC_LDRBI(ARM_CC_AL,rt,rn,im) +# define T1_LDRBI(rt,rn,im) is(THUMB_LDRBI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_LDRBI(rt,rn,im) torri8(THUMB2_LDRBI|THUMB2_U,rn,rt,im) +# define T2_LDRBWI(rt,rn,im) torri12(THUMB2_LDRBWI,rn,rt,im) +# define CC_LDRBIN(cc,rt,rn,im) corri(cc,ARM_LDRBI,rn,rt,im) +# define LDRBIN(rt,rn,im) CC_LDRBIN(ARM_CC_AL,rt,rn,im) +# define T2_LDRBIN(rt,rn,im) torri8(THUMB2_LDRBI,rn,rt,im) +# define CC_LDRSH(cc,rt,rn,rm) corrr(cc,ARM_LDRSH|ARM_P,rn,rt,rm) +# define LDRSH(rt,rn,rm) CC_LDRSH(ARM_CC_AL,rt,rn,rm) +# define T1_LDRSH(rt,rn,rm) is(THUMB_LDRSH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_LDRSH(rt,rn,rm) torxr(THUMB2_LDRSH,rn,rt,rm) +# define CC_LDRSHN(cc,rt,rn,rm) corrr(cc,ARM_LDRSH,rn,rt,rm) +# define LDRSHN(rt,rn,rm) CC_LDRSHN(ARM_CC_AL,rt,rn,rm) +# define CC_LDRSHI(cc,rt,rn,im) corri8(cc,ARM_LDRSHI|ARM_P,rn,rt,im) +# define LDRSHI(rt,rn,im) CC_LDRSHI(ARM_CC_AL,rt,rn,im) +# define T2_LDRSHI(rt,rn,im) torri8(THUMB2_LDRSHI|THUMB2_U,rn,rt,im) +# define T2_LDRSHWI(rt,rn,im) torri12(THUMB2_LDRSHWI,rn,rt,im) +# define CC_LDRSHIN(cc,rt,rn,im) corri8(cc,ARM_LDRSHI,rn,rt,im) +# define LDRSHIN(rt,rn,im) CC_LDRSHIN(ARM_CC_AL,rt,rn,im) +# define T2_LDRSHIN(rt,rn,im) torri8(THUMB2_LDRSHI,rn,rt,im) +# define CC_LDRH(cc,rt,rn,rm) corrr(cc,ARM_LDRH|ARM_P,rn,rt,rm) +# define LDRH(rt,rn,rm) CC_LDRH(ARM_CC_AL,rt,rn,rm) +# define T1_LDRH(rt,rn,rm) is(THUMB_LDRH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_LDRH(rt,rn,rm) torxr(THUMB2_LDRH,rn,rt,rm) +# define CC_LDRHN(cc,rt,rn,rm) corrr(cc,ARM_LDRH,rn,rt,rm) +# define LDRHN(rt,rn,rm) CC_LDRHN(ARM_CC_AL,rt,rn,rm) +# define CC_LDRHI(cc,rt,rn,im) corri8(cc,ARM_LDRHI|ARM_P,rn,rt,im) +# define LDRHI(rt,rn,im) CC_LDRHI(ARM_CC_AL,rt,rn,im) +# define T1_LDRHI(rt,rn,im) is(THUMB_LDRHI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_LDRHI(rt,rn,im) torri8(THUMB2_LDRHI|THUMB2_U,rn,rt,im) +# define T2_LDRHWI(rt,rn,im) torri12(THUMB2_LDRHWI,rn,rt,im) +# define CC_LDRHIN(cc,rt,rn,im) corri8(cc,ARM_LDRHI,rn,rt,im) +# define LDRHIN(rt,rn,im) CC_LDRHIN(ARM_CC_AL,rt,rn,im) +# define T2_LDRHIN(rt,rn,im) torri8(THUMB2_LDRHI,rn,rt,im) +# define CC_LDR(cc,rt,rn,rm) corrr(cc,ARM_LDR|ARM_P,rn,rt,rm) +# define LDR(rt,rn,rm) CC_LDR(ARM_CC_AL,rt,rn,rm) +# define T1_LDR(rt,rn,rm) is(THUMB_LDR|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_LDR(rt,rn,rm) torxr(THUMB2_LDR,rn,rt,rm) +# define CC_LDRN(cc,rt,rn,rm) corrr(cc,ARM_LDR,rn,rt,rm) +# define LDRN(rt,rn,rm) CC_LDRN(ARM_CC_AL,rt,rn,rm) +# define CC_LDRI(cc,rt,rn,im) corri(cc,ARM_LDRI|ARM_P,rn,rt,im) +# define LDRI(rt,rn,im) CC_LDRI(ARM_CC_AL,rt,rn,im) +# define T1_LDRI(rt,rn,im) is(THUMB_LDRI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T1_LDRISP(rt,im) is(THUMB_LDRISP|(_u3(rt)<<8)|_u8(im)) +# define T2_LDRI(rt,rn,im) torri8(THUMB2_LDRI|THUMB2_U,rn,rt,im) +# define T2_LDRWI(rt,rn,im) torri12(THUMB2_LDRWI,rn,rt,im) +# define CC_LDRIN(cc,rt,rn,im) corri(cc,ARM_LDRI,rn,rt,im) +# define LDRIN(rt,rn,im) CC_LDRIN(ARM_CC_AL,rt,rn,im) +# define T2_LDRIN(rt,rn,im) torri8(THUMB2_LDRI,rn,rt,im) +# define CC_LDRD(cc,rt,rn,rm) corrr(cc,ARM_LDRD|ARM_P,rn,rt,rm) +# define LDRD(rt,rn,rm) CC_LDRD(ARM_CC_AL,rt,rn,rm) +# define T2_LDRDI(rt,rt2,rn,im) torrri8(THUMB2_LDRDI|ARM_P,rn,rt,rt2,im) +# define CC_LDRDN(cc,rt,rn,rm) corrr(cc,ARM_LDRD,rn,rt,rm) +# define LDRDN(rd,rn,rm) CC_LDRDN(ARM_CC_AL,rt,rn,rm) +# define CC_LDRDI(cc,rt,rn,im) corri8(cc,ARM_LDRDI|ARM_P,rn,rt,im) +# define LDRDI(rt,rn,im) CC_LDRDI(ARM_CC_AL,rt,rn,im) +# define CC_LDRDIN(cc,rt,rn,im) corri8(cc,ARM_LDRDI,rn,rt,im) +# define LDRDIN(rt,rn,im) CC_LDRDIN(ARM_CC_AL,rt,rn,im) +# define T2_LDRDIN(rt,rt2,rn,im) torrri8(THUMB2_LDRDI,rn,rt,rt2,im) +# define CC_STRB(cc,rt,rn,rm) corrr(cc,ARM_STRB|ARM_P,rn,rt,rm) +# define STRB(rt,rn,rm) CC_STRB(ARM_CC_AL,rt,rn,rm) +# define T1_STRB(rt,rn,rm) is(THUMB_STRB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_STRB(rt,rn,rm) torxr(THUMB2_STRB,rn,rt,rm) +# define CC_STRBN(cc,rt,rn,rm) corrr(cc,ARM_STRB,rn,rt,rm) +# define STRBN(rt,rn,rm) CC_STRBN(ARM_CC_AL,rt,rn,rm) +# define CC_STRBI(cc,rt,rn,im) corri(cc,ARM_STRBI|ARM_P,rn,rt,im) +# define STRBI(rt,rn,im) CC_STRBI(ARM_CC_AL,rt,rn,im) +# define T1_STRBI(rt,rn,im) is(THUMB_STRBI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_STRBI(rt,rn,im) torri8(THUMB2_STRBI|THUMB2_U,rn,rt,im) +# define T2_STRBWI(rt,rn,im) torri12(THUMB2_STRBWI,rn,rt,im) +# define CC_STRBIN(cc,rt,rn,im) corri(cc,ARM_STRBI,rn,rt,im) +# define STRBIN(rt,rn,im) CC_STRBIN(ARM_CC_AL,rt,rn,im) +# define T2_STRBIN(rt,rn,im) torri8(THUMB2_STRBI,rn,rt,im) +# define CC_STRH(cc,rt,rn,rm) corrr(cc,ARM_STRH|ARM_P,rn,rt,rm) +# define STRH(rt,rn,rm) CC_STRH(ARM_CC_AL,rt,rn,rm) +# define T1_STRH(rt,rn,rm) is(THUMB_STRH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_STRH(rt,rn,rm) torxr(THUMB2_STRH,rn,rt,rm) +# define CC_STRHN(cc,rt,rn,rm) corrr(cc,ARM_STRH,rn,rt,rm) +# define STRHN(rt,rn,rm) CC_STRHN(ARM_CC_AL,rt,rn,rm) +# define CC_STRHI(cc,rt,rn,im) corri8(cc,ARM_STRHI|ARM_P,rn,rt,im) +# define STRHI(rt,rn,im) CC_STRHI(ARM_CC_AL,rt,rn,im) +# define T1_STRHI(rt,rn,im) is(THUMB_STRHI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_STRHI(rt,rn,im) torri8(THUMB2_STRHI|THUMB2_U,rn,rt,im) +# define T2_STRHWI(rt,rn,im) torri12(THUMB2_STRHWI,rn,rt,im) +# define CC_STRHIN(cc,rt,rn,im) corri8(cc,ARM_STRHI,rn,rt,im) +# define STRHIN(rt,rn,im) CC_STRHIN(ARM_CC_AL,rt,rn,im) +# define T2_STRHIN(rt,rn,im) torri8(THUMB2_STRHI,rn,rt,im) +# define CC_STR(cc,rt,rn,rm) corrr(cc,ARM_STR|ARM_P,rn,rt,rm) +# define STR(rt,rn,rm) CC_STR(ARM_CC_AL,rt,rn,rm) +# define T1_STR(rt,rn,rm) is(THUMB_STR|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T2_STR(rt,rn,rm) torxr(THUMB2_STR,rn,rt,rm) +# define CC_STRN(cc,rt,rn,rm) corrr(cc,ARM_STR,rn,rt,rm) +# define STRN(rt,rn,rm) CC_STRN(ARM_CC_AL,rt,rn,rm) +# define CC_STRI(cc,rt,rn,im) corri(cc,ARM_STRI|ARM_P,rn,rt,im) +# define STRI(rt,rn,im) CC_STRI(ARM_CC_AL,rt,rn,im) +# define T1_STRI(rt,rn,im) is(THUMB_STRI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt)) +# define T1_STRISP(rt,im) is(THUMB_STRISP|(_u3(rt)<<8)|(_u8(im))) +# define T2_STRI(rt,rn,im) torri8(THUMB2_STRI|THUMB2_U,rn,rt,im) +# define T2_STRWI(rt,rn,im) torri12(THUMB2_STRWI,rn,rt,im) +# define CC_STRIN(cc,rt,rn,im) corri(cc,ARM_STRI,rn,rt,im) +# define STRIN(rt,rn,im) CC_STRIN(ARM_CC_AL,rt,rn,im) +# define T2_STRIN(rt,rn,im) torri8(THUMB2_STRI,rn,rt,im) +# define CC_STRD(cc,rt,rn,rm) corrr(cc,ARM_STRD|ARM_P,rn,rt,rm) +# define STRD(rt,rn,rm) CC_STRD(ARM_CC_AL,rt,rn,rm) +# define CC_STRDN(cc,rt,rn,rm) corrr(cc,ARM_STRD,rn,rt,rm) +# define STRDN(rt,rn,rm) CC_STRDN(ARM_CC_AL,rt,rn,rm) +# define CC_STRDI(cc,rt,rn,im) corri8(cc,ARM_STRDI|ARM_P,rn,rt,im) +# define STRDI(rt,rn,im) CC_STRDI(ARM_CC_AL,rt,rn,im) +# define T2_STRDI(rt,rt2,rn,im) torrri8(THUMB2_STRDI|ARM_P,rn,rt,rt2,im) +# define CC_STRDIN(cc,rt,rn,im) corri8(cc,ARM_STRDI,rn,rt,im) +# define STRDIN(rt,rn,im) CC_STRDIN(ARM_CC_AL,rt,rn,im) +# define T2_STRDIN(rt,rt2,rn,im) torrri8(THUMB2_STRDI,rn,rt,rt2,im) +# define CC_LDMIA(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I,rn,im) +# define LDMIA(rn,im) CC_LDMIA(ARM_CC_AL,rn,im) +# define CC_LDM(cc,rn,im) CC_LDMIA(cc,rn,im) +# define LDM(rn,im) LDMIA(rn,im) +# define T1_LDMIA(rn,im) is(THUMB_LDMIA|(_u3(rn)<<8)|im) +# define T2_LDMIA(rn,im) torl(THUMB2_LDMIA,rn,im) +# define CC_LDMIA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_U,rn,im) +# define LDMIA_U(rn,im) CC_LDMIA_U(ARM_CC_AL,rn,im) +# define LDM_U(r0,i0) LDMIA_U(r0,i0) +# define CC_LDMIB(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_B,rn,im) +# define LDMIB(rn,im) CC_LDMIB(ARM_CC_AL,rn,im) +# define CC_LDMIB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_B|ARM_M_U,rn,im) +# define LDMIB_U(rn,im) CC_LDMIB_U(ARM_CC_AL,rn,im) +# define CC_LDMDA(cc,rn,im) corl(cc,ARM_M|ARM_M_L,rn,im) +# define LDMDA(rn,im) CC_LDMDA(ARM_CC_AL,rn,im) +# define CC_LDMDA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_U,rn,im) +# define LDMDA_U(rn,im) CC_LDMDA_U(ARM_CC_AL,rn,im) +# define CC_LDMDB(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_B,rn,im) +# define LDMDB(rn,im) CC_LDMDB(ARM_CC_AL,rn,im) +# define T2_LDMDB(rn,im) torl(THUMB2_LDMDB,rn,im) +# define CC_LDMDB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_B|ARM_M_U,rn,im) +# define LDMDB_U(rn,im) CC_LDMDB_U(ARM_CC_AL,rn,im) +# define CC_STMIA(cc,rn,im) corl(cc,ARM_M|ARM_M_I,rn,im) +# define STMIA(rn,im) CC_STMIA(ARM_CC_AL,rn,im) +# define CC_STM(cc,rn,im) CC_STMIA(cc,rn,im) +# define STM(rn,im) STMIA(rn,im) +# define CC_STMIA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_U,rn,im) +# define STMIA_U(rn,im) CC_STMIA_U(ARM_CC_AL,rn,im) +# define CC_STM_U(cc,rn,im) CC_STMIA_U(cc,rn,im) +# define STM_U(rn,im) STMIA_U(rn,im) +# define CC_STMIB(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_B,rn,im) +# define STMIB(rn,im) CC_STMIB(ARM_CC_AL,rn,im) +# define CC_STMIB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_B|ARM_M_U,rn,im) +# define STMIB_U(rn,im) CC_STMIB_U(ARM_CC_AL,rn,im) +# define CC_STMDA(cc,rn,im) corl(cc,ARM_M,rn,im) +# define STMDA(rn,im) CC_STMDA(ARM_CC_AL,rn,im) +# define CC_STMDA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_U,rn,im) +# define STMDA_U(rn,im) CC_STMDA_U(ARM_CC_AL,rn,im) +# define CC_STMDB(cc,rn,im) corl(cc,ARM_M|ARM_M_B,rn,im) +# define STMDB(rn,im) CC_STMDB(ARM_CC_AL,rn,im) +# define CC_STMDB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_B|ARM_M_U,rn,im) +# define STMDB_U(rn,im) CC_STMDB_U(ARM_CC_AL,rn,im) +# define CC_PUSH(cc,im) CC_STMDB_U(cc,_SP_REGNO,im) +# define PUSH(im) STMDB_U(_SP_REGNO,im) +# define T1_PUSH(im) is(THUMB_PUSH|((im&0x4000)>>6)|(im&0xff)) +# define T2_PUSH(im) tpp(THUMB2_PUSH,im) +# define CC_POP(cc,im) LDMIA_U(cc,_SP_REGNO,im) +# define POP(im) LDMIA_U(_SP_REGNO,im) +# define T1_POP(im) is(THUMB_POP|((im&0x8000)>>7)|(im&0xff)) +# define T2_POP(im) tpp(THUMB2_POP,im) +# define jit_get_reg_args() \ + do { \ + (void)jit_get_reg(_R0|jit_class_named|jit_class_gpr); \ + (void)jit_get_reg(_R1|jit_class_named|jit_class_gpr); \ + (void)jit_get_reg(_R2|jit_class_named|jit_class_gpr); \ + (void)jit_get_reg(_R3|jit_class_named|jit_class_gpr); \ } while (0) -# define jit_unget_reg_args() \ - do { \ - jit_unget_reg(_R3); \ - jit_unget_reg(_R2); \ - jit_unget_reg(_R1); \ - jit_unget_reg(_R0); \ +# define jit_unget_reg_args() \ + do { \ + jit_unget_reg(_R3); \ + jit_unget_reg(_R2); \ + jit_unget_reg(_R1); \ + jit_unget_reg(_R0); \ } while (0) -# define nop(i0) _nop(_jit,i0) +# define nop(i0) _nop(_jit,i0) static void _nop(jit_state_t*,int32_t); -# define movr(r0,r1) _movr(_jit,r0,r1) +# define movr(r0,r1) _movr(_jit,r0,r1) static void _movr(jit_state_t*,int32_t,int32_t); -# define movi(r0,i0) _movi(_jit,r0,i0) +# define movi(r0,i0) _movi(_jit,r0,i0) static void _movi(jit_state_t*,int32_t,jit_word_t); -# define movi_p(r0,i0) _movi_p(_jit,r0,i0) +# define movi_p(r0,i0) _movi_p(_jit,r0,i0) static jit_word_t _movi_p(jit_state_t*,int32_t,jit_word_t); -# define comr(r0,r1) _comr(_jit,r0,r1) +# define comr(r0,r1) _comr(_jit,r0,r1) static void _comr(jit_state_t*,int32_t,int32_t); -# define negr(r0,r1) _negr(_jit,r0,r1) +# define negr(r0,r1) _negr(_jit,r0,r1) static void _negr(jit_state_t*,int32_t,int32_t); -# define addr(r0,r1,r2) _addr(_jit,r0,r1,r2) +# define addr(r0,r1,r2) _addr(_jit,r0,r1,r2) static void _addr(jit_state_t*,int32_t,int32_t,int32_t); -# define addi(r0,r1,i0) _addi(_jit,r0,r1,i0) +# define addi(r0,r1,i0) _addi(_jit,r0,r1,i0) static void _addi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define addcr(r0,r1,r2) _addcr(_jit,r0,r1,r2) +# define addcr(r0,r1,r2) _addcr(_jit,r0,r1,r2) static void _addcr(jit_state_t*,int32_t,int32_t,int32_t); -# define addci(r0,r1,i0) _addci(_jit,r0,r1,i0) +# define addci(r0,r1,i0) _addci(_jit,r0,r1,i0) static void _addci(jit_state_t*,int32_t,int32_t,jit_word_t); -# define addxr(r0,r1,r2) _addxr(_jit,r0,r1,r2) +# define addxr(r0,r1,r2) _addxr(_jit,r0,r1,r2) static void _addxr(jit_state_t*,int32_t,int32_t,int32_t); -# define addxi(r0,r1,i0) _addxi(_jit,r0,r1,i0) +# define addxi(r0,r1,i0) _addxi(_jit,r0,r1,i0) static void _addxi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define subr(r0,r1,r2) _subr(_jit,r0,r1,r2) +# define subr(r0,r1,r2) _subr(_jit,r0,r1,r2) static void _subr(jit_state_t*,int32_t,int32_t,int32_t); -# define subi(r0,r1,i0) _subi(_jit,r0,r1,i0) +# define subi(r0,r1,i0) _subi(_jit,r0,r1,i0) static void _subi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define subcr(r0,r1,r2) _subcr(_jit,r0,r1,r2) +# define subcr(r0,r1,r2) _subcr(_jit,r0,r1,r2) static void _subcr(jit_state_t*,int32_t,int32_t,int32_t); -# define subci(r0,r1,i0) _subci(_jit,r0,r1,i0) +# define subci(r0,r1,i0) _subci(_jit,r0,r1,i0) static void _subci(jit_state_t*,int32_t,int32_t,jit_word_t); -# define subxr(r0,r1,r2) _subxr(_jit,r0,r1,r2) +# define subxr(r0,r1,r2) _subxr(_jit,r0,r1,r2) static void _subxr(jit_state_t*,int32_t,int32_t,int32_t); -# define subxi(r0,r1,i0) _subxi(_jit,r0,r1,i0) +# define subxi(r0,r1,i0) _subxi(_jit,r0,r1,i0) static void _subxi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define rsbi(r0, r1, i0) _rsbi(_jit, r0, r1, i0) +# define rsbi(r0, r1, i0) _rsbi(_jit, r0, r1, i0) static void _rsbi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define mulr(r0,r1,r2) _mulr(_jit,r0,r1,r2) +# define mulr(r0,r1,r2) _mulr(_jit,r0,r1,r2) static void _mulr(jit_state_t*,int32_t,int32_t,int32_t); -# define muli(r0,r1,i0) _muli(_jit,r0,r1,i0) +# define muli(r0,r1,i0) _muli(_jit,r0,r1,i0) static void _muli(jit_state_t*,int32_t,int32_t,jit_word_t); -# define qmulr(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,1) -# define qmulr_u(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,0) -# define iqmulr(r0,r1,r2,r3,cc) _iqmulr(_jit,r0,r1,r2,r3,cc) +# define qmulr(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,1) +# define qmulr_u(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,0) +# define iqmulr(r0,r1,r2,r3,cc) _iqmulr(_jit,r0,r1,r2,r3,cc) static void _iqmulr(jit_state_t*,int32_t,int32_t, - int32_t,int32_t,jit_bool_t); -# define qmuli(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,1) -# define qmuli_u(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,0) -# define iqmuli(r0,r1,r2,i0,cc) _iqmuli(_jit,r0,r1,r2,i0,cc) + int32_t,int32_t,jit_bool_t); +# define qmuli(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,1) +# define qmuli_u(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,0) +# define iqmuli(r0,r1,r2,i0,cc) _iqmuli(_jit,r0,r1,r2,i0,cc) static void _iqmuli(jit_state_t*,int32_t,int32_t, - int32_t,jit_word_t,jit_bool_t); -# define divrem(d,s,r0,r1,r2) _divrem(_jit,d,s,r0,r1,r2) + int32_t,jit_word_t,jit_bool_t); +# define divrem(d,s,r0,r1,r2) _divrem(_jit,d,s,r0,r1,r2) static void _divrem(jit_state_t*,int,int,int32_t,int32_t,int32_t); -# define divr(r0,r1,r2) _divr(_jit,r0,r1,r2) +# define divr(r0,r1,r2) _divr(_jit,r0,r1,r2) static void _divr(jit_state_t*,int32_t,int32_t,int32_t); -# define divi(r0,r1,i0) _divi(_jit,r0,r1,i0) +# define divi(r0,r1,i0) _divi(_jit,r0,r1,i0) static void _divi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define divr_u(r0,r1,r2) _divr_u(_jit,r0,r1,r2) +# define divr_u(r0,r1,r2) _divr_u(_jit,r0,r1,r2) static void _divr_u(jit_state_t*,int32_t,int32_t,int32_t); -# define divi_u(r0,r1,i0) _divi_u(_jit,r0,r1,i0) +# define divi_u(r0,r1,i0) _divi_u(_jit,r0,r1,i0) static void _divi_u(jit_state_t*,int32_t,int32_t,jit_word_t); -# define qdivr(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,1) -# define qdivr_u(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,0) -# define iqdivr(r0,r1,r2,r3,cc) _iqdivr(_jit,r0,r1,r2,r3,cc) +# define qdivr(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,1) +# define qdivr_u(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,0) +# define iqdivr(r0,r1,r2,r3,cc) _iqdivr(_jit,r0,r1,r2,r3,cc) static void _iqdivr(jit_state_t*,int32_t,int32_t, - int32_t,int32_t,jit_bool_t); -# define qdivi(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,1) -# define qdivi_u(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,0) -# define iqdivi(r0,r1,r2,i0,cc) _iqdivi(_jit,r0,r1,r2,i0,cc) + int32_t,int32_t,jit_bool_t); +# define qdivi(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,1) +# define qdivi_u(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,0) +# define iqdivi(r0,r1,r2,i0,cc) _iqdivi(_jit,r0,r1,r2,i0,cc) static void _iqdivi(jit_state_t*,int32_t,int32_t, - int32_t,jit_word_t,jit_bool_t); -# define remr(r0,r1,r2) _remr(_jit,r0,r1,r2) + int32_t,jit_word_t,jit_bool_t); +# define remr(r0,r1,r2) _remr(_jit,r0,r1,r2) static void _remr(jit_state_t*,int32_t,int32_t,int32_t); -# define remi(r0,r1,i0) _remi(_jit,r0,r1,i0) +# define remi(r0,r1,i0) _remi(_jit,r0,r1,i0) static void _remi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define remr_u(r0,r1,r2) _remr_u(_jit,r0,r1,r2) +# define remr_u(r0,r1,r2) _remr_u(_jit,r0,r1,r2) static void _remr_u(jit_state_t*,int32_t,int32_t,int32_t); -# define remi_u(r0,r1,i0) _remi_u(_jit,r0,r1,i0) +# define remi_u(r0,r1,i0) _remi_u(_jit,r0,r1,i0) static void _remi_u(jit_state_t*,int32_t,int32_t,jit_word_t); -# define andr(r0,r1,r2) _andr(_jit,r0,r1,r2) +# define andr(r0,r1,r2) _andr(_jit,r0,r1,r2) static void _andr(jit_state_t*,int32_t,int32_t,int32_t); -# define andi(r0,r1,i0) _andi(_jit,r0,r1,i0) +# define andi(r0,r1,i0) _andi(_jit,r0,r1,i0) static void _andi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define orr(r0,r1,r2) _orr(_jit,r0,r1,r2) +# define orr(r0,r1,r2) _orr(_jit,r0,r1,r2) static void _orr(jit_state_t*,int32_t,int32_t,int32_t); -# define ori(r0,r1,i0) _ori(_jit,r0,r1,i0) +# define ori(r0,r1,i0) _ori(_jit,r0,r1,i0) static void _ori(jit_state_t*,int32_t,int32_t,jit_word_t); -# define xorr(r0,r1,r2) _xorr(_jit,r0,r1,r2) +# define xorr(r0,r1,r2) _xorr(_jit,r0,r1,r2) static void _xorr(jit_state_t*,int32_t,int32_t,int32_t); -# define xori(r0,r1,i0) _xori(_jit,r0,r1,i0) +# define xori(r0,r1,i0) _xori(_jit,r0,r1,i0) static void _xori(jit_state_t*,int32_t,int32_t,jit_word_t); -# define lshr(r0,r1,r2) _lshr(_jit,r0,r1,r2) +# define lshr(r0,r1,r2) _lshr(_jit,r0,r1,r2) static void _lshr(jit_state_t*,int32_t,int32_t,int32_t); -# define lshi(r0,r1,i0) _lshi(_jit,r0,r1,i0) +# define lshi(r0,r1,i0) _lshi(_jit,r0,r1,i0) static void _lshi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define rshr(r0,r1,r2) _rshr(_jit,r0,r1,r2) +# define rshr(r0,r1,r2) _rshr(_jit,r0,r1,r2) static void _rshr(jit_state_t*,int32_t,int32_t,int32_t); -# define rshi(r0,r1,i0) _rshi(_jit,r0,r1,i0) +# define rshi(r0,r1,i0) _rshi(_jit,r0,r1,i0) static void _rshi(jit_state_t*,int32_t,int32_t,jit_word_t); -# define rshr_u(r0,r1,r2) _rshr_u(_jit,r0,r1,r2) +# define rshr_u(r0,r1,r2) _rshr_u(_jit,r0,r1,r2) static void _rshr_u(jit_state_t*,int32_t,int32_t,int32_t); -# define rshi_u(r0,r1,i0) _rshi_u(_jit,r0,r1,i0) +# define rshi_u(r0,r1,i0) _rshi_u(_jit,r0,r1,i0) static void _rshi_u(jit_state_t*,int32_t,int32_t,jit_word_t); -# define ccr(ct,cf,r0,r1,r2) _ccr(_jit,ct,cf,r0,r1,r2) +# define ccr(ct,cf,r0,r1,r2) _ccr(_jit,ct,cf,r0,r1,r2) static void _ccr(jit_state_t*,int,int,int32_t,int32_t,int32_t); -# define cci(ct,cf,r0,r1,i0) _cci(_jit,ct,cf,r0,r1,i0) +# define cci(ct,cf,r0,r1,i0) _cci(_jit,ct,cf,r0,r1,i0) static void _cci(jit_state_t*,int,int,int32_t,int32_t,jit_word_t); -# define ltr(r0, r1, r2) ccr(ARM_CC_LT,ARM_CC_GE,r0,r1,r2) -# define lti(r0, r1, i0) cci(ARM_CC_LT,ARM_CC_GE,r0,r1,i0) -# define ltr_u(r0, r1, r2) ccr(ARM_CC_LO,ARM_CC_HS,r0,r1,r2) -# define lti_u(r0, r1, i0) cci(ARM_CC_LO,ARM_CC_HS,r0,r1,i0) -# define ler(r0, r1, r2) ccr(ARM_CC_LE,ARM_CC_GT,r0,r1,r2) -# define lei(r0, r1, i0) cci(ARM_CC_LE,ARM_CC_GT,r0,r1,i0) -# define ler_u(r0, r1, r2) ccr(ARM_CC_LS,ARM_CC_HI,r0,r1,r2) -# define lei_u(r0, r1, i0) cci(ARM_CC_LS,ARM_CC_HI,r0,r1,i0) -# define eqr(r0, r1, r2) ccr(ARM_CC_EQ,ARM_CC_NE,r0,r1,r2) -# define eqi(r0, r1, i0) cci(ARM_CC_EQ,ARM_CC_NE,r0,r1,i0) -# define ger(r0, r1, r2) ccr(ARM_CC_GE,ARM_CC_LT,r0,r1,r2) -# define gei(r0, r1, i0) cci(ARM_CC_GE,ARM_CC_LT,r0,r1,i0) -# define ger_u(r0, r1, r2) ccr(ARM_CC_HS,ARM_CC_LO,r0,r1,r2) -# define gei_u(r0, r1, i0) cci(ARM_CC_HS,ARM_CC_LO,r0,r1,i0) -# define gtr(r0, r1, r2) ccr(ARM_CC_GT,ARM_CC_LE,r0,r1,r2) -# define gti(r0, r1, i0) cci(ARM_CC_GT,ARM_CC_LE,r0,r1,i0) -# define gtr_u(r0, r1, r2) ccr(ARM_CC_HI,ARM_CC_LS,r0,r1,r2) -# define gti_u(r0, r1, i0) cci(ARM_CC_HI,ARM_CC_LS,r0,r1,i0) -# define ner(r0,r1,r2) _ner(_jit,r0,r1,r2) +# define ltr(r0, r1, r2) ccr(ARM_CC_LT,ARM_CC_GE,r0,r1,r2) +# define lti(r0, r1, i0) cci(ARM_CC_LT,ARM_CC_GE,r0,r1,i0) +# define ltr_u(r0, r1, r2) ccr(ARM_CC_LO,ARM_CC_HS,r0,r1,r2) +# define lti_u(r0, r1, i0) cci(ARM_CC_LO,ARM_CC_HS,r0,r1,i0) +# define ler(r0, r1, r2) ccr(ARM_CC_LE,ARM_CC_GT,r0,r1,r2) +# define lei(r0, r1, i0) cci(ARM_CC_LE,ARM_CC_GT,r0,r1,i0) +# define ler_u(r0, r1, r2) ccr(ARM_CC_LS,ARM_CC_HI,r0,r1,r2) +# define lei_u(r0, r1, i0) cci(ARM_CC_LS,ARM_CC_HI,r0,r1,i0) +# define eqr(r0, r1, r2) ccr(ARM_CC_EQ,ARM_CC_NE,r0,r1,r2) +# define eqi(r0, r1, i0) cci(ARM_CC_EQ,ARM_CC_NE,r0,r1,i0) +# define ger(r0, r1, r2) ccr(ARM_CC_GE,ARM_CC_LT,r0,r1,r2) +# define gei(r0, r1, i0) cci(ARM_CC_GE,ARM_CC_LT,r0,r1,i0) +# define ger_u(r0, r1, r2) ccr(ARM_CC_HS,ARM_CC_LO,r0,r1,r2) +# define gei_u(r0, r1, i0) cci(ARM_CC_HS,ARM_CC_LO,r0,r1,i0) +# define gtr(r0, r1, r2) ccr(ARM_CC_GT,ARM_CC_LE,r0,r1,r2) +# define gti(r0, r1, i0) cci(ARM_CC_GT,ARM_CC_LE,r0,r1,i0) +# define gtr_u(r0, r1, r2) ccr(ARM_CC_HI,ARM_CC_LS,r0,r1,r2) +# define gti_u(r0, r1, i0) cci(ARM_CC_HI,ARM_CC_LS,r0,r1,i0) +# define ner(r0,r1,r2) _ner(_jit,r0,r1,r2) static void _ner(jit_state_t*,int32_t,int32_t,int32_t); -# define nei(r0,r1,i0) _nei(_jit,r0,r1,i0) +# define nei(r0,r1,i0) _nei(_jit,r0,r1,i0) static void _nei(jit_state_t*,int32_t,int32_t,jit_word_t); -# define jmpr(r0) _jmpr(_jit,r0) +# define jmpr(r0) _jmpr(_jit,r0) static void _jmpr(jit_state_t*,int32_t); -# define jmpi(i0) _jmpi(_jit,i0) +# define jmpi(i0) _jmpi(_jit,i0) static void _jmpi(jit_state_t*,jit_word_t); -# define jmpi_p(i0, i1) _jmpi_p(_jit,i0, i1) +# define jmpi_p(i0, i1) _jmpi_p(_jit,i0, i1) static jit_word_t _jmpi_p(jit_state_t*,jit_word_t,jit_bool_t); -# define bccr(cc,i0,r0,r1) _bccr(_jit,cc,i0,r0,r1) +# define bccr(cc,i0,r0,r1) _bccr(_jit,cc,i0,r0,r1) static jit_word_t _bccr(jit_state_t*,int,jit_word_t,int32_t,int32_t); -# define bcci(cc,i0,r0,i1) _bcci(_jit,cc,i0,r0,i1) +# define bcci(cc,i0,r0,i1) _bcci(_jit,cc,i0,r0,i1) static jit_word_t _bcci(jit_state_t*,int,jit_word_t,int32_t,jit_word_t); -# define bltr(i0, r0, r1) bccr(ARM_CC_LT,i0,r0,r1) -# define blti(i0, r0, i1) bcci(ARM_CC_LT,i0,r0,i1) -# define bltr_u(i0, r0, r1) bccr(ARM_CC_LO,i0,r0,r1) -# define blti_u(i0, r0, i1) bcci(ARM_CC_LO,i0,r0,i1) -# define bler(i0, r0, r1) bccr(ARM_CC_LE,i0,r0,r1) -# define blei(i0, r0, i1) bcci(ARM_CC_LE,i0,r0,i1) -# define bler_u(i0, r0, r1) bccr(ARM_CC_LS,i0,r0,r1) -# define blei_u(i0, r0, i1) bcci(ARM_CC_LS,i0,r0,i1) -# define beqr(i0, r0, r1) bccr(ARM_CC_EQ,i0,r0,r1) -# define beqi(i0, r0, i1) bcci(ARM_CC_EQ,i0,r0,i1) -# define bger(i0, r0, r1) bccr(ARM_CC_GE,i0,r0,r1) -# define bgei(i0, r0, i1) bcci(ARM_CC_GE,i0,r0,i1) -# define bger_u(i0, r0, r1) bccr(ARM_CC_HS,i0,r0,r1) -# define bgei_u(i0, r0, i1) bcci(ARM_CC_HS,i0,r0,i1) -# define bgtr(i0, r0, r1) bccr(ARM_CC_GT,i0,r0,r1) -# define bgti(i0, r0, i1) bcci(ARM_CC_GT,i0,r0,i1) -# define bgtr_u(i0, r0, r1) bccr(ARM_CC_HI,i0,r0,r1) -# define bgti_u(i0, r0, i1) bcci(ARM_CC_HI,i0,r0,i1) -# define bner(i0, r0, r1) bccr(ARM_CC_NE,i0,r0,r1) -# define bnei(i0, r0, i1) bcci(ARM_CC_NE,i0,r0,i1) -# define baddr(cc,i0,r0,r1) _baddr(_jit,cc,i0,r0,r1) +# define bltr(i0, r0, r1) bccr(ARM_CC_LT,i0,r0,r1) +# define blti(i0, r0, i1) bcci(ARM_CC_LT,i0,r0,i1) +# define bltr_u(i0, r0, r1) bccr(ARM_CC_LO,i0,r0,r1) +# define blti_u(i0, r0, i1) bcci(ARM_CC_LO,i0,r0,i1) +# define bler(i0, r0, r1) bccr(ARM_CC_LE,i0,r0,r1) +# define blei(i0, r0, i1) bcci(ARM_CC_LE,i0,r0,i1) +# define bler_u(i0, r0, r1) bccr(ARM_CC_LS,i0,r0,r1) +# define blei_u(i0, r0, i1) bcci(ARM_CC_LS,i0,r0,i1) +# define beqr(i0, r0, r1) bccr(ARM_CC_EQ,i0,r0,r1) +# define beqi(i0, r0, i1) bcci(ARM_CC_EQ,i0,r0,i1) +# define bger(i0, r0, r1) bccr(ARM_CC_GE,i0,r0,r1) +# define bgei(i0, r0, i1) bcci(ARM_CC_GE,i0,r0,i1) +# define bger_u(i0, r0, r1) bccr(ARM_CC_HS,i0,r0,r1) +# define bgei_u(i0, r0, i1) bcci(ARM_CC_HS,i0,r0,i1) +# define bgtr(i0, r0, r1) bccr(ARM_CC_GT,i0,r0,r1) +# define bgti(i0, r0, i1) bcci(ARM_CC_GT,i0,r0,i1) +# define bgtr_u(i0, r0, r1) bccr(ARM_CC_HI,i0,r0,r1) +# define bgti_u(i0, r0, i1) bcci(ARM_CC_HI,i0,r0,i1) +# define bner(i0, r0, r1) bccr(ARM_CC_NE,i0,r0,r1) +# define bnei(i0, r0, i1) bcci(ARM_CC_NE,i0,r0,i1) +# define baddr(cc,i0,r0,r1) _baddr(_jit,cc,i0,r0,r1) static jit_word_t _baddr(jit_state_t*,int,jit_word_t,int32_t,int32_t); -# define baddi(cc,i0,r0,r1) _baddi(_jit,cc,i0,r0,r1) +# define baddi(cc,i0,r0,r1) _baddi(_jit,cc,i0,r0,r1) static jit_word_t _baddi(jit_state_t*,int,jit_word_t,int32_t,jit_word_t); -# define boaddr(i0,r0,r1) baddr(ARM_CC_VS,i0,r0,r1) -# define boaddi(i0,r0,i1) baddi(ARM_CC_VS,i0,r0,i1) -# define boaddr_u(i0,r0,r1) baddr(ARM_CC_HS,i0,r0,r1) -# define boaddi_u(i0,r0,i1) baddi(ARM_CC_HS,i0,r0,i1) -# define bxaddr(i0,r0,r1) baddr(ARM_CC_VC,i0,r0,r1) -# define bxaddi(i0,r0,i1) baddi(ARM_CC_VC,i0,r0,i1) -# define bxaddr_u(i0,r0,r1) baddr(ARM_CC_LO,i0,r0,r1) -# define bxaddi_u(i0,r0,i1) baddi(ARM_CC_LO,i0,r0,i1) -# define bsubr(cc,i0,r0,r1) _bsubr(_jit,cc,i0,r0,r1) +# define boaddr(i0,r0,r1) baddr(ARM_CC_VS,i0,r0,r1) +# define boaddi(i0,r0,i1) baddi(ARM_CC_VS,i0,r0,i1) +# define boaddr_u(i0,r0,r1) baddr(ARM_CC_HS,i0,r0,r1) +# define boaddi_u(i0,r0,i1) baddi(ARM_CC_HS,i0,r0,i1) +# define bxaddr(i0,r0,r1) baddr(ARM_CC_VC,i0,r0,r1) +# define bxaddi(i0,r0,i1) baddi(ARM_CC_VC,i0,r0,i1) +# define bxaddr_u(i0,r0,r1) baddr(ARM_CC_LO,i0,r0,r1) +# define bxaddi_u(i0,r0,i1) baddi(ARM_CC_LO,i0,r0,i1) +# define bsubr(cc,i0,r0,r1) _bsubr(_jit,cc,i0,r0,r1) static jit_word_t _bsubr(jit_state_t*,int,jit_word_t,int32_t,int32_t); -# define bsubi(cc,i0,r0,r1) _bsubi(_jit,cc,i0,r0,r1) +# define bsubi(cc,i0,r0,r1) _bsubi(_jit,cc,i0,r0,r1) static jit_word_t _bsubi(jit_state_t*,int,jit_word_t,int32_t,jit_word_t); -# define bosubr(i0,r0,r1) bsubr(ARM_CC_VS,i0,r0,r1) -# define bosubi(i0,r0,i1) bsubi(ARM_CC_VS,i0,r0,i1) -# define bosubr_u(i0,r0,r1) bsubr(ARM_CC_LO,i0,r0,r1) -# define bosubi_u(i0,r0,i1) bsubi(ARM_CC_LO,i0,r0,i1) -# define bxsubr(i0,r0,r1) bsubr(ARM_CC_VC,i0,r0,r1) -# define bxsubi(i0,r0,i1) bsubi(ARM_CC_VC,i0,r0,i1) -# define bxsubr_u(i0,r0,r1) bsubr(ARM_CC_HS,i0,r0,r1) -# define bxsubi_u(i0,r0,i1) bsubi(ARM_CC_HS,i0,r0,i1) -# define bmxr(cc,i0,r0,r1) _bmxr(_jit,cc,i0,r0,r1) +# define bosubr(i0,r0,r1) bsubr(ARM_CC_VS,i0,r0,r1) +# define bosubi(i0,r0,i1) bsubi(ARM_CC_VS,i0,r0,i1) +# define bosubr_u(i0,r0,r1) bsubr(ARM_CC_LO,i0,r0,r1) +# define bosubi_u(i0,r0,i1) bsubi(ARM_CC_LO,i0,r0,i1) +# define bxsubr(i0,r0,r1) bsubr(ARM_CC_VC,i0,r0,r1) +# define bxsubi(i0,r0,i1) bsubi(ARM_CC_VC,i0,r0,i1) +# define bxsubr_u(i0,r0,r1) bsubr(ARM_CC_HS,i0,r0,r1) +# define bxsubi_u(i0,r0,i1) bsubi(ARM_CC_HS,i0,r0,i1) +# define bmxr(cc,i0,r0,r1) _bmxr(_jit,cc,i0,r0,r1) static jit_word_t _bmxr(jit_state_t*,int,jit_word_t,int32_t,int32_t); -# define bmxi(cc,i0,r0,r1) _bmxi(_jit,cc,i0,r0,r1) +# define bmxi(cc,i0,r0,r1) _bmxi(_jit,cc,i0,r0,r1) static jit_word_t _bmxi(jit_state_t*,int,jit_word_t,int32_t,jit_word_t); -# define bmsr(i0,r0,r1) bmxr(ARM_CC_NE,i0,r0,r1) -# define bmsi(i0,r0,i1) bmxi(ARM_CC_NE,i0,r0,i1) -# define bmcr(i0,r0,r1) bmxr(ARM_CC_EQ,i0,r0,r1) -# define bmci(i0,r0,i1) bmxi(ARM_CC_EQ,i0,r0,i1) -# define ldr_c(r0,r1) _ldr_c(_jit,r0,r1) +# define bmsr(i0,r0,r1) bmxr(ARM_CC_NE,i0,r0,r1) +# define bmsi(i0,r0,i1) bmxi(ARM_CC_NE,i0,r0,i1) +# define bmcr(i0,r0,r1) bmxr(ARM_CC_EQ,i0,r0,r1) +# define bmci(i0,r0,i1) bmxi(ARM_CC_EQ,i0,r0,i1) +# define ldr_c(r0,r1) _ldr_c(_jit,r0,r1) static void _ldr_c(jit_state_t*,int32_t,int32_t); -# define ldi_c(r0,i0) _ldi_c(_jit,r0,i0) +# define ldi_c(r0,i0) _ldi_c(_jit,r0,i0) static void _ldi_c(jit_state_t*,int32_t,jit_word_t); -# define ldxr_c(r0,r1,r2) _ldxr_c(_jit,r0,r1,r2) +# define ldxr_c(r0,r1,r2) _ldxr_c(_jit,r0,r1,r2) static void _ldxr_c(jit_state_t*,int32_t,int32_t,int32_t); -# define ldxi_c(r0,r1,i0) _ldxi_c(_jit,r0,r1,i0) +# define ldxi_c(r0,r1,i0) _ldxi_c(_jit,r0,r1,i0) static void _ldxi_c(jit_state_t*,int32_t,int32_t,jit_word_t); -# define ldr_uc(r0,r1) _ldr_uc(_jit,r0,r1) +# define ldr_uc(r0,r1) _ldr_uc(_jit,r0,r1) static void _ldr_uc(jit_state_t*,int32_t,int32_t); -# define ldi_uc(r0,i0) _ldi_uc(_jit,r0,i0) +# define ldi_uc(r0,i0) _ldi_uc(_jit,r0,i0) static void _ldi_uc(jit_state_t*,int32_t,jit_word_t); -# define ldxr_uc(r0,r1,r2) _ldxr_uc(_jit,r0,r1,r2) +# define ldxr_uc(r0,r1,r2) _ldxr_uc(_jit,r0,r1,r2) static void _ldxr_uc(jit_state_t*,int32_t,int32_t,int32_t); -# define ldxi_uc(r0,r1,i0) _ldxi_uc(_jit,r0,r1,i0) +# define ldxi_uc(r0,r1,i0) _ldxi_uc(_jit,r0,r1,i0) static void _ldxi_uc(jit_state_t*,int32_t,int32_t,jit_word_t); -# define ldr_s(r0,r1) _ldr_s(_jit,r0,r1) +# define ldr_s(r0,r1) _ldr_s(_jit,r0,r1) static void _ldr_s(jit_state_t*,int32_t,int32_t); -# define ldi_s(r0,i0) _ldi_s(_jit,r0,i0) +# define ldi_s(r0,i0) _ldi_s(_jit,r0,i0) static void _ldi_s(jit_state_t*,int32_t,jit_word_t); -# define ldxr_s(r0,r1,r2) _ldxr_s(_jit,r0,r1,r2) +# define ldxr_s(r0,r1,r2) _ldxr_s(_jit,r0,r1,r2) static void _ldxr_s(jit_state_t*,int32_t,int32_t,int32_t); -# define ldxi_s(r0,r1,i0) _ldxi_s(_jit,r0,r1,i0) +# define ldxi_s(r0,r1,i0) _ldxi_s(_jit,r0,r1,i0) static void _ldxi_s(jit_state_t*,int32_t,int32_t,jit_word_t); -# define ldr_us(r0,r1) _ldr_us(_jit,r0,r1) +# define ldr_us(r0,r1) _ldr_us(_jit,r0,r1) static void _ldr_us(jit_state_t*,int32_t,int32_t); -# define ldi_us(r0,i0) _ldi_us(_jit,r0,i0) +# define ldi_us(r0,i0) _ldi_us(_jit,r0,i0) static void _ldi_us(jit_state_t*,int32_t,jit_word_t); -# define ldxr_us(r0,r1,r2) _ldxr_us(_jit,r0,r1,r2) +# define ldxr_us(r0,r1,r2) _ldxr_us(_jit,r0,r1,r2) static void _ldxr_us(jit_state_t*,int32_t,int32_t,int32_t); -# define ldxi_us(r0,r1,i0) _ldxi_us(_jit,r0,r1,i0) +# define ldxi_us(r0,r1,i0) _ldxi_us(_jit,r0,r1,i0) static void _ldxi_us(jit_state_t*,int32_t,int32_t,jit_word_t); -# define ldr_i(r0,r1) _ldr_i(_jit,r0,r1) +# define ldr_i(r0,r1) _ldr_i(_jit,r0,r1) static void _ldr_i(jit_state_t*,int32_t,int32_t); -# define ldi_i(r0,i0) _ldi_i(_jit,r0,i0) +# define ldi_i(r0,i0) _ldi_i(_jit,r0,i0) static void _ldi_i(jit_state_t*,int32_t,jit_word_t); -# define ldxr_i(r0,r1,r2) _ldxr_i(_jit,r0,r1,r2) +# define ldxr_i(r0,r1,r2) _ldxr_i(_jit,r0,r1,r2) static void _ldxr_i(jit_state_t*,int32_t,int32_t,int32_t); -# define ldxi_i(r0,r1,i0) _ldxi_i(_jit,r0,r1,i0) +# define ldxi_i(r0,r1,i0) _ldxi_i(_jit,r0,r1,i0) static void _ldxi_i(jit_state_t*,int32_t,int32_t,jit_word_t); -# define str_c(r0,r1) _str_c(_jit,r0,r1) +# define str_c(r0,r1) _str_c(_jit,r0,r1) static void _str_c(jit_state_t*,int32_t,int32_t); -# define sti_c(i0,r0) _sti_c(_jit,i0,r0) +# define sti_c(i0,r0) _sti_c(_jit,i0,r0) static void _sti_c(jit_state_t*,jit_word_t,int32_t); -# define stxr_c(r0,r1,r2) _stxr_c(_jit,r0,r1,r2) +# define stxr_c(r0,r1,r2) _stxr_c(_jit,r0,r1,r2) static void _stxr_c(jit_state_t*,int32_t,int32_t,int32_t); -# define stxi_c(r0,r1,i0) _stxi_c(_jit,r0,r1,i0) +# define stxi_c(r0,r1,i0) _stxi_c(_jit,r0,r1,i0) static void _stxi_c(jit_state_t*,jit_word_t,int32_t,int32_t); -# define str_s(r0,r1) _str_s(_jit,r0,r1) +# define str_s(r0,r1) _str_s(_jit,r0,r1) static void _str_s(jit_state_t*,int32_t,int32_t); -# define sti_s(i0,r0) _sti_s(_jit,i0,r0) +# define sti_s(i0,r0) _sti_s(_jit,i0,r0) static void _sti_s(jit_state_t*,jit_word_t,int32_t); -# define stxr_s(r0,r1,r2) _stxr_s(_jit,r0,r1,r2) +# define stxr_s(r0,r1,r2) _stxr_s(_jit,r0,r1,r2) static void _stxr_s(jit_state_t*,int32_t,int32_t,int32_t); -# define stxi_s(r0,r1,i0) _stxi_s(_jit,r0,r1,i0) +# define stxi_s(r0,r1,i0) _stxi_s(_jit,r0,r1,i0) static void _stxi_s(jit_state_t*,jit_word_t,int32_t,int32_t); -# define str_i(r0,r1) _str_i(_jit,r0,r1) +# define str_i(r0,r1) _str_i(_jit,r0,r1) static void _str_i(jit_state_t*,int32_t,int32_t); -# define sti_i(i0,r0) _sti_i(_jit,i0,r0) +# define sti_i(i0,r0) _sti_i(_jit,i0,r0) static void _sti_i(jit_state_t*,jit_word_t,int32_t); -# define stxr_i(r0,r1,r2) _stxr_i(_jit,r0,r1,r2) +# define stxr_i(r0,r1,r2) _stxr_i(_jit,r0,r1,r2) static void _stxr_i(jit_state_t*,jit_word_t,int32_t,int32_t); -# define stxi_i(r0,r1,i0) _stxi_i(_jit,r0,r1,i0) +# define stxi_i(r0,r1,i0) _stxi_i(_jit,r0,r1,i0) static void _stxi_i(jit_state_t*,jit_word_t,int32_t,int32_t); # if __BYTE_ORDER == __LITTLE_ENDIAN -# define bswapr_us(r0,r1) _bswapr_us(_jit,r0,r1) +# define bswapr_us(r0,r1) _bswapr_us(_jit,r0,r1) static void _bswapr_us(jit_state_t*,int32_t,int32_t); -# define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1) +# define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1) static void _bswapr_ui(jit_state_t*,int32_t,int32_t); # else -# define bswapr_us(r0,r1) extr_us(r0,r1) -# define bswapr(r0,r1) movr(r0,r1) +# define bswapr_us(r0,r1) extr_us(r0,r1) +# define bswapr(r0,r1) movr(r0,r1) # endif -# define extr_c(r0,r1) _extr_c(_jit,r0,r1) +# define extr_c(r0,r1) _extr_c(_jit,r0,r1) static void _extr_c(jit_state_t*,int32_t,int32_t); -# define extr_uc(r0,r1) _extr_uc(_jit,r0,r1) +# define extr_uc(r0,r1) _extr_uc(_jit,r0,r1) static void _extr_uc(jit_state_t*,int32_t,int32_t); -# define extr_s(r0,r1) _extr_s(_jit,r0,r1) +# define extr_s(r0,r1) _extr_s(_jit,r0,r1) static void _extr_s(jit_state_t*,int32_t,int32_t); -# define extr_us(r0,r1) _extr_us(_jit,r0,r1) +# define extr_us(r0,r1) _extr_us(_jit,r0,r1) static void _extr_us(jit_state_t*,int32_t,int32_t); -# define prolog(i0) _prolog(_jit,i0) +# define prolog(i0) _prolog(_jit,i0) static void _prolog(jit_state_t*,jit_node_t*); -# define epilog(i0) _epilog(_jit,i0) +# define epilog(i0) _epilog(_jit,i0) static void _epilog(jit_state_t*,jit_node_t*); -# define callr(r0) _callr(_jit,r0) +# define callr(r0) _callr(_jit,r0) static void _callr(jit_state_t*,int32_t); -# define calli(i0) _calli(_jit,i0) +# define calli(i0) _calli(_jit,i0) static void _calli(jit_state_t*,jit_word_t); -# define calli_p(i0) _calli_p(_jit,i0) +# define calli_p(i0) _calli_p(_jit,i0) static jit_word_t _calli_p(jit_state_t*,jit_word_t); -# define vastart(r0) _vastart(_jit, r0) +# define vastart(r0) _vastart(_jit, r0) static void _vastart(jit_state_t*, int32_t); -# define vaarg(r0, r1) _vaarg(_jit, r0, r1) +# define vaarg(r0, r1) _vaarg(_jit, r0, r1) static void _vaarg(jit_state_t*, int32_t, int32_t); -# define patch_at(kind,jump,label) _patch_at(_jit,kind,jump,label) +# define patch_at(kind,jump,label) _patch_at(_jit,kind,jump,label) static void _patch_at(jit_state_t*,int32_t,jit_word_t,jit_word_t); #endif #if CODE /* from binutils */ -# define rotate_left(v, n) (v << n | v >> (32 - n)) +# define rotate_left(v, n) (v << n | v >> (32 - n)) static int encode_arm_immediate(unsigned int v) { - unsigned int a, i; + unsigned int a, i; for (i = 0; i < 32; i += 2) - if ((a = rotate_left(v, i)) <= 0xff) - return (a | (i << 7)); + if ((a = rotate_left(v, i)) <= 0xff) + return (a | (i << 7)); return (-1); } @@ -1144,33 +1133,33 @@ encode_arm_immediate(unsigned int v) static int encode_thumb_immediate(unsigned int v) { - int i; - unsigned int m; - unsigned int n; + int i; + unsigned int m; + unsigned int n; /* 00000000 00000000 00000000 abcdefgh */ if ((v & 0xff) == v) - return (v); + return (v); /* 00000000 abcdefgh 00000000 abcdefgh */ if ((v & 0xff00ff) == v && ((v & 0xff0000) >> 16) == (v & 0xff)) - return ((v & 0xff) | (1 << 12)); + return ((v & 0xff) | (1 << 12)); /* abcdefgh 00000000 abcdefgh 00000000 */ if (((v & 0xffff0000) >> 16) == (v & 0xffff) && (v & 0xff) == 0) - return ((v & 0x000000ff) | (2 << 12)); + return ((v & 0x000000ff) | (2 << 12)); /* abcdefgh abcdefgh abcdefgh abcdefgh */ if ( (v & 0xff) == ((v & 0xff00) >> 8) && - ((v & 0xff00) >> 8) == ((v & 0xff0000) >> 16) && - ((v & 0xff0000) << 8) == (v & 0xff000000)) - return ((v & 0xff) | (3 << 12)); + ((v & 0xff00) >> 8) == ((v & 0xff0000) >> 16) && + ((v & 0xff0000) << 8) == (v & 0xff000000)) + return ((v & 0xff) | (3 << 12)); /* 1bcdefgh << 24 ... 1bcdefgh << 1 */ for (i = 8, m = 0xff000000, n = 0x80000000; - i < 23; i++, m >>= 1, n >>= 1) { - if ((v & m) == v && (v & n)) { - v >>= 32 - i; - if (!(i & 1)) - v &= 0x7f; - i >>= 1; - return (((i & 7) << 12) | ((i & 8) << 23) | v); - } + i < 23; i++, m >>= 1, n >>= 1) { + if ((v & m) == v && (v & n)) { + v >>= 32 - i; + if (!(i & 1)) + v &= 0x7f; + i >>= 1; + return (((i & 7) << 12) | ((i & 8) << 23) | v); + } } return (-1); } @@ -1179,21 +1168,21 @@ static int encode_thumb_word_immediate(unsigned int v) { if ((v & 0xfffff000) == 0) - return (((v & 0x800) << 15) | ((v & 0x700) << 4) | (v & 0xff)); + return (((v & 0x800) << 15) | ((v & 0x700) << 4) | (v & 0xff)); return (-1); } static int encode_thumb_jump(int v) { - int s, i1, i2, j1, j2; + int s, i1, i2, j1, j2; if (v >= (int)-0x800000 && v <= 0x7fffff) { - s = !!(v & 0x800000); - i1 = !!(v & 0x400000); - i2 = !!(v & 0x200000); - j1 = s ? i1 : !i1; - j2 = s ? i2 : !i2; - return ((s<<26)|((v&0x1ff800)<<5)|(j1<<13)|(j2<<11)|(v&0x7ff)); + s = !!(v & 0x800000); + i1 = !!(v & 0x400000); + i2 = !!(v & 0x200000); + j1 = s ? i1 : !i1; + j2 = s ? i2 : !i2; + return ((s<<26)|((v&0x1ff800)<<5)|(j1<<13)|(j2<<11)|(v&0x7ff)); } return (-1); } @@ -1201,12 +1190,12 @@ encode_thumb_jump(int v) static int encode_thumb_cc_jump(int v) { - int s, j1, j2; + int s, j1, j2; if (v >= (int)-0x80000 && v <= 0x7ffff) { - s = !!(v & 0x80000); - j1 = !!(v & 0x20000); - j2 = !!(v & 0x40000); - return ((s<<26)|((v&0x1f800)<<5)|(j1<<13)|(j2<<11)|(v&0x7ff)); + s = !!(v & 0x80000); + j1 = !!(v & 0x20000); + j2 = !!(v & 0x40000); + return ((s<<26)|((v&0x1f800)<<5)|(j1<<13)|(j2<<11)|(v&0x7ff)); } return (-1); } @@ -1215,10 +1204,10 @@ static int encode_thumb_shift(int v, int type) { switch (type) { - case ARM_ASR: - case ARM_LSL: - case ARM_LSR: type >>= 1; break; - default: assert(!"handled shift"); + case ARM_ASR: + case ARM_LSL: + case ARM_LSR: type >>= 1; break; + default: assert(!"handled shift"); } assert(v >= 0 && v <= 31); return (((v & 0x1c) << 10) | ((v & 3) << 6) | type); @@ -1227,27 +1216,27 @@ encode_thumb_shift(int v, int type) static void _tcit(jit_state_t *_jit, unsigned int tc, int it) { - int c; - int m; + int c; + int m; c = (tc >> 28) & 1; assert(!(tc & 0xfffffff) && tc != ARM_CC_NV); switch (it) { - case THUMB2_IT: m = 1<<3; break; - case THUMB2_ITT: m = (c<<3)| (1<<2); break; - case THUMB2_ITE: m = (!c<<3)| (1<<2); break; - case THUMB2_ITTT: m = (c<<3)| (c<<2)| (1<<1); break; - case THUMB2_ITET: m = (!c<<3)| (c<<2)| (1<<1); break; - case THUMB2_ITTE: m = (c<<3)|(!c<<2)| (1<<1); break; - case THUMB2_ITEE: m = (!c<<3)|(!c<<2)| (1<<1); break; - case THUMB2_ITTTT: m = (c<<3)| (c<<2)| (c<<1)|1; break; - case THUMB2_ITETT: m = (!c<<3)| (c<<2)| (c<<1)|1; break; - case THUMB2_ITTET: m = (c<<3)|(!c<<2)| (c<<1)|1; break; - case THUMB2_ITEET: m = (!c<<3)|(!c<<2)| (c<<1)|1; break; - case THUMB2_ITTTE: m = (c<<3)| (c<<2)|(!c<<1)|1; break; - case THUMB2_ITETE: m = (!c<<3)| (c<<2)|(!c<<1)|1; break; - case THUMB2_ITTEE: m = (c<<3)|(!c<<2)|(!c<<1)|1; break; - case THUMB2_ITEEE: m = (!c<<3)|(!c<<2)|(!c<<1)|1; break; - default: abort(); + case THUMB2_IT: m = 1<<3; break; + case THUMB2_ITT: m = (c<<3)| (1<<2); break; + case THUMB2_ITE: m = (!c<<3)| (1<<2); break; + case THUMB2_ITTT: m = (c<<3)| (c<<2)| (1<<1); break; + case THUMB2_ITET: m = (!c<<3)| (c<<2)| (1<<1); break; + case THUMB2_ITTE: m = (c<<3)|(!c<<2)| (1<<1); break; + case THUMB2_ITEE: m = (!c<<3)|(!c<<2)| (1<<1); break; + case THUMB2_ITTTT: m = (c<<3)| (c<<2)| (c<<1)|1; break; + case THUMB2_ITETT: m = (!c<<3)| (c<<2)| (c<<1)|1; break; + case THUMB2_ITTET: m = (c<<3)|(!c<<2)| (c<<1)|1; break; + case THUMB2_ITEET: m = (!c<<3)|(!c<<2)| (c<<1)|1; break; + case THUMB2_ITTTE: m = (c<<3)| (c<<2)|(!c<<1)|1; break; + case THUMB2_ITETE: m = (!c<<3)| (c<<2)|(!c<<1)|1; break; + case THUMB2_ITTEE: m = (c<<3)|(!c<<2)|(!c<<1)|1; break; + case THUMB2_ITEEE: m = (!c<<3)|(!c<<2)|(!c<<1)|1; break; + default: abort(); } assert(m && (tc != ARM_CC_AL || !(m & (m - 1)))); is(0xbf00 | (tc >> 24) | m); @@ -1291,7 +1280,7 @@ _coriw(jit_state_t *_jit, int cc, int o, int rd, int im) static void _torrr(jit_state_t *_jit, int o, int rn, int rd, int rm) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0xf0f0f)); thumb.i = o|(_u4(rn)<<16)|(_u4(rd)<<8)|_u4(rm); iss(thumb.s[0], thumb.s[1]); @@ -1300,7 +1289,7 @@ _torrr(jit_state_t *_jit, int o, int rn, int rd, int rm) static void _torrrs(jit_state_t *_jit, int o, int rn, int rd, int rm, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x000f0f0f)); assert(!(im & 0xffff8f0f)); thumb.i = o|(_u4(rn)<<16)|(_u4(rd)<<8)|im|_u4(rm); @@ -1310,7 +1299,7 @@ _torrrs(jit_state_t *_jit, int o, int rn, int rd, int rm, int im) static void _torxr(jit_state_t *_jit, int o, int rn, int rt, int rm) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0xf0f0f)); thumb.i = o|(_u4(rn)<<16)|(_u4(rt)<<12)|_u4(rm); iss(thumb.s[0], thumb.s[1]); @@ -1319,7 +1308,7 @@ _torxr(jit_state_t *_jit, int o, int rn, int rt, int rm) static void _torrrr(jit_state_t *_jit, int o, int rn, int rl, int rh, int rm) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x000fff0f)); thumb.i = o|(_u4(rn)<<16)|(_u4(rl)<<12)|(_u4(rh)<<8)|_u4(rm); iss(thumb.s[0], thumb.s[1]); @@ -1328,7 +1317,7 @@ _torrrr(jit_state_t *_jit, int o, int rn, int rl, int rh, int rm) static void _torrri8(jit_state_t *_jit, int o, int rn, int rt, int rt2, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x000fffff)); assert(!(im & 0xffffff00)); thumb.i = o|(_u4(rn)<<16)|(_u4(rt)<<12)|(_u4(rt2)<<8)|im; @@ -1338,7 +1327,7 @@ _torrri8(jit_state_t *_jit, int o, int rn, int rt, int rt2, int im) static void _torri(jit_state_t *_jit, int o, int rn, int rd, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x0c0f7fff)); assert(!(im & 0xfbff8f00)); thumb.i = o|(_u4(rn)<<16)|(_u4(rd)<<8)|im; @@ -1348,7 +1337,7 @@ _torri(jit_state_t *_jit, int o, int rn, int rd, int im) static void _torri8(jit_state_t *_jit, int o, int rn, int rt, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x000ff0ff)); assert(!(im & 0xffffff00)); thumb.i = o|(_u4(rn)<<16)|(_u4(rt)<<12)|im; @@ -1358,7 +1347,7 @@ _torri8(jit_state_t *_jit, int o, int rn, int rt, int im) static void _torri12(jit_state_t *_jit, int o, int rn, int rt, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x000fffff)); assert(!(im & 0xfffff000)); thumb.i = o|(_u4(rn)<<16)|(_u4(rt)<<12)|im; @@ -1368,7 +1357,7 @@ _torri12(jit_state_t *_jit, int o, int rn, int rt, int im) static void _tshift(jit_state_t *_jit, int o, int rd, int rm, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x7fcf)); assert(im >= 0 && im < 32); thumb.i = o|((im&0x1c)<<10)|(_u4(rd)<<8)|((im&3)<<6)|_u4(rm); @@ -1378,7 +1367,7 @@ _tshift(jit_state_t *_jit, int o, int rd, int rm, int im) static void _toriw(jit_state_t *_jit, int o, int rd, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(im & 0xffff0000)); thumb.i = o|((im&0xf000)<<4)|((im&0x800)<<15)|((im&0x700)<<4)|(_u4(rd)<<8)|(im&0xff); iss(thumb.s[0], thumb.s[1]); @@ -1403,7 +1392,7 @@ _t11(jit_state_t *_jit, int im) static void _tcb(jit_state_t *_jit, int cc, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(cc & 0xfffffff)); assert(cc != ARM_CC_AL && cc != ARM_CC_NV); cc = ((uint32_t)cc) >> 6; @@ -1422,7 +1411,7 @@ _blxi(jit_state_t *_jit, int im) static void _tb(jit_state_t *_jit, int o, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x07ff2fff)); assert(!(o & im)); thumb.i = o|im; @@ -1489,10 +1478,10 @@ _c6orr(jit_state_t *_jit, int cc, int o, int rd, int rm) static void _tpp(jit_state_t *_jit, int o, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0x0000ffff)); if (o == THUMB2_PUSH) - assert(!(im & 0x8000)); + assert(!(im & 0x8000)); assert(__builtin_popcount(im & 0x1fff) > 1); thumb.i = o|im; iss(thumb.s[0], thumb.s[1]); @@ -1501,7 +1490,7 @@ _tpp(jit_state_t *_jit, int o, int im) static void _torl(jit_state_t *_jit, int o, int rn, int im) { - jit_thumb_t thumb; + jit_thumb_t thumb; assert(!(o & 0xf1fff)); assert(rn != _R15 || !im || ((o & 0xc000) == 0xc000)); assert(!(o & THUMB2_LDM_W) || !(im & (1 << rn))); @@ -1513,12 +1502,12 @@ static void _nop(jit_state_t *_jit, int32_t i0) { if (jit_thumb_p()) { - for (; i0 > 0; i0 -= 2) - T1_NOP(); + for (; i0 > 0; i0 -= 2) + T1_NOP(); } else { - for (; i0 > 0; i0 -= 4) - NOP(); + for (; i0 > 0; i0 -= 4) + NOP(); } assert(i0 == 0); } @@ -1527,58 +1516,58 @@ static void _movr(jit_state_t *_jit, int32_t r0, int32_t r1) { if (r0 != r1) { - if (jit_thumb_p()) - T1_MOV(r0, r1); - else - MOV(r0, r1); + if (jit_thumb_p()) + T1_MOV(r0, r1); + else + MOV(r0, r1); } } static void _movi(jit_state_t *_jit, int32_t r0, jit_word_t i0) { - int i; + int i; if (jit_thumb_p()) { - if (!jit_no_set_flags() && r0 < 8 && !(i0 & 0xffffff80)) - T1_MOVI(r0, i0); - else if ((i = encode_thumb_immediate(i0)) != -1) - T2_MOVI(r0, i); - else if ((i = encode_thumb_immediate(~i0)) != -1) - T2_MVNI(r0, i); - else { - T2_MOVWI(r0, (uint16_t)i0); - if (i0 & 0xffff0000) - T2_MOVTI(r0, (uint16_t)((unsigned)i0 >> 16)); - } + if (!jit_no_set_flags() && r0 < 8 && !(i0 & 0xffffff80)) + T1_MOVI(r0, i0); + else if ((i = encode_thumb_immediate(i0)) != -1) + T2_MOVI(r0, i); + else if ((i = encode_thumb_immediate(~i0)) != -1) + T2_MVNI(r0, i); + else { + T2_MOVWI(r0, (uint16_t)i0); + if (i0 & 0xffff0000) + T2_MOVTI(r0, (uint16_t)((unsigned)i0 >> 16)); + } } else { - if (jit_armv6_p() && !(i0 & 0xffff0000)) - MOVWI(r0, i0); - else if ((i = encode_arm_immediate(i0)) != -1) - MOVI(r0, i); - else if ((i = encode_arm_immediate(~i0)) != -1) - MVNI(r0, i); - else if (jit_armv6_p()) { - MOVWI(r0, (uint16_t)(i0)); - if ((i0 & 0xffff0000)) - MOVTI(r0, (uint16_t)((unsigned)i0 >> 16)); - } - else - load_const(0, r0, i0); + if (jit_armv6_p() && !(i0 & 0xffff0000)) + MOVWI(r0, i0); + else if ((i = encode_arm_immediate(i0)) != -1) + MOVI(r0, i); + else if ((i = encode_arm_immediate(~i0)) != -1) + MVNI(r0, i); + else if (jit_armv6_p()) { + MOVWI(r0, (uint16_t)(i0)); + if ((i0 & 0xffff0000)) + MOVTI(r0, (uint16_t)((unsigned)i0 >> 16)); + } + else + load_const(0, r0, i0); } } static jit_word_t _movi_p(jit_state_t *_jit, int32_t r0, jit_word_t i0) { - jit_word_t w; + jit_word_t w; w = _jit->pc.w; if (jit_thumb_p()) { - T2_MOVWI(r0, (uint16_t)(i0)); - T2_MOVTI(r0, (uint16_t)((unsigned)i0 >> 16)); + T2_MOVWI(r0, (uint16_t)(i0)); + T2_MOVTI(r0, (uint16_t)((unsigned)i0 >> 16)); } else - load_const(1, r0, 0); + load_const(1, r0, 0); return (w); } @@ -1586,87 +1575,87 @@ static void _comr(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1) < 8) - T1_NOT(r0, r1); - else - T2_NOT(r0, r1); + if (!jit_no_set_flags() && (r0|r1) < 8) + T1_NOT(r0, r1); + else + T2_NOT(r0, r1); } else - NOT(r0, r1); + NOT(r0, r1); } static void _negr(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1) < 8) - T1_RSBI(r0, r1); - else - T2_RSBI(r0, r1, 0); + if (!jit_no_set_flags() && (r0|r1) < 8) + T1_RSBI(r0, r1); + else + T2_RSBI(r0, r1, 0); } else - RSBI(r0, r1, 0); + RSBI(r0, r1, 0); } static void _addr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1|r2) < 8) - T1_ADD(r0, r1, r2); - else if (r0 == r1 || r0 == r2) - T1_ADDX(r0, r0 == r1 ? r2 : r1); - else - T2_ADD(r0, r1, r2); + if (!jit_no_set_flags() && (r0|r1|r2) < 8) + T1_ADD(r0, r1, r2); + else if (r0 == r1 || r0 == r2) + T1_ADDX(r0, r0 == r1 ? r2 : r1); + else + T2_ADD(r0, r1, r2); } else - ADD(r0, r1, r2); + ADD(r0, r1, r2); } static void _addi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1) < 8 && !(i0 & ~7)) - T1_ADDI3(r0, r1, i0); - else if (!jit_no_set_flags() && (r0|r1) < 8 && !(-i0 & ~7)) - T1_SUBI3(r0, r1, -i0); - else if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(i0 & ~0xff)) - T1_ADDI8(r0, i0); - else if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(-i0 & ~0xff)) - T1_SUBI8(r0, -i0); - else if ((i = encode_thumb_immediate(i0)) != -1) - T2_ADDI(r0, r1, i); - else if ((i = encode_thumb_immediate(-i0)) != -1) - T2_SUBI(r0, r1, i); - else if ((i = encode_thumb_word_immediate(i0)) != -1) - T2_ADDWI(r0, r1, i); - else if ((i = encode_thumb_word_immediate(-i0)) != -1) - T2_SUBWI(r0, r1, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - T2_ADD(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (!jit_no_set_flags() && (r0|r1) < 8 && !(i0 & ~7)) + T1_ADDI3(r0, r1, i0); + else if (!jit_no_set_flags() && (r0|r1) < 8 && !(-i0 & ~7)) + T1_SUBI3(r0, r1, -i0); + else if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(i0 & ~0xff)) + T1_ADDI8(r0, i0); + else if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(-i0 & ~0xff)) + T1_SUBI8(r0, -i0); + else if ((i = encode_thumb_immediate(i0)) != -1) + T2_ADDI(r0, r1, i); + else if ((i = encode_thumb_immediate(-i0)) != -1) + T2_SUBI(r0, r1, i); + else if ((i = encode_thumb_word_immediate(i0)) != -1) + T2_ADDWI(r0, r1, i); + else if ((i = encode_thumb_word_immediate(-i0)) != -1) + T2_SUBWI(r0, r1, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + T2_ADD(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if ((i = encode_arm_immediate(i0)) != -1) - ADDI(r0, r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - SUBI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - ADD(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - ADD(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + ADDI(r0, r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + SUBI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + ADD(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + ADD(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -1674,56 +1663,56 @@ static void _addcr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - /* thumb auto set carry if not inside IT block */ - if ((r0|r1|r2) < 8) - T1_ADD(r0, r1, r2); - else - T2_ADDS(r0, r1, r2); + /* thumb auto set carry if not inside IT block */ + if ((r0|r1|r2) < 8) + T1_ADD(r0, r1, r2); + else + T2_ADDS(r0, r1, r2); } else - ADDS(r0, r1, r2); + ADDS(r0, r1, r2); } static void _addci(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8 && !(i0 & ~7)) - T1_ADDI3(r0, r1, i0); - else if ((r0|r1) < 8 && !(-i0 & ~7)) - T1_SUBI3(r0, r1, -i0); - else if (r0 < 8 && r0 == r1 && !(i0 & ~0xff)) - T1_ADDI8(r0, i0); - else if (r0 < 8 && r0 == r1 && !(-i0 & ~0xff)) - T1_SUBI8(r0, -i0); - else if ((i = encode_thumb_immediate(i0)) != -1) - T2_ADDSI(r0, r1, i); - else if ((i = encode_thumb_immediate(-i0)) != -1) - T2_SUBSI(r0, r1, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - T2_ADDS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((r0|r1) < 8 && !(i0 & ~7)) + T1_ADDI3(r0, r1, i0); + else if ((r0|r1) < 8 && !(-i0 & ~7)) + T1_SUBI3(r0, r1, -i0); + else if (r0 < 8 && r0 == r1 && !(i0 & ~0xff)) + T1_ADDI8(r0, i0); + else if (r0 < 8 && r0 == r1 && !(-i0 & ~0xff)) + T1_SUBI8(r0, -i0); + else if ((i = encode_thumb_immediate(i0)) != -1) + T2_ADDSI(r0, r1, i); + else if ((i = encode_thumb_immediate(-i0)) != -1) + T2_SUBSI(r0, r1, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + T2_ADDS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if ((i = encode_arm_immediate(i0)) != -1) - ADDSI(r0, r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - SUBSI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - ADDS(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - ADDS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + ADDSI(r0, r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + SUBSI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + ADDS(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + ADDS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -1732,56 +1721,56 @@ _addxr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { /* keep setting carry because don't know last ADC */ if (jit_thumb_p()) { - /* thumb auto set carry if not inside IT block */ - if ((r0|r1|r2) < 8 && (r0 == r1 || r0 == r2)) - T1_ADC(r0, r0 == r1 ? r2 : r1); - else - T2_ADCS(r0, r1, r2); + /* thumb auto set carry if not inside IT block */ + if ((r0|r1|r2) < 8 && (r0 == r1 || r0 == r2)) + T1_ADC(r0, r0 == r1 ? r2 : r1); + else + T2_ADCS(r0, r1, r2); } else - ADCS(r0, r1, r2); + ADCS(r0, r1, r2); } static void _addxi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; - int no_set_flags; + int i; + int32_t reg; + int no_set_flags; if (jit_thumb_p()) { - no_set_flags = jit_no_set_flags(); - jit_no_set_flags() = 1; - if ((i = encode_thumb_immediate(i0)) != -1) - T2_ADCSI(r0, r1, i); - else if ((i = encode_thumb_immediate(-i0)) != -1) - T2_SBCSI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - T2_ADCS(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - T2_ADCS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } - jit_no_set_flags() = no_set_flags; + no_set_flags = jit_no_set_flags(); + jit_no_set_flags() = 1; + if ((i = encode_thumb_immediate(i0)) != -1) + T2_ADCSI(r0, r1, i); + else if ((i = encode_thumb_immediate(-i0)) != -1) + T2_SBCSI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + T2_ADCS(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + T2_ADCS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } + jit_no_set_flags() = no_set_flags; } else { - if ((i = encode_arm_immediate(i0)) != -1) - ADCSI(r0, r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - SBCSI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - ADCS(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - ADCS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + ADCSI(r0, r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + SBCSI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + ADCS(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + ADCS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -1789,59 +1778,59 @@ static void _subr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1|r2) < 8) - T1_SUB(r0, r1, r2); - else - T2_SUB(r0, r1, r2); + if (!jit_no_set_flags() && (r0|r1|r2) < 8) + T1_SUB(r0, r1, r2); + else + T2_SUB(r0, r1, r2); } else - SUB(r0, r1, r2); + SUB(r0, r1, r2); } static void _subi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1) < 8 && !(i0 & ~7)) - T1_SUBI3(r0, r1, i0); - else if (!jit_no_set_flags() && (r0|r1) < 8 && !(-i0 & ~7)) - T1_ADDI3(r0, r1, -i0); - else if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(i0 & ~0xff)) - T1_SUBI8(r0, i0); - else if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(-i0 & ~0xff)) - T1_ADDI8(r0, -i0); - else if ((i = encode_thumb_immediate(i0)) != -1) - T2_SUBI(r0, r1, i); - else if ((i = encode_thumb_immediate(-i0)) != -1) - T2_ADDI(r0, r1, i); - else if ((i = encode_thumb_word_immediate(i0)) != -1) - T2_SUBWI(r0, r1, i); - else if ((i = encode_thumb_word_immediate(-i0)) != -1) - T2_ADDWI(r0, r1, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - T2_SUB(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (!jit_no_set_flags() && (r0|r1) < 8 && !(i0 & ~7)) + T1_SUBI3(r0, r1, i0); + else if (!jit_no_set_flags() && (r0|r1) < 8 && !(-i0 & ~7)) + T1_ADDI3(r0, r1, -i0); + else if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(i0 & ~0xff)) + T1_SUBI8(r0, i0); + else if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(-i0 & ~0xff)) + T1_ADDI8(r0, -i0); + else if ((i = encode_thumb_immediate(i0)) != -1) + T2_SUBI(r0, r1, i); + else if ((i = encode_thumb_immediate(-i0)) != -1) + T2_ADDI(r0, r1, i); + else if ((i = encode_thumb_word_immediate(i0)) != -1) + T2_SUBWI(r0, r1, i); + else if ((i = encode_thumb_word_immediate(-i0)) != -1) + T2_ADDWI(r0, r1, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + T2_SUB(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if ((i = encode_arm_immediate(i0)) != -1) - SUBI(r0, r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - ADDI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - SUB(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - SUB(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + SUBI(r0, r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + ADDI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + SUB(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + SUB(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -1849,56 +1838,56 @@ static void _subcr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - /* thumb auto set carry if not inside IT block */ - if ((r0|r1|r2) < 8) - T1_SUB(r0, r1, r2); - else - T2_SUBS(r0, r1, r2); + /* thumb auto set carry if not inside IT block */ + if ((r0|r1|r2) < 8) + T1_SUB(r0, r1, r2); + else + T2_SUBS(r0, r1, r2); } else - SUBS(r0, r1, r2); + SUBS(r0, r1, r2); } static void _subci(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8 && !(i0 & ~7)) - T1_SUBI3(r0, r1, i0); - else if ((r0|r1) < 8 && !(-i0 & ~7)) - T1_ADDI3(r0, r1, -i0); - else if (r0 < 8 && r0 == r1 && !(i0 & ~0xff)) - T1_SUBI8(r0, i0); - else if (r0 < 8 && r0 == r1 && !(-i0 & ~0xff)) - T1_ADDI8(r0, -i0); - else if ((i = encode_thumb_immediate(i0)) != -1) - T2_SUBSI(r0, r1, i); - else if ((i = encode_thumb_immediate(-i0)) != -1) - T2_ADDSI(r0, r1, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - T2_SUBS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((r0|r1) < 8 && !(i0 & ~7)) + T1_SUBI3(r0, r1, i0); + else if ((r0|r1) < 8 && !(-i0 & ~7)) + T1_ADDI3(r0, r1, -i0); + else if (r0 < 8 && r0 == r1 && !(i0 & ~0xff)) + T1_SUBI8(r0, i0); + else if (r0 < 8 && r0 == r1 && !(-i0 & ~0xff)) + T1_ADDI8(r0, -i0); + else if ((i = encode_thumb_immediate(i0)) != -1) + T2_SUBSI(r0, r1, i); + else if ((i = encode_thumb_immediate(-i0)) != -1) + T2_ADDSI(r0, r1, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + T2_SUBS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if ((i = encode_arm_immediate(i0)) != -1) - SUBSI(r0, r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - ADDSI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - SUBS(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - SUBS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + SUBSI(r0, r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + ADDSI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + SUBS(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + SUBS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -1907,56 +1896,56 @@ _subxr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { /* keep setting carry because don't know last SBC */ if (jit_thumb_p()) { - /* thumb auto set carry if not inside IT block */ - if ((r0|r1|r2) < 8 && r0 == r1) - T1_SBC(r0, r2); - else - T2_SBCS(r0, r1, r2); + /* thumb auto set carry if not inside IT block */ + if ((r0|r1|r2) < 8 && r0 == r1) + T1_SBC(r0, r2); + else + T2_SBCS(r0, r1, r2); } else - SBCS(r0, r1, r2); + SBCS(r0, r1, r2); } static void _subxi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; - int no_set_flags; + int i; + int32_t reg; + int no_set_flags; if (jit_thumb_p()) { - no_set_flags = jit_no_set_flags(); - jit_no_set_flags() = 1; - if ((i = encode_arm_immediate(i0)) != -1) - T2_SBCSI(r0, r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - T2_ADCSI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - T2_SBCS(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - SBCS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } - jit_no_set_flags() = no_set_flags; + no_set_flags = jit_no_set_flags(); + jit_no_set_flags() = 1; + if ((i = encode_arm_immediate(i0)) != -1) + T2_SBCSI(r0, r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + T2_ADCSI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + T2_SBCS(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + SBCS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } + jit_no_set_flags() = no_set_flags; } else { - if ((i = encode_arm_immediate(i0)) != -1) - SBCSI(r0, r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - ADCSI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - SBCS(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - SBCS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + SBCSI(r0, r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + ADCSI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + SBCS(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + SBCS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -1970,35 +1959,35 @@ _rsbi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) static void _mulr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if (!jit_no_set_flags() && r0 == r2 && (r0|r1) < 8) - T1_MUL(r0, r1); - else if (!jit_no_set_flags() && r0 == r1 && (r0|r2) < 8) - T1_MUL(r0, r2); - else - T2_MUL(r0, r1, r2); + if (!jit_no_set_flags() && r0 == r2 && (r0|r1) < 8) + T1_MUL(r0, r1); + else if (!jit_no_set_flags() && r0 == r1 && (r0|r2) < 8) + T1_MUL(r0, r2); + else + T2_MUL(r0, r1, r2); } else { - if (r0 == r1 && !jit_armv6_p()) { - if (r0 != r2) - MUL(r0, r2, r1); - else { - reg = jit_get_reg(jit_class_gpr); - MOV(rn(reg), r1); - MUL(r0, rn(reg), r2); - jit_unget_reg(reg); - } - } - else - MUL(r0, r1, r2); + if (r0 == r1 && !jit_armv6_p()) { + if (r0 != r2) + MUL(r0, r2, r1); + else { + reg = jit_get_reg(jit_class_gpr); + MOV(rn(reg), r1); + MUL(r0, rn(reg), r2); + jit_unget_reg(reg); + } + } + else + MUL(r0, r1, r2); } } static void _muli(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); mulr(r0, r1, rn(reg)); @@ -2007,62 +1996,62 @@ _muli(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) static void _iqmulr(jit_state_t *_jit, int32_t r0, int32_t r1, - int32_t r2, int32_t r3, jit_bool_t sign) + int32_t r2, int32_t r3, jit_bool_t sign) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if (r2 == r3) { - reg = jit_get_reg(jit_class_gpr); - movr(rn(reg), r2); - if (sign) - T2_SMULL(r0, r1, rn(reg), r2); - else - T2_UMULL(r0, r1, rn(reg), r2); - jit_unget_reg(reg); - } - else if (r0 != r2 && r1 != r2) { - if (sign) - T2_SMULL(r0, r1, r2, r3); - else - T2_UMULL(r0, r1, r2, r3); - } - else { - if (sign) - T2_SMULL(r0, r1, r3, r2); - else - T2_UMULL(r0, r1, r3, r2); - } + if (r2 == r3) { + reg = jit_get_reg(jit_class_gpr); + movr(rn(reg), r2); + if (sign) + T2_SMULL(r0, r1, rn(reg), r2); + else + T2_UMULL(r0, r1, rn(reg), r2); + jit_unget_reg(reg); + } + else if (r0 != r2 && r1 != r2) { + if (sign) + T2_SMULL(r0, r1, r2, r3); + else + T2_UMULL(r0, r1, r2, r3); + } + else { + if (sign) + T2_SMULL(r0, r1, r3, r2); + else + T2_UMULL(r0, r1, r3, r2); + } } else { - if (r2 == r3) { - reg = jit_get_reg(jit_class_gpr); - movr(rn(reg), r2); - if (sign) - SMULL(r0, r1, rn(reg), r2); - else - UMULL(r0, r1, rn(reg), r2); - jit_unget_reg(reg); - } - else if (r0 != r2 && r1 != r2) { - if (sign) - SMULL(r0, r1, r2, r3); - else - UMULL(r0, r1, r2, r3); - } - else { - if (sign) - SMULL(r0, r1, r3, r2); - else - UMULL(r0, r1, r3, r2); - } + if (r2 == r3) { + reg = jit_get_reg(jit_class_gpr); + movr(rn(reg), r2); + if (sign) + SMULL(r0, r1, rn(reg), r2); + else + UMULL(r0, r1, rn(reg), r2); + jit_unget_reg(reg); + } + else if (r0 != r2 && r1 != r2) { + if (sign) + SMULL(r0, r1, r2, r3); + else + UMULL(r0, r1, r2, r3); + } + else { + if (sign) + SMULL(r0, r1, r3, r2); + else + UMULL(r0, r1, r3, r2); + } } } static void _iqmuli(jit_state_t *_jit, int32_t r0, int32_t r1, - int32_t r2, jit_word_t i0, jit_bool_t sign) + int32_t r2, jit_word_t i0, jit_bool_t sign) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); iqmulr(r0, r1, r2, rn(reg), sign); @@ -2071,32 +2060,32 @@ _iqmuli(jit_state_t *_jit, int32_t r0, int32_t r1, static void _divrem(jit_state_t *_jit, int div, int sign, - int32_t r0, int32_t r1, int32_t r2) + int32_t r0, int32_t r1, int32_t r2) { - jit_word_t d; - jit_word_t w; + jit_word_t d; + jit_word_t w; jit_get_reg_args(); movr(_R0_REGNO, r1); movr(_R1_REGNO, r2); - if (sign) w = (jit_word_t)__aeabi_idivmod; - else w = (jit_word_t)__aeabi_uidivmod; + if (sign) w = (jit_word_t)__aeabi_idivmod; + else w = (jit_word_t)__aeabi_uidivmod; if (!jit_exchange_p()) { - if (jit_thumb_p()) d = ((w - _jit->pc.w) >> 1) - 2; - else d = ((w - _jit->pc.w) >> 2) - 2; - if (_s24P(d)) { - if (jit_thumb_p()) T2_BLI(encode_thumb_jump(d)); - else BLI(d & 0x00ffffff); - } - else goto fallback; + if (jit_thumb_p()) d = ((w - _jit->pc.w) >> 1) - 2; + else d = ((w - _jit->pc.w) >> 2) - 2; + if (_s24P(d)) { + if (jit_thumb_p()) T2_BLI(encode_thumb_jump(d)); + else BLI(d & 0x00ffffff); + } + else goto fallback; } else { fallback: - movi(_R2_REGNO, w); - if (jit_thumb_p()) T1_BLX(_R2_REGNO); - else BLX(_R2_REGNO); + movi(_R2_REGNO, w); + if (jit_thumb_p()) T1_BLX(_R2_REGNO); + else BLX(_R2_REGNO); } - if (div) movr(r0, _R0_REGNO); - else movr(r0, _R1_REGNO); + if (div) movr(r0, _R0_REGNO); + else movr(r0, _R1_REGNO); jit_unget_reg_args(); } @@ -2104,15 +2093,15 @@ static void _divr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_armv7r_p() && jit_thumb_p()) - T2_SDIV(r0, r1, r2); + T2_SDIV(r0, r1, r2); else - divrem(1, 1, r0, r1, r2); + divrem(1, 1, r0, r1, r2); } static void _divi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); divr(r0, r1, rn(reg)); @@ -2123,15 +2112,15 @@ static void _divr_u(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_armv7r_p() && jit_thumb_p()) - T2_UDIV(r0, r1, r2); + T2_UDIV(r0, r1, r2); else - divrem(1, 0, r0, r1, r2); + divrem(1, 0, r0, r1, r2); } static void _divi_u(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); divr_u(r0, r1, rn(reg)); @@ -2140,29 +2129,29 @@ _divi_u(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) static void _iqdivr(jit_state_t *_jit, int32_t r0, int32_t r1, - int32_t r2, int32_t r3, jit_bool_t sign) + int32_t r2, int32_t r3, jit_bool_t sign) { - jit_word_t d; - jit_word_t w; + jit_word_t d; + jit_word_t w; jit_get_reg_args(); movr(_R0_REGNO, r2); movr(_R1_REGNO, r3); - if (sign) w = (jit_word_t)__aeabi_idivmod; - else w = (jit_word_t)__aeabi_uidivmod; + if (sign) w = (jit_word_t)__aeabi_idivmod; + else w = (jit_word_t)__aeabi_uidivmod; if (!jit_exchange_p()) { - if (jit_thumb_p()) d = ((w - _jit->pc.w) >> 1) - 2; - else d = ((w - _jit->pc.w) >> 2) - 2; - if (_s24P(d)) { - if (jit_thumb_p()) T2_BLI(encode_thumb_jump(d)); - else BLI(d & 0x00ffffff); - } - else goto fallback; + if (jit_thumb_p()) d = ((w - _jit->pc.w) >> 1) - 2; + else d = ((w - _jit->pc.w) >> 2) - 2; + if (_s24P(d)) { + if (jit_thumb_p()) T2_BLI(encode_thumb_jump(d)); + else BLI(d & 0x00ffffff); + } + else goto fallback; } else { fallback: - movi(_R2_REGNO, w); - if (jit_thumb_p()) T1_BLX(_R2_REGNO); - else BLX(_R2_REGNO); + movi(_R2_REGNO, w); + if (jit_thumb_p()) T1_BLX(_R2_REGNO); + else BLX(_R2_REGNO); } movr(r0, _R0_REGNO); movr(r1, _R1_REGNO); @@ -2171,9 +2160,9 @@ _iqdivr(jit_state_t *_jit, int32_t r0, int32_t r1, static void _iqdivi(jit_state_t *_jit, int32_t r0, int32_t r1, - int32_t r2, jit_word_t i0, jit_bool_t sign) + int32_t r2, jit_word_t i0, jit_bool_t sign) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); iqdivr(r0, r1, r2, rn(reg), sign); @@ -2189,7 +2178,7 @@ _remr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) static void _remi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); remr(r0, r1, rn(reg)); @@ -2205,7 +2194,7 @@ _remr_u(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) static void _remi_u(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); remr_u(r0, r1,rn(reg)); @@ -2216,51 +2205,51 @@ static void _andr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2)) - T1_AND(r0, r0 == r1 ? r2 : r1); - else - T2_AND(r0, r1, r2); + if (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2)) + T1_AND(r0, r0 == r1 ? r2 : r1); + else + T2_AND(r0, r1, r2); } else - AND(r0, r1, r2); + AND(r0, r1, r2); } static void _andi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) { - if ((i = encode_thumb_immediate(i0)) != -1) - T2_ANDI(r0, r1, i); - else if ((i = encode_thumb_immediate(~i0)) != -1) - T2_BICI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - T2_AND(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - T2_AND(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_thumb_immediate(i0)) != -1) + T2_ANDI(r0, r1, i); + else if ((i = encode_thumb_immediate(~i0)) != -1) + T2_BICI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + T2_AND(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + T2_AND(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if ((i = encode_arm_immediate(i0)) != -1) - ANDI(r0, r1, i); - else if ((i = encode_arm_immediate(~i0)) != -1) - BICI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - AND(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - AND(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + ANDI(r0, r1, i); + else if ((i = encode_arm_immediate(~i0)) != -1) + BICI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + AND(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + AND(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -2268,47 +2257,47 @@ static void _orr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2)) - T1_ORR(r0, r0 == r1 ? r2 : r1); - else - T2_ORR(r0, r1, r2); + if (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2)) + T1_ORR(r0, r0 == r1 ? r2 : r1); + else + T2_ORR(r0, r1, r2); } else - ORR(r0, r1, r2); + ORR(r0, r1, r2); } static void _ori(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) { - if ((i = encode_thumb_immediate(i0)) != -1) - T2_ORRI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - T2_ORR(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - T2_ORR(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_thumb_immediate(i0)) != -1) + T2_ORRI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + T2_ORR(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + T2_ORR(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if ((i = encode_arm_immediate(i0)) != -1) - ORRI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - ORR(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - ORR(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + ORRI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + ORR(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + ORR(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -2316,47 +2305,47 @@ static void _xorr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2)) - T1_EOR(r0, r0 == r1 ? r2 : r1); - else - T2_EOR(r0, r1, r2); + if (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2)) + T1_EOR(r0, r0 == r1 ? r2 : r1); + else + T2_EOR(r0, r1, r2); } else - EOR(r0, r1, r2); + EOR(r0, r1, r2); } static void _xori(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) { - if ((i = encode_thumb_immediate(i0)) != -1) - T2_EORI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - T2_EOR(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - T2_EOR(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_thumb_immediate(i0)) != -1) + T2_EORI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + T2_EOR(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + T2_EOR(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if ((i = encode_arm_immediate(i0)) != -1) - EORI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - EOR(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - EOR(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((i = encode_arm_immediate(i0)) != -1) + EORI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + EOR(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + EOR(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -2364,13 +2353,13 @@ static void _lshr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1) - T1_LSL(r0, r2); - else - T2_LSL(r0, r1, r2); + if (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1) + T1_LSL(r0, r2); + else + T2_LSL(r0, r1, r2); } else - LSL(r0, r1, r2); + LSL(r0, r1, r2); } static void @@ -2378,28 +2367,28 @@ _lshi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { assert(i0 >= 0 && i0 <= 31); if (i0 == 0) - movr(r0, r1); + movr(r0, r1); else if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1) < 8) - T1_LSLI(r0, r1, i0); - else - T2_LSLI(r0, r1, i0); + if (!jit_no_set_flags() && (r0|r1) < 8) + T1_LSLI(r0, r1, i0); + else + T2_LSLI(r0, r1, i0); } else - LSLI(r0, r1, i0); + LSLI(r0, r1, i0); } static void _rshr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1) - T1_ASR(r0, r2); - else - T2_ASR(r0, r1, r2); + if (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1) + T1_ASR(r0, r2); + else + T2_ASR(r0, r1, r2); } else - ASR(r0, r1, r2); + ASR(r0, r1, r2); } static void @@ -2407,28 +2396,28 @@ _rshi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { assert(i0 >= 0 && i0 <= 31); if (i0 == 0) - movr(r0, r1); + movr(r0, r1); else if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1) < 8) - T1_ASRI(r0, r1, i0); - else - T2_ASRI(r0, r1, i0); + if (!jit_no_set_flags() && (r0|r1) < 8) + T1_ASRI(r0, r1, i0); + else + T2_ASRI(r0, r1, i0); } else - ASRI(r0, r1, i0); + ASRI(r0, r1, i0); } static void _rshr_u(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1) - T1_LSR(r0, r2); - else - T2_LSR(r0, r1, r2); + if (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1) + T1_LSR(r0, r2); + else + T2_LSR(r0, r1, r2); } else - LSR(r0, r1, r2); + LSR(r0, r1, r2); } static void @@ -2436,15 +2425,15 @@ _rshi_u(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { assert(i0 >= 0 && i0 <= 31); if (i0 == 0) - movr(r0, r1); + movr(r0, r1); else if (jit_thumb_p()) { - if (!jit_no_set_flags() && (r0|r1) < 8) - T1_LSRI(r0, r1, i0); - else - T2_LSRI(r0, r1, i0); + if (!jit_no_set_flags() && (r0|r1) < 8) + T1_LSRI(r0, r1, i0); + else + T2_LSRI(r0, r1, i0); } else - LSRI(r0, r1, i0); + LSRI(r0, r1, i0); } static void @@ -2452,27 +2441,27 @@ _ccr(jit_state_t *_jit, int ct, int cf, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - assert((ct ^ cf) >> 28 == 1); - if ((r1|r2) < 8) - T1_CMP(r1, r2); - else if ((r1&r2) & 8) - T1_CMPX(r1, r2); - else - T2_CMP(r1, r2); - ITE(ct); - if (r0 < 8) { - T1_MOVI(r0, 1); - T1_MOVI(r0, 0); - } - else { - T2_MOVI(r0, 1); - T2_MOVI(r0, 0); - } + assert((ct ^ cf) >> 28 == 1); + if ((r1|r2) < 8) + T1_CMP(r1, r2); + else if ((r1&r2) & 8) + T1_CMPX(r1, r2); + else + T2_CMP(r1, r2); + ITE(ct); + if (r0 < 8) { + T1_MOVI(r0, 1); + T1_MOVI(r0, 0); + } + else { + T2_MOVI(r0, 1); + T2_MOVI(r0, 0); + } } else { - CMP(r1, r2); - CC_MOVI(ct, r0, 1); - CC_MOVI(cf, r0, 0); + CMP(r1, r2); + CC_MOVI(ct, r0, 1); + CC_MOVI(cf, r0, 0); } } @@ -2480,49 +2469,49 @@ static void _cci(jit_state_t *_jit, int ct, int cf, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) { - if (r1 < 7 && !(i0 & 0xffffff00)) - T1_CMPI(r1, i0); - else if ((i = encode_thumb_immediate(i0)) != -1) - T2_CMPI(r1, i); - else if ((i = encode_thumb_immediate(-i0)) != -1) - T2_CMNI(r1, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - ccr(ct, cf, r0, r1, rn(reg)); - jit_unget_reg(reg); - return; - } - ITE(ct); - if (r0 < 8) { - T1_MOVI(r0, 1); - T1_MOVI(r0, 0); - } - else { - T2_MOVI(r0, 1); - T2_MOVI(r0, 0); - } + if (r1 < 7 && !(i0 & 0xffffff00)) + T1_CMPI(r1, i0); + else if ((i = encode_thumb_immediate(i0)) != -1) + T2_CMPI(r1, i); + else if ((i = encode_thumb_immediate(-i0)) != -1) + T2_CMNI(r1, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + ccr(ct, cf, r0, r1, rn(reg)); + jit_unget_reg(reg); + return; + } + ITE(ct); + if (r0 < 8) { + T1_MOVI(r0, 1); + T1_MOVI(r0, 0); + } + else { + T2_MOVI(r0, 1); + T2_MOVI(r0, 0); + } } else { - if ((i = encode_arm_immediate(i0)) != -1) - CMPI(r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - CMNI(r1, i); - else if (r0 != r1) { - movi(r0, i0); - CMP(r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - CMP(r1, rn(reg)); - jit_unget_reg(reg); - } - CC_MOVI(ct, r0, 1); - CC_MOVI(cf, r0, 0); + if ((i = encode_arm_immediate(i0)) != -1) + CMPI(r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + CMNI(r1, i); + else if (r0 != r1) { + movi(r0, i0); + CMP(r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + CMP(r1, rn(reg)); + jit_unget_reg(reg); + } + CC_MOVI(ct, r0, 1); + CC_MOVI(cf, r0, 0); } } @@ -2530,36 +2519,36 @@ static void _ner(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) - ccr(ARM_CC_NE, ARM_CC_EQ, r0, r1, r2); + ccr(ARM_CC_NE, ARM_CC_EQ, r0, r1, r2); else { - SUBS(r0, r1, r2); - CC_MOVI(ARM_CC_NE, r0, 1); + SUBS(r0, r1, r2); + CC_MOVI(ARM_CC_NE, r0, 1); } } static void _nei(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int i; - int32_t reg; + int i; + int32_t reg; if (jit_thumb_p()) - cci(ARM_CC_NE, ARM_CC_EQ, r0, r1, i0); + cci(ARM_CC_NE, ARM_CC_EQ, r0, r1, i0); else { - if ((i = encode_arm_immediate(i0)) != -1) - SUBSI(r0, r1, i); - else if ((i = encode_arm_immediate(-i0)) != -1) - ADDSI(r0, r1, i); - else if (r0 != r1) { - movi(r0, i0); - SUBS(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - SUBS(r0, r1, rn(reg)); - jit_unget_reg(reg); - } - CC_MOVI(ARM_CC_NE, r0, 1); + if ((i = encode_arm_immediate(i0)) != -1) + SUBSI(r0, r1, i); + else if ((i = encode_arm_immediate(-i0)) != -1) + ADDSI(r0, r1, i); + else if (r0 != r1) { + movi(r0, i0); + SUBS(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + SUBS(r0, r1, rn(reg)); + jit_unget_reg(reg); + } + CC_MOVI(ARM_CC_NE, r0, 1); } } @@ -2567,71 +2556,71 @@ static void _jmpr(jit_state_t *_jit, int32_t r0) { if (jit_thumb_p()) - T1_MOV(_R15_REGNO, r0); + T1_MOV(_R15_REGNO, r0); else - MOV(_R15_REGNO, r0); + MOV(_R15_REGNO, r0); } static void _jmpi(jit_state_t *_jit, jit_word_t i0) { - jit_word_t w; - jit_word_t d; - int32_t reg; + jit_word_t w; + jit_word_t d; + int32_t reg; w = _jit->pc.w; /* if thumb and in thumb mode */ if (jit_thumb_p() && _jitc->thumb) { - d = ((i0 - w) >> 1) - 2; - if (d >= -1024 && d <= 1023) - T1_B(d & 0x7ff); - else if (_s24P(d)) - T2_B(encode_thumb_jump(d)); - else { - reg = jit_get_reg(jit_class_gpr|jit_class_nospill); - movi(rn(reg), i0); - jmpr(rn(reg)); - jit_unget_reg(reg); - } + d = ((i0 - w) >> 1) - 2; + if (d >= -1024 && d <= 1023) + T1_B(d & 0x7ff); + else if (_s24P(d)) + T2_B(encode_thumb_jump(d)); + else { + reg = jit_get_reg(jit_class_gpr|jit_class_nospill); + movi(rn(reg), i0); + jmpr(rn(reg)); + jit_unget_reg(reg); + } } else { - d = ((i0 - w) >> 2) - 2; - if (_s24P(d)) - B(d & 0x00ffffff); - else { - reg = jit_get_reg(jit_class_gpr|jit_class_nospill); - movi(rn(reg), i0); - jmpr(rn(reg)); - jit_unget_reg(reg); - } + d = ((i0 - w) >> 2) - 2; + if (_s24P(d)) + B(d & 0x00ffffff); + else { + reg = jit_get_reg(jit_class_gpr|jit_class_nospill); + movi(rn(reg), i0); + jmpr(rn(reg)); + jit_unget_reg(reg); + } } } static jit_word_t _jmpi_p(jit_state_t *_jit, jit_word_t i0, jit_bool_t i1) { - jit_word_t w; - jit_word_t d; - int32_t reg; + jit_word_t w; + jit_word_t d; + int32_t reg; if (i1) { - /* Assume jump is not longer than 23 bits if inside jit */ - w = _jit->pc.w; - /* if thumb and in thumb mode */ - if (jit_thumb_p() && _jitc->thumb) { - d = ((i0 - w) >> 1) - 2; - assert(_s24P(d)); - T2_B(encode_thumb_jump(d)); - } - else { - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - B(d & 0x00ffffff); - } + /* Assume jump is not longer than 23 bits if inside jit */ + w = _jit->pc.w; + /* if thumb and in thumb mode */ + if (jit_thumb_p() && _jitc->thumb) { + d = ((i0 - w) >> 1) - 2; + assert(_s24P(d)); + T2_B(encode_thumb_jump(d)); + } + else { + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + B(d & 0x00ffffff); + } } else { - reg = jit_get_reg(jit_class_gpr|jit_class_nospill); - w = movi_p(rn(reg), i0); - jmpr(rn(reg)); - jit_unget_reg(reg); + reg = jit_get_reg(jit_class_gpr|jit_class_nospill); + w = movi_p(rn(reg), i0); + jmpr(rn(reg)); + jit_unget_reg(reg); } return (w); } @@ -2639,27 +2628,27 @@ _jmpi_p(jit_state_t *_jit, jit_word_t i0, jit_bool_t i1) static jit_word_t _bccr(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int32_t r1) { - jit_word_t w; - jit_word_t d; + jit_word_t w; + jit_word_t d; if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_CMP(r0, r1); - else if ((r0&r1) & 8) - T1_CMPX(r0, r1); - else - T2_CMP(r0, r1); - /* use only thumb2 conditional as does not know if will be patched */ - w = _jit->pc.w; - d = ((i0 - w) >> 1) - 2; - assert(_s20P(d)); - T2_CC_B(cc, encode_thumb_cc_jump(d)); + if ((r0|r1) < 8) + T1_CMP(r0, r1); + else if ((r0&r1) & 8) + T1_CMPX(r0, r1); + else + T2_CMP(r0, r1); + /* use only thumb2 conditional as does not know if will be patched */ + w = _jit->pc.w; + d = ((i0 - w) >> 1) - 2; + assert(_s20P(d)); + T2_CC_B(cc, encode_thumb_cc_jump(d)); } else { - CMP(r0, r1); - w = _jit->pc.w; - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - CC_B(cc, d & 0x00ffffff); + CMP(r0, r1); + w = _jit->pc.w; + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + CC_B(cc, d & 0x00ffffff); } return (w); } @@ -2667,44 +2656,44 @@ _bccr(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int32_t r1) static jit_word_t _bcci(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, jit_word_t i1) { - jit_word_t w; - jit_word_t d; - int i; - int32_t reg; + jit_word_t w; + jit_word_t d; + int i; + int32_t reg; if (jit_thumb_p()) { - if (r0 < 7 && !(i1 & 0xffffff00)) - T1_CMPI(r0, i1); - else if ((i = encode_thumb_immediate(i1)) != -1) - T2_CMPI(r0, i); - else if ((i = encode_thumb_immediate(-i1)) != -1) - T2_CMNI(r0, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i1); - T2_CMP(r0, rn(reg)); - jit_unget_reg(reg); - } - /* use only thumb2 conditional as does not know if will be patched */ - w = _jit->pc.w; - d = ((i0 - w) >> 1) - 2; - assert(_s20P(d)); - T2_CC_B(cc, encode_thumb_cc_jump(d)); + if (r0 < 7 && !(i1 & 0xffffff00)) + T1_CMPI(r0, i1); + else if ((i = encode_thumb_immediate(i1)) != -1) + T2_CMPI(r0, i); + else if ((i = encode_thumb_immediate(-i1)) != -1) + T2_CMNI(r0, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i1); + T2_CMP(r0, rn(reg)); + jit_unget_reg(reg); + } + /* use only thumb2 conditional as does not know if will be patched */ + w = _jit->pc.w; + d = ((i0 - w) >> 1) - 2; + assert(_s20P(d)); + T2_CC_B(cc, encode_thumb_cc_jump(d)); } else { - if ((i = encode_arm_immediate(i1)) != -1) - CMPI(r0, i); - else if ((i = encode_arm_immediate(-i1)) != -1) - CMNI(r0, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i1); - CMP(r0, rn(reg)); - jit_unget_reg(reg); - } - w = _jit->pc.w; - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - CC_B(cc, d & 0x00ffffff); + if ((i = encode_arm_immediate(i1)) != -1) + CMPI(r0, i); + else if ((i = encode_arm_immediate(-i1)) != -1) + CMNI(r0, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i1); + CMP(r0, rn(reg)); + jit_unget_reg(reg); + } + w = _jit->pc.w; + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + CC_B(cc, d & 0x00ffffff); } return (w); } @@ -2712,24 +2701,24 @@ _bcci(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, jit_word_t i1) static jit_word_t _baddr(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int32_t r1) { - jit_word_t w; - jit_word_t d; + jit_word_t w; + jit_word_t d; if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_ADD(r0, r0, r1); - else - T2_ADDS(r0, r0, r1); - w = _jit->pc.w; - d = ((i0 - w) >> 1) - 2; - assert(_s20P(d)); - T2_CC_B(cc, encode_thumb_cc_jump(d)); + if ((r0|r1) < 8) + T1_ADD(r0, r0, r1); + else + T2_ADDS(r0, r0, r1); + w = _jit->pc.w; + d = ((i0 - w) >> 1) - 2; + assert(_s20P(d)); + T2_CC_B(cc, encode_thumb_cc_jump(d)); } else { - ADDS(r0, r0, r1); - w = _jit->pc.w; - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - CC_B(cc, d & 0x00ffffff); + ADDS(r0, r0, r1); + w = _jit->pc.w; + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + CC_B(cc, d & 0x00ffffff); } return (w); } @@ -2737,49 +2726,49 @@ _baddr(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int32_t r1) static jit_word_t _baddi(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int i1) { - int i; - jit_word_t w; - jit_word_t d; - int32_t reg; + int i; + jit_word_t w; + jit_word_t d; + int32_t reg; if (jit_thumb_p()) { - if (r0 < 8 && !(i1 & ~7)) - T1_ADDI3(r0, r0, i1); - else if (r0 < 8 && !(-i1 & ~7)) - T1_SUBI3(r0, r0, -i1); - else if (r0 < 8 && !(i1 & ~0xff)) - T1_ADDI8(r0, i1); - else if (r0 < 8 && !(-i1 & ~0xff)) - T1_SUBI8(r0, -i1); - else if ((i = encode_thumb_immediate(i1)) != -1) - T2_ADDSI(r0, r0, i); - else if ((i = encode_thumb_immediate(-i1)) != -1) - T2_SUBSI(r0, r0, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i1); - T2_ADDS(r0, r0, rn(reg)); - jit_unget_reg(reg); - } - w = _jit->pc.w; - d = ((i0 - w) >> 1) - 2; - assert(_s20P(d)); - T2_CC_B(cc, encode_thumb_cc_jump(d)); + if (r0 < 8 && !(i1 & ~7)) + T1_ADDI3(r0, r0, i1); + else if (r0 < 8 && !(-i1 & ~7)) + T1_SUBI3(r0, r0, -i1); + else if (r0 < 8 && !(i1 & ~0xff)) + T1_ADDI8(r0, i1); + else if (r0 < 8 && !(-i1 & ~0xff)) + T1_SUBI8(r0, -i1); + else if ((i = encode_thumb_immediate(i1)) != -1) + T2_ADDSI(r0, r0, i); + else if ((i = encode_thumb_immediate(-i1)) != -1) + T2_SUBSI(r0, r0, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i1); + T2_ADDS(r0, r0, rn(reg)); + jit_unget_reg(reg); + } + w = _jit->pc.w; + d = ((i0 - w) >> 1) - 2; + assert(_s20P(d)); + T2_CC_B(cc, encode_thumb_cc_jump(d)); } else { - if ((i = encode_arm_immediate(i1)) != -1) - ADDSI(r0, r0, i); - else if ((i = encode_arm_immediate(-i1)) != -1) - SUBSI(r0, r0, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i1); - ADDS(r0, r0, rn(reg)); - jit_unget_reg(reg); - } - w = _jit->pc.w; - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - CC_B(cc, d & 0x00ffffff); + if ((i = encode_arm_immediate(i1)) != -1) + ADDSI(r0, r0, i); + else if ((i = encode_arm_immediate(-i1)) != -1) + SUBSI(r0, r0, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i1); + ADDS(r0, r0, rn(reg)); + jit_unget_reg(reg); + } + w = _jit->pc.w; + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + CC_B(cc, d & 0x00ffffff); } return (w); } @@ -2787,24 +2776,24 @@ _baddi(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int i1) static jit_word_t _bsubr(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int32_t r1) { - jit_word_t w; - jit_word_t d; + jit_word_t w; + jit_word_t d; if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_SUB(r0, r0, r1); - else - T2_SUBS(r0, r0, r1); - w = _jit->pc.w; - d = ((i0 - w) >> 1) - 2; - assert(_s20P(d)); - T2_CC_B(cc, encode_thumb_cc_jump(d)); + if ((r0|r1) < 8) + T1_SUB(r0, r0, r1); + else + T2_SUBS(r0, r0, r1); + w = _jit->pc.w; + d = ((i0 - w) >> 1) - 2; + assert(_s20P(d)); + T2_CC_B(cc, encode_thumb_cc_jump(d)); } else { - SUBS(r0, r0, r1); - w = _jit->pc.w; - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - CC_B(cc, d & 0x00ffffff); + SUBS(r0, r0, r1); + w = _jit->pc.w; + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + CC_B(cc, d & 0x00ffffff); } return (w); } @@ -2812,49 +2801,49 @@ _bsubr(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int32_t r1) static jit_word_t _bsubi(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int i1) { - int i; - jit_word_t w; - jit_word_t d; - int32_t reg; + int i; + jit_word_t w; + jit_word_t d; + int32_t reg; if (jit_thumb_p()) { - if (r0 < 8 && !(i1 & ~7)) - T1_SUBI3(r0, r0, i1); - else if (r0 < 8 && !(-i1 & ~7)) - T1_ADDI3(r0, r0, -i1); - else if (r0 < 8 && !(i1 & ~0xff)) - T1_SUBI8(r0, i1); - else if (r0 < 8 && !(-i1 & ~0xff)) - T1_ADDI8(r0, -i1); - else if ((i = encode_thumb_immediate(i1)) != -1) - T2_SUBSI(r0, r0, i); - else if ((i = encode_thumb_immediate(-i1)) != -1) - T2_SUBSI(r0, r0, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i1); - T2_SUBS(r0, r0, rn(reg)); - jit_unget_reg(reg); - } - w = _jit->pc.w; - d = ((i0 - w) >> 1) - 2; - assert(_s20P(d)); - T2_CC_B(cc, encode_thumb_cc_jump(d)); + if (r0 < 8 && !(i1 & ~7)) + T1_SUBI3(r0, r0, i1); + else if (r0 < 8 && !(-i1 & ~7)) + T1_ADDI3(r0, r0, -i1); + else if (r0 < 8 && !(i1 & ~0xff)) + T1_SUBI8(r0, i1); + else if (r0 < 8 && !(-i1 & ~0xff)) + T1_ADDI8(r0, -i1); + else if ((i = encode_thumb_immediate(i1)) != -1) + T2_SUBSI(r0, r0, i); + else if ((i = encode_thumb_immediate(-i1)) != -1) + T2_SUBSI(r0, r0, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i1); + T2_SUBS(r0, r0, rn(reg)); + jit_unget_reg(reg); + } + w = _jit->pc.w; + d = ((i0 - w) >> 1) - 2; + assert(_s20P(d)); + T2_CC_B(cc, encode_thumb_cc_jump(d)); } else { - if ((i = encode_arm_immediate(i1)) != -1) - SUBSI(r0, r0, i); - else if ((i = encode_arm_immediate(-i1)) != -1) - ADDSI(r0, r0, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i1); - SUBS(r0, r0, rn(reg)); - jit_unget_reg(reg); - } - w = _jit->pc.w; - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - CC_B(cc, d & 0x00ffffff); + if ((i = encode_arm_immediate(i1)) != -1) + SUBSI(r0, r0, i); + else if ((i = encode_arm_immediate(-i1)) != -1) + ADDSI(r0, r0, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i1); + SUBS(r0, r0, rn(reg)); + jit_unget_reg(reg); + } + w = _jit->pc.w; + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + CC_B(cc, d & 0x00ffffff); } return (w); } @@ -2862,31 +2851,31 @@ _bsubi(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int i1) static jit_word_t _bmxr(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int32_t r1) { - jit_word_t w; - jit_word_t d; - int32_t reg; + jit_word_t w; + jit_word_t d; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_TST(r0, r1); - else - T2_TST(r0, r1); - w = _jit->pc.w; - d = ((i0 - w) >> 1) - 2; - assert(_s20P(d)); - T2_CC_B(cc, encode_thumb_cc_jump(d)); + if ((r0|r1) < 8) + T1_TST(r0, r1); + else + T2_TST(r0, r1); + w = _jit->pc.w; + d = ((i0 - w) >> 1) - 2; + assert(_s20P(d)); + T2_CC_B(cc, encode_thumb_cc_jump(d)); } else { - if (jit_armv5_p()) - TST(r0, r1); - else { - reg = jit_get_reg(jit_class_gpr); - ANDS(rn(reg), r0, r1); - jit_unget_reg(reg); - } - w = _jit->pc.w; - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - CC_B(cc, d & 0x00ffffff); + if (jit_armv5_p()) + TST(r0, r1); + else { + reg = jit_get_reg(jit_class_gpr); + ANDS(rn(reg), r0, r1); + jit_unget_reg(reg); + } + w = _jit->pc.w; + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + CC_B(cc, d & 0x00ffffff); } return (w); } @@ -2894,51 +2883,51 @@ _bmxr(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, int32_t r1) static jit_word_t _bmxi(jit_state_t *_jit, int cc, jit_word_t i0, int32_t r0, jit_word_t i1) { - int i; - jit_word_t w; - jit_word_t d; - int32_t reg; + int i; + jit_word_t w; + jit_word_t d; + int32_t reg; if (jit_thumb_p()) { - if ((i = encode_thumb_immediate(i1)) != -1) - T2_TSTI(r0, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i1); - T2_TST(r0, rn(reg)); - jit_unget_reg(reg); - } - w = _jit->pc.w; - d = ((i0 - w) >> 1) - 2; - assert(_s20P(d)); - T2_CC_B(cc, encode_thumb_cc_jump(d)); + if ((i = encode_thumb_immediate(i1)) != -1) + T2_TSTI(r0, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i1); + T2_TST(r0, rn(reg)); + jit_unget_reg(reg); + } + w = _jit->pc.w; + d = ((i0 - w) >> 1) - 2; + assert(_s20P(d)); + T2_CC_B(cc, encode_thumb_cc_jump(d)); } else { - if (jit_armv5_p()) { - if ((i = encode_arm_immediate(i1)) != -1) - TSTI(r0, i); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i1); - TST(r0, rn(reg)); - jit_unget_reg(reg); - } - } - else { - reg = jit_get_reg(jit_class_gpr); - if ((i = encode_arm_immediate(i1)) != -1) - ANDSI(rn(reg), r0, i); - else if ((i = encode_arm_immediate(~i1)) != -1) - BICSI(rn(reg), r0, i); - else { - movi(rn(reg), i1); - ANDS(rn(reg), r0, rn(reg)); - } - jit_unget_reg(reg); - } - w = _jit->pc.w; - d = ((i0 - w) >> 2) - 2; - assert(_s24P(d)); - CC_B(cc, d & 0x00ffffff); + if (jit_armv5_p()) { + if ((i = encode_arm_immediate(i1)) != -1) + TSTI(r0, i); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i1); + TST(r0, rn(reg)); + jit_unget_reg(reg); + } + } + else { + reg = jit_get_reg(jit_class_gpr); + if ((i = encode_arm_immediate(i1)) != -1) + ANDSI(rn(reg), r0, i); + else if ((i = encode_arm_immediate(~i1)) != -1) + BICSI(rn(reg), r0, i); + else { + movi(rn(reg), i1); + ANDS(rn(reg), r0, rn(reg)); + } + jit_unget_reg(reg); + } + w = _jit->pc.w; + d = ((i0 - w) >> 2) - 2; + assert(_s24P(d)); + CC_B(cc, d & 0x00ffffff); } return (w); } @@ -2947,21 +2936,21 @@ static void _ldr_c(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) - T2_LDRSBI(r0, r1, 0); + T2_LDRSBI(r0, r1, 0); else - LDRSBI(r0, r1, 0); + LDRSBI(r0, r1, 0); } static void _ldi_c(jit_state_t *_jit, int32_t r0, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); if (jit_thumb_p()) - T2_LDRSBI(r0, rn(reg), 0); + T2_LDRSBI(r0, rn(reg), 0); else - LDRSBI(r0, rn(reg), 0); + LDRSBI(r0, rn(reg), 0); jit_unget_reg(reg); } @@ -2969,58 +2958,60 @@ static void _ldxr_c(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if ((r0|r1|r2) < 8) - T1_LDRSB(r0, r1, r2); - else - T2_LDRSB(r0, r1, r2); + if ((r0|r1|r2) < 8) + T1_LDRSB(r0, r1, r2); + else + T2_LDRSB(r0, r1, r2); } else - LDRSB(r0, r1, r2); + LDRSB(r0, r1, r2); } +#define jit_ldrt_strt_p() 0 + static void _ldxi_c(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) - T2_LDRSBI(r0, r1, i0); - else if (i0 < 0 && i0 >= -255) - T2_LDRSBIN(r0, r1, -i0); - else if (i0 >= 0 && i0 <= 4095) - T2_LDRSBWI(r0, r1, i0); - else if (r0 != r1) { - movi(r0, i0); - if ((r0|r1) < 8) - T1_LDRSB(r0, r1, r0); - else - T2_LDRSB(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if ((r0|r1|rn(reg)) < 8) - T1_LDRSB(r0, r1, rn(reg)); - else - T2_LDRSB(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) + T2_LDRSBI(r0, r1, i0); + else if (i0 < 0 && i0 >= -255) + T2_LDRSBIN(r0, r1, -i0); + else if (i0 >= 0 && i0 <= 4095) + T2_LDRSBWI(r0, r1, i0); + else if (r0 != r1) { + movi(r0, i0); + if ((r0|r1) < 8) + T1_LDRSB(r0, r1, r0); + else + T2_LDRSB(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if ((r0|r1|rn(reg)) < 8) + T1_LDRSB(r0, r1, rn(reg)); + else + T2_LDRSB(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if (i0 >= 0 && i0 <= 255) - LDRSBI(r0, r1, i0); - else if (i0 < 0 && i0 >= -255) - LDRSBIN(r0, r1, -i0); - else if (r0 != r1) { - movi(r0, i0); - LDRSB(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - LDRSB(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (i0 >= 0 && i0 <= 255) + LDRSBI(r0, r1, i0); + else if (i0 < 0 && i0 >= -255) + LDRSBIN(r0, r1, -i0); + else if (r0 != r1) { + movi(r0, i0); + LDRSB(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + LDRSB(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -3028,21 +3019,21 @@ static void _ldr_uc(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) - T2_LDRBI(r0, r1, 0); + T2_LDRBI(r0, r1, 0); else - LDRBI(r0, r1, 0); + LDRBI(r0, r1, 0); } static void _ldi_uc(jit_state_t *_jit, int32_t r0, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); if (jit_thumb_p()) - T2_LDRBI(r0, rn(reg), 0); + T2_LDRBI(r0, rn(reg), 0); else - LDRBI(r0, rn(reg), 0); + LDRBI(r0, rn(reg), 0); jit_unget_reg(reg); } @@ -3050,60 +3041,60 @@ static void _ldxr_uc(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if ((r0|r1|r2) < 8) - T1_LDRB(r0, r1, r2); - else - T2_LDRB(r0, r1, r2); + if ((r0|r1|r2) < 8) + T1_LDRB(r0, r1, r2); + else + T2_LDRB(r0, r1, r2); } else - LDRB(r0, r1, r2); + LDRB(r0, r1, r2); } static void _ldxi_uc(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20) - T1_LDRBI(r0, r1, i0); - else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) - T2_LDRBI(r0, r1, i0); - else if (i0 < 0 && i0 >= -255) - T2_LDRBIN(r0, r1, -i0); - else if (i0 >= 0 && i0 <= 4095) - T2_LDRBWI(r0, r1, i0); - else if (r0 != r1) { - movi(r0, i0); - if ((r0|r1) < 8) - T1_LDRB(r0, r1, r0); - else - T2_LDRB(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if ((r0|r1|rn(reg)) < 8) - T1_LDRB(r0, r1, rn(reg)); - else - T2_LDRB(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20) + T1_LDRBI(r0, r1, i0); + else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) + T2_LDRBI(r0, r1, i0); + else if (i0 < 0 && i0 >= -255) + T2_LDRBIN(r0, r1, -i0); + else if (i0 >= 0 && i0 <= 4095) + T2_LDRBWI(r0, r1, i0); + else if (r0 != r1) { + movi(r0, i0); + if ((r0|r1) < 8) + T1_LDRB(r0, r1, r0); + else + T2_LDRB(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if ((r0|r1|rn(reg)) < 8) + T1_LDRB(r0, r1, rn(reg)); + else + T2_LDRB(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if (i0 >= 0 && i0 <= 4095) - LDRBI(r0, r1, i0); - else if (i0 < 0 && i0 >= -4095) - LDRBIN(r0, r1, -i0); - else if (r0 != r1) { - movi(r0, i0); - LDRB(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - LDRB(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (i0 >= 0 && i0 <= 4095) + LDRBI(r0, r1, i0); + else if (i0 < 0 && i0 >= -4095) + LDRBIN(r0, r1, -i0); + else if (r0 != r1) { + movi(r0, i0); + LDRB(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + LDRB(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -3111,21 +3102,21 @@ static void _ldr_s(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) - T2_LDRSHI(r0, r1, 0); + T2_LDRSHI(r0, r1, 0); else - LDRSHI(r0, r1, 0); + LDRSHI(r0, r1, 0); } static void _ldi_s(jit_state_t *_jit, int32_t r0, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); if (jit_thumb_p()) - T2_LDRSHI(r0, rn(reg), 0); + T2_LDRSHI(r0, rn(reg), 0); else - LDRSHI(r0, rn(reg), 0); + LDRSHI(r0, rn(reg), 0); jit_unget_reg(reg); } @@ -3133,58 +3124,58 @@ static void _ldxr_s(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if ((r0|r1|r2) < 8) - T1_LDRSH(r0, r1, r2); - else - T2_LDRSH(r0, r1, r2); + if ((r0|r1|r2) < 8) + T1_LDRSH(r0, r1, r2); + else + T2_LDRSH(r0, r1, r2); } else - LDRSH(r0, r1, r2); + LDRSH(r0, r1, r2); } static void _ldxi_s(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) - T2_LDRSHI(r0, r1, i0); - else if (i0 < 0 && i0 >= -255) - T2_LDRSHIN(r0, r1, -i0); - else if (i0 >= 0 && i0 <= 4095) - T2_LDRSHWI(r0, r1, i0); - else if (r0 != r1) { - movi(r0, i0); - if ((r0|r1) < 8) - T1_LDRSH(r0, r1, r0); - else - T2_LDRSH(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if ((r0|r1|rn(reg)) < 8) - T1_LDRSH(r0, r1, rn(reg)); - else - T2_LDRSH(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) + T2_LDRSHI(r0, r1, i0); + else if (i0 < 0 && i0 >= -255) + T2_LDRSHIN(r0, r1, -i0); + else if (i0 >= 0 && i0 <= 4095) + T2_LDRSHWI(r0, r1, i0); + else if (r0 != r1) { + movi(r0, i0); + if ((r0|r1) < 8) + T1_LDRSH(r0, r1, r0); + else + T2_LDRSH(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if ((r0|r1|rn(reg)) < 8) + T1_LDRSH(r0, r1, rn(reg)); + else + T2_LDRSH(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if (i0 >= 0 && i0 <= 255) - LDRSHI(r0, r1, i0); - else if (i0 < 0 && i0 >= -255) - LDRSHIN(r0, r1, -i0); - else if (r0 != r1) { - movi(r0, i0); - LDRSH(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - LDRSH(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (i0 >= 0 && i0 <= 255) + LDRSHI(r0, r1, i0); + else if (i0 < 0 && i0 >= -255) + LDRSHIN(r0, r1, -i0); + else if (r0 != r1) { + movi(r0, i0); + LDRSH(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + LDRSH(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -3192,21 +3183,21 @@ static void _ldr_us(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) - T2_LDRHI(r0, r1, 0); + T2_LDRHI(r0, r1, 0); else - LDRHI(r0, r1, 0); + LDRHI(r0, r1, 0); } static void _ldi_us(jit_state_t *_jit, int32_t r0, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); if (jit_thumb_p()) - T2_LDRHI(r0, rn(reg), 0); + T2_LDRHI(r0, rn(reg), 0); else - LDRHI(r0, rn(reg), 0); + LDRHI(r0, rn(reg), 0); jit_unget_reg(reg); } @@ -3214,60 +3205,60 @@ static void _ldxr_us(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if ((r0|r1|r2) < 8) - T1_LDRH(r0, r1, r2); - else - T2_LDRH(r0, r1, r2); + if ((r0|r1|r2) < 8) + T1_LDRH(r0, r1, r2); + else + T2_LDRH(r0, r1, r2); } else - LDRH(r0, r1, r2); + LDRH(r0, r1, r2); } static void _ldxi_us(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20) - T1_LDRHI(r0, r1, i0 >> 1); - else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) - T2_LDRHI(r0, r1, i0); - else if (i0 < 0 && i0 >= -255) - T2_LDRHIN(r0, r1, -i0); - else if (i0 >= 0 && i0 <= 4095) - T2_LDRHWI(r0, r1, i0); - else if (r0 != r1) { - movi(r0, i0); - if ((r0|r1) < 8) - T1_LDRH(r0, r1, r0); - else - T2_LDRH(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if ((r0|r1|rn(reg)) < 8) - T1_LDRH(r0, r1, rn(reg)); - else - T2_LDRH(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20) + T1_LDRHI(r0, r1, i0 >> 1); + else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) + T2_LDRHI(r0, r1, i0); + else if (i0 < 0 && i0 >= -255) + T2_LDRHIN(r0, r1, -i0); + else if (i0 >= 0 && i0 <= 4095) + T2_LDRHWI(r0, r1, i0); + else if (r0 != r1) { + movi(r0, i0); + if ((r0|r1) < 8) + T1_LDRH(r0, r1, r0); + else + T2_LDRH(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if ((r0|r1|rn(reg)) < 8) + T1_LDRH(r0, r1, rn(reg)); + else + T2_LDRH(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if (i0 >= 0 && i0 <= 255) - LDRHI(r0, r1, i0); - else if (i0 < 0 && i0 >= -255) - LDRHIN(r0, r1, -i0); - else if (r0 != r1) { - movi(r0, i0); - LDRH(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - LDRH(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (i0 >= 0 && i0 <= 255) + LDRHI(r0, r1, i0); + else if (i0 < 0 && i0 >= -255) + LDRHIN(r0, r1, -i0); + else if (r0 != r1) { + movi(r0, i0); + LDRH(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + LDRH(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -3275,21 +3266,21 @@ static void _ldr_i(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) - T2_LDRI(r0, r1, 0); + T2_LDRI(r0, r1, 0); else - LDRI(r0, r1, 0); + LDRI(r0, r1, 0); } static void _ldi_i(jit_state_t *_jit, int32_t r0, jit_word_t i0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); if (jit_thumb_p()) - T2_LDRI(r0, rn(reg), 0); + T2_LDRI(r0, rn(reg), 0); else - LDRI(r0, rn(reg), 0); + LDRI(r0, rn(reg), 0); jit_unget_reg(reg); } @@ -3297,63 +3288,63 @@ static void _ldxr_i(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if ((r0|r1|r2) < 8) - T1_LDR(r0, r1, r2); - else - T2_LDR(r0, r1, r2); + if ((r0|r1|r2) < 8) + T1_LDR(r0, r1, r2); + else + T2_LDR(r0, r1, r2); } else - LDR(r0, r1, r2); + LDR(r0, r1, r2); } static void _ldxi_i(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 3) && (i0 >> 2) < 0x20) - T1_LDRI(r0, r1, i0 >> 2); - else if (r1 == _R13_REGNO && r0 < 8 && - i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255) - T1_LDRISP(r0, i0 >> 2); - else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) - T2_LDRI(r0, r1, i0); - else if (i0 < 0 && i0 > -255) - T2_LDRIN(r0, r1, -i0); - else if (i0 >= 0 && i0 <= 4095) - T2_LDRWI(r0, r1, i0); - else if (r0 != r1) { - movi(r0, i0); - if ((r0|r1) < 8) - T1_LDR(r0, r1, r0); - else - T2_LDR(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if ((r0|r1|rn(reg)) < 8) - T1_LDR(r0, r1, rn(reg)); - else - T2_LDR(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 3) && (i0 >> 2) < 0x20) + T1_LDRI(r0, r1, i0 >> 2); + else if (r1 == _R13_REGNO && r0 < 8 && + i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255) + T1_LDRISP(r0, i0 >> 2); + else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) + T2_LDRI(r0, r1, i0); + else if (i0 < 0 && i0 > -255) + T2_LDRIN(r0, r1, -i0); + else if (i0 >= 0 && i0 <= 4095) + T2_LDRWI(r0, r1, i0); + else if (r0 != r1) { + movi(r0, i0); + if ((r0|r1) < 8) + T1_LDR(r0, r1, r0); + else + T2_LDR(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if ((r0|r1|rn(reg)) < 8) + T1_LDR(r0, r1, rn(reg)); + else + T2_LDR(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } else { - if (i0 >= 0 && i0 <= 4095) - LDRI(r0, r1, i0); - else if (i0 < 0 && i0 >= -4095) - LDRIN(r0, r1, -i0); - else if (r0 != r1) { - movi(r0, i0); - LDR(r0, r1, r0); - } - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - LDR(r0, r1, rn(reg)); - jit_unget_reg(reg); - } + if (i0 >= 0 && i0 <= 4095) + LDRI(r0, r1, i0); + else if (i0 < 0 && i0 >= -4095) + LDRIN(r0, r1, -i0); + else if (r0 != r1) { + movi(r0, i0); + LDR(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + LDR(r0, r1, rn(reg)); + jit_unget_reg(reg); + } } } @@ -3361,21 +3352,21 @@ static void _str_c(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) - T2_STRBI(r1, r0, 0); + T2_STRBI(r1, r0, 0); else - STRBI(r1, r0, 0); + STRBI(r1, r0, 0); } static void _sti_c(jit_state_t *_jit, jit_word_t i0, int32_t r0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); if (jit_thumb_p()) - T2_STRBI(r0, rn(reg), 0); + T2_STRBI(r0, rn(reg), 0); else - STRBI(r0, rn(reg), 0); + STRBI(r0, rn(reg), 0); jit_unget_reg(reg); } @@ -3383,49 +3374,49 @@ static void _stxr_c(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if ((r0|r1|r2) < 8) - T1_STRB(r2, r1, r0); - else - T2_STRB(r2, r1, r0); + if ((r0|r1|r2) < 8) + T1_STRB(r2, r1, r0); + else + T2_STRB(r2, r1, r0); } else - STRB(r2, r1, r0); + STRB(r2, r1, r0); } static void _stxi_c(jit_state_t *_jit, jit_word_t i0, int32_t r0, int32_t r1) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20) - T1_STRBI(r1, r0, i0); - else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) - T2_STRBI(r1, r0, i0); - else if (i0 < 0 && i0 >= -255) - T2_STRBIN(r1, r0, -i0); - else if (i0 >= 0 && i0 <= 4095) - T2_STRBWI(r1, r0, i0); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if ((r0|r1|rn(reg)) < 8) - T1_STRB(r1, r0, rn(reg)); - else - T2_STRB(r1, r0, rn(reg)); - jit_unget_reg(reg); - } + if ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20) + T1_STRBI(r1, r0, i0); + else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) + T2_STRBI(r1, r0, i0); + else if (i0 < 0 && i0 >= -255) + T2_STRBIN(r1, r0, -i0); + else if (i0 >= 0 && i0 <= 4095) + T2_STRBWI(r1, r0, i0); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if ((r0|r1|rn(reg)) < 8) + T1_STRB(r1, r0, rn(reg)); + else + T2_STRB(r1, r0, rn(reg)); + jit_unget_reg(reg); + } } else { - if (i0 >= 0 && i0 <= 4095) - STRBI(r1, r0, i0); - else if (i0 < 0 && i0 >= -4095) - STRBIN(r1, r0, -i0); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - STRB(r1, r0, rn(reg)); - jit_unget_reg(reg); - } + if (i0 >= 0 && i0 <= 4095) + STRBI(r1, r0, i0); + else if (i0 < 0 && i0 >= -4095) + STRBIN(r1, r0, -i0); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + STRB(r1, r0, rn(reg)); + jit_unget_reg(reg); + } } } @@ -3433,21 +3424,21 @@ static void _str_s(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) - T2_STRHI(r1, r0, 0); + T2_STRHI(r1, r0, 0); else - STRHI(r1, r0, 0); + STRHI(r1, r0, 0); } static void _sti_s(jit_state_t *_jit, jit_word_t i0, int32_t r0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); if (jit_thumb_p()) - T2_STRHI(r0, rn(reg), 0); + T2_STRHI(r0, rn(reg), 0); else - STRHI(r0, rn(reg), 0); + STRHI(r0, rn(reg), 0); jit_unget_reg(reg); } @@ -3455,49 +3446,49 @@ static void _stxr_s(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if ((r0|r1|r2) < 8) - T1_STRH(r2, r1, r0); - else - T2_STRH(r2, r1, r0); + if ((r0|r1|r2) < 8) + T1_STRH(r2, r1, r0); + else + T2_STRH(r2, r1, r0); } else - STRH(r2, r1, r0); + STRH(r2, r1, r0); } static void _stxi_s(jit_state_t *_jit, jit_word_t i0, int32_t r0, int32_t r1) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20) - T1_STRHI(r1, r0, i0 >> 1); - else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) - T2_STRHI(r1, r0, i0); - else if (i0 < 0 && i0 >= -255) - T2_STRHIN(r1, r0, -i0); - else if (i0 >= 0 && i0 <= 4095) - T2_STRHWI(r1, r0, i0); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if ((r0|r1|rn(reg)) < 8) - T1_STRH(r1, r0, rn(reg)); - else - T2_STRH(r1, r0, rn(reg)); - jit_unget_reg(reg); - } + if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20) + T1_STRHI(r1, r0, i0 >> 1); + else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) + T2_STRHI(r1, r0, i0); + else if (i0 < 0 && i0 >= -255) + T2_STRHIN(r1, r0, -i0); + else if (i0 >= 0 && i0 <= 4095) + T2_STRHWI(r1, r0, i0); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if ((r0|r1|rn(reg)) < 8) + T1_STRH(r1, r0, rn(reg)); + else + T2_STRH(r1, r0, rn(reg)); + jit_unget_reg(reg); + } } else { - if (i0 >= 0 && i0 <= 255) - STRHI(r1, r0, i0); - else if (i0 < 0 && i0 >= -255) - STRHIN(r1, r0, -i0); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - STRH(r1, r0, rn(reg)); - jit_unget_reg(reg); - } + if (i0 >= 0 && i0 <= 255) + STRHI(r1, r0, i0); + else if (i0 < 0 && i0 >= -255) + STRHIN(r1, r0, -i0); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + STRH(r1, r0, rn(reg)); + jit_unget_reg(reg); + } } } @@ -3505,21 +3496,21 @@ static void _str_i(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) - T2_STRI(r1, r0, 0); + T2_STRI(r1, r0, 0); else - STRI(r1, r0, 0); + STRI(r1, r0, 0); } static void _sti_i(jit_state_t *_jit, jit_word_t i0, int32_t r0) { - int32_t reg; + int32_t reg; reg = jit_get_reg(jit_class_gpr); movi(rn(reg), i0); if (jit_thumb_p()) - T2_STRI(r0, rn(reg), 0); + T2_STRI(r0, rn(reg), 0); else - STRI(r0, rn(reg), 0); + STRI(r0, rn(reg), 0); jit_unget_reg(reg); } @@ -3527,52 +3518,52 @@ static void _stxr_i(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2) { if (jit_thumb_p()) { - if ((r0|r1|r2) < 8) - T1_STR(r2, r1, r0); - else - T2_STR(r2, r1, r0); + if ((r0|r1|r2) < 8) + T1_STR(r2, r1, r0); + else + T2_STR(r2, r1, r0); } else - STR(r2, r1, r0); + STR(r2, r1, r0); } static void _stxi_i(jit_state_t *_jit, jit_word_t i0, int32_t r0, int32_t r1) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 3) && (i0 >> 2) < 0x20) - T1_STRI(r1, r0, i0 >> 2); - else if (r0 == _R13_REGNO && r1 < 8 && - i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255) - T1_STRISP(r1, i0 >> 2); - else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) - T2_STRI(r1, r0, i0); - else if (i0 < 0 && i0 >= -255) - T2_STRIN(r1, r0, -i0); - else if (i0 >= 0 && i0 <= 4095) - T2_STRWI(r1, r0, i0); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if ((r0|r1|rn(reg)) < 8) - T1_STR(r1, r0, rn(reg)); - else - T2_STR(r1, r0, rn(reg)); - jit_unget_reg(reg); - } + if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 3) && (i0 >> 2) < 0x20) + T1_STRI(r1, r0, i0 >> 2); + else if (r0 == _R13_REGNO && r1 < 8 && + i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255) + T1_STRISP(r1, i0 >> 2); + else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255) + T2_STRI(r1, r0, i0); + else if (i0 < 0 && i0 >= -255) + T2_STRIN(r1, r0, -i0); + else if (i0 >= 0 && i0 <= 4095) + T2_STRWI(r1, r0, i0); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if ((r0|r1|rn(reg)) < 8) + T1_STR(r1, r0, rn(reg)); + else + T2_STR(r1, r0, rn(reg)); + jit_unget_reg(reg); + } } else { - if (i0 >= 0 && i0 <= 4095) - STRI(r1, r0, i0); - else if (i0 < 0 && i0 >= -4095) - STRIN(r1, r0, -i0); - else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - STR(r1, r0, rn(reg)); - jit_unget_reg(reg); - } + if (i0 >= 0 && i0 <= 4095) + STRI(r1, r0, i0); + else if (i0 < 0 && i0 >= -4095) + STRIN(r1, r0, -i0); + else { + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + STR(r1, r0, rn(reg)); + jit_unget_reg(reg); + } } } @@ -3580,28 +3571,28 @@ _stxi_i(jit_state_t *_jit, jit_word_t i0, int32_t r0, int32_t r1) static void _bswapr_us(jit_state_t *_jit, int32_t r0, int32_t r1) { - int32_t t0; + int32_t t0; if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_REV(r0, r1); - else - T2_REV(r0, r1); - rshi_u(r0, r0, 16); + if ((r0|r1) < 8) + T1_REV(r0, r1); + else + T2_REV(r0, r1); + rshi_u(r0, r0, 16); } else { - if (jit_armv6_p()) { - REV(r0, r1); - rshi_u(r0, r0, 16); - } - else { - t0 = jit_get_reg(jit_class_gpr); - rshi(rn(t0), r1, 8); - andi(r0, r1, 0xff); - andi(rn(t0), rn(t0), 0xff); - lshi(r0, r0, 8); - orr(r0, r0, rn(t0)); - jit_unget_reg(t0); - } + if (jit_armv6_p()) { + REV(r0, r1); + rshi_u(r0, r0, 16); + } + else { + t0 = jit_get_reg(jit_class_gpr); + rshi(rn(t0), r1, 8); + andi(r0, r1, 0xff); + andi(rn(t0), rn(t0), 0xff); + lshi(r0, r0, 8); + orr(r0, r0, rn(t0)); + jit_unget_reg(t0); + } } } @@ -3609,24 +3600,24 @@ _bswapr_us(jit_state_t *_jit, int32_t r0, int32_t r1) static void _bswapr_ui(jit_state_t *_jit, int32_t r0, int32_t r1) { - int32_t reg; + int32_t reg; if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_REV(r0, r1); - else - T2_REV(r0, r1); + if ((r0|r1) < 8) + T1_REV(r0, r1); + else + T2_REV(r0, r1); } else { - if (jit_armv6_p()) - REV(r0, r1); - else { - reg = jit_get_reg(jit_class_gpr); - EOR_SI(rn(reg), r1, r1, ARM_ROR, 16); - LSRI(rn(reg), rn(reg), 8); - BICI(rn(reg), rn(reg), encode_arm_immediate(0xff00)); - EOR_SI(r0, rn(reg), r1, ARM_ROR, 8); - jit_unget_reg(reg); - } + if (jit_armv6_p()) + REV(r0, r1); + else { + reg = jit_get_reg(jit_class_gpr); + EOR_SI(rn(reg), r1, r1, ARM_ROR, 16); + LSRI(rn(reg), rn(reg), 8); + BICI(rn(reg), rn(reg), encode_arm_immediate(0xff00)); + EOR_SI(r0, rn(reg), r1, ARM_ROR, 8); + jit_unget_reg(reg); + } } } #endif @@ -3635,18 +3626,18 @@ static void _extr_c(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_SXTB(r0, r1); - else - T2_SXTB(r0, r1); + if ((r0|r1) < 8) + T1_SXTB(r0, r1); + else + T2_SXTB(r0, r1); } else { - if (jit_armv6_p()) - SXTB(r0, r1); - else { - LSLI(r0, r1, 24); - ASRI(r0, r0, 24); - } + if (jit_armv6_p()) + SXTB(r0, r1); + else { + LSLI(r0, r1, 24); + ASRI(r0, r0, 24); + } } } @@ -3654,16 +3645,16 @@ static void _extr_uc(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_UXTB(r0, r1); - else - T2_UXTB(r0, r1); + if ((r0|r1) < 8) + T1_UXTB(r0, r1); + else + T2_UXTB(r0, r1); } else { - if (jit_armv6_p()) - UXTB(r0, r1); - else - ANDI(r0, r1, 0xff); + if (jit_armv6_p()) + UXTB(r0, r1); + else + ANDI(r0, r1, 0xff); } } @@ -3671,18 +3662,18 @@ static void _extr_s(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_SXTH(r0, r1); - else - T2_SXTH(r0, r1); + if ((r0|r1) < 8) + T1_SXTH(r0, r1); + else + T2_SXTH(r0, r1); } else { - if (jit_armv6_p()) - SXTH(r0, r1); - else { - LSLI(r0, r1, 16); - ASRI(r0, r0, 16); - } + if (jit_armv6_p()) + SXTH(r0, r1); + else { + LSLI(r0, r1, 16); + ASRI(r0, r0, 16); + } } } @@ -3690,18 +3681,18 @@ static void _extr_us(jit_state_t *_jit, int32_t r0, int32_t r1) { if (jit_thumb_p()) { - if ((r0|r1) < 8) - T1_UXTH(r0, r1); - else - T2_UXTH(r0, r1); + if ((r0|r1) < 8) + T1_UXTH(r0, r1); + else + T2_UXTH(r0, r1); } else { - if (jit_armv6_p()) - UXTH(r0, r1); - else { - LSLI(r0, r1, 16); - LSRI(r0, r0, 16); - } + if (jit_armv6_p()) + UXTH(r0, r1); + else { + LSLI(r0, r1, 16); + LSRI(r0, r0, 16); + } } } @@ -3709,42 +3700,42 @@ static void _callr(jit_state_t *_jit, int32_t r0) { if (jit_thumb_p()) - T1_BLX(r0); + T1_BLX(r0); else - BLX(r0); + BLX(r0); } static void _calli(jit_state_t *_jit, jit_word_t i0) { - jit_word_t d; - int32_t reg; + jit_word_t d; + int32_t reg; d = ((i0 - _jit->pc.w) >> 2) - 2; if (!jit_exchange_p() && !jit_thumb_p() && _s24P(d)) - BLI(d & 0x00ffffff); + BLI(d & 0x00ffffff); else { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), i0); - if (jit_thumb_p()) - T1_BLX(rn(reg)); - else - BLX(rn(reg)); - jit_unget_reg(reg); + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + if (jit_thumb_p()) + T1_BLX(rn(reg)); + else + BLX(rn(reg)); + jit_unget_reg(reg); } } static jit_word_t _calli_p(jit_state_t *_jit, jit_word_t i0) { - jit_word_t w; - int32_t reg; + jit_word_t w; + int32_t reg; reg = jit_get_reg(jit_class_gpr); w = _jit->pc.w; movi_p(rn(reg), i0); if (jit_thumb_p()) - T1_BLX(rn(reg)); + T1_BLX(rn(reg)); else - BLX(rn(reg)); + BLX(rn(reg)); jit_unget_reg(reg); return (w); } @@ -3752,61 +3743,61 @@ _calli_p(jit_state_t *_jit, jit_word_t i0) static void _prolog(jit_state_t *_jit, jit_node_t *node) { - int32_t reg; + int32_t reg; if (_jitc->function->define_frame || _jitc->function->assume_frame) { - int32_t frame = -_jitc->function->frame; - assert(_jitc->function->self.aoff >= frame); - if (_jitc->function->assume_frame) { - if (jit_thumb_p() && !_jitc->thumb) - _jitc->thumb = _jit->pc.w; - return; - } - _jitc->function->self.aoff = frame; + int32_t frame = -_jitc->function->frame; + assert(_jitc->function->self.aoff >= frame); + if (_jitc->function->assume_frame) { + if (jit_thumb_p() && !_jitc->thumb) + _jitc->thumb = _jit->pc.w; + return; + } + _jitc->function->self.aoff = frame; } if (_jitc->function->allocar) - _jitc->function->self.aoff &= -8; + _jitc->function->self.aoff &= -8; _jitc->function->stack = ((_jitc->function->self.alen - - /* align stack at 8 bytes */ - _jitc->function->self.aoff) + 7) & -8; + /* align stack at 8 bytes */ + _jitc->function->self.aoff) + 7) & -8; if (jit_thumb_p()) { - /* switch to thumb mode (better approach would be to - * ORR 1 address being called, but no clear distinction - * of what is a pointer to a jit function, or if patching - * a pointer to a jit function) */ - ADDI(_R12_REGNO, _R15_REGNO, 1); - BX(_R12_REGNO); - if (!_jitc->thumb) - _jitc->thumb = _jit->pc.w; - if (jit_cpu.abi) { - T2_PUSH(0xf); - T2_PUSH(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); - VPUSH_F64(_D8_REGNO, 8); - } - else { - T2_PUSH(0xf); - T2_PUSH(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); - } + /* switch to thumb mode (better approach would be to + * ORR 1 address being called, but no clear distinction + * of what is a pointer to a jit function, or if patching + * a pointer to a jit function) */ + ADDI(_R12_REGNO, _R15_REGNO, 1); + BX(_R12_REGNO); + if (!_jitc->thumb) + _jitc->thumb = _jit->pc.w; + if (jit_cpu.abi) { + T2_PUSH(0xf); + T2_PUSH(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); + VPUSH_F64(_D8_REGNO, 8); + } + else { + T2_PUSH(0xf); + T2_PUSH(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); + } } else { - if (jit_cpu.abi) { - PUSH(0xf); - PUSH(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); - VPUSH_F64(_D8_REGNO, 8); - } - else { - PUSH(0xf); - PUSH(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); - } + if (jit_cpu.abi) { + PUSH(0xf); + PUSH(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); + VPUSH_F64(_D8_REGNO, 8); + } + else { + PUSH(0xf); + PUSH(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); + } } movr(_FP_REGNO, _SP_REGNO); if (_jitc->function->stack) - subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack); + subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack); if (_jitc->function->allocar) { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), _jitc->function->self.aoff); - stxi_i(_jitc->function->aoffoff, _FP_REGNO, rn(reg)); - jit_unget_reg(reg); + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), _jitc->function->self.aoff); + stxi_i(_jitc->function->aoffoff, _FP_REGNO, rn(reg)); + jit_unget_reg(reg); } } @@ -3814,22 +3805,22 @@ static void _epilog(jit_state_t *_jit, jit_node_t *node) { if (_jitc->function->assume_frame) - return; + return; movr(_SP_REGNO, _FP_REGNO); if (jit_cpu.abi) - VPOP_F64(_D8_REGNO, 8); + VPOP_F64(_D8_REGNO, 8); if (jit_thumb_p()) - T2_POP(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); + T2_POP(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); else - POP(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); + POP(0x3f0|(1<<_FP_REGNO)|(1<<_LR_REGNO)); addi(_SP_REGNO, _SP_REGNO, 16); if (jit_thumb_p()) - T1_BX(_LR_REGNO); + T1_BX(_LR_REGNO); else - BX(_LR_REGNO); + BX(_LR_REGNO); if (jit_thumb_p() && (_jit->pc.w & 2)) - T1_NOP(); + T1_NOP(); } static void @@ -3842,7 +3833,7 @@ _vastart(jit_state_t *_jit, int32_t r0) * always saved, and _jitc->function->vagp is to account * for declared arguments. */ addi(r0, _FP_REGNO, _jitc->function->self.size - - 16 + _jitc->function->vagp); + 16 + _jitc->function->vagp); } static void @@ -3859,97 +3850,97 @@ _vaarg(jit_state_t *_jit, int32_t r0, int32_t r1) static void _patch_at(jit_state_t *_jit, - int32_t kind, jit_word_t instr, jit_word_t label) + int32_t kind, jit_word_t instr, jit_word_t label) { - jit_word_t d; - jit_thumb_t thumb; + jit_word_t d; + jit_thumb_t thumb; union { - int16_t *s; - int32_t *i; - jit_word_t w; + int16_t *s; + int32_t *i; + jit_word_t w; } u; u.w = instr; if (kind == arm_patch_jump) { - if (jit_thumb_p() && (jit_uword_t)instr >= _jitc->thumb) { - code2thumb(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); - if ((thumb.i & THUMB2_B) == THUMB2_B) { - d = ((label - instr) >> 1) - 2; - assert(_s24P(d)); - thumb.i = THUMB2_B | encode_thumb_jump(d); - thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); - } - else if ((thumb.i & THUMB2_B) == THUMB2_CC_B) { - d = ((label - instr) >> 1) - 2; - assert(_s20P(d)); - thumb.i = THUMB2_CC_B | (thumb.i & 0x3c00000) | - encode_thumb_cc_jump(d); - thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); - } - else { - /* for the sake of simplicity in case choose to - * movw+movt+[bx|blx], e.g. if changing to instead - * of asserting target is reachable, load constant - * and do indirect jump if not reachable */ - if ((thumb.i & 0xfbf00000) == THUMB2_MOVWI) - goto indirect_jump; - assert(!"handled branch opcode"); - } - } - else { - thumb.i = u.i[0]; - /* 0x0e000000 because 0x01000000 is (branch&) link modifier */ - assert((thumb.i & 0x0e000000) == ARM_B); - d = ((label - instr) >> 2) - 2; - assert(_s24P(d)); - u.i[0] = (thumb.i & 0xff000000) | (d & 0x00ffffff); - } + if (jit_thumb_p() && (jit_uword_t)instr >= _jitc->thumb) { + code2thumb(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); + if ((thumb.i & THUMB2_B) == THUMB2_B) { + d = ((label - instr) >> 1) - 2; + assert(_s24P(d)); + thumb.i = THUMB2_B | encode_thumb_jump(d); + thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); + } + else if ((thumb.i & THUMB2_B) == THUMB2_CC_B) { + d = ((label - instr) >> 1) - 2; + assert(_s20P(d)); + thumb.i = THUMB2_CC_B | (thumb.i & 0x3c00000) | + encode_thumb_cc_jump(d); + thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); + } + else { + /* for the sake of simplicity in case choose to + * movw+movt+[bx|blx], e.g. if changing to instead + * of asserting target is reachable, load constant + * and do indirect jump if not reachable */ + if ((thumb.i & 0xfbf00000) == THUMB2_MOVWI) + goto indirect_jump; + assert(!"handled branch opcode"); + } + } + else { + thumb.i = u.i[0]; + /* 0x0e000000 because 0x01000000 is (branch&) link modifier */ + assert((thumb.i & 0x0e000000) == ARM_B); + d = ((label - instr) >> 2) - 2; + assert(_s24P(d)); + u.i[0] = (thumb.i & 0xff000000) | (d & 0x00ffffff); + } } else if (kind == arm_patch_load) { - /* offset may be negative for a forward patch because it - * is relative to pc + 8, for example: - * ldr r0, [pc, #-4] - * bx r0 ;; [pc, #-8] - * .data ... ;; [pc, #-4] - * ... ;; [pc] - */ - assert(!jit_thumb_p()); - thumb.i = u.i[0]; - assert((thumb.i & 0x0f700000) == ARM_LDRI); - d = label - (instr + 8); - if (d < 0) { - thumb.i &= ~ARM_P; - d = -d; - } - else - thumb.i |= ARM_P; - assert(!(d & 0xfffff000)); - u.i[0] = (thumb.i & 0xfffff000) | d; + /* offset may be negative for a forward patch because it + * is relative to pc + 8, for example: + * ldr r0, [pc, #-4] + * bx r0 ;; [pc, #-8] + * .data ... ;; [pc, #-4] + * ... ;; [pc] + */ + assert(!jit_thumb_p()); + thumb.i = u.i[0]; + assert((thumb.i & 0x0f700000) == ARM_LDRI); + d = label - (instr + 8); + if (d < 0) { + thumb.i &= ~ARM_P; + d = -d; + } + else + thumb.i |= ARM_P; + assert(!(d & 0xfffff000)); + u.i[0] = (thumb.i & 0xfffff000) | d; } else if (kind == arm_patch_word) { - if (jit_thumb_p()) { - code2thumb(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); - assert((thumb.i & 0xfbf00000) == THUMB2_MOVWI); - indirect_jump: - thumb.i = ((thumb.i & 0xfbf00f00) | - ( (label & 0x0000f000) << 4) | - ( (label & 0x00000800) << 15) | - ( (label & 0x00000700) << 4) | - ( label & 0x000000ff)); - thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); - label >>= 16; - code2thumb(thumb.s[0], thumb.s[1], u.s[2], u.s[3]); - assert((thumb.i & 0xfbf00000) == THUMB2_MOVTI); - thumb.i = ((thumb.i & 0xfbf00f00) | - ( (label & 0x0000f000) << 4) | - ( (label & 0x00000800) << 15) | - ( (label & 0x00000700) << 4) | - ( label & 0x000000ff)); - thumb2code(thumb.s[0], thumb.s[1], u.s[2], u.s[3]); - } - else - u.i[0] = label; + if (jit_thumb_p()) { + code2thumb(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); + assert((thumb.i & 0xfbf00000) == THUMB2_MOVWI); + indirect_jump: + thumb.i = ((thumb.i & 0xfbf00f00) | + ( (label & 0x0000f000) << 4) | + ( (label & 0x00000800) << 15) | + ( (label & 0x00000700) << 4) | + ( label & 0x000000ff)); + thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]); + label >>= 16; + code2thumb(thumb.s[0], thumb.s[1], u.s[2], u.s[3]); + assert((thumb.i & 0xfbf00000) == THUMB2_MOVTI); + thumb.i = ((thumb.i & 0xfbf00f00) | + ( (label & 0x0000f000) << 4) | + ( (label & 0x00000800) << 15) | + ( (label & 0x00000700) << 4) | + ( label & 0x000000ff)); + thumb2code(thumb.s[0], thumb.s[1], u.s[2], u.s[3]); + } + else + u.i[0] = label; } else - assert(!"handled patch"); + assert(!"handled patch"); } #endif diff --git a/lightening/arm.c b/lightening/arm.c index 12a728664..be0e629e8 100644 --- a/lightening/arm.c +++ b/lightening/arm.c @@ -14,2269 +14,119 @@ * License for more details. * * Authors: - * Paulo Cesar Pereira de Andrade + * Paulo Cesar Pereira de Andrade */ -#if defined(__linux__) -# include -#endif - -# define JIT_RA0 _R0 -# define JIT_FA0 _D0 -# define JIT_SP _R13 -# define JIT_RET _R0 -# if defined(__ARM_PCS_VFP) -# define JIT_FRET _D0 -# else -# define JIT_FRET _R0 -# endif - -#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 4) -#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 16) -#define jit_arg_d_reg_p(i) ((i) >= 0 && (i) < 15) - -#define arm_patch_node 0x80000000 -#define arm_patch_word 0x40000000 -#define arm_patch_jump 0x20000000 -#define arm_patch_load 0x00000000 - -#define jit_fpr_p(rn) ((rn) > 15) - -#define arg_base() \ - (stack_framesize - 16 + (jit_cpu.abi ? 64 : 0)) -#define arg_offset(n) \ - ((n) < 4 ? arg_base() + ((n) << 2) : (n)) - -/* Assume functions called never match jit instruction set, that is - * libc, gmp, mpfr, etc functions are in thumb mode and jit is in - * arm mode, what may cause a crash upon return of that function - * if generating jit for a relative jump. - */ -#define jit_exchange_p() 1 - -/* FIXME is it really required to not touch _R10? */ - /* * Types */ typedef union _jit_thumb_t { - int32_t i; - int16_t s[2]; + int32_t i; + int16_t s[2]; } jit_thumb_t; -typedef jit_pointer_t jit_va_list; - -/* - * Prototypes - */ -#define jit_make_arg(node) _jit_make_arg(_jit,node) -static jit_node_t *_jit_make_arg(jit_state_t*,jit_node_t*); -#define jit_make_arg_f(node) _jit_make_arg_f(_jit,node) -static jit_node_t *_jit_make_arg_f(jit_state_t*,jit_node_t*); -#define jit_make_arg_d(node) _jit_make_arg_d(_jit,node) -static jit_node_t *_jit_make_arg_d(jit_state_t*,jit_node_t*); -#define jit_get_reg_pair() _jit_get_reg_pair(_jit) -static int32_t _jit_get_reg_pair(jit_state_t*); -#define jit_unget_reg_pair(rn) _jit_unget_reg_pair(_jit,rn) -static void _jit_unget_reg_pair(jit_state_t*,int32_t); -# define must_align_p(node) _must_align_p(_jit, node) -static jit_bool_t _must_align_p(jit_state_t*,jit_node_t*); -#define load_const(uniq,r0,i0) _load_const(_jit,uniq,r0,i0) -static void _load_const(jit_state_t*,jit_bool_t,int32_t,jit_word_t); -#define flush_consts() _flush_consts(_jit) -static void _flush_consts(jit_state_t*); -#define invalidate_consts() _invalidate_consts(_jit) -static void _invalidate_consts(jit_state_t*); -#define patch(instr, node) _patch(_jit, instr, node) -static void _patch(jit_state_t*,jit_word_t,jit_node_t*); - -#if defined(__GNUC__) /* libgcc */ extern void __clear_cache(void *, void *); -#endif -#define PROTO 1 -# include "rewind.c" -# include "arm-cpu.c" -# include "arm-vfp.c" -#undef PROTO +#include "arm-cpu.c" +#include "arm-vfp.c" -/* - * Initialization - */ -jit_cpu_t jit_cpu; -static const jit_register_t _rvs[] = { - { rc(gpr) | 0x0c, "ip" }, - { rc(sav) | rc(gpr) | 0x04, "r4" }, - { rc(sav) | rc(gpr) | 0x05, "r5" }, - { rc(sav) | rc(gpr) | 0x06, "r6" }, - { rc(sav) | rc(gpr) | 0x07, "r7" }, - { rc(sav) | rc(gpr) | 0x08, "r8" }, - { rc(sav) | rc(gpr) | 0x09, "r9" }, - { rc(sav) | 0x0a, "sl" }, - { rc(sav) | 0x0b, "fp" }, - { rc(sav) | 0x0d, "sp" }, - { rc(sav) | 0x0e, "lr" }, - { 0x0f, "pc" }, - { rc(arg) | rc(gpr) | 0x03, "r3" }, - { rc(arg) | rc(gpr) | 0x02, "r2" }, - { rc(arg) | rc(gpr) | 0x01, "r1" }, - { rc(arg) | rc(gpr) | 0x00, "r0" }, - { rc(fpr) | 0x20, "d8" }, - { 0x21, "s17" }, - { rc(fpr) | 0x22, "d9" }, - { 0x23, "s19" }, - { rc(fpr) | 0x24, "d10" }, - { 0x25, "s21" }, - { rc(fpr) | 0x26, "d11" }, - { 0x27, "s23" }, - { rc(fpr) | 0x28, "d12" }, - { 0x29, "s25" }, - { rc(fpr) | 0x2a, "d13" }, - { 0x2b, "s27" }, - { rc(fpr) | 0x2c, "d14" }, - { 0x2d, "s29" }, - { rc(fpr) | 0x2e, "d15" }, - { 0x2f, "s31" }, - { rc(arg) | 0x1f, "s15" }, - { rc(arg)|rc(sft)|rc(fpr)|0x1e, "d7" }, - { rc(arg) | 0x1d, "s13" }, - { rc(arg)|rc(sft)|rc(fpr)|0x1c, "d6" }, - { rc(arg) | 0x1b, "s11" }, - { rc(arg)|rc(sft)|rc(fpr)|0x1a, "d5" }, - { rc(arg) | 0x19, "s9" }, - { rc(arg)|rc(sft)|rc(fpr)|0x18, "d4" }, - { rc(arg) | 0x17, "s7" }, - { rc(arg)|rc(sft)|rc(fpr)|0x16, "d3" }, - { rc(arg) | 0x15, "s5" }, - { rc(arg)|rc(sft)|rc(fpr)|0x14, "d2" }, - { rc(arg) | 0x13, "s3" }, - { rc(arg)|rc(sft)|rc(fpr)|0x12, "d1" }, - { rc(arg) | 0x11, "s1" }, - { rc(arg)|rc(sft)|rc(fpr)|0x10, "d0" }, - { _NOREG, "" }, +static const jit_gpr_t abi_gpr_args[] = { + _R0, _R1, _R2, _R3 +}; +static const int abi_gpr_arg_count = sizeof(abi_gpr_args) / sizeof(abi_gpr_args[0]); + +struct abi_arg_iterator +{ + const jit_operand_t *args; + size_t argc; + + size_t arg_idx; + size_t gpr_idx; + uint32_t vfp_used_registers; + size_t stack_size; + size_t stack_padding; }; -/* - * Implementation - */ -void +static size_t page_size; + +jit_bool_t jit_get_cpu(void) { -#if defined(__linux__) - FILE *fp; - char *ptr; - char buf[128]; - - if ((fp = fopen("/proc/cpuinfo", "r")) != NULL) { - while (fgets(buf, sizeof(buf), fp)) { - if (strncmp(buf, "CPU architecture:", 17) == 0) { - jit_cpu.version = strtol(buf + 17, &ptr, 10); - while (*ptr) { - if (*ptr == 'T' || *ptr == 't') { - ++ptr; - jit_cpu.thumb = 1; - } - else if (*ptr == 'E' || *ptr == 'e') { - jit_cpu.extend = 1; - ++ptr; - } - else - ++ptr; - } - } - else if (strncmp(buf, "Features\t:", 10) == 0) { - if ((ptr = strstr(buf + 10, "vfpv"))) - jit_cpu.vfp = strtol(ptr + 4, NULL, 0); - if ((ptr = strstr(buf + 10, "neon"))) - jit_cpu.neon = 1; - if ((ptr = strstr(buf + 10, "thumb"))) - jit_cpu.thumb = 1; - } - } - fclose(fp); - } -#endif -#if defined(__ARM_PCS_VFP) - if (!jit_cpu.vfp) - jit_cpu.vfp = 3; - if (!jit_cpu.version) - jit_cpu.version = 7; - jit_cpu.abi = 1; -#endif -#if defined(__thumb2__) - jit_cpu.thumb = 1; -#endif - /* armv6t2 todo (software float and thumb2) */ - if (!jit_cpu.vfp && jit_cpu.thumb) - jit_cpu.thumb = 0; -} - -void -_jit_init(jit_state_t *_jit) -{ - int32_t regno; - static jit_bool_t first = 1; - - _jitc->reglen = jit_size(_rvs) - 1; - if (first) { - /* jit_get_cpu() should have been already called, and only once */ - if (!jit_cpu.vfp) { - /* cause register to never be allocated, because simple - * software float only allocates stack space for 8 slots */ - for (regno = _D8; regno < _D7; regno++) - _rvs[regno].spec = 0; - } - if (!jit_cpu.abi) { - for (regno = _S15; regno <= _D0; regno++) - _rvs[regno].spec &= ~rc(arg); - } - first = 0; - } -} - -void -_jit_prolog(jit_state_t *_jit) -{ - int32_t offset; - - if (_jitc->function) - jit_epilog(); - assert(jit_regset_cmp_ui(&_jitc->regarg, 0) == 0); - jit_regset_set_ui(&_jitc->regsav, 0); - offset = _jitc->functions.offset; - if (offset >= _jitc->functions.length) { - jit_realloc((jit_pointer_t *)&_jitc->functions.ptr, - _jitc->functions.length * sizeof(jit_function_t), - (_jitc->functions.length + 16) * sizeof(jit_function_t)); - _jitc->functions.length += 16; - } - _jitc->function = _jitc->functions.ptr + _jitc->functions.offset++; - _jitc->function->self.size = stack_framesize; - if (jit_cpu.abi) - _jitc->function->self.size += 64; - _jitc->function->self.argi = _jitc->function->self.argf = - _jitc->function->self.alen = 0; - if (jit_swf_p()) - /* 8 soft float registers */ - _jitc->function->self.aoff = -64; - else - _jitc->function->self.aoff = 0; - _jitc->function->self.call = jit_call_default; - jit_alloc((jit_pointer_t *)&_jitc->function->regoff, - _jitc->reglen * sizeof(int32_t)); - - /* _no_link here does not mean the jit_link() call can be removed - * by rewriting as: - * _jitc->function->prolog = jit_new_node(jit_code_prolog); - */ - _jitc->function->prolog = jit_new_node_no_link(jit_code_prolog); - jit_link(_jitc->function->prolog); - _jitc->function->prolog->w.w = offset; - _jitc->function->epilog = jit_new_node_no_link(jit_code_epilog); - /* u: label value - * v: offset in blocks vector - * w: offset in functions vector - */ - _jitc->function->epilog->w.w = offset; - - jit_regset_new(&_jitc->function->regset); -} - -int32_t -_jit_allocai(jit_state_t *_jit, int32_t length) -{ - assert(_jitc->function); - switch (length) { - case 0: case 1: break; - case 2: _jitc->function->self.aoff &= -2; break; - case 3: case 4: _jitc->function->self.aoff &= -4; break; - default: _jitc->function->self.aoff &= -8; break; - } - _jitc->function->self.aoff -= length; - if (!_jitc->realize) { - jit_inc_synth_ww(allocai, _jitc->function->self.aoff, length); - jit_dec_synth(); - } - return (_jitc->function->self.aoff); -} - -void -_jit_allocar(jit_state_t *_jit, int32_t u, int32_t v) -{ - int32_t reg; - assert(_jitc->function); - jit_inc_synth_ww(allocar, u, v); - if (!_jitc->function->allocar) { - _jitc->function->aoffoff = jit_allocai(sizeof(int32_t)); - _jitc->function->allocar = 1; - } - reg = jit_get_reg(jit_class_gpr); - jit_negr(reg, v); - jit_andi(reg, reg, -8); - jit_ldxi_i(u, JIT_FP, _jitc->function->aoffoff); - jit_addr(u, u, reg); - jit_addr(JIT_SP, JIT_SP, reg); - jit_stxi_i(_jitc->function->aoffoff, JIT_FP, u); - jit_unget_reg(reg); - jit_dec_synth(); -} - -void -_jit_ret(jit_state_t *_jit) -{ - jit_node_t *instr; - assert(_jitc->function); - jit_inc_synth(ret); - /* jump to epilog */ - instr = jit_jmpi(); - jit_patch_at(instr, _jitc->function->epilog); - jit_dec_synth(); -} - -void -_jit_retr(jit_state_t *_jit, int32_t u) -{ - jit_inc_synth_w(retr, u); - if (JIT_RET != u) - jit_movr(JIT_RET, u); - jit_live(JIT_RET); - jit_ret(); - jit_dec_synth(); -} - -void -_jit_reti(jit_state_t *_jit, jit_word_t u) -{ - jit_inc_synth_w(reti, u); - jit_movi(JIT_RET, u); - jit_ret(); - jit_dec_synth(); -} - -void -_jit_retr_f(jit_state_t *_jit, int32_t u) -{ - jit_inc_synth_w(retr_f, u); - if (jit_cpu.abi) { - if (u != JIT_FRET) - jit_movr_f(JIT_FRET, u); - else - jit_live(JIT_FRET); - } - else { - if (u != JIT_RET) - jit_movr_f_w(JIT_RET, u); - else - jit_live(JIT_RET); - } - jit_ret(); - jit_dec_synth(); -} - -void -_jit_reti_f(jit_state_t *_jit, jit_float32_t u) -{ - jit_inc_synth_f(reti_f, u); - if (jit_cpu.abi) - jit_movi_f(JIT_FRET, u); - else - jit_movi_f_w(JIT_RET, u); - jit_ret(); - jit_dec_synth(); -} - -void -_jit_retr_d(jit_state_t *_jit, int32_t u) -{ - jit_inc_synth_w(retr_d, u); - if (jit_cpu.abi) { - if (u != JIT_FRET) - jit_movr_d(JIT_FRET, u); - else - jit_live(JIT_FRET); - } - else { - if (u != JIT_RET) - jit_movr_d_ww(JIT_RET, _R1, u); - else - jit_live(JIT_RET); - } - jit_ret(); - jit_dec_synth(); -} - -void -_jit_reti_d(jit_state_t *_jit, jit_float64_t u) -{ - jit_inc_synth_d(reti_d, u); - if (jit_cpu.abi) - jit_movi_d(JIT_FRET, u); - else - jit_movi_d_ww(JIT_RET, _R1, u); - jit_ret(); - jit_dec_synth(); -} - -void -_jit_epilog(jit_state_t *_jit) -{ - assert(_jitc->function); - assert(_jitc->function->epilog->next == NULL); - jit_link(_jitc->function->epilog); - _jitc->function = NULL; + page_size = sysconf(_SC_PAGE_SIZE); + // FIXME check version, thumb, hardware fp support + return 1; } jit_bool_t -_jit_arg_register_p(jit_state_t *_jit, jit_node_t *u) +jit_init(jit_state_t *_jit) { - if (u->code != jit_code_arg) { - if (u->code == jit_code_arg_f) { - if (jit_cpu.abi) - return (jit_arg_f_reg_p(u->u.w)); - } - else { - assert(u->code == jit_code_arg_d); - if (jit_cpu.abi) - return (jit_arg_d_reg_p(u->u.w)); - } - } - return (jit_arg_reg_p(u->u.w)); + return 1; } -static jit_node_t * -_jit_make_arg(jit_state_t *_jit, jit_node_t *node) +static size_t +jit_initial_frame_size (void) { - int32_t offset; - if (jit_arg_reg_p(_jitc->function->self.argi)) - offset = _jitc->function->self.argi++; - else { - offset = _jitc->function->self.size; - _jitc->function->self.size += sizeof(jit_word_t); - } - if (node == (jit_node_t *)0) - node = jit_new_node(jit_code_arg); - else - link_node(node); - node->u.w = offset; - node->v.w = ++_jitc->function->self.argn; - jit_link_prolog(); - return (node); + return 0; } -jit_node_t * -_jit_make_arg_f(jit_state_t *_jit, jit_node_t *node) +static void +reset_abi_arg_iterator(struct abi_arg_iterator *iter, size_t argc, + const jit_operand_t *args) { - int32_t offset; - if (jit_cpu.abi && !(_jitc->function->self.call & jit_call_varargs)) { - if (jit_arg_f_reg_p(_jitc->function->self.argf)) { - offset = _jitc->function->self.argf++; - goto done; - } - } - else { - if (jit_arg_reg_p(_jitc->function->self.argi)) { - offset = _jitc->function->self.argi++; - goto done; - } - } - offset = _jitc->function->self.size; - _jitc->function->self.size += sizeof(jit_float32_t); -done: - if (node == (jit_node_t *)0) - node = jit_new_node(jit_code_arg_f); - else - link_node(node); - node->u.w = offset; - node->v.w = ++_jitc->function->self.argn; - jit_link_prolog(); - return (node); + memset(iter, 0, sizeof *iter); + iter->argc = argc; + iter->args = args; } -jit_node_t * -_jit_make_arg_d(jit_state_t *_jit, jit_node_t *node) +static void +next_abi_arg(struct abi_arg_iterator *iter, jit_operand_t *arg) { - int32_t offset; - if (jit_cpu.abi && !(_jitc->function->self.call & jit_call_varargs)) { - if (jit_arg_d_reg_p(_jitc->function->self.argf)) { - if (_jitc->function->self.argf & 1) - ++_jitc->function->self.argf; - offset = _jitc->function->self.argf; - _jitc->function->self.argf += 2; - goto done; - } + ASSERT(iter->arg_idx < iter->argc); + enum jit_operand_abi abi = iter->args[iter->arg_idx].abi; + iter->arg_idx++; + if (is_gpr_arg(abi) && iter->gpr_idx < abi_gpr_arg_count) { + *arg = jit_operand_gpr (abi, abi_gpr_args[iter->gpr_idx++]); + return; + } + if (is_fpr_arg(abi)) { + // The ARM VFP ABI passes floating-point arguments in d0-d7 + // (s0-s15), and allows for "back-filling". Say you have a + // function: + // + // void f(float a, double b, float c); + // + // A gets allocated to s0, then b to d1 (which aliases s2+s3), then + // c to s1. + uint32_t width = abi == JIT_OPERAND_ABI_FLOAT ? 1 : 2; + uint32_t mask = (1 << width) - 1; + for (size_t i = 0; i < 16; i += width) { + if ((iter->vfp_used_registers & (mask << i)) == 0) { + iter->vfp_used_registers |= (mask << i); + *arg = jit_operand_fpr (abi, JIT_FPR(i)); + return; + } } - else { - if (_jitc->function->self.argi & 1) - ++_jitc->function->self.argi; - if (jit_arg_reg_p(_jitc->function->self.argi)) { - offset = _jitc->function->self.argi; - _jitc->function->self.argi += 2; - goto done; - } - } - if (_jitc->function->self.size & 7) - _jitc->function->self.size += 4; - offset = _jitc->function->self.size; - _jitc->function->self.size += sizeof(jit_float64_t); -done: - if (node == (jit_node_t *)0) - node = jit_new_node(jit_code_arg_d); - else - link_node(node); - node->u.w = offset; - node->v.w = ++_jitc->function->self.argn; - jit_link_prolog(); - return (node); + } + *arg = jit_operand_mem (abi, JIT_SP, iter->stack_size); + iter->stack_size += 8; } -void -_jit_ellipsis(jit_state_t *_jit) -{ - if (_jitc->prepare) { - assert(!(_jitc->function->call.call & jit_call_varargs)); - _jitc->function->call.call |= jit_call_varargs; - if (jit_cpu.abi && _jitc->function->call.argf) - rewind_prepare(); - } - else { - assert(!(_jitc->function->self.call & jit_call_varargs)); - _jitc->function->self.call |= jit_call_varargs; - if (jit_cpu.abi && _jitc->function->self.argf) - rewind_prolog(); - /* First 4 stack addresses are always spilled r0-r3 */ - if (jit_arg_reg_p(_jitc->function->self.argi)) - _jitc->function->vagp = _jitc->function->self.argi * 4; - else - _jitc->function->vagp = 16; - } - jit_inc_synth(ellipsis); - if (_jitc->prepare) - jit_link_prepare(); - else - jit_link_prolog(); - jit_dec_synth(); -} - -void -_jit_va_push(jit_state_t *_jit, int32_t u) -{ - jit_inc_synth_w(va_push, u); - jit_pushargr(u); - jit_dec_synth(); -} - -jit_node_t * -_jit_arg(jit_state_t *_jit) -{ - assert(_jitc->function); - return (jit_make_arg((jit_node_t*)0)); -} - -jit_node_t * -_jit_arg_f(jit_state_t *_jit) -{ - assert(_jitc->function); - return (jit_make_arg_f((jit_node_t*)0)); -} - -jit_node_t * -_jit_arg_d(jit_state_t *_jit) -{ - assert(_jitc->function); - return (jit_make_arg_d((jit_node_t*)0)); -} - -void -_jit_getarg_c(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg); - jit_inc_synth_wp(getarg_c, u, v); - if (jit_swf_p()) - jit_ldxi_c(u, JIT_FP, arg_offset(v->u.w)); - else if (jit_arg_reg_p(v->u.w)) - jit_extr_c(u, JIT_RA0 - v->u.w); - else - jit_ldxi_c(u, JIT_FP, v->u.w); - jit_dec_synth(); -} - -void -_jit_getarg_uc(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg); - jit_inc_synth_wp(getarg_uc, u, v); - if (jit_swf_p()) - jit_ldxi_uc(u, JIT_FP, arg_offset(v->u.w)); - else if (jit_arg_reg_p(v->u.w)) - jit_extr_uc(u, JIT_RA0 - v->u.w); - else - jit_ldxi_uc(u, JIT_FP, v->u.w); - jit_dec_synth(); -} - -void -_jit_getarg_s(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg); - jit_inc_synth_wp(getarg_s, u, v); - if (jit_swf_p()) - jit_ldxi_s(u, JIT_FP, arg_offset(v->u.w)); - else if (jit_arg_reg_p(v->u.w)) - jit_extr_s(u, JIT_RA0 - v->u.w); - else - jit_ldxi_s(u, JIT_FP, v->u.w); - jit_dec_synth(); -} - -void -_jit_getarg_us(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg); - jit_inc_synth_wp(getarg_us, u, v); - if (jit_swf_p()) - jit_ldxi_us(u, JIT_FP, arg_offset(v->u.w)); - else if (jit_arg_reg_p(v->u.w)) - jit_extr_us(u, JIT_RA0 - v->u.w); - else - jit_ldxi_us(u, JIT_FP, v->u.w); - jit_dec_synth(); -} - -void -_jit_getarg_i(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg); - jit_inc_synth_wp(getarg_i, u, v); - if (jit_swf_p()) - jit_ldxi_i(u, JIT_FP, arg_offset(v->u.w)); - else if (jit_arg_reg_p(v->u.w)) - jit_movr(u, JIT_RA0 - v->u.w); - else - jit_ldxi_i(u, JIT_FP, v->u.w); - jit_dec_synth(); -} - -void -_jit_putargr(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg); - jit_inc_synth_wp(putargr, u, v); - if (jit_swf_p()) - jit_stxi(arg_offset(v->u.w), JIT_FP, u); - else if (jit_arg_reg_p(v->u.w)) - jit_movr(JIT_RA0 - v->u.w, u); - else - jit_stxi(v->u.w, JIT_FP, u); - jit_dec_synth(); -} - -void -_jit_putargi(jit_state_t *_jit, jit_word_t u, jit_node_t *v) -{ - int32_t regno; - assert(v->code == jit_code_arg); - jit_inc_synth_wp(putargi, u, v); - if (jit_swf_p()) { - regno = jit_get_reg(jit_class_gpr); - jit_movi(regno, u); - jit_stxi(arg_offset(v->u.w), JIT_FP, regno); - jit_unget_reg(regno); - } - else if (jit_arg_reg_p(v->u.w)) - jit_movi(JIT_RA0 - v->u.w, u); - else { - regno = jit_get_reg(jit_class_gpr); - jit_movi(regno, u); - jit_stxi(v->u.w, JIT_FP, regno); - jit_unget_reg(regno); - } - jit_dec_synth(); -} - -void -_jit_getarg_f(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg_f); - jit_inc_synth_wp(getarg_f, u, v); - if (jit_cpu.abi && !(_jitc->function->self.call & jit_call_varargs)) { - if (jit_arg_f_reg_p(v->u.w)) - jit_movr_f(u, JIT_FA0 - v->u.w); - else - jit_ldxi_f(u, JIT_FP, v->u.w); - } - else if (jit_swf_p()) - jit_ldxi_f(u, JIT_FP, arg_offset(v->u.w)); - else { - if (jit_arg_reg_p(v->u.w)) - jit_movr_w_f(u, JIT_RA0 - v->u.w); - else - jit_ldxi_f(u, JIT_FP, v->u.w); - } - jit_dec_synth(); -} - -void -_jit_putargr_f(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg_f); - jit_inc_synth_wp(putargr_f, u, v); - if (jit_cpu.abi) { - if (jit_arg_f_reg_p(v->u.w)) - jit_movr_f(JIT_FA0 - v->u.w, u); - else - jit_stxi_f(v->u.w, JIT_FP, u); - } - else if (jit_swf_p()) - jit_stxi_f(arg_offset(v->u.w), JIT_FP, u); - else { - if (jit_arg_reg_p(v->u.w)) - jit_movr_f_w(JIT_RA0 - v->u.w, u); - else - jit_stxi_f(v->u.w, JIT_FP, u); - } - jit_dec_synth(); -} - -void -_jit_putargi_f(jit_state_t *_jit, jit_float32_t u, jit_node_t *v) -{ - int32_t regno; - assert(v->code == jit_code_arg_f); - jit_inc_synth_fp(putargi_f, u, v); - if (jit_cpu.abi) { - if (jit_arg_f_reg_p(v->u.w)) - jit_movi_f(JIT_FA0 - v->u.w, u); - else { - regno = jit_get_reg(jit_class_fpr); - jit_movi_f(regno, u); - jit_stxi_f(v->u.w, JIT_FP, regno); - jit_unget_reg(regno); - } - } - else if (jit_swf_p()) { - regno = jit_get_reg(jit_class_fpr); - jit_movi_f(regno, u); - jit_stxi_f(arg_offset(v->u.w), JIT_FP, regno); - jit_unget_reg(regno); - } - else { - regno = jit_get_reg(jit_class_fpr); - jit_movi_f(regno, u); - if (jit_arg_reg_p(v->u.w)) - jit_movr_f_w(JIT_RA0 - v->u.w, regno); - else - jit_stxi_f(v->u.w, JIT_FP, regno); - jit_unget_reg(regno); - } - jit_dec_synth(); -} - -void -_jit_getarg_d(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg_d); - jit_inc_synth_wp(getarg_d, u, v); - if (jit_cpu.abi && !(_jitc->function->self.call & jit_call_varargs)) { - if (jit_arg_f_reg_p(v->u.w)) - jit_movr_d(u, JIT_FA0 - v->u.w); - else - jit_ldxi_d(u, JIT_FP, v->u.w); - } - else if (jit_swf_p()) - jit_ldxi_d(u, JIT_FP, arg_offset(v->u.w)); - else { - if (jit_arg_reg_p(v->u.w)) - jit_movr_ww_d(u, JIT_RA0 - v->u.w, JIT_RA0 - (v->u.w + 1)); - else - jit_ldxi_d(u, JIT_FP, v->u.w); - } - jit_dec_synth(); -} - -void -_jit_putargr_d(jit_state_t *_jit, int32_t u, jit_node_t *v) -{ - assert(v->code == jit_code_arg_d); - jit_inc_synth_wp(putargr_d, u, v); - if (jit_cpu.abi) { - if (jit_arg_f_reg_p(v->u.w)) - jit_movr_d(JIT_FA0 - v->u.w, u); - else - jit_stxi_d(v->u.w, JIT_FP, u); - } - else if (jit_swf_p()) - jit_stxi_d(arg_offset(v->u.w), JIT_FP, u); - else { - if (jit_arg_reg_p(v->u.w)) - jit_movr_d_ww(JIT_RA0 - v->u.w, JIT_RA0 - (v->u.w + 1), u); - else - jit_stxi_d(v->u.w, JIT_FP, u); - } - jit_dec_synth(); -} - -void -_jit_putargi_d(jit_state_t *_jit, jit_float64_t u, jit_node_t *v) -{ - int32_t regno; - assert(v->code == jit_code_arg_d); - jit_inc_synth_dp(putargi_d, u, v); - if (jit_cpu.abi) { - if (jit_arg_f_reg_p(v->u.w)) - jit_movi_d(JIT_FA0 - v->u.w, u); - else { - regno = jit_get_reg(jit_class_fpr); - jit_movi_d(regno, u); - jit_stxi_d(v->u.w, JIT_FP, regno); - jit_unget_reg(regno); - } - } - else if (jit_swf_p()) { - regno = jit_get_reg(jit_class_fpr); - jit_movi_d(regno, u); - jit_stxi_d(arg_offset(v->u.w), JIT_FP, regno); - jit_unget_reg(regno); - } - else { - regno = jit_get_reg(jit_class_fpr); - jit_movi_d(regno, u); - if (jit_arg_reg_p(v->u.w)) - jit_movr_d_ww(JIT_RA0 - v->u.w, JIT_RA0 - (v->u.w + 1), regno); - else - jit_stxi_d(v->u.w, JIT_FP, regno); - jit_unget_reg(regno); - } - jit_dec_synth(); -} - -void -_jit_pushargr(jit_state_t *_jit, int32_t u) -{ - assert(_jitc->function); - jit_inc_synth_w(pushargr, u); - jit_link_prepare(); - if (jit_arg_reg_p(_jitc->function->call.argi)) { - jit_movr(JIT_RA0 - _jitc->function->call.argi, u); - ++_jitc->function->call.argi; - } - else { - jit_stxi(_jitc->function->call.size, JIT_SP, u); - _jitc->function->call.size += sizeof(jit_word_t); - } - jit_dec_synth(); -} - -void -_jit_pushargi(jit_state_t *_jit, jit_word_t u) -{ - int32_t regno; - assert(_jitc->function); - jit_inc_synth_w(pushargi, u); - jit_link_prepare(); - if (jit_arg_reg_p(_jitc->function->call.argi)) { - jit_movi(JIT_RA0 - _jitc->function->call.argi, u); - ++_jitc->function->call.argi; - } - else { - regno = jit_get_reg(jit_class_gpr); - jit_movi(regno, u); - jit_stxi(_jitc->function->call.size, JIT_SP, regno); - jit_unget_reg(regno); - _jitc->function->call.size += sizeof(jit_word_t); - } - jit_dec_synth(); -} - -void -_jit_pushargr_f(jit_state_t *_jit, int32_t u) -{ - assert(_jitc->function); - jit_inc_synth_w(pushargr_f, u); - jit_link_prepare(); - if (jit_cpu.abi && !(_jitc->function->call.call & jit_call_varargs)) { - if (jit_arg_f_reg_p(_jitc->function->call.argf)) { - jit_movr_f(JIT_FA0 - _jitc->function->call.argf, u); - ++_jitc->function->call.argf; - goto done; - } - } - else { - if (jit_arg_reg_p(_jitc->function->call.argi)) { - jit_movr_f_w(JIT_RA0 - _jitc->function->call.argi, u); - ++_jitc->function->call.argi; - goto done; - } - } - jit_stxi_f(_jitc->function->call.size, JIT_SP, u); - _jitc->function->call.size += sizeof(jit_word_t); -done: - jit_dec_synth(); -} - -void -_jit_pushargi_f(jit_state_t *_jit, jit_float32_t u) -{ - int32_t regno; - assert(_jitc->function); - jit_inc_synth_f(pushargi_f, u); - jit_link_prepare(); - if (jit_cpu.abi && !(_jitc->function->call.call & jit_call_varargs)) { - if (jit_arg_f_reg_p(_jitc->function->call.argf)) { - /* cannot jit_movi_f in the argument register because - * float arguments are packed, and that would cause - * either an assertion in debug mode, or overwritting - * two registers */ - regno = jit_get_reg(jit_class_fpr); - jit_movi_f(regno, u); - jit_movr_f(JIT_FA0 - _jitc->function->call.argf, regno); - jit_unget_reg(regno); - ++_jitc->function->call.argf; - goto done; - } - } - else { - if (jit_arg_reg_p(_jitc->function->call.argi)) { - jit_movi_f_w(JIT_RA0 - _jitc->function->call.argi, u); - ++_jitc->function->call.argi; - goto done; - } - } - regno = jit_get_reg(jit_class_fpr); - jit_movi_f(regno, u); - jit_stxi_f(_jitc->function->call.size, JIT_SP, regno); - jit_unget_reg(regno); - _jitc->function->call.size += sizeof(jit_word_t); -done: - jit_dec_synth(); -} - -void -_jit_pushargr_d(jit_state_t *_jit, int32_t u) -{ - assert(_jitc->function); - jit_inc_synth_w(pushargr_d, u); - jit_link_prepare(); - if (jit_cpu.abi && !(_jitc->function->call.call & jit_call_varargs)) { - if (jit_arg_d_reg_p(_jitc->function->call.argf)) { - if (_jitc->function->call.argf & 1) - ++_jitc->function->call.argf; - jit_movr_d(JIT_FA0 - _jitc->function->call.argf, u); - _jitc->function->call.argf += 2; - goto done; - } - } - else { - if (_jitc->function->call.argi & 1) - ++_jitc->function->call.argi; - if (jit_arg_reg_p(_jitc->function->call.argi)) { - jit_movr_d_ww(JIT_RA0 - _jitc->function->call.argi, - JIT_RA0 - (_jitc->function->call.argi + 1), - u); - _jitc->function->call.argi += 2; - goto done; - } - } - if (_jitc->function->call.size & 7) - _jitc->function->call.size += 4; - jit_stxi_d(_jitc->function->call.size, JIT_SP, u); - _jitc->function->call.size += sizeof(jit_float64_t); -done: - jit_dec_synth(); -} - -void -_jit_pushargi_d(jit_state_t *_jit, jit_float64_t u) -{ - int32_t regno; - assert(_jitc->function); - jit_inc_synth_d(pushargi_d, u); - jit_link_prepare(); - if (jit_cpu.abi && !(_jitc->function->call.call & jit_call_varargs)) { - if (jit_arg_d_reg_p(_jitc->function->call.argf)) { - if (_jitc->function->call.argf & 1) - ++_jitc->function->call.argf; - jit_movi_d(JIT_FA0 - _jitc->function->call.argf, u); - _jitc->function->call.argf += 2; - goto done; - } - } - else { - if (_jitc->function->call.argi & 1) - ++_jitc->function->call.argi; - if (jit_arg_reg_p(_jitc->function->call.argi)) { - jit_movi_d_ww(JIT_RA0 - _jitc->function->call.argi, - JIT_RA0 - (_jitc->function->call.argi + 1), - u); - _jitc->function->call.argi += 2; - goto done; - } - } - if (_jitc->function->call.size & 7) - _jitc->function->call.size += 4; - regno = jit_get_reg(jit_class_fpr); - jit_movi_d(regno, u); - jit_stxi_d(_jitc->function->call.size, JIT_SP, regno); - jit_unget_reg(regno); - _jitc->function->call.size += sizeof(jit_float64_t); -done: - jit_dec_synth(); -} - -jit_bool_t -_jit_regarg_p(jit_state_t *_jit, jit_node_t *node, int32_t regno) -{ - int32_t spec; - spec = jit_class(_rvs[regno].spec); - if (spec & jit_class_arg) { - regno = JIT_RA0 - regno; - if (regno >= 0 && regno < node->v.w) - return (1); - if (jit_cpu.abi && spec & jit_class_fpr) { - regno = JIT_FA0 - regno; - if (regno >= 0 && regno < node->w.w) - return (1); - } - } - - return (0); -} - -void -_jit_finishr(jit_state_t *_jit, int32_t r0) -{ - jit_node_t *node; - assert(_jitc->function); - jit_inc_synth_w(finishr, r0); - if (_jitc->function->self.alen < _jitc->function->call.size) - _jitc->function->self.alen = _jitc->function->call.size; - node = jit_callr(r0); - node->v.w = _jitc->function->self.argi; - node->w.w = _jitc->function->call.argf; - _jitc->function->call.argi = _jitc->function->call.argf = - _jitc->function->call.size = 0; - _jitc->prepare = 0; - jit_dec_synth(); -} - -jit_node_t * -_jit_finishi(jit_state_t *_jit, jit_pointer_t i0) -{ - jit_node_t *node; - assert(_jitc->function); - jit_inc_synth_w(finishi, (jit_word_t)i0); - if (_jitc->function->self.alen < _jitc->function->call.size) - _jitc->function->self.alen = _jitc->function->call.size; - node = jit_calli(i0); - node->v.w = _jitc->function->call.argi; - node->w.w = _jitc->function->call.argf; - _jitc->function->call.argi = _jitc->function->call.argf = - _jitc->function->call.size = 0; - _jitc->prepare = 0; - jit_dec_synth(); - return (node); -} - -void -_jit_retval_c(jit_state_t *_jit, int32_t r0) -{ - jit_inc_synth_w(retval_c, r0); - jit_extr_c(r0, JIT_RET); - jit_dec_synth(); -} - -void -_jit_retval_uc(jit_state_t *_jit, int32_t r0) -{ - jit_inc_synth_w(retval_uc, r0); - jit_extr_uc(r0, JIT_RET); - jit_dec_synth(); -} - -void -_jit_retval_s(jit_state_t *_jit, int32_t r0) -{ - jit_inc_synth_w(retval_s, r0); - jit_extr_s(r0, JIT_RET); - jit_dec_synth(); -} - -void -_jit_retval_us(jit_state_t *_jit, int32_t r0) -{ - jit_inc_synth_w(retval_us, r0); - jit_extr_us(r0, JIT_RET); - jit_dec_synth(); -} - -void -_jit_retval_i(jit_state_t *_jit, int32_t r0) -{ - jit_inc_synth_w(retval_i, r0); - if (r0 != JIT_RET) - jit_movr(r0, JIT_RET); - jit_dec_synth(); -} - -void -_jit_retval_f(jit_state_t *_jit, int32_t r0) -{ - jit_inc_synth_w(retval_f, r0); - if (jit_cpu.abi) { - if (r0 != JIT_FRET) - jit_movr_f(r0, JIT_FRET); - } - else if (r0 != JIT_RET) - jit_movr_w_f(r0, JIT_RET); - jit_dec_synth(); -} - -void -_jit_retval_d(jit_state_t *_jit, int32_t r0) -{ - jit_inc_synth_w(retval_d, r0); - if (jit_cpu.abi) { - if (r0 != JIT_FRET) - jit_movr_d(r0, JIT_FRET); - } - else if (r0 != JIT_RET) - jit_movr_ww_d(r0, JIT_RET, _R1); - jit_dec_synth(); -} - -jit_pointer_t -_emit_code(jit_state_t *_jit) -{ - jit_node_t *node; - jit_node_t *temp; - jit_word_t word; - int32_t value; - int32_t offset; - struct { - jit_node_t *node; - uint8_t *data; - jit_word_t word; -#if DEVEL_DISASSEMBLER - jit_word_t prevw; -#endif - jit_uword_t thumb; -#if DISASSEMBLER - int32_t info_offset; -#endif - int32_t const_offset; - int32_t patch_offset; - } undo; -#if DEVEL_DISASSEMBLER - jit_word_t prevw; -#endif - - _jitc->function = NULL; - _jitc->thumb = 0; - - jit_reglive_setup(); - - _jitc->consts.data = NULL; - _jitc->consts.offset = _jitc->consts.length = 0; - - undo.word = 0; - undo.node = NULL; - undo.data = NULL; - undo.thumb = 0; -#if DISASSEMBLER - undo.info_offset = -#endif - undo.const_offset = undo.patch_offset = 0; -# define assert_data(node) /**/ -#define case_rr(name, type) \ - case jit_code_##name##r##type: \ - name##r##type(rn(node->u.w), rn(node->v.w)); \ - break -#define case_rw(name, type) \ - case jit_code_##name##i##type: \ - name##i##type(rn(node->u.w), node->v.w); \ - break -#define case_vv(name, type) \ - case jit_code_##name##r##type: \ - if (jit_swf_p()) \ - swf_##name##r##type(rn(node->u.w), rn(node->v.w)); \ - else \ - vfp_##name##r##type(rn(node->u.w), rn(node->v.w)); \ - break -#define case_vw(name, type) \ - case jit_code_##name##i##type: \ - if (jit_swf_p()) \ - swf_##name##i##type(rn(node->u.w), node->v.w); \ - else \ - vfp_##name##i##type(rn(node->u.w), node->v.w); \ - break -#define case_wr(name, type) \ - case jit_code_##name##i##type: \ - name##i##type(node->u.w, rn(node->v.w)); \ - break -#define case_wv(name, type) \ - case jit_code_##name##i##type: \ - if (jit_swf_p()) \ - swf_##name##i##type(node->u.w, rn(node->v.w)); \ - else \ - vfp_##name##i##type(node->u.w, rn(node->v.w)); \ - break -#define case_rrr(name, type) \ - case jit_code_##name##r##type: \ - name##r##type(rn(node->u.w), \ - rn(node->v.w), rn(node->w.w)); \ - break -#define case_rrrr(name, type) \ - case jit_code_##name##r##type: \ - name##r##type(rn(node->u.q.l), rn(node->u.q.h), \ - rn(node->v.w), rn(node->w.w)); \ - break -#define case_vvv(name, type) \ - case jit_code_##name##r##type: \ - if (jit_swf_p()) \ - swf_##name##r##type(rn(node->u.w), \ - rn(node->v.w), rn(node->w.w)); \ - else \ - vfp_##name##r##type(rn(node->u.w), \ - rn(node->v.w), rn(node->w.w)); \ - break -#define case_rrw(name, type) \ - case jit_code_##name##i##type: \ - name##i##type(rn(node->u.w), rn(node->v.w), node->w.w); \ - break -#define case_rrrw(name, type) \ - case jit_code_##name##i##type: \ - name##i##type(rn(node->u.q.l), rn(node->u.q.h), \ - rn(node->v.w), node->w.w); \ - break -#define case_vvw(name, type) \ - case jit_code_##name##i##type: \ - if (jit_swf_p()) \ - swf_##name##i##type(rn(node->u.w), \ - rn(node->v.w), node->w.w); \ - else \ - vfp_##name##i##type(rn(node->u.w), \ - rn(node->v.w), node->w.w); \ - break -#define case_vvf(name) \ - case jit_code_##name##i_f: \ - assert_data(node); \ - if (jit_swf_p()) \ - swf_##name##i_f(rn(node->u.w), rn(node->v.w), \ - node->w.f); \ - else \ - vfp_##name##i_f(rn(node->u.w), rn(node->v.w), \ - node->w.f); \ - break -#define case_vvd(name) \ - case jit_code_##name##i_d: \ - assert_data(node); \ - if (jit_swf_p()) \ - swf_##name##i_d(rn(node->u.w), rn(node->v.w), \ - node->w.d); \ - else \ - vfp_##name##i_d(rn(node->u.w), rn(node->v.w), \ - node->w.d); \ - break -#define case_wrr(name, type) \ - case jit_code_##name##i##type: \ - name##i##type(node->u.w, rn(node->v.w), rn(node->w.w)); \ - break -#define case_wvv(name, type) \ - case jit_code_##name##i##type: \ - if (jit_swf_p()) \ - swf_##name##i##type(node->u.w, \ - rn(node->v.w), rn(node->w.w)); \ - else \ - vfp_##name##i##type(node->u.w, \ - rn(node->v.w), rn(node->w.w)); \ - break -#define case_brr(name, type) \ - case jit_code_##name##r##type: \ - temp = node->u.n; \ - assert(temp->code == jit_code_label || \ - temp->code == jit_code_epilog); \ - if (temp->flag & jit_flag_patch) \ - name##r##type(temp->u.w, rn(node->v.w), \ - rn(node->w.w)); \ - else { \ - word = name##r##type(_jit->pc.w, \ - rn(node->v.w), rn(node->w.w)); \ - patch(word, node); \ - } \ - break -#define case_bvv(name, type) \ - case jit_code_##name##r##type: \ - temp = node->u.n; \ - assert(temp->code == jit_code_label || \ - temp->code == jit_code_epilog); \ - if (temp->flag & jit_flag_patch) { \ - if (jit_swf_p()) \ - swf_##name##r##type(temp->u.w, rn(node->v.w), \ - rn(node->w.w)); \ - else \ - vfp_##name##r##type(temp->u.w, rn(node->v.w), \ - rn(node->w.w)); \ - } \ - else { \ - if (jit_swf_p()) \ - word = swf_##name##r##type(_jit->pc.w, \ - rn(node->v.w), \ - rn(node->w.w)); \ - else \ - word = vfp_##name##r##type(_jit->pc.w, \ - rn(node->v.w), \ - rn(node->w.w)); \ - patch(word, node); \ - } \ - break -#define case_brw(name, type) \ - case jit_code_##name##i##type: \ - temp = node->u.n; \ - assert(temp->code == jit_code_label || \ - temp->code == jit_code_epilog); \ - if (temp->flag & jit_flag_patch) \ - name##i##type(temp->u.w, \ - rn(node->v.w), node->w.w); \ - else { \ - word = name##i##type(_jit->pc.w, \ - rn(node->v.w), node->w.w); \ - patch(word, node); \ - } \ - break; -#define case_bvf(name) \ - case jit_code_##name##i_f: \ - temp = node->u.n; \ - assert(temp->code == jit_code_label || \ - temp->code == jit_code_epilog); \ - if (temp->flag & jit_flag_patch) { \ - if (jit_swf_p()) \ - swf_##name##i_f(temp->u.w, rn(node->v.w), \ - node->w.f); \ - else \ - vfp_##name##i_f(temp->u.w, rn(node->v.w), \ - node->w.f); \ - } \ - else { \ - if (jit_swf_p()) \ - word = swf_##name##i_f(_jit->pc.w, \ - rn(node->v.w), \ - node->w.f); \ - else \ - word = vfp_##name##i_f(_jit->pc.w, \ - rn(node->v.w), \ - node->w.f); \ - patch(word, node); \ - } \ - break -#define case_bvd(name) \ - case jit_code_##name##i_d: \ - temp = node->u.n; \ - assert(temp->code == jit_code_label || \ - temp->code == jit_code_epilog); \ - if (temp->flag & jit_flag_patch) { \ - if (jit_swf_p()) \ - swf_##name##i_d(temp->u.w, rn(node->v.w), \ - node->w.d); \ - else \ - vfp_##name##i_d(temp->u.w, rn(node->v.w), \ - node->w.d); \ - } \ - else { \ - if (jit_swf_p()) \ - word = swf_##name##i_d(_jit->pc.w, \ - rn(node->v.w), \ - node->w.d); \ - else \ - word = vfp_##name##i_d(_jit->pc.w, \ - rn(node->v.w), \ - node->w.d); \ - patch(word, node); \ - } \ - break -#if DEVEL_DISASSEMBLER - prevw = _jit->pc.w; -#endif - for (node = _jitc->head; node; node = node->next) { - if (_jit->pc.uc >= _jitc->code.end) - return (NULL); - -#if DEVEL_DISASSEMBLER - node->offset = (jit_uword_t)_jit->pc.w - (jit_uword_t)prevw; - prevw = _jit->pc.w; -#endif - value = jit_classify(node->code); - jit_regarg_set(node, value); - switch (node->code) { - case jit_code_align: - assert(!(node->u.w & (node->u.w - 1)) && - node->u.w <= sizeof(jit_word_t)); - if (node->u.w == sizeof(jit_word_t) && - (word = _jit->pc.w & (sizeof(jit_word_t) - 1))) - nop(sizeof(jit_word_t) - word); - break; - case jit_code_note: case jit_code_name: - if (must_align_p(node->next)) - nop(2); - node->u.w = _jit->pc.w; - break; - case jit_code_label: - if (must_align_p(node->next)) - nop(2); - /* remember label is defined */ - node->flag |= jit_flag_patch; - node->u.w = _jit->pc.w; - break; - case_rrr(add,); - case_rrw(add,); - case_rrr(addc,); - case_rrw(addc,); - case_rrr(addx,); - case_rrw(addx,); - case_rrr(sub,); - case_rrw(sub,); - case_rrr(subc,); - case_rrw(subc,); - case_rrr(subx,); - case_rrw(subx,); - case_rrw(rsb,); - case_rrr(mul,); - case_rrw(mul,); - case_rrrr(qmul,); - case_rrrw(qmul,); - case_rrrr(qmul, _u); - case_rrrw(qmul, _u); - case_rrr(div,); - case_rrw(div,); - case_rrr(div, _u); - case_rrw(div, _u); - case_rrrr(qdiv,); - case_rrrw(qdiv,); - case_rrrr(qdiv, _u); - case_rrrw(qdiv, _u); - case_rrr(rem,); - case_rrw(rem,); - case_rrr(rem, _u); - case_rrw(rem, _u); - case_rrr(lsh,); - case_rrw(lsh,); - case_rrr(rsh,); - case_rrw(rsh,); - case_rrr(rsh, _u); - case_rrw(rsh, _u); - case_rr(neg,); - case_rr(com,); - case_rrr(and,); - case_rrw(and,); - case_rrr(or,); - case_rrw(or,); - case_rrr(xor,); - case_rrw(xor,); - case_vv(trunc, _f_i); - case_vv(trunc, _d_i); - case_rr(ld, _c); - case_rw(ld, _c); - case_rr(ld, _uc); - case_rw(ld, _uc); - case_rr(ld, _s); - case_rw(ld, _s); - case_rr(ld, _us); - case_rw(ld, _us); - case_rr(ld, _i); - case_rw(ld, _i); - case_rrr(ldx, _c); - case_rrw(ldx, _c); - case_rrr(ldx, _uc); - case_rrw(ldx, _uc); - case_rrr(ldx, _s); - case_rrw(ldx, _s); - case_rrr(ldx, _us); - case_rrw(ldx, _us); - case_rrr(ldx, _i); - case_rrw(ldx, _i); - case_rr(st, _c); - case_wr(st, _c); - case_rr(st, _s); - case_wr(st, _s); - case_rr(st, _i); - case_wr(st, _i); - case_rrr(stx, _c); - case_wrr(stx, _c); - case_rrr(stx, _s); - case_wrr(stx, _s); - case_rrr(stx, _i); - case_wrr(stx, _i); - case_rr(hton, _us); - case_rr(hton, _ui); - case_rr(ext, _c); - case_rr(ext, _uc); - case_rr(ext, _s); - case_rr(ext, _us); - case_rr(mov,); - case jit_code_movi: - if (node->flag & jit_flag_node) { - temp = node->v.n; - if (temp->code == jit_code_data || - (temp->code == jit_code_label && - (temp->flag & jit_flag_patch))) - movi(rn(node->u.w), temp->u.w); - else { - assert(temp->code == jit_code_label || - temp->code == jit_code_epilog); - word = movi_p(rn(node->u.w), temp->u.w); - patch(word, node); - } - } - else - movi(rn(node->u.w), node->v.w); - break; - case_rrr(lt,); - case_rrw(lt,); - case_rrr(lt, _u); - case_rrw(lt, _u); - case_rrr(le,); - case_rrw(le,); - case_rrr(le, _u); - case_rrw(le, _u); - case_rrr(eq,); - case_rrw(eq,); - case_rrr(ge,); - case_rrw(ge,); - case_rrr(ge, _u); - case_rrw(ge, _u); - case_rrr(gt,); - case_rrw(gt,); - case_rrr(gt, _u); - case_rrw(gt, _u); - case_rrr(ne,); - case_rrw(ne,); - case_brr(blt,); - case_brw(blt,); - case_brr(blt, _u); - case_brw(blt, _u); - case_brr(ble,); - case_brw(ble,); - case_brr(ble, _u); - case_brw(ble, _u); - case_brr(beq,); - case_brw(beq,); - case_brr(bge,); - case_brw(bge,); - case_brr(bge, _u); - case_brw(bge, _u); - case_brr(bgt,); - case_brw(bgt,); - case_brr(bgt, _u); - case_brw(bgt, _u); - case_brr(bne,); - case_brw(bne,); - case_brr(boadd,); - case_brw(boadd,); - case_brr(boadd, _u); - case_brw(boadd, _u); - case_brr(bxadd,); - case_brw(bxadd,); - case_brr(bxadd, _u); - case_brw(bxadd, _u); - case_brr(bosub,); - case_brw(bosub,); - case_brr(bosub, _u); - case_brw(bosub, _u); - case_brr(bxsub,); - case_brw(bxsub,); - case_brr(bxsub, _u); - case_brw(bxsub, _u); - case_brr(bms,); - case_brw(bms,); - case_brr(bmc,); - case_brw(bmc,); - case_vvv(add, _f); - case_vvf(add); - case_vvv(sub, _f); - case_vvf(sub); - case_vvf(rsb); - case_vvv(mul, _f); - case_vvf(mul); - case_vvv(div, _f); - case_vvf(div); - case_vv(abs, _f); - case_vv(neg, _f); - case_vv(sqrt, _f); - case_vv(ext, _f); - case_vv(ld, _f); - case_vw(ld, _f); - case_vvv(ldx, _f); - case_vvw(ldx, _f); - case_vv(st, _f); - case_wv(st, _f); - case_vvv(stx, _f); - case_wvv(stx, _f); - case_vv(mov, _f); - case jit_code_movi_f: - assert_data(node); - if (jit_swf_p()) - swf_movi_f(rn(node->u.w), node->v.f); - else - vfp_movi_f(rn(node->u.w), node->v.f); - break; - case_vv(ext, _d_f); - case_vvv(lt, _f); - case_vvf(lt); - case_vvv(le, _f); - case_vvf(le); - case_vvv(eq, _f); - case_vvf(eq); - case_vvv(ge, _f); - case_vvf(ge); - case_vvv(gt, _f); - case_vvf(gt); - case_vvv(ne, _f); - case_vvf(ne); - case_vvv(unlt, _f); - case_vvf(unlt); - case_vvv(unle, _f); - case_vvf(unle); - case_vvv(uneq, _f); - case_vvf(uneq); - case_vvv(unge, _f); - case_vvf(unge); - case_vvv(ungt, _f); - case_vvf(ungt); - case_vvv(ltgt, _f); - case_vvf(ltgt); - case_vvv(ord, _f); - case_vvf(ord); - case_vvv(unord, _f); - case_vvf(unord); - case_bvv(blt, _f); - case_bvf(blt); - case_bvv(ble, _f); - case_bvf(ble); - case_bvv(beq, _f); - case_bvf(beq); - case_bvv(bge, _f); - case_bvf(bge); - case_bvv(bgt, _f); - case_bvf(bgt); - case_bvv(bne, _f); - case_bvf(bne); - case_bvv(bunlt, _f); - case_bvf(bunlt); - case_bvv(bunle, _f); - case_bvf(bunle); - case_bvv(buneq, _f); - case_bvf(buneq); - case_bvv(bunge, _f); - case_bvf(bunge); - case_bvv(bungt, _f); - case_bvf(bungt); - case_bvv(bltgt, _f); - case_bvf(bltgt); - case_bvv(bord, _f); - case_bvf(bord); - case_bvv(bunord, _f); - case_bvf(bunord); - case_vvv(add, _d); - case_vvd(add); - case_vvv(sub, _d); - case_vvd(sub); - case_vvd(rsb); - case_vvv(mul, _d); - case_vvd(mul); - case_vvv(div, _d); - case_vvd(div); - case_vv(abs, _d); - case_vv(neg, _d); - case_vv(sqrt, _d); - case_vv(ext, _d); - case_vv(ld, _d); - case_vw(ld, _d); - case_vvv(ldx, _d); - case_vvw(ldx, _d); - case_vv(st, _d); - case_wv(st, _d); - case_vvv(stx, _d); - case_wvv(stx, _d); - case_vv(mov, _d); - case jit_code_movi_d: - assert_data(node); - if (jit_swf_p()) - swf_movi_d(rn(node->u.w), node->v.d); - else - vfp_movi_d(rn(node->u.w), node->v.d); - break; - case_vv(ext, _f_d); - case_vvv(lt, _d); - case_vvd(lt); - case_vvv(le, _d); - case_vvd(le); - case_vvv(eq, _d); - case_vvd(eq); - case_vvv(ge, _d); - case_vvd(ge); - case_vvv(gt, _d); - case_vvd(gt); - case_vvv(ne, _d); - case_vvd(ne); - case_vvv(unlt, _d); - case_vvd(unlt); - case_vvv(unle, _d); - case_vvd(unle); - case_vvv(uneq, _d); - case_vvd(uneq); - case_vvv(unge, _d); - case_vvd(unge); - case_vvv(ungt, _d); - case_vvd(ungt); - case_vvv(ltgt, _d); - case_vvd(ltgt); - case_vvv(ord, _d); - case_vvd(ord); - case_vvv(unord, _d); - case_vvd(unord); - case_bvv(blt, _d); - case_bvd(blt); - case_bvv(ble, _d); - case_bvd(ble); - case_bvv(beq, _d); - case_bvd(beq); - case_bvv(bge, _d); - case_bvd(bge); - case_bvv(bgt, _d); - case_bvd(bgt); - case_bvv(bne, _d); - case_bvd(bne); - case_bvv(bunlt, _d); - case_bvd(bunlt); - case_bvv(bunle, _d); - case_bvd(bunle); - case_bvv(buneq, _d); - case_bvd(buneq); - case_bvv(bunge, _d); - case_bvd(bunge); - case_bvv(bungt, _d); - case_bvd(bungt); - case_bvv(bltgt, _d); - case_bvd(bltgt); - case_bvv(bord, _d); - case_bvd(bord); - case_bvv(bunord, _d); - case_bvd(bunord); - case jit_code_jmpr: - jmpr(rn(node->u.w)); - flush_consts(); - break; - case jit_code_jmpi: - if (node->flag & jit_flag_node) { - temp = node->u.n; - assert(temp->code == jit_code_label || - temp->code == jit_code_epilog); - if (temp->flag & jit_flag_patch) - jmpi(temp->u.w); - else { - word = jmpi_p(_jit->pc.w, 1); - patch(word, node); - } - } - else - jmpi(node->u.w); - flush_consts(); - break; - case jit_code_callr: - callr(rn(node->u.w)); - break; - case jit_code_calli: - if (node->flag & jit_flag_node) { - temp = node->u.n; - assert(temp->code == jit_code_label || - temp->code == jit_code_epilog); - if (temp->flag & jit_flag_patch) - calli(temp->u.w); - else { - word = calli_p(_jit->pc.w); - patch(word, node); - } - } - else - calli(node->u.w); - break; - case jit_code_prolog: - _jitc->function = _jitc->functions.ptr + node->w.w; - undo.node = node; - undo.word = _jit->pc.w; -#if DEVEL_DISASSEMBLER - undo.prevw = prevw; -#endif - undo.data = _jitc->consts.data; - undo.thumb = _jitc->thumb; - undo.const_offset = _jitc->consts.offset; - undo.patch_offset = _jitc->patches.offset; -#if DISASSEMBLER - if (_jitc->data_info.ptr) - undo.info_offset = _jitc->data_info.offset; -#endif - restart_function: - _jitc->again = 0; - prolog(node); - break; - case jit_code_epilog: - assert(_jitc->function == _jitc->functions.ptr + node->w.w); - if (_jitc->again) { - for (temp = undo.node->next; - temp != node; temp = temp->next) { - if (temp->code == jit_code_label || - temp->code == jit_code_epilog) - temp->flag &= ~jit_flag_patch; - } - temp->flag &= ~jit_flag_patch; - node = undo.node; - _jit->pc.w = undo.word; -#if DEVEL_DISASSEMBLER - prevw = undo.prevw; -#endif - invalidate_consts(); - _jitc->consts.data = undo.data; - _jitc->thumb = undo.thumb; - _jitc->consts.offset = undo.const_offset; - _jitc->patches.offset = undo.patch_offset; -#if DISASSEMBLER - if (_jitc->data_info.ptr) - _jitc->data_info.offset = undo.info_offset; -#endif - goto restart_function; - } - /* remember label is defined */ - node->flag |= jit_flag_patch; - node->u.w = _jit->pc.w; - epilog(node); - _jitc->function = NULL; - flush_consts(); - break; - case jit_code_movr_w_f: - if (jit_swf_p()) - swf_movr_f(rn(node->u.w), rn(node->v.w)); - else - vfp_movr_f(rn(node->u.w), rn(node->v.w)); - break; - case jit_code_movr_f_w: - if (jit_swf_p()) - swf_movr_f(rn(node->u.w), rn(node->v.w)); - else - vfp_movr_f(rn(node->u.w), rn(node->v.w)); - break; - case jit_code_movi_f_w: - assert_data(node); - if (jit_swf_p()) - swf_movi_f(rn(node->u.w), node->v.f); - else - vfp_movi_f(rn(node->u.w), node->v.f); - break; - case jit_code_movr_ww_d: - if (jit_swf_p()) - swf_movr_d(rn(node->u.w), rn(node->v.w)); - else - vfp_movr_d(rn(node->u.w), rn(node->v.w)); - break; - case jit_code_movr_d_ww: - if (jit_swf_p()) - swf_movr_d(rn(node->u.w), rn(node->w.w)); - else - vfp_movr_d(rn(node->u.w), rn(node->w.w)); - break; - case jit_code_movi_d_ww: - assert_data(node); - if (jit_swf_p()) - swf_movi_d(rn(node->u.w), node->w.d); - else - vfp_movi_d(rn(node->u.w), node->w.d); - break; - case jit_code_va_start: - vastart(rn(node->u.w)); - break; - case jit_code_va_arg: - vaarg(rn(node->u.w), rn(node->v.w)); - break; - case jit_code_va_arg_d: - if (jit_swf_p()) - swf_vaarg_d(rn(node->u.w), rn(node->v.w)); - else - vfp_vaarg_d(rn(node->u.w), rn(node->v.w)); - break; - case jit_code_live: case jit_code_ellipsis: - case jit_code_va_push: - case jit_code_allocai: case jit_code_allocar: - case jit_code_arg: - case jit_code_arg_f: case jit_code_arg_d: - case jit_code_va_end: - case jit_code_ret: - case jit_code_retr: case jit_code_reti: - case jit_code_retr_f: case jit_code_reti_f: - case jit_code_retr_d: case jit_code_reti_d: - case jit_code_getarg_c: case jit_code_getarg_uc: - case jit_code_getarg_s: case jit_code_getarg_us: - case jit_code_getarg_i: - case jit_code_getarg_f: case jit_code_getarg_d: - case jit_code_putargr: case jit_code_putargi: - case jit_code_putargr_f: case jit_code_putargi_f: - case jit_code_putargr_d: case jit_code_putargi_d: - case jit_code_pushargr: case jit_code_pushargi: - case jit_code_pushargr_f: case jit_code_pushargi_f: - case jit_code_pushargr_d: case jit_code_pushargi_d: - case jit_code_retval_c: case jit_code_retval_uc: - case jit_code_retval_s: case jit_code_retval_us: - case jit_code_retval_i: - case jit_code_retval_f: case jit_code_retval_d: - case jit_code_prepare: - case jit_code_finishr: case jit_code_finishi: - break; - default: - abort(); - } - jit_regarg_clr(node, value); - assert(_jitc->regarg == 0 && _jitc->synth == 0); - /* update register live state */ - jit_reglive(node); - - if (_jitc->consts.length && - (_jit->pc.uc - _jitc->consts.data >= 3968 || - (jit_uword_t)_jit->pc.uc - - (jit_uword_t)_jitc->consts.patches[0] >= 3968)) { - /* longest sequence should be 64 bytes, but preventively - * do not let it go past 128 remaining bytes before a flush */ - if (node->next && - node->next->code != jit_code_jmpi && - node->next->code != jit_code_jmpr && - node->next->code != jit_code_epilog) { - /* insert a jump, flush constants and continue */ - word = _jit->pc.w; - assert(!jit_thumb_p()); - B(0); - flush_consts(); - patch_at(arm_patch_jump, word, _jit->pc.w); - } - } - } -#undef case_bvd -#undef case_bvf -#undef case_brw -#undef case_bvv -#undef case_brr -#undef case_wvv -#undef case_wrr -#undef case_vvd -#undef case_vvf -#undef case_vvw -#undef case_rrw -#undef case_vvv -#undef case_rrr -#undef case_wv -#undef case_wr -#undef case_vw -#undef case_vv -#undef case_rw -#undef case_rr - - flush_consts(); - for (offset = 0; offset < _jitc->patches.offset; offset++) { - assert(_jitc->patches.ptr[offset].kind & arm_patch_node); - node = _jitc->patches.ptr[offset].node; - word = _jitc->patches.ptr[offset].inst; - if (!jit_thumb_p() && - (node->code == jit_code_movi || node->code == jit_code_calli)) { - /* calculate where to patch word */ - value = *(int32_t *)word; - assert((value & 0x0f700000) == ARM_LDRI); - /* offset may become negative (-4) if last instruction - * before unconditional branch and data following - * FIXME can this cause issues in the preprocessor prefetch - * or something else? should not, as the constants are after - * an unconditional jump */ - if (value & ARM_P) value = value & 0x00000fff; - else value = -(value & 0x00000fff); - word = word + 8 + value; - } - value = node->code == jit_code_movi ? node->v.n->u.w : node->u.n->u.w; - patch_at(_jitc->patches.ptr[offset].kind & ~arm_patch_node, word, value); - } - - jit_flush(_jit->code.ptr, _jit->pc.uc); - - return (_jit->code.ptr); -} - -#define CODE 1 -# include "rewind.c" -# include "arm-cpu.c" -# include "arm-vfp.c" -#undef CODE - -void +static void jit_flush(void *fptr, void *tptr) { -#if defined(__GNUC__) - jit_uword_t i, f, t, s; - - s = sysconf(_SC_PAGE_SIZE); - f = (jit_uword_t)fptr & -s; - t = (((jit_uword_t)tptr) + s - 1) & -s; - for (i = f; i < t; i += s) - __clear_cache((void *)i, (void *)(i + s)); -#endif + jit_word_t f = (jit_word_t)fptr & -page_size; + jit_word_t t = (((jit_word_t)tptr) + page_size - 1) & -page_size; + __clear_cache((void *)f, (void *)t); } -void -_emit_ldxi(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) +static inline size_t +jit_stack_alignment(void) { - ldxi_i(rn(r0), rn(r1), i0); -} - -void -_emit_stxi(jit_state_t *_jit, jit_word_t i0, int32_t r0, int32_t r1) -{ - stxi_i(i0, rn(r0), rn(r1)); -} - -void -_emit_ldxi_d(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0) -{ - if (jit_swf_p()) - swf_ldxi_d(rn(r0), rn(r1), i0); - else - vfp_ldxi_d(rn(r0), rn(r1), i0); -} - -void -_emit_stxi_d(jit_state_t *_jit, jit_word_t i0, int32_t r0, int32_t r1) -{ - if (jit_swf_p()) - swf_stxi_d(i0, rn(r0), rn(r1)); - else - vfp_stxi_d(i0, rn(r0), rn(r1)); -} - -static int32_t -_jit_get_reg_pair(jit_state_t *_jit) -{ - /* bypass jit_get_reg() with argument or'ed with jit_class_chk - * and try to find an consecutive, even free register pair, or - * return JIT_NOREG if fail, as the cost of spills is greater - * than splitting a double load/store in two operations. */ - if (jit_reg_free_p(_R0) && jit_reg_free_p(_R1)) { - jit_regset_setbit(&_jitc->regarg, _R0); - jit_regset_setbit(&_jitc->regarg, _R1); - return (_R0); - } - if (jit_reg_free_p(_R2) && jit_reg_free_p(_R3)) { - jit_regset_setbit(&_jitc->regarg, _R2); - jit_regset_setbit(&_jitc->regarg, _R3); - return (_R2); - } - if (jit_reg_free_p(_R4) && jit_reg_free_p(_R5)) { - jit_regset_setbit(&_jitc->regarg, _R4); - jit_regset_setbit(&_jitc->regarg, _R5); - return (_R4); - } - if (jit_reg_free_p(_R6) && jit_reg_free_p(_R7)) { - jit_regset_setbit(&_jitc->regarg, _R6); - jit_regset_setbit(&_jitc->regarg, _R7); - return (_R6); - } - if (jit_reg_free_p(_R8) && jit_reg_free_p(_R9)) { - jit_regset_setbit(&_jitc->regarg, _R8); - jit_regset_setbit(&_jitc->regarg, _R9); - return (_R8); - } - return (JIT_NOREG); + return 8; } static void -_jit_unget_reg_pair(jit_state_t *_jit, int32_t reg) +jit_try_shorten(jit_state_t *_jit, jit_reloc_t reloc, jit_pointer_t addr) { - jit_unget_reg(reg); - switch (reg) { - case _R0: jit_unget_reg(_R1); break; - case _R2: jit_unget_reg(_R3); break; - case _R4: jit_unget_reg(_R5); break; - case _R6: jit_unget_reg(_R7); break; - case _R8: jit_unget_reg(_R9); break; - default: abort(); - } -} - -/* A prolog must be aligned at mod 4 bytes boundary. - * This condition was not being required to be tested by - * accident previously, but with the jit_frame and jit_tramp - * code it is required */ -static jit_bool_t -_must_align_p(jit_state_t *_jit, jit_node_t *node) -{ - if (jit_thumb_p() && (_jit->pc.w & 3)) { - for (; node; node = node->next) { - switch (node->code) { - case jit_code_note: - case jit_code_name: - case jit_code_label: - break; - case jit_code_prolog: - return (1); - default: - return (0); - } - } - } - return (0); -} - -static void -_load_const(jit_state_t *_jit, jit_bool_t uniq, int32_t r0, jit_word_t i0) -{ - jit_word_t w; - jit_word_t d; - jit_word_t base; - int32_t *data; - int32_t size; - int32_t offset; - - assert(!jit_thumb_p()); - if (!uniq) { - /* use zero, a valid directly encoded immediate, to avoid the - * need of a bitmask to know what offsets will be patched, so - * that comparison will always fail for constants that cannot - * be encoded */ - assert(i0 != 0); - - /* Actually, code is (currently at least) not self modifying, - * so, any value reachable backwards is valid as a constant. */ - - /* FIXME a quickly updateable/mutable hash table could be - * better here, but most times only a few comparisons - * should be done - */ - - /* search in previous constant pool */ - if ((data = (int32_t *)_jitc->consts.data)) { - w = (jit_word_t)data; - /* maximum backwards offset */ - base = (_jit->pc.w + 8) - 4092; - if (base <= w) - /* can scan all possible available backward constants */ - base = 0; - else - base = (base - w) >> 2; - size = _jitc->consts.size >> 2; - for (offset = size - 1; offset >= base; offset--) { - if (data[offset] == i0) { - w = (jit_word_t)(data + offset); - d = (_jit->pc.w + 8) - w; - LDRIN(r0, _R15_REGNO, d); - return; - } - } - } - } - else - assert(i0 == 0); - - _jitc->consts.patches[_jitc->consts.offset++] = _jit->pc.w; - /* (probably) positive forward offset */ - LDRI(r0, _R15_REGNO, 0); - - if (!uniq) { - /* search already requested values */ - for (offset = 0; offset < _jitc->consts.length; offset++) { - if (_jitc->consts.values[offset] == i0) { - _jitc->consts.patches[_jitc->consts.offset++] = offset; - return; - } - } - } - -#if DEBUG - /* cannot run out of space because of limited range - * but assert anyway to catch logic errors */ - assert(_jitc->consts.length < 1024); - assert(_jitc->consts.offset < 2048); -#endif - _jitc->consts.patches[_jitc->consts.offset++] = _jitc->consts.length; - _jitc->consts.values[_jitc->consts.length++] = i0; -} - -static void -_flush_consts(jit_state_t *_jit) -{ - jit_word_t word; - int32_t offset; - - /* if no forward constants */ - if (!_jitc->consts.length) - return; - assert(!jit_thumb_p()); - word = _jit->pc.w; - _jitc->consts.data = _jit->pc.uc; - _jitc->consts.size = _jitc->consts.length << 2; - /* FIXME check will not overrun, otherwise, need to reallocate - * code buffer and start over */ - jit_memcpy(_jitc->consts.data, _jitc->consts.values, _jitc->consts.size); - _jit->pc.w += _jitc->consts.size; - -#if DISASSEMBLER - if (_jitc->data_info.ptr) { - if (_jitc->data_info.offset >= _jitc->data_info.length) { - jit_realloc((jit_pointer_t *)&_jitc->data_info.ptr, - _jitc->data_info.length * sizeof(jit_data_info_t), - (_jitc->data_info.length + 1024) * - sizeof(jit_data_info_t)); - _jitc->data_info.length += 1024; - } - _jitc->data_info.ptr[_jitc->data_info.offset].code = word; - _jitc->data_info.ptr[_jitc->data_info.offset].length = _jitc->consts.size; - ++_jitc->data_info.offset; - } -#endif - - for (offset = 0; offset < _jitc->consts.offset; offset += 2) - patch_at(arm_patch_load, _jitc->consts.patches[offset], - word + (_jitc->consts.patches[offset + 1] << 2)); - _jitc->consts.length = _jitc->consts.offset = 0; -} - -/* to be called if needing to start over a function */ -static void -_invalidate_consts(jit_state_t *_jit) -{ - /* if no forward constants */ - if (_jitc->consts.length) - _jitc->consts.length = _jitc->consts.offset = 0; -} - -static void -_patch(jit_state_t *_jit, jit_word_t instr, jit_node_t *node) -{ - int32_t flag; - int32_t kind; - - assert(node->flag & jit_flag_node); - if (node->code == jit_code_movi) { - flag = node->v.n->flag; - kind = arm_patch_word; - } - else { - flag = node->u.n->flag; - if (node->code == jit_code_calli || - (node->code == jit_code_jmpi && !(node->flag & jit_flag_node))) - kind = arm_patch_word; - else - kind = arm_patch_jump; - } - assert(!(flag & jit_flag_patch)); - kind |= arm_patch_node; - if (_jitc->patches.offset >= _jitc->patches.length) { - jit_realloc((jit_pointer_t *)&_jitc->patches.ptr, - _jitc->patches.length * sizeof(jit_patch_t), - (_jitc->patches.length + 1024) * sizeof(jit_patch_t)); - _jitc->patches.length += 1024; - } - _jitc->patches.ptr[_jitc->patches.offset].kind = kind; - _jitc->patches.ptr[_jitc->patches.offset].inst = instr; - _jitc->patches.ptr[_jitc->patches.offset].node = node; - ++_jitc->patches.offset; } diff --git a/lightening/arm.h b/lightening/arm.h index 9177f1354..94fc86c5b 100644 --- a/lightening/arm.h +++ b/lightening/arm.h @@ -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 */