diff options
Diffstat (limited to 'thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c')
| -rw-r--r-- | thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c | 193 | 
1 files changed, 106 insertions, 87 deletions
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c index 7d1d087496..ecf4dac4c8 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c @@ -25,15 +25,16 @@   */  /* Latest MIPS architecture. */ -/* Automatically detect SLJIT_MIPS_R1 */ -#if (defined __mips_isa_rev) && (__mips_isa_rev >= 6) -#define SLJIT_MIPS_R6 1 +#ifndef __mips_hard_float +/* Disable automatic detection, covers both -msoft-float and -mno-float */ +#undef SLJIT_IS_FPU_AVAILABLE +#define SLJIT_IS_FPU_AVAILABLE 0  #endif  SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)  { -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)  	return "MIPS32-R6" SLJIT_CPUINFO; @@ -41,7 +42,7 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)  	return "MIPS64-R6" SLJIT_CPUINFO;  #endif /* SLJIT_CONFIG_MIPS_32 */ -#elif (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)  #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)  	return "MIPS32-R1" SLJIT_CPUINFO; @@ -49,9 +50,9 @@ SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)  	return "MIPS64-R1" SLJIT_CPUINFO;  #endif /* SLJIT_CONFIG_MIPS_32 */ -#else /* SLJIT_MIPS_R1 */ +#else /* SLJIT_MIPS_REV < 1 */  	return "MIPS III" SLJIT_CPUINFO; -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  }  /* Length of an instruction word @@ -117,11 +118,11 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {  #define FR(dr)		(freg_map[dr])  #define HI(opcode)	((opcode) << 26)  #define LO(opcode)	(opcode) -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  /* CMP.cond.fmt */  /* S = (20 << 21) D = (21 << 21) */  #define CMP_FMT_S	(20 << 21) -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  /* S = (16 << 21) D = (17 << 21) */  #define FMT_S		(16 << 21)  #define FMT_D		(17 << 21) @@ -134,13 +135,13 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {  #define ANDI		(HI(12))  #define B		(HI(4))  #define BAL		(HI(1) | (17 << 16)) -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #define BC1EQZ		(HI(17) | (9 << 21) | FT(TMP_FREG3))  #define BC1NEZ		(HI(17) | (13 << 21) | FT(TMP_FREG3)) -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  #define BC1F		(HI(17) | (8 << 21))  #define BC1T		(HI(17) | (8 << 21) | (1 << 16)) -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  #define BEQ		(HI(4))  #define BGEZ		(HI(1) | (1 << 16))  #define BGTZ		(HI(7)) @@ -149,23 +150,23 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {  #define BNE		(HI(5))  #define BREAK		(HI(0) | LO(13))  #define CFC1		(HI(17) | (2 << 21)) -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #define C_UEQ_S		(HI(17) | CMP_FMT_S | LO(3))  #define C_ULE_S		(HI(17) | CMP_FMT_S | LO(7))  #define C_ULT_S		(HI(17) | CMP_FMT_S | LO(5))  #define C_UN_S		(HI(17) | CMP_FMT_S | LO(1))  #define C_FD		(FD(TMP_FREG3)) -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  #define C_UEQ_S		(HI(17) | FMT_S | LO(51))  #define C_ULE_S		(HI(17) | FMT_S | LO(55))  #define C_ULT_S		(HI(17) | FMT_S | LO(53))  #define C_UN_S		(HI(17) | FMT_S | LO(49))  #define C_FD		(0) -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  #define CVT_S_S		(HI(17) | FMT_S | LO(32))  #define DADDIU		(HI(25))  #define DADDU		(HI(0) | LO(45)) -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #define DDIV		(HI(0) | (2 << 6) | LO(30))  #define DDIVU		(HI(0) | (2 << 6) | LO(31))  #define DMOD		(HI(0) | (3 << 6) | LO(30)) @@ -176,14 +177,14 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {  #define DMUHU		(HI(0) | (3 << 6) | LO(29))  #define DMUL		(HI(0) | (2 << 6) | LO(28))  #define DMULU		(HI(0) | (2 << 6) | LO(29)) -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  #define DDIV		(HI(0) | LO(30))  #define DDIVU		(HI(0) | LO(31))  #define DIV		(HI(0) | LO(26))  #define DIVU		(HI(0) | LO(27))  #define DMULT		(HI(0) | LO(28))  #define DMULTU		(HI(0) | LO(29)) -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  #define DIV_S		(HI(17) | FMT_S | LO(3))  #define DSLL		(HI(0) | LO(56))  #define DSLL32		(HI(0) | LO(60)) @@ -198,33 +199,33 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {  #define J		(HI(2))  #define JAL		(HI(3))  #define JALR		(HI(0) | LO(9)) -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #define JR		(HI(0) | LO(9)) -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  #define JR		(HI(0) | LO(8)) -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  #define LD		(HI(55))  #define LUI		(HI(15))  #define LW		(HI(35))  #define MFC1		(HI(17)) -#if !(defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) -#define MFHI		(HI(0) | LO(16)) -#define MFLO		(HI(0) | LO(18)) -#else /* SLJIT_MIPS_R6 */ +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #define MOD		(HI(0) | (3 << 6) | LO(26))  #define MODU		(HI(0) | (3 << 6) | LO(27)) -#endif /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */ +#define MFHI		(HI(0) | LO(16)) +#define MFLO		(HI(0) | LO(18)) +#endif /* SLJIT_MIPS_REV >= 6 */  #define MOV_S		(HI(17) | FMT_S | LO(6))  #define MTC1		(HI(17) | (4 << 21)) -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #define MUH		(HI(0) | (3 << 6) | LO(24))  #define MUHU		(HI(0) | (3 << 6) | LO(25))  #define MUL		(HI(0) | (2 << 6) | LO(24))  #define MULU		(HI(0) | (2 << 6) | LO(25)) -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  #define MULT		(HI(0) | LO(24))  #define MULTU		(HI(0) | LO(25)) -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  #define MUL_S		(HI(17) | FMT_S | LO(2))  #define NEG_S		(HI(17) | FMT_S | LO(7))  #define NOP		(HI(0) | LO(0)) @@ -251,23 +252,23 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {  #define XOR		(HI(0) | LO(38))  #define XORI		(HI(14)) -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) || (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)  #define CLZ		(HI(28) | LO(32)) -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #define DCLZ		(LO(18)) -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  #define DCLZ		(HI(28) | LO(36))  #define MOVF		(HI(0) | (0 << 16) | LO(1))  #define MOVN		(HI(0) | LO(11))  #define MOVT		(HI(0) | (1 << 16) | LO(1))  #define MOVZ		(HI(0) | LO(10))  #define MUL		(HI(28) | LO(2)) -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  #define PREF		(HI(51))  #define PREFX		(HI(19) | LO(15))  #define SEB		(HI(31) | (16 << 6) | LO(32))  #define SEH		(HI(31) | (24 << 6) | LO(32)) -#endif +#endif /* SLJIT_MIPS_REV >= 1 */  #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)  #define ADDU_W		ADDU @@ -289,9 +290,9 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {     Useful for reordering instructions in the delay slot. */  static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot)  { +	sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));  	SLJIT_ASSERT(delay_slot == MOVABLE_INS || delay_slot >= UNMOVABLE_INS  		|| delay_slot == ((ins >> 11) & 0x1f) || delay_slot == ((ins >> 16) & 0x1f)); -	sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));  	FAIL_IF(!ptr);  	*ptr = ins;  	compiler->size++; @@ -303,10 +304,10 @@ static SLJIT_INLINE sljit_ins invert_branch(sljit_s32 flags)  {  	if (flags & IS_BIT26_COND)  		return (1 << 26); -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  	if (flags & IS_BIT23_COND)  		return (1 << 23); -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  	return (1 << 16);  } @@ -519,7 +520,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil  	CHECK_PTR(check_sljit_generate_code(compiler));  	reverse_buf(compiler); -	code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins)); +	code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins), compiler->exec_allocator_data);  	PTR_FAIL_WITH_EXEC_IF(code);  	buf = compiler->buf; @@ -666,6 +667,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil  	/* GCC workaround for invalid code generation with -O2. */  	sljit_cache_flush(code, code_ptr);  #endif +	SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1);  	return code;  } @@ -678,17 +680,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)  #ifdef SLJIT_IS_FPU_AVAILABLE  		return SLJIT_IS_FPU_AVAILABLE;  #elif defined(__GNUC__) -		asm ("cfc1 %0, $0" : "=r"(fir)); +		__asm__ ("cfc1 %0, $0" : "=r"(fir));  		return (fir >> 22) & 0x1;  #else  #error "FIR check is not implemented for this architecture"  #endif +	case SLJIT_HAS_ZERO_REGISTER: +		return 1; -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)  	case SLJIT_HAS_CLZ:  	case SLJIT_HAS_CMOV: +	case SLJIT_HAS_PREFETCH:  		return 1; -#endif +#endif /* SLJIT_MIPS_REV >= 1 */  	default:  		return fir; @@ -1230,7 +1235,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile  		return push_inst(compiler, NOP, UNMOVABLE_INS);  	case SLJIT_LMUL_UW:  	case SLJIT_LMUL_SW: -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)  		FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULU : DMUL) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3)));  		FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMUHU : DMUH) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); @@ -1240,7 +1245,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile  #endif /* SLJIT_CONFIG_MIPS_64 */  		FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | TA(0) | D(SLJIT_R0), DR(SLJIT_R0)));  		return push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_R1), DR(SLJIT_R1)); -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)  		FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));  #else /* !SLJIT_CONFIG_MIPS_64 */ @@ -1248,13 +1253,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile  #endif /* SLJIT_CONFIG_MIPS_64 */  		FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));  		return push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1)); -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  	case SLJIT_DIVMOD_UW:  	case SLJIT_DIVMOD_SW:  	case SLJIT_DIV_UW:  	case SLJIT_DIV_SW:  		SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments); -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)  		if (int_op) {  			FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); @@ -1270,11 +1275,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile  #endif /* SLJIT_CONFIG_MIPS_64 */  		FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | TA(0) | D(SLJIT_R0), DR(SLJIT_R0)));  		return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_R1), DR(SLJIT_R1)); -#else /* !SLJIT_MIPS_R6 */ -#if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#else /* SLJIT_MIPS_REV < 6 */ +#if !(defined SLJIT_MIPS_REV)  		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));  		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif /* !SLJIT_MIPS_R1 */ +#endif /* !SLJIT_MIPS_REV */  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)  		if (int_op)  			FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); @@ -1285,13 +1290,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile  #endif /* SLJIT_CONFIG_MIPS_64 */  		FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));  		return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1)); -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */ +	case SLJIT_ENDBR: +	case SLJIT_SKIP_FRAMES_BEFORE_RETURN: +		return SLJIT_SUCCESS;  	}  	return SLJIT_SUCCESS;  } -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)  static sljit_s32 emit_prefetch(struct sljit_compiler *compiler,          sljit_s32 src, sljit_sw srcw)  { @@ -1312,7 +1320,7 @@ static sljit_s32 emit_prefetch(struct sljit_compiler *compiler,  	return push_inst(compiler, PREFX | S(src & REG_MASK) | T(OFFS_REG(src)), MOVABLE_INS);  } -#endif +#endif /* SLJIT_MIPS_REV >= 1 */  SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,  	sljit_s32 dst, sljit_sw dstw, @@ -1329,14 +1337,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compile  	ADJUST_LOCAL_OFFSET(dst, dstw);  	ADJUST_LOCAL_OFFSET(src, srcw); -	if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) { -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) -		if (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) -			return emit_prefetch(compiler, src, srcw); -#endif -		return SLJIT_SUCCESS; -	} -  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)  	if ((op & SLJIT_I32_OP) && GET_OPCODE(op) >= SLJIT_NOT)  		flags |= INT_DATA | SIGNED_DATA; @@ -1463,6 +1463,38 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile  #endif  } +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, +	sljit_s32 src, sljit_sw srcw) +{ +	CHECK_ERROR(); +	CHECK(check_sljit_emit_op_src(compiler, op, src, srcw)); +	ADJUST_LOCAL_OFFSET(src, srcw); + +	switch (op) { +	case SLJIT_FAST_RETURN: +		if (FAST_IS_REG(src)) +			FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG)); +		else +			FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw)); + +		FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS)); +		return push_inst(compiler, NOP, UNMOVABLE_INS); +	case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN: +		return SLJIT_SUCCESS; +	case SLJIT_PREFETCH_L1: +	case SLJIT_PREFETCH_L2: +	case SLJIT_PREFETCH_L3: +	case SLJIT_PREFETCH_ONCE: +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) +		return emit_prefetch(compiler, src, srcw); +#else /* SLJIT_MIPS_REV < 1 */ +		return SLJIT_SUCCESS; +#endif /* SLJIT_MIPS_REV >= 1 */ +	} + +	return SLJIT_SUCCESS; +} +  SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)  {  	CHECK_REG_INDEX(check_sljit_get_register_index(reg)); @@ -1732,25 +1764,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *  	ADJUST_LOCAL_OFFSET(dst, dstw);  	if (FAST_IS_REG(dst)) -		return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), DR(dst)); +		return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), UNMOVABLE_INS);  	/* Memory. */ -	return emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw); -} - -SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) -{ -	CHECK_ERROR(); -	CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); -	ADJUST_LOCAL_OFFSET(src, srcw); - -	if (FAST_IS_REG(src)) -		FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG)); -	else -		FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw)); - -	FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS)); -	return push_inst(compiler, NOP, UNMOVABLE_INS); +	FAIL_IF(emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw)); +	compiler->delay_slot = UNMOVABLE_INS; +	return SLJIT_SUCCESS;  }  /* --------------------------------------------------------------------- */ @@ -1790,7 +1809,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi  	flags = IS_BIT26_COND; \  	delay_check = src; -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  #define BR_T() \  	inst = BC1NEZ; \ @@ -1801,7 +1820,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi  	flags = IS_BIT23_COND; \  	delay_check = FCSR_FCC; -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  #define BR_T() \  	inst = BC1T | JUMP_LENGTH; \ @@ -1812,7 +1831,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi  	flags = IS_BIT16_COND; \  	delay_check = FCSR_FCC; -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)  { @@ -2123,11 +2142,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co  	case SLJIT_GREATER_EQUAL_F64:  	case SLJIT_UNORDERED_F64:  	case SLJIT_ORDERED_F64: -#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)  		FAIL_IF(push_inst(compiler, MFC1 | TA(dst_ar) | FS(TMP_FREG3), dst_ar)); -#else /* !SLJIT_MIPS_R6 */ +#else /* SLJIT_MIPS_REV < 6 */  		FAIL_IF(push_inst(compiler, CFC1 | TA(dst_ar) | DA(FCSR_REG), dst_ar)); -#endif /* SLJIT_MIPS_R6 */ +#endif /* SLJIT_MIPS_REV >= 6 */  		FAIL_IF(push_inst(compiler, SRL | TA(dst_ar) | DA(dst_ar) | SH_IMM(23), dst_ar));  		FAIL_IF(push_inst(compiler, ANDI | SA(dst_ar) | TA(dst_ar) | IMM(1), dst_ar));  		src_ar = dst_ar; @@ -2167,14 +2186,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil  	sljit_s32 dst_reg,  	sljit_s32 src, sljit_sw srcw)  { -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)  	sljit_ins ins; -#endif +#endif /* SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6 */  	CHECK_ERROR();  	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)  	if (SLJIT_UNLIKELY(src & SLJIT_IMM)) {  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) @@ -2231,9 +2250,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil  	return push_inst(compiler, ins | S(src) | D(dst_reg), DR(dst_reg)); -#else +#else /* SLJIT_MIPS_REV < 1 || SLJIT_MIPS_REV >= 6 */  	return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw); -#endif +#endif /* SLJIT_MIPS_REV >= 1 */  }  SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)  |