Handle builtins that directly correspond to GCC builtins.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26737 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2006-03-13 23:09:05 +00:00
parent 022f64fbbc
commit 872421553e
2 changed files with 50 additions and 4 deletions

View File

@ -1602,6 +1602,15 @@ void CWriter::lowerIntrinsics(Function &F) {
// We directly implement these intrinsics // We directly implement these intrinsics
break; break;
default: default:
// If this is an intrinsic that directly corresponds to a GCC
// builtin, we handle it.
const char *BuiltinName = "";
#define GET_GCC_BUILTIN_NAME
#include "llvm/Intrinsics.gen"
#undef GET_GCC_BUILTIN_NAME
// If we handle it, don't lower it.
if (BuiltinName[0]) break;
// All other intrinsic calls we must lower. // All other intrinsic calls we must lower.
Instruction *Before = 0; Instruction *Before = 0;
if (CI != &BB->front()) if (CI != &BB->front())
@ -1613,17 +1622,32 @@ void CWriter::lowerIntrinsics(Function &F) {
} else { } else {
I = BB->begin(); I = BB->begin();
} }
break;
} }
} }
void CWriter::visitCallInst(CallInst &I) { void CWriter::visitCallInst(CallInst &I) {
bool WroteCallee = false;
// Handle intrinsic function calls first... // Handle intrinsic function calls first...
if (Function *F = I.getCalledFunction()) if (Function *F = I.getCalledFunction())
if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID()) { if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID()) {
switch (ID) { switch (ID) {
default: assert(0 && "Unknown LLVM intrinsic!"); default: {
// If this is an intrinsic that directly corresponds to a GCC
// builtin, we emit it here.
const char *BuiltinName = "";
#define GET_GCC_BUILTIN_NAME
#include "llvm/Intrinsics.gen"
#undef GET_GCC_BUILTIN_NAME
assert(BuiltinName[0] && "Unknown LLVM intrinsic!");
Out << BuiltinName;
WroteCallee = true;
break;
}
case Intrinsic::vastart: case Intrinsic::vastart:
Out << "0; "; Out << "0; ";
@ -1720,7 +1744,6 @@ void CWriter::visitCallInst(CallInst &I) {
// in the common case, we handle casts where the number of arguments passed // in the common case, we handle casts where the number of arguments passed
// match exactly. // match exactly.
// //
bool WroteCallee = false;
if (I.isTailCall()) Out << " /*tail*/ "; if (I.isTailCall()) Out << " /*tail*/ ";
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Callee)) if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Callee))
if (CE->getOpcode() == Instruction::Cast) if (CE->getOpcode() == Instruction::Cast)

View File

@ -1602,6 +1602,15 @@ void CWriter::lowerIntrinsics(Function &F) {
// We directly implement these intrinsics // We directly implement these intrinsics
break; break;
default: default:
// If this is an intrinsic that directly corresponds to a GCC
// builtin, we handle it.
const char *BuiltinName = "";
#define GET_GCC_BUILTIN_NAME
#include "llvm/Intrinsics.gen"
#undef GET_GCC_BUILTIN_NAME
// If we handle it, don't lower it.
if (BuiltinName[0]) break;
// All other intrinsic calls we must lower. // All other intrinsic calls we must lower.
Instruction *Before = 0; Instruction *Before = 0;
if (CI != &BB->front()) if (CI != &BB->front())
@ -1613,17 +1622,32 @@ void CWriter::lowerIntrinsics(Function &F) {
} else { } else {
I = BB->begin(); I = BB->begin();
} }
break;
} }
} }
void CWriter::visitCallInst(CallInst &I) { void CWriter::visitCallInst(CallInst &I) {
bool WroteCallee = false;
// Handle intrinsic function calls first... // Handle intrinsic function calls first...
if (Function *F = I.getCalledFunction()) if (Function *F = I.getCalledFunction())
if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID()) { if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID()) {
switch (ID) { switch (ID) {
default: assert(0 && "Unknown LLVM intrinsic!"); default: {
// If this is an intrinsic that directly corresponds to a GCC
// builtin, we emit it here.
const char *BuiltinName = "";
#define GET_GCC_BUILTIN_NAME
#include "llvm/Intrinsics.gen"
#undef GET_GCC_BUILTIN_NAME
assert(BuiltinName[0] && "Unknown LLVM intrinsic!");
Out << BuiltinName;
WroteCallee = true;
break;
}
case Intrinsic::vastart: case Intrinsic::vastart:
Out << "0; "; Out << "0; ";
@ -1720,7 +1744,6 @@ void CWriter::visitCallInst(CallInst &I) {
// in the common case, we handle casts where the number of arguments passed // in the common case, we handle casts where the number of arguments passed
// match exactly. // match exactly.
// //
bool WroteCallee = false;
if (I.isTailCall()) Out << " /*tail*/ "; if (I.isTailCall()) Out << " /*tail*/ ";
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Callee)) if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Callee))
if (CE->getOpcode() == Instruction::Cast) if (CE->getOpcode() == Instruction::Cast)