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,
unsigned SegInstSEW) {
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,
unsigned SegInstSEW) {
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,
"");
95 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
102 std::swap(Ops[0], Ops[3]);
106 std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3);
109 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
112 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
114 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
115 return Builder.CreateCall(F, Ops,
"");
118static LLVM_ATTRIBUTE_NOINLINE
Value *
122 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
124 auto &CGM = CGF->
CGM;
127 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
129 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
132 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
135 Ops.insert(Ops.begin() + 2, llvm::Constant::getNullValue(ElemTy));
137 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
139 IntrinsicTypes = {ResultType, ElemTy, Ops[4]->getType()};
142 IntrinsicTypes = {ResultType, ElemTy, Ops[3]->getType()};
144 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
145 return Builder.CreateCall(F, Ops,
"");
148static LLVM_ATTRIBUTE_NOINLINE
Value *
152 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
154 auto &CGM = CGF->
CGM;
157 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
159 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
162 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
165 Ops.insert(Ops.begin() + 2, llvm::Constant::getAllOnesValue(ElemTy));
167 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
169 IntrinsicTypes = {ResultType, ElemTy, Ops[4]->getType()};
172 IntrinsicTypes = {ResultType, ElemTy, Ops[3]->getType()};
174 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
175 return Builder.CreateCall(F, Ops,
"");
178static LLVM_ATTRIBUTE_NOINLINE
Value *
182 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
184 auto &CGM = CGF->
CGM;
187 IntrinsicTypes = {ResultType, Ops[1]->getType()};
188 Ops.insert(Ops.begin() + 1, Ops[0]);
189 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
190 return Builder.CreateCall(F, Ops,
"");
196 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
198 auto &CGM = CGF->
CGM;
201 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
203 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
204 Ops.insert(Ops.begin() + 2, Ops[1]);
205 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
207 IntrinsicTypes = {ResultType, Ops[2]->getType(), Ops.back()->getType()};
210 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
212 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType()};
213 Ops.insert(Ops.begin() + 2, Ops[1]);
215 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
216 return Builder.CreateCall(F, Ops,
"");
219static LLVM_ATTRIBUTE_NOINLINE
Value *
223 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
225 auto &CGM = CGF->
CGM;
228 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
230 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
233 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
236 Ops.insert(Ops.begin() + 2, llvm::Constant::getNullValue(ElemTy));
238 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
240 IntrinsicTypes = {ResultType, Ops[1]->getType(), ElemTy, Ops[4]->getType()};
243 IntrinsicTypes = {ResultType, Ops[1]->getType(), ElemTy, Ops[3]->getType()};
245 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
246 return Builder.CreateCall(F, Ops,
"");
249static LLVM_ATTRIBUTE_NOINLINE
Value *
253 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
255 auto &CGM = CGF->
CGM;
258 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
260 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
263 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
265 Ops.insert(Ops.begin() + 2,
266 llvm::Constant::getNullValue(Ops.back()->getType()));
268 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
270 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[4]->getType(),
274 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[3]->getType(),
277 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
278 return Builder.CreateCall(F, Ops,
"");
281static LLVM_ATTRIBUTE_NOINLINE
Value *
285 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
287 auto &CGM = CGF->
CGM;
289 llvm::MDBuilder MDHelper(Context);
290 llvm::Metadata *OpsMD[] = {llvm::MDString::get(Context,
"vlenb")};
291 llvm::MDNode *RegName = llvm::MDNode::get(Context, OpsMD);
292 llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
294 CGM.getIntrinsic(llvm::Intrinsic::read_register, {CGF->
SizeTy});
295 return Builder.CreateCall(F, Metadata);
298static LLVM_ATTRIBUTE_NOINLINE
Value *
302 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
304 auto &CGM = CGF->
CGM;
306 return Builder.CreateCall(F, Ops,
"");
309static LLVM_ATTRIBUTE_NOINLINE
Value *
313 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
315 auto &CGM = CGF->
CGM;
320 std::swap(Ops[0], Ops[2]);
324 std::swap(Ops[0], Ops[1]);
327 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[3]->getType()};
329 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType()};
330 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
331 return Builder.CreateCall(F, Ops,
"");
337 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
339 auto &CGM = CGF->
CGM;
342 (IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) |
343 (!IsMasked && (PolicyAttrs &
RVV_VTA));
344 unsigned Offset = IsMasked ? NoPassthru ? 1 : 2 : NoPassthru ? 0 : 1;
346 IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops[0]->getType(),
347 Ops.back()->getType()};
349 IntrinsicTypes = {ResultType, Ops[Offset]->getType(),
350 Ops.back()->getType()};
352 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
354 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
356 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
357 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
358 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
359 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
360 if (ReturnValue.isNull())
362 return Builder.CreateStore(LoadValue, ReturnValue.getValue());
368 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
370 auto &CGM = CGF->
CGM;
379 std::swap(Ops[0], Ops[2]);
381 std::swap(Ops[0], Ops[1]);
382 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
384 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
387 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType()};
388 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
389 return Builder.CreateCall(F, Ops,
"");
395 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
397 auto &CGM = CGF->
CGM;
400 (IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) |
401 (!IsMasked && (PolicyAttrs &
RVV_VTA));
402 unsigned Offset = IsMasked ? NoPassthru ? 1 : 2 : NoPassthru ? 0 : 1;
404 IntrinsicTypes = {ResultType, Ops.back()->getType(), Ops[Offset]->getType(),
407 IntrinsicTypes = {ResultType, Ops.back()->getType(),
408 Ops[Offset]->getType()};
410 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
412 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
414 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
415 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
416 Value *NewVL = Ops[2];
417 Ops.erase(Ops.begin() + 2);
418 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
419 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
422 CGM.getNaturalPointeeTypeAlignment(E->
getArg(Offset + 1)->
getType());
423 llvm::Value *ReturnTuple = Builder.CreateExtractValue(LoadValue, 0);
425 llvm::Value *
V = Builder.CreateExtractValue(LoadValue, 1);
426 Builder.CreateStore(
V,
Address(NewVL,
V->getType(), Align));
427 if (ReturnValue.isNull())
429 return Builder.CreateStore(ReturnTuple, ReturnValue.getValue());
435 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
437 auto &CGM = CGF->
CGM;
440 (IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) |
441 (!IsMasked && (PolicyAttrs &
RVV_VTA));
442 unsigned Offset = IsMasked ? NoPassthru ? 1 : 2 : NoPassthru ? 0 : 1;
444 IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops.back()->getType(),
447 IntrinsicTypes = {ResultType, Ops[Offset]->getType(),
448 Ops.back()->getType()};
450 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
452 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
454 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
455 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
456 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
457 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
458 if (ReturnValue.isNull())
460 return Builder.CreateStore(LoadValue, ReturnValue.getValue());
466 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
468 auto &CGM = CGF->
CGM;
477 std::swap(Ops[0], Ops[3]);
479 std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3);
480 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
482 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[4]->getType(),
485 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[3]->getType()};
486 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
487 return Builder.CreateCall(F, Ops,
"");
490static LLVM_ATTRIBUTE_NOINLINE
Value *
494 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
496 auto &CGM = CGF->
CGM;
503 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
504 (!IsMasked && PolicyAttrs &
RVV_VTA));
507 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
510 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
513 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
515 llvm::Function *F = CGM.getIntrinsic(
516 ID, {ResultType, Ops[2]->getType(), Ops.back()->getType()});
517 return Builder.CreateCall(F, Ops,
"");
523 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
525 auto &CGM = CGF->
CGM;
532 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
533 (!IsMasked && PolicyAttrs &
RVV_VTA));
536 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
539 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
542 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
545 CGM.getIntrinsic(ID, {ResultType, Ops[1]->getType(), Ops[2]->getType(),
546 Ops.back()->getType()});
547 return Builder.CreateCall(F, Ops,
"");
553 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
555 auto &CGM = CGF->
CGM;
561 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
562 (!IsMasked && PolicyAttrs &
RVV_VTA));
563 bool HasRoundModeOp =
564 IsMasked ? (HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5)
565 : (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
568 Ops.insert(Ops.end() - 1,
569 ConstantInt::get(Ops.back()->getType(), 7));
572 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
575 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
578 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
580 llvm::Function *F = CGM.getIntrinsic(
581 ID, {ResultType, Ops[2]->getType(), Ops.back()->getType()});
582 return Builder.CreateCall(F, Ops,
"");
588 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
590 auto &CGM = CGF->
CGM;
596 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
597 (!IsMasked && PolicyAttrs &
RVV_VTA));
598 bool HasRoundModeOp =
599 IsMasked ? (HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5)
600 : (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
603 Ops.insert(Ops.end() - 1,
604 ConstantInt::get(Ops.back()->getType(), 7));
607 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
610 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
613 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
616 CGM.getIntrinsic(ID, {ResultType, Ops[1]->getType(), Ops[2]->getType(),
617 Ops.back()->getType()});
618 return Builder.CreateCall(F, Ops,
"");
624 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
626 auto &CGM = CGF->
CGM;
630 (IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) |
631 (!IsMasked && (PolicyAttrs &
RVV_VTA));
634 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 1);
636 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
639 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
640 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
643 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType(),
644 Ops[3]->getType(), Ops[4]->getType()};
646 IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType(),
648 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
649 llvm::Value *LoadValue = Builder.CreateCall(F, Ops,
"");
651 if (ReturnValue.isNull())
653 return Builder.CreateStore(LoadValue, ReturnValue.getValue());
659 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
661 auto &CGM = CGF->
CGM;
671 std::swap(Ops[0], Ops[3]);
673 std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3);
675 Ops.push_back(ConstantInt::get(Ops.back()->getType(), SegInstSEW));
678 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
679 Ops[3]->getType(), Ops[4]->getType()};
681 IntrinsicTypes = {Ops[0]->getType(), Ops[1]->getType(), Ops[2]->getType(),
683 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
684 return Builder.CreateCall(F, Ops,
"");
687static LLVM_ATTRIBUTE_NOINLINE
Value *
691 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
693 auto &CGM = CGF->
CGM;
700 bool HasRoundModeOp = IsMasked ? Ops.size() == 6 : Ops.size() == 5;
703 Ops.insert(Ops.end() - 1,
704 ConstantInt::get(Ops.back()->getType(), 7));
707 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
709 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
711 llvm::Function *F = CGM.getIntrinsic(
712 ID, {ResultType, Ops[1]->getType(), Ops.back()->getType()});
713 return Builder.CreateCall(F, Ops,
"");
716static LLVM_ATTRIBUTE_NOINLINE
Value *
720 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
722 auto &CGM = CGF->
CGM;
728 bool HasRoundModeOp = IsMasked ? Ops.size() == 6 : Ops.size() == 5;
731 Ops.insert(Ops.end() - 1,
732 ConstantInt::get(Ops.back()->getType(), 7));
735 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.begin() + 4);
737 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
740 CGM.getIntrinsic(ID, {ResultType, Ops[1]->getType(), Ops[2]->getType(),
741 Ops.back()->getType()});
742 return Builder.CreateCall(F, Ops,
"");
748 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
750 auto &CGM = CGF->
CGM;
757 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
758 (!IsMasked && PolicyAttrs &
RVV_VTA));
759 bool HasRoundModeOp =
760 IsMasked ? (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4)
761 : (HasMaskedOff ? Ops.size() == 4 : Ops.size() == 3);
764 Ops.insert(Ops.end() - 1,
765 ConstantInt::get(Ops.back()->getType(), 7));
768 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
771 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
774 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
776 IntrinsicTypes = {ResultType, Ops.back()->getType()};
777 llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
778 return Builder.CreateCall(F, Ops,
"");
784 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
786 auto &CGM = CGF->
CGM;
791 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
792 (!IsMasked && PolicyAttrs &
RVV_VTA));
793 bool HasRoundModeOp =
794 IsMasked ? (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4)
795 : (HasMaskedOff ? Ops.size() == 4 : Ops.size() == 3);
798 Ops.insert(Ops.end() - 1,
799 ConstantInt::get(Ops.back()->getType(), 7));
802 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
805 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
808 Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
810 llvm::Function *F = CGM.getIntrinsic(
811 ID, {ResultType, Ops[1]->getType(), Ops.back()->getType()});
812 return Builder.CreateCall(F, Ops,
"");
818 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
820 auto &CGM = CGF->
CGM;
826 !((IsMasked && (PolicyAttrs &
RVV_VTA) && (PolicyAttrs &
RVV_VMA)) ||
827 (!IsMasked && PolicyAttrs &
RVV_VTA));
828 bool HasRoundModeOp =
829 IsMasked ? (HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5)
830 : (HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
833 Ops.insert(Ops.end() - 1,
834 ConstantInt::get(Ops.back()->getType(), 7));
837 std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
840 Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
842 llvm::Function *F = CGM.getIntrinsic(
843 ID, {ResultType, Ops[1]->getType(), Ops.back()->getType()});
844 return Builder.CreateCall(F, Ops,
"");
847static LLVM_ATTRIBUTE_NOINLINE
Value *
851 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
853 auto &CGM = CGF->
CGM;
855 if (ResultType->isIntOrIntVectorTy(1) ||
856 Ops[0]->getType()->isIntOrIntVectorTy(1)) {
860 LLVMContext &Context = CGM.getLLVMContext();
861 ScalableVectorType *Boolean64Ty =
862 ScalableVectorType::get(llvm::Type::getInt1Ty(Context), 64);
864 if (ResultType->isIntOrIntVectorTy(1)) {
869 llvm::Value *BitCast = Builder.CreateBitCast(Ops[0], Boolean64Ty);
870 return Builder.CreateExtractVector(ResultType, BitCast,
871 ConstantInt::get(CGF->
Int64Ty, 0));
877 llvm::Value *Boolean64Val = Builder.CreateInsertVector(
878 Boolean64Ty, llvm::PoisonValue::get(Boolean64Ty), Ops[0],
879 ConstantInt::get(CGF->
Int64Ty, 0));
880 return Builder.CreateBitCast(Boolean64Val, ResultType);
883 return Builder.CreateBitCast(Ops[0], ResultType);
886static LLVM_ATTRIBUTE_NOINLINE
Value *
890 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
893 if (
auto *OpVecTy = dyn_cast<ScalableVectorType>(Ops[0]->
getType())) {
895 OpVecTy->getMinNumElements() / VecTy->getMinNumElements();
896 assert(isPowerOf2_32(MaxIndex));
898 Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
899 Ops[1] = Builder.CreateAnd(Ops[1], MaxIndex - 1);
901 Builder.CreateMul(Ops[1], ConstantInt::get(Ops[1]->
getType(),
902 VecTy->getMinNumElements()));
903 return Builder.CreateExtractVector(ResultType, Ops[0], Ops[1]);
906 return Builder.CreateIntrinsic(
907 Intrinsic::riscv_tuple_extract, {ResultType, Ops[0]->getType()},
908 {Ops[0], Builder.CreateTrunc(Ops[1], Builder.getInt32Ty())});
911static LLVM_ATTRIBUTE_NOINLINE
Value *
915 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
917 if (
auto *ResVecTy = dyn_cast<ScalableVectorType>(ResultType)) {
920 ResVecTy->getMinNumElements() / VecTy->getMinNumElements();
921 assert(isPowerOf2_32(MaxIndex));
923 Ops[1] = Builder.CreateZExt(Ops[1], Builder.getInt64Ty());
924 Ops[1] = Builder.CreateAnd(Ops[1], MaxIndex - 1);
926 Builder.CreateMul(Ops[1], ConstantInt::get(Ops[1]->
getType(),
927 VecTy->getMinNumElements()));
928 return Builder.CreateInsertVector(ResultType, Ops[0], Ops[2], Ops[1]);
931 return Builder.CreateIntrinsic(
932 Intrinsic::riscv_tuple_insert, {ResultType, Ops[2]->getType()},
933 {Ops[0], Ops[2], Builder.CreateTrunc(Ops[1], Builder.getInt32Ty())});
936static LLVM_ATTRIBUTE_NOINLINE
Value *
940 int PolicyAttrs,
bool IsMasked,
unsigned SegInstSEW) {
942 llvm::Value *ReturnVector = llvm::PoisonValue::get(ResultType);
944 for (
unsigned I = 0, N = Ops.size(); I < N; ++I) {
946 llvm::Value *Idx = ConstantInt::get(Builder.getInt64Ty(),
947 VecTy->getMinNumElements() * I);
949 Builder.CreateInsertVector(ResultType, ReturnVector, Ops[I], Idx);
951 llvm::Value *Idx = ConstantInt::get(Builder.getInt32Ty(), I);
952 ReturnVector = Builder.CreateIntrinsic(Intrinsic::riscv_tuple_insert,
953 {ResultType, Ops[I]->getType()},
954 {ReturnVector, Ops[I], Idx});
961 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy, {
VoidPtrTy},
false);
962 llvm::FunctionCallee
Func =
963 CGM.CreateRuntimeFunction(FTy,
"__init_riscv_feature_bits");
965 CalleeGV->setDSOLocal(
true);
966 CalleeGV->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
974 if (!
getContext().getTargetInfo().validateCpuSupports(FeatureStr))
982 llvm::Type *Int32Ty = Builder.getInt32Ty();
983 llvm::Type *Int64Ty = Builder.getInt64Ty();
984 llvm::ArrayType *ArrayOfInt64Ty =
985 llvm::ArrayType::get(Int64Ty, llvm::RISCVISAInfo::FeatureBitSize);
986 llvm::Type *StructTy = llvm::StructType::get(Int32Ty, ArrayOfInt64Ty);
987 llvm::Constant *RISCVFeaturesBits =
990 Value *IndexVal = llvm::ConstantInt::get(Int32Ty, Index);
991 llvm::Value *GEPIndices[] = {Builder.getInt32(0), Builder.getInt32(1),
994 Builder.CreateInBoundsGEP(StructTy, RISCVFeaturesBits, GEPIndices);
1001 const unsigned RISCVFeatureLength = llvm::RISCVISAInfo::FeatureBitSize;
1002 uint64_t RequireBitMasks[RISCVFeatureLength] = {0};
1004 for (
auto Feat : FeaturesStrs) {
1005 auto [GroupID, BitPos] = RISCVISAInfo::getRISCVFeaturesBitsInfo(Feat);
1012 RequireBitMasks[GroupID] |= (1ULL << BitPos);
1016 for (
unsigned Idx = 0; Idx < RISCVFeatureLength; Idx++) {
1017 if (RequireBitMasks[Idx] == 0)
1027 assert(
Result &&
"Should have value here.");
1042 llvm::Constant *RISCVCPUModel =
1043 CGM.CreateRuntimeVariable(StructTy,
"__riscv_cpu_model");
1046 auto loadRISCVCPUID = [&](
unsigned Index) {
1047 Value *Ptr =
Builder.CreateStructGEP(StructTy, RISCVCPUModel, Index);
1048 Value *CPUID =
Builder.CreateAlignedLoad(StructTy->getTypeAtIndex(Index),
1049 Ptr, llvm::MaybeAlign());
1053 const llvm::RISCV::CPUModel Model = llvm::RISCV::getCPUModel(CPUStr);
1056 Value *VendorID = loadRISCVCPUID(0);
1058 Builder.CreateICmpEQ(VendorID,
Builder.getInt32(Model.MVendorID));
1061 Value *ArchID = loadRISCVCPUID(1);
1066 Value *ImpID = loadRISCVCPUID(2);
1077 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
1079 if (BuiltinID == Builtin::BI__builtin_cpu_init)
1081 if (BuiltinID == Builtin::BI__builtin_cpu_is)
1088 unsigned ICEArguments = 0;
1096 if (BuiltinID == RISCVVector::BI__builtin_rvv_vget_v ||
1097 BuiltinID == RISCVVector::BI__builtin_rvv_vset_v)
1098 ICEArguments = 1 << 1;
1103 if (BuiltinID == RISCV::BI__builtin_riscv_ntl_load)
1104 ICEArguments |= (1 << 1);
1105 if (BuiltinID == RISCV::BI__builtin_riscv_ntl_store)
1106 ICEArguments |= (1 << 2);
1108 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; i++) {
1113 Ops.push_back(AggValue);
1119 Intrinsic::ID ID = Intrinsic::not_intrinsic;
1120 int PolicyAttrs = 0;
1121 bool IsMasked =
false;
1123 unsigned SegInstSEW = 8;
1127 switch (BuiltinID) {
1128 default: llvm_unreachable(
"unexpected builtin ID");
1129 case RISCV::BI__builtin_riscv_orc_b_32:
1130 case RISCV::BI__builtin_riscv_orc_b_64:
1131 case RISCV::BI__builtin_riscv_clmul_32:
1132 case RISCV::BI__builtin_riscv_clmul_64:
1133 case RISCV::BI__builtin_riscv_clmulh_32:
1134 case RISCV::BI__builtin_riscv_clmulh_64:
1135 case RISCV::BI__builtin_riscv_clmulr_32:
1136 case RISCV::BI__builtin_riscv_clmulr_64:
1137 case RISCV::BI__builtin_riscv_xperm4_32:
1138 case RISCV::BI__builtin_riscv_xperm4_64:
1139 case RISCV::BI__builtin_riscv_xperm8_32:
1140 case RISCV::BI__builtin_riscv_xperm8_64:
1141 case RISCV::BI__builtin_riscv_brev8_32:
1142 case RISCV::BI__builtin_riscv_brev8_64:
1143 case RISCV::BI__builtin_riscv_zip_32:
1144 case RISCV::BI__builtin_riscv_unzip_32: {
1145 switch (BuiltinID) {
1146 default: llvm_unreachable(
"unexpected builtin ID");
1148 case RISCV::BI__builtin_riscv_orc_b_32:
1149 case RISCV::BI__builtin_riscv_orc_b_64:
1150 ID = Intrinsic::riscv_orc_b;
1154 case RISCV::BI__builtin_riscv_clmul_32:
1155 case RISCV::BI__builtin_riscv_clmul_64:
1156 ID = Intrinsic::riscv_clmul;
1158 case RISCV::BI__builtin_riscv_clmulh_32:
1159 case RISCV::BI__builtin_riscv_clmulh_64:
1160 ID = Intrinsic::riscv_clmulh;
1162 case RISCV::BI__builtin_riscv_clmulr_32:
1163 case RISCV::BI__builtin_riscv_clmulr_64:
1164 ID = Intrinsic::riscv_clmulr;
1168 case RISCV::BI__builtin_riscv_xperm8_32:
1169 case RISCV::BI__builtin_riscv_xperm8_64:
1170 ID = Intrinsic::riscv_xperm8;
1172 case RISCV::BI__builtin_riscv_xperm4_32:
1173 case RISCV::BI__builtin_riscv_xperm4_64:
1174 ID = Intrinsic::riscv_xperm4;
1178 case RISCV::BI__builtin_riscv_brev8_32:
1179 case RISCV::BI__builtin_riscv_brev8_64:
1180 ID = Intrinsic::riscv_brev8;
1182 case RISCV::BI__builtin_riscv_zip_32:
1183 ID = Intrinsic::riscv_zip;
1185 case RISCV::BI__builtin_riscv_unzip_32:
1186 ID = Intrinsic::riscv_unzip;
1190 IntrinsicTypes = {ResultType};
1197 case RISCV::BI__builtin_riscv_sha256sig0:
1198 ID = Intrinsic::riscv_sha256sig0;
1200 case RISCV::BI__builtin_riscv_sha256sig1:
1201 ID = Intrinsic::riscv_sha256sig1;
1203 case RISCV::BI__builtin_riscv_sha256sum0:
1204 ID = Intrinsic::riscv_sha256sum0;
1206 case RISCV::BI__builtin_riscv_sha256sum1:
1207 ID = Intrinsic::riscv_sha256sum1;
1211 case RISCV::BI__builtin_riscv_sm4ks:
1212 ID = Intrinsic::riscv_sm4ks;
1214 case RISCV::BI__builtin_riscv_sm4ed:
1215 ID = Intrinsic::riscv_sm4ed;
1219 case RISCV::BI__builtin_riscv_sm3p0:
1220 ID = Intrinsic::riscv_sm3p0;
1222 case RISCV::BI__builtin_riscv_sm3p1:
1223 ID = Intrinsic::riscv_sm3p1;
1226 case RISCV::BI__builtin_riscv_clz_32:
1227 case RISCV::BI__builtin_riscv_clz_64: {
1230 if (
Result->getType() != ResultType)
1235 case RISCV::BI__builtin_riscv_ctz_32:
1236 case RISCV::BI__builtin_riscv_ctz_64: {
1239 if (
Result->getType() != ResultType)
1246 case RISCV::BI__builtin_riscv_ntl_load: {
1248 unsigned DomainVal = 5;
1249 if (Ops.size() == 2)
1252 llvm::MDNode *RISCVDomainNode = llvm::MDNode::get(
1254 llvm::ConstantAsMetadata::get(
Builder.getInt32(DomainVal)));
1255 llvm::MDNode *NontemporalNode = llvm::MDNode::get(
1259 if(ResTy->isScalableTy()) {
1261 llvm::Type *ScalarTy = ResTy->getScalarType();
1262 Width = ScalarTy->getPrimitiveSizeInBits() *
1263 SVTy->getElementCount().getKnownMinValue();
1265 Width = ResTy->getPrimitiveSizeInBits();
1266 LoadInst *Load =
Builder.CreateLoad(
1269 Load->setMetadata(llvm::LLVMContext::MD_nontemporal, NontemporalNode);
1270 Load->setMetadata(
CGM.getModule().getMDKindID(
"riscv-nontemporal-domain"),
1275 case RISCV::BI__builtin_riscv_ntl_store: {
1276 unsigned DomainVal = 5;
1277 if (Ops.size() == 3)
1280 llvm::MDNode *RISCVDomainNode = llvm::MDNode::get(
1282 llvm::ConstantAsMetadata::get(
Builder.getInt32(DomainVal)));
1283 llvm::MDNode *NontemporalNode = llvm::MDNode::get(
1286 StoreInst *Store =
Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);
1287 Store->setMetadata(llvm::LLVMContext::MD_nontemporal, NontemporalNode);
1288 Store->setMetadata(
CGM.getModule().getMDKindID(
"riscv-nontemporal-domain"),
1294 case RISCV::BI__builtin_riscv_pause: {
1295 llvm::Function *Fn =
CGM.getIntrinsic(llvm::Intrinsic::riscv_pause);
1296 return Builder.CreateCall(Fn, {});
1300 case RISCV::BI__builtin_riscv_cv_alu_addN:
1301 ID = Intrinsic::riscv_cv_alu_addN;
1303 case RISCV::BI__builtin_riscv_cv_alu_addRN:
1304 ID = Intrinsic::riscv_cv_alu_addRN;
1306 case RISCV::BI__builtin_riscv_cv_alu_adduN:
1307 ID = Intrinsic::riscv_cv_alu_adduN;
1309 case RISCV::BI__builtin_riscv_cv_alu_adduRN:
1310 ID = Intrinsic::riscv_cv_alu_adduRN;
1312 case RISCV::BI__builtin_riscv_cv_alu_clip:
1313 ID = Intrinsic::riscv_cv_alu_clip;
1315 case RISCV::BI__builtin_riscv_cv_alu_clipu:
1316 ID = Intrinsic::riscv_cv_alu_clipu;
1318 case RISCV::BI__builtin_riscv_cv_alu_extbs:
1321 case RISCV::BI__builtin_riscv_cv_alu_extbz:
1324 case RISCV::BI__builtin_riscv_cv_alu_exths:
1327 case RISCV::BI__builtin_riscv_cv_alu_exthz:
1330 case RISCV::BI__builtin_riscv_cv_alu_sle:
1333 case RISCV::BI__builtin_riscv_cv_alu_sleu:
1336 case RISCV::BI__builtin_riscv_cv_alu_subN:
1337 ID = Intrinsic::riscv_cv_alu_subN;
1339 case RISCV::BI__builtin_riscv_cv_alu_subRN:
1340 ID = Intrinsic::riscv_cv_alu_subRN;
1342 case RISCV::BI__builtin_riscv_cv_alu_subuN:
1343 ID = Intrinsic::riscv_cv_alu_subuN;
1345 case RISCV::BI__builtin_riscv_cv_alu_subuRN:
1346 ID = Intrinsic::riscv_cv_alu_subuRN;
1350 case RISCV::BI__builtin_riscv_nds_fcvt_s_bf16:
1352 case RISCV::BI__builtin_riscv_nds_fcvt_bf16_s:
1356#include "clang/Basic/riscv_vector_builtin_cg.inc"
1359#include "clang/Basic/riscv_sifive_vector_builtin_cg.inc"
1362#include "clang/Basic/riscv_andes_vector_builtin_cg.inc"
1365 assert(ID != Intrinsic::not_intrinsic);
1367 llvm::Function *F =
CGM.getIntrinsic(ID, IntrinsicTypes);
1368 return Builder.CreateCall(F, Ops,
"");
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, unsigned SegInstSEW)
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 * emitRVVFMABuiltin(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 * emitRVVPseudoVWCVTBuiltin(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 * emitRVVPseudoVNCVTBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
static constexpr unsigned RVV_VMA
static Value * loadRISCVFeatureBits(unsigned Index, CGBuilderTy &Builder, CodeGenModule &CGM)
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, unsigned SegInstSEW)
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, 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, unsigned SegInstSEW)
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 * 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 * emitRVVReinterpretBuiltin(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, 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, 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, unsigned SegInstSEW)
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 * 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 * emitRVVVLEFFBuiltin(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 * emitRVVIndexedStoreBuiltin(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 * emitRVVPseudoMaskBuiltin(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 * emitRVVFloatingReductionBuiltin(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 * 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 * emitRVVPseudoUnaryBuiltin(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 * emitRVVFloatingUnaryBuiltin(CodeGenFunction *CGF, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Type *ResultType, Intrinsic::ID ID, SmallVectorImpl< Value * > &Ops, int PolicyAttrs, bool IsMasked, unsigned SegInstSEW)
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, 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, unsigned SegInstSEW)
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, unsigned SegInstSEW)
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, unsigned SegInstSEW)
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, unsigned SegInstSEW)
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, unsigned SegInstSEW)
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, unsigned SegInstSEW)
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, unsigned SegInstSEW)
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)
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