Unified · Split
| @@ -101,70 +101,69 @@ static void FUNC(hScale_real)(SwsContext *c, int16_t *dst, int dstW, · 100 unmodified lines | ||
| 101 | 101 | const uint8_t *src, const int16_t *filter, |
| 102 | 102 | const int32_t *filterPos, int filterSize) |
| 103 | 103 | { |
| 104 | − register int i; | |
| 105 | 104 | LOCAL_ALIGNED(16, int, tempo, [4]); |
| 106 | 105 | |
| 107 | − switch (filterSize) { | |
| 108 | − case 4: | |
| 109 | − for (i = 0; i < dstW; i++) { | |
| 110 | − register int srcPos = filterPos[i]; | |
| 111 | − | |
| 112 | − vector unsigned char src_vF = unaligned_load(srcPos, src); | |
| 113 | − vector signed short src_v, filter_v; | |
| 114 | − vector signed int val_vEven, val_s; | |
| 115 | − src_v = // vec_unpackh sign-extends... | |
| 116 | − (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF)); | |
| 117 | − // now put our elements in the even slots | |
| 118 | − src_v = vec_mergeh(src_v, (vector signed short)vzero); | |
| 119 | − GET_VF4(i, filter_v, filter); | |
| 120 | − val_vEven = vec_mule(src_v, filter_v); | |
| 121 | − val_s = vec_sums(val_vEven, vzero); | |
| 122 | − vec_st(val_s, 0, tempo); | |
| 123 | − dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1); | |
| 124 | − } | |
| 106 | + switch (filterSize) { | |
| 107 | + case 4: | |
| 108 | + for (register int i = 0; i < dstW; i++) { | |
| 109 | + register int srcPos = filterPos[i]; | |
| 110 | + | |
| 111 | + vector unsigned char src_vF = unaligned_load(srcPos, src); | |
| 112 | + vector signed short src_v, filter_v; | |
| 113 | + vector signed int val_vEven, val_s; | |
| 114 | + src_v = // vec_unpackh sign-extends... | |
| 115 | + (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF)); | |
| 116 | + // now put our elements in the even slots | |
| 117 | + src_v = vec_mergeh(src_v, (vector signed short)vzero); | |
| 118 | + GET_VF4(i, filter_v, filter); | |
| 119 | + val_vEven = vec_mule(src_v, filter_v); | |
| 120 | + val_s = vec_sums(val_vEven, vzero); | |
| 121 | + vec_st(val_s, 0, tempo); | |
| 122 | + dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1); | |
| 123 | + } | |
| 125 | 124 | break; |
| 126 | − case 8: | |
| 127 | − for (i = 0; i < dstW; i++) { | |
| 128 | − register int srcPos = filterPos[i]; | |
| 129 | − vector unsigned char src_vF, av_unused src_v0, av_unused src_v1; | |
| 130 | − vector unsigned char av_unused permS; | |
| 131 | − vector signed short src_v, filter_v; | |
| 132 | − vector signed int val_v, val_s; | |
| 133 | − FIRST_LOAD(src_v0, srcPos, src, permS); | |
| 134 | − LOAD_SRCV8(srcPos, 0, src, permS, src_v0, src_v1, src_vF); | |
| 135 | − src_v = // vec_unpackh sign-extends... | |
| 136 | − (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF)); | |
| 137 | − filter_v = vec_ld(i << 4, filter); | |
| 138 | − val_v = vec_msums(src_v, filter_v, (vector signed int)vzero); | |
| 139 | − val_s = vec_sums(val_v, vzero); | |
| 140 | − vec_st(val_s, 0, tempo); | |
| 141 | − dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1); | |
| 142 | − } | |
| 125 | + case 8: | |
| 126 | + for (register int i = 0; i < dstW; i++) { | |
| 127 | + register int srcPos = filterPos[i]; | |
| 128 | + vector unsigned char src_vF, av_unused src_v0, av_unused src_v1; | |
| 129 | + vector unsigned char av_unused permS; | |
| 130 | + vector signed short src_v, filter_v; | |
| 131 | + vector signed int val_v, val_s; | |
| 132 | + FIRST_LOAD(src_v0, srcPos, src, permS); | |
| 133 | + LOAD_SRCV8(srcPos, 0, src, permS, src_v0, src_v1, src_vF); | |
| 134 | + src_v = // vec_unpackh sign-extends... | |
| 135 | + (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF)); | |
| 136 | + filter_v = vec_ld(i << 4, filter); | |
| 137 | + val_v = vec_msums(src_v, filter_v, (vector signed int)vzero); | |
| 138 | + val_s = vec_sums(val_v, vzero); | |
| 139 | + vec_st(val_s, 0, tempo); | |
| 140 | + dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1); | |
| 141 | + } | |
| 143 | 142 | break; |
| 144 | 143 | |
| 145 | − case 16: | |
| 146 | − for (i = 0; i < dstW; i++) { | |
| 147 | − register int srcPos = filterPos[i]; | |
| 144 | + case 16: | |
| 145 | + for (register int i = 0; i < dstW; i++) { | |
| 146 | + register int srcPos = filterPos[i]; | |
| 148 | 147 | |
| 149 | − vector unsigned char src_vF = unaligned_load(srcPos, src); | |
| 150 | − vector signed short src_vA = // vec_unpackh sign-extends... | |
| 151 | − (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF)); | |
| 152 | − vector signed short src_vB = // vec_unpackh sign-extends... | |
| 153 | − (vector signed short)(VEC_MERGEL((vector unsigned char)vzero, src_vF)); | |
| 154 | − vector signed short filter_v0 = vec_ld(i << 5, filter); | |
| 155 | − vector signed short filter_v1 = vec_ld((i << 5) + 16, filter); | |
| 148 | + vector unsigned char src_vF = unaligned_load(srcPos, src); | |
| 149 | + vector signed short src_vA = // vec_unpackh sign-extends... | |
| 150 | + (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF)); | |
| 151 | + vector signed short src_vB = // vec_unpackh sign-extends... | |
| 152 | + (vector signed short)(VEC_MERGEL((vector unsigned char)vzero, src_vF)); | |
| 153 | + vector signed short filter_v0 = vec_ld(i << 5, filter); | |
| 154 | + vector signed short filter_v1 = vec_ld((i << 5) + 16, filter); | |
| 156 | 155 | |
| 157 | − vector signed int val_acc = vec_msums(src_vA, filter_v0, (vector signed int)vzero); | |
| 158 | − vector signed int val_v = vec_msums(src_vB, filter_v1, val_acc); | |
| 156 | + vector signed int val_acc = vec_msums(src_vA, filter_v0, (vector signed int)vzero); | |
| 157 | + vector signed int val_v = vec_msums(src_vB, filter_v1, val_acc); | |
| 159 | 158 | |
| 160 | − vector signed int val_s = vec_sums(val_v, vzero); | |
| 159 | + vector signed int val_s = vec_sums(val_v, vzero); | |
| 161 | 160 | |
| 162 | − VEC_ST(val_s, 0, tempo); | |
| 163 | − dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1); | |
| 164 | − } | |
| 161 | + VEC_ST(val_s, 0, tempo); | |
| 162 | + dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1); | |
| 163 | + } | |
| 165 | 164 | break; |
| 166 | 165 | |
| 167 | − default: | |
| 166 | + default: | |
| 168 | 167 | for (register int i = 0; i < dstW; i++) { |
| 169 | 168 | register int j; |
| 170 | 169 | register int srcPos = filterPos[i]; |
| @@ -174,5 +173,5 @@ static void FUNC(hScale_real)(SwsContext *c, int16_t *dst, int dstW, · 3 unmodified lines | ||
| 174 | 173 | dst[i] = FFMIN(val >> 7, (1 << 15) - 1); |
| 175 | 174 | } |
| 176 | 175 | break; |
| 177 | − } | |
| 176 | + } | |
| 178 | 177 | } |