@@ -2067,33 +2067,12 @@ void addIntelFPGADecorationsForStructMember(SPIRVEntry *E,
2067
2067
bool LLVMToSPIRV::isKnownIntrinsic (Intrinsic::ID Id) {
2068
2068
// Known intrinsics usually do not need translation of their declaration
2069
2069
switch (Id) {
2070
- case Intrinsic::abs :
2071
2070
case Intrinsic::assume:
2072
2071
case Intrinsic::bitreverse:
2073
- case Intrinsic::ceil :
2074
- case Intrinsic::copysign :
2075
- case Intrinsic::cos :
2076
- case Intrinsic::exp :
2077
- case Intrinsic::exp2 :
2078
- case Intrinsic::fabs :
2079
- case Intrinsic::floor :
2080
- case Intrinsic::fma :
2081
- case Intrinsic::log :
2082
- case Intrinsic::log10 :
2083
- case Intrinsic::log2 :
2084
- case Intrinsic::maximum:
2085
- case Intrinsic::maxnum:
2086
- case Intrinsic::minimum:
2087
- case Intrinsic::minnum:
2088
- case Intrinsic::nearbyint :
2089
- case Intrinsic::pow :
2090
- case Intrinsic::powi:
2091
- case Intrinsic::rint :
2092
- case Intrinsic::round :
2093
- case Intrinsic::roundeven:
2094
- case Intrinsic::sin :
2095
2072
case Intrinsic::sqrt :
2096
- case Intrinsic::trunc :
2073
+ case Intrinsic::fabs :
2074
+ case Intrinsic::abs :
2075
+ case Intrinsic::ceil :
2097
2076
case Intrinsic::ctpop:
2098
2077
case Intrinsic::ctlz:
2099
2078
case Intrinsic::cttz:
@@ -2116,6 +2095,7 @@ bool LLVMToSPIRV::isKnownIntrinsic(Intrinsic::ID Id) {
2116
2095
case Intrinsic::fmuladd:
2117
2096
case Intrinsic::memset :
2118
2097
case Intrinsic::memcpy :
2098
+ case Intrinsic::nearbyint :
2119
2099
case Intrinsic::lifetime_start:
2120
2100
case Intrinsic::lifetime_end:
2121
2101
case Intrinsic::dbg_declare:
@@ -2152,69 +2132,6 @@ LLVMToSPIRV::applyRoundingModeConstraint(Value *V, SPIRVInstruction *I) {
2152
2132
return I;
2153
2133
}
2154
2134
2155
- static SPIRVWord getBuiltinIdForIntrinsic (Intrinsic::ID IID) {
2156
- switch (IID) {
2157
- // Note: In some cases the semantics of the OpenCL builtin are not identical
2158
- // to the semantics of the corresponding LLVM IR intrinsic. The LLVM
2159
- // intrinsics handled here assume the default floating point environment
2160
- // (no unmasked exceptions, round-to-nearest-ties-even rounding mode)
2161
- // and assume that the operations have no side effects (FP status flags
2162
- // aren't maintained), so the OpenCL builtin behavior should be
2163
- // acceptable.
2164
- case Intrinsic::ceil :
2165
- return OpenCLLIB::Ceil;
2166
- case Intrinsic::copysign :
2167
- return OpenCLLIB::Copysign;
2168
- case Intrinsic::cos :
2169
- return OpenCLLIB::Cos;
2170
- case Intrinsic::exp :
2171
- return OpenCLLIB::Exp;
2172
- case Intrinsic::exp2 :
2173
- return OpenCLLIB::Exp2;
2174
- case Intrinsic::fabs :
2175
- return OpenCLLIB::Fabs;
2176
- case Intrinsic::floor :
2177
- return OpenCLLIB::Floor;
2178
- case Intrinsic::fma :
2179
- return OpenCLLIB::Fma;
2180
- case Intrinsic::log :
2181
- return OpenCLLIB::Log;
2182
- case Intrinsic::log10 :
2183
- return OpenCLLIB::Log10;
2184
- case Intrinsic::log2 :
2185
- return OpenCLLIB::Log2;
2186
- case Intrinsic::maximum:
2187
- return OpenCLLIB::Fmax;
2188
- case Intrinsic::maxnum:
2189
- return OpenCLLIB::Fmax;
2190
- case Intrinsic::minimum:
2191
- return OpenCLLIB::Fmin;
2192
- case Intrinsic::minnum:
2193
- return OpenCLLIB::Fmin;
2194
- case Intrinsic::nearbyint :
2195
- return OpenCLLIB::Rint;
2196
- case Intrinsic::pow :
2197
- return OpenCLLIB::Pow;
2198
- case Intrinsic::powi:
2199
- return OpenCLLIB::Pown;
2200
- case Intrinsic::rint :
2201
- return OpenCLLIB::Rint;
2202
- case Intrinsic::round :
2203
- return OpenCLLIB::Round;
2204
- case Intrinsic::roundeven:
2205
- return OpenCLLIB::Rint;
2206
- case Intrinsic::sin :
2207
- return OpenCLLIB::Sin;
2208
- case Intrinsic::sqrt :
2209
- return OpenCLLIB::Sqrt;
2210
- case Intrinsic::trunc :
2211
- return OpenCLLIB::Trunc;
2212
- default :
2213
- assert (false && " Builtin ID requested for Unhandled intrinsic!" );
2214
- return 0 ;
2215
- }
2216
- }
2217
-
2218
2135
SPIRVValue *LLVMToSPIRV::transIntrinsicInst (IntrinsicInst *II,
2219
2136
SPIRVBasicBlock *BB) {
2220
2137
auto GetMemoryAccess = [](MemIntrinsic *MI) -> std::vector<SPIRVWord> {
@@ -2257,65 +2174,35 @@ SPIRVValue *LLVMToSPIRV::transIntrinsicInst(IntrinsicInst *II,
2257
2174
SPIRVValue *Op = transValue (II->getArgOperand (0 ), BB);
2258
2175
return BM->addUnaryInst (OpBitReverse, Ty, Op, BB);
2259
2176
}
2260
- // Unary FP intrinsic
2261
- case Intrinsic::ceil :
2262
- case Intrinsic::cos :
2263
- case Intrinsic::exp :
2264
- case Intrinsic::exp2 :
2265
- case Intrinsic::fabs :
2266
- case Intrinsic::floor :
2267
- case Intrinsic::log :
2268
- case Intrinsic::log10 :
2269
- case Intrinsic::log2 :
2270
- case Intrinsic::nearbyint :
2271
- case Intrinsic::rint :
2272
- case Intrinsic::round :
2273
- case Intrinsic::roundeven:
2274
- case Intrinsic::sin :
2275
- case Intrinsic::sqrt :
2276
- case Intrinsic::trunc : {
2277
- if (!checkTypeForSPIRVExtendedInstLowering (II, BM))
2278
- break ;
2279
- SPIRVWord ExtOp = getBuiltinIdForIntrinsic (II->getIntrinsicID ());
2280
- SPIRVType *STy = transType (II->getType ());
2281
- std::vector<SPIRVValue *> Ops (1 , transValue (II->getArgOperand (0 ), BB));
2282
- return BM->addExtInst (STy, BM->getExtInstSetId (SPIRVEIS_OpenCL), ExtOp, Ops,
2283
- BB);
2177
+ case Intrinsic::sqrt : {
2178
+ return BM->addExtInst (transType (II->getType ()),
2179
+ BM->getExtInstSetId (SPIRVEIS_OpenCL), OpenCLLIB::Sqrt,
2180
+ {transValue (II->getOperand (0 ), BB)}, BB);
2284
2181
}
2285
- // Binary FP intrinsics
2286
- case Intrinsic::copysign :
2287
- case Intrinsic::pow :
2288
- case Intrinsic::powi:
2289
- case Intrinsic::maximum:
2290
- case Intrinsic::maxnum:
2291
- case Intrinsic::minimum:
2292
- case Intrinsic::minnum: {
2182
+ case Intrinsic::fabs : {
2293
2183
if (!checkTypeForSPIRVExtendedInstLowering (II, BM))
2294
2184
break ;
2295
- SPIRVWord ExtOp = getBuiltinIdForIntrinsic (II-> getIntrinsicID ()) ;
2185
+ SPIRVWord ExtOp = OpenCLLIB::Fabs ;
2296
2186
SPIRVType *STy = transType (II->getType ());
2297
- std::vector<SPIRVValue *> Ops{transValue (II->getArgOperand (0 ), BB),
2298
- transValue (II->getArgOperand (1 ), BB)};
2187
+ std::vector<SPIRVValue *> Ops (1 , transValue (II->getArgOperand (0 ), BB));
2299
2188
return BM->addExtInst (STy, BM->getExtInstSetId (SPIRVEIS_OpenCL), ExtOp, Ops,
2300
2189
BB);
2301
2190
}
2302
- case Intrinsic::fma : {
2191
+ case Intrinsic::abs : {
2303
2192
if (!checkTypeForSPIRVExtendedInstLowering (II, BM))
2304
2193
break ;
2305
- SPIRVWord ExtOp = OpenCLLIB::Fma;
2194
+ // LLVM has only one version of abs and it is only for signed integers. We
2195
+ // unconditionally choose SAbs here
2196
+ SPIRVWord ExtOp = OpenCLLIB::SAbs;
2306
2197
SPIRVType *STy = transType (II->getType ());
2307
- std::vector<SPIRVValue *> Ops{transValue (II->getArgOperand (0 ), BB),
2308
- transValue (II->getArgOperand (1 ), BB),
2309
- transValue (II->getArgOperand (2 ), BB)};
2198
+ std::vector<SPIRVValue *> Ops (1 , transValue (II->getArgOperand (0 ), BB));
2310
2199
return BM->addExtInst (STy, BM->getExtInstSetId (SPIRVEIS_OpenCL), ExtOp, Ops,
2311
2200
BB);
2312
2201
}
2313
- case Intrinsic::abs : {
2202
+ case Intrinsic::ceil : {
2314
2203
if (!checkTypeForSPIRVExtendedInstLowering (II, BM))
2315
2204
break ;
2316
- // LLVM has only one version of abs and it is only for signed integers. We
2317
- // unconditionally choose SAbs here
2318
- SPIRVWord ExtOp = OpenCLLIB::SAbs;
2205
+ SPIRVWord ExtOp = OpenCLLIB::Ceil;
2319
2206
SPIRVType *STy = transType (II->getType ());
2320
2207
std::vector<SPIRVValue *> Ops (1 , transValue (II->getArgOperand (0 ), BB));
2321
2208
return BM->addExtInst (STy, BM->getExtInstSetId (SPIRVEIS_OpenCL), ExtOp, Ops,
@@ -2457,6 +2344,16 @@ SPIRVValue *LLVMToSPIRV::transIntrinsicInst(IntrinsicInst *II,
2457
2344
return BM->addBinaryInst (OpFAdd, Ty, Mul,
2458
2345
transValue (II->getArgOperand (2 ), BB), BB);
2459
2346
}
2347
+ case Intrinsic::maxnum: {
2348
+ if (!checkTypeForSPIRVExtendedInstLowering (II, BM))
2349
+ break ;
2350
+ SPIRVWord ExtOp = OpenCLLIB::Fmax;
2351
+ SPIRVType *STy = transType (II->getType ());
2352
+ std::vector<SPIRVValue *> Ops{transValue (II->getArgOperand (0 ), BB),
2353
+ transValue (II->getArgOperand (1 ), BB)};
2354
+ return BM->addExtInst (STy, BM->getExtInstSetId (SPIRVEIS_OpenCL), ExtOp, Ops,
2355
+ BB);
2356
+ }
2460
2357
case Intrinsic::usub_sat: {
2461
2358
// usub.sat(a, b) -> (a > b) ? a - b : 0
2462
2359
SPIRVType *Ty = transType (II->getType ());
@@ -2529,6 +2426,13 @@ SPIRVValue *LLVMToSPIRV::transIntrinsicInst(IntrinsicInst *II,
2529
2426
Size = 0 ;
2530
2427
return BM->addLifetimeInst (OC, transValue (II->getOperand (1 ), BB), Size , BB);
2531
2428
}
2429
+ case Intrinsic::nearbyint : {
2430
+ if (!checkTypeForSPIRVExtendedInstLowering (II, BM))
2431
+ break ;
2432
+ return BM->addExtInst (transType (II->getType ()),
2433
+ BM->getExtInstSetId (SPIRVEIS_OpenCL), OpenCLLIB::Rint,
2434
+ {transValue (II->getOperand (0 ), BB)}, BB);
2435
+ }
2532
2436
// We don't want to mix translation of regular code and debug info, because
2533
2437
// it creates a mess, therefore translation of debug intrinsics is
2534
2438
// postponed until LLVMToSPIRVDbgTran::finalizeDebug...() methods.
0 commit comments