127 lines
2.4 KiB
ArmAsm
127 lines
2.4 KiB
ArmAsm
.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:
|