1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2013 RISC OS Open Ltd 3cabdff1aSopenharmony_ci * Author: Ben Avison <bavison@riscosopen.org> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "libavutil/arm/asm.S" 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ciCONTEXT .req a1 25cabdff1aSopenharmony_ciORIGOUT .req a2 26cabdff1aSopenharmony_ciIN .req a3 27cabdff1aSopenharmony_ciOUT .req v1 28cabdff1aSopenharmony_ciREVTAB .req v2 29cabdff1aSopenharmony_ciTCOS .req v3 30cabdff1aSopenharmony_ciTSIN .req v4 31cabdff1aSopenharmony_ciOLDFPSCR .req v5 32cabdff1aSopenharmony_ciJ0 .req a2 33cabdff1aSopenharmony_ciJ1 .req a4 34cabdff1aSopenharmony_ciJ2 .req ip 35cabdff1aSopenharmony_ciJ3 .req lr 36cabdff1aSopenharmony_ciREVTAB_HI .req v5 37cabdff1aSopenharmony_ciIN_HI .req v6 38cabdff1aSopenharmony_ciOUT_HI .req v6 39cabdff1aSopenharmony_ciTCOS_HI .req sl 40cabdff1aSopenharmony_ciTSIN_HI .req fp 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci.macro prerotation_innerloop 43cabdff1aSopenharmony_ci .set trig_lo, k 44cabdff1aSopenharmony_ci .set trig_hi, n4 - k - 2 45cabdff1aSopenharmony_ci .set in_lo, trig_lo * 2 46cabdff1aSopenharmony_ci .set in_hi, trig_hi * 2 47cabdff1aSopenharmony_ci vldr d8, [TCOS, #trig_lo*4] @ s16,s17 48cabdff1aSopenharmony_ci vldr d9, [TCOS, #trig_hi*4] @ s18,s19 49cabdff1aSopenharmony_ci vldr s0, [IN, #in_hi*4 + 12] 50cabdff1aSopenharmony_ci vldr s1, [IN, #in_hi*4 + 4] 51cabdff1aSopenharmony_ci vldr s2, [IN, #in_lo*4 + 12] 52cabdff1aSopenharmony_ci vldr s3, [IN, #in_lo*4 + 4] 53cabdff1aSopenharmony_ci vmul.f s8, s0, s16 @ vector operation 54cabdff1aSopenharmony_ci vldr d10, [TSIN, #trig_lo*4] @ s20,s21 55cabdff1aSopenharmony_ci vldr d11, [TSIN, #trig_hi*4] @ s22,s23 56cabdff1aSopenharmony_ci vldr s4, [IN, #in_lo*4] 57cabdff1aSopenharmony_ci vldr s5, [IN, #in_lo*4 + 8] 58cabdff1aSopenharmony_ci vldr s6, [IN, #in_hi*4] 59cabdff1aSopenharmony_ci vldr s7, [IN, #in_hi*4 + 8] 60cabdff1aSopenharmony_ci ldr J0, [REVTAB, #trig_lo*2] 61cabdff1aSopenharmony_ci vmul.f s12, s0, s20 @ vector operation 62cabdff1aSopenharmony_ci ldr J2, [REVTAB, #trig_hi*2] 63cabdff1aSopenharmony_ci mov J1, J0, lsr #16 64cabdff1aSopenharmony_ci and J0, J0, #255 @ halfword value will be < n4 65cabdff1aSopenharmony_ci vmls.f s8, s4, s20 @ vector operation 66cabdff1aSopenharmony_ci mov J3, J2, lsr #16 67cabdff1aSopenharmony_ci and J2, J2, #255 @ halfword value will be < n4 68cabdff1aSopenharmony_ci add J0, OUT, J0, lsl #3 69cabdff1aSopenharmony_ci vmla.f s12, s4, s16 @ vector operation 70cabdff1aSopenharmony_ci add J1, OUT, J1, lsl #3 71cabdff1aSopenharmony_ci add J2, OUT, J2, lsl #3 72cabdff1aSopenharmony_ci add J3, OUT, J3, lsl #3 73cabdff1aSopenharmony_ci vstr s8, [J0] 74cabdff1aSopenharmony_ci vstr s9, [J1] 75cabdff1aSopenharmony_ci vstr s10, [J2] 76cabdff1aSopenharmony_ci vstr s11, [J3] 77cabdff1aSopenharmony_ci vstr s12, [J0, #4] 78cabdff1aSopenharmony_ci vstr s13, [J1, #4] 79cabdff1aSopenharmony_ci vstr s14, [J2, #4] 80cabdff1aSopenharmony_ci vstr s15, [J3, #4] 81cabdff1aSopenharmony_ci .set k, k + 2 82cabdff1aSopenharmony_ci.endm 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci.macro prerotation_innerloop_rolled 85cabdff1aSopenharmony_ci vldmia TCOS!, {s16,s17} 86cabdff1aSopenharmony_ci vldmdb TCOS_HI!, {s18,s19} 87cabdff1aSopenharmony_ci vldr s0, [IN_HI, #-4] 88cabdff1aSopenharmony_ci vldr s1, [IN_HI, #-12] 89cabdff1aSopenharmony_ci vldr s2, [IN, #12] 90cabdff1aSopenharmony_ci vldr s3, [IN, #4] 91cabdff1aSopenharmony_ci vmul.f s8, s0, s16 @ vector operation 92cabdff1aSopenharmony_ci vldmia TSIN!, {s20,s21} 93cabdff1aSopenharmony_ci vldmdb TSIN_HI!, {s22,s23} 94cabdff1aSopenharmony_ci vldr s4, [IN] 95cabdff1aSopenharmony_ci vldr s5, [IN, #8] 96cabdff1aSopenharmony_ci vldr s6, [IN_HI, #-16] 97cabdff1aSopenharmony_ci vldr s7, [IN_HI, #-8] 98cabdff1aSopenharmony_ci vmul.f s12, s0, s20 @ vector operation 99cabdff1aSopenharmony_ci add IN, IN, #16 100cabdff1aSopenharmony_ci sub IN_HI, IN_HI, #16 101cabdff1aSopenharmony_ci ldrh J0, [REVTAB], #2 102cabdff1aSopenharmony_ci ldrh J1, [REVTAB], #2 103cabdff1aSopenharmony_ci vmls.f s8, s4, s20 @ vector operation 104cabdff1aSopenharmony_ci ldrh J3, [REVTAB_HI, #-2]! 105cabdff1aSopenharmony_ci ldrh J2, [REVTAB_HI, #-2]! 106cabdff1aSopenharmony_ci add J0, OUT, J0, lsl #3 107cabdff1aSopenharmony_ci vmla.f s12, s4, s16 @ vector operation 108cabdff1aSopenharmony_ci add J1, OUT, J1, lsl #3 109cabdff1aSopenharmony_ci add J2, OUT, J2, lsl #3 110cabdff1aSopenharmony_ci add J3, OUT, J3, lsl #3 111cabdff1aSopenharmony_ci vstr s8, [J0] 112cabdff1aSopenharmony_ci vstr s9, [J1] 113cabdff1aSopenharmony_ci vstr s10, [J2] 114cabdff1aSopenharmony_ci vstr s11, [J3] 115cabdff1aSopenharmony_ci vstr s12, [J0, #4] 116cabdff1aSopenharmony_ci vstr s13, [J1, #4] 117cabdff1aSopenharmony_ci vstr s14, [J2, #4] 118cabdff1aSopenharmony_ci vstr s15, [J3, #4] 119cabdff1aSopenharmony_ci.endm 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci.macro postrotation_innerloop tail, head 122cabdff1aSopenharmony_ci .set trig_lo_head, n8 - k - 2 123cabdff1aSopenharmony_ci .set trig_hi_head, n8 + k 124cabdff1aSopenharmony_ci .set out_lo_head, trig_lo_head * 2 125cabdff1aSopenharmony_ci .set out_hi_head, trig_hi_head * 2 126cabdff1aSopenharmony_ci .set trig_lo_tail, n8 - (k - 2) - 2 127cabdff1aSopenharmony_ci .set trig_hi_tail, n8 + (k - 2) 128cabdff1aSopenharmony_ci .set out_lo_tail, trig_lo_tail * 2 129cabdff1aSopenharmony_ci .set out_hi_tail, trig_hi_tail * 2 130cabdff1aSopenharmony_ci .if (k & 2) == 0 131cabdff1aSopenharmony_ci TCOS_D0_HEAD .req d10 @ s20,s21 132cabdff1aSopenharmony_ci TCOS_D1_HEAD .req d11 @ s22,s23 133cabdff1aSopenharmony_ci TCOS_S0_TAIL .req s24 134cabdff1aSopenharmony_ci .else 135cabdff1aSopenharmony_ci TCOS_D0_HEAD .req d12 @ s24,s25 136cabdff1aSopenharmony_ci TCOS_D1_HEAD .req d13 @ s26,s27 137cabdff1aSopenharmony_ci TCOS_S0_TAIL .req s20 138cabdff1aSopenharmony_ci .endif 139cabdff1aSopenharmony_ci .ifnc "\tail","" 140cabdff1aSopenharmony_ci vmls.f s8, s0, TCOS_S0_TAIL @ vector operation 141cabdff1aSopenharmony_ci .endif 142cabdff1aSopenharmony_ci .ifnc "\head","" 143cabdff1aSopenharmony_ci vldr d8, [TSIN, #trig_lo_head*4] @ s16,s17 144cabdff1aSopenharmony_ci vldr d9, [TSIN, #trig_hi_head*4] @ s18,s19 145cabdff1aSopenharmony_ci vldr TCOS_D0_HEAD, [TCOS, #trig_lo_head*4] 146cabdff1aSopenharmony_ci .endif 147cabdff1aSopenharmony_ci .ifnc "\tail","" 148cabdff1aSopenharmony_ci vmla.f s12, s4, TCOS_S0_TAIL @ vector operation 149cabdff1aSopenharmony_ci .endif 150cabdff1aSopenharmony_ci .ifnc "\head","" 151cabdff1aSopenharmony_ci vldr s0, [OUT, #out_lo_head*4] 152cabdff1aSopenharmony_ci vldr s1, [OUT, #out_lo_head*4 + 8] 153cabdff1aSopenharmony_ci vldr s2, [OUT, #out_hi_head*4] 154cabdff1aSopenharmony_ci vldr s3, [OUT, #out_hi_head*4 + 8] 155cabdff1aSopenharmony_ci vldr s4, [OUT, #out_lo_head*4 + 4] 156cabdff1aSopenharmony_ci vldr s5, [OUT, #out_lo_head*4 + 12] 157cabdff1aSopenharmony_ci vldr s6, [OUT, #out_hi_head*4 + 4] 158cabdff1aSopenharmony_ci vldr s7, [OUT, #out_hi_head*4 + 12] 159cabdff1aSopenharmony_ci .endif 160cabdff1aSopenharmony_ci .ifnc "\tail","" 161cabdff1aSopenharmony_ci vstr s8, [OUT, #out_lo_tail*4] 162cabdff1aSopenharmony_ci vstr s9, [OUT, #out_lo_tail*4 + 8] 163cabdff1aSopenharmony_ci vstr s10, [OUT, #out_hi_tail*4] 164cabdff1aSopenharmony_ci vstr s11, [OUT, #out_hi_tail*4 + 8] 165cabdff1aSopenharmony_ci .endif 166cabdff1aSopenharmony_ci .ifnc "\head","" 167cabdff1aSopenharmony_ci vmul.f s8, s4, s16 @ vector operation 168cabdff1aSopenharmony_ci .endif 169cabdff1aSopenharmony_ci .ifnc "\tail","" 170cabdff1aSopenharmony_ci vstr s12, [OUT, #out_hi_tail*4 + 12] 171cabdff1aSopenharmony_ci vstr s13, [OUT, #out_hi_tail*4 + 4] 172cabdff1aSopenharmony_ci vstr s14, [OUT, #out_lo_tail*4 + 12] 173cabdff1aSopenharmony_ci vstr s15, [OUT, #out_lo_tail*4 + 4] 174cabdff1aSopenharmony_ci .endif 175cabdff1aSopenharmony_ci .ifnc "\head","" 176cabdff1aSopenharmony_ci vmul.f s12, s0, s16 @ vector operation 177cabdff1aSopenharmony_ci vldr TCOS_D1_HEAD, [TCOS, #trig_hi_head*4] 178cabdff1aSopenharmony_ci .endif 179cabdff1aSopenharmony_ci .unreq TCOS_D0_HEAD 180cabdff1aSopenharmony_ci .unreq TCOS_D1_HEAD 181cabdff1aSopenharmony_ci .unreq TCOS_S0_TAIL 182cabdff1aSopenharmony_ci .ifnc "\head","" 183cabdff1aSopenharmony_ci .set k, k + 2 184cabdff1aSopenharmony_ci .endif 185cabdff1aSopenharmony_ci.endm 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci.macro postrotation_innerloop_rolled tail, head, tcos_s0_head, tcos_s1_head, tcos_s2_head, tcos_s3_head, tcos_s0_tail, out_offset_head, out_offset_tail 188cabdff1aSopenharmony_ci .ifnc "\tail","" 189cabdff1aSopenharmony_ci vmls.f s8, s0, \tcos_s0_tail @ vector operation 190cabdff1aSopenharmony_ci .endif 191cabdff1aSopenharmony_ci .ifnc "\head","" 192cabdff1aSopenharmony_ci vldmia TSIN!, {s16,s17} 193cabdff1aSopenharmony_ci vldmdb TSIN_HI!, {s18,s19} 194cabdff1aSopenharmony_ci vldmia TCOS!, {\tcos_s0_head,\tcos_s1_head} 195cabdff1aSopenharmony_ci .endif 196cabdff1aSopenharmony_ci .ifnc "\tail","" 197cabdff1aSopenharmony_ci vmla.f s12, s4, \tcos_s0_tail @ vector operation 198cabdff1aSopenharmony_ci .endif 199cabdff1aSopenharmony_ci .ifnc "\head","" 200cabdff1aSopenharmony_ci vldr s0, [OUT, #+\out_offset_head+0] 201cabdff1aSopenharmony_ci vldr s1, [OUT, #+\out_offset_head+8] 202cabdff1aSopenharmony_ci vldr s2, [OUT_HI, #-\out_offset_head-16] 203cabdff1aSopenharmony_ci vldr s3, [OUT_HI, #-\out_offset_head-8] 204cabdff1aSopenharmony_ci vldr s4, [OUT, #+\out_offset_head+4] 205cabdff1aSopenharmony_ci vldr s5, [OUT, #+\out_offset_head+12] 206cabdff1aSopenharmony_ci vldr s6, [OUT_HI, #-\out_offset_head-12] 207cabdff1aSopenharmony_ci vldr s7, [OUT_HI, #-\out_offset_head-4] 208cabdff1aSopenharmony_ci .endif 209cabdff1aSopenharmony_ci .ifnc "\tail","" 210cabdff1aSopenharmony_ci vstr s8, [OUT, #+\out_offset_tail+0] 211cabdff1aSopenharmony_ci vstr s9, [OUT, #+\out_offset_tail+8] 212cabdff1aSopenharmony_ci vstr s10, [OUT_HI, #-\out_offset_tail-16] 213cabdff1aSopenharmony_ci vstr s11, [OUT_HI, #-\out_offset_tail-8] 214cabdff1aSopenharmony_ci .endif 215cabdff1aSopenharmony_ci .ifnc "\head","" 216cabdff1aSopenharmony_ci vmul.f s8, s4, s16 @ vector operation 217cabdff1aSopenharmony_ci .endif 218cabdff1aSopenharmony_ci .ifnc "\tail","" 219cabdff1aSopenharmony_ci vstr s12, [OUT_HI, #-\out_offset_tail-4] 220cabdff1aSopenharmony_ci vstr s13, [OUT_HI, #-\out_offset_tail-12] 221cabdff1aSopenharmony_ci vstr s14, [OUT, #+\out_offset_tail+12] 222cabdff1aSopenharmony_ci vstr s15, [OUT, #+\out_offset_tail+4] 223cabdff1aSopenharmony_ci .endif 224cabdff1aSopenharmony_ci .ifnc "\head","" 225cabdff1aSopenharmony_ci vmul.f s12, s0, s16 @ vector operation 226cabdff1aSopenharmony_ci vldmdb TCOS_HI!, {\tcos_s2_head,\tcos_s3_head} 227cabdff1aSopenharmony_ci .endif 228cabdff1aSopenharmony_ci.endm 229cabdff1aSopenharmony_ci 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci/* void ff_imdct_half_vfp(FFTContext *s, 232cabdff1aSopenharmony_ci * FFTSample *output, 233cabdff1aSopenharmony_ci * const FFTSample *input) 234cabdff1aSopenharmony_ci */ 235cabdff1aSopenharmony_cifunction ff_imdct_half_vfp, export=1 236cabdff1aSopenharmony_ci ldr ip, [CONTEXT, #5*4] @ mdct_bits 237cabdff1aSopenharmony_ci teq ip, #6 238cabdff1aSopenharmony_ci bne 10f 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_ci .set n, 1<<6 241cabdff1aSopenharmony_ci .set n2, n/2 242cabdff1aSopenharmony_ci .set n4, n/4 243cabdff1aSopenharmony_ci .set n8, n/8 244cabdff1aSopenharmony_ci 245cabdff1aSopenharmony_ci push {v1-v5,lr} 246cabdff1aSopenharmony_ci vpush {s16-s27} 247cabdff1aSopenharmony_ci fmrx OLDFPSCR, FPSCR 248cabdff1aSopenharmony_ci ldr lr, =0x03030000 @ RunFast mode, short vectors of length 4, stride 1 249cabdff1aSopenharmony_ci fmxr FPSCR, lr 250cabdff1aSopenharmony_ci mov OUT, ORIGOUT 251cabdff1aSopenharmony_ci ldr REVTAB, [CONTEXT, #2*4] 252cabdff1aSopenharmony_ci ldr TCOS, [CONTEXT, #6*4] 253cabdff1aSopenharmony_ci ldr TSIN, [CONTEXT, #7*4] 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci .set k, 0 256cabdff1aSopenharmony_ci .rept n8/2 257cabdff1aSopenharmony_ci prerotation_innerloop 258cabdff1aSopenharmony_ci .endr 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci fmxr FPSCR, OLDFPSCR 261cabdff1aSopenharmony_ci mov a1, OUT 262cabdff1aSopenharmony_ci bl X(ff_fft16_vfp) 263cabdff1aSopenharmony_ci ldr lr, =0x03030000 @ RunFast mode, short vectors of length 4, stride 1 264cabdff1aSopenharmony_ci fmxr FPSCR, lr 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_ci .set k, 0 267cabdff1aSopenharmony_ci postrotation_innerloop , head 268cabdff1aSopenharmony_ci .rept n8/2 - 1 269cabdff1aSopenharmony_ci postrotation_innerloop tail, head 270cabdff1aSopenharmony_ci .endr 271cabdff1aSopenharmony_ci postrotation_innerloop tail 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_ci fmxr FPSCR, OLDFPSCR 274cabdff1aSopenharmony_ci vpop {s16-s27} 275cabdff1aSopenharmony_ci pop {v1-v5,pc} 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci10: 278cabdff1aSopenharmony_ci push {v1-v6,sl,fp,lr} 279cabdff1aSopenharmony_ci vpush {s16-s27} 280cabdff1aSopenharmony_ci fmrx OLDFPSCR, FPSCR 281cabdff1aSopenharmony_ci ldr lr, =0x03030000 @ RunFast mode, short vectors of length 4, stride 1 282cabdff1aSopenharmony_ci fmxr FPSCR, lr 283cabdff1aSopenharmony_ci mov lr, #1 284cabdff1aSopenharmony_ci mov OUT, ORIGOUT 285cabdff1aSopenharmony_ci ldr REVTAB, [CONTEXT, #2*4] 286cabdff1aSopenharmony_ci ldr TCOS, [CONTEXT, #6*4] 287cabdff1aSopenharmony_ci ldr TSIN, [CONTEXT, #7*4] 288cabdff1aSopenharmony_ci mov lr, lr, lsl ip 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci push {CONTEXT,OLDFPSCR} 291cabdff1aSopenharmony_ci add IN_HI, IN, lr, lsl #1 292cabdff1aSopenharmony_ci add REVTAB_HI, REVTAB, lr, lsr #1 293cabdff1aSopenharmony_ci add TCOS_HI, TCOS, lr 294cabdff1aSopenharmony_ci add TSIN_HI, TSIN, lr 295cabdff1aSopenharmony_ci0: prerotation_innerloop_rolled 296cabdff1aSopenharmony_ci teq IN, IN_HI 297cabdff1aSopenharmony_ci bne 0b 298cabdff1aSopenharmony_ci ldmia sp, {CONTEXT,OLDFPSCR} 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci mov ORIGOUT, OUT 301cabdff1aSopenharmony_ci fmxr FPSCR, OLDFPSCR 302cabdff1aSopenharmony_ci ldr ip, [CONTEXT, #9*4] 303cabdff1aSopenharmony_ci blx ip @ s->fft_calc(s, output) 304cabdff1aSopenharmony_ci 305cabdff1aSopenharmony_ci pop {CONTEXT,OLDFPSCR} 306cabdff1aSopenharmony_ci ldr lr, =0x03030000 @ RunFast mode, short vectors of length 4, stride 1 307cabdff1aSopenharmony_ci ldr ip, [CONTEXT, #5*4] @ mdct_bits 308cabdff1aSopenharmony_ci fmxr FPSCR, lr 309cabdff1aSopenharmony_ci mov lr, #1 310cabdff1aSopenharmony_ci mov lr, lr, lsl ip 311cabdff1aSopenharmony_ci sub TCOS, TCOS, lr, lsr #1 312cabdff1aSopenharmony_ci sub TSIN, TSIN, lr, lsr #1 313cabdff1aSopenharmony_ci add OUT_HI, OUT, lr, lsl #1 314cabdff1aSopenharmony_ci add TCOS_HI, TCOS, lr 315cabdff1aSopenharmony_ci add TSIN_HI, TSIN, lr 316cabdff1aSopenharmony_ci postrotation_innerloop_rolled , head, s20, s21, s22, s23,, 0 317cabdff1aSopenharmony_ci b 1f 318cabdff1aSopenharmony_ci0: add OUT, OUT, #32 319cabdff1aSopenharmony_ci sub OUT_HI, OUT_HI, #32 320cabdff1aSopenharmony_ci postrotation_innerloop_rolled tail, head, s20, s21, s22, s23, s24, 0, -16 321cabdff1aSopenharmony_ci1: postrotation_innerloop_rolled tail, head, s24, s25, s26, s27, s20, 16, 0 322cabdff1aSopenharmony_ci teq TSIN, TSIN_HI 323cabdff1aSopenharmony_ci bne 0b 324cabdff1aSopenharmony_ci postrotation_innerloop_rolled tail,,,,,, s24,, 16 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci fmxr FPSCR, OLDFPSCR 327cabdff1aSopenharmony_ci vpop {s16-s27} 328cabdff1aSopenharmony_ci pop {v1-v6,sl,fp,pc} 329cabdff1aSopenharmony_ciendfunc 330cabdff1aSopenharmony_ci 331cabdff1aSopenharmony_ci .unreq CONTEXT 332cabdff1aSopenharmony_ci .unreq ORIGOUT 333cabdff1aSopenharmony_ci .unreq IN 334cabdff1aSopenharmony_ci .unreq OUT 335cabdff1aSopenharmony_ci .unreq REVTAB 336cabdff1aSopenharmony_ci .unreq TCOS 337cabdff1aSopenharmony_ci .unreq TSIN 338cabdff1aSopenharmony_ci .unreq OLDFPSCR 339cabdff1aSopenharmony_ci .unreq J0 340cabdff1aSopenharmony_ci .unreq J1 341cabdff1aSopenharmony_ci .unreq J2 342cabdff1aSopenharmony_ci .unreq J3 343cabdff1aSopenharmony_ci .unreq REVTAB_HI 344cabdff1aSopenharmony_ci .unreq IN_HI 345cabdff1aSopenharmony_ci .unreq OUT_HI 346cabdff1aSopenharmony_ci .unreq TCOS_HI 347cabdff1aSopenharmony_ci .unreq TSIN_HI 348