@@ -14736,46 +14736,88 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
14736
14736
case X86::BI__builtin_ia32_aesenc256kl_u8:
14737
14737
case X86::BI__builtin_ia32_aesdec256kl_u8: {
14738
14738
Intrinsic::ID IID;
14739
+ StringRef StrNoErr, StrErr, StrEnd;
14739
14740
switch (BuiltinID) {
14740
14741
default: llvm_unreachable("Unexpected builtin");
14741
14742
case X86::BI__builtin_ia32_aesenc128kl_u8:
14742
14743
IID = Intrinsic::x86_aesenc128kl;
14744
+ StrNoErr = "aesenc128kl_no_error";
14745
+ StrErr = "aesenc128kl_error";
14746
+ StrEnd = "aesenc128kl_end";
14743
14747
break;
14744
14748
case X86::BI__builtin_ia32_aesdec128kl_u8:
14745
14749
IID = Intrinsic::x86_aesdec128kl;
14750
+ StrNoErr = "aesdec128kl_no_error";
14751
+ StrErr = "aesdec128kl_error";
14752
+ StrEnd = "aesdec128kl_end";
14746
14753
break;
14747
14754
case X86::BI__builtin_ia32_aesenc256kl_u8:
14748
14755
IID = Intrinsic::x86_aesenc256kl;
14756
+ StrNoErr = "aesenc256kl_no_error";
14757
+ StrErr = "aesenc256kl_error";
14758
+ StrEnd = "aesenc256kl_end";
14749
14759
break;
14750
14760
case X86::BI__builtin_ia32_aesdec256kl_u8:
14751
14761
IID = Intrinsic::x86_aesdec256kl;
14762
+ StrNoErr = "aesdec256kl_no_error";
14763
+ StrErr = "aesdec256kl_error";
14764
+ StrEnd = "aesdec256kl_end";
14752
14765
break;
14753
14766
}
14754
14767
14755
14768
Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), {Ops[1], Ops[2]});
14756
14769
14757
- Builder.CreateDefaultAlignedStore(Builder.CreateExtractValue(Call, 1),
14758
- Ops[0]);
14770
+ BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
14771
+ BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
14772
+ BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
14773
+
14774
+ Value *Ret = Builder.CreateExtractValue(Call, 0);
14775
+ Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
14776
+ Value *Out = Builder.CreateExtractValue(Call, 1);
14777
+ Builder.CreateCondBr(Succ, NoError, Error);
14778
+
14779
+ Builder.SetInsertPoint(NoError);
14780
+ Builder.CreateDefaultAlignedStore(Out, Ops[0]);
14781
+ Builder.CreateBr(End);
14759
14782
14783
+ Builder.SetInsertPoint(Error);
14784
+ Constant *Zero = llvm::Constant::getNullValue(Out->getType());
14785
+ Builder.CreateDefaultAlignedStore(Zero, Ops[0]);
14786
+ Builder.CreateBr(End);
14787
+
14788
+ Builder.SetInsertPoint(End);
14760
14789
return Builder.CreateExtractValue(Call, 0);
14761
14790
}
14762
14791
case X86::BI__builtin_ia32_aesencwide128kl_u8:
14763
14792
case X86::BI__builtin_ia32_aesdecwide128kl_u8:
14764
14793
case X86::BI__builtin_ia32_aesencwide256kl_u8:
14765
14794
case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
14766
14795
Intrinsic::ID IID;
14796
+ StringRef StrNoErr, StrErr, StrEnd;
14767
14797
switch (BuiltinID) {
14768
14798
case X86::BI__builtin_ia32_aesencwide128kl_u8:
14769
14799
IID = Intrinsic::x86_aesencwide128kl;
14800
+ StrNoErr = "aesencwide128kl_no_error";
14801
+ StrErr = "aesencwide128kl_error";
14802
+ StrEnd = "aesencwide128kl_end";
14770
14803
break;
14771
14804
case X86::BI__builtin_ia32_aesdecwide128kl_u8:
14772
14805
IID = Intrinsic::x86_aesdecwide128kl;
14806
+ StrNoErr = "aesdecwide128kl_no_error";
14807
+ StrErr = "aesdecwide128kl_error";
14808
+ StrEnd = "aesdecwide128kl_end";
14773
14809
break;
14774
14810
case X86::BI__builtin_ia32_aesencwide256kl_u8:
14775
14811
IID = Intrinsic::x86_aesencwide256kl;
14812
+ StrNoErr = "aesencwide256kl_no_error";
14813
+ StrErr = "aesencwide256kl_error";
14814
+ StrEnd = "aesencwide256kl_end";
14776
14815
break;
14777
14816
case X86::BI__builtin_ia32_aesdecwide256kl_u8:
14778
14817
IID = Intrinsic::x86_aesdecwide256kl;
14818
+ StrNoErr = "aesdecwide256kl_no_error";
14819
+ StrErr = "aesdecwide256kl_error";
14820
+ StrEnd = "aesdecwide256kl_end";
14779
14821
break;
14780
14822
}
14781
14823
@@ -14789,12 +14831,32 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
14789
14831
14790
14832
Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), InOps);
14791
14833
14834
+ BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
14835
+ BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
14836
+ BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
14837
+
14838
+ Value *Ret = Builder.CreateExtractValue(Call, 0);
14839
+ Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
14840
+ Builder.CreateCondBr(Succ, NoError, Error);
14841
+
14842
+ Builder.SetInsertPoint(NoError);
14792
14843
for (int i = 0; i != 8; ++i) {
14793
14844
Value *Extract = Builder.CreateExtractValue(Call, i + 1);
14794
14845
Value *Ptr = Builder.CreateConstGEP1_32(Ops[0], i);
14795
14846
Builder.CreateAlignedStore(Extract, Ptr, Align(16));
14796
14847
}
14848
+ Builder.CreateBr(End);
14849
+
14850
+ Builder.SetInsertPoint(Error);
14851
+ for (int i = 0; i != 8; ++i) {
14852
+ Value *Out = Builder.CreateExtractValue(Call, i + 1);
14853
+ Constant *Zero = llvm::Constant::getNullValue(Out->getType());
14854
+ Value *Ptr = Builder.CreateConstGEP1_32(Ops[0], i);
14855
+ Builder.CreateAlignedStore(Zero, Ptr, Align(16));
14856
+ }
14857
+ Builder.CreateBr(End);
14797
14858
14859
+ Builder.SetInsertPoint(End);
14798
14860
return Builder.CreateExtractValue(Call, 0);
14799
14861
}
14800
14862
}
0 commit comments