Merge commit '9d218d573f8088c606d873e80df572582e6773ef'
authorHendrik Leppkes <h.leppkes@gmail.com>
Sat, 2 Jan 2016 11:35:24 +0000 (12:35 +0100)
committerHendrik Leppkes <h.leppkes@gmail.com>
Sat, 2 Jan 2016 11:35:52 +0000 (12:35 +0100)
* commit '9d218d573f8088c606d873e80df572582e6773ef':
  checkasm: add float comparison util functions

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
tests/checkasm/checkasm.c
tests/checkasm/checkasm.h

@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2015 Henrik Gramner
   * Copyright (c) 2008 Loren Merritt
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or modify
 + * FFmpeg is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License along
 - * with Libav; if not, write to the Free Software Foundation, Inc.,
 + * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   */
  
@@@ -27,6 -27,7 +27,7 @@@
  #include "checkasm.h"
  #include "libavutil/common.h"
  #include "libavutil/cpu.h"
+ #include "libavutil/intfloat.h"
  #include "libavutil/random_seed.h"
  
  #if HAVE_IO_H
@@@ -57,34 -58,20 +58,34 @@@ static const struct 
      const char *name;
      void (*func)(void);
  } tests[] = {
 -#if CONFIG_BSWAPDSP
 -    { "bswapdsp", checkasm_check_bswapdsp },
 -#endif
 -#if CONFIG_H264PRED
 -    { "h264pred", checkasm_check_h264pred },
 -#endif
 -#if CONFIG_H264QPEL
 -    { "h264qpel", checkasm_check_h264qpel },
 -#endif
 -#if CONFIG_HEVC_DECODER
 -    { "hevc_mc", checkasm_check_hevc_mc },
 -#endif
 -#if CONFIG_V210_ENCODER
 -    { "v210enc", checkasm_check_v210enc },
 +#if CONFIG_AVCODEC
 +    #if CONFIG_ALAC_DECODER
 +        { "alacdsp", checkasm_check_alacdsp },
 +    #endif
 +    #if CONFIG_BSWAPDSP
 +        { "bswapdsp", checkasm_check_bswapdsp },
 +    #endif
 +    #if CONFIG_FLACDSP
 +        { "flacdsp", checkasm_check_flacdsp },
 +    #endif
 +    #if CONFIG_H264PRED
 +        { "h264pred", checkasm_check_h264pred },
 +    #endif
 +    #if CONFIG_H264QPEL
 +        { "h264qpel", checkasm_check_h264qpel },
 +    #endif
 +    #if CONFIG_JPEG2000_DECODER
 +        { "jpeg2000dsp", checkasm_check_jpeg2000dsp },
 +    #endif
 +    #if CONFIG_PIXBLOCKDSP
 +        { "pixblockdsp", checkasm_check_pixblockdsp },
 +    #endif
 +    #if CONFIG_V210_ENCODER
 +        { "v210enc", checkasm_check_v210enc },
 +    #endif
 +    #if CONFIG_VP9_DECODER
 +        { "vp9dsp", checkasm_check_vp9dsp },
 +    #endif
  #endif
      { NULL }
  };
@@@ -121,7 -108,6 +122,7 @@@ static const struct 
      { "SSSE3",    "ssse3",    AV_CPU_FLAG_SSSE3|AV_CPU_FLAG_ATOM },
      { "SSE4.1",   "sse4",     AV_CPU_FLAG_SSE4 },
      { "SSE4.2",   "sse42",    AV_CPU_FLAG_SSE42 },
 +    { "AES-NI",   "aesni",    AV_CPU_FLAG_AESNI },
      { "AVX",      "avx",      AV_CPU_FLAG_AVX },
      { "XOP",      "xop",      AV_CPU_FLAG_XOP },
      { "FMA3",     "fma3",     AV_CPU_FLAG_FMA3 },
@@@ -166,6 -152,78 +167,78 @@@ static struct 
  /* PRNG state */
  AVLFG checkasm_lfg;
  
+ /* float compare support code */
+ static int is_negative(union av_intfloat32 u)
+ {
+     return u.i >> 31;
+ }
+ int float_near_ulp(float a, float b, unsigned max_ulp)
+ {
+     union av_intfloat32 x, y;
+     x.f = a;
+     y.f = b;
+     if (is_negative(x) != is_negative(y)) {
+         // handle -0.0 == +0.0
+         return a == b;
+     }
+     if (abs(x.i - y.i) <= max_ulp)
+         return 1;
+     return 0;
+ }
+ int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp,
+                          unsigned len)
+ {
+     unsigned i;
+     for (i = 0; i < len; i++) {
+         if (!float_near_ulp(a[i], b[i], max_ulp))
+             return 0;
+     }
+     return 1;
+ }
+ int float_near_abs_eps(float a, float b, float eps)
+ {
+     float abs_diff = fabsf(a - b);
+     return abs_diff < eps;
+ }
+ int float_near_abs_eps_array(const float *a, const float *b, float eps,
+                          unsigned len)
+ {
+     unsigned i;
+     for (i = 0; i < len; i++) {
+         if (!float_near_abs_eps(a[i], b[i], eps))
+             return 0;
+     }
+     return 1;
+ }
+ int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp)
+ {
+     return float_near_ulp(a, b, max_ulp) || float_near_abs_eps(a, b, eps);
+ }
+ int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps,
+                          unsigned max_ulp, unsigned len)
+ {
+     unsigned i;
+     for (i = 0; i < len; i++) {
+         if (!float_near_abs_eps_ulp(a[i], b[i], eps, max_ulp))
+             return 0;
+     }
+     return 1;
+ }
  /* Print colored text to stderr if the terminal supports it */
  static void color_printf(int color, const char *fmt, ...)
  {
@@@ -371,9 -429,8 +444,9 @@@ static void check_cpu_flag(const char *
      int old_cpu_flag = state.cpu_flag;
  
      flag |= old_cpu_flag;
 -    av_set_cpu_flags_mask(flag);
 -    state.cpu_flag = av_get_cpu_flags();
 +    av_force_cpu_flags(-1);
 +    state.cpu_flag = flag & av_get_cpu_flags();
 +    av_force_cpu_flags(state.cpu_flag);
  
      if (!flag || state.cpu_flag != old_cpu_flag) {
          int i;
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2015 Henrik Gramner
   * Copyright (c) 2008 Loren Merritt
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or modify
 + * FFmpeg is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License along
 - * with Libav; if not, write to the Free Software Foundation, Inc.,
 + * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   */
  
  #include "libavutil/lfg.h"
  #include "libavutil/timer.h"
  
 +void checkasm_check_alacdsp(void);
  void checkasm_check_bswapdsp(void);
 +void checkasm_check_flacdsp(void);
  void checkasm_check_h264pred(void);
  void checkasm_check_h264qpel(void);
 -void checkasm_check_hevc_mc(void);
 +void checkasm_check_jpeg2000dsp(void);
 +void checkasm_check_pixblockdsp(void);
  void checkasm_check_v210enc(void);
 +void checkasm_check_vp9dsp(void);
  
  void *checkasm_check_func(void *func, const char *name, ...) av_printf_format(2, 3);
  int checkasm_bench_func(void);
@@@ -46,6 -42,17 +46,17 @@@ void checkasm_fail_func(const char *msg
  void checkasm_update_bench(int iterations, uint64_t cycles);
  void checkasm_report(const char *name, ...) av_printf_format(1, 2);
  
+ /* float compare utilities */
+ int float_near_ulp(float a, float b, unsigned max_ulp);
+ int float_near_abs_eps(float a, float b, float eps);
+ int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp);
+ int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp,
+                          unsigned len);
+ int float_near_abs_eps_array(const float *a, const float *b, float eps,
+                              unsigned len);
+ int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps,
+                                  unsigned max_ulp, unsigned len);
  extern AVLFG checkasm_lfg;
  #define rnd() av_lfg_get(&checkasm_lfg)