summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2013-09-02 05:21:04 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2013-09-02 05:21:04 -0400
commitdcfacf911588255ce9d03ad2f0e5c57ee19b750a (patch)
treed084dd50bc394f663fee36e5f4327166a758afb9
parentacce13f31c25086ff75d34eeb5413b7ae7689087 (diff)
outer loop
-rw-r--r--iterjit.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/iterjit.c b/iterjit.c
index 5ef5157..d4d6689 100644
--- a/iterjit.c
+++ b/iterjit.c
@@ -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