diff options
Diffstat (limited to 'thirdparty/pcre2/src/sljit/sljitNativePPC_64.c')
| -rw-r--r-- | thirdparty/pcre2/src/sljit/sljitNativePPC_64.c | 32 | 
1 files changed, 22 insertions, 10 deletions
diff --git a/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c b/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c index 92147d2a5d..cbdf2dd8a2 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c +++ b/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c @@ -252,10 +252,17 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl  			BIN_IMM_EXTS();  			return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm);  		} +		if (flags & ALT_FORM4) { +			if (flags & ALT_FORM5) +				FAIL_IF(push_inst(compiler, ADDI | D(dst) | A(src1) | compiler->imm)); +			else +				FAIL_IF(push_inst(compiler, ADD | D(dst) | A(src1) | B(src2))); +			return push_inst(compiler, CMPI | A(dst) | 0); +		}  		if (!(flags & ALT_SET_FLAGS))  			return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2));  		BIN_EXTS(); -		if (flags & ALT_FORM4) +		if (flags & ALT_FORM5)  			return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2));  		return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); @@ -278,6 +285,19 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl  		}  		if (flags & ALT_FORM2) { +			if (flags & ALT_FORM3) { +				FAIL_IF(push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm)); +				if (!(flags & ALT_FORM4)) +					return SLJIT_SUCCESS; +				return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff)); +			} +			FAIL_IF(push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2))); +			if (!(flags & ALT_FORM4)) +				return SLJIT_SUCCESS; +			return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); +		} + +		if (flags & ALT_FORM3) {  			if (flags & ALT_SIGN_EXT) {  				FAIL_IF(push_inst(compiler, RLDI(TMP_REG1, src1, 32, 31, 1)));  				src1 = TMP_REG1; @@ -291,20 +311,12 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl  			return SLJIT_SUCCESS;  		} -		if (flags & ALT_FORM3) { +		if (flags & ALT_FORM4) {  			/* Flags does not set: BIN_IMM_EXTS unnecessary. */  			SLJIT_ASSERT(src2 == TMP_REG2);  			return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm);  		} -		if (flags & ALT_FORM4) { -			if (flags & ALT_FORM5) { -				SLJIT_ASSERT(src2 == TMP_REG2); -				return push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm); -			} -			return push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2)); -		} -  		if (!(flags & ALT_SET_FLAGS))  			return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));  		BIN_EXTS();  |