Andreas Klebinger pushed to branch wip/andreask/9.10.4-batch1 at Glasgow Haskell Compiler / GHC

Commits:

5 changed files:

Changes:

  • compiler/GHC/Cmm/CLabel.hs
    ... ... @@ -100,7 +100,7 @@ module GHC.Cmm.CLabel (
    100 100
             needsCDecl,
    
    101 101
             maybeLocalBlockLabel,
    
    102 102
             externallyVisibleCLabel,
    
    103
    -        isMathFun,
    
    103
    +        isLibcFun,
    
    104 104
             isCFunctionLabel,
    
    105 105
             isGcPtrLabel,
    
    106 106
             labelDynamic,
    
    ... ... @@ -1021,7 +1021,7 @@ needsCDecl (CmmLabel pkgId (NeedExternDecl external) _ _)
    1021 1021
             -- For other labels we inline one into the HC file directly.
    
    1022 1022
             | otherwise                     = True
    
    1023 1023
     
    
    1024
    -needsCDecl l@(ForeignLabel{})           = not (isMathFun l)
    
    1024
    +needsCDecl l@(ForeignLabel{})           = not (isLibcFun l)
    
    1025 1025
     needsCDecl (CC_Label _)                 = True
    
    1026 1026
     needsCDecl (CCS_Label _)                = True
    
    1027 1027
     needsCDecl (IPE_Label {})               = True
    
    ... ... @@ -1048,15 +1048,19 @@ maybeLocalBlockLabel _ = Nothing
    1048 1048
     
    
    1049 1049
     
    
    1050 1050
     -- | Check whether a label corresponds to a C function that has
    
    1051
    ---      a prototype in a system header somewhere, or is built-in
    
    1052
    ---      to the C compiler. For these labels we avoid generating our
    
    1053
    ---      own C prototypes.
    
    1054
    -isMathFun :: CLabel -> Bool
    
    1055
    -isMathFun (ForeignLabel fs _ _ _)       = fs `elementOfUniqSet` math_funs
    
    1056
    -isMathFun _ = False
    
    1057
    -
    
    1058
    -math_funs :: UniqSet FastString
    
    1059
    -math_funs = mkUniqSet [
    
    1051
    +-- a prototype in a system header somewhere, or is built-in
    
    1052
    +-- to the C compiler. For these labels we avoid generating our
    
    1053
    +-- own C prototypes.
    
    1054
    +isLibcFun :: CLabel -> Bool
    
    1055
    +isLibcFun (ForeignLabel fs _ _ _)  = fs `elementOfUniqSet` libc_funs
    
    1056
    +isLibcFun _ = False
    
    1057
    +
    
    1058
    +libc_funs :: UniqSet FastString
    
    1059
    +libc_funs = mkUniqSet [
    
    1060
    +        ---------------------
    
    1061
    +        -- Math functions
    
    1062
    +        ---------------------
    
    1063
    +
    
    1060 1064
             -- _ISOC99_SOURCE
    
    1061 1065
             (fsLit "acos"),         (fsLit "acosf"),        (fsLit "acosh"),
    
    1062 1066
             (fsLit "acoshf"),       (fsLit "acoshl"),       (fsLit "acosl"),
    

  • compiler/GHC/CmmToC.hs
    ... ... @@ -252,7 +252,7 @@ pprStmt platform stmt =
    252 252
                             -- it isn't valid C.
    
    253 253
                     | CmmNeverReturns <- ret ->
    
    254 254
                         pprCall platform cast_fn cconv hresults hargs <> semi <> text "__builtin_unreachable();"
    
    255
    -                | not (isMathFun lbl) ->
    
    255
    +                | not (isLibcFun lbl) ->
    
    256 256
                         pprForeignCall platform (pprCLabel platform lbl) cconv hresults hargs
    
    257 257
                   _ ->
    
    258 258
                         pprCall platform cast_fn cconv hresults hargs <> semi
    

  • rts/include/stg/Prim.h
    ... ... @@ -145,30 +145,28 @@ W_ hs_mulIntMayOflo(W_ a, W_ b);
    145 145
     
    
    146 146
     /* rts/prim/int64x2minmax and rts/prim/vectorQuotRem */
    
    147 147
     #if defined(__SSE2__)
    
    148
    -#include <emmintrin.h>
    
    149
    -
    
    150
    -__m128i hs_minInt64X2(__m128i, __m128i);
    
    151
    -__m128i hs_maxInt64X2(__m128i, __m128i);
    
    152
    -__m128i hs_minWord64X2(__m128i, __m128i);
    
    153
    -__m128i hs_maxWord64X2(__m128i, __m128i);
    
    154
    -
    
    155
    -__m128i hs_quotInt8X16(__m128i, __m128i);
    
    156
    -__m128i hs_quotInt16X8(__m128i, __m128i);
    
    157
    -__m128i hs_quotInt32X4(__m128i, __m128i);
    
    158
    -__m128i hs_quotInt64X2(__m128i, __m128i);
    
    159
    -__m128i hs_quotWord8X16(__m128i, __m128i);
    
    160
    -__m128i hs_quotWord16X8(__m128i, __m128i);
    
    161
    -__m128i hs_quotWord32X4(__m128i, __m128i);
    
    162
    -__m128i hs_quotWord64X2(__m128i, __m128i);
    
    163
    -__m128i hs_remInt8X16(__m128i, __m128i);
    
    164
    -__m128i hs_remInt16X8(__m128i, __m128i);
    
    165
    -__m128i hs_remInt32X4(__m128i, __m128i);
    
    166
    -__m128i hs_remInt64X2(__m128i, __m128i);
    
    167
    -__m128i hs_remWord8X16(__m128i, __m128i);
    
    168
    -__m128i hs_remWord16X8(__m128i, __m128i);
    
    169
    -__m128i hs_remWord32X4(__m128i, __m128i);
    
    170
    -__m128i hs_remWord64X2(__m128i, __m128i);
    
    171
    -
    
    148
    +typedef char v128 __attribute__((vector_size(16)));
    
    149
    +v128 hs_minInt64X2(v128, v128);
    
    150
    +v128 hs_maxInt64X2(v128, v128);
    
    151
    +v128 hs_minWord64X2(v128, v128);
    
    152
    +v128 hs_maxWord64X2(v128, v128);
    
    153
    +
    
    154
    +v128 hs_quotInt8X16(v128, v128);
    
    155
    +v128 hs_quotInt16X8(v128, v128);
    
    156
    +v128 hs_quotInt32X4(v128, v128);
    
    157
    +v128 hs_quotInt64X2(v128, v128);
    
    158
    +v128 hs_quotWord8X16(v128, v128);
    
    159
    +v128 hs_quotWord16X8(v128, v128);
    
    160
    +v128 hs_quotWord32X4(v128, v128);
    
    161
    +v128 hs_quotWord64X2(v128, v128);
    
    162
    +v128 hs_remInt8X16(v128, v128);
    
    163
    +v128 hs_remInt16X8(v128, v128);
    
    164
    +v128 hs_remInt32X4(v128, v128);
    
    165
    +v128 hs_remInt64X2(v128, v128);
    
    166
    +v128 hs_remWord8X16(v128, v128);
    
    167
    +v128 hs_remWord16X8(v128, v128);
    
    168
    +v128 hs_remWord32X4(v128, v128);
    
    169
    +v128 hs_remWord64X2(v128, v128);
    
    172 170
     #endif
    
    173 171
     
    
    174 172
     /* bitcasts, instead of creating a new C file we static inline these here. We
    

  • rts/prim/int64x2minmax.c
    ... ... @@ -12,44 +12,44 @@
    12 12
     //   * enable SSE4.2, or
    
    13 13
     //   * implement min/max in NCG.
    
    14 14
     
    
    15
    -__m128i hs_minInt64X2(__m128i xx, __m128i yy)
    
    15
    +v128 hs_minInt64X2(v128 xx, v128 yy)
    
    16 16
     {
    
    17 17
       int64_t x[2], y[2];
    
    18 18
       memcpy(x, &xx, 16);
    
    19 19
       memcpy(y, &yy, 16);
    
    20 20
       int64_t z0 = x[0] < y[0] ? x[0] : y[0];
    
    21 21
       int64_t z1 = x[1] < y[1] ? x[1] : y[1];
    
    22
    -  return _mm_set_epi64x(z1, z0);
    
    22
    +  return (v128) _mm_set_epi64x(z1, z0);
    
    23 23
     }
    
    24 24
     
    
    25
    -__m128i hs_maxInt64X2(__m128i xx, __m128i yy)
    
    25
    +v128 hs_maxInt64X2(v128 xx, v128 yy)
    
    26 26
     {
    
    27 27
       int64_t x[2], y[2];
    
    28 28
       memcpy(x, &xx, 16);
    
    29 29
       memcpy(y, &yy, 16);
    
    30 30
       int64_t z0 = x[0] < y[0] ? y[0] : x[0];
    
    31 31
       int64_t z1 = x[1] < y[1] ? y[1] : x[1];
    
    32
    -  return _mm_set_epi64x(z1, z0);
    
    32
    +  return (v128) _mm_set_epi64x(z1, z0);
    
    33 33
     }
    
    34 34
     
    
    35
    -__m128i hs_minWord64X2(__m128i xx, __m128i yy)
    
    35
    +v128 hs_minWord64X2(v128 xx, v128 yy)
    
    36 36
     {
    
    37 37
       uint64_t x[2], y[2];
    
    38 38
       memcpy(x, &xx, 16);
    
    39 39
       memcpy(y, &yy, 16);
    
    40 40
       uint64_t z0 = x[0] < y[0] ? x[0] : y[0];
    
    41 41
       uint64_t z1 = x[1] < y[1] ? x[1] : y[1];
    
    42
    -  return _mm_set_epi64x(z1, z0);
    
    42
    +  return (v128) _mm_set_epi64x(z1, z0);
    
    43 43
     }
    
    44 44
     
    
    45
    -__m128i hs_maxWord64X2(__m128i xx, __m128i yy)
    
    45
    +v128 hs_maxWord64X2(v128 xx, v128 yy)
    
    46 46
     {
    
    47 47
       uint64_t x[2], y[2];
    
    48 48
       memcpy(x, &xx, 16);
    
    49 49
       memcpy(y, &yy, 16);
    
    50 50
       uint64_t z0 = x[0] < y[0] ? y[0] : x[0];
    
    51 51
       uint64_t z1 = x[1] < y[1] ? y[1] : x[1];
    
    52
    -  return _mm_set_epi64x(z1, z0);
    
    52
    +  return (v128) _mm_set_epi64x(z1, z0);
    
    53 53
     }
    
    54 54
     
    
    55 55
     #endif

  • rts/prim/vectorQuotRem.c
    ... ... @@ -16,7 +16,7 @@ int8x16_t hs_quotInt8X16(int8x16_t x, int8x16_t y)
    16 16
     
    
    17 17
     */
    
    18 18
     
    
    19
    -__m128i hs_quotInt8X16(__m128i xx, __m128i yy)
    
    19
    +v128 hs_quotInt8X16(v128 xx, v128 yy)
    
    20 20
     {
    
    21 21
       int8_t x[16], y[16];
    
    22 22
       memcpy(x, &xx, 16);
    
    ... ... @@ -37,10 +37,10 @@ __m128i hs_quotInt8X16(__m128i xx, __m128i yy)
    37 37
       int8_t z13 = x[13] / y[13];
    
    38 38
       int8_t z14 = x[14] / y[14];
    
    39 39
       int8_t z15 = x[15] / y[15];
    
    40
    -  return _mm_set_epi8(z15, z14, z13, z12, z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z0);
    
    40
    +  return (v128) _mm_set_epi8(z15, z14, z13, z12, z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z0);
    
    41 41
     }
    
    42 42
     
    
    43
    -__m128i hs_quotInt16X8(__m128i xx, __m128i yy)
    
    43
    +v128 hs_quotInt16X8(v128 xx, v128 yy)
    
    44 44
     {
    
    45 45
       int16_t x[8], y[8];
    
    46 46
       memcpy(x, &xx, 16);
    
    ... ... @@ -53,10 +53,10 @@ __m128i hs_quotInt16X8(__m128i xx, __m128i yy)
    53 53
       int16_t z5 = x[5] / y[5];
    
    54 54
       int16_t z6 = x[6] / y[6];
    
    55 55
       int16_t z7 = x[7] / y[7];
    
    56
    -  return _mm_set_epi16(z7, z6, z5, z4, z3, z2, z1, z0);
    
    56
    +  return (v128) _mm_set_epi16(z7, z6, z5, z4, z3, z2, z1, z0);
    
    57 57
     }
    
    58 58
     
    
    59
    -__m128i hs_quotInt32X4(__m128i xx, __m128i yy)
    
    59
    +v128 hs_quotInt32X4(v128 xx, v128 yy)
    
    60 60
     {
    
    61 61
       int32_t x[4], y[4];
    
    62 62
       memcpy(x, &xx, 16);
    
    ... ... @@ -65,20 +65,20 @@ __m128i hs_quotInt32X4(__m128i xx, __m128i yy)
    65 65
       int32_t z1 = x[1] / y[1];
    
    66 66
       int32_t z2 = x[2] / y[2];
    
    67 67
       int32_t z3 = x[3] / y[3];
    
    68
    -  return _mm_set_epi32(z3, z2, z1, z0);
    
    68
    +  return (v128) _mm_set_epi32(z3, z2, z1, z0);
    
    69 69
     }
    
    70 70
     
    
    71
    -__m128i hs_quotInt64X2(__m128i xx, __m128i yy)
    
    71
    +v128 hs_quotInt64X2(v128 xx, v128 yy)
    
    72 72
     {
    
    73 73
       int64_t x[2], y[2];
    
    74 74
       memcpy(x, &xx, 16);
    
    75 75
       memcpy(y, &yy, 16);
    
    76 76
       int64_t z0 = x[0] / y[0];
    
    77 77
       int64_t z1 = x[1] / y[1];
    
    78
    -  return _mm_set_epi64x(z1, z0);
    
    78
    +  return (v128) _mm_set_epi64x(z1, z0);
    
    79 79
     }
    
    80 80
     
    
    81
    -__m128i hs_quotWord8X16(__m128i xx, __m128i yy)
    
    81
    +v128 hs_quotWord8X16(v128 xx, v128 yy)
    
    82 82
     {
    
    83 83
       uint8_t x[16], y[16];
    
    84 84
       memcpy(x, &xx, 16);
    
    ... ... @@ -99,10 +99,10 @@ __m128i hs_quotWord8X16(__m128i xx, __m128i yy)
    99 99
       uint8_t z13 = x[13] / y[13];
    
    100 100
       uint8_t z14 = x[14] / y[14];
    
    101 101
       uint8_t z15 = x[15] / y[15];
    
    102
    -  return _mm_set_epi8(z15, z14, z13, z12, z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z0);
    
    102
    +  return (v128) _mm_set_epi8(z15, z14, z13, z12, z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z0);
    
    103 103
     }
    
    104 104
     
    
    105
    -__m128i hs_quotWord16X8(__m128i xx, __m128i yy)
    
    105
    +v128 hs_quotWord16X8(v128 xx, v128 yy)
    
    106 106
     {
    
    107 107
       uint16_t x[8], y[8];
    
    108 108
       memcpy(x, &xx, 16);
    
    ... ... @@ -115,10 +115,10 @@ __m128i hs_quotWord16X8(__m128i xx, __m128i yy)
    115 115
       uint16_t z5 = x[5] / y[5];
    
    116 116
       uint16_t z6 = x[6] / y[6];
    
    117 117
       uint16_t z7 = x[7] / y[7];
    
    118
    -  return _mm_set_epi16(z7, z6, z5, z4, z3, z2, z1, z0);
    
    118
    +  return (v128) _mm_set_epi16(z7, z6, z5, z4, z3, z2, z1, z0);
    
    119 119
     }
    
    120 120
     
    
    121
    -__m128i hs_quotWord32X4(__m128i xx, __m128i yy)
    
    121
    +v128 hs_quotWord32X4(v128 xx, v128 yy)
    
    122 122
     {
    
    123 123
       uint32_t x[4], y[4];
    
    124 124
       memcpy(x, &xx, 16);
    
    ... ... @@ -127,20 +127,20 @@ __m128i hs_quotWord32X4(__m128i xx, __m128i yy)
    127 127
       uint32_t z1 = x[1] / y[1];
    
    128 128
       uint32_t z2 = x[2] / y[2];
    
    129 129
       uint32_t z3 = x[3] / y[3];
    
    130
    -  return _mm_set_epi32(z3, z2, z1, z0);
    
    130
    +  return (v128) _mm_set_epi32(z3, z2, z1, z0);
    
    131 131
     }
    
    132 132
     
    
    133
    -__m128i hs_quotWord64X2(__m128i xx, __m128i yy)
    
    133
    +v128 hs_quotWord64X2(v128 xx, v128 yy)
    
    134 134
     {
    
    135 135
       uint64_t x[2], y[2];
    
    136 136
       memcpy(x, &xx, 16);
    
    137 137
       memcpy(y, &yy, 16);
    
    138 138
       uint64_t z0 = x[0] / y[0];
    
    139 139
       uint64_t z1 = x[1] / y[1];
    
    140
    -  return _mm_set_epi64x(z1, z0);
    
    140
    +  return (v128) _mm_set_epi64x(z1, z0);
    
    141 141
     }
    
    142 142
     
    
    143
    -__m128i hs_remInt8X16(__m128i xx, __m128i yy)
    
    143
    +v128 hs_remInt8X16(v128 xx, v128 yy)
    
    144 144
     {
    
    145 145
       int8_t x[16], y[16];
    
    146 146
       memcpy(x, &xx, 16);
    
    ... ... @@ -161,10 +161,10 @@ __m128i hs_remInt8X16(__m128i xx, __m128i yy)
    161 161
       int8_t z13 = x[13] % y[13];
    
    162 162
       int8_t z14 = x[14] % y[14];
    
    163 163
       int8_t z15 = x[15] % y[15];
    
    164
    -  return _mm_set_epi8(z15, z14, z13, z12, z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z0);
    
    164
    +  return (v128) _mm_set_epi8(z15, z14, z13, z12, z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z0);
    
    165 165
     }
    
    166 166
     
    
    167
    -__m128i hs_remInt16X8(__m128i xx, __m128i yy)
    
    167
    +v128 hs_remInt16X8(v128 xx, v128 yy)
    
    168 168
     {
    
    169 169
       int16_t x[8], y[8];
    
    170 170
       memcpy(x, &xx, 16);
    
    ... ... @@ -177,10 +177,10 @@ __m128i hs_remInt16X8(__m128i xx, __m128i yy)
    177 177
       int16_t z5 = x[5] % y[5];
    
    178 178
       int16_t z6 = x[6] % y[6];
    
    179 179
       int16_t z7 = x[7] % y[7];
    
    180
    -  return _mm_set_epi16(z7, z6, z5, z4, z3, z2, z1, z0);
    
    180
    +  return (v128) _mm_set_epi16(z7, z6, z5, z4, z3, z2, z1, z0);
    
    181 181
     }
    
    182 182
     
    
    183
    -__m128i hs_remInt32X4(__m128i xx, __m128i yy)
    
    183
    +v128 hs_remInt32X4(v128 xx, v128 yy)
    
    184 184
     {
    
    185 185
       int32_t x[4], y[4];
    
    186 186
       memcpy(x, &xx, 16);
    
    ... ... @@ -189,20 +189,20 @@ __m128i hs_remInt32X4(__m128i xx, __m128i yy)
    189 189
       int32_t z1 = x[1] % y[1];
    
    190 190
       int32_t z2 = x[2] % y[2];
    
    191 191
       int32_t z3 = x[3] % y[3];
    
    192
    -  return _mm_set_epi32(z3, z2, z1, z0);
    
    192
    +  return (v128) _mm_set_epi32(z3, z2, z1, z0);
    
    193 193
     }
    
    194 194
     
    
    195
    -__m128i hs_remInt64X2(__m128i xx, __m128i yy)
    
    195
    +v128 hs_remInt64X2(v128 xx, v128 yy)
    
    196 196
     {
    
    197 197
       int64_t x[2], y[2];
    
    198 198
       memcpy(x, &xx, 16);
    
    199 199
       memcpy(y, &yy, 16);
    
    200 200
       int64_t z0 = x[0] % y[0];
    
    201 201
       int64_t z1 = x[1] % y[1];
    
    202
    -  return _mm_set_epi64x(z1, z0);
    
    202
    +  return (v128) _mm_set_epi64x(z1, z0);
    
    203 203
     }
    
    204 204
     
    
    205
    -__m128i hs_remWord8X16(__m128i xx, __m128i yy)
    
    205
    +v128 hs_remWord8X16(v128 xx, v128 yy)
    
    206 206
     {
    
    207 207
       uint8_t x[16], y[16];
    
    208 208
       memcpy(x, &xx, 16);
    
    ... ... @@ -223,10 +223,10 @@ __m128i hs_remWord8X16(__m128i xx, __m128i yy)
    223 223
       uint8_t z13 = x[13] % y[13];
    
    224 224
       uint8_t z14 = x[14] % y[14];
    
    225 225
       uint8_t z15 = x[15] % y[15];
    
    226
    -  return _mm_set_epi8(z15, z14, z13, z12, z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z0);
    
    226
    +  return (v128) _mm_set_epi8(z15, z14, z13, z12, z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z0);
    
    227 227
     }
    
    228 228
     
    
    229
    -__m128i hs_remWord16X8(__m128i xx, __m128i yy)
    
    229
    +v128 hs_remWord16X8(v128 xx, v128 yy)
    
    230 230
     {
    
    231 231
       uint16_t x[8], y[8];
    
    232 232
       memcpy(x, &xx, 16);
    
    ... ... @@ -239,10 +239,10 @@ __m128i hs_remWord16X8(__m128i xx, __m128i yy)
    239 239
       uint16_t z5 = x[5] % y[5];
    
    240 240
       uint16_t z6 = x[6] % y[6];
    
    241 241
       uint16_t z7 = x[7] % y[7];
    
    242
    -  return _mm_set_epi16(z7, z6, z5, z4, z3, z2, z1, z0);
    
    242
    +  return (v128) _mm_set_epi16(z7, z6, z5, z4, z3, z2, z1, z0);
    
    243 243
     }
    
    244 244
     
    
    245
    -__m128i hs_remWord32X4(__m128i xx, __m128i yy)
    
    245
    +v128 hs_remWord32X4(v128 xx, v128 yy)
    
    246 246
     {
    
    247 247
       uint32_t x[4], y[4];
    
    248 248
       memcpy(x, &xx, 16);
    
    ... ... @@ -251,17 +251,17 @@ __m128i hs_remWord32X4(__m128i xx, __m128i yy)
    251 251
       uint32_t z1 = x[1] % y[1];
    
    252 252
       uint32_t z2 = x[2] % y[2];
    
    253 253
       uint32_t z3 = x[3] % y[3];
    
    254
    -  return _mm_set_epi32(z3, z2, z1, z0);
    
    254
    +  return (v128) _mm_set_epi32(z3, z2, z1, z0);
    
    255 255
     }
    
    256 256
     
    
    257
    -__m128i hs_remWord64X2(__m128i xx, __m128i yy)
    
    257
    +v128 hs_remWord64X2(v128 xx, v128 yy)
    
    258 258
     {
    
    259 259
       uint64_t x[2], y[2];
    
    260 260
       memcpy(x, &xx, 16);
    
    261 261
       memcpy(y, &yy, 16);
    
    262 262
       uint64_t z0 = x[0] % y[0];
    
    263 263
       uint64_t z1 = x[1] % y[1];
    
    264
    -  return _mm_set_epi64x(z1, z0);
    
    264
    +  return (v128) _mm_set_epi64x(z1, z0);
    
    265 265
     }
    
    266 266
     
    
    267 267
     #endif