1f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* 2f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Stack-less Just-In-Time compiler 3f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * 4f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Copyright 2009-2012 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. 5f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * 6f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Redistribution and use in source and binary forms, with or without modification, are 7f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * permitted provided that the following conditions are met: 8f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * 9f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * 1. Redistributions of source code must retain the above copyright notice, this list of 10f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * conditions and the following disclaimer. 11f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * 12f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * 2. Redistributions in binary form must reproduce the above copyright notice, this list 13f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * of conditions and the following disclaimer in the documentation and/or other materials 14f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * provided with the distribution. 15f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * 16f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY 17f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 19f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 21f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 22f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich */ 26f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 27f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst, sljit_sw imm) 28f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 29f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (imm <= SIMM_MAX && imm >= SIMM_MIN) 30f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, OR | D(dst) | S1(0) | IMM(imm), DR(dst)); 31f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 32f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SETHI | D(dst) | ((imm >> 10) & 0x3fffff), DR(dst))); 33f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return (imm & 0x3ff) ? push_inst(compiler, OR | D(dst) | S1(dst) | IMM_ARG | (imm & 0x3ff), DR(dst)) : SLJIT_SUCCESS; 34f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 35f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 36f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define ARG2(flags, src2) ((flags & SRC2_IMM) ? IMM(src2) : S2(src2)) 37f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 38f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, 39f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sljit_si dst, sljit_si src1, sljit_sw src2) 40f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 41f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_COMPILE_ASSERT(ICC_IS_SET == SET_FLAGS, icc_is_set_and_set_flags_must_be_the_same); 42f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 43f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch (op) { 44f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MOV: 45f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MOV_UI: 46f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MOV_SI: 47f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MOV_P: 48f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); 49f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (dst != src2) 50f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, OR | D(dst) | S1(0) | S2(src2), DR(dst)); 51f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return SLJIT_SUCCESS; 52f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 53f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MOV_UB: 54f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MOV_SB: 55f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); 56f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { 57f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (op == SLJIT_MOV_UB) 58f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, AND | D(dst) | S1(src2) | IMM(0xff), DR(dst)); 59f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(24), DR(dst))); 60f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, SRA | D(dst) | S1(dst) | IMM(24), DR(dst)); 61f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 62f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (dst != src2) 63f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_ASSERT_STOP(); 64f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return SLJIT_SUCCESS; 65f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 66f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MOV_UH: 67f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MOV_SH: 68f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); 69f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { 70f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(16), DR(dst))); 71f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, (op == SLJIT_MOV_SH ? SRA : SRL) | D(dst) | S1(dst) | IMM(16), DR(dst)); 72f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 73f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (dst != src2) 74f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_ASSERT_STOP(); 75f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return SLJIT_SUCCESS; 76f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 77f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_NOT: 78f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); 79f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, XNOR | (flags & SET_FLAGS) | D(dst) | S1(0) | S2(src2), DR(dst) | (flags & SET_FLAGS)); 80f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 81f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_CLZ: 82f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); 83f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* sparc 32 does not support SLJIT_KEEP_FLAGS. Not sure I can fix this. */ 84f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(src2) | S2(0), SET_FLAGS)); 85f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, OR | D(TMP_REG1) | S1(0) | S2(src2), DR(TMP_REG1))); 86f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, BICC | DA(0x1) | (7 & DISP_MASK), UNMOVABLE_INS)); 87f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, OR | (flags & SET_FLAGS) | D(dst) | S1(0) | IMM(32), UNMOVABLE_INS | (flags & SET_FLAGS))); 88f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, OR | D(dst) | S1(0) | IMM(-1), DR(dst))); 89f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 90f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Loop. */ 91f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(TMP_REG1) | S2(0), SET_FLAGS)); 92f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SLL | D(TMP_REG1) | S1(TMP_REG1) | IMM(1), DR(TMP_REG1))); 93f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, BICC | DA(0xe) | (-2 & DISP_MASK), UNMOVABLE_INS)); 94f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, ADD | (flags & SET_FLAGS) | D(dst) | S1(dst) | IMM(1), UNMOVABLE_INS | (flags & SET_FLAGS)); 95f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 96f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_ADD: 97f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, ADD | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); 98f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 99f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_ADDC: 100f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, ADDC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); 101f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 102f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_SUB: 103f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, SUB | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); 104f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 105f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_SUBC: 106f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, SUBC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); 107f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 108f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_MUL: 109f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SMUL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); 110f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (!(flags & SET_FLAGS)) 111f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return SLJIT_SUCCESS; 112f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(dst) | IMM(31), DR(TMP_REG1))); 113f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, RDY | D(TMP_LINK), DR(TMP_LINK))); 114f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(TMP_REG1) | S2(TMP_LINK), MOVABLE_INS | SET_FLAGS); 115f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 116f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_AND: 117f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, AND | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); 118f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 119f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_OR: 120f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, OR | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); 121f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 122f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_XOR: 123f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, XOR | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); 124f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 125f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_SHL: 126f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); 127f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS); 128f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 129f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_LSHR: 130f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SRL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); 131f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS); 132f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 133f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case SLJIT_ASHR: 134f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SRA | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); 135f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS); 136f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 137f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 138f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_ASSERT_STOP(); 139f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return SLJIT_SUCCESS; 140f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 141f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 142f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic SLJIT_INLINE sljit_si emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw init_value) 143f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 144f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_IF(push_inst(compiler, SETHI | D(dst) | ((init_value >> 10) & 0x3fffff), DR(dst))); 145f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return push_inst(compiler, OR | D(dst) | S1(dst) | IMM_ARG | (init_value & 0x3ff), DR(dst)); 146f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 147f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 148f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr) 149f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 150f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sljit_ins *inst = (sljit_ins*)addr; 151f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 152f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich inst[0] = (inst[0] & 0xffc00000) | ((new_addr >> 10) & 0x3fffff); 153f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich inst[1] = (inst[1] & 0xfffffc00) | (new_addr & 0x3ff); 154f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_CACHE_FLUSH(inst, inst + 2); 155f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 156f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 157f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant) 158f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 159f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sljit_ins *inst = (sljit_ins*)addr; 160f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 161f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich inst[0] = (inst[0] & 0xffc00000) | ((new_constant >> 10) & 0x3fffff); 162f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich inst[1] = (inst[1] & 0xfffffc00) | (new_constant & 0x3ff); 163f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SLJIT_CACHE_FLUSH(inst, inst + 2); 164f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 165