function: render_frame (entry: bb_0x34)

loops: 1 (0 with a derived trip count; max nesting depth 1)
  iters = executions of a block per single call of render_frame (product of enclosing trip counts);
  ? = not derivable from the code — treat that block's cost as per-iteration, not per-call.
  A block with no iters annotation is in no loop and runs once per call.
  L1  loop  header bb_0x5e  latch bb_0x48  depth 1  blocks 2  trips ?  (limit is not an immediate compare)

[render_frame_0x34] 0x34-0x48  (entry)
source: blink_post.c:48:48;
  push {r7, lr}
  sub sp, #0x10
  add r7, sp, #0
  str r0, [r7, #4]
  str r1, [r7]
  movs r3, #0
  str r3, [r7, #8]
  movs r3, #0
  str r3, [r7, #0xc]
  b #0x5e
  -> bb_0x5e

[render_frame_0x48] 0x48-0x5e  (in L1, iters=?)
source: blink_post.c:48:53;
  ldr r3, [r7, #0xc]
  ldr r2, [r7, #4]
  adds r3, r2, r3
  ldrb r3, [r3]
  movs r2, r3
  ldr r3, [r7, #8]
  adds r3, r3, r2
  str r3, [r7, #8]
  ldr r3, [r7, #0xc]
  adds r3, #1
  str r3, [r7, #0xc]
  -> bb_0x5e (back-edge, loop L1)

[render_frame_0x5e] 0x5e-0x66  (loop-header L1, trips=?, iters=?)
source: blink_post.c:53:53;
  ldr r2, [r7, #0xc]
  ldr r3, [r7]
  cmp r2, r3
  blt #0x48
  -> bb_0x48 (lt=taken), bb_0x66 (ge=fallthrough)

[render_frame_0x66] 0x66-0x74  (exit)
source: blink_post.c:53:53;
  ldr r3, [pc, #0xc]
  ldr r2, [r7, #8]
  str r2, [r3]
  mov r8, r8
  mov sp, r7
  add sp, #0x10
  pop {r7, pc}

------------------------------------------------------------

function: build_pattern (entry: bb_0x78)

loops: 1 (0 with a derived trip count; max nesting depth 1)
  iters = executions of a block per single call of build_pattern (product of enclosing trip counts);
  ? = not derivable from the code — treat that block's cost as per-iteration, not per-call.
  A block with no iters annotation is in no loop and runs once per call.
  L1  loop  header bb_0xba  latch bb_0x8a  depth 1  blocks 2  trips ?  (limit is not an immediate compare)

[build_pattern_0x78] 0x78-0x8a  (entry)
source: blink_post.c:52:53;
  push {r7, lr}
  ldr r7, [pc, #0x64]
  add sp, r7
  add r7, sp, #0
  movs r3, #0
  ldr r2, [pc, #0x60]
  adds r2, r7, r2
  str r3, [r2]
  b #0xba
  -> bb_0xba

[build_pattern_0x8a] 0x8a-0xba  (in L1, iters=?)
source: blink_post.c:52:55;
  ldr r0, [pc, #0x58]
  adds r3, r7, r0
  ldr r3, [r3]
  uxtb r3, r3
  adds r2, r3, #0
  lsls r2, r2, #5
  subs r3, r2, r3
  uxtb r3, r3
  adds r3, #7
  uxtb r1, r3
  ldr r3, [pc, #0x48]
  ldr r2, [pc, #0x48]
  adds r3, r3, r2
  adds r2, r3, r7
  adds r3, r7, r0
  ldr r3, [r3]
  adds r3, r2, r3
  adds r2, r1, #0
  strb r2, [r3]
  adds r3, r7, r0
  ldr r3, [r3]
  adds r3, #1
  adds r2, r7, r0
  str r3, [r2]
  -> bb_0xba (back-edge, loop L1)

[build_pattern_0xba] 0xba-0xc8  (loop-header L1, trips=?, iters=?)
source: blink_post.c:55:60;
  ldr r3, [pc, #0x28]
  adds r3, r7, r3
  ldr r2, [r3]
  movs r3, #0xc0
  lsls r3, r3, #4
  cmp r2, r3
  blt #0x8a
  -> bb_0x8a (lt=taken), bb_0xc8 (ge=fallthrough)

[build_pattern_0xc8] 0xc8-0xd2
source: blink_post.c:60:60;
  movs r3, #0xc0
  lsls r2, r3, #4
  adds r3, r7, #4
  movs r1, r2
  movs r0, r3
  -> bb_0xd2

[build_pattern_0xd2] 0xd2-0xd6  (external-call render_frame)
source: blink_post.c:60:60;
  bl #0xd2
  -> bb_0xd6

[build_pattern_0xd6] 0xd6-0xe0  (exit)
source: blink_post.c:60:65;
  mov r8, r8
  mov sp, r7
  ldr r3, [pc, #0x10]
  add sp, r3
  pop {r7, pc}

------------------------------------------------------------

function: kernel_main (entry: bb_0xf0)

loops: 3 (0 with a derived trip count; max nesting depth 2)
  iters = executions of a block per single call of kernel_main (product of enclosing trip counts);
  ? = not derivable from the code — treat that block's cost as per-iteration, not per-call.
  A block with no iters annotation is in no loop and runs once per call.
  L1  loop  header bb_0x10c  latch bb_0x158  depth 1  blocks 8  trips ?  (no exit test inside the loop — exit is unconditional or indirect)
  L2  loop  header bb_0x122  latch bb_0x118  depth 2  in L1  blocks 2  trips ?  (limit is not an immediate compare)
  L3  loop  header bb_0x14e  latch bb_0x144  depth 2  in L1  blocks 2  trips ?  (limit is not an immediate compare)

[kernel_main_0xf0] 0xf0-0x10c  (entry)
source: blink_post.c:65:71;
  push {r7, lr}
  add r7, sp, #0
  ldr r3, [pc, #0x74]
  ldr r2, [pc, #0x78]
  str r2, [r3]
  ldr r3, [pc, #0x70]
  ldr r3, [r3]
  ldr r2, [r3]
  ldr r3, [pc, #0x68]
  ldr r3, [r3]
  movs r1, #0x80
  lsls r1, r1, #3
  orrs r2, r1
  str r2, [r3]
  -> bb_0x10c

[kernel_main_0x10c] 0x10c-0x110  (loop-header L1, trips=?, iters=?, external-call build_pattern)
source: blink_post.c:71:71;
  bl #0x10c
  -> bb_0x110

[kernel_main_0x110] 0x110-0x118  (in L1, iters=?)
source: blink_post.c:71:71;
  ldr r3, [pc, #0x60]
  movs r2, #0
  str r2, [r3]
  b #0x122
  -> bb_0x122

[kernel_main_0x118] 0x118-0x122  (in L2, iters=?)
source: blink_post.c:71:71;
  ldr r3, [pc, #0x58]
  ldr r3, [r3]
  adds r2, r3, #1
  ldr r3, [pc, #0x54]
  str r2, [r3]
  -> bb_0x122 (back-edge, loop L2)

[kernel_main_0x122] 0x122-0x12c  (loop-header L2, trips=?, in L1, iters=?)
source: blink_post.c:71:75;
  ldr r3, [pc, #0x50]
  ldr r3, [r3]
  ldr r2, [pc, #0x50]
  cmp r3, r2
  bls #0x118
  -> bb_0x118 (ls=taken), bb_0x12c (hi=fallthrough)

[kernel_main_0x12c] 0x12c-0x144  (in L1, iters=?)
source: blink_post.c:63:75;
  ldr r3, [pc, #0x3c]
  ldr r2, [pc, #0x4c]
  str r2, [r3]
  ldr r3, [pc, #0x38]
  ldr r3, [r3]
  movs r2, #0x80
  lsls r2, r2, #3
  str r2, [r3]
  ldr r3, [pc, #0x34]
  movs r2, #0
  str r2, [r3]
  b #0x14e
  -> bb_0x14e

[kernel_main_0x144] 0x144-0x14e  (in L3, iters=?)
source: blink_post.c:63:63;
  ldr r3, [pc, #0x2c]
  ldr r3, [r3]
  adds r2, r3, #1
  ldr r3, [pc, #0x28]
  str r2, [r3]
  -> bb_0x14e (back-edge, loop L3)

[kernel_main_0x14e] 0x14e-0x158  (loop-header L3, trips=?, in L1, iters=?)
source: blink_post.c:63:63;
  ldr r3, [pc, #0x24]
  ldr r3, [r3]
  ldr r2, [pc, #0x24]
  cmp r3, r2
  bls #0x144
  -> bb_0x144 (ls=taken), bb_0x158 (hi=fallthrough)

[kernel_main_0x158] 0x158-0x16a  (in L1, iters=?)
  ldr r3, [pc, #0x10]
  ldr r2, [pc, #0x24]
  str r2, [r3]
  ldr r3, [pc, #0xc]
  ldr r3, [r3]
  movs r2, #0x80
  lsls r2, r2, #3
  str r2, [r3]
  b #0x10c
  -> bb_0x10c (back-edge, loop L1)

[kernel_main_0x16a] 0x16a-0x16c  (exit)
  mov r8, r8
