Multiplikation 18*18 = 36 Bit ohne Vorzeichen
Multiplikation von 18 Bit ohne Vorzeichen
Operanden | high | low |
Faktor 1 | r13 | |
Faktor 2 | r15 | |
Ergebniss | high | low |
Produkt | r12 | r13 |
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.incTestprogramm: Ass-Quelle, Liste, SPHO-Format Start mit "G" im Monitor.