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

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

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()