.global _start _start: mov #0,r0 lds r0,fpscr /* single-precision mode */ parse_lines: _pointers: mova input_start,r0 mov r0,r14 /* r14: pointer to input start */ mov.l input_end,r0 mov r0,r15 /* r15: pointer to input end */ _constants: fldi1 fr1 /* fr1: const 1 */ fldi1 fr2 fneg fr2 /* fr2: const -1 */ fldi0 fr3 /* fr3: const 0 */ _accumulator: fldi0 fr9 /* fr9: sum of all values */ _ascii_characters: /* alternative sequence mov #'\n',r10 lds r10,fpul float fpul,fr10 /* fr10: newline (10) / mov #('0'-1),r10 lds r10,fpul float fpul,fr11 /* fr11: zero-1 (47) / mov #'9',r10 lds r10,fpul float fpul,fr12 /* fr12: nine (57) / fmov fr11,fr13 fadd fr1,fr13 /* fr13: zero (48) / */ /* the less efficient sequence that uses more floating point /* instructions: */ mova _ascii_newline,r0 fmov.s @r0+,fr0 flds fr0,fpul float fpul,fr10 /* fr10: newline (10) */ fmov.s @r0+,fr0 flds fr0,fpul float fpul,fr11 /* fr11: zero (48) */ fmov fr11,fr12 fsub fr1,fr12 /* fr12: zero-1 (47) */ fmov.s @r0+,fr0 flds fr0,fpul float fpul,fr13 /* fr13: nine (57) */ bra parse_line nop .align 4 _ascii_newline: .byte '\n', 0, 0, 0 _ascii_zero: .byte '0' , 0, 0, 0 _ascii_nine: .byte '9' , 0, 0, 0 parse_line: _parse_line_init: fldi1 fr14 fneg fr14 /* fr14: digit0 (-1) */ fldi1 fr15 fneg fr15 /* fr15: digit1 (-1) */ _parse_line_loop: mov.b @r14+,r1 /* r1 = *r14++ */ lds r1,fpul float fpul,fr0 /* fr0 = (float)r1 */ fcmp/eq fr0,fr10 /* fr0 == '\n' */ bt _parse_line_loop_exit fcmp/eq fr3,fr10 /* fr0 == 0 */ bt _parse_line_loop_exit parse_num: fcmp/gt fr12,fr0 /* fr0 >= '0' */ bf _parse_line_loop fcmp/gt fr13,fr0 /* fr0 > '9' */ bt _parse_line_loop fsub fr11,fr0 /* fr0 -= '0' */ fcmp/eq fr14,fr2 /* fr14 == -1 */ bf _first_seen fmov fr0,fr14 _first_seen: fmov fr0,fr15 bra _parse_line_loop nop _parse_line_loop_exit: fcmp/eq fr14,fr2 bt _parse_line_empty_line /* coincidentally, ascii newline is also 10, which is exactly /* the desired constant here */ fmul fr10,fr14 /* fr14 *= 10 */ fadd fr14,fr9 fadd fr15,fr9 _parse_line_empty_line: _parse_line_next_line: cmp/eq r14,r15 bf parse_line loop: bra loop nop .align 4 sample_input_start: .ascii "1abc2\n" .ascii "pqr3stu8vwx\n" .ascii "a1b2c3d4e5f\n" .ascii "treb7uchet\n" .align 4, '\n' sample_input_end: input_end: .long _input_end input_start: .incbin "input.txt" _input_end: