advent-of-sh/day1.s
2023-12-27 23:56:57 +08:00

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: