.data M1: .space 40000 M2: .space 40000 MR: .space 40000 virgola:.asciz "," acapo: .asciz "\n" nca: .asciz "\nIl numero totale di cicli per il processore A e': " ncb: .asciz "\nIl numero totale di cicli per il processore B e': " BB: .asciz "\nConteggio dei BB: " .text .globl main main: #Azzeramento variabili per instrumentazione add s1, x0, x0 # contatore istanze Basic-Block #1 add s2, x0, x0 # contatore istanze Basic-Block #2 add s3, x0, x0 # contatore istanze Basic-Block #3 add s4, x0, x0 # contatore istanze Basic-Block #4 add s5, x0, x0 # contatore istanze Basic-Block #5 add s6, x0, x0 # contatore istanze Basic-Block #6 add s7, x0, x0 # contatore istanze Basic-Block #7 add s0, x0, x0 # contatore istanze Basic-Block #8 add s10, x0, x0 # contatore istanze Basic-Block #9 add s8, x0, x0 # contatore cicli macchina A add s9, x0, x0 # contatore cicli macchina B # lettura dell'indirizzo delle matrici la a1, M1 la a2, M2 la a3, MR #__________________________________________________________________________________________BB1 addi s8, s8, 3 # contributo cicli di BB1 su macchina A addi s9, s9, 3 # contributo cicli di BB1 su macchina B addi s1, s1, 1 # incrementa n. volte in cui e' eseguito BB1 # Preparazione costanti addi t3, x0, 400 # occupazione di memoria di una riga della matrice addi t4, x0, 4 # occupazione di memoria di un elemento della matrice add t0, x0, x0 # associo j a t0 e faccio j=0 forj: #__________________________________________________________________________________________BB2 addi s8, s8, 4 # contributo cicli di BB2 su macchina A addi s9, s9, 4 # contributo cicli di BB2 su macchina B addi s2, s2, 1 # incrementa n. volte in cui e' eseguito BB2 slti t6, t0, 100 # se j<100 allora t6=1 beq t6, x0 endj # se t6==0 (j>=100) allora salto alla fine del ciclo #__________________________________________________________________________________________BB3 addi s8, s8, 1 # contributo cicli di BB3 su macchina A addi s9, s9, 1 # contributo cicli di BB3 su macchina B addi s3, s3, 1 # incrementa n. volte in cui e' eseguito BB3 add t1, x0, x0 # associo k a t1 e faccio k=0 fork: #__________________________________________________________________________________________BB4 addi s8, s8, 4 # contributo cicli di BB4 su macchina A addi s9, s9, 4 # contributo cicli di BB4 su macchina B addi s4, s4, 1 # incrementa n. volte in cui e' eseguito BB4 slti t6, t1, 100 # se k<100 allora t6=1 beq t6, x0 endk # se t6==0 (k>=100) allora salto alla fine del ciclo #__________________________________________________________________________________________BB5 addi s8, s8, 2 # contributo cicli di BB5 su macchina A addi s9, s9, 2 # contributo cicli di BB5 su macchina B addi s5, s5, 1 # incrementa n. volte in cui e' eseguito BB5 add a0, x0, x0 # associo t a a2 e faccio t=0 add t2, x0, x0 # associo i a t2 e faccio i=0 fori: #__________________________________________________________________________________________BB6 addi s8, s8, 4 # contributo cicli di BB6 su macchina A addi s9, s9, 4 # contributo cicli di BB6 su macchina B addi s6, s6, 1 # incrementa n. volte in cui e' eseguito BB6 slti t6, t2, 100 # se i<100 allora t6=1 beq t6, x0 endi # se t6==0 (i>=100) allora salto alla fine del ciclo #__________________________________________________________________________________________BB7 addi s8, s8, 37 # contributo cicli di BB7 su macchina A addi s9, s9, 27 # contributo cicli di BB7 su macchina B addi s7, s7, 1 # incrementa n. volte in cui e' eseguito BB7 # calcolo dell'indirizzo elemento M1[j][i] mul t6, t0, t3 # j * 400 e prendo solo LO perche' j e' sempre < 100 mul a4, t2, t4 # i * 4 e prendo solo LO perche' i e' sempre < 100 add t6, t6, a4 # offset elemento: (j * 400) + (i * 4) add t6, a1, t6 # indirizzo elemento: sommo base (a1) e offset (t6) lw t5, 0(t6) # carico M1[j][i] in t5 # calcolo dell'indirizzo elemento M2[i][k] mul t6, t2, t3 # i * 400 e prendo solo LO perche' i e' sempre < 100 mul a4, t1, t4 # k * 4 e prendo solo LO perche' k e' sempre < 100 add t6, t6, a4 # offset elemento: (i * 400) + (k * 4) add t6, a2, t6 # indirizzo elemento: sommo base (a2) e offset (t6) lw a5, 0(t6) # carico M2[i][k] in t8 # moltiplicazione mul t6, t5, a5 # moltiplicazione M1[j][i] * M2[i][k] e tronco 32bit add a0, a0, t6 # t += (int)(M1[j][i] * M2[i][k]) # incremento il contatore del ciclo addi t2, t2, 1 # ++i j fori endi: #__________________________________________________________________________________________BB8 addi s8, s8, 18 # contributo cicli di BB8 su macchina A addi s9, s9, 13 # contributo cicli di BB8 su macchina B addi s0, s0, 1 # incrementa n. volte in cui e' eseguito BB8 # calcolo dell'indirizzo elemento MR[j][k] mul t6, t0, t3 # j * 400 e prendo solo LO perche' j e' sempre < 100 mul a4, t1, t4 # k * 4 prendo solo LO perche' k e' sempre < 100 add t6, t6, a4 # offset elemento: (j * 400) + (k * 4) add t6, a3, t6 # indirizzo elemento: sommo base (a3) e offset (t6) sw a0, 0(t6) # scrivo MR[j][k] <-- t # incremento il contatore del ciclo addi t1, t1, 1 # ++k j fork endk: #__________________________________________________________________________________________BB9 addi s8, s8, 2 # contributo cicli di BB9 su macchina A addi s9, s9, 2 # contributo cicli di BB9 su macchina B addi s10, s10, 1 # incrementa n. volte in cui e' eseguito BB9 # incremento il contatore del ciclo addi t0, t0, 1 # ++j j forj endj: # Stampa risultati instrumentazione la a0, BB # stampo la stringa "Conteggio dei BB: " addi a7,x0,4 ecall add a0, x0, s1 # stampo il numero corrispondente alle esecuzioni di BB1 addi a7,x0,1 ecall la a0, virgola # stampo la stringa "," addi a7,x0,4 ecall add a0,x0,s2 # stampo il numero corrispondente alle esecuzioni di BB2 addi a7,x0,1 ecall la a0, virgola # stampo la stringa "," addi a7,x0,4 ecall add a0, x0, s3 # stampo il numero corrispondente alle esecuzioni di BB3 addi a7,x0,1 ecall la a0, virgola # stampo la stringa "," addi a7,x0,4 ecall add a0, x0, s4 # stampo il numero corrispondente alle esecuzioni di BB4 addi a7,x0,1 ecall la a0, virgola # stampo la stringa "," addi a7,x0,4 ecall add a0, x0, s5 # stampo il numero corrispondente alle esecuzioni di BB5 addi a7,x0,1 ecall la a0, virgola # stampo la stringa "," addi a7,x0,4 ecall add a0, x0, s6 # stampo il numero corrispondente alle esecuzioni di BB6 addi a7,x0,1 ecall la a0, virgola # stampo la stringa "," addi a7,x0,4 ecall add a0, x0, s7 # stampo il numero corrispondente alle esecuzioni di BB7 addi a7,x0,1 ecall la a0, virgola # stampo la stringa "," addi a7,x0,4 ecall add a0, x0, s0 # stampo il numero corrispondente alle esecuzioni di BB8 addi a7,x0,1 ecall la a0, virgola # stampo la stringa "," addi a7,x0,4 ecall add a0, x0, s10 addi a7,x0,1 # stampo il numero corrispondente alle esecuzioni di BB9 ecall la a0, nca # stampo la stringa "\nIl numero totale di cicli per il processore A e': " addi a7,x0,4 ecall add a0,x0,s8 # stampo il numero di cicli eseguiti dalla macchina A addi a7,x0,1 ecall la a0, ncb # stampo la stringa "\nIl numero totale di cicli per il processore B e': addi a7,x0,4 ecall add a0, x0, s9 # stampo il numero di cicli eseguiti dalla macchina B addi a7,x0,1 ecall la a0, acapo # stampo la stringa di ritorno a capo addi a7,x0,4 ecall li a7, 10 #Uscita ecall