Lines Matching full:jump
224 static SLJIT_INLINE sljit_si detect_jump_type(struct sljit_jump *jump, sljit_uh *code_ptr, sljit_uh *code)
228 if (jump->flags & SLJIT_REWRITABLE_JUMP)
231 if (jump->flags & JUMP_ADDR) {
233 if (!(jump->u.target & 0x1))
235 diff = ((sljit_sw)jump->u.target - (sljit_sw)(code_ptr + 2)) >> 1;
238 SLJIT_ASSERT(jump->flags & JUMP_LABEL);
239 diff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)(code_ptr + 2)) >> 1;
242 if (jump->flags & IS_COND) {
243 SLJIT_ASSERT(!(jump->flags & IS_BL));
245 jump->flags |= PATCH_TYPE1;
249 jump->flags |= PATCH_TYPE2;
255 jump->flags |= PATCH_TYPE3;
259 else if (jump->flags & IS_BL) {
261 jump->flags |= PATCH_BL;
267 jump->flags |= PATCH_TYPE4;
271 jump->flags |= PATCH_TYPE5;
279 static SLJIT_INLINE void set_jump_instruction(struct sljit_jump *jump)
281 sljit_si type = (jump->flags >> 4) & 0xf;
287 modify_imm32_const((sljit_uh*)jump->addr, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target);
291 if (jump->flags & JUMP_ADDR) {
292 SLJIT_ASSERT(jump->u.target & 0x1);
293 diff = ((sljit_sw)jump->u.target - (sljit_sw)(jump->addr + 4)) >> 1;
296 diff = ((sljit_sw)(jump->u.label->addr) - (sljit_sw)(jump->addr + 4)) >> 1;
297 jump_inst = (sljit_uh*)jump->addr;
302 SLJIT_ASSERT(diff <= 127 && diff >= -128 && (jump->flags & IS_COND));
303 jump_inst[0] = 0xd000 | (jump->flags & 0xf00) | (diff & 0xff);
307 SLJIT_ASSERT(diff <= 524287 && diff >= -524288 && (jump->flags & IS_COND));
308 jump_inst[0] = 0xf000 | COPY_BITS(jump->flags, 8, 6, 4) | COPY_BITS(diff, 11, 0, 6) | COPY_BITS(diff, 19, 10, 1);
312 SLJIT_ASSERT(jump->flags & IS_COND);
313 *jump_inst++ = IT | ((jump->flags >> 4) & 0xf0) | 0x8;
319 SLJIT_ASSERT(diff <= 1023 && diff >= -1024 && !(jump->flags & IS_COND));
352 struct sljit_jump *jump;
366 jump = compiler->jumps;
376 SLJIT_ASSERT(!jump || jump->addr >= half_count);
383 if (jump && jump->addr == half_count) {
384 jump->addr = (sljit_uw)code_ptr - ((jump->flags & IS_COND) ? 10 : 8);
385 code_ptr -= detect_jump_type(jump, code_ptr, code);
386 jump = jump->next;
406 SLJIT_ASSERT(!jump);
410 jump = compiler->jumps;
411 while (jump) {
412 set_jump_instruction(jump);
413 jump = jump->next;
1898 struct sljit_jump *jump;
1904 jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1905 PTR_FAIL_IF(!jump);
1906 set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
1912 jump->flags |= IS_COND;
1914 jump->flags |= cc << 8;
1918 jump->addr = compiler->size;
1922 jump->flags |= IS_BL;
1926 return jump;
1931 struct sljit_jump *jump;
1947 jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1948 FAIL_IF(!jump);
1949 set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0));
1950 jump->u.target = srcw;
1953 jump->addr = compiler->size;