X-Git-Url: https://git.piment-noir.org/?p=deb_ffmpeg.git;a=blobdiff_plain;f=ffmpeg%2Flibavutil%2Fsoftfloat.h;h=8647e6a4fc13d22774e4126c98fca06eeddef069;hp=97e09ea7e7ac4842aa07aed8d427711fadaf2c31;hb=f6fa7814ccfe3e76514b36cf04f5cd3cb657c8cf;hpb=2ba45a602cbfa7b771effba9b11bb4245c21bc00 diff --git a/ffmpeg/libavutil/softfloat.h b/ffmpeg/libavutil/softfloat.h index 97e09ea..8647e6a 100644 --- a/ffmpeg/libavutil/softfloat.h +++ b/ffmpeg/libavutil/softfloat.h @@ -24,6 +24,8 @@ #include #include "common.h" +#include "avassert.h" + #define MIN_EXP -126 #define MAX_EXP 126 #define ONE_BITS 29 @@ -57,10 +59,11 @@ static av_const SoftFloat av_normalize_sf(SoftFloat a){ static inline av_const SoftFloat av_normalize1_sf(SoftFloat a){ #if 1 - if(a.mant + 0x40000000 < 0){ + if((int32_t)(a.mant + 0x40000000U) < 0){ a.exp++; a.mant>>=1; } + av_assert2(a.mant < 0x40000000 && a.mant > -0x40000000); return a; #elif 1 int t= a.mant + 0x40000000 < 0; @@ -78,6 +81,7 @@ static inline av_const SoftFloat av_normalize1_sf(SoftFloat a){ */ static inline av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b){ a.exp += b.exp; + av_assert2((int32_t)((a.mant * (int64_t)b.mant) >> ONE_BITS) == (a.mant * (int64_t)b.mant) >> ONE_BITS); a.mant = (a.mant * (int64_t)b.mant) >> ONE_BITS; return av_normalize1_sf(a); } @@ -100,8 +104,10 @@ static inline av_const int av_cmp_sf(SoftFloat a, SoftFloat b){ static inline av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b){ int t= a.exp - b.exp; - if(t<0) return av_normalize1_sf((SoftFloat){b.exp, b.mant + (a.mant >> (-t))}); - else return av_normalize1_sf((SoftFloat){a.exp, a.mant + (b.mant >> t )}); + if (t <-31) return b; + else if (t < 0) return av_normalize1_sf((SoftFloat){b.exp, b.mant + (a.mant >> (-t))}); + else if (t < 32) return av_normalize1_sf((SoftFloat){a.exp, a.mant + (b.mant >> t )}); + else return a; } static inline av_const SoftFloat av_sub_sf(SoftFloat a, SoftFloat b){