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.

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