diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-09-02 05:21:04 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-09-02 05:21:04 -0400 |
commit | dcfacf911588255ce9d03ad2f0e5c57ee19b750a (patch) | |
tree | d084dd50bc394f663fee36e5f4327166a758afb9 | |
parent | acce13f31c25086ff75d34eeb5413b7ae7689087 (diff) |
outer loop
-rw-r--r-- | iterjit.c | 44 |
1 files changed, 29 insertions, 15 deletions
@@ -190,25 +190,39 @@ dest_iter_create_a8r8g8b8 (jit_dest_iter_t *dest) } void -generate_kernel (jit_src_iter_t *src_iter, +generate_kernel (jit_t *jit, + jit_src_iter_t *src_iter, jit_src_iter_t *mask_iter, jit_dest_iter_t *dest_iter, jit_combiner_t *combiner) { - /* This function does - * - * src_iter->setup(); - * mask_iter->setup(); - * dest_iter->setup(); - * while (height--) - * { - * dest_iter->process_line ( - * dest_iter, src_iter, mask_iter, combiner); - * } - * dest_iter->end(); - * mask_iter->end(); - * src_iter->end(); - */ + reg_context_t context; + op_t h = reg_context_alloc (&context, jit->fragment); + + src_iter->begin (src_iter, jit); + if (mask_iter) + mask_iter->begin (mask_iter, jit); + dest_iter->begin (dest_iter, jit); + + BEGIN_ASM (jit->fragment) + I_test, h, h, + I_jz, LABEL ("done"), + DEFINE_LABEL ("outer_loop"), + END_ASM (); + + dest_iter->process_line (dest_iter, jit, + src_iter, mask_iter, combiner); + + BEGIN_ASM (jit->fragment) + I_sub, h, IMM (1), + I_jnz, LABEL ("outer_loop"), + DEFINE_LABEL ("done"), + END_ASM (); + + dest_iter->end (dest_iter, jit); + if (mask_iter) + mask_iter->end (mask_iter, jit); + src_iter->end (src_iter, jit); } int |