| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- using System;
- namespace Ryujinx.Graphics.Shader.Translation.Optimizations
- {
- static class HalfConversion
- {
- public static float HalfToSingle(int value)
- {
- int mantissa = (value >> 0) & 0x3ff;
- int exponent = (value >> 10) & 0x1f;
- int sign = (value >> 15) & 0x1;
- if (exponent == 0x1f)
- {
- // NaN or Infinity.
- mantissa <<= 13;
- exponent = 0xff;
- }
- else if (exponent != 0 || mantissa != 0 )
- {
- if (exponent == 0)
- {
- // Denormal.
- int e = -1;
- int m = mantissa;
- do
- {
- e++;
- m <<= 1;
- }
- while ((m & 0x400) == 0);
- mantissa = m & 0x3ff;
- exponent = e;
- }
- mantissa <<= 13;
- exponent = 127 - 15 + exponent;
- }
- int output = (sign << 31) | (exponent << 23) | mantissa;
- return BitConverter.Int32BitsToSingle(output);
- }
- }
- }
|