;********multiply an array to an array*****
;******* Written by heiden*********
;循环展开后的矩阵相乘程序
;三个矩阵按行存储
;第一个矩阵的大小为:m*n
;第二个矩阵的大小为:n*k
;存放结果的矩阵大小为:m*k
;l 代表了第一个矩阵的当前被扫描的那行
;r4<=r 相对于result的偏移量
;r5<-l
;r10<-i 第一个矩阵某一行的某个元素的索引
;r7<-j 第二个矩阵某一列的某个元素的索引
.data
;***row of first array
; .global m
;m: .word 5
;**column of first array and row of second array
; .global n
;n: .word 4
;***culumn of second array
; .global k
;k: .word 3
;**buffer of first array
.global dat1
dat1: .space 20
;**buffer of second array
.global dat2
dat2: .space 12
;**buffer of result
.global result
result: .space 15
.text
.global main
main:
addi r11,r0,0 ;temp
addi r4,r0,0 ;r
addi r5,r0,0 ;l
addi r1,r0,5 ;m
movi2fp f1,r1
addi r1,r0,4
movi2fp f2,r1 ;n
addi r1,r0,3
movi2fp f3,r1 ;k
line: movi2fp f4,r5 ;判断是否扫描完
ltf f4,f1 ;l<m?
bfpf finish
addi r6,r0,0 ;col
column: movi2fp f4,r6
ltf f4,f3 ;col<k
bfpf leveladd
movfp2i r1,f2
multu r10,r5,r1 ;i<-l*n
addi r7,r6,0 ;mov col to j
;循环展开
addi r12,r10,dat1 ;r12<-dat1[i] r13<-dat2[j]
addi r14,r10,dat1 ;r14<-dat1[i+1] r15<-dat2[j+4}
addi r16,r10,dat1 ;r16<-dat1[i+2] r17<-dat2[j+8]
addi r18,r10,dat1 ;r18<-dat1[i+3] r19<-dat2[j+12]
lbu r12,0(r12)
addi r14,r14,1
addi r16,r16,2
addi r18,r18,3
addi r13,r7,dat2
addi r15,r7,dat2
addi r17,r7,dat2
addi r19,r7,dat2
lbu r13,0(r13)
addi r15,r15,4
addi r17,r17,8
addi r19,r19,12
;addi r14,r10,dat1 ;r14<-dat1[i+1] r15<-dat2[j+4}
;addi r14,r14,1
lbu r14,0(r14)
;addi r15,r7,dat2
;addi r15,r15,4
lbu r15,0(r15)
;addi r16,r10,dat1 ;r16<-dat1[i+2] r17<-dat2[j+8]
;addi r16,r16,2
lbu r16,0(r16)
;addi r17,r7,dat2
;addi r17,r17,8
lbu r17,0(r17)
;addi r18,r10,dat1 ;r18<-dat1[i+3] r19<-dat2[j+12]
;addi r18,r18,3
lbu r18,0(r18)
;addi r19,r7,dat2
;addi r19,r19,12
lbu r19,0(r19)
multu r20,r12,r13 ;r20<-dat1[i]*dat2[j]
multu r21,r14,r15 ;r21<-dat1[i+1]*dat2[j+4]
multu r22,r16,r17 ;r22<-dat1[i+2]*dat2[j+8]
multu r23,r18,r19 ;r23<-dat1[i+3]*dat2[j+12]
add r24,r20,r21
add r25,r22,r23
add r26,r24,r25
addi r1,r4,result
sb 0(r1),r26 ;store result ??
addi r4,r4,1
addi r6,r6,1
j column
leveladd:addi r5,r5,1
j line
finish: trap 0 ;**end
本程序实现5*4的矩阵与4*3的矩阵的相乘,使用了循环展开和指令调度技术.
如有不对之处,还希望各位能给予指正!