util: add float to float16 conversions with RTZ and RTNE

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>
This commit is contained in:
Samuel Iglesias Gonsálvez 2018-07-04 12:02:30 +02:00 committed by Andres Gomez
parent 153c714f2a
commit 733ede8ff6
2 changed files with 22 additions and 0 deletions

View 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.

View 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)
{