forked from OSchip/llvm-project
Add support for VFP status & control operations for ARM.
llvm-svn: 110153
This commit is contained in:
parent
b69b182191
commit
f568b074db
|
@ -24,6 +24,12 @@ BUILTIN(__builtin_arm_qsub, "iii", "nc")
|
||||||
BUILTIN(__builtin_arm_ssat, "iiUi", "nc")
|
BUILTIN(__builtin_arm_ssat, "iiUi", "nc")
|
||||||
BUILTIN(__builtin_arm_usat, "UiUiUi", "nc")
|
BUILTIN(__builtin_arm_usat, "UiUiUi", "nc")
|
||||||
|
|
||||||
|
// VFP
|
||||||
|
BUILTIN(__builtin_arm_get_fpscr, "Ui", "nc")
|
||||||
|
BUILTIN(__builtin_arm_set_fpscr, "vUi", "nc")
|
||||||
|
BUILTIN(__builtin_arm_vcvtr_f, "ffi", "nc")
|
||||||
|
BUILTIN(__builtin_arm_vcvtr_d, "fdi", "nc")
|
||||||
|
|
||||||
// NEON
|
// NEON
|
||||||
#define GET_NEON_BUILTINS
|
#define GET_NEON_BUILTINS
|
||||||
#include "clang/Basic/arm_neon.inc"
|
#include "clang/Basic/arm_neon.inc"
|
||||||
|
|
|
@ -1061,9 +1061,6 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
||||||
a, b);
|
a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine the type of this overloaded NEON intrinsic.
|
|
||||||
assert(BuiltinID > ARM::BI__builtin_arm_usat);
|
|
||||||
|
|
||||||
llvm::SmallVector<Value*, 4> Ops;
|
llvm::SmallVector<Value*, 4> Ops;
|
||||||
for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++)
|
for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++)
|
||||||
Ops.push_back(EmitScalarExpr(E->getArg(i)));
|
Ops.push_back(EmitScalarExpr(E->getArg(i)));
|
||||||
|
@ -1073,6 +1070,25 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
||||||
if (!Arg->isIntegerConstantExpr(Result, getContext()))
|
if (!Arg->isIntegerConstantExpr(Result, getContext()))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f ||
|
||||||
|
BuiltinID == ARM::BI__builtin_arm_vcvtr_d) {
|
||||||
|
// Determine the overloaded type of this builtin.
|
||||||
|
const llvm::Type *Ty;
|
||||||
|
if (BuiltinID == ARM::BI__builtin_arm_vcvtr_f)
|
||||||
|
Ty = llvm::Type::getFloatTy(VMContext);
|
||||||
|
else
|
||||||
|
Ty = llvm::Type::getDoubleTy(VMContext);
|
||||||
|
|
||||||
|
// Determine whether this is an unsigned conversion or not.
|
||||||
|
bool usgn = Result.getZExtValue() == 1;
|
||||||
|
unsigned Int = usgn ? Intrinsic::arm_vcvtru : Intrinsic::arm_vcvtr;
|
||||||
|
|
||||||
|
// Call the appropriate intrinsic.
|
||||||
|
Function *F = CGM.getIntrinsic(Int, &Ty, 1);
|
||||||
|
return Builder.CreateCall(F, Ops.begin(), Ops.end(), "vcvtr");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine the type of this overloaded NEON intrinsic.
|
||||||
unsigned type = Result.getZExtValue();
|
unsigned type = Result.getZExtValue();
|
||||||
bool usgn = type & 0x08;
|
bool usgn = type & 0x08;
|
||||||
bool quad = type & 0x10;
|
bool quad = type & 0x10;
|
||||||
|
|
|
@ -300,6 +300,8 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
|
||||||
default: return false;
|
default: return false;
|
||||||
case ARM::BI__builtin_arm_ssat: i = 1; l = 1; u = 31; break;
|
case ARM::BI__builtin_arm_ssat: i = 1; l = 1; u = 31; break;
|
||||||
case ARM::BI__builtin_arm_usat: i = 1; u = 31; break;
|
case ARM::BI__builtin_arm_usat: i = 1; u = 31; break;
|
||||||
|
case ARM::BI__builtin_arm_vcvtr_f:
|
||||||
|
case ARM::BI__builtin_arm_vcvtr_d: i = 1; u = 1; break;
|
||||||
#define GET_NEON_IMMEDIATE_CHECK
|
#define GET_NEON_IMMEDIATE_CHECK
|
||||||
#include "clang/Basic/arm_neon.inc"
|
#include "clang/Basic/arm_neon.inc"
|
||||||
#undef GET_NEON_IMMEDIATE_CHECK
|
#undef GET_NEON_IMMEDIATE_CHECK
|
||||||
|
@ -316,6 +318,7 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
|
||||||
<< llvm::utostr(l) << llvm::utostr(u+l)
|
<< llvm::utostr(l) << llvm::utostr(u+l)
|
||||||
<< TheCall->getArg(i)->getSourceRange();
|
<< TheCall->getArg(i)->getSourceRange();
|
||||||
|
|
||||||
|
// FIXME: VFP Intrinsics should error if VFP not present.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue