190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 2f71323e297a928af368937089d3ed71239786f86Andreas Huber; Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 4f71323e297a928af368937089d3ed71239786f86Andreas Huber; Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber; that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber; tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber; in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber; be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber EXPORT |vp8_fast_fdct8x4_neon| 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ARM 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber REQUIRE8 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber PRESERVE8 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber AREA ||.text||, CODE, READONLY, ALIGN=2 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;void vp8_fast_fdct4x4_c(short *input, short *output, int pitch); 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;NOTE: 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;The input *src_diff. src_diff is calculated as: 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;diff_ptr[c] = src_ptr[c] - pred_ptr[c]; (in Subtract* function) 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;In which *src_ptr and *pred_ptr both are unsigned char. 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;Therefore, *src_diff should be in the range of [-255, 255]. 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;CAUTION: 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;The input values of 25th block are set in vp8_build_dcblock function, which are out of [-255, 255]. 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;But, VP8 encoder only uses vp8_short_fdct4x4_c for 25th block, not vp8_fast_fdct4x4_c. That makes 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;it ok for assuming *input in [-255, 255] in vp8_fast_fdct4x4_c, but not ok in vp8_short_fdct4x4_c. 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber|vp8_fast_fdct8x4_neon| PROC 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.16 {q1}, [r0], r2 ;load input 32d35fe0269d77984b383b6bdc051f26b72da15277Ard Biesheuvel adr r12, ffdct8_coeff 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.16 {q2}, [r0], r2 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.16 {q3}, [r0], r2 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.16 {d0}, [r12] 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.16 {q4}, [r0], r2 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ;First for-loop 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ;transpose d2, d4, d6, d8. Then, d2=ip[0], d4=ip[1], d6=ip[2], d8=ip[3] 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ;transpose d3, d5, d7, d9. Then, d3=ip[0], d5=ip[1], d7=ip[2], d9=ip[3] 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.32 d2, d6 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.32 d3, d7 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.32 d4, d8 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.32 d5, d9 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.16 d2, d4 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.16 d3, d5 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.16 d6, d8 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.16 d7, d9 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d10, d2, d8 ;ip[0]+ip[3] 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d11, d4, d6 ;ip[1]+ip[2] 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d12, d4, d6 ;ip[1]-ip[2] 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d13, d2, d8 ;ip[0]-ip[3] 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d22, d3, d9 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d23, d5, d7 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d24, d5, d7 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d25, d3, d9 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshl.i16 q5, q5, #1 ; a1, b1 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshl.i16 q6, q6, #1 ; c1, d1 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshl.i16 q1, q11, #1 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshl.i16 q2, q12, #1 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d14, d10, d11 ;temp1 = a1 + b1 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d15, d10, d11 ;temp2 = a1 - b1 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d24, d2, d3 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d25, d2, d3 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q8, q7, d0[1] 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q13, q12, d0[1] 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q10, q6, d0[0] 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q15, q2, d0[0] 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q9, q6, d0[2] 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q14, q2, d0[2] 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q8, q8, #1 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q13, q13, #1 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q10, q10, #1 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q15, q15, #1 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q9, q9, #1 ;d18:temp1 = ( c1 * x_c3)>>16; d19:temp1 = (d1 * x_c3)>>16 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q14, q14, #1 ;d28:temp1 = ( c1 * x_c3)>>16; d29:temp1 = (d1 * x_c3)>>16 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 q10, q6, q10 ;d20:temp2 = ((c1 * x_c1)>>16) + c1; d21:temp2 = ((d1 * x_c1)>>16) + d1 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 q15, q2, q15 ;d30:temp2 = ((c1 * x_c1)>>16) + c1; d31:temp2 = ((d1 * x_c1)>>16) + d1 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d2, d14, d16 ;op[0] = ((temp1 * x_c2 )>>16) + temp1 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d3, d24, d26 ;op[0] = ((temp1 * x_c2 )>>16) + temp1 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d6, d15, d17 ;op[2] = ((temp2 * x_c2 )>>16) + temp2 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d7, d25, d27 ;op[2] = ((temp2 * x_c2 )>>16) + temp2 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d4, d18, d21 ;op[1] = temp1 + temp2 -- q is not necessary, just for protection 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d5, d28, d31 ;op[1] = temp1 + temp2 -- q is not necessary, just for protection 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d8, d19, d20 ;op[3] = temp1 - temp2 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d9, d29, d30 ;op[3] = temp1 - temp2 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ;Second for-loop 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ;transpose d2, d4, d6, d8. Then, d2=ip[0], d4=ip[4], d6=ip[8], d8=ip[12] 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ;transpose d3, d5, d7, d9. Then, d3=ip[0], d5=ip[4], d7=ip[8], d9=ip[12] 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.32 d2, d6 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.32 d3, d7 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.32 d4, d8 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.32 d5, d9 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.16 d2, d4 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.16 d3, d5 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.16 d6, d8 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vtrn.16 d7, d9 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d10, d2, d8 ;a1 = ip[0]+ip[12] 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d11, d4, d6 ;b1 = ip[4]+ip[8] 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d12, d4, d6 ;c1 = ip[4]-ip[8] 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d13, d2, d8 ;d1 = ip[0]-ip[12] 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d2, d3, d9 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d4, d5, d7 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d24, d5, d7 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d25, d3, d9 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d14, d10, d11 ;temp1 = a1 + b1 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d15, d10, d11 ;temp2 = a1 - b1 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d22, d2, d4 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d23, d2, d4 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q8, q7, d0[1] 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q13, q11, d0[1] 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q10, q6, d0[0] 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q15, q12, d0[0] 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q9, q6, d0[2] 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vqdmulh.s16 q14, q12, d0[2] 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q8, q8, #1 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q13, q13, #1 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q10, q10, #1 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q15, q15, #1 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q9, q9, #1 ;d18:temp1 = ( c1 * x_c3)>>16; d19:temp1 = (d1 * x_c3)>>16 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q14, q14, #1 ;d28:temp1 = ( c1 * x_c3)>>16; d29:temp1 = (d1 * x_c3)>>16 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 q10, q6, q10 ;d20:temp2 = ((c1 * x_c1)>>16) + c1; d21:temp2 = ((d1 * x_c1)>>16) + d1 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 q15, q12, q15 ;d30:temp2 = ((c1 * x_c1)>>16) + c1; d31:temp2 = ((d1 * x_c1)>>16) + d1 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d2, d14, d16 ;a2 = ((temp1 * x_c2 )>>16) + temp1 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d6, d22, d26 ;a2 = ((temp1 * x_c2 )>>16) + temp1 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d4, d15, d17 ;c2 = ((temp2 * x_c2 )>>16) + temp2 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d8, d23, d27 ;c2 = ((temp2 * x_c2 )>>16) + temp2 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d3, d18, d21 ;b2 = temp1 + temp2 -- q is not necessary, just for protection 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vadd.s16 d7, d28, d31 ;b2 = temp1 + temp2 -- q is not necessary, just for protection 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d5, d19, d20 ;d2 = temp1 - temp2 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 d9, d29, d30 ;d2 = temp1 - temp2 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vclt.s16 q5, q1, #0 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vclt.s16 q6, q2, #0 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vclt.s16 q7, q3, #0 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vclt.s16 q8, q4, #0 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 q1, q1, q5 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 q2, q2, q6 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 q3, q3, q7 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsub.s16 q4, q4, q8 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q1, q1, #1 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q2, q2, #1 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q3, q3, #1 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vshr.s16 q4, q4, #1 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q1, q2}, [r1]! 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q3, q4}, [r1] 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bx lr 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENDP 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;----------------- 16879f15823c34ae1e423108295e416213200bb280fAndreas Huber 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberffdct8_coeff 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 60547 = 0xEC83 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 46341 = 0xB505 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 25080 = 0x61F8 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DCD 0xB505EC83, 0x000061F8 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber END 176