Path: blob/master/thirdparty/pcre2/deps/sljit/sljit_src/sljitNativePPC_32.c
9913 views
/*1* Stack-less Just-In-Time compiler2*3* Copyright Zoltan Herczeg ([email protected]). All rights reserved.4*5* Redistribution and use in source and binary forms, with or without modification, are6* permitted provided that the following conditions are met:7*8* 1. Redistributions of source code must retain the above copyright notice, this list of9* conditions and the following disclaimer.10*11* 2. Redistributions in binary form must reproduce the above copyright notice, this list12* of conditions and the following disclaimer in the documentation and/or other materials13* provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY16* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES17* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT18* SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,19* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED20* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR21* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN22* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN23* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.24*/2526/* ppc 32-bit arch dependent functions. */2728static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)29{30if (imm <= SIMM_MAX && imm >= SIMM_MIN)31return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm));3233if (!(imm & ~0xffff))34return push_inst(compiler, ORI | S(TMP_ZERO) | A(reg) | IMM(imm));3536FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(imm >> 16)));37return (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS;38}3940/* Simplified mnemonics: clrlwi. */41#define INS_CLEAR_LEFT(dst, src, from) \42(RLWINM | S(src) | A(dst) | RLWI_MBE(from, 31))4344static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,45sljit_s32 dst, sljit_s32 src1, sljit_s32 src2)46{47sljit_u32 imm;4849switch (op) {50case SLJIT_MOV:51case SLJIT_MOV_U32:52case SLJIT_MOV_S32:53case SLJIT_MOV_P:54SLJIT_ASSERT(src1 == TMP_REG1);55if (dst != src2)56return push_inst(compiler, OR | S(src2) | A(dst) | B(src2));57return SLJIT_SUCCESS;5859case SLJIT_MOV_U8:60case SLJIT_MOV_S8:61SLJIT_ASSERT(src1 == TMP_REG1);62if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {63if (op == SLJIT_MOV_S8)64return push_inst(compiler, EXTSB | S(src2) | A(dst));65return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24));66}67else if ((flags & REG_DEST) && op == SLJIT_MOV_S8)68return push_inst(compiler, EXTSB | S(src2) | A(dst));69else {70SLJIT_ASSERT(dst == src2);71}72return SLJIT_SUCCESS;7374case SLJIT_MOV_U16:75case SLJIT_MOV_S16:76SLJIT_ASSERT(src1 == TMP_REG1);77if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {78if (op == SLJIT_MOV_S16)79return push_inst(compiler, EXTSH | S(src2) | A(dst));80return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16));81}82else {83SLJIT_ASSERT(dst == src2);84}85return SLJIT_SUCCESS;8687case SLJIT_CLZ:88SLJIT_ASSERT(src1 == TMP_REG1);89return push_inst(compiler, CNTLZW | S(src2) | A(dst));9091case SLJIT_CTZ:92SLJIT_ASSERT(src1 == TMP_REG1);93FAIL_IF(push_inst(compiler, NEG | D(TMP_REG1) | A(src2)));94FAIL_IF(push_inst(compiler, AND | S(src2) | A(dst) | B(TMP_REG1)));95FAIL_IF(push_inst(compiler, CNTLZW | S(dst) | A(dst)));96FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG1) | A(dst) | IMM(-32)));97/* The highest bits are set, if dst < 32, zero otherwise. */98FAIL_IF(push_inst(compiler, SRWI(27) | S(TMP_REG1) | A(TMP_REG1)));99return push_inst(compiler, XOR | S(dst) | A(dst) | B(TMP_REG1));100101case SLJIT_ADD:102if (flags & ALT_FORM1) {103/* Setting XER SO is not enough, CR SO is also needed. */104return push_inst(compiler, ADD | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2));105}106107if (flags & ALT_FORM2) {108/* Flags does not set: BIN_IMM_EXTS unnecessary. */109SLJIT_ASSERT(src2 == TMP_REG2);110111if (flags & ALT_FORM3)112return push_inst(compiler, ADDIS | D(dst) | A(src1) | compiler->imm);113114imm = compiler->imm;115116if (flags & ALT_FORM4) {117FAIL_IF(push_inst(compiler, ADDIS | D(dst) | A(src1) | (((imm >> 16) & 0xffff) + ((imm >> 15) & 0x1))));118src1 = dst;119}120121return push_inst(compiler, ADDI | D(dst) | A(src1) | (imm & 0xffff));122}123if (flags & ALT_FORM3) {124SLJIT_ASSERT(src2 == TMP_REG2);125return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm);126}127SLJIT_ASSERT(!(flags & ALT_FORM4));128if (!(flags & ALT_SET_FLAGS))129return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2));130if (flags & ALT_FORM5)131return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2));132return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2));133134case SLJIT_ADDC:135return push_inst(compiler, ADDE | D(dst) | A(src1) | B(src2));136137case SLJIT_SUB:138if (flags & ALT_FORM1) {139if (flags & ALT_FORM2) {140FAIL_IF(push_inst(compiler, CMPLI | CRD(0) | A(src1) | compiler->imm));141if (!(flags & ALT_FORM3))142return SLJIT_SUCCESS;143return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff));144}145FAIL_IF(push_inst(compiler, CMPL | CRD(0) | A(src1) | B(src2)));146if (!(flags & ALT_FORM3))147return SLJIT_SUCCESS;148return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));149}150151if (flags & ALT_FORM2) {152if (flags & ALT_FORM3) {153FAIL_IF(push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm));154if (!(flags & ALT_FORM4))155return SLJIT_SUCCESS;156return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff));157}158FAIL_IF(push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2)));159if (!(flags & ALT_FORM4))160return SLJIT_SUCCESS;161return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));162}163164if (flags & ALT_FORM3) {165/* Setting XER SO is not enough, CR SO is also needed. */166if (src1 != TMP_ZERO)167return push_inst(compiler, SUBF | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1));168return push_inst(compiler, NEG | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2));169}170171if (flags & ALT_FORM4) {172/* Flags does not set: BIN_IMM_EXTS unnecessary. */173SLJIT_ASSERT(src2 == TMP_REG2);174return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm);175}176177if (!(flags & ALT_SET_FLAGS)) {178SLJIT_ASSERT(src1 != TMP_ZERO);179return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));180}181182if (flags & ALT_FORM5)183return push_inst(compiler, SUBFC | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1));184185if (src1 != TMP_ZERO)186return push_inst(compiler, SUBF | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1));187return push_inst(compiler, NEG | RC(ALT_SET_FLAGS) | D(dst) | A(src2));188189case SLJIT_SUBC:190return push_inst(compiler, SUBFE | D(dst) | A(src2) | B(src1));191192case SLJIT_MUL:193if (flags & ALT_FORM1) {194SLJIT_ASSERT(src2 == TMP_REG2);195return push_inst(compiler, MULLI | D(dst) | A(src1) | compiler->imm);196}197return push_inst(compiler, MULLW | OE(flags) | RC(flags) | D(dst) | A(src2) | B(src1));198199case SLJIT_AND:200if (flags & ALT_FORM1) {201SLJIT_ASSERT(src2 == TMP_REG2);202return push_inst(compiler, ANDI | S(src1) | A(dst) | compiler->imm);203}204if (flags & ALT_FORM2) {205SLJIT_ASSERT(src2 == TMP_REG2);206return push_inst(compiler, ANDIS | S(src1) | A(dst) | compiler->imm);207}208return push_inst(compiler, AND | RC(flags) | S(src1) | A(dst) | B(src2));209210case SLJIT_OR:211if (flags & ALT_FORM1) {212SLJIT_ASSERT(src2 == TMP_REG2);213return push_inst(compiler, ORI | S(src1) | A(dst) | compiler->imm);214}215if (flags & ALT_FORM2) {216SLJIT_ASSERT(src2 == TMP_REG2);217return push_inst(compiler, ORIS | S(src1) | A(dst) | compiler->imm);218}219if (flags & ALT_FORM3) {220SLJIT_ASSERT(src2 == TMP_REG2);221imm = compiler->imm;222223FAIL_IF(push_inst(compiler, ORI | S(src1) | A(dst) | IMM(imm)));224return push_inst(compiler, ORIS | S(dst) | A(dst) | IMM(imm >> 16));225}226return push_inst(compiler, OR | RC(flags) | S(src1) | A(dst) | B(src2));227228case SLJIT_XOR:229if (flags & ALT_FORM1) {230SLJIT_ASSERT(src2 == TMP_REG2);231return push_inst(compiler, XORI | S(src1) | A(dst) | compiler->imm);232}233if (flags & ALT_FORM2) {234SLJIT_ASSERT(src2 == TMP_REG2);235return push_inst(compiler, XORIS | S(src1) | A(dst) | compiler->imm);236}237if (flags & ALT_FORM3) {238SLJIT_ASSERT(src2 == TMP_REG2);239imm = compiler->imm;240241FAIL_IF(push_inst(compiler, XORI | S(src1) | A(dst) | IMM(imm)));242return push_inst(compiler, XORIS | S(dst) | A(dst) | IMM(imm >> 16));243}244if (flags & ALT_FORM4) {245SLJIT_ASSERT(src1 == TMP_REG1);246return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2));247}248return push_inst(compiler, XOR | RC(flags) | S(src1) | A(dst) | B(src2));249250case SLJIT_SHL:251case SLJIT_MSHL:252if (flags & ALT_FORM1) {253SLJIT_ASSERT(src2 == TMP_REG2);254imm = compiler->imm & 0x1f;255return push_inst(compiler, SLWI(imm) | RC(flags) | S(src1) | A(dst));256}257258if (op == SLJIT_MSHL) {259FAIL_IF(push_inst(compiler, ANDI | S(src2) | A(TMP_REG2) | 0x1f));260src2 = TMP_REG2;261}262263return push_inst(compiler, SLW | RC(flags) | S(src1) | A(dst) | B(src2));264265case SLJIT_LSHR:266case SLJIT_MLSHR:267if (flags & ALT_FORM1) {268SLJIT_ASSERT(src2 == TMP_REG2);269imm = compiler->imm & 0x1f;270/* Since imm can be 0, SRWI() cannot be used. */271return push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | RLWI_SH((32 - imm) & 0x1f) | RLWI_MBE(imm, 31));272}273274if (op == SLJIT_MLSHR) {275FAIL_IF(push_inst(compiler, ANDI | S(src2) | A(TMP_REG2) | 0x1f));276src2 = TMP_REG2;277}278279return push_inst(compiler, SRW | RC(flags) | S(src1) | A(dst) | B(src2));280281case SLJIT_ASHR:282case SLJIT_MASHR:283if (flags & ALT_FORM1) {284SLJIT_ASSERT(src2 == TMP_REG2);285imm = compiler->imm & 0x1f;286return push_inst(compiler, SRAWI | RC(flags) | S(src1) | A(dst) | (imm << 11));287}288289if (op == SLJIT_MASHR) {290FAIL_IF(push_inst(compiler, ANDI | S(src2) | A(TMP_REG2) | 0x1f));291src2 = TMP_REG2;292}293294return push_inst(compiler, SRAW | RC(flags) | S(src1) | A(dst) | B(src2));295296case SLJIT_ROTL:297case SLJIT_ROTR:298if (flags & ALT_FORM1) {299SLJIT_ASSERT(src2 == TMP_REG2);300imm = compiler->imm;301302if (op == SLJIT_ROTR)303imm = (sljit_u32)(-(sljit_s32)imm);304305imm &= 0x1f;306return push_inst(compiler, RLWINM | S(src1) | A(dst) | RLWI_SH(imm) | RLWI_MBE(0, 31));307}308309if (op == SLJIT_ROTR) {310FAIL_IF(push_inst(compiler, SUBFIC | D(TMP_REG2) | A(src2) | 0));311src2 = TMP_REG2;312}313314return push_inst(compiler, RLWNM | S(src1) | A(dst) | B(src2) | RLWI_MBE(0, 31));315}316317SLJIT_UNREACHABLE();318return SLJIT_SUCCESS;319}320321static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw init_value)322{323FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 16)));324return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value));325}326327static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,328sljit_s32 dst, sljit_sw dstw,329sljit_s32 src, sljit_sw srcw)330{331sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;332sljit_s32 invert_sign = 1;333334if (src == SLJIT_IMM) {335FAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ (sljit_sw)0x80000000));336src = TMP_REG1;337invert_sign = 0;338} else if (!FAST_IS_REG(src)) {339FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));340src = TMP_REG1;341}342343/* First, a special double precision floating point value is constructed:344(2^53 + (src xor (2^31)))345The upper 32 bits of this number is a constant, and the lower 32 bits346is simply the value of the source argument. The xor 2^31 operation adds3470x80000000 to the source argument, which moves it into the 0 - 0xffffffff348range. Finally we substract 2^53 + 2^31 to get the converted value. */349FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330));350if (invert_sign)351FAIL_IF(push_inst(compiler, XORIS | S(src) | A(TMP_REG1) | 0x8000));352FAIL_IF(push_inst(compiler, STW | S(TMP_REG2) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI));353FAIL_IF(push_inst(compiler, STW | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));354FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG1) | A(0) | 0x8000));355FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));356FAIL_IF(push_inst(compiler, STW | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));357FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG2) | A(SLJIT_SP) | TMP_MEM_OFFSET));358359FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2)));360361if (op & SLJIT_32)362FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)));363364if (dst & SLJIT_MEM)365return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);366return SLJIT_SUCCESS;367}368369static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,370sljit_s32 dst, sljit_sw dstw,371sljit_s32 src, sljit_sw srcw)372{373sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;374375if (src == SLJIT_IMM) {376FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));377src = TMP_REG1;378} else if (!FAST_IS_REG(src)) {379FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));380src = TMP_REG1;381}382383/* First, a special double precision floating point value is constructed:384(2^53 + src)385The upper 32 bits of this number is a constant, and the lower 32 bits386is simply the value of the source argument. Finally we substract 2^53387to get the converted value. */388FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330));389FAIL_IF(push_inst(compiler, STW | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));390FAIL_IF(push_inst(compiler, STW | S(TMP_REG2) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI));391392FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));393FAIL_IF(push_inst(compiler, STW | S(TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));394FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG2) | A(SLJIT_SP) | TMP_MEM_OFFSET));395396FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2)));397398if (op & SLJIT_32)399FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)));400401if (dst & SLJIT_MEM)402return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);403return SLJIT_SUCCESS;404}405406SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,407sljit_s32 freg, sljit_f64 value)408{409union {410sljit_s32 imm[2];411sljit_f64 value;412} u;413414CHECK_ERROR();415CHECK(check_sljit_emit_fset64(compiler, freg, value));416417u.value = value;418419if (u.imm[0] != 0)420FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0]));421if (u.imm[1] != 0)422FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1]));423424/* Saved in the same endianness. */425FAIL_IF(push_inst(compiler, STW | S(u.imm[0] != 0 ? TMP_REG1 : TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET));426FAIL_IF(push_inst(compiler, STW | S(u.imm[1] != 0 ? TMP_REG2 : TMP_ZERO) | A(SLJIT_SP) | (TMP_MEM_OFFSET + sizeof(sljit_s32))));427return push_inst(compiler, LFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);428}429430SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,431sljit_s32 freg, sljit_s32 reg)432{433sljit_s32 reg2 = 0;434435CHECK_ERROR();436CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));437438if (op & SLJIT_32) {439if (op == SLJIT_COPY32_TO_F32) {440FAIL_IF(push_inst(compiler, STW | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET));441return push_inst(compiler, LFS | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);442}443444FAIL_IF(push_inst(compiler, STFS | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET));445return push_inst(compiler, LWZ | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET);446}447448if (reg & REG_PAIR_MASK) {449reg2 = REG_PAIR_SECOND(reg);450reg = REG_PAIR_FIRST(reg);451}452453if (op == SLJIT_COPY_TO_F64) {454FAIL_IF(push_inst(compiler, STW | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI));455456if (reg2 != 0)457FAIL_IF(push_inst(compiler, STW | S(reg2) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));458else459FAIL_IF(push_inst(compiler, STFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));460461return push_inst(compiler, LFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);462}463464FAIL_IF(push_inst(compiler, STFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET));465466if (reg2 != 0)467FAIL_IF(push_inst(compiler, LWZ | S(reg2) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));468469return push_inst(compiler, LWZ | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI);470}471472SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)473{474sljit_ins *inst = (sljit_ins *)addr;475SLJIT_UNUSED_ARG(executable_offset);476477SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 0);478SLJIT_ASSERT((inst[0] & 0xfc1f0000) == ADDIS && (inst[1] & 0xfc000000) == ORI);479inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff);480inst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff);481SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1);482inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);483SLJIT_CACHE_FLUSH(inst, inst + 2);484}485486487