mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
[x86] Added _addcarry_ and _subborrow_ intrinsics
llvm-svn: 216164
This commit is contained in:
parent
350e87272b
commit
84f9d2664b
@ -2768,6 +2768,18 @@ let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
|
|||||||
def int_x86_addcarryx_u64: GCCBuiltin<"__builtin_ia32_addcarryx_u64">,
|
def int_x86_addcarryx_u64: GCCBuiltin<"__builtin_ia32_addcarryx_u64">,
|
||||||
Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i64_ty, llvm_i64_ty,
|
Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i64_ty, llvm_i64_ty,
|
||||||
llvm_ptr_ty], [IntrReadWriteArgMem]>;
|
llvm_ptr_ty], [IntrReadWriteArgMem]>;
|
||||||
|
def int_x86_addcarry_u32: GCCBuiltin<"__builtin_ia32_addcarry_u32">,
|
||||||
|
Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i32_ty, llvm_i32_ty,
|
||||||
|
llvm_ptr_ty], [IntrReadWriteArgMem]>;
|
||||||
|
def int_x86_addcarry_u64: GCCBuiltin<"__builtin_ia32_addcarry_u64">,
|
||||||
|
Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i64_ty, llvm_i64_ty,
|
||||||
|
llvm_ptr_ty], [IntrReadWriteArgMem]>;
|
||||||
|
def int_x86_subborrow_u32: GCCBuiltin<"__builtin_ia32_subborrow_u32">,
|
||||||
|
Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i32_ty, llvm_i32_ty,
|
||||||
|
llvm_ptr_ty], [IntrReadWriteArgMem]>;
|
||||||
|
def int_x86_subborrow_u64: GCCBuiltin<"__builtin_ia32_subborrow_u64">,
|
||||||
|
Intrinsic<[llvm_i8_ty], [llvm_i8_ty, llvm_i64_ty, llvm_i64_ty,
|
||||||
|
llvm_ptr_ty], [IntrReadWriteArgMem]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -15455,6 +15455,14 @@ static void InitIntinsicsMap() {
|
|||||||
IntrinsicData(ADX, X86ISD::ADC, 0)));
|
IntrinsicData(ADX, X86ISD::ADC, 0)));
|
||||||
IntrMap.insert(std::make_pair(Intrinsic::x86_addcarryx_u64,
|
IntrMap.insert(std::make_pair(Intrinsic::x86_addcarryx_u64,
|
||||||
IntrinsicData(ADX, X86ISD::ADC, 0)));
|
IntrinsicData(ADX, X86ISD::ADC, 0)));
|
||||||
|
IntrMap.insert(std::make_pair(Intrinsic::x86_addcarry_u32,
|
||||||
|
IntrinsicData(ADX, X86ISD::ADC, 0)));
|
||||||
|
IntrMap.insert(std::make_pair(Intrinsic::x86_addcarry_u64,
|
||||||
|
IntrinsicData(ADX, X86ISD::ADC, 0)));
|
||||||
|
IntrMap.insert(std::make_pair(Intrinsic::x86_subborrow_u32,
|
||||||
|
IntrinsicData(ADX, X86ISD::SBB, 0)));
|
||||||
|
IntrMap.insert(std::make_pair(Intrinsic::x86_subborrow_u64,
|
||||||
|
IntrinsicData(ADX, X86ISD::SBB, 0)));
|
||||||
Initialized = true;
|
Initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15547,7 +15555,7 @@ static SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, const X86Subtarget *Subtarget,
|
|||||||
return DAG.getNode(ISD::MERGE_VALUES, dl, Op->getVTList(),
|
return DAG.getNode(ISD::MERGE_VALUES, dl, Op->getVTList(),
|
||||||
Ret, SDValue(InTrans.getNode(), 1));
|
Ret, SDValue(InTrans.getNode(), 1));
|
||||||
}
|
}
|
||||||
// ADC/ADCX
|
// ADC/ADCX/SBB
|
||||||
case ADX: {
|
case ADX: {
|
||||||
SmallVector<SDValue, 2> Results;
|
SmallVector<SDValue, 2> Results;
|
||||||
SDVTList CFVTs = DAG.getVTList(Op->getValueType(0), MVT::Other);
|
SDVTList CFVTs = DAG.getVTList(Op->getValueType(0), MVT::Other);
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 --show-mc-encoding| FileCheck %s --check-prefix=NOADX --check-prefix=CHECK
|
||||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=broadwell --show-mc-encoding| FileCheck %s --check-prefix=ADX --check-prefix=CHECK
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=broadwell --show-mc-encoding| FileCheck %s --check-prefix=ADX --check-prefix=CHECK
|
||||||
|
|
||||||
declare i8 @llvm.x86.addcarryx.u32(i8, i32, i32, i8*)
|
declare i8 @llvm.x86.addcarryx.u32(i8, i32, i32, i8*)
|
||||||
@ -24,3 +25,53 @@ define i8 @test_addcarryx_u64(i8 %c, i64 %a, i64 %b, i8* %ptr) {
|
|||||||
ret i8 %ret;
|
ret i8 %ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare i8 @llvm.x86.addcarry.u32(i8, i32, i32, i8*)
|
||||||
|
|
||||||
|
define i8 @test_addcarry_u32(i8 %c, i32 %a, i32 %b, i8* %ptr) {
|
||||||
|
; CHECK-LABEL: test_addcarry_u32
|
||||||
|
; CHECK: addb
|
||||||
|
; ADX: adcxl
|
||||||
|
; NOADX: adcl
|
||||||
|
; CHECK: setb
|
||||||
|
; CHECK: retq
|
||||||
|
%ret = tail call i8 @llvm.x86.addcarry.u32(i8 %c, i32 %a, i32 %b, i8* %ptr)
|
||||||
|
ret i8 %ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare i8 @llvm.x86.addcarry.u64(i8, i64, i64, i8*)
|
||||||
|
|
||||||
|
define i8 @test_addcarry_u64(i8 %c, i64 %a, i64 %b, i8* %ptr) {
|
||||||
|
; CHECK-LABEL: test_addcarry_u64
|
||||||
|
; CHECK: addb
|
||||||
|
; ADX: adcxq
|
||||||
|
; NOADX: adcq
|
||||||
|
; CHECK: setb
|
||||||
|
; CHECK: retq
|
||||||
|
%ret = tail call i8 @llvm.x86.addcarry.u64(i8 %c, i64 %a, i64 %b, i8* %ptr)
|
||||||
|
ret i8 %ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare i8 @llvm.x86.subborrow.u32(i8, i32, i32, i8*)
|
||||||
|
|
||||||
|
define i8 @test_subborrow_u32(i8 %c, i32 %a, i32 %b, i8* %ptr) {
|
||||||
|
; CHECK-LABEL: test_subborrow_u32
|
||||||
|
; CHECK: addb
|
||||||
|
; CHECK: sbbl
|
||||||
|
; CHECK: setb
|
||||||
|
; CHECK: retq
|
||||||
|
%ret = tail call i8 @llvm.x86.subborrow.u32(i8 %c, i32 %a, i32 %b, i8* %ptr)
|
||||||
|
ret i8 %ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare i8 @llvm.x86.subborrow.u64(i8, i64, i64, i8*)
|
||||||
|
|
||||||
|
define i8 @test_subborrow_u64(i8 %c, i64 %a, i64 %b, i8* %ptr) {
|
||||||
|
; CHECK-LABEL: test_subborrow_u64
|
||||||
|
; CHECK: addb
|
||||||
|
; CHECK: sbbq
|
||||||
|
; CHECK: setb
|
||||||
|
; CHECK: retq
|
||||||
|
%ret = tail call i8 @llvm.x86.subborrow.u64(i8 %c, i64 %a, i64 %b, i8* %ptr)
|
||||||
|
ret i8 %ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user