Index: lib/Target/AArch64/AArch64ISelLowering.cpp =================================================================== --- lib/Target/AArch64/AArch64ISelLowering.cpp +++ lib/Target/AArch64/AArch64ISelLowering.cpp @@ -2716,9 +2716,19 @@ EVT PtrVT = getPointerTy(DAG.getDataLayout()); return DAG.getNode(AArch64ISD::THREAD_POINTER, dl, PtrVT); } - case Intrinsic::aarch64_neon_abs: - return DAG.getNode(ISD::ABS, dl, Op.getValueType(), - Op.getOperand(1)); + case Intrinsic::aarch64_neon_abs: { + EVT Ty = Op.getValueType(); + if (Ty == MVT::i64) { + SDValue Result = DAG.getNode(ISD::BITCAST, dl, MVT::v1i64, + Op.getOperand(1)); + Result = DAG.getNode(ISD::ABS, dl, MVT::v1i64, Result); + return DAG.getNode(ISD::BITCAST, dl, MVT::i64, Result); + } else if (Ty.isVector() && Ty.isInteger() && isTypeLegal(Ty)) { + return DAG.getNode(ISD::ABS, dl, Ty, Op.getOperand(1)); + } else { + report_fatal_error("Unexpected type for AArch64 NEON intrinic"); + } + } case Intrinsic::aarch64_neon_smax: return DAG.getNode(ISD::SMAX, dl, Op.getValueType(), Op.getOperand(1), Op.getOperand(2));