mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
More replacing of target-dependent intrinsics with target-indepdent
intrinsics. The second instruction(s) to be handled are the vector versions of count set bits (ctpop). The changes here are to clang so that it generates a target independent vector ctpop when it sees an ARM dependent vector bits set count. The changes in llvm are to match the target independent vector ctpop and in VMCore/AutoUpgrade.cpp to update any existing bc files containing ARM dependent vector pop counts with target-independent ctpops. There are also changes to an existing test case in llvm for ARM vector count instructions and to a test for the bitcode upgrade. <rdar://problem/11892519> There is deliberately no test for the change to clang, as so far as I know, no consensus has been reached regarding how to test neon instructions in clang; q.v. <rdar://problem/8762292> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160410 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -66,6 +66,11 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
|
||||
"llvm.ctlz." + Name.substr(14), F->getParent());
|
||||
return true;
|
||||
}
|
||||
if (Name.startswith("arm.neon.vcnt")) {
|
||||
NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::ctpop,
|
||||
F->arg_begin()->getType());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'c': {
|
||||
@@ -314,11 +319,16 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
|
||||
case Intrinsic::arm_neon_vclz: {
|
||||
// Change name from llvm.arm.neon.vclz.* to llvm.ctlz.*
|
||||
CI->replaceAllUsesWith(Builder.CreateCall2(NewFn, CI->getArgOperand(0),
|
||||
Builder.getFalse(),
|
||||
Builder.getFalse(),
|
||||
"llvm.ctlz." + Name.substr(14)));
|
||||
CI->eraseFromParent();
|
||||
return;
|
||||
}
|
||||
case Intrinsic::ctpop: {
|
||||
CI->replaceAllUsesWith(Builder.CreateCall(NewFn, CI->getArgOperand(0)));
|
||||
CI->eraseFromParent();
|
||||
return;
|
||||
}
|
||||
|
||||
case Intrinsic::x86_xop_vfrcz_ss:
|
||||
case Intrinsic::x86_xop_vfrcz_sd:
|
||||
|
Reference in New Issue
Block a user