@@ -3104,8 +3104,10 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3104
3104
};
3105
3105
3106
3106
static const CostKindTblEntry AVX512BWCostTbl[] = {
3107
- { ISD::SETCC, MVT::v32i16, { 1 } },
3108
- { ISD::SETCC, MVT::v64i8, { 1 } },
3107
+ { ISD::SETCC, MVT::v32i16, { 1 , 1 , 1 , 1 } },
3108
+ { ISD::SETCC, MVT::v16i16, { 1 , 1 , 1 , 1 } },
3109
+ { ISD::SETCC, MVT::v64i8, { 1 , 1 , 1 , 1 } },
3110
+ { ISD::SETCC, MVT::v32i8, { 1 , 1 , 1 , 1 } },
3109
3111
3110
3112
{ ISD::SELECT, MVT::v32i16, { 1 , 1 , 1 , 1 } },
3111
3113
{ ISD::SELECT, MVT::v64i8, { 1 , 1 , 1 , 1 } },
@@ -3117,8 +3119,13 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3117
3119
{ ISD::SETCC, MVT::v16f32, { 1 , 4 , 1 , 1 } },
3118
3120
{ ISD::SETCC, MVT::v8f32, { 1 , 4 , 1 , 1 } },
3119
3121
3120
- { ISD::SETCC, MVT::v8i64, { 1 } },
3121
- { ISD::SETCC, MVT::v16i32, { 1 } },
3122
+ { ISD::SETCC, MVT::v8i64, { 1 , 1 , 1 , 1 } },
3123
+ { ISD::SETCC, MVT::v4i64, { 1 , 1 , 1 , 1 } },
3124
+ { ISD::SETCC, MVT::v2i64, { 1 , 1 , 1 , 1 } },
3125
+ { ISD::SETCC, MVT::v16i32, { 1 , 1 , 1 , 1 } },
3126
+ { ISD::SETCC, MVT::v8i32, { 1 , 1 , 1 , 1 } },
3127
+ { ISD::SETCC, MVT::v32i16, { 3 , 7 , 5 , 5 } },
3128
+ { ISD::SETCC, MVT::v64i8, { 3 , 7 , 5 , 5 } },
3122
3129
3123
3130
{ ISD::SELECT, MVT::v8i64, { 1 , 1 , 1 , 1 } },
3124
3131
{ ISD::SELECT, MVT::v4i64, { 1 , 1 , 1 , 1 } },
@@ -3135,9 +3142,6 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3135
3142
{ ISD::SELECT, MVT::v4f32, { 1 , 1 , 1 , 1 } },
3136
3143
{ ISD::SELECT, MVT::f32 , { 1 , 1 , 1 , 1 } },
3137
3144
3138
- { ISD::SETCC, MVT::v32i16, { 2 } }, // FIXME: should probably be 4
3139
- { ISD::SETCC, MVT::v64i8, { 2 } }, // FIXME: should probably be 4
3140
-
3141
3145
{ ISD::SELECT, MVT::v32i16, { 2 , 2 , 4 , 4 } },
3142
3146
{ ISD::SELECT, MVT::v16i16, { 1 , 1 , 1 , 1 } },
3143
3147
{ ISD::SELECT, MVT::v8i16, { 1 , 1 , 1 , 1 } },
@@ -3154,10 +3158,10 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3154
3158
{ ISD::SETCC, MVT::v4f32, { 1 , 4 , 1 , 1 } },
3155
3159
{ ISD::SETCC, MVT::f32 , { 1 , 4 , 1 , 1 } },
3156
3160
3157
- { ISD::SETCC, MVT::v4i64, { 1 } },
3158
- { ISD::SETCC, MVT::v8i32, { 1 } },
3159
- { ISD::SETCC, MVT::v16i16, { 1 } },
3160
- { ISD::SETCC, MVT::v32i8, { 1 } },
3161
+ { ISD::SETCC, MVT::v4i64, { 1 , 1 , 1 , 2 } },
3162
+ { ISD::SETCC, MVT::v8i32, { 1 , 1 , 1 , 2 } },
3163
+ { ISD::SETCC, MVT::v16i16, { 1 , 1 , 1 , 2 } },
3164
+ { ISD::SETCC, MVT::v32i8, { 1 , 1 , 1 , 2 } },
3161
3165
3162
3166
{ ISD::SELECT, MVT::v4f64, { 2 , 2 , 1 , 2 } }, // vblendvpd
3163
3167
{ ISD::SELECT, MVT::v8f32, { 2 , 2 , 1 , 2 } }, // vblendvps
@@ -3167,6 +3171,11 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3167
3171
{ ISD::SELECT, MVT::v32i8, { 2 , 2 , 1 , 2 } }, // pblendvb
3168
3172
};
3169
3173
3174
+ static const CostKindTblEntry XOPCostTbl[] = {
3175
+ { ISD::SETCC, MVT::v4i64, { 4 , 2 , 5 , 6 } },
3176
+ { ISD::SETCC, MVT::v2i64, { 1 , 1 , 1 , 1 } },
3177
+ };
3178
+
3170
3179
static const CostKindTblEntry AVX1CostTbl[] = {
3171
3180
{ ISD::SETCC, MVT::v4f64, { 2 , 3 , 1 , 2 } },
3172
3181
{ ISD::SETCC, MVT::v2f64, { 1 , 3 , 1 , 1 } },
@@ -3176,10 +3185,10 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3176
3185
{ ISD::SETCC, MVT::f32 , { 1 , 3 , 1 , 1 } },
3177
3186
3178
3187
// AVX1 does not support 8-wide integer compare.
3179
- { ISD::SETCC, MVT::v4i64, { 4 } },
3180
- { ISD::SETCC, MVT::v8i32, { 4 } },
3181
- { ISD::SETCC, MVT::v16i16, { 4 } },
3182
- { ISD::SETCC, MVT::v32i8, { 4 } },
3188
+ { ISD::SETCC, MVT::v4i64, { 4 , 2 , 5 , 6 } },
3189
+ { ISD::SETCC, MVT::v8i32, { 4 , 2 , 5 , 6 } },
3190
+ { ISD::SETCC, MVT::v16i16, { 4 , 2 , 5 , 6 } },
3191
+ { ISD::SETCC, MVT::v32i8, { 4 , 2 , 5 , 6 } },
3183
3192
3184
3193
{ ISD::SELECT, MVT::v4f64, { 3 , 3 , 1 , 2 } }, // vblendvpd
3185
3194
{ ISD::SELECT, MVT::v8f32, { 3 , 3 , 1 , 2 } }, // vblendvps
@@ -3190,7 +3199,7 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3190
3199
};
3191
3200
3192
3201
static const CostKindTblEntry SSE42CostTbl[] = {
3193
- { ISD::SETCC, MVT::v2i64, { 1 } },
3202
+ { ISD::SETCC, MVT::v2i64, { 1 , 2 , 1 , 2 } },
3194
3203
};
3195
3204
3196
3205
static const CostKindTblEntry SSE41CostTbl[] = {
@@ -3211,10 +3220,10 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3211
3220
{ ISD::SETCC, MVT::v2f64, { 2 , 5 , 1 , 1 } },
3212
3221
{ ISD::SETCC, MVT::f64 , { 1 , 5 , 1 , 1 } },
3213
3222
3214
- { ISD::SETCC, MVT::v2i64, { 5 } }, // pcmpeqd/pcmpgtd expansion
3215
- { ISD::SETCC, MVT::v4i32, { 1 } },
3216
- { ISD::SETCC, MVT::v8i16, { 1 } },
3217
- { ISD::SETCC, MVT::v16i8, { 1 } },
3223
+ { ISD::SETCC, MVT::v2i64, { 5 , 4 , 5 , 5 } }, // pcmpeqd/pcmpgtd expansion
3224
+ { ISD::SETCC, MVT::v4i32, { 1 , 1 , 1 , 1 } },
3225
+ { ISD::SETCC, MVT::v8i16, { 1 , 1 , 1 , 1 } },
3226
+ { ISD::SETCC, MVT::v16i8, { 1 , 1 , 1 , 1 } },
3218
3227
3219
3228
{ ISD::SELECT, MVT::v2f64, { 2 , 2 , 3 , 3 } }, // andpd + andnpd + orpd
3220
3229
{ ISD::SELECT, MVT::f64 , { 2 , 2 , 3 , 3 } }, // andpd + andnpd + orpd
@@ -3252,6 +3261,11 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
3252
3261
if (auto KindCost = Entry->Cost [CostKind])
3253
3262
return LT.first * (ExtraCost + KindCost.value ());
3254
3263
3264
+ if (ST->hasXOP ())
3265
+ if (const auto *Entry = CostTableLookup (XOPCostTbl, ISD, MTy))
3266
+ if (auto KindCost = Entry->Cost [CostKind])
3267
+ return LT.first * (ExtraCost + KindCost.value ());
3268
+
3255
3269
if (ST->hasAVX ())
3256
3270
if (const auto *Entry = CostTableLookup (AVX1CostTbl, ISD, MTy))
3257
3271
if (auto KindCost = Entry->Cost [CostKind])
0 commit comments