|
|
from ir.ir import *
|
|
|
|
|
|
#指令重排
|
|
|
#输入:
|
|
|
# ir为源代码对应的中间表示
|
|
|
#输出:
|
|
|
# ir中指令按约束重排后的中间表示
|
|
|
def reorder(ir):
|
|
|
|
|
|
# reorder list,在列表中重排指令
|
|
|
ROL = ir
|
|
|
n = len(ROL)
|
|
|
i = 0
|
|
|
|
|
|
# 根据相关性插入stall
|
|
|
while i < n:
|
|
|
if i < n - 1:
|
|
|
if (ROL[i][0] == 'l') & (ROL[i+1][0] == 'a'):
|
|
|
if (ROL[i][6] == ROL[i+1][9]) or (ROL[i][6] == ROL[i+1][12]):
|
|
|
ROL.insert(i+1, 'Stall')
|
|
|
i = i + 2
|
|
|
n = n + 1
|
|
|
|
|
|
elif (ROL[i][0] == 'a') & (ROL[i+1][0] == 'a'):
|
|
|
if (ROL[i][5] == ROL[i+1][9]) or (ROL[i][5] == ROL[i+1].instrStr[12]):
|
|
|
j = i + 1
|
|
|
while j < i + 4:
|
|
|
ROL.insert(j, 'Stall')
|
|
|
i = i + 4
|
|
|
n = n + 3
|
|
|
|
|
|
elif (ROL[i][0] == 'a') & (ROL[i+1][0] == 's'):
|
|
|
if ROL[i][5] == ROL[i+1][7]:
|
|
|
k = i + 1
|
|
|
while k < i + 3:
|
|
|
ROL.insert(k, 'Stall')
|
|
|
k = k + 1
|
|
|
i = i + 3
|
|
|
n = n + 2
|
|
|
|
|
|
elif (ROL[i][0] == 'a') & (ROL[i+1][0] == 'b'):
|
|
|
if (ROL[i][6] == ROL[i+1][6]) or (ROL[i][6] == ROL[i+1][9]):
|
|
|
ROL.insert(i + 1, 'Stall')
|
|
|
i = i + 2
|
|
|
n = n + 1
|
|
|
|
|
|
elif (ROL[i][0] == 'b'):
|
|
|
ROL.insert(i + 1, 'Stall')
|
|
|
i = i + 2
|
|
|
n = n + 1
|
|
|
|
|
|
else:
|
|
|
i = i + 1
|
|
|
print(i)
|
|
|
|
|
|
elif ROL[i][0] == 'b':
|
|
|
ROL.insert(i + 1, 'Stall')
|
|
|
break
|
|
|
|
|
|
else:
|
|
|
break
|
|
|
|