util: add float to float16 conversions with RTZ and RTNE
authorSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Wed, 4 Jul 2018 10:02:30 +0000 (12:02 +0200)
committerAndres Gomez <agomez@igalia.com>
Tue, 17 Sep 2019 20:39:18 +0000 (23:39 +0300)
In order to be coherent with the pre-existent functions, this new API
is the one meant to be used when doing half float to float
conversions. It is no more than a wrapper for the softfloat.h API but
we meant to keep that one private.

v2:
- Replace custom f32 -> f16 RTZ implementation with the softfloat
  one (Andres).

v3:
- Added API usage clarifying comments (Caio).

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Signed-off-by: Andres Gomez <agomez@igalia.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/util/half_float.c
src/util/half_float.h

index 5ccee81f78a080cce59169bb787faca33582fd0c..aae690a56a6fad2e03636517397305f9713af537 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
  * Copyright 2015 Philip Taylor <philip@zaynar.co.uk>
  * Copyright 2018 Advanced Micro Devices, Inc.
+ * Copyright (C) 2018-2019 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -29,6 +30,7 @@
 #include "half_float.h"
 #include "util/u_half.h"
 #include "rounding.h"
+#include "softfloat.h"
 #include "macros.h"
 
 typedef union { float f; int32_t i; uint32_t u; } fi_type;
@@ -126,6 +128,11 @@ _mesa_float_to_half(float val)
    return result;
 }
 
+uint16_t
+_mesa_float_to_float16_rtz(float val)
+{
+    return _mesa_float_to_half_rtz(val);
+}
 
 /**
  * Convert a 2-byte half float to a 4-byte float.
index 01557424735db11d3f3f1f923a629a49456510db..84112e57bd4ba8f25e5c31bae781da873c164bfa 100644 (file)
@@ -2,6 +2,7 @@
  * Mesa 3-D graphics library
  *
  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2018-2019 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -40,6 +41,20 @@ float _mesa_half_to_float(uint16_t val);
 uint8_t _mesa_half_to_unorm8(uint16_t v);
 uint16_t _mesa_uint16_div_64k_to_half(uint16_t v);
 
+/*
+ * _mesa_float_to_float16_rtz is no more than a wrapper to the counterpart
+ * softfloat.h call. Still, softfloat.h conversion API is meant to be kept
+ * private. In other words, only use the API published here, instead of
+ * calling directly the softfloat.h one.
+ */
+uint16_t _mesa_float_to_float16_rtz(float val);
+
+static inline uint16_t
+_mesa_float_to_float16_rtne(float val)
+{
+   return _mesa_float_to_half(val);
+}
+
 static inline bool
 _mesa_half_is_negative(uint16_t h)
 {