15#include "llvm/IR/IntrinsicsRISCV.h"
16#include "llvm/TargetParser/RISCVISAInfo.h"
17#include "llvm/TargetParser/RISCVTargetParser.h"
31static LLVM_ATTRIBUTE_NOINLINE
Value *
35 int PolicyAttrs,
bool IsMasked) {
41 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
43 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
44 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
45 IntrinsicTypes = {ResultType, Ops[4]->getType(), Ops[2]->getType()};
48 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
49 IntrinsicTypes = {ResultType, Ops[3]->getType(), Ops[1]->getType()};
51 Value *NewVL = Ops[2];
52 Ops.erase(Ops.begin() + 2);
53 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
54 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
55 llvm::Value *
V = Builder.CreateExtractValue(LoadValue, {0});
59 Align = CGM.getNaturalPointeeTypeAlignment(
62 Align = CGM.getNaturalPointeeTypeAlignment(E->
getArg(1)->
getType());
63 llvm::Value *Val = Builder.CreateExtractValue(LoadValue, {1});
68static LLVM_ATTRIBUTE_NOINLINE
Value *
72 int PolicyAttrs,
bool IsMasked) {
79 std::swap(Ops[0], Ops[3]);
82 std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3);
85 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[4]->getType()};
87 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[3]->getType()};
88 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
89 return Builder.CreateCall(F, Ops,
"");
92static LLVM_ATTRIBUTE_NOINLINE
Value *
96 int PolicyAttrs,
bool IsMasked) {
103 std::swap(Ops[0], Ops[3]);
107 std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3);
110 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
113 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
115 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
116 return Builder.CreateCall(F, Ops,
"");
119static LLVM_ATTRIBUTE_NOINLINE
Value *
123 int PolicyAttrs,
bool IsMasked) {
125 auto &CGM = CGF->
CGM;
128 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
130 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
133 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
136 Ops.insert(Ops.begin() + 2, llvm::Constant::getNullValue(ElemTy));
138 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
140 IntrinsicTypes = {ResultType, ElemTy, Ops[4]->getType()};
143 IntrinsicTypes = {ResultType, ElemTy, Ops[3]->getType()};
145 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
146 return Builder.CreateCall(F, Ops,
"");
149static LLVM_ATTRIBUTE_NOINLINE
Value *
153 int PolicyAttrs,
bool IsMasked) {
155 auto &CGM = CGF->
CGM;
158 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
160 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
163 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
166 Ops.insert(Ops.begin() + 2, llvm::Constant::getAllOnesValue(ElemTy));
168 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
170 IntrinsicTypes = {ResultType, ElemTy, Ops[4]->getType()};
173 IntrinsicTypes = {ResultType, ElemTy, Ops[3]->getType()};
175 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
176 return Builder.CreateCall(F, Ops,
"");
179static LLVM_ATTRIBUTE_NOINLINE
Value *
183 int PolicyAttrs,
bool IsMasked) {
185 auto &CGM = CGF->
CGM;
188 IntrinsicTypes = {ResultType, Ops[1]->getType()};
189 Ops.insert(Ops.begin() + 1, Ops[0]);
190 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
191 return Builder.CreateCall(F, Ops,
"");
194static LLVM_ATTRIBUTE_NOINLINE
Value *
198 int PolicyAttrs,
bool IsMasked) {
200 auto &CGM = CGF->
CGM;
203 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
205 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
206 Ops.insert(Ops.begin() + 2, Ops[1]);
207 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
209 IntrinsicTypes = {ResultType, Ops[2]->getType(), Ops.back()->getType()};
212 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
214 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType()};
215 Ops.insert(Ops.begin() + 2, Ops[1]);
217 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
218 return Builder.CreateCall(F, Ops,
"");
221static LLVM_ATTRIBUTE_NOINLINE
Value *
225 int PolicyAttrs,
bool IsMasked) {
227 auto &CGM = CGF->
CGM;
230 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
232 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
235 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
238 Ops.insert(Ops.begin() + 2, llvm::Constant::getNullValue(ElemTy));
240 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
242 IntrinsicTypes = {ResultType, Ops[1]->getType(), ElemTy, Ops[4]->getType()};
245 IntrinsicTypes = {ResultType, Ops[1]->getType(), ElemTy, Ops[3]->getType()};
247 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
248 return Builder.CreateCall(F, Ops,
"");
251static LLVM_ATTRIBUTE_NOINLINE
Value *
255 int PolicyAttrs,
bool IsMasked) {
257 auto &CGM = CGF->
CGM;
260 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
262 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
265 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
267 Ops.insert(Ops.begin() + 2,
268 llvm::Constant::getNullValue(Ops.back()->getType()));
270 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
272 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[4]->getType(),
276 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[3]->getType(),
279 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
280 return Builder.CreateCall(F, Ops,
"");
283static LLVM_ATTRIBUTE_NOINLINE
Value *
287 int PolicyAttrs,
bool IsMasked) {
289 auto &CGM = CGF->
CGM;
291 llvm::MDBuilder MDHelper(Context);
292 llvm::Metadata *OpsMD[] = {llvm::MDString::get(Context,
"vlenb")};
293 llvm::MDNode *RegName = llvm::MDNode::get(Context, OpsMD);
294 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
296 CGM.getIntrinsic(llvm::Intrinsic::read_register, {CGF->
SizeTy});
297 return Builder.CreateCall(F, Metadata);
300static LLVM_ATTRIBUTE_NOINLINE
Value *
304 int PolicyAttrs,
bool IsMasked) {
306 auto &CGM = CGF->
CGM;
308 return Builder.CreateCall(F, Ops,
"");
311static LLVM_ATTRIBUTE_NOINLINE
Value *
315 int PolicyAttrs,
bool IsMasked) {
317 auto &CGM = CGF->
CGM;
322 std::swap(Ops[0], Ops[2]);
326 std::swap(Ops[0], Ops[1]);
329 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[3]->getType()};
331 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType()};
332 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
333 return Builder.CreateCall(F, Ops,
"");
339 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
341 auto &CGM = CGF->
CGM;
344 (IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) |
345 (!IsMasked && (PolicyAttrs &
RVV_VTA));
346 unsigned Offset = IsMasked ? NoPassthru ? 1 : 2 : NoPassthru ? 0 : 1;
348 IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops[0]->getType(),
349 Ops.back()->getType()};
351 IntrinsicTypes = {ResultType, Ops[Offset]->getType(),
352 Ops.back()->getType()};
354 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
356 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
358 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
359 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
360 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
361 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
362 if (ReturnValue.isNull())
364 return Builder.CreateStore(LoadValue, ReturnValue.getValue());
370 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
372 auto &CGM = CGF->
CGM;
381 std::swap(Ops[0], Ops[2]);
383 std::swap(Ops[0], Ops[1]);
384 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
386 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
389 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType()};
390 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
391 return Builder.CreateCall(F, Ops,
"");
397 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
399 auto &CGM = CGF->
CGM;
402 (IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) |
403 (!IsMasked && (PolicyAttrs &
RVV_VTA));
404 unsigned Offset = IsMasked ? NoPassthru ? 1 : 2 : NoPassthru ? 0 : 1;
406 IntrinsicTypes = {ResultType, Ops.back()->getType(), Ops[Offset]->getType(),
409 IntrinsicTypes = {ResultType, Ops.back()->getType(),
410 Ops[Offset]->getType()};
412 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
414 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
416 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
417 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
418 Value *NewVL = Ops[2];
419 Ops.erase(Ops.begin() + 2);
420 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
421 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
424 CGM.getNaturalPointeeTypeAlignment(E->
getArg(Offset + 1)->
getType());
425 llvm::Value *ReturnTuple = Builder.CreateExtractValue(LoadValue, 0);
427 llvm::Value *
V = Builder.CreateExtractValue(LoadValue, 1);
428 Builder.CreateStore(
V,
Address(NewVL,
V->getType(), Align));
429 if (ReturnValue.isNull())
431 return Builder.CreateStore(ReturnTuple, ReturnValue.getValue());
437 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
439 auto &CGM = CGF->
CGM;
442 (IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) |
443 (!IsMasked && (PolicyAttrs &
RVV_VTA));
444 unsigned Offset = IsMasked ? NoPassthru ? 1 : 2 : NoPassthru ? 0 : 1;
446 IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops.back()->getType(),
449 IntrinsicTypes = {ResultType, Ops[Offset]->getType(),
450 Ops.back()->getType()};
452 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
454 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
456 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
457 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
458 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
459 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
460 if (ReturnValue.isNull())
462 return Builder.CreateStore(LoadValue, ReturnValue.getValue());
468 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
470 auto &CGM = CGF->
CGM;
479 std::swap(Ops[0], Ops[3]);
481 std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3);
482 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
484 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[4]->getType(),
487 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[3]->getType()};
488 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
489 return Builder.CreateCall(F, Ops,
"");
492static LLVM_ATTRIBUTE_NOINLINE
Value *
496 int PolicyAttrs,
bool IsMasked) {
498 auto &CGM = CGF->
CGM;
505 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
506 (!IsMasked && PolicyAttrs &
RVV_VTA));
509 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
512 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
515 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
517 llvm::Function *F = CGM.getIntrinsic(
518 ID, {ResultType, Ops[2]->getType(), Ops.back()->getType()});
519 return Builder.CreateCall(F, Ops,
"");
522static LLVM_ATTRIBUTE_NOINLINE
Value *
526 int PolicyAttrs,
bool IsMasked) {
528 auto &CGM = CGF->
CGM;
535 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
536 (!IsMasked && PolicyAttrs &
RVV_VTA));
539 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
542 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
545 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
548 CGM.getIntrinsic(ID, {ResultType, Ops[1]->getType(), Ops[2]->getType(),
549 Ops.back()->getType()});
550 return Builder.CreateCall(F, Ops,
"");
553static LLVM_ATTRIBUTE_NOINLINE
Value *
557 int PolicyAttrs,
bool IsMasked) {
559 auto &CGM = CGF->
CGM;
565 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
566 (!IsMasked && PolicyAttrs &
RVV_VTA));
567 bool HasRoundModeOp =
568 IsMasked ? (HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5)
569 : (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
572 Ops.insert(Ops.end() - 1,
573 ConstantInt::get(Ops.back()->getType(), 7));
576 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
579 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
582 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
584 llvm::Function *F = CGM.getIntrinsic(
585 ID, {ResultType, Ops[2]->getType(), Ops.back()->getType()});
586 return Builder.CreateCall(F, Ops,
"");
592 int PolicyAttrs,
bool IsMasked) {
594 auto &CGM = CGF->
CGM;
600 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
601 (!IsMasked && PolicyAttrs &
RVV_VTA));
602 bool HasRoundModeOp =
603 IsMasked ? (HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5)
604 : (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
607 Ops.insert(Ops.end() - 1,
608 ConstantInt::get(Ops.back()->getType(), 7));
611 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
614 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
617 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
620 CGM.getIntrinsic(ID, {ResultType, Ops[1]->getType(), Ops[2]->getType(),
621 Ops.back()->getType()});
622 return Builder.CreateCall(F, Ops,
"");
628 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
630 auto &CGM = CGF->
CGM;
634 (IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) |
635 (!IsMasked && (PolicyAttrs &
RVV_VTA));
638 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
640 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
643 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
644 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
647 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType(),
648 Ops[3]->getType(), Ops[4]->getType()};
650 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType(),
652 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
653 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
655 if (ReturnValue.isNull())
657 return Builder.CreateStore(LoadValue, ReturnValue.getValue());
663 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
665 auto &CGM = CGF->
CGM;
675 std::swap(Ops[0], Ops[3]);
677 std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3);
679 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
682 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
683 Ops[3]->getType(), Ops[4]->getType()};
685 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
687 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
688 return Builder.CreateCall(F, Ops,
"");
691static LLVM_ATTRIBUTE_NOINLINE
Value *
695 int PolicyAttrs,
bool IsMasked) {
697 auto &CGM = CGF->
CGM;
704 bool HasRoundModeOp = IsMasked ? Ops.size() == 6 : Ops.size() == 5;
707 Ops.insert(Ops.end() - 1,
708 ConstantInt::get(Ops.back()->getType(), 7));
711 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
713 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
715 llvm::Function *F = CGM.getIntrinsic(
716 ID, {ResultType, Ops[1]->getType(), Ops.back()->getType()});
717 return Builder.CreateCall(F, Ops,
"");
720static LLVM_ATTRIBUTE_NOINLINE
Value *
724 int PolicyAttrs,
bool IsMasked) {
726 auto &CGM = CGF->
CGM;
732 bool HasRoundModeOp = IsMasked ? Ops.size() == 6 : Ops.size() == 5;
735 Ops.insert(Ops.end() - 1,
736 ConstantInt::get(Ops.back()->getType(), 7));
739 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.begin() + 4);
741 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
744 CGM.getIntrinsic(ID, {ResultType, Ops[1]->getType(), Ops[2]->getType(),
745 Ops.back()->getType()});
746 return Builder.CreateCall(F, Ops,
"");
749static LLVM_ATTRIBUTE_NOINLINE
Value *
753 int PolicyAttrs,
bool IsMasked) {
755 auto &CGM = CGF->
CGM;
762 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
763 (!IsMasked && PolicyAttrs &
RVV_VTA));
764 bool HasRoundModeOp =
765 IsMasked ? (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4)
766 : (HasMaskedOff ? Ops.size() == 4 : Ops.size() == 3);
769 Ops.insert(Ops.end() - 1,
770 ConstantInt::get(Ops.back()->getType(), 7));
773 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
776 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
779 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
781 IntrinsicTypes = {ResultType, Ops.back()->getType()};
782 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
783 return Builder.CreateCall(F, Ops,
"");
786static LLVM_ATTRIBUTE_NOINLINE
Value *
790 int PolicyAttrs,
bool IsMasked) {
792 auto &CGM = CGF->
CGM;
797 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
798 (!IsMasked && PolicyAttrs &
RVV_VTA));
799 bool HasRoundModeOp =
800 IsMasked ? (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4)
801 : (HasMaskedOff ? Ops.size() == 4 : Ops.size() == 3);
804 Ops.insert(Ops.end() - 1,
805 ConstantInt::get(Ops.back()->getType(), 7));
808 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
811 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
814 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
816 llvm::Function *F = CGM.getIntrinsic(
817 ID, {ResultType, Ops[1]->getType(), Ops.back()->getType()});
818 return Builder.CreateCall(F, Ops,
"");
824 int PolicyAttrs,
bool IsMasked) {
826 auto &CGM = CGF->
CGM;
832 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
833 (!IsMasked && PolicyAttrs &
RVV_VTA));
834 bool HasRoundModeOp =
835 IsMasked ? (HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5)
836 : (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
839 Ops.insert(Ops.end() - 1,
840 ConstantInt::get(Ops.back()->getType(), 7));
843 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
846 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
848 llvm::Function *F = CGM.getIntrinsic(
849 ID, {ResultType, Ops[1]->getType(), Ops.back()->getType()});
850 return Builder.CreateCall(F, Ops,
"");
853static LLVM_ATTRIBUTE_NOINLINE
Value *
857 int PolicyAttrs,
bool IsMasked) {
859 auto &CGM = CGF->
CGM;
861 if (ResultType->isIntOrIntVectorTy(1) ||
862 Ops[0]->getType()->isIntOrIntVectorTy(1)) {
866 LLVMContext &Context = CGM.getLLVMContext();
867 ScalableVectorType *Boolean64Ty =
868 ScalableVectorType::get(llvm::Type::getInt1Ty(Context), 64);
870 if (ResultType->isIntOrIntVectorTy(1)) {
875 llvm::Value *BitCast = Builder.CreateBitCast(Ops[0], Boolean64Ty);
876 return Builder.CreateExtractVector(ResultType, BitCast,
877 ConstantInt::get(CGF->
Int64Ty, 0));
883 llvm::Value *Boolean64Val = Builder.CreateInsertVector(
884 Boolean64Ty, llvm::PoisonValue::get(Boolean64Ty), Ops[0],
885 ConstantInt::get(CGF->
Int64Ty, 0));
886 return Builder.CreateBitCast(Boolean64Val, ResultType);
889 return Builder.CreateBitCast(Ops[0], ResultType);
892static LLVM_ATTRIBUTE_NOINLINE
Value *
896 int PolicyAttrs,
bool IsMasked) {
899 if (
auto *OpVecTy = dyn_cast<ScalableVectorType>(Ops[0]->
getType())) {
901 OpVecTy->getMinNumElements() / VecTy->getMinNumElements();
902 assert(isPowerOf2_32(MaxIndex));
904 Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
905 Ops[1] = Builder.CreateAnd(Ops[1], MaxIndex - 1);
907 Builder.CreateMul(Ops[1], ConstantInt::get(Ops[1]->
getType(),
908 VecTy->getMinNumElements()));
909 return Builder.CreateExtractVector(ResultType, Ops[0], Ops[1]);
912 return Builder.CreateIntrinsic(
913 Intrinsic::riscv_tuple_extract, {ResultType, Ops[0]->getType()},
914 {Ops[0], Builder.CreateTrunc(Ops[1], Builder.getInt32Ty())});
917static LLVM_ATTRIBUTE_NOINLINE
Value *
921 int PolicyAttrs,
bool IsMasked) {
923 if (
auto *ResVecTy = dyn_cast<ScalableVectorType>(ResultType)) {
926 ResVecTy->getMinNumElements() / VecTy->getMinNumElements();
927 assert(isPowerOf2_32(MaxIndex));
929 Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
930 Ops[1] = Builder.CreateAnd(Ops[1], MaxIndex - 1);
932 Builder.CreateMul(Ops[1], ConstantInt::get(Ops[1]->
getType(),
933 VecTy->getMinNumElements()));
934 return Builder.CreateInsertVector(ResultType, Ops[0], Ops[2], Ops[1]);
937 return Builder.CreateIntrinsic(
938 Intrinsic::riscv_tuple_insert, {ResultType, Ops[2]->getType()},
939 {Ops[0], Ops[2], Builder.CreateTrunc(Ops[1], Builder.getInt32Ty())});
942static LLVM_ATTRIBUTE_NOINLINE
Value *
946 int PolicyAttrs,
bool IsMasked) {
948 llvm::Value *ReturnVector = llvm::PoisonValue::get(ResultType);
950 for (
unsigned I = 0, N = Ops.size(); I < N; ++I) {
952 llvm::Value *Idx = ConstantInt::get(Builder.getInt64Ty(),
953 VecTy->getMinNumElements() * I);
955 Builder.CreateInsertVector(ResultType, ReturnVector, Ops[I], Idx);
957 llvm::Value *Idx = ConstantInt::get(Builder.getInt32Ty(), I);
958 ReturnVector = Builder.CreateIntrinsic(Intrinsic::riscv_tuple_insert,
959 {ResultType, Ops[I]->getType()},
960 {ReturnVector, Ops[I], Idx});
967 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy, {
VoidPtrTy},
false);
968 llvm::FunctionCallee
Func =
969 CGM.CreateRuntimeFunction(FTy,
"__init_riscv_feature_bits");
971 CalleeGV->setDSOLocal(
true);
972 CalleeGV->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
980 if (!
getContext().getTargetInfo().validateCpuSupports(FeatureStr))
988 llvm::Type *Int32Ty = Builder.getInt32Ty();
989 llvm::Type *Int64Ty = Builder.getInt64Ty();
990 llvm::ArrayType *ArrayOfInt64Ty =
991 llvm::ArrayType::get(Int64Ty, llvm::RISCVISAInfo::FeatureBitSize);
992 llvm::Type *StructTy = llvm::StructType::get(Int32Ty, ArrayOfInt64Ty);
993 llvm::Constant *RISCVFeaturesBits =
996 Value *IndexVal = llvm::ConstantInt::get(Int32Ty, Index);
997 llvm::Value *GEPIndices[] = {Builder.getInt32(0), Builder.getInt32(1),
1000 Builder.CreateInBoundsGEP(StructTy, RISCVFeaturesBits, GEPIndices);
1001 Value *FeaturesBit =
1007 const unsigned RISCVFeatureLength = llvm::RISCVISAInfo::FeatureBitSize;
1008 uint64_t RequireBitMasks[RISCVFeatureLength] = {0};
1010 for (
auto Feat : FeaturesStrs) {
1011 auto [GroupID, BitPos] = RISCVISAInfo::getRISCVFeaturesBitsInfo(Feat);
1018 RequireBitMasks[GroupID] |= (1ULL << BitPos);
1022 for (
unsigned Idx = 0; Idx < RISCVFeatureLength; Idx++) {
1023 if (RequireBitMasks[Idx] == 0)
1033 assert(
Result &&
"Should have value here.");
1048 llvm::Constant *RISCVCPUModel =
1049 CGM.CreateRuntimeVariable(StructTy,
"__riscv_cpu_model");
1052 auto loadRISCVCPUID = [&](
unsigned Index) {
1053 Value *Ptr =
Builder.CreateStructGEP(StructTy, RISCVCPUModel, Index);
1054 Value *CPUID =
Builder.CreateAlignedLoad(StructTy->getTypeAtIndex(Index),
1055 Ptr, llvm::MaybeAlign());
1059 const llvm::RISCV::CPUModel Model = llvm::RISCV::getCPUModel(CPUStr);
1062 Value *VendorID = loadRISCVCPUID(0);
1064 Builder.CreateICmpEQ(VendorID,
Builder.getInt32(Model.MVendorID));
1067 Value *ArchID = loadRISCVCPUID(1);
1072 Value *ImpID = loadRISCVCPUID(2);
1083 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
1085 if (BuiltinID == Builtin::BI__builtin_cpu_init)
1087 if (BuiltinID == Builtin::BI__builtin_cpu_is)
1094 unsigned ICEArguments = 0;
1102 if (BuiltinID == RISCVVector::BI__builtin_rvv_vget_v ||
1103 BuiltinID == RISCVVector::BI__builtin_rvv_vset_v)
1104 ICEArguments = 1 << 1;
1109 if (BuiltinID == RISCV::BI__builtin_riscv_ntl_load)
1110 ICEArguments |= (1 << 1);
1111 if (BuiltinID == RISCV::BI__builtin_riscv_ntl_store)
1112 ICEArguments |= (1 << 2);
1114 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; i++) {
1119 Ops.push_back(AggValue);
1125 Intrinsic::ID ID = Intrinsic::not_intrinsic;
1126 int PolicyAttrs = 0;
1127 bool IsMasked =
false;
1129 unsigned SegInstSEW = 8;
1131 unsigned TWiden = 0;
1135 switch (BuiltinID) {
1136 default: llvm_unreachable(
"unexpected builtin ID");
1137 case RISCV::BI__builtin_riscv_orc_b_32:
1138 case RISCV::BI__builtin_riscv_orc_b_64:
1139 case RISCV::BI__builtin_riscv_clmul_32:
1140 case RISCV::BI__builtin_riscv_clmul_64:
1141 case RISCV::BI__builtin_riscv_clmulh_32:
1142 case RISCV::BI__builtin_riscv_clmulh_64:
1143 case RISCV::BI__builtin_riscv_clmulr_32:
1144 case RISCV::BI__builtin_riscv_clmulr_64:
1145 case RISCV::BI__builtin_riscv_xperm4_32:
1146 case RISCV::BI__builtin_riscv_xperm4_64:
1147 case RISCV::BI__builtin_riscv_xperm8_32:
1148 case RISCV::BI__builtin_riscv_xperm8_64:
1149 case RISCV::BI__builtin_riscv_brev8_32:
1150 case RISCV::BI__builtin_riscv_brev8_64:
1151 case RISCV::BI__builtin_riscv_zip_32:
1152 case RISCV::BI__builtin_riscv_unzip_32: {
1153 switch (BuiltinID) {
1154 default: llvm_unreachable(
"unexpected builtin ID");
1156 case RISCV::BI__builtin_riscv_orc_b_32:
1157 case RISCV::BI__builtin_riscv_orc_b_64:
1158 ID = Intrinsic::riscv_orc_b;
1162 case RISCV::BI__builtin_riscv_clmul_32:
1163 case RISCV::BI__builtin_riscv_clmul_64:
1164 ID = Intrinsic::clmul;
1166 case RISCV::BI__builtin_riscv_clmulh_32:
1167 case RISCV::BI__builtin_riscv_clmulh_64:
1168 ID = Intrinsic::riscv_clmulh;
1170 case RISCV::BI__builtin_riscv_clmulr_32:
1171 case RISCV::BI__builtin_riscv_clmulr_64:
1172 ID = Intrinsic::riscv_clmulr;
1176 case RISCV::BI__builtin_riscv_xperm8_32:
1177 case RISCV::BI__builtin_riscv_xperm8_64:
1178 ID = Intrinsic::riscv_xperm8;
1180 case RISCV::BI__builtin_riscv_xperm4_32:
1181 case RISCV::BI__builtin_riscv_xperm4_64:
1182 ID = Intrinsic::riscv_xperm4;
1186 case RISCV::BI__builtin_riscv_brev8_32:
1187 case RISCV::BI__builtin_riscv_brev8_64:
1188 ID = Intrinsic::riscv_brev8;
1190 case RISCV::BI__builtin_riscv_zip_32:
1191 ID = Intrinsic::riscv_zip;
1193 case RISCV::BI__builtin_riscv_unzip_32:
1194 ID = Intrinsic::riscv_unzip;
1198 IntrinsicTypes = {ResultType};
1205 case RISCV::BI__builtin_riscv_sha256sig0:
1206 ID = Intrinsic::riscv_sha256sig0;
1208 case RISCV::BI__builtin_riscv_sha256sig1:
1209 ID = Intrinsic::riscv_sha256sig1;
1211 case RISCV::BI__builtin_riscv_sha256sum0:
1212 ID = Intrinsic::riscv_sha256sum0;
1214 case RISCV::BI__builtin_riscv_sha256sum1:
1215 ID = Intrinsic::riscv_sha256sum1;
1219 case RISCV::BI__builtin_riscv_sm4ks:
1220 ID = Intrinsic::riscv_sm4ks;
1222 case RISCV::BI__builtin_riscv_sm4ed:
1223 ID = Intrinsic::riscv_sm4ed;
1227 case RISCV::BI__builtin_riscv_sm3p0:
1228 ID = Intrinsic::riscv_sm3p0;
1230 case RISCV::BI__builtin_riscv_sm3p1:
1231 ID = Intrinsic::riscv_sm3p1;
1234 case RISCV::BI__builtin_riscv_clz_32:
1235 case RISCV::BI__builtin_riscv_clz_64: {
1238 if (
Result->getType() != ResultType)
1243 case RISCV::BI__builtin_riscv_ctz_32:
1244 case RISCV::BI__builtin_riscv_ctz_64: {
1247 if (
Result->getType() != ResultType)
1254 case RISCV::BI__builtin_riscv_ntl_load: {
1256 unsigned DomainVal = 5;
1257 if (Ops.size() == 2)
1260 llvm::MDNode *RISCVDomainNode = llvm::MDNode::get(
1262 llvm::ConstantAsMetadata::get(
Builder.getInt32(DomainVal)));
1263 llvm::MDNode *NontemporalNode = llvm::MDNode::get(
1267 if(ResTy->isScalableTy()) {
1269 llvm::Type *ScalarTy = ResTy->getScalarType();
1270 Width = ScalarTy->getPrimitiveSizeInBits() *
1271 SVTy->getElementCount().getKnownMinValue();
1273 Width = ResTy->getPrimitiveSizeInBits();
1274 LoadInst *Load =
Builder.CreateLoad(
1277 Load->setMetadata(llvm::LLVMContext::MD_nontemporal, NontemporalNode);
1278 Load->setMetadata(
CGM.getModule().getMDKindID(
"riscv-nontemporal-domain"),
1283 case RISCV::BI__builtin_riscv_ntl_store: {
1284 unsigned DomainVal = 5;
1285 if (Ops.size() == 3)
1288 llvm::MDNode *RISCVDomainNode = llvm::MDNode::get(
1290 llvm::ConstantAsMetadata::get(
Builder.getInt32(DomainVal)));
1291 llvm::MDNode *NontemporalNode = llvm::MDNode::get(
1294 StoreInst *Store =
Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
1295 Store->setMetadata(llvm::LLVMContext::MD_nontemporal, NontemporalNode);
1296 Store->setMetadata(
CGM.getModule().getMDKindID(
"riscv-nontemporal-domain"),
1302 case RISCV::BI__builtin_riscv_pause: {
1303 llvm::Function *Fn =
CGM.getIntrinsic(llvm::Intrinsic::riscv_pause);
1304 return Builder.CreateCall(Fn, {});
1308 case RISCV::BI__builtin_riscv_cv_alu_addN:
1309 ID = Intrinsic::riscv_cv_alu_addN;
1311 case RISCV::BI__builtin_riscv_cv_alu_addRN:
1312 ID = Intrinsic::riscv_cv_alu_addRN;
1314 case RISCV::BI__builtin_riscv_cv_alu_adduN:
1315 ID = Intrinsic::riscv_cv_alu_adduN;
1317 case RISCV::BI__builtin_riscv_cv_alu_adduRN:
1318 ID = Intrinsic::riscv_cv_alu_adduRN;
1320 case RISCV::BI__builtin_riscv_cv_alu_clip:
1321 ID = Intrinsic::riscv_cv_alu_clip;
1323 case RISCV::BI__builtin_riscv_cv_alu_clipu:
1324 ID = Intrinsic::riscv_cv_alu_clipu;
1326 case RISCV::BI__builtin_riscv_cv_alu_extbs:
1329 case RISCV::BI__builtin_riscv_cv_alu_extbz:
1332 case RISCV::BI__builtin_riscv_cv_alu_exths:
1335 case RISCV::BI__builtin_riscv_cv_alu_exthz:
1338 case RISCV::BI__builtin_riscv_cv_alu_sle:
1341 case RISCV::BI__builtin_riscv_cv_alu_sleu:
1344 case RISCV::BI__builtin_riscv_cv_alu_subN:
1345 ID = Intrinsic::riscv_cv_alu_subN;
1347 case RISCV::BI__builtin_riscv_cv_alu_subRN:
1348 ID = Intrinsic::riscv_cv_alu_subRN;
1350 case RISCV::BI__builtin_riscv_cv_alu_subuN:
1351 ID = Intrinsic::riscv_cv_alu_subuN;
1353 case RISCV::BI__builtin_riscv_cv_alu_subuRN:
1354 ID = Intrinsic::riscv_cv_alu_subuRN;
1358 case RISCV::BI__builtin_riscv_nds_ffb_32:
1359 case RISCV::BI__builtin_riscv_nds_ffb_64:
1360 IntrinsicTypes = {ResultType};
1361 ID = Intrinsic::riscv_nds_ffb;
1363 case RISCV::BI__builtin_riscv_nds_ffzmism_32:
1364 case RISCV::BI__builtin_riscv_nds_ffzmism_64:
1365 IntrinsicTypes = {ResultType};
1366 ID = Intrinsic::riscv_nds_ffzmism;
1368 case RISCV::BI__builtin_riscv_nds_ffmism_32:
1369 case RISCV::BI__builtin_riscv_nds_ffmism_64:
1370 IntrinsicTypes = {ResultType};
1371 ID = Intrinsic::riscv_nds_ffmism;
1373 case RISCV::BI__builtin_riscv_nds_flmism_32:
1374 case RISCV::BI__builtin_riscv_nds_flmism_64:
1375 IntrinsicTypes = {ResultType};
1376 ID = Intrinsic::riscv_nds_flmism;
1380 case RISCV::BI__builtin_riscv_nds_fcvt_s_bf16:
1382 case RISCV::BI__builtin_riscv_nds_fcvt_bf16_s:
1386#include "clang/Basic/riscv_vector_builtin_cg.inc"
1389#include "clang/Basic/riscv_sifive_vector_builtin_cg.inc"
1392#include "clang/Basic/riscv_andes_vector_builtin_cg.inc"
1395 assert(ID != Intrinsic::not_intrinsic);
1397 llvm::Function *F =
CGM.getIntrinsic(ID, IntrinsicTypes);
1398 return Builder.CreateCall(F, Ops,
"");
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVStridedSegLoadTupleBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVPseudoUnaryBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVCreateBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVGetBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVFloatingPointBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVFloatingReductionBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVPseudoMaskBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static constexpr unsigned RVV_VMA
static Value * loadRISCVFeatureBits(unsigned Index, CGBuilderTy &Builder, CodeGenModule &CGM)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVFloatingUnaryBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVFMABuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVVLEFFBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVPseudoVNotBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVStridedSegStoreTupleBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVVSEMaskBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVNarrowingClipBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVVsetvliBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVVSSEBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVIndexedSegLoadTupleBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVFloatingConvBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVUnitStridedSegLoadFFTupleBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVAveragingBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVUnitStridedSegStoreTupleBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVWideningFMABuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVIndexedStoreBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVSetBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVIndexedSegStoreTupleBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVReinterpretBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVPseudoVWCVTBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVPseudoVNCVTBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static constexpr unsigned RVV_VTA
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVWideningFloatingPointBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVVlenbBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVUnitStridedSegLoadTupleBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
static LLVM_ATTRIBUTE_NOINLINE Value * emitRVVPseudoVFUnaryBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked)
Enumerates target-specific builtins in their own namespaces within namespace clang.
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
@ GE_Missing_type
Missing a type.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
CharUnits - This is an opaque type for sizes expressed in character units.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
llvm::Value * EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx, const CallExpr *E)
llvm::Value * EmitRISCVCpuSupports(const CallExpr *E)
llvm::Value * EmitRISCVCpuInit()
llvm::Type * ConvertType(QualType T)
llvm::Value * EmitRISCVBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
llvm::Value * EmitRISCVCpuIs(const CallExpr *E)
LValue EmitAggExprToLValue(const Expr *E)
EmitAggExprToLValue - Emit the computation of the specified expression of aggregate type into a tempo...
ASTContext & getContext() const
static bool hasAggregateEvaluationKind(QualType T)
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
llvm::LLVMContext & getLLVMContext()
This class organizes the cross-function state that is used while generating LLVM code.
llvm::Constant * CreateRuntimeVariable(llvm::Type *Ty, StringRef Name)
Create a new runtime global variable with the specified type and name.
llvm::LLVMContext & getLLVMContext()
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
LValue - This represents an lvalue references.
Address getAddress() const
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
This represents one expression.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
@ Result
The result type of a method or function.
U cast(CodeGen::Address addr)
Diagnostic wrappers for TextAPI types for error reporting.
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * SizeTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * Int16Ty