@@ -159,13 +159,13 @@ static mlir::Value emitX86SExtMask(CIRGenFunction &cgf, mlir::Value op,
159159}
160160
161161// Helper function to convert builtin names to LLVM intrinsic names
162- std::string CIRGenFunction::convertBuiltinToIntrinsicName (llvm::StringRef builtinName) {
162+ std::string
163+ CIRGenFunction::convertBuiltinToIntrinsicName (llvm::StringRef builtinName) {
163164 // Remove "__builtin_ia32_" prefix
164- llvm::StringRef baseName = builtinName. drop_front ( 15 ); // "__builtin_ia32_".size() == 15
165-
165+ llvm::StringRef baseName =
166+ builtinName. drop_front ( 15 ); // "__builtin_ia32_".size() == 15
166167 // Simple mapping for common patterns
167- // This can be extended as needed
168- static llvm::StringMap<std::string> intrinsicMap = {
168+ llvm::StringMap<std::string> intrinsicMap = {
169169 // Load/Store operations
170170 {" loadups" , " llvm.x86.sse.loadu.ps" },
171171 {" loaddqu" , " llvm.x86.sse2.loadu.dq" },
@@ -234,7 +234,8 @@ std::string CIRGenFunction::convertBuiltinToIntrinsicName(llvm::StringRef builti
234234 // Advanced math operations (using correct LLVM intrinsic names)
235235 {" sqrtps512" , " llvm.x86.avx512.sqrt.ps.512" },
236236 {" sqrtpd512" , " llvm.x86.avx512.sqrt.pd.512" },
237- // Note: SSE sqrt doesn't have LLVM intrinsics - they become regular sqrt calls
237+ // Note: SSE sqrt doesn't have LLVM intrinsics - they become regular sqrt
238+ // calls
238239 {" rcpps" , " llvm.x86.sse.rcp.ps" },
239240 {" rsqrtps" , " llvm.x86.sse.rsqrt.ps" },
240241 {" minpd" , " llvm.x86.sse2.min.pd" },
@@ -248,6 +249,9 @@ std::string CIRGenFunction::convertBuiltinToIntrinsicName(llvm::StringRef builti
248249 {" cmpeqps" , " llvm.x86.sse.cmp.ps" },
249250 {" cmpltps" , " llvm.x86.sse.cmp.ps" },
250251 {" cmpleps" , " llvm.x86.sse.cmp.ps" },
252+ {" cmpunordps" , " llvm.x86.sse.cmp.ps" },
253+ {" cmpunordpd" , " llvm.x86.sse2.cmp.pd" },
254+ {" cmpltss" , " llvm.x86.sse.cmp.ss" },
251255
252256 // Bit manipulation
253257 {" pand128" , " llvm.x86.sse2.pand" },
@@ -291,16 +295,16 @@ std::string CIRGenFunction::convertBuiltinToIntrinsicName(llvm::StringRef builti
291295 return it->second ;
292296 }
293297
294- // Fallback: For intrinsics without LLVM equivalents, create a function call
295- // This allows the backend to handle it as a regular function call
296- return ( " __ " + baseName). str (); // e.g., "__sqrtps" becomes a function call
298+ // Fallback: Return empty string for intrinsics without LLVM equivalents
299+ // This will cause the fallback mechanism to return nullptr
300+ return " " ;
297301}
298302
299303// Generic fallback for unsupported X86 intrinsics
300304// This creates a function call with the intrinsic name preserved as a string
301- mlir::Value CIRGenFunction::emitX86IntrinsicFallback ( unsigned BuiltinID,
302- const CallExpr *E,
303- llvm::ArrayRef<mlir::Value> Ops) {
305+ mlir::Value
306+ CIRGenFunction::emitX86IntrinsicFallback ( unsigned BuiltinID, const CallExpr *E,
307+ llvm::ArrayRef<mlir::Value> Ops) {
304308 // Get the builtin name from the BuiltinID
305309 std::string builtinName = getContext ().BuiltinInfo .getName (BuiltinID);
306310
@@ -314,6 +318,11 @@ mlir::Value CIRGenFunction::emitX86IntrinsicFallback(unsigned BuiltinID,
314318 // "__builtin_ia32_addps" -> "llvm.x86.sse.add.ps"
315319 std::string intrinsicName = convertBuiltinToIntrinsicName (nameRef);
316320
321+ // If no valid intrinsic mapping found, return nullptr
322+ if (intrinsicName.empty ()) {
323+ return nullptr ;
324+ }
325+
317326 // Get the return type
318327 mlir::Type returnType = convertType (E->getType ());
319328
@@ -328,7 +337,6 @@ mlir::Value CIRGenFunction::emitX86IntrinsicFallback(unsigned BuiltinID,
328337 return intrinsicCall.getResult ();
329338}
330339
331-
332340static mlir::Value emitX86PSLLDQIByteShift (CIRGenFunction &cgf,
333341 const CallExpr *E,
334342 ArrayRef<mlir::Value> Ops) {
@@ -1339,6 +1347,10 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
13391347 case X86::BI__builtin_ia32_shufps:
13401348 case X86::BI__builtin_ia32_shufps256:
13411349 case X86::BI__builtin_ia32_shufps512:
1350+ // Try generic fallback for unknown X86 intrinsics
1351+ if (auto fallbackResult = emitX86IntrinsicFallback (BuiltinID, E, Ops)) {
1352+ return fallbackResult;
1353+ }
13421354 llvm_unreachable (" shufpd NYI" );
13431355 case X86::BI__builtin_ia32_permdi256:
13441356 case X86::BI__builtin_ia32_permdf256:
@@ -1382,23 +1394,20 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
13821394 case X86::BI__builtin_ia32_kshiftlihi:
13831395 case X86::BI__builtin_ia32_kshiftlisi:
13841396 case X86::BI__builtin_ia32_kshiftlidi:
1385- // llvm_unreachable("kshiftl NYI");
13861397 // Try generic fallback for unknown X86 intrinsics
13871398 if (auto fallbackResult = emitX86IntrinsicFallback (BuiltinID, E, Ops)) {
13881399 return fallbackResult;
13891400 }
1390- return nullptr ;
1401+ llvm_unreachable ( " kshiftl NYI " ) ;
13911402 case X86::BI__builtin_ia32_kshiftriqi:
13921403 case X86::BI__builtin_ia32_kshiftrihi:
13931404 case X86::BI__builtin_ia32_kshiftrisi:
13941405 case X86::BI__builtin_ia32_kshiftridi:
1395- // llvm_unreachable("kshiftr NYI");
13961406 // Try generic fallback for unknown X86 intrinsics
13971407 if (auto fallbackResult = emitX86IntrinsicFallback (BuiltinID, E, Ops)) {
13981408 return fallbackResult;
13991409 }
1400- return nullptr ;
1401-
1410+ llvm_unreachable (" kshiftr NYI" );
14021411 // Rotate is a special case of funnel shift - 1st 2 args are the same.
14031412 case X86::BI__builtin_ia32_vprotb:
14041413 case X86::BI__builtin_ia32_vprotw:
@@ -1741,6 +1750,10 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
17411750 llvm_unreachable (" cmpleps NYI" );
17421751 case X86::BI__builtin_ia32_cmpunordps:
17431752 case X86::BI__builtin_ia32_cmpunordpd:
1753+ // Try generic fallback for unknown X86 intrinsics
1754+ if (auto fallbackResult = emitX86IntrinsicFallback (BuiltinID, E, Ops)) {
1755+ return fallbackResult;
1756+ }
17441757 llvm_unreachable (" cmpunordps NYI" );
17451758 case X86::BI__builtin_ia32_cmpneqps:
17461759 case X86::BI__builtin_ia32_cmpneqpd:
@@ -1776,6 +1789,10 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
17761789 case X86::BI__builtin_ia32_cmpeqss:
17771790 llvm_unreachable (" cmpeqss NYI" );
17781791 case X86::BI__builtin_ia32_cmpltss:
1792+ // Try generic fallback for unknown X86 intrinsics
1793+ if (auto fallbackResult = emitX86IntrinsicFallback (BuiltinID, E, Ops)) {
1794+ return fallbackResult;
1795+ }
17791796 llvm_unreachable (" cmpltss NYI" );
17801797 case X86::BI__builtin_ia32_cmpless:
17811798 llvm_unreachable (" cmpless NYI" );
0 commit comments