brush up fp16 implementation
authorTomoaki Teshima <tomoaki.teshima@gmail.com>
Wed, 24 Aug 2016 09:32:13 +0000 (18:32 +0900)
committerTomoaki Teshima <tomoaki.teshima@gmail.com>
Wed, 24 Aug 2016 20:31:25 +0000 (05:31 +0900)
  * DRY
  * switch to Cv32suf and remove fp32Int32
  * add Cv16suf

modules/core/include/opencv2/core/cvdef.h
modules/core/src/convert.cpp

index e3ad5cf..8011c36 100644 (file)
@@ -307,11 +307,32 @@ enum CpuFeatures {
 #define CV_2PI 6.283185307179586476925286766559
 #define CV_LOG2 0.69314718055994530941723212145818
 
+typedef union Cv16suf
+{
+    short i;
+#if ( defined (__arm__) || defined (__aarch64__) ) && ( defined (__GNUC__) && ( ( ( 4 <= __GNUC__ ) && ( 7 <= __GNUC__ ) ) || ( 5 <= __GNUC__ ) ) )
+    __fp16 h;
+#endif
+    struct _fp16Format
+    {
+        unsigned int significand : 10;
+        unsigned int exponent    : 5;
+        unsigned int sign        : 1;
+    } fmt;
+}
+Cv16suf;
+
 typedef union Cv32suf
 {
     int i;
     unsigned u;
     float f;
+    struct _fp32Format
+    {
+        unsigned int significand : 23;
+        unsigned int exponent    : 8;
+        unsigned int sign        : 1;
+    } fmt;
 }
 Cv32suf;
 
index 1b7f77c..1ee912a 100644 (file)
@@ -4367,39 +4367,13 @@ const unsigned int kShiftSignificand    = 13;
 const unsigned int kMaskFp16Significand = 0x3ff;
 const unsigned int kBiasFp16Exponent    = 15;
 const unsigned int kBiasFp32Exponent    = 127;
-
-union fp32Int32
-{
-    int i;
-    float f;
-    struct _fp32Format
-    {
-        unsigned int significand : 23;
-        unsigned int exponent    : 8;
-        unsigned int sign        : 1;
-    } fmt;
-};
 #endif
 
-union fp16Int16
-{
-    short i;
-#if ( defined (__arm__) || defined (__aarch64__) ) && ( defined (__GNUC__) && ( ( ( 4 <= __GNUC__ ) && ( 7 <= __GNUC__ ) ) || ( 5 <= __GNUC__ ) ) )
-    __fp16 h;
-#endif
-    struct _fp16Format
-    {
-        unsigned int significand : 10;
-        unsigned int exponent    : 5;
-        unsigned int sign        : 1;
-    } fmt;
-};
-
 #if ( defined (__arm__) || defined (__aarch64__) ) && ( defined (__GNUC__) && ( ( ( 4 <= __GNUC__ ) && ( 7 <= __GNUC__ ) ) || ( 5 <= __GNUC__ ) ) )
 static float convertFp16SW(short fp16)
 {
     // Fp16 -> Fp32
-    fp16Int16 a;
+    Cv16suf a;
     a.i = fp16;
     return (float)a.h;
 }
@@ -4407,12 +4381,12 @@ static float convertFp16SW(short fp16)
 static float convertFp16SW(short fp16)
 {
     // Fp16 -> Fp32
-    fp16Int16 b;
+    Cv16suf b;
     b.i = fp16;
     int exponent    = b.fmt.exponent - kBiasFp16Exponent;
     int significand = b.fmt.significand;
 
-    fp32Int32 a;
+    Cv32suf a;
     a.i = 0;
     a.fmt.sign = b.fmt.sign; // sign bit
     if( exponent == 16 )
@@ -4461,7 +4435,7 @@ static float convertFp16SW(short fp16)
 static short convertFp16SW(float fp32)
 {
     // Fp32 -> Fp16
-    fp16Int16 a;
+    Cv16suf a;
     a.h = (__fp16)fp32;
     return a.i;
 }
@@ -4469,12 +4443,12 @@ static short convertFp16SW(float fp32)
 static short convertFp16SW(float fp32)
 {
     // Fp32 -> Fp16
-    fp32Int32 a;
+    Cv32suf a;
     a.f = fp32;
     int exponent    = a.fmt.exponent - kBiasFp32Exponent;
     int significand = a.fmt.significand;
 
-    fp16Int16 result;
+    Cv16suf result;
     result.i = 0;
     unsigned int absolute = a.i & 0x7fffffff;
     if( 0x477ff000 <= absolute )