Division 36/18 = 36 Bit und Fehlerstatus

Division von 36/18 Bit ohne Vorzeichen

Operandenhighlow
Dividendr12r13
Divisor r15
Ergebnisshighlow
Quotientr12r13
Rest r15
Fehler bei != 0 r14


;
; Dividieren von 36 Bit Werten durch 18 Bit Werte ohne Vorzeichen
;
div3618:
;                im Aufruf        intern  
; Dividend :     R12 | R13        R4 | R5    (High | Low)
; Divisor :            R15             R7
; Quotient :     R12 | R13        R4 | R5
; Rest:                R15             R7
; Fehler:              R14             R6    != 0
;
; Anzahl der Zyklen laden
                movi    r15,    18              ; nicht 18+1, da in divz0 immer +1
; Übertrag Dividend löschen
                xor     r8,     r8
; Quotient low löschen
                xor     r10,    r10
; 1. Kopie von Dividend bilden
                MOV     R12,    R4
                MOV     R13,    R5
                xor     r4,     r4              ; Quotient High löschen
; Divisor solange links schieben, bis MSB eine 1 ist und
; mit jedem Schritt die Zyklenzahl erhöhen.
                movi    r6,     1               ; Fehler für Division durch 0
                beqz    r7,     err0
divz0:          mov     r5,     r7              ; Kopie von r7 nach r5
                slli    r7,     1
                addi    r15,    1               ; Anzahl der Divzyklen + 1
                beqzc   divz0                   ; MSB war noch 0
                mov     r7,     r5              ; Wert mit MSB = 1 noch in R5
                mov     r5,     r15
                addi    r5,     -19             ; Anzahl der Zyklen, die der Rest zurück muss.
; 2. Differenz High Dividend und Divisor bilden
divz:           mov     r9,     r8              ; ist immer teilbar wenn Dividend Übertrag hatte
                bnez    r8,     ydiv
                SLTU    R12,    R7              ; teilbar ?  Ja -> cc = 0
                movi    r9,     0               ; r9 = 1 wenn teilbar
                bnezc   nodiv                   ; 
                movi    r9,     1               ; r9 = 1 wenn teilbar
ydiv:           SUBU    R12,    R7              ; Differenz bilden wenn teilbar
nodiv:          addi    r15,    -1              ; Zyklenzahl - 1
; Ergebnis in den Quotient schieben
                slli    r4,     1
                slli    r10,    1
                movs2i  r6,     SFR_CC          ; r6 = höchtes Bit des Quotient low
                addu    r4,     r6              ; in den Quotent high eintragern.
                addu    r10,    r9              ; Divisionsergebnis addieren
                beqz    r15,    divend
; Dividend low linksschieben
                slli    r13,    1
                movs2i  r9,     SFR_CC          ; Übertrag merken
; Dividend high linksschieben
                slli    r12,    1
                movs2i  r8,     SFR_CC          ; Übertrag merken
                addu    r12,    r9              ; Übertrag low einfügen
;
                j       divz
;
divend:         xor     r6,     r6
;
; Rest um die Anzahl in r5 nach rechts schieben
;
rest_pos:       beqz    r5,     err0
                srli    r12,    1
                addi    r5,     -1
                j       rest_pos
;
err0:           mov     r5,     r10             ; Quotient
                mov     r7,     r12             ; Rest
                jrs     r11
;


Testprogramm: Ass-Quelle, Liste, Protokoll
SPHO-Format Start mit "G" im Monitor.

Include Datei für das Programm: spartan_equ.inc

UP d361836 als Macro

Include Dateien für das Macro: d361836um.inc

Testprogramm: Ass-Quelle, Liste, SPHO-Format Start mit "G" im Monitor.


SpartanMC