//    Copyright (C) 2015   Martin Dames <martin@bastionbytes.de>
//  
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 2 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License along
//    with this program; if not, write to the Free Software Foundation, Inc.,
//    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// optimized division (using only "add" and "sub")
//
params=r:$a,rv:$b
work=$f,$s,$xf,$h,$k
---

// xf = 0;
set $xf,0
        
// while(a >= b) {
:loop1_start
cmp $a,$b
jb loop1_ende

//     f = 1;
set $f,1

//     s = b;
set $s,$b

//     h = s;
set $h,$s

//     h += s;
add $h,$s
            
//     while(h < a) {
:loop2_start
cmp $h,$a
jge loop2_ende

//         k = f;
set $k,$f

//         f += k;
add $f,$k

//         s = h;
set $s,$h

//         h += s;
add $h,$s

//     }
jmp loop2_start
:loop2_ende

//     a -= s;
sub $a,$s
           
//     xf += f;
add $xf,$f

// }
jmp loop1_start
:loop1_ende
            
// a = xf;
set $a,$xf
        