Ignore:
Timestamp:
Nov 21, 2017 9:25:11 AM (6 years ago)
Author:
riza
Message:

Close #2065: Update libyuv to fix linker error when building libyuv as dll on Visual Studio 2015.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/third_party/yuv/source/row_msa.cc

    r5633 r5699  
    29182918void ARGBSetRow_MSA(uint8* dst_argb, uint32 v32, int width) { 
    29192919  int x; 
    2920   v16u8 dst0 = (v16u8)__msa_fill_w(v32); 
     2920  v4i32 dst0 = __builtin_msa_fill_w(v32); 
    29212921 
    29222922  for (x = 0; x < width; x += 4) { 
     
    29702970} 
    29712971 
     2972void 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 
     2990void 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 
     3055void 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 
     3161void 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 
     3270void 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 
     3294void 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 
     3304void 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 
     3333void 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 
     3387void 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 
     3432void 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 
    29723490#ifdef __cplusplus 
    29733491}  // extern "C" 
Note: See TracChangeset for help on using the changeset viewer.