1 abcd 1 LOAD ADD STORE LOAD DIV
例1 (a+b)/(c+d)的两段代码 1 § § § § LOAD ADD STORE LOAD DIV 2 a b T 1 c d T 2 T 1 T 2 § § § LOAD ADD STORE LOAD ADD DIV c d T 1 a b T 1
例2 a+b*c的两段代码 1 § § § LOAD b MPY c STORE T 1 LOAD a ADD T 1 2 § LOAD b § MPY c § ADD a 利用了加法的交换律 b*c+a
例3 a*b+c*b的两段代码 1 § § § LOAD MPY STORE LOAD MPY ADD 2 c b T 1 a b T 1 § LOAD § ADD § MPY a c b 利用了运算的分配律 (a+c)*b=a*b+c*b
a*(b*c)+d*c的两段代码 例4 1 § § § LOAD MPY STORE LOAD ADD 2 b c T 1 a T 1 d c T 2 T 1 T 2 § § LOAD MPY ADD MPY a b d c 利用了运算的结合律和 分配律 a*(b*c)+d*c =(a*b)*c+d*c =(a*b+d)*c
§ § § § procedure code 1(T) if T是叶子then print(“load ”, data(T)); return endif f=0; if rchild(T)不是叶子 then 递归出口 call code 1(rchild(T)); call temp(i); print (“store”, i); f=1; 递归过程 endif call code 1(lchild(T)); if f=1 then print (data(T), i); call retemp(i); else print (data(T), data(rchild(T))); endif end code 1
例 a+(b+(c+d)) + a + b + c d § § § § load c add d store t 1 load b add t 1 store t 1 load a add t 1
(a+b)/(c*d) § § § § N=1 load c, r 1 mpy r 1, d, r 1 store r 1, t 1 load a, r 1 add r 1, b, r 1 div r 1, t 1, r 1 § § § N=2 load c, r 1 mpy r 1, d, r 1 load a, r 2 add r 2, b, r 2 div r 2, r 1 §无store指令
例 a+(b+(c+d)) 2 § MR(T)=2 + 1 a + 2 1 b + 1 0 1 c d
§ § § § procedure code 2(T) if T是叶子then Print(load data(T), R, i); return ; endif L=Lchild(T); R=Rchild(T); case : MR(R)=0: call code 2(L, i); print(data(T), Ri, data(R), Ri); : MR(L) ≥N and MR(R) ≥N: call code 2(R, i); call temp(s); print(“store”, Ri, s); call code 2(L, i); print(data(T), Ri, s, Ri); : MR(L) <MR(R): call code 2(R, i); call code 2(L, i+1); print(data(T), Ri+1, Ri); : else: call code 2(L, i); call code 2(R, i+1); print(data(T), Ri+1, Ri); endcase end code 2
例 a+(b+(c+d)) 2 + 1 a + 2 1 b + 1 0 1 c d § § § § MR(T)=2 若N=2不需要store指令 load b, r 1 load c, r 2 add r 2, d, r 2 add r 1, r 2, r 1 load a, r 2 add r 2, r 1
例 a+(b+(c+d)) 2 + 1 a + 2 1 b + 1 0 1 c d § § § § § MR(T)=2 若N=1需要store指令 load c, r 1 add r 1, d, r 1 store r 1, s 1 load b, r 1 add r 1, s 1, r 1 store r 1, s 1 load a, r 1 add r 1, s 1, r 1
- Slides: 37