1 #include "../video_utils_p6.h"
10 .type uvlc_encode, %function
17 r3 : not_last (do not modify)
22 stmdb sp!, {r4, r5, lr} /* save regiter on the stack */
24 mov ip, r2 /* ip = run */
25 clz r4, ip /* r4 = clz(run) */
27 movs lr, r1 /* lr = level */
28 rsbmi lr, lr, #0 /* lr = |level| */
30 movpl r5, #0 /* save sign value */
31 mov r1, #1 /* value_code = 1 */
35 rsbs r4, r4, #31 /* length = 31 - clz(run) */
36 subgt ip, ip, r1, lsl r4 /* run = run - (1 << length) */
38 add r2, r4, #1 /* value_length = length + 1 */
40 orrgt r1, ip, r1, lsl r4
46 rsbs r4, r4, #31 /* r4 = 31 - clz(level) number of bits used in level */
47 subgt lr, ip, lsl r4 /* code -= (1 << length) */
50 add r2, r2, r4 /* value_length += length */
51 orr r1, ip, r1, lsl r4 /* value_code = 1 | (value_code << length) */
53 addgt r2, r2, r4 /* value_length += length */
54 orrgt r1, lr, r1, lsl r4 /* value_code = code | (value_code << length) */
56 orr r1, r5, r1, lsl #1
58 /* Serialize not_last if needed */
59 ldmia sp!, {r4, r5, lr} /* restore saved registers */
62 addeq r2, r2, #3 /* value_length += 3 */
64 orreq r1, ip, r1, lsl #3 /* value_code = 0x5 | (value_code << 3) */
66 b video_write_data /* jump to video_write_data to serialize data */