| OLD | NEW |
| (Empty) | |
| 1 ; Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 ; Use of this source code is governed by a BSD-style license that can be |
| 3 ; found in the LICENSE file. |
| 4 |
| 5 %include "x86inc.asm" |
| 6 |
| 7 ; |
| 8 ; This file uses MMX instructions. |
| 9 ; |
| 10 SECTION_TEXT |
| 11 CPU MMX |
| 12 |
| 13 %define SYMBOL LinearScaleYUVToRGB32Row_MMX_X64 |
| 14 global mangle(SYMBOL) PRIVATE |
| 15 align function_align |
| 16 |
| 17 mangle(SYMBOL): |
| 18 %assign stack_offset 0 |
| 19 extern mangle(kCoefficientsRgbY) |
| 20 |
| 21 ; Parameters are in the following order: |
| 22 ; 1. Y plane |
| 23 ; 2. U plane |
| 24 ; 3. V plane |
| 25 ; 4. ARGB frame |
| 26 ; 5. Width |
| 27 ; 6. Source dx |
| 28 |
| 29 PROLOGUE 6, 7, 3, Y, U, V, ARGB, WIDTH, SOURCE_DX, COMPL |
| 30 |
| 31 %define TABLEq r10 |
| 32 %define Xq r11 |
| 33 %define INDEXq r12 |
| 34 %define COMPRd r13d |
| 35 %define COMPRq r13 |
| 36 %define FRACTIONq r14 |
| 37 |
| 38 PUSH TABLEq |
| 39 PUSH Xq |
| 40 PUSH INDEXq |
| 41 PUSH COMPRq |
| 42 PUSH FRACTIONq |
| 43 |
| 44 %macro EPILOGUE 0 |
| 45 POP FRACTIONq |
| 46 POP COMPRq |
| 47 POP INDEXq |
| 48 POP Xq |
| 49 POP TABLEq |
| 50 %endmacro |
| 51 |
| 52 LOAD_SYM TABLEq, mangle(kCoefficientsRgbY) |
| 53 |
| 54 imul WIDTHq, SOURCE_DXq ; source_width = width * source_dx |
| 55 xor Xq, Xq ; x = 0 |
| 56 cmp SOURCE_DXq, 0x20000 |
| 57 jl .lscaleend |
| 58 mov Xq, 0x8000 ; x = 0.5 for 1/2 or less |
| 59 jmp .lscaleend |
| 60 |
| 61 .lscaleloop: |
| 62 ; Interpolate U |
| 63 mov INDEXq, Xq |
| 64 sar INDEXq, 0x11 |
| 65 movzx COMPLd, BYTE [Uq + INDEXq] |
| 66 movzx COMPRd, BYTE [Uq + INDEXq + 1] |
| 67 mov FRACTIONq, Xq |
| 68 and FRACTIONq, 0x1fffe |
| 69 imul COMPRq, FRACTIONq |
| 70 xor FRACTIONq, 0x1fffe |
| 71 imul COMPLq, FRACTIONq |
| 72 add COMPLq, COMPRq |
| 73 shr COMPLq, 17 |
| 74 movq mm0, [TABLEq + 2048 + 8 * COMPLq] |
| 75 |
| 76 ; Interpolate V |
| 77 movzx COMPLd, BYTE [Vq + INDEXq] |
| 78 movzx COMPRd, BYTE [Vq + INDEXq + 1] |
| 79 ; Trick here to imul COMPL first then COMPR. |
| 80 ; Saves two instruction. :) |
| 81 imul COMPLq, FRACTIONq |
| 82 xor FRACTIONq, 0x1fffe |
| 83 imul COMPRq, FRACTIONq |
| 84 add COMPLq, COMPRq |
| 85 shr COMPLq, 17 |
| 86 paddsw mm0, [TABLEq + 4096 + 8 * COMPLq] |
| 87 |
| 88 ; Interpolate first Y1. |
| 89 lea INDEXq, [Xq + SOURCE_DXq] ; INDEXq now points to next pixel. |
| 90 ; Xq points to current pixel. |
| 91 mov FRACTIONq, Xq |
| 92 sar Xq, 0x10 |
| 93 movzx COMPLd, BYTE [Yq + Xq] |
| 94 movzx COMPRd, BYTE [Yq + Xq + 1] |
| 95 and FRACTIONq, 0xffff |
| 96 imul COMPRq, FRACTIONq |
| 97 xor FRACTIONq, 0xffff |
| 98 imul COMPLq, FRACTIONq |
| 99 add COMPLq, COMPRq |
| 100 shr COMPLq, 16 |
| 101 movq mm1, [TABLEq + 8 * COMPLq] |
| 102 |
| 103 ; Interpolate Y2 if available. |
| 104 cmp INDEXq, WIDTHq |
| 105 jge .lscalelastpixel |
| 106 |
| 107 lea Xq, [INDEXq + SOURCE_DXq] ; Xq points to next pixel. |
| 108 ; INDEXq points to current pixel. |
| 109 mov FRACTIONq, INDEXq |
| 110 sar INDEXq, 0x10 |
| 111 movzx COMPLd, BYTE [Yq + INDEXq] |
| 112 movzx COMPRd, BYTE [Yq + INDEXq + 1] |
| 113 and FRACTIONq, 0xffff |
| 114 imul COMPRq, FRACTIONq |
| 115 xor FRACTIONq, 0xffff |
| 116 imul COMPLq, FRACTIONq |
| 117 add COMPLq, COMPRq |
| 118 shr COMPLq, 16 |
| 119 movq mm2, [TABLEq + 8 * COMPLq] |
| 120 |
| 121 paddsw mm1, mm0 |
| 122 paddsw mm2, mm0 |
| 123 psraw mm1, 0x6 |
| 124 psraw mm2, 0x6 |
| 125 packuswb mm1, mm2 |
| 126 movntq [ARGBq], mm1 |
| 127 add ARGBq, 0x8 |
| 128 |
| 129 .lscaleend: |
| 130 cmp Xq, WIDTHq |
| 131 jl .lscaleloop |
| 132 jmp .epilogue |
| 133 |
| 134 .lscalelastpixel: |
| 135 paddsw mm1, mm0 |
| 136 psraw mm1, 6 |
| 137 packuswb mm1, mm1 |
| 138 movd [ARGBq], mm1 |
| 139 |
| 140 .epilogue |
| 141 EPILOGUE |
| 142 RET |
| OLD | NEW |