Lines Matching full:jump
221 static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code)
229 if (jump->flags & (SLJIT_REWRITABLE_JUMP | IS_CALL))
232 if (jump->flags & SLJIT_REWRITABLE_JUMP)
236 if (jump->flags & JUMP_ADDR)
237 target_addr = jump->u.target;
239 SLJIT_ASSERT(jump->flags & JUMP_LABEL);
240 target_addr = (sljit_uw)(code + jump->u.label->size);
242 inst = (sljit_ins*)jump->addr;
243 if (jump->flags & IS_COND)
247 if (jump->flags & IS_CALL)
252 if (jump->flags & IS_MOVABLE) {
255 jump->flags |= PATCH_B;
257 if (!(jump->flags & IS_COND)) {
259 inst[-1] = (jump->flags & IS_JAL) ? BAL : B;
260 jump->addr -= sizeof(sljit_ins);
265 inst[-1] = saved_inst ^ invert_branch(jump->flags);
266 jump->addr -= 2 * sizeof(sljit_ins);
273 jump->flags |= PATCH_B;
275 if (!(jump->flags & IS_COND)) {
276 inst[0] = (jump->flags & IS_JAL) ? BAL : B;
280 inst[0] = inst[0] ^ invert_branch(jump->flags);
282 jump->addr -= sizeof(sljit_ins);
287 if (jump->flags & IS_COND) {
288 if ((jump->flags & IS_MOVABLE) && (target_addr & ~0xfffffff) == ((jump->addr + 2 * sizeof(sljit_ins)) & ~0xfffffff)) {
289 jump->flags |= PATCH_J;
297 else if ((target_addr & ~0xfffffff) == ((jump->addr + 3 * sizeof(sljit_ins)) & ~0xfffffff)) {
298 jump->flags |= PATCH_J;
303 jump->addr += sizeof(sljit_ins);
309 if ((jump->flags & IS_MOVABLE) && (target_addr & ~0xfffffff) == (jump->addr & ~0xfffffff)) {
310 jump->flags |= PATCH_J;
312 inst[-1] = (jump->flags & IS_JAL) ? JAL : J;
313 jump->addr -= sizeof(sljit_ins);
317 if ((target_addr & ~0xfffffff) == ((jump->addr + sizeof(sljit_ins)) & ~0xfffffff)) {
318 jump->flags |= PATCH_J;
319 inst[0] = (jump->flags & IS_JAL) ? JAL : J;
328 jump->flags |= PATCH_ABS32;
329 if (jump->flags & IS_COND) {
338 jump->flags |= PATCH_ABS48;
339 if (jump->flags & IS_COND) {
370 struct sljit_jump *jump;
384 jump = compiler->jumps;
392 SLJIT_ASSERT(!jump || jump->addr >= word_count);
401 if (jump && jump->addr == word_count) {
403 jump->addr = (sljit_uw)(code_ptr - 3);
405 jump->addr = (sljit_uw)(code_ptr - 7);
407 code_ptr = detect_jump_type(jump, code_ptr, code);
408 jump = jump->next;
429 SLJIT_ASSERT(!jump);
433 jump = compiler->jumps;
434 while (jump) {
436 addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;
437 buf_ptr = (sljit_ins*)jump->addr;
439 if (jump->flags & PATCH_B) {
440 addr = (sljit_sw)(addr - (jump->addr + sizeof(sljit_ins))) >> 2;
445 if (jump->flags & PATCH_J) {
446 SLJIT_ASSERT((addr & ~0xfffffff) == ((jump->addr + sizeof(sljit_ins)) & ~0xfffffff));
456 if (jump->flags & PATCH_ABS32) {
461 else if (jump->flags & PATCH_ABS48) {
475 jump = jump->next;
1635 struct sljit_jump *jump;
1643 jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1644 PTR_FAIL_IF(!jump);
1645 set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
1705 jump->flags |= flags;
1707 jump->flags |= IS_MOVABLE;
1715 jump->addr = compiler->size;
1720 jump->flags |= IS_JAL | (type >= SLJIT_CALL0 ? IS_CALL : 0);
1722 jump->addr = compiler->size;
1726 return jump;
1753 struct sljit_jump *jump;
1774 jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1775 PTR_FAIL_IF(!jump);
1776 set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
1782 jump->flags |= IS_BIT26_COND;
1784 jump->flags |= IS_MOVABLE;
1794 jump->flags |= IS_BIT26_COND;
1798 jump->flags |= IS_BIT26_COND;
1802 jump->flags |= IS_BIT16_COND;
1806 jump->flags |= IS_BIT16_COND;
1816 jump->flags |= IS_BIT16_COND;
1820 jump->flags |= IS_BIT16_COND;
1824 jump->flags |= IS_BIT26_COND;
1828 jump->flags |= IS_BIT26_COND;
1856 jump->flags |= IS_BIT26_COND;
1862 jump->addr = compiler->size;
1864 return jump;
1874 struct sljit_jump *jump;
1898 jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1899 PTR_FAIL_IF(!jump);
1900 set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
1901 jump->flags |= IS_BIT16_COND;
1944 jump->addr = compiler->size;
1946 return jump;
1961 struct sljit_jump *jump = NULL;
1996 jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1997 FAIL_IF(!jump);
1998 set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_JAL : 0));
1999 jump->u.target = srcw;
2002 jump->flags |= IS_MOVABLE;
2010 if (jump)
2011 jump->addr = compiler->size;