mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-14 14:24:05 +00:00
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:
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user