You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

532 lines
18KB

  1. /*
  2. * SPARC VIS optimized inverse DCT
  3. * Copyright (c) 2007 Denes Balatoni < dbalatoni XatX interware XdotX hu >
  4. *
  5. * I did consult the following fine web page about dct
  6. * http://www.geocities.com/ssavekar/dct.htm
  7. *
  8. * This file is part of Libav.
  9. *
  10. * Libav is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU Lesser General Public
  12. * License as published by the Free Software Foundation; either
  13. * version 2.1 of the License, or (at your option) any later version.
  14. *
  15. * Libav is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. * Lesser General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU Lesser General Public
  21. * License along with Libav; if not, write to the Free Software
  22. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  23. */
  24. #include <stdint.h>
  25. #include "dsputil_vis.h"
  26. #include "libavutil/mem.h"
  27. static const DECLARE_ALIGNED(8, int16_t, coeffs)[28] = {
  28. - 1259,- 1259,- 1259,- 1259,
  29. - 4989,- 4989,- 4989,- 4989,
  30. -11045,-11045,-11045,-11045,
  31. -19195,-19195,-19195,-19195,
  32. -29126,-29126,-29126,-29126,
  33. 25080, 25080, 25080, 25080,
  34. 12785, 12785, 12785, 12785
  35. };
  36. static const DECLARE_ALIGNED(8, uint16_t, scale)[4] = {
  37. 65536>>6, 65536>>6, 65536>>6, 65536>>6
  38. };
  39. static const DECLARE_ALIGNED(8, uint16_t, rounder)[4] = {
  40. 1<<5, 1<<5, 1<<5, 1<<5
  41. };
  42. static const DECLARE_ALIGNED(8, uint16_t, expand)[4] = {
  43. 1<<14, 1<<14, 1<<14, 1<<14
  44. };
  45. #define INIT_IDCT \
  46. "ldd [%1], %%f32 \n\t"\
  47. "ldd [%1+8], %%f34 \n\t"\
  48. "ldd [%1+16], %%f36 \n\t"\
  49. "ldd [%1+24], %%f38 \n\t"\
  50. "ldd [%1+32], %%f40 \n\t"\
  51. "ldd [%1+40], %%f42 \n\t"\
  52. "ldd [%1+48], %%f44 \n\t"\
  53. "ldd [%0], %%f46 \n\t"\
  54. "fzero %%f62 \n\t"\
  55. #define LOADSCALE(in) \
  56. "ldd [" in "], %%f0 \n\t"\
  57. "ldd [" in "+16], %%f2 \n\t"\
  58. "ldd [" in "+32], %%f4 \n\t"\
  59. "ldd [" in "+48], %%f6 \n\t"\
  60. "ldd [" in "+64], %%f8 \n\t"\
  61. "ldd [" in "+80], %%f10 \n\t"\
  62. "ldd [" in "+96], %%f12 \n\t"\
  63. "ldd [" in "+112], %%f14 \n\t"\
  64. "fpadd16 %%f0, %%f0, %%f0 \n\t"\
  65. "fpadd16 %%f2, %%f2, %%f2 \n\t"\
  66. "fpadd16 %%f4, %%f4, %%f4 \n\t"\
  67. "fpadd16 %%f6, %%f6, %%f6 \n\t"\
  68. "fpadd16 %%f8, %%f8, %%f8 \n\t"\
  69. "fpadd16 %%f10, %%f10, %%f10 \n\t"\
  70. "fpadd16 %%f12, %%f12, %%f12 \n\t"\
  71. "fpadd16 %%f14, %%f14, %%f14 \n\t"\
  72. \
  73. "fpadd16 %%f0, %%f0, %%f0 \n\t"\
  74. "fpadd16 %%f2, %%f2, %%f2 \n\t"\
  75. "fpadd16 %%f4, %%f4, %%f4 \n\t"\
  76. "fpadd16 %%f6, %%f6, %%f6 \n\t"\
  77. "fpadd16 %%f8, %%f8, %%f8 \n\t"\
  78. "fpadd16 %%f10, %%f10, %%f10 \n\t"\
  79. "fpadd16 %%f12, %%f12, %%f12 \n\t"\
  80. "fpadd16 %%f14, %%f14, %%f14 \n\t"\
  81. \
  82. "fpadd16 %%f0, %%f0, %%f0 \n\t"\
  83. "fpadd16 %%f2, %%f2, %%f2 \n\t"\
  84. "fpadd16 %%f4, %%f4, %%f4 \n\t"\
  85. "fpadd16 %%f6, %%f6, %%f6 \n\t"\
  86. "fpadd16 %%f8, %%f8, %%f8 \n\t"\
  87. "fpadd16 %%f10, %%f10, %%f10 \n\t"\
  88. "fpadd16 %%f12, %%f12, %%f12 \n\t"\
  89. "fpadd16 %%f14, %%f14, %%f14 \n\t"\
  90. \
  91. "fpadd16 %%f0, %%f0, %%f0 \n\t"\
  92. "fpadd16 %%f2, %%f2, %%f2 \n\t"\
  93. "fpadd16 %%f4, %%f4, %%f4 \n\t"\
  94. "fpadd16 %%f6, %%f6, %%f6 \n\t"\
  95. "fpadd16 %%f8, %%f8, %%f8 \n\t"\
  96. "fpadd16 %%f10, %%f10, %%f10 \n\t"\
  97. "fpadd16 %%f12, %%f12, %%f12 \n\t"\
  98. "fpadd16 %%f14, %%f14, %%f14 \n\t"\
  99. #define LOAD(in) \
  100. "ldd [" in "], %%f16 \n\t"\
  101. "ldd [" in "+8], %%f18 \n\t"\
  102. "ldd [" in "+16], %%f20 \n\t"\
  103. "ldd [" in "+24], %%f22 \n\t"\
  104. "ldd [" in "+32], %%f24 \n\t"\
  105. "ldd [" in "+40], %%f26 \n\t"\
  106. "ldd [" in "+48], %%f28 \n\t"\
  107. "ldd [" in "+56], %%f30 \n\t"\
  108. #define TRANSPOSE \
  109. "fpmerge %%f16, %%f24, %%f0 \n\t"\
  110. "fpmerge %%f20, %%f28, %%f2 \n\t"\
  111. "fpmerge %%f17, %%f25, %%f4 \n\t"\
  112. "fpmerge %%f21, %%f29, %%f6 \n\t"\
  113. "fpmerge %%f18, %%f26, %%f8 \n\t"\
  114. "fpmerge %%f22, %%f30, %%f10 \n\t"\
  115. "fpmerge %%f19, %%f27, %%f12 \n\t"\
  116. "fpmerge %%f23, %%f31, %%f14 \n\t"\
  117. \
  118. "fpmerge %%f0, %%f2, %%f16 \n\t"\
  119. "fpmerge %%f1, %%f3, %%f18 \n\t"\
  120. "fpmerge %%f4, %%f6, %%f20 \n\t"\
  121. "fpmerge %%f5, %%f7, %%f22 \n\t"\
  122. "fpmerge %%f8, %%f10, %%f24 \n\t"\
  123. "fpmerge %%f9, %%f11, %%f26 \n\t"\
  124. "fpmerge %%f12, %%f14, %%f28 \n\t"\
  125. "fpmerge %%f13, %%f15, %%f30 \n\t"\
  126. \
  127. "fpmerge %%f16, %%f17, %%f0 \n\t"\
  128. "fpmerge %%f18, %%f19, %%f2 \n\t"\
  129. "fpmerge %%f20, %%f21, %%f4 \n\t"\
  130. "fpmerge %%f22, %%f23, %%f6 \n\t"\
  131. "fpmerge %%f24, %%f25, %%f8 \n\t"\
  132. "fpmerge %%f26, %%f27, %%f10 \n\t"\
  133. "fpmerge %%f28, %%f29, %%f12 \n\t"\
  134. "fpmerge %%f30, %%f31, %%f14 \n\t"\
  135. #define IDCT4ROWS \
  136. /* 1. column */\
  137. "fmul8ulx16 %%f0, %%f38, %%f28 \n\t"\
  138. "for %%f4, %%f6, %%f60 \n\t"\
  139. "fmul8ulx16 %%f2, %%f32, %%f18 \n\t"\
  140. "fmul8ulx16 %%f2, %%f36, %%f22 \n\t"\
  141. "fmul8ulx16 %%f2, %%f40, %%f26 \n\t"\
  142. "fmul8ulx16 %%f2, %%f44, %%f30 \n\t"\
  143. \
  144. ADDROUNDER\
  145. \
  146. "fmul8sux16 %%f0, %%f38, %%f48 \n\t"\
  147. "fcmpd %%fcc0, %%f62, %%f60 \n\t"\
  148. "for %%f8, %%f10, %%f60 \n\t"\
  149. "fmul8sux16 %%f2, %%f32, %%f50 \n\t"\
  150. "fmul8sux16 %%f2, %%f36, %%f52 \n\t"\
  151. "fmul8sux16 %%f2, %%f40, %%f54 \n\t"\
  152. "fmul8sux16 %%f2, %%f44, %%f56 \n\t"\
  153. \
  154. "fpadd16 %%f48, %%f28, %%f28 \n\t"\
  155. "fcmpd %%fcc1, %%f62, %%f60 \n\t"\
  156. "for %%f12, %%f14, %%f60 \n\t"\
  157. "fpadd16 %%f50, %%f18, %%f18 \n\t"\
  158. "fpadd16 %%f52, %%f22, %%f22 \n\t"\
  159. "fpadd16 %%f54, %%f26, %%f26 \n\t"\
  160. "fpadd16 %%f56, %%f30, %%f30 \n\t"\
  161. \
  162. "fpadd16 %%f28, %%f0, %%f16 \n\t"\
  163. "fcmpd %%fcc2, %%f62, %%f60 \n\t"\
  164. "fpadd16 %%f28, %%f0, %%f20 \n\t"\
  165. "fpadd16 %%f28, %%f0, %%f24 \n\t"\
  166. "fpadd16 %%f28, %%f0, %%f28 \n\t"\
  167. "fpadd16 %%f18, %%f2, %%f18 \n\t"\
  168. "fpadd16 %%f22, %%f2, %%f22 \n\t"\
  169. /* 2. column */\
  170. "fbe %%fcc0, 3f \n\t"\
  171. "fpadd16 %%f26, %%f2, %%f26 \n\t"\
  172. "fmul8ulx16 %%f4, %%f34, %%f48 \n\t"\
  173. "fmul8ulx16 %%f4, %%f42, %%f50 \n\t"\
  174. "fmul8ulx16 %%f6, %%f36, %%f52 \n\t"\
  175. "fmul8ulx16 %%f6, %%f44, %%f54 \n\t"\
  176. "fmul8ulx16 %%f6, %%f32, %%f56 \n\t"\
  177. "fmul8ulx16 %%f6, %%f40, %%f58 \n\t"\
  178. \
  179. "fpadd16 %%f16, %%f48, %%f16 \n\t"\
  180. "fpadd16 %%f20, %%f50, %%f20 \n\t"\
  181. "fpsub16 %%f24, %%f50, %%f24 \n\t"\
  182. "fpsub16 %%f28, %%f48, %%f28 \n\t"\
  183. "fpadd16 %%f18, %%f52, %%f18 \n\t"\
  184. "fpsub16 %%f22, %%f54, %%f22 \n\t"\
  185. "fpsub16 %%f26, %%f56, %%f26 \n\t"\
  186. "fpsub16 %%f30, %%f58, %%f30 \n\t"\
  187. \
  188. "fmul8sux16 %%f4, %%f34, %%f48 \n\t"\
  189. "fmul8sux16 %%f4, %%f42, %%f50 \n\t"\
  190. "fmul8sux16 %%f6, %%f36, %%f52 \n\t"\
  191. "fmul8sux16 %%f6, %%f44, %%f54 \n\t"\
  192. "fmul8sux16 %%f6, %%f32, %%f56 \n\t"\
  193. "fmul8sux16 %%f6, %%f40, %%f58 \n\t"\
  194. \
  195. "fpadd16 %%f16, %%f48, %%f16 \n\t"\
  196. "fpadd16 %%f20, %%f50, %%f20 \n\t"\
  197. "fpsub16 %%f24, %%f50, %%f24 \n\t"\
  198. "fpsub16 %%f28, %%f48, %%f28 \n\t"\
  199. "fpadd16 %%f18, %%f52, %%f18 \n\t"\
  200. "fpsub16 %%f22, %%f54, %%f22 \n\t"\
  201. "fpsub16 %%f26, %%f56, %%f26 \n\t"\
  202. "fpsub16 %%f30, %%f58, %%f30 \n\t"\
  203. \
  204. "fpadd16 %%f16, %%f4, %%f16 \n\t"\
  205. "fpsub16 %%f28, %%f4, %%f28 \n\t"\
  206. "fpadd16 %%f18, %%f6, %%f18 \n\t"\
  207. "fpsub16 %%f26, %%f6, %%f26 \n\t"\
  208. /* 3. column */\
  209. "3: \n\t"\
  210. "fbe %%fcc1, 4f \n\t"\
  211. "fpsub16 %%f30, %%f6, %%f30 \n\t"\
  212. "fmul8ulx16 %%f8, %%f38, %%f48 \n\t"\
  213. "fmul8ulx16 %%f10, %%f40, %%f50 \n\t"\
  214. "fmul8ulx16 %%f10, %%f32, %%f52 \n\t"\
  215. "fmul8ulx16 %%f10, %%f44, %%f54 \n\t"\
  216. "fmul8ulx16 %%f10, %%f36, %%f56 \n\t"\
  217. \
  218. "fpadd16 %%f16, %%f48, %%f16 \n\t"\
  219. "fpsub16 %%f20, %%f48, %%f20 \n\t"\
  220. "fpsub16 %%f24, %%f48, %%f24 \n\t"\
  221. "fpadd16 %%f28, %%f48, %%f28 \n\t"\
  222. "fpadd16 %%f18, %%f50, %%f18 \n\t"\
  223. "fpsub16 %%f22, %%f52, %%f22 \n\t"\
  224. "fpadd16 %%f26, %%f54, %%f26 \n\t"\
  225. "fpadd16 %%f30, %%f56, %%f30 \n\t"\
  226. \
  227. "fmul8sux16 %%f8, %%f38, %%f48 \n\t"\
  228. "fmul8sux16 %%f10, %%f40, %%f50 \n\t"\
  229. "fmul8sux16 %%f10, %%f32, %%f52 \n\t"\
  230. "fmul8sux16 %%f10, %%f44, %%f54 \n\t"\
  231. "fmul8sux16 %%f10, %%f36, %%f56 \n\t"\
  232. \
  233. "fpadd16 %%f16, %%f48, %%f16 \n\t"\
  234. "fpsub16 %%f20, %%f48, %%f20 \n\t"\
  235. "fpsub16 %%f24, %%f48, %%f24 \n\t"\
  236. "fpadd16 %%f28, %%f48, %%f28 \n\t"\
  237. "fpadd16 %%f18, %%f50, %%f18 \n\t"\
  238. "fpsub16 %%f22, %%f52, %%f22 \n\t"\
  239. "fpadd16 %%f26, %%f54, %%f26 \n\t"\
  240. "fpadd16 %%f30, %%f56, %%f30 \n\t"\
  241. \
  242. "fpadd16 %%f16, %%f8, %%f16 \n\t"\
  243. "fpsub16 %%f20, %%f8, %%f20 \n\t"\
  244. "fpsub16 %%f24, %%f8, %%f24 \n\t"\
  245. "fpadd16 %%f28, %%f8, %%f28 \n\t"\
  246. "fpadd16 %%f18, %%f10, %%f18 \n\t"\
  247. "fpsub16 %%f22, %%f10, %%f22 \n\t"\
  248. /* 4. column */\
  249. "4: \n\t"\
  250. "fbe %%fcc2, 5f \n\t"\
  251. "fpadd16 %%f30, %%f10, %%f30 \n\t"\
  252. "fmul8ulx16 %%f12, %%f42, %%f48 \n\t"\
  253. "fmul8ulx16 %%f12, %%f34, %%f50 \n\t"\
  254. "fmul8ulx16 %%f14, %%f44, %%f52 \n\t"\
  255. "fmul8ulx16 %%f14, %%f40, %%f54 \n\t"\
  256. "fmul8ulx16 %%f14, %%f36, %%f56 \n\t"\
  257. "fmul8ulx16 %%f14, %%f32, %%f58 \n\t"\
  258. \
  259. "fpadd16 %%f16, %%f48, %%f16 \n\t"\
  260. "fpsub16 %%f20, %%f50, %%f20 \n\t"\
  261. "fpadd16 %%f24, %%f50, %%f24 \n\t"\
  262. "fpsub16 %%f28, %%f48, %%f28 \n\t"\
  263. "fpadd16 %%f18, %%f52, %%f18 \n\t"\
  264. "fpsub16 %%f22, %%f54, %%f22 \n\t"\
  265. "fpadd16 %%f26, %%f56, %%f26 \n\t"\
  266. "fpsub16 %%f30, %%f58, %%f30 \n\t"\
  267. \
  268. "fmul8sux16 %%f12, %%f42, %%f48 \n\t"\
  269. "fmul8sux16 %%f12, %%f34, %%f50 \n\t"\
  270. "fmul8sux16 %%f14, %%f44, %%f52 \n\t"\
  271. "fmul8sux16 %%f14, %%f40, %%f54 \n\t"\
  272. "fmul8sux16 %%f14, %%f36, %%f56 \n\t"\
  273. "fmul8sux16 %%f14, %%f32, %%f58 \n\t"\
  274. \
  275. "fpadd16 %%f16, %%f48, %%f16 \n\t"\
  276. "fpsub16 %%f20, %%f50, %%f20 \n\t"\
  277. "fpadd16 %%f24, %%f50, %%f24 \n\t"\
  278. "fpsub16 %%f28, %%f48, %%f28 \n\t"\
  279. "fpadd16 %%f18, %%f52, %%f18 \n\t"\
  280. "fpsub16 %%f22, %%f54, %%f22 \n\t"\
  281. "fpadd16 %%f26, %%f56, %%f26 \n\t"\
  282. "fpsub16 %%f30, %%f58, %%f30 \n\t"\
  283. \
  284. "fpsub16 %%f20, %%f12, %%f20 \n\t"\
  285. "fpadd16 %%f24, %%f12, %%f24 \n\t"\
  286. "fpsub16 %%f22, %%f14, %%f22 \n\t"\
  287. "fpadd16 %%f26, %%f14, %%f26 \n\t"\
  288. "fpsub16 %%f30, %%f14, %%f30 \n\t"\
  289. /* final butterfly */\
  290. "5: \n\t"\
  291. "fpsub16 %%f16, %%f18, %%f48 \n\t"\
  292. "fpsub16 %%f20, %%f22, %%f50 \n\t"\
  293. "fpsub16 %%f24, %%f26, %%f52 \n\t"\
  294. "fpsub16 %%f28, %%f30, %%f54 \n\t"\
  295. "fpadd16 %%f16, %%f18, %%f16 \n\t"\
  296. "fpadd16 %%f20, %%f22, %%f20 \n\t"\
  297. "fpadd16 %%f24, %%f26, %%f24 \n\t"\
  298. "fpadd16 %%f28, %%f30, %%f28 \n\t"\
  299. #define STOREROWS(out) \
  300. "std %%f48, [" out "+112] \n\t"\
  301. "std %%f50, [" out "+96] \n\t"\
  302. "std %%f52, [" out "+80] \n\t"\
  303. "std %%f54, [" out "+64] \n\t"\
  304. "std %%f16, [" out "] \n\t"\
  305. "std %%f20, [" out "+16] \n\t"\
  306. "std %%f24, [" out "+32] \n\t"\
  307. "std %%f28, [" out "+48] \n\t"\
  308. #define SCALEROWS \
  309. "fmul8sux16 %%f46, %%f48, %%f48 \n\t"\
  310. "fmul8sux16 %%f46, %%f50, %%f50 \n\t"\
  311. "fmul8sux16 %%f46, %%f52, %%f52 \n\t"\
  312. "fmul8sux16 %%f46, %%f54, %%f54 \n\t"\
  313. "fmul8sux16 %%f46, %%f16, %%f16 \n\t"\
  314. "fmul8sux16 %%f46, %%f20, %%f20 \n\t"\
  315. "fmul8sux16 %%f46, %%f24, %%f24 \n\t"\
  316. "fmul8sux16 %%f46, %%f28, %%f28 \n\t"\
  317. #define PUTPIXELSCLAMPED(dest) \
  318. "fpack16 %%f48, %%f14 \n\t"\
  319. "fpack16 %%f50, %%f12 \n\t"\
  320. "fpack16 %%f16, %%f0 \n\t"\
  321. "fpack16 %%f20, %%f2 \n\t"\
  322. "fpack16 %%f24, %%f4 \n\t"\
  323. "fpack16 %%f28, %%f6 \n\t"\
  324. "fpack16 %%f54, %%f8 \n\t"\
  325. "fpack16 %%f52, %%f10 \n\t"\
  326. "st %%f0, [%3+" dest "] \n\t"\
  327. "st %%f2, [%5+" dest "] \n\t"\
  328. "st %%f4, [%6+" dest "] \n\t"\
  329. "st %%f6, [%7+" dest "] \n\t"\
  330. "st %%f8, [%8+" dest "] \n\t"\
  331. "st %%f10, [%9+" dest "] \n\t"\
  332. "st %%f12, [%10+" dest "] \n\t"\
  333. "st %%f14, [%11+" dest "] \n\t"\
  334. #define ADDPIXELSCLAMPED(dest) \
  335. "ldd [%5], %%f18 \n\t"\
  336. "ld [%3+" dest"], %%f0 \n\t"\
  337. "ld [%6+" dest"], %%f2 \n\t"\
  338. "ld [%7+" dest"], %%f4 \n\t"\
  339. "ld [%8+" dest"], %%f6 \n\t"\
  340. "ld [%9+" dest"], %%f8 \n\t"\
  341. "ld [%10+" dest"], %%f10 \n\t"\
  342. "ld [%11+" dest"], %%f12 \n\t"\
  343. "ld [%12+" dest"], %%f14 \n\t"\
  344. "fmul8x16 %%f0, %%f18, %%f0 \n\t"\
  345. "fmul8x16 %%f2, %%f18, %%f2 \n\t"\
  346. "fmul8x16 %%f4, %%f18, %%f4 \n\t"\
  347. "fmul8x16 %%f6, %%f18, %%f6 \n\t"\
  348. "fmul8x16 %%f8, %%f18, %%f8 \n\t"\
  349. "fmul8x16 %%f10, %%f18, %%f10 \n\t"\
  350. "fmul8x16 %%f12, %%f18, %%f12 \n\t"\
  351. "fmul8x16 %%f14, %%f18, %%f14 \n\t"\
  352. "fpadd16 %%f0, %%f16, %%f0 \n\t"\
  353. "fpadd16 %%f2, %%f20, %%f2 \n\t"\
  354. "fpadd16 %%f4, %%f24, %%f4 \n\t"\
  355. "fpadd16 %%f6, %%f28, %%f6 \n\t"\
  356. "fpadd16 %%f8, %%f54, %%f8 \n\t"\
  357. "fpadd16 %%f10, %%f52, %%f10 \n\t"\
  358. "fpadd16 %%f12, %%f50, %%f12 \n\t"\
  359. "fpadd16 %%f14, %%f48, %%f14 \n\t"\
  360. "fpack16 %%f0, %%f0 \n\t"\
  361. "fpack16 %%f2, %%f2 \n\t"\
  362. "fpack16 %%f4, %%f4 \n\t"\
  363. "fpack16 %%f6, %%f6 \n\t"\
  364. "fpack16 %%f8, %%f8 \n\t"\
  365. "fpack16 %%f10, %%f10 \n\t"\
  366. "fpack16 %%f12, %%f12 \n\t"\
  367. "fpack16 %%f14, %%f14 \n\t"\
  368. "st %%f0, [%3+" dest "] \n\t"\
  369. "st %%f2, [%6+" dest "] \n\t"\
  370. "st %%f4, [%7+" dest "] \n\t"\
  371. "st %%f6, [%8+" dest "] \n\t"\
  372. "st %%f8, [%9+" dest "] \n\t"\
  373. "st %%f10, [%10+" dest "] \n\t"\
  374. "st %%f12, [%11+" dest "] \n\t"\
  375. "st %%f14, [%12+" dest "] \n\t"\
  376. void ff_simple_idct_vis(int16_t *data) {
  377. int out1, out2, out3, out4;
  378. DECLARE_ALIGNED(8, int16_t, temp)[8*8];
  379. __asm__ volatile(
  380. INIT_IDCT
  381. #define ADDROUNDER
  382. // shift right 16-4=12
  383. LOADSCALE("%2+8")
  384. IDCT4ROWS
  385. STOREROWS("%3+8")
  386. LOADSCALE("%2+0")
  387. IDCT4ROWS
  388. "std %%f48, [%3+112] \n\t"
  389. "std %%f50, [%3+96] \n\t"
  390. "std %%f52, [%3+80] \n\t"
  391. "std %%f54, [%3+64] \n\t"
  392. // shift right 16+4
  393. "ldd [%3+8], %%f18 \n\t"
  394. "ldd [%3+24], %%f22 \n\t"
  395. "ldd [%3+40], %%f26 \n\t"
  396. "ldd [%3+56], %%f30 \n\t"
  397. TRANSPOSE
  398. IDCT4ROWS
  399. SCALEROWS
  400. STOREROWS("%2+0")
  401. LOAD("%3+64")
  402. TRANSPOSE
  403. IDCT4ROWS
  404. SCALEROWS
  405. STOREROWS("%2+8")
  406. : "=r" (out1), "=r" (out2), "=r" (out3), "=r" (out4)
  407. : "0" (scale), "1" (coeffs), "2" (data), "3" (temp)
  408. );
  409. }
  410. void ff_simple_idct_put_vis(uint8_t *dest, int line_size, int16_t *data) {
  411. int out1, out2, out3, out4, out5;
  412. int r1, r2, r3, r4, r5, r6, r7;
  413. __asm__ volatile(
  414. "wr %%g0, 0x8, %%gsr \n\t"
  415. INIT_IDCT
  416. "add %3, %4, %5 \n\t"
  417. "add %5, %4, %6 \n\t"
  418. "add %6, %4, %7 \n\t"
  419. "add %7, %4, %8 \n\t"
  420. "add %8, %4, %9 \n\t"
  421. "add %9, %4, %10 \n\t"
  422. "add %10, %4, %11 \n\t"
  423. // shift right 16-4=12
  424. LOADSCALE("%2+8")
  425. IDCT4ROWS
  426. STOREROWS("%2+8")
  427. LOADSCALE("%2+0")
  428. IDCT4ROWS
  429. "std %%f48, [%2+112] \n\t"
  430. "std %%f50, [%2+96] \n\t"
  431. "std %%f52, [%2+80] \n\t"
  432. "std %%f54, [%2+64] \n\t"
  433. #undef ADDROUNDER
  434. #define ADDROUNDER "fpadd16 %%f28, %%f46, %%f28 \n\t"
  435. // shift right 16+4
  436. "ldd [%2+8], %%f18 \n\t"
  437. "ldd [%2+24], %%f22 \n\t"
  438. "ldd [%2+40], %%f26 \n\t"
  439. "ldd [%2+56], %%f30 \n\t"
  440. TRANSPOSE
  441. IDCT4ROWS
  442. PUTPIXELSCLAMPED("0")
  443. LOAD("%2+64")
  444. TRANSPOSE
  445. IDCT4ROWS
  446. PUTPIXELSCLAMPED("4")
  447. : "=r" (out1), "=r" (out2), "=r" (out3), "=r" (out4), "=r" (out5),
  448. "=r" (r1), "=r" (r2), "=r" (r3), "=r" (r4), "=r" (r5), "=r" (r6), "=r" (r7)
  449. : "0" (rounder), "1" (coeffs), "2" (data), "3" (dest), "4" (line_size)
  450. );
  451. }
  452. void ff_simple_idct_add_vis(uint8_t *dest, int line_size, int16_t *data) {
  453. int out1, out2, out3, out4, out5, out6;
  454. int r1, r2, r3, r4, r5, r6, r7;
  455. __asm__ volatile(
  456. "wr %%g0, 0x8, %%gsr \n\t"
  457. INIT_IDCT
  458. "add %3, %4, %6 \n\t"
  459. "add %6, %4, %7 \n\t"
  460. "add %7, %4, %8 \n\t"
  461. "add %8, %4, %9 \n\t"
  462. "add %9, %4, %10 \n\t"
  463. "add %10, %4, %11 \n\t"
  464. "add %11, %4, %12 \n\t"
  465. #undef ADDROUNDER
  466. #define ADDROUNDER
  467. // shift right 16-4=12
  468. LOADSCALE("%2+8")
  469. IDCT4ROWS
  470. STOREROWS("%2+8")
  471. LOADSCALE("%2+0")
  472. IDCT4ROWS
  473. "std %%f48, [%2+112] \n\t"
  474. "std %%f50, [%2+96] \n\t"
  475. "std %%f52, [%2+80] \n\t"
  476. "std %%f54, [%2+64] \n\t"
  477. #undef ADDROUNDER
  478. #define ADDROUNDER "fpadd16 %%f28, %%f46, %%f28 \n\t"
  479. // shift right 16+4
  480. "ldd [%2+8], %%f18 \n\t"
  481. "ldd [%2+24], %%f22 \n\t"
  482. "ldd [%2+40], %%f26 \n\t"
  483. "ldd [%2+56], %%f30 \n\t"
  484. TRANSPOSE
  485. IDCT4ROWS
  486. ADDPIXELSCLAMPED("0")
  487. LOAD("%2+64")
  488. TRANSPOSE
  489. IDCT4ROWS
  490. ADDPIXELSCLAMPED("4")
  491. : "=r" (out1), "=r" (out2), "=r" (out3), "=r" (out4), "=r" (out5), "=r" (out6),
  492. "=r" (r1), "=r" (r2), "=r" (r3), "=r" (r4), "=r" (r5), "=r" (r6), "=r" (r7)
  493. : "0" (rounder), "1" (coeffs), "2" (data), "3" (dest), "4" (line_size), "5" (expand)
  494. );
  495. }