HalfFloatArray.st
author Claus Gittinger <cg@exept.de>
Wed, 08 May 2019 14:41:45 +0200
changeset 4942 9f424bed67c4
parent 4889 7d32114f8359
child 4980 bef95bf81d84
permissions -rw-r--r--
#DOCUMENTATION by cg class: Socket comment/format in: #bindAnonymously #bindTo:reuseAddress:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
3221
ea9f13f7c781 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3169
diff changeset
     2
 COPYRIGHT (c) 2014 by Claus Gittinger
ea9f13f7c781 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3169
diff changeset
     3
              All Rights Reserved
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
4044
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
    14
"{ NameSpace: Smalltalk }"
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
    15
4835
8f8949b8bac9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4834
diff changeset
    16
UnboxedFloatArray variableWordSubclass:#HalfFloatArray
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:''
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	classVariableNames:''
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	category:'Collections-Arrayed'
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!HalfFloatArray primitiveFunctions!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
%{
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
typedef unsigned short halffloat;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
typedef unsigned short uint16;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
typedef unsigned int   uint32;
4889
7d32114f8359 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4888
diff changeset
    28
#if 0
4888
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    29
#if defined(__GNUC__) || defined(__CLANG__) || defined(__MINGW__)
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    30
inline float 
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    31
XMConvertHalfToFloat(HALF Value) {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    32
    __m128i V1 = _mm_cvtsi32_si128( static_cast<uint32_t>(Value) );
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    33
    __m128 V2 = _mm_cvtph_ps( V1 );
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    34
    return _mm_cvtss_f32( V2 );
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    35
}
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    36
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    37
inline HALF 
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    38
XMConvertFloatToHalf(float Value) {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    39
    __m128 V1 = _mm_set_ss( Value );
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    40
    __m128i V2 = _mm_cvtps_ph( V1, 0 );
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    41
    return static_cast<HALF>( _mm_cvtsi128_si32(V2) );
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    42
}
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    43
#endif
4889
7d32114f8359 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4888
diff changeset
    44
#endif
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
//
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
// convert a halffloat (16-bit float) to a float
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
//
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
float
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
__STX_halffloat_to_float(halffloat h) {
4888
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    50
        int e;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    51
        uint16 hs, he, hm;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    52
        uint32 xs, xe, xm;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    53
        int32 xes;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    54
        union {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    55
            uint32 u32;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    56
            float f32;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    57
        } u;
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
4888
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    59
        if( (h & 0x7FFFu) == 0 ) {  // Signed zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    60
            u.u32 = ((uint32) h) << 16;  // Return the signed zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    61
        } else { // Not zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    62
            hs = h & 0x8000u;  // Pick off sign bit
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    63
            he = h & 0x7C00u;  // Pick off exponent bits
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    64
            hm = h & 0x03FFu;  // Pick off mantissa bits
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    65
            if( he == 0 ) {  // Denormal will convert to normalized
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    66
                e = -1; // The following loop figures out how much extra to adjust the exponent
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    67
                do {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    68
                    e++;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    69
                    hm <<= 1;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    70
                } while( (hm & 0x0400u) == 0 ); // Shift until leading bit overflows into exponent bit
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    71
                xs = ((uint32) hs) << 16; // Sign bit
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    72
                xes = ((uint32) (he >> 10)) - 15 + 127 - e; // Exponent unbias the halfp, then bias the single
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    73
                xe = (uint32) (xes << 23); // Exponent
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    74
                xm = ((uint32) (hm & 0x03FFu)) << 13; // Mantissa
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    75
                u.u32 = (xs | xe | xm); // Combine sign bit, exponent bits, and mantissa bits
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    76
            } else if( he == 0x7C00u ) {  // Inf or NaN (all the exponent bits are set)
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    77
                if( hm == 0 ) { // If mantissa is zero ...
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    78
                    u.u32 = (((uint32) hs) << 16) | ((uint32) 0x7F800000u); // Signed Inf
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    79
                } else {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    80
                    u.u32 = (uint32) 0xFFC00000u; // NaN, only 1st mantissa bit set
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    81
                }
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    82
            } else { // Normalized number
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    83
                xs = ((uint32) hs) << 16; // Sign bit
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    84
                xes = ((uint32) (he >> 10)) - 15 + 127; // Exponent unbias the halfp, then bias the single
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    85
                xe = (uint32) (xes << 23); // Exponent
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    86
                xm = ((uint32) hm) << 13; // Mantissa
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    87
                u.u32 = (xs | xe | xm); // Combine sign bit, exponent bits, and mantissa bits
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    88
            }
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    89
        }
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    90
        return u.f32;
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
}
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
//
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
// convert a float to a halffloat (16-bit float)
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
//
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
halffloat
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
__STX_float_to_halffloat(float f32) {
4888
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    98
        uint16    hs, he, hm;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
    99
        uint32 x, xs, xe, xm;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   100
        int hes;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   101
        union {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   102
            uint32 u32;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   103
            float f32;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   104
        } u;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   105
        halffloat h;
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
4888
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   107
        u.f32 = f32;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   108
        x = u.u32;
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   109
        if( (x & 0x7FFFFFFFu) == 0 ) {  // Signed zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   110
            h = (uint16) (x >> 16);  // Return the signed zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   111
        } else { // Not zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   112
            xs = x & 0x80000000u;  // Pick off sign bit
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   113
            xe = x & 0x7F800000u;  // Pick off exponent bits
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   114
            xm = x & 0x007FFFFFu;  // Pick off mantissa bits
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   115
            if( xe == 0 ) {  // Denormal will underflow, return a signed zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   116
                h = (uint16) (xs >> 16);
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   117
            } else if( xe == 0x7F800000u ) {  // Inf or NaN (all the exponent bits are set)
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   118
                if( xm == 0 ) { // If mantissa is zero ...
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   119
                    h = (uint16) ((xs >> 16) | 0x7C00u); // Signed Inf
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   120
                } else {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   121
                    h = (uint16) 0xFE00u; // NaN, only 1st mantissa bit set
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   122
                }
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   123
            } else { // Normalized number
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   124
                hs = (uint16) (xs >> 16); // Sign bit
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   125
                hes = ((int)(xe >> 23)) - 127 + 15; // Exponent unbias the single, then bias the halfp
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   126
                if( hes >= 0x1F ) {  // Overflow
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   127
                    h = (uint16) ((xs >> 16) | 0x7C00u); // Signed Inf
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   128
                } else if( hes <= 0 ) {  // Underflow
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   129
                    if( (14 - hes) > 24 ) {  // Mantissa shifted all the way off & no rounding possibility
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   130
                        hm = (uint16) 0u;  // Set mantissa to zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   131
                    } else {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   132
                        xm |= 0x00800000u;  // Add the hidden leading bit
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   133
                        hm = (uint16) (xm >> (14 - hes)); // Mantissa
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   134
                        if( (xm >> (13 - hes)) & 0x00000001u ) // Check for rounding
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   135
                            hm += (uint16) 1u; // Round, might overflow into exp bit, but this is OK
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   136
                    }
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   137
                    h = (hs | hm); // Combine sign bit and mantissa bits, biased exponent is zero
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   138
                } else {
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   139
                    he = (uint16) (hes << 10); // Exponent
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   140
                    hm = (uint16) (xm >> 13); // Mantissa
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   141
                    if( xm & 0x00001000u ) // Check for rounding
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   142
                        h = (hs | he | hm) + (uint16) 1u; // Round, might overflow to inf, this is OK
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   143
                    else
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   144
                        h = (hs | he | hm);  // No rounding
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   145
                }
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   146
            }
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   147
        }
1b19c584754c #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4835
diff changeset
   148
        return h;
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
}
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
%}
3160
d5bef8d7e676 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3159
diff changeset
   152
! !
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
!HalfFloatArray class methodsFor:'documentation'!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
copyright
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
"
3221
ea9f13f7c781 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3169
diff changeset
   158
 COPYRIGHT (c) 2014 by Claus Gittinger
ea9f13f7c781 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3169
diff changeset
   159
              All Rights Reserved
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
 This software is furnished under a license and may be used
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
 only in accordance with the terms of that license and with the
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
 inclusion of the above copyright notice.   This software may not
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
 be provided or otherwise made available to, or used by, any
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
 other person.  No title to or ownership of the software is
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
 hereby transferred.
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
"
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
documentation
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
"
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    HalfFloatArrays store half precision (16bit) floats (and nothing else).
3221
ea9f13f7c781 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3169
diff changeset
   173
    HalfFloats were traditionally seldom used, but seem to become more popular
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
    these days, as some 3D graphics accelerators and game engines use them
3304
3e8969a01089 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3221
diff changeset
   175
    for very dense and compact storage of texture and vertex data.
3160
d5bef8d7e676 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3159
diff changeset
   176
3304
3e8969a01089 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3221
diff changeset
   177
    Notice, that HalfFloats are not supported as first class objects by the ST/X system;
3160
d5bef8d7e676 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3159
diff changeset
   178
    i.e. outside of a HalfFloatArray, these values are represented as floats
3304
3e8969a01089 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3221
diff changeset
   179
    or doubles. When accessing a HalfFloatArray's element via getters/setters,
3e8969a01089 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3221
diff changeset
   180
    shortFloat (i.e. single precision 32bit floats) are exchanged.
3e8969a01089 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3221
diff changeset
   181
3160
d5bef8d7e676 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3159
diff changeset
   182
    Be aware that the numeric range of a half-float is very very limited.
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    [memory requirements:]
3160
d5bef8d7e676 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3159
diff changeset
   185
        OBJ-HEADER + (size * 2)
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    [See also:]
3160
d5bef8d7e676 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3159
diff changeset
   188
        FloatArray DoubleArray Array
3304
3e8969a01089 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3221
diff changeset
   189
        http://www.opengl.org/wiki/Small_Float_Formats
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    [author:]
3160
d5bef8d7e676 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3159
diff changeset
   192
        Claus Gittinger
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
"
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
! !
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
!HalfFloatArray class methodsFor:'queries'!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
elementByteSize
3335
deeaf91b9227 comment/format in: #elementByteSize
Claus Gittinger <cg@exept.de>
parents: 3305
diff changeset
   199
    "for bit-like containers, return the number of bytes stored per element.
deeaf91b9227 comment/format in: #elementByteSize
Claus Gittinger <cg@exept.de>
parents: 3305
diff changeset
   200
     Here, 2 is returned"
deeaf91b9227 comment/format in: #elementByteSize
Claus Gittinger <cg@exept.de>
parents: 3305
diff changeset
   201
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
    ^ 2
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
! !
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
!HalfFloatArray methodsFor:'accessing'!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
at:index
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
%{  /* NOCONTEXT */
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
    if (__isSmallInteger(index)) {
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
	int i = __intVal(index);
3169
89969fe0320f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3160
diff changeset
   211
	int n = __wordArraySize(self);
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
3169
89969fe0320f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3160
diff changeset
   213
	if ((unsigned)i <= n) {
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
	    unsigned short h;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
	    OBJ newFloat;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
	    float f;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
3169
89969fe0320f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3160
diff changeset
   218
	    h = __WordArrayInstPtr(self)->s_element[i-1];
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
	    f = __STX_halffloat_to_float(h);
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
	    __qMKSFLOAT(newFloat, f);
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
	    RETURN ( newFloat );
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
	}
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    }
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
%}.
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    self primitiveFailed
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
at:index put:aFloat
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
%{
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    if (__isSmallInteger(index)) {
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
	int i = __intVal(index);
3169
89969fe0320f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3160
diff changeset
   233
	int n = __wordArraySize(self);
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
3169
89969fe0320f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3160
diff changeset
   235
	if ((unsigned)i <= n) {
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
	    unsigned short h;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
	    float f;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
	    if (__isFloat(aFloat)) {
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
		f = (float)(__floatVal(aFloat));
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
	    } else if (__isShortFloat(aFloat)) {
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
		f = __shortFloatVal(aFloat);
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
	    } else if (__isSmallInteger(aFloat)) {
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
		f = (float)(__intVal(aFloat));
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
	    } else
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
		goto error;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
	    h = __STX_float_to_halffloat(f);
3169
89969fe0320f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3160
diff changeset
   249
	    __WordArrayInstPtr(self)->s_element[i-1] = h;
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
	    RETURN (aFloat);
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
	}
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
    }
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
  error: ;
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
%}.
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
    self primitiveFailed
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
! !
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
!HalfFloatArray methodsFor:'queries'!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
defaultElement
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    ^ ShortFloat zero
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
4044
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
   264
isValidElement:anObject
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
   265
    "return true, if I can hold this kind of object"
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
   266
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
   267
    ^ anObject isNumber
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
   268
!
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
   269
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
numFloats
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
    ^ self size
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
! !
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
4834
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   274
!HalfFloatArray methodsFor:'testing'!
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   275
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   276
isFloatArray
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   277
    "return true if the receiver has float elements.
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   278
     These are Float, Double- and HalfFloat arrays"
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   279
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   280
    ^ true
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   281
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   282
    "Created: / 02-03-2019 / 23:14:00 / Claus Gittinger"
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   283
! !
1a3b148d9442 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4044
diff changeset
   284
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
!HalfFloatArray class methodsFor:'documentation'!
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
3305
431660ac51d0 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3304
diff changeset
   287
version
4044
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
   288
    ^ '$Header$'
3305
431660ac51d0 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3304
diff changeset
   289
!
431660ac51d0 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3304
diff changeset
   290
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
version_CVS
4044
1752b3c659b3 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 3335
diff changeset
   292
    ^ '$Header$'
3159
1ea80d1ded0c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
! !
3160
d5bef8d7e676 class: HalfFloatArray
Claus Gittinger <cg@exept.de>
parents: 3159
diff changeset
   294