lpc_asm.s
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:9k
源码类别:

Windows CE

开发平台:

C/C++

  1. ;  libFLAC - Free Lossless Audio Codec library
  2. ;  Copyright (C) 2004,2005  Josh Coalson
  3. ;
  4. ;  Redistribution and use in source and binary forms, with or without
  5. ;  modification, are permitted provided that the following conditions
  6. ;  are met:
  7. ;
  8. ;  - Redistributions of source code must retain the above copyright
  9. ;  notice, this list of conditions and the following disclaimer.
  10. ;
  11. ;  - Redistributions in binary form must reproduce the above copyright
  12. ;  notice, this list of conditions and the following disclaimer in the
  13. ;  documentation and/or other materials provided with the distribution.
  14. ;
  15. ;  - Neither the name of the Xiph.org Foundation nor the names of its
  16. ;  contributors may be used to endorse or promote products derived from
  17. ;  this software without specific prior written permission.
  18. ;
  19. ;  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. ;  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. ;  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. ;  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
  23. ;  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24. ;  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25. ;  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26. ;  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27. ;  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28. ;  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29. ;  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. .text
  31. .align 2
  32. .globl _FLAC__lpc_restore_signal_asm_ppc_altivec_16
  33. .globl _FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8
  34. _FLAC__lpc_restore_signal_asm_ppc_altivec_16:
  35. ; r3: residual[]
  36. ; r4: data_len
  37. ; r5: qlp_coeff[]
  38. ; r6: order
  39. ; r7: lp_quantization
  40. ; r8: data[]
  41. ; see src/libFLAC/lpc.c:FLAC__lpc_restore_signal()
  42. ; these is a PowerPC/Altivec assembly version which requires bps<=16 (or actual
  43. ; bps<=15 for mid-side coding, since that uses an extra bit)
  44. ; these should be fast; the inner loop is unrolled (it takes no more than
  45. ; 3*(order%4) instructions, all of which are arithmetic), and all of the
  46. ; coefficients and all relevant history stay in registers, so the outer loop
  47. ; has only one load from memory (the residual)
  48. ; I have not yet run this through simg4, so there may be some avoidable stalls,
  49. ; and there may be a somewhat more clever way to do the outer loop
  50. ; the branch mechanism may prevent dynamic loading; I still need to examine
  51. ; this issue, and there may be a more elegant method
  52. stmw r31,-4(r1)
  53. addi r9,r1,-28
  54. li r31,0xf
  55. andc r9,r9,r31 ; for quadword-aligned stack data
  56. slwi r6,r6,2 ; adjust for word size
  57. slwi r4,r4,2
  58. add r4,r4,r8 ; r4 = data+data_len
  59. mfspr r0,256 ; cache old vrsave
  60. addis r31,0,hi16(0xfffffc00)
  61. ori r31,r31,lo16(0xfffffc00)
  62. mtspr 256,r31 ; declare VRs in vrsave
  63. cmplw cr0,r8,r4 ; i<data_len
  64. bc 4,0,L1400
  65. ; load coefficients into v0-v7 and initial history into v8-v15
  66. li r31,0xf
  67. and r31,r8,r31 ; r31: data%4
  68. li r11,16
  69. subf r31,r31,r11 ; r31: 4-(data%4)
  70. slwi r31,r31,3 ; convert to bits for vsro
  71. li r10,-4
  72. stw r31,-4(r9)
  73. lvewx v0,r10,r9
  74. vspltisb v18,-1
  75. vsro v18,v18,v0 ; v18: mask vector
  76. li r31,0x8
  77. lvsl v0,0,r31
  78. vsldoi v0,v0,v0,12
  79. li r31,0xc
  80. lvsl v1,0,r31
  81. vspltisb v2,0
  82. vspltisb v3,-1
  83. vmrglw v2,v2,v3
  84. vsel v0,v1,v0,v2 ; v0: reversal permutation vector
  85. add r10,r5,r6
  86. lvsl v17,0,r5 ; v17: coefficient alignment permutation vector
  87. vperm v17,v17,v17,v0 ; v17: reversal coefficient alignment permutation vector
  88. mr r11,r8
  89. lvsl v16,0,r11 ; v16: history alignment permutation vector
  90. lvx v0,0,r5
  91. addi r5,r5,16
  92. lvx v1,0,r5
  93. vperm v0,v0,v1,v17
  94. lvx v8,0,r11
  95. addi r11,r11,-16
  96. lvx v9,0,r11
  97. vperm v8,v9,v8,v16
  98. cmplw cr0,r5,r10
  99. bc 12,0,L1101
  100. vand v0,v0,v18
  101. addis r31,0,hi16(L1307)
  102. ori r31,r31,lo16(L1307)
  103. b L1199
  104. L1101:
  105. addi r5,r5,16
  106. lvx v2,0,r5
  107. vperm v1,v1,v2,v17
  108. addi r11,r11,-16
  109. lvx v10,0,r11
  110. vperm v9,v10,v9,v16
  111. cmplw cr0,r5,r10
  112. bc 12,0,L1102
  113. vand v1,v1,v18
  114. addis r31,0,hi16(L1306)
  115. ori r31,r31,lo16(L1306)
  116. b L1199
  117. L1102:
  118. addi r5,r5,16
  119. lvx v3,0,r5
  120. vperm v2,v2,v3,v17
  121. addi r11,r11,-16
  122. lvx v11,0,r11
  123. vperm v10,v11,v10,v16
  124. cmplw cr0,r5,r10
  125. bc 12,0,L1103
  126. vand v2,v2,v18
  127. addis r31,0,hi16(L1305)
  128. ori r31,r31,lo16(L1305)
  129. b L1199
  130. L1103:
  131. addi r5,r5,16
  132. lvx v4,0,r5
  133. vperm v3,v3,v4,v17
  134. addi r11,r11,-16
  135. lvx v12,0,r11
  136. vperm v11,v12,v11,v16
  137. cmplw cr0,r5,r10
  138. bc 12,0,L1104
  139. vand v3,v3,v18
  140. addis r31,0,hi16(L1304)
  141. ori r31,r31,lo16(L1304)
  142. b L1199
  143. L1104:
  144. addi r5,r5,16
  145. lvx v5,0,r5
  146. vperm v4,v4,v5,v17
  147. addi r11,r11,-16
  148. lvx v13,0,r11
  149. vperm v12,v13,v12,v16
  150. cmplw cr0,r5,r10
  151. bc 12,0,L1105
  152. vand v4,v4,v18
  153. addis r31,0,hi16(L1303)
  154. ori r31,r31,lo16(L1303)
  155. b L1199
  156. L1105:
  157. addi r5,r5,16
  158. lvx v6,0,r5
  159. vperm v5,v5,v6,v17
  160. addi r11,r11,-16
  161. lvx v14,0,r11
  162. vperm v13,v14,v13,v16
  163. cmplw cr0,r5,r10
  164. bc 12,0,L1106
  165. vand v5,v5,v18
  166. addis r31,0,hi16(L1302)
  167. ori r31,r31,lo16(L1302)
  168. b L1199
  169. L1106:
  170. addi r5,r5,16
  171. lvx v7,0,r5
  172. vperm v6,v6,v7,v17
  173. addi r11,r11,-16
  174. lvx v15,0,r11
  175. vperm v14,v15,v14,v16
  176. cmplw cr0,r5,r10
  177. bc 12,0,L1107
  178. vand v6,v6,v18
  179. addis r31,0,hi16(L1301)
  180. ori r31,r31,lo16(L1301)
  181. b L1199
  182. L1107:
  183. addi r5,r5,16
  184. lvx v19,0,r5
  185. vperm v7,v7,v19,v17
  186. addi r11,r11,-16
  187. lvx v19,0,r11
  188. vperm v15,v19,v15,v16
  189. vand v7,v7,v18
  190. addis r31,0,hi16(L1300)
  191. ori r31,r31,lo16(L1300)
  192. L1199:
  193. mtctr r31
  194. ; set up invariant vectors
  195. vspltish v16,0 ; v16: zero vector
  196. li r10,-12
  197. lvsr v17,r10,r8 ; v17: result shift vector
  198. lvsl v18,r10,r3 ; v18: residual shift back vector
  199. li r10,-4
  200. stw r7,-4(r9)
  201. lvewx v19,r10,r9 ; v19: lp_quantization vector
  202. L1200:
  203. vmulosh v20,v0,v8 ; v20: sum vector
  204. bcctr 20,0
  205. L1300:
  206. vmulosh v21,v7,v15
  207. vsldoi v15,v15,v14,4 ; increment history
  208. vaddsws v20,v20,v21
  209. L1301:
  210. vmulosh v21,v6,v14
  211. vsldoi v14,v14,v13,4
  212. vaddsws v20,v20,v21
  213. L1302:
  214. vmulosh v21,v5,v13
  215. vsldoi v13,v13,v12,4
  216. vaddsws v20,v20,v21
  217. L1303:
  218. vmulosh v21,v4,v12
  219. vsldoi v12,v12,v11,4
  220. vaddsws v20,v20,v21
  221. L1304:
  222. vmulosh v21,v3,v11
  223. vsldoi v11,v11,v10,4
  224. vaddsws v20,v20,v21
  225. L1305:
  226. vmulosh v21,v2,v10
  227. vsldoi v10,v10,v9,4
  228. vaddsws v20,v20,v21
  229. L1306:
  230. vmulosh v21,v1,v9
  231. vsldoi v9,v9,v8,4
  232. vaddsws v20,v20,v21
  233. L1307:
  234. vsumsws v20,v20,v16 ; v20[3]: sum
  235. vsraw v20,v20,v19 ; v20[3]: sum >> lp_quantization
  236. lvewx v21,0,r3 ; v21[n]: *residual
  237. vperm v21,v21,v21,v18 ; v21[3]: *residual
  238. vaddsws v20,v21,v20 ; v20[3]: *residual + (sum >> lp_quantization)
  239. vsldoi v18,v18,v18,4 ; increment shift vector
  240. vperm v21,v20,v20,v17 ; v21[n]: shift for storage
  241. vsldoi v17,v17,v17,12 ; increment shift vector
  242. stvewx v21,0,r8
  243. vsldoi v20,v20,v20,12
  244. vsldoi v8,v8,v20,4 ; insert value onto history
  245. addi r3,r3,4
  246. addi r8,r8,4
  247. cmplw cr0,r8,r4 ; i<data_len
  248. bc 12,0,L1200
  249. L1400:
  250. mtspr 256,r0 ; restore old vrsave
  251. lmw r31,-4(r1)
  252. blr
  253. _FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8:
  254. ; r3: residual[]
  255. ; r4: data_len
  256. ; r5: qlp_coeff[]
  257. ; r6: order
  258. ; r7: lp_quantization
  259. ; r8: data[]
  260. ; see _FLAC__lpc_restore_signal_asm_ppc_altivec_16() above
  261. ; this version assumes order<=8; it uses fewer vector registers, which should
  262. ; save time in context switches, and has less code, which may improve
  263. ; instruction caching
  264. stmw r31,-4(r1)
  265. addi r9,r1,-28
  266. li r31,0xf
  267. andc r9,r9,r31 ; for quadword-aligned stack data
  268. slwi r6,r6,2 ; adjust for word size
  269. slwi r4,r4,2
  270. add r4,r4,r8 ; r4 = data+data_len
  271. mfspr r0,256 ; cache old vrsave
  272. addis r31,0,hi16(0xffc00000)
  273. ori r31,r31,lo16(0xffc00000)
  274. mtspr 256,r31 ; declare VRs in vrsave
  275. cmplw cr0,r8,r4 ; i<data_len
  276. bc 4,0,L2400
  277. ; load coefficients into v0-v1 and initial history into v2-v3
  278. li r31,0xf
  279. and r31,r8,r31 ; r31: data%4
  280. li r11,16
  281. subf r31,r31,r11 ; r31: 4-(data%4)
  282. slwi r31,r31,3 ; convert to bits for vsro
  283. li r10,-4
  284. stw r31,-4(r9)
  285. lvewx v0,r10,r9
  286. vspltisb v6,-1
  287. vsro v6,v6,v0 ; v6: mask vector
  288. li r31,0x8
  289. lvsl v0,0,r31
  290. vsldoi v0,v0,v0,12
  291. li r31,0xc
  292. lvsl v1,0,r31
  293. vspltisb v2,0
  294. vspltisb v3,-1
  295. vmrglw v2,v2,v3
  296. vsel v0,v1,v0,v2 ; v0: reversal permutation vector
  297. add r10,r5,r6
  298. lvsl v5,0,r5 ; v5: coefficient alignment permutation vector
  299. vperm v5,v5,v5,v0 ; v5: reversal coefficient alignment permutation vector
  300. mr r11,r8
  301. lvsl v4,0,r11 ; v4: history alignment permutation vector
  302. lvx v0,0,r5
  303. addi r5,r5,16
  304. lvx v1,0,r5
  305. vperm v0,v0,v1,v5
  306. lvx v2,0,r11
  307. addi r11,r11,-16
  308. lvx v3,0,r11
  309. vperm v2,v3,v2,v4
  310. cmplw cr0,r5,r10
  311. bc 12,0,L2101
  312. vand v0,v0,v6
  313. addis r31,0,hi16(L2301)
  314. ori r31,r31,lo16(L2301)
  315. b L2199
  316. L2101:
  317. addi r5,r5,16
  318. lvx v7,0,r5
  319. vperm v1,v1,v7,v5
  320. addi r11,r11,-16
  321. lvx v7,0,r11
  322. vperm v3,v7,v3,v4
  323. vand v1,v1,v6
  324. addis r31,0,hi16(L2300)
  325. ori r31,r31,lo16(L2300)
  326. L2199:
  327. mtctr r31
  328. ; set up invariant vectors
  329. vspltish v4,0 ; v4: zero vector
  330. li r10,-12
  331. lvsr v5,r10,r8 ; v5: result shift vector
  332. lvsl v6,r10,r3 ; v6: residual shift back vector
  333. li r10,-4
  334. stw r7,-4(r9)
  335. lvewx v7,r10,r9 ; v7: lp_quantization vector
  336. L2200:
  337. vmulosh v8,v0,v2 ; v8: sum vector
  338. bcctr 20,0
  339. L2300:
  340. vmulosh v9,v1,v3
  341. vsldoi v3,v3,v2,4
  342. vaddsws v8,v8,v9
  343. L2301:
  344. vsumsws v8,v8,v4 ; v8[3]: sum
  345. vsraw v8,v8,v7 ; v8[3]: sum >> lp_quantization
  346. lvewx v9,0,r3 ; v9[n]: *residual
  347. vperm v9,v9,v9,v6 ; v9[3]: *residual
  348. vaddsws v8,v9,v8 ; v8[3]: *residual + (sum >> lp_quantization)
  349. vsldoi v6,v6,v6,4 ; increment shift vector
  350. vperm v9,v8,v8,v5 ; v9[n]: shift for storage
  351. vsldoi v5,v5,v5,12 ; increment shift vector
  352. stvewx v9,0,r8
  353. vsldoi v8,v8,v8,12
  354. vsldoi v2,v2,v8,4 ; insert value onto history
  355. addi r3,r3,4
  356. addi r8,r8,4
  357. cmplw cr0,r8,r4 ; i<data_len
  358. bc 12,0,L2200
  359. L2400:
  360. mtspr 256,r0 ; restore old vrsave
  361. lmw r31,-4(r1)
  362. blr