1*15dc779aSAndroid Build Coastguard Worker//.include "ihevc_neon_macros.s" 2*15dc779aSAndroid Build Coastguard Worker.macro push_v_regs 3*15dc779aSAndroid Build Coastguard Worker stp x8, x9, [sp, #-16]! 4*15dc779aSAndroid Build Coastguard Worker stp x10, X11, [sp, #-16]! 5*15dc779aSAndroid Build Coastguard Worker stp X12, X13, [sp, #-16]! 6*15dc779aSAndroid Build Coastguard Worker stp X14, X15, [sp, #-16]! 7*15dc779aSAndroid Build Coastguard Worker stp X29, X30, [sp, #-16]! 8*15dc779aSAndroid Build Coastguard Worker.endm 9*15dc779aSAndroid Build Coastguard Worker.macro pop_v_regs 10*15dc779aSAndroid Build Coastguard Worker ldp X29, X30, [sp], #16 11*15dc779aSAndroid Build Coastguard Worker ldp X14, X15, [sp], #16 12*15dc779aSAndroid Build Coastguard Worker ldp X12, X13, [sp], #16 13*15dc779aSAndroid Build Coastguard Worker ldp X10, X11, [sp], #16 14*15dc779aSAndroid Build Coastguard Worker ldp X8, X9, [sp], #16 15*15dc779aSAndroid Build Coastguard Worker.endm 16*15dc779aSAndroid Build Coastguard Worker 17*15dc779aSAndroid Build Coastguard Worker.text 18*15dc779aSAndroid Build Coastguard Worker.p2align 2 19*15dc779aSAndroid Build Coastguard Worker .global ixheaacd_postradixcompute4 20*15dc779aSAndroid Build Coastguard Worker 21*15dc779aSAndroid Build Coastguard Worker 22*15dc779aSAndroid Build Coastguard Workerixheaacd_postradixcompute4: 23*15dc779aSAndroid Build Coastguard Worker 24*15dc779aSAndroid Build Coastguard Worker // STMFD sp!, {x4-x12, x14} 25*15dc779aSAndroid Build Coastguard Worker push_v_regs 26*15dc779aSAndroid Build Coastguard Worker //SUB sp, sp, #16 27*15dc779aSAndroid Build Coastguard Worker 28*15dc779aSAndroid Build Coastguard Worker //HARD CODED for FFT Length of 16 29*15dc779aSAndroid Build Coastguard Worker // x3 is always 16 30*15dc779aSAndroid Build Coastguard Worker 31*15dc779aSAndroid Build Coastguard Worker 32*15dc779aSAndroid Build Coastguard Worker //SUB x4, x3, #2 ; y to y offset calculated 33*15dc779aSAndroid Build Coastguard Worker //MOV x4, #14 34*15dc779aSAndroid Build Coastguard Worker //STR x4, [sp, #8] ; (npoints / 2)*4bytes - 4bytes 35*15dc779aSAndroid Build Coastguard Worker 36*15dc779aSAndroid Build Coastguard Worker //STR x0, [sp, #12] ; (3*(npoints/2))*4bytes - 4bytes 37*15dc779aSAndroid Build Coastguard Worker // x0 to x2 offset (npoints / 2)*4bytes 38*15dc779aSAndroid Build Coastguard Worker ADD x4, x1, x3, lsl #1 // x1 -> x0, x4 -> x2 39*15dc779aSAndroid Build Coastguard Worker MOV x3, #2 40*15dc779aSAndroid Build Coastguard Worker 41*15dc779aSAndroid Build Coastguard Worker 42*15dc779aSAndroid Build Coastguard WorkerPOSTRADIX4_START: 43*15dc779aSAndroid Build Coastguard Worker 44*15dc779aSAndroid Build Coastguard Worker// LDMIA x1!, {x5-x12} // x_0 :x_7 45*15dc779aSAndroid Build Coastguard Worker 46*15dc779aSAndroid Build Coastguard Worker LDP w5, w6, [x1], #8 // x_0 :x_1 47*15dc779aSAndroid Build Coastguard Worker LDP w7, w8, [x1], #8 // x_2 :x_3 48*15dc779aSAndroid Build Coastguard Worker LDP w9, w10, [x1], #8 // x_4 :x_5 49*15dc779aSAndroid Build Coastguard Worker LDP w11, w12, [x1], #8 // x_6 :x_7 50*15dc779aSAndroid Build Coastguard Worker 51*15dc779aSAndroid Build Coastguard Worker ADD w14, w5, w9 // xh0_0 = x_0 + x_4 52*15dc779aSAndroid Build Coastguard Worker SUB w5, w5, w9 // xl0_0 = x_0 - x_4 53*15dc779aSAndroid Build Coastguard Worker 54*15dc779aSAndroid Build Coastguard Worker ADD w9, w6, w10 // xh1_0 = x_1 + x_5 55*15dc779aSAndroid Build Coastguard Worker SUB w6, w6, w10 // xl1_0 = x_1 - x_5 56*15dc779aSAndroid Build Coastguard Worker 57*15dc779aSAndroid Build Coastguard Worker ADD w10, w7, w11 // xh0_1 = x_2 + x_6 58*15dc779aSAndroid Build Coastguard Worker SUB w7, w7, w11 // xl0_1 = x_2 - x_6 59*15dc779aSAndroid Build Coastguard Worker 60*15dc779aSAndroid Build Coastguard Worker ADD w11, w8, w12 // xh1_1 = x_3 + x_7 61*15dc779aSAndroid Build Coastguard Worker SUB w8, w8, w12 // xl1_1 = x_3 - x_7 62*15dc779aSAndroid Build Coastguard Worker 63*15dc779aSAndroid Build Coastguard Worker ADD w12, w14, w10 // n00 = xh0_0 + xh0_1 64*15dc779aSAndroid Build Coastguard Worker SUB w14, w14, w10 // n20 = xh0_0 - xh0_1 65*15dc779aSAndroid Build Coastguard Worker 66*15dc779aSAndroid Build Coastguard Worker ADD w10, w9, w11 // n01 = xh1_0 + xh1_1 67*15dc779aSAndroid Build Coastguard Worker SUB w9, w9, w11 // n21 = xh1_0 - xh1_1 68*15dc779aSAndroid Build Coastguard Worker 69*15dc779aSAndroid Build Coastguard Worker ADD w11, w5, w8 // n10 = xl0_0 + xl1_1 70*15dc779aSAndroid Build Coastguard Worker SUB w5, w5, w8 // n30 = xl0_0 - xl1_1 71*15dc779aSAndroid Build Coastguard Worker 72*15dc779aSAndroid Build Coastguard Worker ADD w8, w6, w7 // n31 = xl1_0 + xl0_1 73*15dc779aSAndroid Build Coastguard Worker SUB w6, w6, w7 // n11 = xl1_0 - xl0_1 74*15dc779aSAndroid Build Coastguard Worker 75*15dc779aSAndroid Build Coastguard Worker 76*15dc779aSAndroid Build Coastguard Worker STR w12, [x0], #4 // y0[h2] = n00, x7 -> y0[h2 + 1] 77*15dc779aSAndroid Build Coastguard Worker 78*15dc779aSAndroid Build Coastguard Worker STR w10, [x0], #14<<1 // y0[h2 + 1] = n01, x7 -> y1[h2] 79*15dc779aSAndroid Build Coastguard Worker 80*15dc779aSAndroid Build Coastguard Worker STR w11, [x0], #4 // y1[h2] = n10, x7 -> y1[h2 + 1] 81*15dc779aSAndroid Build Coastguard Worker STR w6 , [x0], #14<<1 // y1[h2 + 1] = n11, x7 -> y2[h2] 82*15dc779aSAndroid Build Coastguard Worker 83*15dc779aSAndroid Build Coastguard Worker STR w14, [x0], #4 // y2[h2] = n20, x7 -> y2[h2 + 1] 84*15dc779aSAndroid Build Coastguard Worker STR w9 , [x0], #14<<1 // y2[h2 + 1] = n21, x7 -> y3[h2] 85*15dc779aSAndroid Build Coastguard Worker 86*15dc779aSAndroid Build Coastguard Worker STR w5, [x0], #4 // y3[h2] = n30, x7 -> y3[h2 + 1] 87*15dc779aSAndroid Build Coastguard Worker STR w8, [x0], #0 // y3[h2 + 1] = n31, x7 -> y0[h2+2] 88*15dc779aSAndroid Build Coastguard Worker 89*15dc779aSAndroid Build Coastguard Worker// LDMIA x4!, {x5-x12} // x_0 :x_7 90*15dc779aSAndroid Build Coastguard Worker 91*15dc779aSAndroid Build Coastguard Worker LDP w5, w6, [x4], #8 // x_8 :x_8 92*15dc779aSAndroid Build Coastguard Worker LDP w7, w8, [x4], #8 // x_a :x_b 93*15dc779aSAndroid Build Coastguard Worker LDP w9, w10, [x4], #8 // x_c :x_d 94*15dc779aSAndroid Build Coastguard Worker LDP w11, w12, [x4], #8 // x_e :x_f 95*15dc779aSAndroid Build Coastguard Worker 96*15dc779aSAndroid Build Coastguard Worker SUB x0, x0, #92 // #4*3 + #14<<1 * 3 - 8 97*15dc779aSAndroid Build Coastguard Worker 98*15dc779aSAndroid Build Coastguard Worker 99*15dc779aSAndroid Build Coastguard Worker ADD w14, w5, w9 100*15dc779aSAndroid Build Coastguard Worker SUB w5, w5, w9 101*15dc779aSAndroid Build Coastguard Worker 102*15dc779aSAndroid Build Coastguard Worker ADD w9, w6, w10 103*15dc779aSAndroid Build Coastguard Worker SUB w6, w6, w10 104*15dc779aSAndroid Build Coastguard Worker 105*15dc779aSAndroid Build Coastguard Worker ADD w10, w7, w11 106*15dc779aSAndroid Build Coastguard Worker SUB w7, w7, w11 107*15dc779aSAndroid Build Coastguard Worker 108*15dc779aSAndroid Build Coastguard Worker ADD w11, w8, w12 109*15dc779aSAndroid Build Coastguard Worker SUB w8, w8, w12 110*15dc779aSAndroid Build Coastguard Worker 111*15dc779aSAndroid Build Coastguard Worker ADD w12, w14, w10 112*15dc779aSAndroid Build Coastguard Worker SUB w14, w14, w10 113*15dc779aSAndroid Build Coastguard Worker 114*15dc779aSAndroid Build Coastguard Worker ADD w10, w9, w11 115*15dc779aSAndroid Build Coastguard Worker SUB w9, w9, w11 116*15dc779aSAndroid Build Coastguard Worker 117*15dc779aSAndroid Build Coastguard Worker ADD w11, w5, w8 118*15dc779aSAndroid Build Coastguard Worker SUB w5, w5, w8 119*15dc779aSAndroid Build Coastguard Worker 120*15dc779aSAndroid Build Coastguard Worker ADD w8, w6, w7 121*15dc779aSAndroid Build Coastguard Worker SUB w6, w6, w7 122*15dc779aSAndroid Build Coastguard Worker 123*15dc779aSAndroid Build Coastguard Worker STR w12, [x0], #4 124*15dc779aSAndroid Build Coastguard Worker STR w10, [x0], #14<<1 125*15dc779aSAndroid Build Coastguard Worker 126*15dc779aSAndroid Build Coastguard Worker STR w11, [x0], #4 127*15dc779aSAndroid Build Coastguard Worker STR w6, [x0], #14<<1 128*15dc779aSAndroid Build Coastguard Worker 129*15dc779aSAndroid Build Coastguard Worker STR w14, [x0], #4 130*15dc779aSAndroid Build Coastguard Worker STR w9, [x0], #14<<1 131*15dc779aSAndroid Build Coastguard Worker 132*15dc779aSAndroid Build Coastguard Worker 133*15dc779aSAndroid Build Coastguard Worker STR w5, [x0], #4 134*15dc779aSAndroid Build Coastguard Worker STR w8, [x0], #0 135*15dc779aSAndroid Build Coastguard Worker 136*15dc779aSAndroid Build Coastguard Worker ADD x1, x1, #1 << 5 // x0 += (Word32) npoints >> 1 137*15dc779aSAndroid Build Coastguard Worker ADD x4, x4, #1 << 5 // x2 += (Word32) npoints >> 1 138*15dc779aSAndroid Build Coastguard Worker SUB x0, x0, #100-8 139*15dc779aSAndroid Build Coastguard Worker 140*15dc779aSAndroid Build Coastguard Worker SUBS w3, w3, #1 141*15dc779aSAndroid Build Coastguard Worker 142*15dc779aSAndroid Build Coastguard Worker BGT POSTRADIX4_START 143*15dc779aSAndroid Build Coastguard Worker 144*15dc779aSAndroid Build Coastguard Worker // LDMFD sp!, {x4-x12, x15} 145*15dc779aSAndroid Build Coastguard Worker pop_v_regs 146*15dc779aSAndroid Build Coastguard Worker ret 147*15dc779aSAndroid Build Coastguard Worker 148*15dc779aSAndroid Build Coastguard Worker 149