Changeset 5699 for pjproject/trunk/third_party/yuv/source/row_msa.cc
- Timestamp:
- Nov 21, 2017 9:25:11 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/third_party/yuv/source/row_msa.cc
r5633 r5699 2918 2918 void ARGBSetRow_MSA(uint8* dst_argb, uint32 v32, int width) { 2919 2919 int x; 2920 v 16u8 dst0 = (v16u8)__msa_fill_w(v32);2920 v4i32 dst0 = __builtin_msa_fill_w(v32); 2921 2921 2922 2922 for (x = 0; x < width; x += 4) { … … 2970 2970 } 2971 2971 2972 void ARGBExtractAlphaRow_MSA(const uint8* src_argb, uint8* dst_a, int width) { 2973 int i; 2974 v16u8 src0, src1, src2, src3, vec0, vec1, dst0; 2975 2976 for (i = 0; i < width; i += 16) { 2977 src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0); 2978 src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16); 2979 src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 32); 2980 src3 = (v16u8)__msa_ld_b((v16i8*)src_argb, 48); 2981 vec0 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0); 2982 vec1 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2); 2983 dst0 = (v16u8)__msa_pckod_b((v16i8)vec1, (v16i8)vec0); 2984 ST_UB(dst0, dst_a); 2985 src_argb += 64; 2986 dst_a += 16; 2987 } 2988 } 2989 2990 void ARGBBlendRow_MSA(const uint8* src_argb0, 2991 const uint8* src_argb1, 2992 uint8* dst_argb, 2993 int width) { 2994 int x; 2995 v16u8 src0, src1, src2, src3, dst0, dst1; 2996 v8u16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7; 2997 v8u16 vec8, vec9, vec10, vec11, vec12, vec13; 2998 v8u16 const_256 = (v8u16)__msa_ldi_h(256); 2999 v16u8 const_255 = (v16u8)__msa_ldi_b(255); 3000 v16u8 mask = {0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255}; 3001 v16i8 zero = {0}; 3002 3003 for (x = 0; x < width; x += 8) { 3004 src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0); 3005 src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16); 3006 src2 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 0); 3007 src3 = (v16u8)__msa_ld_b((v16i8*)src_argb1, 16); 3008 vec0 = (v8u16)__msa_ilvr_b(zero, (v16i8)src0); 3009 vec1 = (v8u16)__msa_ilvl_b(zero, (v16i8)src0); 3010 vec2 = (v8u16)__msa_ilvr_b(zero, (v16i8)src1); 3011 vec3 = (v8u16)__msa_ilvl_b(zero, (v16i8)src1); 3012 vec4 = (v8u16)__msa_ilvr_b(zero, (v16i8)src2); 3013 vec5 = (v8u16)__msa_ilvl_b(zero, (v16i8)src2); 3014 vec6 = (v8u16)__msa_ilvr_b(zero, (v16i8)src3); 3015 vec7 = (v8u16)__msa_ilvl_b(zero, (v16i8)src3); 3016 vec8 = (v8u16)__msa_fill_h(vec0[3]); 3017 vec9 = (v8u16)__msa_fill_h(vec0[7]); 3018 vec10 = (v8u16)__msa_fill_h(vec1[3]); 3019 vec11 = (v8u16)__msa_fill_h(vec1[7]); 3020 vec8 = (v8u16)__msa_pckev_d((v2i64)vec9, (v2i64)vec8); 3021 vec9 = (v8u16)__msa_pckev_d((v2i64)vec11, (v2i64)vec10); 3022 vec10 = (v8u16)__msa_fill_h(vec2[3]); 3023 vec11 = (v8u16)__msa_fill_h(vec2[7]); 3024 vec12 = (v8u16)__msa_fill_h(vec3[3]); 3025 vec13 = (v8u16)__msa_fill_h(vec3[7]); 3026 vec10 = (v8u16)__msa_pckev_d((v2i64)vec11, (v2i64)vec10); 3027 vec11 = (v8u16)__msa_pckev_d((v2i64)vec13, (v2i64)vec12); 3028 vec8 = const_256 - vec8; 3029 vec9 = const_256 - vec9; 3030 vec10 = const_256 - vec10; 3031 vec11 = const_256 - vec11; 3032 vec8 *= vec4; 3033 vec9 *= vec5; 3034 vec10 *= vec6; 3035 vec11 *= vec7; 3036 vec8 = (v8u16)__msa_srai_h((v8i16)vec8, 8); 3037 vec9 = (v8u16)__msa_srai_h((v8i16)vec9, 8); 3038 vec10 = (v8u16)__msa_srai_h((v8i16)vec10, 8); 3039 vec11 = (v8u16)__msa_srai_h((v8i16)vec11, 8); 3040 vec0 += vec8; 3041 vec1 += vec9; 3042 vec2 += vec10; 3043 vec3 += vec11; 3044 dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0); 3045 dst1 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2); 3046 dst0 = __msa_bmnz_v(dst0, const_255, mask); 3047 dst1 = __msa_bmnz_v(dst1, const_255, mask); 3048 ST_UB2(dst0, dst1, dst_argb, 16); 3049 src_argb0 += 32; 3050 src_argb1 += 32; 3051 dst_argb += 32; 3052 } 3053 } 3054 3055 void ARGBQuantizeRow_MSA(uint8* dst_argb, 3056 int scale, 3057 int interval_size, 3058 int interval_offset, 3059 int width) { 3060 int x; 3061 v16u8 src0, src1, src2, src3, dst0, dst1, dst2, dst3; 3062 v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7; 3063 v4i32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; 3064 v4i32 tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; 3065 v4i32 vec_scale = __msa_fill_w(scale); 3066 v16u8 vec_int_sz = (v16u8)__msa_fill_b(interval_size); 3067 v16u8 vec_int_ofst = (v16u8)__msa_fill_b(interval_offset); 3068 v16i8 mask = {0, 1, 2, 19, 4, 5, 6, 23, 8, 9, 10, 27, 12, 13, 14, 31}; 3069 v16i8 zero = {0}; 3070 3071 for (x = 0; x < width; x += 8) { 3072 src0 = (v16u8)__msa_ld_b((v16i8*)dst_argb, 0); 3073 src1 = (v16u8)__msa_ld_b((v16i8*)dst_argb, 16); 3074 src2 = (v16u8)__msa_ld_b((v16i8*)dst_argb, 32); 3075 src3 = (v16u8)__msa_ld_b((v16i8*)dst_argb, 48); 3076 vec0 = (v8i16)__msa_ilvr_b(zero, (v16i8)src0); 3077 vec1 = (v8i16)__msa_ilvl_b(zero, (v16i8)src0); 3078 vec2 = (v8i16)__msa_ilvr_b(zero, (v16i8)src1); 3079 vec3 = (v8i16)__msa_ilvl_b(zero, (v16i8)src1); 3080 vec4 = (v8i16)__msa_ilvr_b(zero, (v16i8)src2); 3081 vec5 = (v8i16)__msa_ilvl_b(zero, (v16i8)src2); 3082 vec6 = (v8i16)__msa_ilvr_b(zero, (v16i8)src3); 3083 vec7 = (v8i16)__msa_ilvl_b(zero, (v16i8)src3); 3084 tmp0 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec0); 3085 tmp1 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec0); 3086 tmp2 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec1); 3087 tmp3 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec1); 3088 tmp4 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec2); 3089 tmp5 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec2); 3090 tmp6 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec3); 3091 tmp7 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec3); 3092 tmp8 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec4); 3093 tmp9 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec4); 3094 tmp10 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec5); 3095 tmp11 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec5); 3096 tmp12 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec6); 3097 tmp13 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec6); 3098 tmp14 = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec7); 3099 tmp15 = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec7); 3100 tmp0 *= vec_scale; 3101 tmp1 *= vec_scale; 3102 tmp2 *= vec_scale; 3103 tmp3 *= vec_scale; 3104 tmp4 *= vec_scale; 3105 tmp5 *= vec_scale; 3106 tmp6 *= vec_scale; 3107 tmp7 *= vec_scale; 3108 tmp8 *= vec_scale; 3109 tmp9 *= vec_scale; 3110 tmp10 *= vec_scale; 3111 tmp11 *= vec_scale; 3112 tmp12 *= vec_scale; 3113 tmp13 *= vec_scale; 3114 tmp14 *= vec_scale; 3115 tmp15 *= vec_scale; 3116 tmp0 >>= 16; 3117 tmp1 >>= 16; 3118 tmp2 >>= 16; 3119 tmp3 >>= 16; 3120 tmp4 >>= 16; 3121 tmp5 >>= 16; 3122 tmp6 >>= 16; 3123 tmp7 >>= 16; 3124 tmp8 >>= 16; 3125 tmp9 >>= 16; 3126 tmp10 >>= 16; 3127 tmp11 >>= 16; 3128 tmp12 >>= 16; 3129 tmp13 >>= 16; 3130 tmp14 >>= 16; 3131 tmp15 >>= 16; 3132 vec0 = (v8i16)__msa_pckev_h((v8i16)tmp1, (v8i16)tmp0); 3133 vec1 = (v8i16)__msa_pckev_h((v8i16)tmp3, (v8i16)tmp2); 3134 vec2 = (v8i16)__msa_pckev_h((v8i16)tmp5, (v8i16)tmp4); 3135 vec3 = (v8i16)__msa_pckev_h((v8i16)tmp7, (v8i16)tmp6); 3136 vec4 = (v8i16)__msa_pckev_h((v8i16)tmp9, (v8i16)tmp8); 3137 vec5 = (v8i16)__msa_pckev_h((v8i16)tmp11, (v8i16)tmp10); 3138 vec6 = (v8i16)__msa_pckev_h((v8i16)tmp13, (v8i16)tmp12); 3139 vec7 = (v8i16)__msa_pckev_h((v8i16)tmp15, (v8i16)tmp14); 3140 dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0); 3141 dst1 = (v16u8)__msa_pckev_b((v16i8)vec3, (v16i8)vec2); 3142 dst2 = (v16u8)__msa_pckev_b((v16i8)vec5, (v16i8)vec4); 3143 dst3 = (v16u8)__msa_pckev_b((v16i8)vec7, (v16i8)vec6); 3144 dst0 *= vec_int_sz; 3145 dst1 *= vec_int_sz; 3146 dst2 *= vec_int_sz; 3147 dst3 *= vec_int_sz; 3148 dst0 += vec_int_ofst; 3149 dst1 += vec_int_ofst; 3150 dst2 += vec_int_ofst; 3151 dst3 += vec_int_ofst; 3152 dst0 = (v16u8)__msa_vshf_b(mask, (v16i8)src0, (v16i8)dst0); 3153 dst1 = (v16u8)__msa_vshf_b(mask, (v16i8)src1, (v16i8)dst1); 3154 dst2 = (v16u8)__msa_vshf_b(mask, (v16i8)src2, (v16i8)dst2); 3155 dst3 = (v16u8)__msa_vshf_b(mask, (v16i8)src3, (v16i8)dst3); 3156 ST_UB4(dst0, dst1, dst2, dst3, dst_argb, 16); 3157 dst_argb += 64; 3158 } 3159 } 3160 3161 void ARGBColorMatrixRow_MSA(const uint8* src_argb, 3162 uint8* dst_argb, 3163 const int8* matrix_argb, 3164 int width) { 3165 int32 x; 3166 v16i8 src0; 3167 v16u8 src1, src2, dst0, dst1; 3168 v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9; 3169 v8i16 vec10, vec11, vec12, vec13, vec14, vec15, vec16, vec17; 3170 v4i32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; 3171 v4i32 tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; 3172 v16i8 zero = {0}; 3173 v8i16 max = __msa_ldi_h(255); 3174 3175 src0 = __msa_ld_b((v16i8*)matrix_argb, 0); 3176 vec0 = (v8i16)__msa_ilvr_b(zero, src0); 3177 vec1 = (v8i16)__msa_ilvl_b(zero, src0); 3178 3179 for (x = 0; x < width; x += 8) { 3180 src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0); 3181 src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16); 3182 vec2 = (v8i16)__msa_ilvr_b(zero, (v16i8)src1); 3183 vec3 = (v8i16)__msa_ilvl_b(zero, (v16i8)src1); 3184 vec4 = (v8i16)__msa_ilvr_b(zero, (v16i8)src2); 3185 vec5 = (v8i16)__msa_ilvl_b(zero, (v16i8)src2); 3186 vec6 = (v8i16)__msa_pckod_d((v2i64)vec2, (v2i64)vec2); 3187 vec7 = (v8i16)__msa_pckod_d((v2i64)vec3, (v2i64)vec3); 3188 vec8 = (v8i16)__msa_pckod_d((v2i64)vec4, (v2i64)vec4); 3189 vec9 = (v8i16)__msa_pckod_d((v2i64)vec5, (v2i64)vec5); 3190 vec2 = (v8i16)__msa_pckev_d((v2i64)vec2, (v2i64)vec2); 3191 vec3 = (v8i16)__msa_pckev_d((v2i64)vec3, (v2i64)vec3); 3192 vec4 = (v8i16)__msa_pckev_d((v2i64)vec4, (v2i64)vec4); 3193 vec5 = (v8i16)__msa_pckev_d((v2i64)vec5, (v2i64)vec5); 3194 vec10 = vec2 * vec0; 3195 vec11 = vec2 * vec1; 3196 vec12 = vec6 * vec0; 3197 vec13 = vec6 * vec1; 3198 tmp0 = __msa_hadd_s_w(vec10, vec10); 3199 tmp1 = __msa_hadd_s_w(vec11, vec11); 3200 tmp2 = __msa_hadd_s_w(vec12, vec12); 3201 tmp3 = __msa_hadd_s_w(vec13, vec13); 3202 vec14 = vec3 * vec0; 3203 vec15 = vec3 * vec1; 3204 vec16 = vec7 * vec0; 3205 vec17 = vec7 * vec1; 3206 tmp4 = __msa_hadd_s_w(vec14, vec14); 3207 tmp5 = __msa_hadd_s_w(vec15, vec15); 3208 tmp6 = __msa_hadd_s_w(vec16, vec16); 3209 tmp7 = __msa_hadd_s_w(vec17, vec17); 3210 vec10 = __msa_pckev_h((v8i16)tmp1, (v8i16)tmp0); 3211 vec11 = __msa_pckev_h((v8i16)tmp3, (v8i16)tmp2); 3212 vec12 = __msa_pckev_h((v8i16)tmp5, (v8i16)tmp4); 3213 vec13 = __msa_pckev_h((v8i16)tmp7, (v8i16)tmp6); 3214 tmp0 = __msa_hadd_s_w(vec10, vec10); 3215 tmp1 = __msa_hadd_s_w(vec11, vec11); 3216 tmp2 = __msa_hadd_s_w(vec12, vec12); 3217 tmp3 = __msa_hadd_s_w(vec13, vec13); 3218 tmp0 = __msa_srai_w(tmp0, 6); 3219 tmp1 = __msa_srai_w(tmp1, 6); 3220 tmp2 = __msa_srai_w(tmp2, 6); 3221 tmp3 = __msa_srai_w(tmp3, 6); 3222 vec2 = vec4 * vec0; 3223 vec6 = vec4 * vec1; 3224 vec3 = vec8 * vec0; 3225 vec7 = vec8 * vec1; 3226 tmp8 = __msa_hadd_s_w(vec2, vec2); 3227 tmp9 = __msa_hadd_s_w(vec6, vec6); 3228 tmp10 = __msa_hadd_s_w(vec3, vec3); 3229 tmp11 = __msa_hadd_s_w(vec7, vec7); 3230 vec4 = vec5 * vec0; 3231 vec8 = vec5 * vec1; 3232 vec5 = vec9 * vec0; 3233 vec9 = vec9 * vec1; 3234 tmp12 = __msa_hadd_s_w(vec4, vec4); 3235 tmp13 = __msa_hadd_s_w(vec8, vec8); 3236 tmp14 = __msa_hadd_s_w(vec5, vec5); 3237 tmp15 = __msa_hadd_s_w(vec9, vec9); 3238 vec14 = __msa_pckev_h((v8i16)tmp9, (v8i16)tmp8); 3239 vec15 = __msa_pckev_h((v8i16)tmp11, (v8i16)tmp10); 3240 vec16 = __msa_pckev_h((v8i16)tmp13, (v8i16)tmp12); 3241 vec17 = __msa_pckev_h((v8i16)tmp15, (v8i16)tmp14); 3242 tmp4 = __msa_hadd_s_w(vec14, vec14); 3243 tmp5 = __msa_hadd_s_w(vec15, vec15); 3244 tmp6 = __msa_hadd_s_w(vec16, vec16); 3245 tmp7 = __msa_hadd_s_w(vec17, vec17); 3246 tmp4 = __msa_srai_w(tmp4, 6); 3247 tmp5 = __msa_srai_w(tmp5, 6); 3248 tmp6 = __msa_srai_w(tmp6, 6); 3249 tmp7 = __msa_srai_w(tmp7, 6); 3250 vec10 = __msa_pckev_h((v8i16)tmp1, (v8i16)tmp0); 3251 vec11 = __msa_pckev_h((v8i16)tmp3, (v8i16)tmp2); 3252 vec12 = __msa_pckev_h((v8i16)tmp5, (v8i16)tmp4); 3253 vec13 = __msa_pckev_h((v8i16)tmp7, (v8i16)tmp6); 3254 vec10 = __msa_maxi_s_h(vec10, 0); 3255 vec11 = __msa_maxi_s_h(vec11, 0); 3256 vec12 = __msa_maxi_s_h(vec12, 0); 3257 vec13 = __msa_maxi_s_h(vec13, 0); 3258 vec10 = __msa_min_s_h(vec10, max); 3259 vec11 = __msa_min_s_h(vec11, max); 3260 vec12 = __msa_min_s_h(vec12, max); 3261 vec13 = __msa_min_s_h(vec13, max); 3262 dst0 = (v16u8)__msa_pckev_b((v16i8)vec11, (v16i8)vec10); 3263 dst1 = (v16u8)__msa_pckev_b((v16i8)vec13, (v16i8)vec12); 3264 ST_UB2(dst0, dst1, dst_argb, 16); 3265 src_argb += 32; 3266 dst_argb += 32; 3267 } 3268 } 3269 3270 void SplitUVRow_MSA(const uint8* src_uv, 3271 uint8* dst_u, 3272 uint8* dst_v, 3273 int width) { 3274 int x; 3275 v16u8 src0, src1, src2, src3, dst0, dst1, dst2, dst3; 3276 3277 for (x = 0; x < width; x += 32) { 3278 src0 = (v16u8)__msa_ld_b((v16i8*)src_uv, 0); 3279 src1 = (v16u8)__msa_ld_b((v16i8*)src_uv, 16); 3280 src2 = (v16u8)__msa_ld_b((v16i8*)src_uv, 32); 3281 src3 = (v16u8)__msa_ld_b((v16i8*)src_uv, 48); 3282 dst0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0); 3283 dst1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2); 3284 dst2 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0); 3285 dst3 = (v16u8)__msa_pckod_b((v16i8)src3, (v16i8)src2); 3286 ST_UB2(dst0, dst1, dst_u, 16); 3287 ST_UB2(dst2, dst3, dst_v, 16); 3288 src_uv += 64; 3289 dst_u += 32; 3290 dst_v += 32; 3291 } 3292 } 3293 3294 void SetRow_MSA(uint8* dst, uint8 v8, int width) { 3295 int x; 3296 v16u8 dst0 = (v16u8)__msa_fill_b(v8); 3297 3298 for (x = 0; x < width; x += 16) { 3299 ST_UB(dst0, dst); 3300 dst += 16; 3301 } 3302 } 3303 3304 void MirrorUVRow_MSA(const uint8* src_uv, 3305 uint8* dst_u, 3306 uint8* dst_v, 3307 int width) { 3308 int x; 3309 v16u8 src0, src1, src2, src3; 3310 v16u8 dst0, dst1, dst2, dst3; 3311 v16i8 mask0 = {30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0}; 3312 v16i8 mask1 = {31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1}; 3313 3314 src_uv += (2 * width); 3315 3316 for (x = 0; x < width; x += 32) { 3317 src_uv -= 64; 3318 src2 = (v16u8)__msa_ld_b((v16i8*)src_uv, 0); 3319 src3 = (v16u8)__msa_ld_b((v16i8*)src_uv, 16); 3320 src0 = (v16u8)__msa_ld_b((v16i8*)src_uv, 32); 3321 src1 = (v16u8)__msa_ld_b((v16i8*)src_uv, 48); 3322 dst0 = (v16u8)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0); 3323 dst1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src3, (v16i8)src2); 3324 dst2 = (v16u8)__msa_vshf_b(mask0, (v16i8)src1, (v16i8)src0); 3325 dst3 = (v16u8)__msa_vshf_b(mask0, (v16i8)src3, (v16i8)src2); 3326 ST_UB2(dst0, dst1, dst_v, 16); 3327 ST_UB2(dst2, dst3, dst_u, 16); 3328 dst_u += 32; 3329 dst_v += 32; 3330 } 3331 } 3332 3333 void SobelXRow_MSA(const uint8* src_y0, 3334 const uint8* src_y1, 3335 const uint8* src_y2, 3336 uint8* dst_sobelx, 3337 int32 width) { 3338 int x; 3339 v16u8 src0, src1, src2, src3, src4, src5, dst0; 3340 v8i16 vec0, vec1, vec2, vec3, vec4, vec5; 3341 v16i8 mask0 = {0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9}; 3342 v16i8 tmp = __msa_ldi_b(8); 3343 v16i8 mask1 = mask0 + tmp; 3344 v8i16 zero = {0}; 3345 v8i16 max = __msa_ldi_h(255); 3346 3347 for (x = 0; x < width; x += 16) { 3348 src0 = (v16u8)__msa_ld_b((v16i8*)src_y0, 0); 3349 src1 = (v16u8)__msa_ld_b((v16i8*)src_y0, 16); 3350 src2 = (v16u8)__msa_ld_b((v16i8*)src_y1, 0); 3351 src3 = (v16u8)__msa_ld_b((v16i8*)src_y1, 16); 3352 src4 = (v16u8)__msa_ld_b((v16i8*)src_y2, 0); 3353 src5 = (v16u8)__msa_ld_b((v16i8*)src_y2, 16); 3354 vec0 = (v8i16)__msa_vshf_b(mask0, (v16i8)src1, (v16i8)src0); 3355 vec1 = (v8i16)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0); 3356 vec2 = (v8i16)__msa_vshf_b(mask0, (v16i8)src3, (v16i8)src2); 3357 vec3 = (v8i16)__msa_vshf_b(mask1, (v16i8)src3, (v16i8)src2); 3358 vec4 = (v8i16)__msa_vshf_b(mask0, (v16i8)src5, (v16i8)src4); 3359 vec5 = (v8i16)__msa_vshf_b(mask1, (v16i8)src5, (v16i8)src4); 3360 vec0 = (v8i16)__msa_hsub_u_h((v16u8)vec0, (v16u8)vec0); 3361 vec1 = (v8i16)__msa_hsub_u_h((v16u8)vec1, (v16u8)vec1); 3362 vec2 = (v8i16)__msa_hsub_u_h((v16u8)vec2, (v16u8)vec2); 3363 vec3 = (v8i16)__msa_hsub_u_h((v16u8)vec3, (v16u8)vec3); 3364 vec4 = (v8i16)__msa_hsub_u_h((v16u8)vec4, (v16u8)vec4); 3365 vec5 = (v8i16)__msa_hsub_u_h((v16u8)vec5, (v16u8)vec5); 3366 vec0 += vec2; 3367 vec1 += vec3; 3368 vec4 += vec2; 3369 vec5 += vec3; 3370 vec0 += vec4; 3371 vec1 += vec5; 3372 vec0 = __msa_add_a_h(zero, vec0); 3373 vec1 = __msa_add_a_h(zero, vec1); 3374 vec0 = __msa_maxi_s_h(vec0, 0); 3375 vec1 = __msa_maxi_s_h(vec1, 0); 3376 vec0 = __msa_min_s_h(max, vec0); 3377 vec1 = __msa_min_s_h(max, vec1); 3378 dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0); 3379 ST_UB(dst0, dst_sobelx); 3380 src_y0 += 16; 3381 src_y1 += 16; 3382 src_y2 += 16; 3383 dst_sobelx += 16; 3384 } 3385 } 3386 3387 void SobelYRow_MSA(const uint8* src_y0, 3388 const uint8* src_y1, 3389 uint8* dst_sobely, 3390 int32 width) { 3391 int x; 3392 v16u8 src0, src1, dst0; 3393 v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6; 3394 v8i16 zero = {0}; 3395 v8i16 max = __msa_ldi_h(255); 3396 3397 for (x = 0; x < width; x += 16) { 3398 src0 = (v16u8)__msa_ld_b((v16i8*)src_y0, 0); 3399 src1 = (v16u8)__msa_ld_b((v16i8*)src_y1, 0); 3400 vec0 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)src0); 3401 vec1 = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)src0); 3402 vec2 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)src1); 3403 vec3 = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)src1); 3404 vec0 -= vec2; 3405 vec1 -= vec3; 3406 vec6[0] = src_y0[16] - src_y1[16]; 3407 vec6[1] = src_y0[17] - src_y1[17]; 3408 vec2 = (v8i16)__msa_sldi_b((v16i8)vec1, (v16i8)vec0, 2); 3409 vec3 = (v8i16)__msa_sldi_b((v16i8)vec6, (v16i8)vec1, 2); 3410 vec4 = (v8i16)__msa_sldi_b((v16i8)vec1, (v16i8)vec0, 4); 3411 vec5 = (v8i16)__msa_sldi_b((v16i8)vec6, (v16i8)vec1, 4); 3412 vec0 += vec2; 3413 vec1 += vec3; 3414 vec4 += vec2; 3415 vec5 += vec3; 3416 vec0 += vec4; 3417 vec1 += vec5; 3418 vec0 = __msa_add_a_h(zero, vec0); 3419 vec1 = __msa_add_a_h(zero, vec1); 3420 vec0 = __msa_maxi_s_h(vec0, 0); 3421 vec1 = __msa_maxi_s_h(vec1, 0); 3422 vec0 = __msa_min_s_h(max, vec0); 3423 vec1 = __msa_min_s_h(max, vec1); 3424 dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0); 3425 ST_UB(dst0, dst_sobely); 3426 src_y0 += 16; 3427 src_y1 += 16; 3428 dst_sobely += 16; 3429 } 3430 } 3431 3432 void HalfFloatRow_MSA(const uint16* src, uint16* dst, float scale, int width) { 3433 int i; 3434 v8u16 src0, src1, src2, src3, dst0, dst1, dst2, dst3; 3435 v4u32 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7; 3436 v4f32 fvec0, fvec1, fvec2, fvec3, fvec4, fvec5, fvec6, fvec7; 3437 v4f32 mult_vec; 3438 v8i16 zero = {0}; 3439 mult_vec[0] = 1.9259299444e-34f * scale; 3440 mult_vec = (v4f32)__msa_splati_w((v4i32)mult_vec, 0); 3441 3442 for (i = 0; i < width; i += 32) { 3443 src0 = (v8u16)__msa_ld_h((v8i16*)src, 0); 3444 src1 = (v8u16)__msa_ld_h((v8i16*)src, 16); 3445 src2 = (v8u16)__msa_ld_h((v8i16*)src, 32); 3446 src3 = (v8u16)__msa_ld_h((v8i16*)src, 48); 3447 vec0 = (v4u32)__msa_ilvr_h(zero, (v8i16)src0); 3448 vec1 = (v4u32)__msa_ilvl_h(zero, (v8i16)src0); 3449 vec2 = (v4u32)__msa_ilvr_h(zero, (v8i16)src1); 3450 vec3 = (v4u32)__msa_ilvl_h(zero, (v8i16)src1); 3451 vec4 = (v4u32)__msa_ilvr_h(zero, (v8i16)src2); 3452 vec5 = (v4u32)__msa_ilvl_h(zero, (v8i16)src2); 3453 vec6 = (v4u32)__msa_ilvr_h(zero, (v8i16)src3); 3454 vec7 = (v4u32)__msa_ilvl_h(zero, (v8i16)src3); 3455 fvec0 = __msa_ffint_u_w(vec0); 3456 fvec1 = __msa_ffint_u_w(vec1); 3457 fvec2 = __msa_ffint_u_w(vec2); 3458 fvec3 = __msa_ffint_u_w(vec3); 3459 fvec4 = __msa_ffint_u_w(vec4); 3460 fvec5 = __msa_ffint_u_w(vec5); 3461 fvec6 = __msa_ffint_u_w(vec6); 3462 fvec7 = __msa_ffint_u_w(vec7); 3463 fvec0 *= mult_vec; 3464 fvec1 *= mult_vec; 3465 fvec2 *= mult_vec; 3466 fvec3 *= mult_vec; 3467 fvec4 *= mult_vec; 3468 fvec5 *= mult_vec; 3469 fvec6 *= mult_vec; 3470 fvec7 *= mult_vec; 3471 vec0 = ((v4u32)fvec0) >> 13; 3472 vec1 = ((v4u32)fvec1) >> 13; 3473 vec2 = ((v4u32)fvec2) >> 13; 3474 vec3 = ((v4u32)fvec3) >> 13; 3475 vec4 = ((v4u32)fvec4) >> 13; 3476 vec5 = ((v4u32)fvec5) >> 13; 3477 vec6 = ((v4u32)fvec6) >> 13; 3478 vec7 = ((v4u32)fvec7) >> 13; 3479 dst0 = (v8u16)__msa_pckev_h((v8i16)vec1, (v8i16)vec0); 3480 dst1 = (v8u16)__msa_pckev_h((v8i16)vec3, (v8i16)vec2); 3481 dst2 = (v8u16)__msa_pckev_h((v8i16)vec5, (v8i16)vec4); 3482 dst3 = (v8u16)__msa_pckev_h((v8i16)vec7, (v8i16)vec6); 3483 ST_UH2(dst0, dst1, dst, 8); 3484 ST_UH2(dst2, dst3, dst + 16, 8); 3485 src += 32; 3486 dst += 32; 3487 } 3488 } 3489 2972 3490 #ifdef __cplusplus 2973 3491 } // extern "C"
Note: See TracChangeset
for help on using the changeset viewer.