// multiply.dsa
// usage:
//
// include multiply "<relative path>"
//
// usage for multiply:
// push (arg1)
// push (arg0)
// call multiply::multiply
// pop (arg0)
// pop (arg1)

multiply:
	push bpr
	mov spr, bpr

	ldw bpr, rg0, 8  // load op 2
	ldw bpr, rg1, 12 // load op 1

_multiply_loop:
	add rg2, rg0, rg2
	dec rg1

	cmp rg1, zero
	jgt _multiply_loop

_multiply_end:
	stw rg2, bpr, 8

	mov bpr, spr
	pop bpr
	return

divmod:
	push bpr
	mov spr, bpr

	ldw bpr, rg1, 8  // load op 2
	ldw bpr, rg0, 12 // load op 1

	lli 0, rg3

_divmod_loop:
	cmp rg0, rg1
	jlt _divmod_end

	sub rg0, rg1, rg0
	inc rg3

	jmp _divmod_loop

_divmod_end:
	// store div in first arg
	// store mod in second arg
	stw rg3, bpr, 8
	stw rg0, bpr, 12

	mov bpr, spr
	pop bpr
	return
