Multiplikation 18*18 = 36 Bit ohne Vorzeichen

Multiplikation von 18 Bit ohne Vorzeichen

Operandenhighlow
Faktor 1 r13
Faktor 2 r15
Ergebnisshighlow
Produktr12r13


Das Unterprogramm benötigt eine 36 Bit Addition ohne Overflow Behandlung. Diese Funktion wird durch das Unterprogramm addu36 bereitgestellt, welches sich auch in den folgenden Zeilen befindet. Es entspricht dem UP add36 aber hat keine Overflow Behandlung. Für die Multiplikation werden 6 Speicherplätze mit 18 Bit benötigt. Dadurch ist die Multiplikation auch nutzbar, wenn die Schiebebefehle nur mit einfachem Schieben implementiert ist indem das Verschieben mit 9 Bit Zugriffen auf den Speicher realisiert ist.

;
; UP Berechnung von r13 * r15 mit einer 9 Bit Blockmultiplikation
;
mulu:
;               im Aufruf       intern  
; Faktor 1:     R13             R5
; Faktor 2:     R15             R7
;               Rückgabe        intern
; Ergebnis :    R12 | R13       R4 | R5  (High | Low)
;
; 18 Bit ohne Vorzeichen durch Blockmultiplikation von 4 * 9 Bit.
;  9 Bit Schieben durch Multiplikation mit 2^9
;
;         Alow  *  Blow
;  +      Ahigh *  Blow  * 2^9
;  +      Alow  *  Bhigh * 2^9
;  +      Ahigh *  Bhigh * 2^18
; ------------------------------
;         Produkt in 36 Bit
;
                lhi     r8,     op1 >> 9
                ori     r8,     op1 & 0x1ff
                xor     r9,     r9
                s18     4(r8),  r9              ; produkthigh löschen
                s18     6(r8),  r9              ; produktlow  löschen
                s18     8(r8),  r9              ; temp_high   löschen
                s18     10(r8), r9              ; temp_low    löschen
                lhi     r10,    1               ; 2^9
;
; Operanden im Speicher ablegen.
;
                s18     0(r8),  r5
                s18     2(r8),  r7
;
;   Alow * Blow bilden und in produktlow speichern
;
                l9      r5,     1(r8)           ; Alow
                l9      r6,     3(r8)           ; Blow
                mul     r5,     r6
                s18     6(r8),  r5              ; 1. Teilprodukt speichern
;
;   Ahigh * Blow * 2^9 bilden und in temp speichern
;
                l9      r5,     0(r8)           ; Ahigh
                mul     r6,     r5
                s9      10(r8), r6              ; um  9 Bit verschoben speichern
                mul     r6,     r10             ; mal 2^9 --> oberen 9 Bit im SFR
                movs2i  r6,     SFR_MUL
                s9      9(r8),  r6              ; um 18 Bit verschoben speichern
;
; Summe der 1. beiden Multiplikatiomen in produkt und temp bilden
;
                l18     r12,    8(r8)           ; temp_high
                l18     r13,    10(r8)          ; temp_low
                l18     r14,    4(r8)           ; produkthigh
                l18     r15,    6(r8)           ; produktlow
                jals    addu36
                s18     4(r8),  r12             ; produkthigh
                s18     6(r8),  r13             ; produktlow
;
;   Ahigh * Bhigh * 2^18 bilden
;
                l9      r6,     2(r8)           ; Bhigh
                mul     r5,     r6
;
; Summe mit dem 3. Produkt bilden
;
                mov     r12,    r5              ; Ahigh * Bhigh
                xor     r13,    r13             ; * 2^18
                l18     r14,    4(r8)           ; produkthigh
                l18     r15,    6(r8)           ; produktlow
                jals    addu36
                s18     4(r8),  r12             ; produkthigh
                s18     6(r8),  r13             ; produktlow
;
;   Alow * Bhigh * 2^9 bilden und in temp speichern
;
                l9      r5,     1(r8)           ; Alow
                mul     r6,     r5
                s9      10(r8), r6              ; um  9 Bit verschoben speichern
                mul     r6,     r10             ; mal 2^9 --> oberen 9 Bit im SFR
                movs2i  r6,     SFR_MUL
                s9      9(r8),  r6              ; um 18 Bit verschoben speichern
;
; Summe mit dem 4. Produkt bilden
;
                l18     r12,    8(r8)           ; temp_high
                l18     r13,    10(r8)          ; temp_low
                l18     r14,    4(r8)           ; produkthigh
                l18     r15,    6(r8)           ; produktlow
                jals    addu36
;               s18     4(r8),  r12             ; produkthigh
;               s18     6(r8),  r13             ; produktlow
                mov     r4,     r12
                mov     r5,     r13
;
                jrs     r11
;
; UP addu36 zur Bildung der Zwischensummen
;
addu36:
;
; Addieren von 36 Bit Werten ohne Vorzeichen
;
; (Wird eine feste Anzahl von Bit addiert, so sind im Ergebnis diese Bits nur dann
; >= einem der beiden Summanden, wenn kein Übertrag entstanden ist!)
;
;               im Aufruf       intern  
; Summand 1:    R12 | R13       R4 | R5  (High | Low)
; Summand 2:    R14 | R15       R6 | R7
;               Rückgabe        intern
; Ergebnis :    R12 | R13       R4 | R5
; Übertrag :    R14             R6
;
                ADDU    R5,     R7              ; Summe Low
                ADDu    R4,     R6              ; Summe High
                SLTU    R4,     R6              ; Übertrag bei High ? -> cc = 1
                movs2i  r8,     SFR_CC          ; r8 = Übertrag bei high
                SLTU    R5,     R7              ; Übertrag bei Low  ? -> cc = 1
                movs2i  r9,     SFR_CC          ; r9 = Übertrag bei low
                ADDu    r4,     r9              ; low Übertrag auf high addieren
                SLTU    R4,     r9              ; Übertrag dabei    ? -> cc = 1
                movs2i  r6,     SFR_CC          ; r6 = Übertrag bei add low Übertrag
                ADDU    R6,     R8              ; Gesammtübertrag von High bilden
                jrs     r11
;
;
endpg           equ     #
;
                .data   (endpg * 2)             ; Ist Physikalisch die Adresse endpg im RAM
;
op1:            .w18    0
op2:            .w18    0
;
produkthigh:    .w18    0
produktlow:     .w18    0
;
temp_high:      .w18    0
temp_low:       .w18    0
;

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

Include Datei für das Programm: spartan_equ.inc

UP mulu18 und UP addu36 als Macro

Include Dateien für die Macros: mulu18m.inc , addu36m.inc

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


SpartanMC