[svn] / trunk / xvidcore / src / dct / ia64_asm / genidct.py Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/dct/ia64_asm/genidct.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 251 - (view) (download) (as text)

1 : ia64p 251 #! /usr/bin/python
2 :    
3 :     import math
4 :    
5 :     pre_shuffle = [ 0, 4, 2, 6, 1, 7, 3, 5 ]
6 :     post_shuffle = [ 0, 1, 6, 3, 7, 2, 5, 4 ]
7 :    
8 :     constants = 16
9 :     float_scratch = range(32, 32+constants)
10 :     regbase = max(float_scratch)+1
11 :     intregbase = 33
12 :    
13 :     def print_matrix(matrix,s=''):
14 :     if s != '':
15 :     print "\n\t// %s" % s
16 :     for i in range(0, 8):
17 :     print "\t// ",
18 :     for j in range(0, 4):
19 :     print "%2d" % matrix[i*4+j],
20 :     print ""
21 :    
22 :     def exchange_elements(list, a, b):
23 :     """ Exchange two list elements
24 :     """
25 :     (list[a], list[b]) = (list[b], list[a])
26 :    
27 :     def alloc_regs(matrix, n):
28 :     """ get the smallest register not used by the matrix
29 :     """
30 :    
31 :     regs = [ ]
32 :     for i in range(0, n):
33 :     m = regbase
34 :     while m in matrix or m in regs:
35 :     m = m + 1
36 :     regs.append(m)
37 :     return regs
38 :    
39 :     def transpose_2x2_submatrix(matrix, i, j):
40 :     """ transpose a 2x2 submatrix in the 8x8 matrix
41 :     """
42 :     a = j
43 :     b = i
44 :    
45 :     tmp = matrix[i*8+j]
46 :     matrix[i*8+j] = matrix[a*8+b]
47 :     matrix[a*8+b] = tmp
48 :    
49 :     tmp = matrix[i*8+j+4]
50 :     matrix[i*8+j+4] = matrix[a*8+b+4]
51 :     matrix[a*8+b+4] = tmp
52 :    
53 :    
54 :     def transpose(matrix):
55 :     """ register renaming for transpose
56 :     """
57 :     regs = alloc_regs(matrix, 16)
58 :     save_regs = regs[:]
59 :    
60 :     # emit code ...
61 :     for i in range(1,8,2):
62 :     for j in range(0,4):
63 :     r1 = matrix[(i-1)*4+j]
64 :     r2 = matrix[i*4+j]
65 :     print '\tfmix.r f%d = f%d, f%d' % (save_regs.pop(0), r1, r2)
66 :    
67 :     print '\t;;'
68 :    
69 :     for i in range(0,8,2):
70 :     for j in range(0,4):
71 :     r1 = matrix[i*4+j]
72 :     r2 = matrix[(i+1)*4+j]
73 :     print '\tfmix.l f%d = f%d, f%d' % (r1, r1, r2)
74 :    
75 :     print '\t;;'
76 :    
77 :     # first stage, transpose the 2x2 matrices
78 :     for i in range(1,8,2):
79 :     for j in range(0,4):
80 :     r = matrix[i*4+j]
81 :     matrix[i*4+j] = regs.pop(0)
82 :    
83 :     # print_matrix(matrix)
84 :    
85 :     # exchange the 2x2 matrices by renaming the registers
86 :     for i in range(0, 4):
87 :     for j in range(i+1, 4):
88 :     transpose_2x2_submatrix(matrix, i, j)
89 :    
90 :     # print ''
91 :     # print_matrix(matrix)
92 :     # print "transpose"
93 :     # print_matrix(matrix)
94 :    
95 :     # register renaming for 8 regs containing a column
96 :     def shuffle_column(matrix, col, permutation):
97 :     l = [ ]
98 :     for i in range(0,8):
99 :     l.append(matrix[i*4+col])
100 :     for i in range(0,8):
101 :     matrix[i*4+col] = l[permutation[i]]
102 :    
103 :     def butterfly(matrix, col, i, j, c1, c2):
104 :     """ register renaming for a butterfly operation in a column
105 :     """
106 :     ri = matrix[i*4+col]
107 :     rj = matrix[j*4+col]
108 :     regs = alloc_regs(matrix, 1)
109 :    
110 :     print '\t// (f%d, f%d) = (f%d, f%d) $ (%s, %s), (line %d, %d)' % \
111 :     (regs[0], rj, ri, rj, c1, c2, i, j)
112 :     print '\tfpma f%d = f%d, %s, f%d' % (regs[0], rj, c1, ri)
113 :     print '\tfpnma f%d = f%d, %s, f%d' % (rj, rj, c2, ri)
114 :     print '\t;;'
115 :    
116 :     matrix[i*4+col] = regs[0]
117 :    
118 :    
119 :     def column_idct(matrix, col):
120 :    
121 :     print_matrix(matrix, "before pre shuffle")
122 :     shuffle_column(matrix, col, pre_shuffle)
123 :     print_matrix(matrix, "after pre shuffle")
124 :    
125 :     butterfly(matrix, col, 0, 1, 'c0', 'c0')
126 :     butterfly(matrix, col, 2, 3, 'c1', 'c2')
127 :     butterfly(matrix, col, 4, 5, 'c3', 'c4')
128 :     butterfly(matrix, col, 6, 7, 'c5', 'c6')
129 :     print '\t;;'
130 :     butterfly(matrix, col, 0, 3, 'c7', 'c7')
131 :     butterfly(matrix, col, 1, 2, 'c8', 'c8')
132 :     butterfly(matrix, col, 4, 6, 'c9', 'c9')
133 :     butterfly(matrix, col, 5, 7, 'c10', 'c10')
134 :     print '\t;;'
135 :     butterfly(matrix, col, 5, 6, 'c11', 'c11')
136 :     butterfly(matrix, col, 0, 4, 'c12', 'c12')
137 :     butterfly(matrix, col, 3, 7, 'c14', 'c14')
138 :     print '\t;;'
139 :     butterfly(matrix, col, 1, 5, 'c13', 'c13')
140 :     butterfly(matrix, col, 2, 6, 'c13', 'c13')
141 :    
142 :     print_matrix(matrix, "before post shuffle")
143 :     shuffle_column(matrix, col, post_shuffle)
144 :     print_matrix(matrix, "after post shuffle")
145 :    
146 :     def gen_idct(matrix):
147 :    
148 :     for j in range(0, 2):
149 :     for i in range(0, 4):
150 :     print '\tfpma f%d = f%d, c0, f0' \
151 :     % (2 * (matrix[i],))
152 :     print '\t;;'
153 :     for i in range(0,4):
154 :     column_idct(matrix, i)
155 :     print '\t;;'
156 :     transpose(matrix)
157 :    
158 :     def gen_consts():
159 :     print 'addreg1 = r14'
160 :     print 'addreg2 = r15'
161 :    
162 :     for i in range(0, constants):
163 :     print 'c%d = f%d' % (i, float_scratch.pop(0))
164 :    
165 :     sqrt2 = math.sqrt(2.0)
166 :     t = [ ]
167 :     s = [ ]
168 :     c = [ ]
169 :     for i in range(0,5):
170 :     t.append(math.tan(i * math.pi / 16))
171 :     s.append(math.sin(i * math.pi / 16))
172 :     c.append(math.cos(i * math.pi / 16))
173 :    
174 :     consts = [ ]
175 :     consts.append(1.0 / (2.0 * sqrt2))
176 :     consts.append(-1 / t[2])
177 :     consts.append(-t[2])
178 :     consts.append(t[1])
179 :     consts.append(1 / t[1])
180 :     consts.append(t[3])
181 :     consts.append(1 / t[3])
182 :     consts.append(0.5 * c[2])
183 :     consts.append(0.5 * s[2])
184 :     consts.append(c[3] / c[1])
185 :     consts.append(s[3] / s[1])
186 :     consts.append(c[1] / s[1])
187 :     consts.append(0.5 * c[1])
188 :     consts.append(0.5 * s[1] * c[4])
189 :     consts.append(0.5 * s[1])
190 :     consts.append(1.0)
191 :    
192 :     print '.sdata'
193 :     for i in range(0, constants):
194 :     if i % 2 == 0:
195 :     print '.align 16'
196 :     print '.data_c%d:' % i
197 :     print '.single %.30f, %.30f' % (consts[i], consts[i])
198 :     print ''
199 :    
200 :     def gen_load(matrix):
201 :    
202 :     for i in range(0, 64, 2):
203 :     print '\tld2 r%d = [addreg1], 4' % (intregbase+i)
204 :     print '\tld2 r%d = [addreg2], 4' % (intregbase+i+1)
205 :     print '\t;;'
206 :    
207 :     for i in range(0, 64, 2):
208 :     print '\tsxt2 r%d = r%d' % (2*(intregbase+i,))
209 :     print '\tsxt2 r%d = r%d' % (2*(intregbase+i+1,))
210 :     print '\t;;'
211 :    
212 :     for i in range(0, 64, 2):
213 :     print '\tsetf.sig f%d = r%d' % (regbase+i, intregbase+i)
214 :     print '\tsetf.sig f%d = r%d' % (regbase+i+1, intregbase+i+1)
215 :     print '\t;;'
216 :    
217 :     for i in range(0, 64, 2):
218 :     print '\tfcvt.xf f%d = f%d' % (2*(regbase+i,))
219 :     print '\tfcvt.xf f%d = f%d' % (2*(regbase+i+1,))
220 :     print '\t;;'
221 :    
222 :     for i in range(0, 32):
223 :     print '\tfpack f%d = f%d, f%d' \
224 :     % (regbase+i, regbase+2*i, regbase+2*i+1)
225 :     print '\t;;'
226 :    
227 :     """
228 :     for i in range(0, len(matrix)):
229 :     print '\tld2 r18 = [addreg1], 4'
230 :     print '\tld2 r19 = [addreg2], 4'
231 :     print '\t;;'
232 :     print '\tsxt2 r18 = r18'
233 :     print '\tsxt2 r19 = r19'
234 :     print '\t;;'
235 :     print '\tsetf.sig f18 = r18'
236 :     print '\tsetf.sig f19 = r19'
237 :     print '\t;;'
238 :     print '\tfcvt.xf f18 = f18'
239 :     print '\tfcvt.xf f19 = f19'
240 :     print '\t;;'
241 :     print '\tfpack f%d = f18, f19' % (matrix[i])
242 :     print '\t;;'
243 :     """
244 :    
245 :     def gen_store(matrix):
246 :     print '\tmov addreg1 = in0'
247 :     print '\tadd addreg2 = 4, in0'
248 :     print '\t;;'
249 :    
250 :     for i in range(0, len(matrix)):
251 :     print '\tfpcvt.fx f%d = f%d' % (2*(matrix[i],))
252 :     print '\t;;'
253 :    
254 :     for i in range(0, len(matrix)):
255 :     print '\tgetf.sig r%d = f%d' % (intregbase+i, matrix[i])
256 :     print '\t;;'
257 :    
258 :     for i in range(0, len(matrix)):
259 :     print '\tshl r%d = r%d, 7' % (2*(intregbase+i,))
260 :     print '\t;;'
261 :    
262 :     for i in range(0, len(matrix)):
263 :     print '\tpack4.sss r%d = r%d, r0' % (2*(intregbase+i,))
264 :     print '\t;;'
265 :    
266 :     for i in range(0, len(matrix)):
267 :     print '\tpshr2 r%d = r%d, 7' % (2*(intregbase+i,))
268 :     print '\t;;'
269 :    
270 :     for i in range(0, len(matrix)):
271 :     print '\tmux2 r%d = r%d, 0xe1' % (2*(intregbase+i,))
272 :     print '\t;;'
273 :    
274 :     for i in range(0, len(matrix), 2):
275 :     print '\tst4 [addreg1] = r%d, 8' % (intregbase+i)
276 :     print '\tst4 [addreg2] = r%d, 8' % (intregbase+i+1)
277 :    
278 :     def main():
279 :     gen_consts()
280 :    
281 :     print '.text'
282 :     print '.global idct_ia64'
283 :     print '.align 16'
284 :     print '.proc idct_ia64'
285 :     print 'idct_ia64:'
286 :    
287 :     f = open('idct_init.s')
288 :     print f.read()
289 :     f.close()
290 :    
291 :     matrix = [ ]
292 :     for i in range(0,32):
293 :     matrix.append(regbase + i)
294 :    
295 :     gen_load(matrix)
296 :     # print_matrix(matrix)
297 :     gen_idct(matrix)
298 :     # transpose(matrix)
299 :     print_matrix(matrix)
300 :     gen_store(matrix)
301 :    
302 :     f = open('idct_fini.s')
303 :     print f.read()
304 :     f.close()
305 :    
306 :     print '.endp'
307 :    
308 :    
309 :     if __name__ == "__main__":
310 :     main()

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4