24 #define DEBUG_TYPE "nvptx-isel"
30 cl::desc(
"NVPTX Specific: FMA contraction (0: don't do it"
31 " 1: do it 2: do it aggressively"),
36 cl::desc(
"NVPTX Specifies: 0 use div.approx, 1 use div.full, 2 use"
37 " IEEE Compliant F32 div.rnd if avaiable."),
42 cl::desc(
"NVPTX Specific: 0 use sqrt.approx, 1 use sqrt.rn."),
47 cl::desc(
"NVPTX Specific: Flush f32 subnormals to sign-preserving zero."),
55 return new NVPTXDAGToDAGISel(TM, OptLevel);
63 doFMAF32 = (OptLevel > 0) && Subtarget.hasFMAF32() && (
FMAContractLevel >= 1);
64 doFMAF64 = (OptLevel > 0) && Subtarget.hasFMAF64() && (
FMAContractLevel >= 1);
72 doMulWide = (OptLevel > 0);
75 int NVPTXDAGToDAGISel::getDivF32Level()
const {
81 if (
TM.Options.UnsafeFPMath)
88 bool NVPTXDAGToDAGISel::usePrecSqrtF32()
const {
94 if (
TM.Options.UnsafeFPMath)
101 bool NVPTXDAGToDAGISel::useF32FTZ()
const {
129 ResNode = SelectLoad(N);
132 ResNode = SelectStore(N);
136 ResNode = SelectLoadVector(N);
142 ResNode = SelectLDGLDUVector(N);
146 ResNode = SelectStoreVector(N);
151 ResNode = SelectLoadParam(N);
156 ResNode = SelectStoreRetval(N);
163 ResNode = SelectStoreParam(N);
170 return SelectCode(N);
181 switch (PT->getAddressSpace()) {
204 if (!LoadedVT.isSimple())
219 MVT SimpleVT = LoadedVT.getSimpleVT();
239 unsigned fromTypeWidth = std::max(8U, ScalarVT.
getSizeInBits());
240 unsigned int fromType;
256 if (SelectDirectAddr(N1, Addr)) {
259 Opcode = NVPTX::LD_i8_avar;
262 Opcode = NVPTX::LD_i16_avar;
265 Opcode = NVPTX::LD_i32_avar;
268 Opcode = NVPTX::LD_i64_avar;
271 Opcode = NVPTX::LD_f32_avar;
274 Opcode = NVPTX::LD_f64_avar;
279 SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
280 getI32Imm(vecType), getI32Imm(fromType),
281 getI32Imm(fromTypeWidth), Addr, Chain };
282 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
283 }
else if (Subtarget.is64Bit()
284 ? SelectADDRsi64(N1.
getNode(), N1, Base, Offset)
285 : SelectADDRsi(N1.
getNode(), N1, Base, Offset)) {
288 Opcode = NVPTX::LD_i8_asi;
291 Opcode = NVPTX::LD_i16_asi;
294 Opcode = NVPTX::LD_i32_asi;
297 Opcode = NVPTX::LD_i64_asi;
300 Opcode = NVPTX::LD_f32_asi;
303 Opcode = NVPTX::LD_f64_asi;
308 SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
309 getI32Imm(vecType), getI32Imm(fromType),
310 getI32Imm(fromTypeWidth), Base, Offset, Chain };
311 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
312 }
else if (Subtarget.is64Bit()
313 ? SelectADDRri64(N1.
getNode(), N1, Base, Offset)
314 : SelectADDRri(N1.
getNode(), N1, Base, Offset)) {
315 if (Subtarget.is64Bit()) {
318 Opcode = NVPTX::LD_i8_ari_64;
321 Opcode = NVPTX::LD_i16_ari_64;
324 Opcode = NVPTX::LD_i32_ari_64;
327 Opcode = NVPTX::LD_i64_ari_64;
330 Opcode = NVPTX::LD_f32_ari_64;
333 Opcode = NVPTX::LD_f64_ari_64;
341 Opcode = NVPTX::LD_i8_ari;
344 Opcode = NVPTX::LD_i16_ari;
347 Opcode = NVPTX::LD_i32_ari;
350 Opcode = NVPTX::LD_i64_ari;
353 Opcode = NVPTX::LD_f32_ari;
356 Opcode = NVPTX::LD_f64_ari;
362 SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
363 getI32Imm(vecType), getI32Imm(fromType),
364 getI32Imm(fromTypeWidth), Base, Offset, Chain };
365 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
367 if (Subtarget.is64Bit()) {
370 Opcode = NVPTX::LD_i8_areg_64;
373 Opcode = NVPTX::LD_i16_areg_64;
376 Opcode = NVPTX::LD_i32_areg_64;
379 Opcode = NVPTX::LD_i64_areg_64;
382 Opcode = NVPTX::LD_f32_areg_64;
385 Opcode = NVPTX::LD_f64_areg_64;
393 Opcode = NVPTX::LD_i8_areg;
396 Opcode = NVPTX::LD_i16_areg;
399 Opcode = NVPTX::LD_i32_areg;
402 Opcode = NVPTX::LD_i64_areg;
405 Opcode = NVPTX::LD_f32_areg;
408 Opcode = NVPTX::LD_f64_areg;
414 SDValue Ops[] = { getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
415 getI32Imm(vecType), getI32Imm(fromType),
416 getI32Imm(fromTypeWidth), N1, Chain };
417 NVPTXLD = CurDAG->getMachineNode(Opcode, dl, TargetVT, MVT::Other, Ops);
420 if (NVPTXLD != NULL) {
422 MemRefs0[0] = cast<MemSDNode>(
N)->getMemOperand();
423 cast<MachineSDNode>(NVPTXLD)->setMemRefs(MemRefs0, MemRefs0 + 1);
429 SDNode *NVPTXDAGToDAGISel::SelectLoadVector(
SDNode *N) {
440 if (!LoadedVT.isSimple())
455 MVT SimpleVT = LoadedVT.getSimpleVT();
465 unsigned FromTypeWidth = std::max(8U, ScalarVT.
getSizeInBits());
468 unsigned ExtensionType = cast<ConstantSDNode>(
492 if (SelectDirectAddr(Op1, Addr)) {
501 Opcode = NVPTX::LDV_i8_v2_avar;
504 Opcode = NVPTX::LDV_i16_v2_avar;
507 Opcode = NVPTX::LDV_i32_v2_avar;
510 Opcode = NVPTX::LDV_i64_v2_avar;
513 Opcode = NVPTX::LDV_f32_v2_avar;
516 Opcode = NVPTX::LDV_f64_v2_avar;
525 Opcode = NVPTX::LDV_i8_v4_avar;
528 Opcode = NVPTX::LDV_i16_v4_avar;
531 Opcode = NVPTX::LDV_i32_v4_avar;
534 Opcode = NVPTX::LDV_f32_v4_avar;
540 SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
541 getI32Imm(VecType), getI32Imm(FromType),
542 getI32Imm(FromTypeWidth), Addr, Chain };
543 LD = CurDAG->getMachineNode(Opcode, DL, N->
getVTList(), Ops);
544 }
else if (Subtarget.is64Bit()
545 ? SelectADDRsi64(Op1.
getNode(), Op1, Base, Offset)
546 : SelectADDRsi(Op1.
getNode(), Op1, Base, Offset)) {
555 Opcode = NVPTX::LDV_i8_v2_asi;
558 Opcode = NVPTX::LDV_i16_v2_asi;
561 Opcode = NVPTX::LDV_i32_v2_asi;
564 Opcode = NVPTX::LDV_i64_v2_asi;
567 Opcode = NVPTX::LDV_f32_v2_asi;
570 Opcode = NVPTX::LDV_f64_v2_asi;
579 Opcode = NVPTX::LDV_i8_v4_asi;
582 Opcode = NVPTX::LDV_i16_v4_asi;
585 Opcode = NVPTX::LDV_i32_v4_asi;
588 Opcode = NVPTX::LDV_f32_v4_asi;
594 SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
595 getI32Imm(VecType), getI32Imm(FromType),
596 getI32Imm(FromTypeWidth), Base, Offset, Chain };
597 LD = CurDAG->getMachineNode(Opcode, DL, N->
getVTList(), Ops);
598 }
else if (Subtarget.is64Bit()
599 ? SelectADDRri64(Op1.
getNode(), Op1, Base, Offset)
600 : SelectADDRri(Op1.
getNode(), Op1, Base, Offset)) {
601 if (Subtarget.is64Bit()) {
610 Opcode = NVPTX::LDV_i8_v2_ari_64;
613 Opcode = NVPTX::LDV_i16_v2_ari_64;
616 Opcode = NVPTX::LDV_i32_v2_ari_64;
619 Opcode = NVPTX::LDV_i64_v2_ari_64;
622 Opcode = NVPTX::LDV_f32_v2_ari_64;
625 Opcode = NVPTX::LDV_f64_v2_ari_64;
634 Opcode = NVPTX::LDV_i8_v4_ari_64;
637 Opcode = NVPTX::LDV_i16_v4_ari_64;
640 Opcode = NVPTX::LDV_i32_v4_ari_64;
643 Opcode = NVPTX::LDV_f32_v4_ari_64;
657 Opcode = NVPTX::LDV_i8_v2_ari;
660 Opcode = NVPTX::LDV_i16_v2_ari;
663 Opcode = NVPTX::LDV_i32_v2_ari;
666 Opcode = NVPTX::LDV_i64_v2_ari;
669 Opcode = NVPTX::LDV_f32_v2_ari;
672 Opcode = NVPTX::LDV_f64_v2_ari;
681 Opcode = NVPTX::LDV_i8_v4_ari;
684 Opcode = NVPTX::LDV_i16_v4_ari;
687 Opcode = NVPTX::LDV_i32_v4_ari;
690 Opcode = NVPTX::LDV_f32_v4_ari;
697 SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
698 getI32Imm(VecType), getI32Imm(FromType),
699 getI32Imm(FromTypeWidth), Base, Offset, Chain };
701 LD = CurDAG->getMachineNode(Opcode, DL, N->
getVTList(), Ops);
703 if (Subtarget.is64Bit()) {
712 Opcode = NVPTX::LDV_i8_v2_areg_64;
715 Opcode = NVPTX::LDV_i16_v2_areg_64;
718 Opcode = NVPTX::LDV_i32_v2_areg_64;
721 Opcode = NVPTX::LDV_i64_v2_areg_64;
724 Opcode = NVPTX::LDV_f32_v2_areg_64;
727 Opcode = NVPTX::LDV_f64_v2_areg_64;
736 Opcode = NVPTX::LDV_i8_v4_areg_64;
739 Opcode = NVPTX::LDV_i16_v4_areg_64;
742 Opcode = NVPTX::LDV_i32_v4_areg_64;
745 Opcode = NVPTX::LDV_f32_v4_areg_64;
759 Opcode = NVPTX::LDV_i8_v2_areg;
762 Opcode = NVPTX::LDV_i16_v2_areg;
765 Opcode = NVPTX::LDV_i32_v2_areg;
768 Opcode = NVPTX::LDV_i64_v2_areg;
771 Opcode = NVPTX::LDV_f32_v2_areg;
774 Opcode = NVPTX::LDV_f64_v2_areg;
783 Opcode = NVPTX::LDV_i8_v4_areg;
786 Opcode = NVPTX::LDV_i16_v4_areg;
789 Opcode = NVPTX::LDV_i32_v4_areg;
792 Opcode = NVPTX::LDV_f32_v4_areg;
799 SDValue Ops[] = { getI32Imm(IsVolatile), getI32Imm(CodeAddrSpace),
800 getI32Imm(VecType), getI32Imm(FromType),
801 getI32Imm(FromTypeWidth), Op1, Chain };
802 LD = CurDAG->getMachineNode(Opcode, DL, N->
getVTList(), Ops);
806 MemRefs0[0] = cast<MemSDNode>(
N)->getMemOperand();
807 cast<MachineSDNode>(
LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
812 SDNode *NVPTXDAGToDAGISel::SelectLDGLDUVector(
SDNode *N) {
824 if (SelectDirectAddr(Op1, Addr)) {
833 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_avar;
836 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_avar;
839 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_avar;
842 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_avar;
845 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_avar;
848 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_avar;
857 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_avar;
860 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_avar;
863 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_avar;
866 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_avar;
869 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_avar;
872 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_avar;
881 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_avar;
884 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_avar;
887 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_avar;
890 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_avar;
899 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_avar;
902 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_avar;
905 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_avar;
908 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_avar;
914 SDValue Ops[] = { Addr, Chain };
915 LD = CurDAG->getMachineNode(Opcode, DL, N->
getVTList(),
917 }
else if (Subtarget.is64Bit()
918 ? SelectADDRri64(Op1.
getNode(), Op1, Base, Offset)
919 : SelectADDRri(Op1.
getNode(), Op1, Base, Offset)) {
920 if (Subtarget.is64Bit()) {
929 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari64;
932 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari64;
935 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari64;
938 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari64;
941 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari64;
944 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari64;
953 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari64;
956 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari64;
959 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari64;
962 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari64;
965 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari64;
968 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari64;
977 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari64;
980 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari64;
983 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari64;
986 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari64;
995 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari64;
998 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari64;
1001 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari64;
1004 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari64;
1018 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_ari32;
1021 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_ari32;
1024 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_ari32;
1027 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_ari32;
1030 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_ari32;
1033 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_ari32;
1042 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_ari32;
1045 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_ari32;
1048 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_ari32;
1051 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_ari32;
1054 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_ari32;
1057 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_ari32;
1066 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_ari32;
1069 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_ari32;
1072 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_ari32;
1075 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_ari32;
1084 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_ari32;
1087 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_ari32;
1090 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_ari32;
1093 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_ari32;
1100 SDValue Ops[] = { Base, Offset, Chain };
1102 LD = CurDAG->getMachineNode(Opcode, DL, N->
getVTList(),
1105 if (Subtarget.is64Bit()) {
1114 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg64;
1117 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg64;
1120 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg64;
1123 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg64;
1126 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg64;
1129 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg64;
1138 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg64;
1141 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg64;
1144 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg64;
1147 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg64;
1150 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg64;
1153 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg64;
1162 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg64;
1165 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg64;
1168 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg64;
1171 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg64;
1180 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg64;
1183 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg64;
1186 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg64;
1189 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg64;
1203 Opcode = NVPTX::INT_PTX_LDG_G_v2i8_ELE_areg32;
1206 Opcode = NVPTX::INT_PTX_LDG_G_v2i16_ELE_areg32;
1209 Opcode = NVPTX::INT_PTX_LDG_G_v2i32_ELE_areg32;
1212 Opcode = NVPTX::INT_PTX_LDG_G_v2i64_ELE_areg32;
1215 Opcode = NVPTX::INT_PTX_LDG_G_v2f32_ELE_areg32;
1218 Opcode = NVPTX::INT_PTX_LDG_G_v2f64_ELE_areg32;
1227 Opcode = NVPTX::INT_PTX_LDU_G_v2i8_ELE_areg32;
1230 Opcode = NVPTX::INT_PTX_LDU_G_v2i16_ELE_areg32;
1233 Opcode = NVPTX::INT_PTX_LDU_G_v2i32_ELE_areg32;
1236 Opcode = NVPTX::INT_PTX_LDU_G_v2i64_ELE_areg32;
1239 Opcode = NVPTX::INT_PTX_LDU_G_v2f32_ELE_areg32;
1242 Opcode = NVPTX::INT_PTX_LDU_G_v2f64_ELE_areg32;
1251 Opcode = NVPTX::INT_PTX_LDG_G_v4i8_ELE_areg32;
1254 Opcode = NVPTX::INT_PTX_LDG_G_v4i16_ELE_areg32;
1257 Opcode = NVPTX::INT_PTX_LDG_G_v4i32_ELE_areg32;
1260 Opcode = NVPTX::INT_PTX_LDG_G_v4f32_ELE_areg32;
1269 Opcode = NVPTX::INT_PTX_LDU_G_v4i8_ELE_areg32;
1272 Opcode = NVPTX::INT_PTX_LDU_G_v4i16_ELE_areg32;
1275 Opcode = NVPTX::INT_PTX_LDU_G_v4i32_ELE_areg32;
1278 Opcode = NVPTX::INT_PTX_LDU_G_v4f32_ELE_areg32;
1285 SDValue Ops[] = { Op1, Chain };
1286 LD = CurDAG->getMachineNode(Opcode, DL, N->
getVTList(),
1291 MemRefs0[0] = cast<MemSDNode>(
N)->getMemOperand();
1292 cast<MachineSDNode>(
LD)->setMemRefs(MemRefs0, MemRefs0 + 1);
1307 if (!StoreVT.isSimple())
1322 MVT SimpleVT = StoreVT.getSimpleVT();
1339 unsigned int toType;
1354 if (SelectDirectAddr(N2, Addr)) {
1357 Opcode = NVPTX::ST_i8_avar;
1360 Opcode = NVPTX::ST_i16_avar;
1363 Opcode = NVPTX::ST_i32_avar;
1366 Opcode = NVPTX::ST_i64_avar;
1369 Opcode = NVPTX::ST_f32_avar;
1372 Opcode = NVPTX::ST_f64_avar;
1377 SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
1378 getI32Imm(vecType), getI32Imm(toType),
1379 getI32Imm(toTypeWidth), Addr, Chain };
1380 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
1381 }
else if (Subtarget.is64Bit()
1382 ? SelectADDRsi64(N2.
getNode(), N2, Base, Offset)
1383 : SelectADDRsi(N2.
getNode(), N2, Base, Offset)) {
1386 Opcode = NVPTX::ST_i8_asi;
1389 Opcode = NVPTX::ST_i16_asi;
1392 Opcode = NVPTX::ST_i32_asi;
1395 Opcode = NVPTX::ST_i64_asi;
1398 Opcode = NVPTX::ST_f32_asi;
1401 Opcode = NVPTX::ST_f64_asi;
1406 SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
1407 getI32Imm(vecType), getI32Imm(toType),
1408 getI32Imm(toTypeWidth), Base, Offset, Chain };
1409 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
1410 }
else if (Subtarget.is64Bit()
1411 ? SelectADDRri64(N2.
getNode(), N2, Base, Offset)
1412 : SelectADDRri(N2.
getNode(), N2, Base, Offset)) {
1413 if (Subtarget.is64Bit()) {
1416 Opcode = NVPTX::ST_i8_ari_64;
1419 Opcode = NVPTX::ST_i16_ari_64;
1422 Opcode = NVPTX::ST_i32_ari_64;
1425 Opcode = NVPTX::ST_i64_ari_64;
1428 Opcode = NVPTX::ST_f32_ari_64;
1431 Opcode = NVPTX::ST_f64_ari_64;
1439 Opcode = NVPTX::ST_i8_ari;
1442 Opcode = NVPTX::ST_i16_ari;
1445 Opcode = NVPTX::ST_i32_ari;
1448 Opcode = NVPTX::ST_i64_ari;
1451 Opcode = NVPTX::ST_f32_ari;
1454 Opcode = NVPTX::ST_f64_ari;
1460 SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
1461 getI32Imm(vecType), getI32Imm(toType),
1462 getI32Imm(toTypeWidth), Base, Offset, Chain };
1463 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
1465 if (Subtarget.is64Bit()) {
1468 Opcode = NVPTX::ST_i8_areg_64;
1471 Opcode = NVPTX::ST_i16_areg_64;
1474 Opcode = NVPTX::ST_i32_areg_64;
1477 Opcode = NVPTX::ST_i64_areg_64;
1480 Opcode = NVPTX::ST_f32_areg_64;
1483 Opcode = NVPTX::ST_f64_areg_64;
1491 Opcode = NVPTX::ST_i8_areg;
1494 Opcode = NVPTX::ST_i16_areg;
1497 Opcode = NVPTX::ST_i32_areg;
1500 Opcode = NVPTX::ST_i64_areg;
1503 Opcode = NVPTX::ST_f32_areg;
1506 Opcode = NVPTX::ST_f64_areg;
1512 SDValue Ops[] = { N1, getI32Imm(isVolatile), getI32Imm(codeAddrSpace),
1513 getI32Imm(vecType), getI32Imm(toType),
1514 getI32Imm(toTypeWidth), N2, Chain };
1515 NVPTXST = CurDAG->getMachineNode(Opcode, dl, MVT::Other, Ops);
1518 if (NVPTXST != NULL) {
1520 MemRefs0[0] = cast<MemSDNode>(
N)->getMemOperand();
1521 cast<MachineSDNode>(NVPTXST)->setMemRefs(MemRefs0, MemRefs0 + 1);
1527 SDNode *NVPTXDAGToDAGISel::SelectStoreVector(
SDNode *N) {
1556 assert(StoreVT.isSimple() &&
"Store value is not simple");
1560 if (ScalarVT.isFloatingPoint())
1589 StOps.
push_back(getI32Imm(CodeAddrSpace));
1592 StOps.
push_back(getI32Imm(ToTypeWidth));
1594 if (SelectDirectAddr(N2, Addr)) {
1603 Opcode = NVPTX::STV_i8_v2_avar;
1606 Opcode = NVPTX::STV_i16_v2_avar;
1609 Opcode = NVPTX::STV_i32_v2_avar;
1612 Opcode = NVPTX::STV_i64_v2_avar;
1615 Opcode = NVPTX::STV_f32_v2_avar;
1618 Opcode = NVPTX::STV_f64_v2_avar;
1627 Opcode = NVPTX::STV_i8_v4_avar;
1630 Opcode = NVPTX::STV_i16_v4_avar;
1633 Opcode = NVPTX::STV_i32_v4_avar;
1636 Opcode = NVPTX::STV_f32_v4_avar;
1642 }
else if (Subtarget.is64Bit()
1643 ? SelectADDRsi64(N2.
getNode(), N2, Base, Offset)
1644 : SelectADDRsi(N2.
getNode(), N2, Base, Offset)) {
1653 Opcode = NVPTX::STV_i8_v2_asi;
1656 Opcode = NVPTX::STV_i16_v2_asi;
1659 Opcode = NVPTX::STV_i32_v2_asi;
1662 Opcode = NVPTX::STV_i64_v2_asi;
1665 Opcode = NVPTX::STV_f32_v2_asi;
1668 Opcode = NVPTX::STV_f64_v2_asi;
1677 Opcode = NVPTX::STV_i8_v4_asi;
1680 Opcode = NVPTX::STV_i16_v4_asi;
1683 Opcode = NVPTX::STV_i32_v4_asi;
1686 Opcode = NVPTX::STV_f32_v4_asi;
1693 }
else if (Subtarget.is64Bit()
1694 ? SelectADDRri64(N2.
getNode(), N2, Base, Offset)
1695 : SelectADDRri(N2.
getNode(), N2, Base, Offset)) {
1696 if (Subtarget.is64Bit()) {
1705 Opcode = NVPTX::STV_i8_v2_ari_64;
1708 Opcode = NVPTX::STV_i16_v2_ari_64;
1711 Opcode = NVPTX::STV_i32_v2_ari_64;
1714 Opcode = NVPTX::STV_i64_v2_ari_64;
1717 Opcode = NVPTX::STV_f32_v2_ari_64;
1720 Opcode = NVPTX::STV_f64_v2_ari_64;
1729 Opcode = NVPTX::STV_i8_v4_ari_64;
1732 Opcode = NVPTX::STV_i16_v4_ari_64;
1735 Opcode = NVPTX::STV_i32_v4_ari_64;
1738 Opcode = NVPTX::STV_f32_v4_ari_64;
1752 Opcode = NVPTX::STV_i8_v2_ari;
1755 Opcode = NVPTX::STV_i16_v2_ari;
1758 Opcode = NVPTX::STV_i32_v2_ari;
1761 Opcode = NVPTX::STV_i64_v2_ari;
1764 Opcode = NVPTX::STV_f32_v2_ari;
1767 Opcode = NVPTX::STV_f64_v2_ari;
1776 Opcode = NVPTX::STV_i8_v4_ari;
1779 Opcode = NVPTX::STV_i16_v4_ari;
1782 Opcode = NVPTX::STV_i32_v4_ari;
1785 Opcode = NVPTX::STV_f32_v4_ari;
1794 if (Subtarget.is64Bit()) {
1803 Opcode = NVPTX::STV_i8_v2_areg_64;
1806 Opcode = NVPTX::STV_i16_v2_areg_64;
1809 Opcode = NVPTX::STV_i32_v2_areg_64;
1812 Opcode = NVPTX::STV_i64_v2_areg_64;
1815 Opcode = NVPTX::STV_f32_v2_areg_64;
1818 Opcode = NVPTX::STV_f64_v2_areg_64;
1827 Opcode = NVPTX::STV_i8_v4_areg_64;
1830 Opcode = NVPTX::STV_i16_v4_areg_64;
1833 Opcode = NVPTX::STV_i32_v4_areg_64;
1836 Opcode = NVPTX::STV_f32_v4_areg_64;
1850 Opcode = NVPTX::STV_i8_v2_areg;
1853 Opcode = NVPTX::STV_i16_v2_areg;
1856 Opcode = NVPTX::STV_i32_v2_areg;
1859 Opcode = NVPTX::STV_i64_v2_areg;
1862 Opcode = NVPTX::STV_f32_v2_areg;
1865 Opcode = NVPTX::STV_f64_v2_areg;
1874 Opcode = NVPTX::STV_i8_v4_areg;
1877 Opcode = NVPTX::STV_i16_v4_areg;
1880 Opcode = NVPTX::STV_i32_v4_areg;
1883 Opcode = NVPTX::STV_f32_v4_areg;
1894 ST = CurDAG->getMachineNode(Opcode, DL, MVT::Other, StOps);
1897 MemRefs0[0] = cast<MemSDNode>(
N)->getMemOperand();
1898 cast<MachineSDNode>(
ST)->setMemRefs(MemRefs0, MemRefs0 + 1);
1903 SDNode *NVPTXDAGToDAGISel::SelectLoadParam(
SDNode *Node) {
1938 Opc = NVPTX::LoadParamMemI8;
1941 Opc = NVPTX::LoadParamMemI8;
1944 Opc = NVPTX::LoadParamMemI16;
1947 Opc = NVPTX::LoadParamMemI32;
1950 Opc = NVPTX::LoadParamMemI64;
1953 Opc = NVPTX::LoadParamMemF32;
1956 Opc = NVPTX::LoadParamMemF64;
1965 Opc = NVPTX::LoadParamMemV2I8;
1968 Opc = NVPTX::LoadParamMemV2I8;
1971 Opc = NVPTX::LoadParamMemV2I16;
1974 Opc = NVPTX::LoadParamMemV2I32;
1977 Opc = NVPTX::LoadParamMemV2I64;
1980 Opc = NVPTX::LoadParamMemV2F32;
1983 Opc = NVPTX::LoadParamMemV2F64;
1992 Opc = NVPTX::LoadParamMemV4I8;
1995 Opc = NVPTX::LoadParamMemV4I8;
1998 Opc = NVPTX::LoadParamMemV4I16;
2001 Opc = NVPTX::LoadParamMemV4I32;
2004 Opc = NVPTX::LoadParamMemV4F32;
2012 VTs = CurDAG->getVTList(EltVT, MVT::Other, MVT::Glue);
2013 }
else if (VecSize == 2) {
2014 VTs = CurDAG->getVTList(EltVT, EltVT, MVT::Other, MVT::Glue);
2016 EVT EVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other, MVT::Glue };
2017 VTs = CurDAG->getVTList(&EVTs[0], 5);
2020 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2023 Ops.
push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
2028 CurDAG->getMachineNode(Opc, DL, VTs, Ops);
2032 SDNode *NVPTXDAGToDAGISel::SelectStoreRetval(
SDNode *N) {
2036 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2040 unsigned NumElts = 1;
2057 for (
unsigned i = 0; i < NumElts; ++i)
2059 Ops.
push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
2065 unsigned Opcode = 0;
2074 Opcode = NVPTX::StoreRetvalI8;
2077 Opcode = NVPTX::StoreRetvalI8;
2080 Opcode = NVPTX::StoreRetvalI16;
2083 Opcode = NVPTX::StoreRetvalI32;
2086 Opcode = NVPTX::StoreRetvalI64;
2089 Opcode = NVPTX::StoreRetvalF32;
2092 Opcode = NVPTX::StoreRetvalF64;
2101 Opcode = NVPTX::StoreRetvalV2I8;
2104 Opcode = NVPTX::StoreRetvalV2I8;
2107 Opcode = NVPTX::StoreRetvalV2I16;
2110 Opcode = NVPTX::StoreRetvalV2I32;
2113 Opcode = NVPTX::StoreRetvalV2I64;
2116 Opcode = NVPTX::StoreRetvalV2F32;
2119 Opcode = NVPTX::StoreRetvalV2F64;
2128 Opcode = NVPTX::StoreRetvalV4I8;
2131 Opcode = NVPTX::StoreRetvalV4I8;
2134 Opcode = NVPTX::StoreRetvalV4I16;
2137 Opcode = NVPTX::StoreRetvalV4I32;
2140 Opcode = NVPTX::StoreRetvalV4F32;
2147 CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops);
2149 MemRefs0[0] = cast<MemSDNode>(
N)->getMemOperand();
2150 cast<MachineSDNode>(
Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
2155 SDNode *NVPTXDAGToDAGISel::SelectStoreParam(
SDNode *N) {
2159 unsigned ParamVal = cast<ConstantSDNode>(Param)->getZExtValue();
2161 unsigned OffsetVal = cast<ConstantSDNode>(Offset)->getZExtValue();
2166 unsigned NumElts = 1;
2185 for (
unsigned i = 0; i < NumElts; ++i)
2187 Ops.
push_back(CurDAG->getTargetConstant(ParamVal, MVT::i32));
2188 Ops.
push_back(CurDAG->getTargetConstant(OffsetVal, MVT::i32));
2195 unsigned Opcode = 0;
2206 Opcode = NVPTX::StoreParamI8;
2209 Opcode = NVPTX::StoreParamI8;
2212 Opcode = NVPTX::StoreParamI16;
2215 Opcode = NVPTX::StoreParamI32;
2218 Opcode = NVPTX::StoreParamI64;
2221 Opcode = NVPTX::StoreParamF32;
2224 Opcode = NVPTX::StoreParamF64;
2233 Opcode = NVPTX::StoreParamV2I8;
2236 Opcode = NVPTX::StoreParamV2I8;
2239 Opcode = NVPTX::StoreParamV2I16;
2242 Opcode = NVPTX::StoreParamV2I32;
2245 Opcode = NVPTX::StoreParamV2I64;
2248 Opcode = NVPTX::StoreParamV2F32;
2251 Opcode = NVPTX::StoreParamV2F64;
2260 Opcode = NVPTX::StoreParamV4I8;
2263 Opcode = NVPTX::StoreParamV4I8;
2266 Opcode = NVPTX::StoreParamV4I16;
2269 Opcode = NVPTX::StoreParamV4I32;
2272 Opcode = NVPTX::StoreParamV4F32;
2282 Opcode = NVPTX::StoreParamI32;
2285 SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
2286 MVT::i32, Ops[0], CvtNone);
2291 Opcode = NVPTX::StoreParamI32;
2294 SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
2295 MVT::i32, Ops[0], CvtNone);
2301 SDVTList RetVTs = CurDAG->getVTList(MVT::Other, MVT::Glue);
2303 CurDAG->getMachineNode(Opcode, DL, RetVTs, Ops);
2305 MemRefs0[0] = cast<MemSDNode>(
N)->getMemOperand();
2306 cast<MachineSDNode>(
Ret)->setMemRefs(MemRefs0, MemRefs0 + 1);
2313 bool NVPTXDAGToDAGISel::SelectDirectAddr(
SDValue N,
SDValue &Address) {
2325 unsigned IID = cast<ConstantSDNode>(N.
getOperand(0))->getZExtValue();
2334 bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
2339 if (SelectDirectAddr(base, Base)) {
2340 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
2349 bool NVPTXDAGToDAGISel::SelectADDRsi(
SDNode *OpNode,
SDValue Addr,
2351 return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i32);
2355 bool NVPTXDAGToDAGISel::SelectADDRsi64(
SDNode *OpNode,
SDValue Addr,
2357 return SelectADDRsi_imp(OpNode, Addr, Base, Offset, MVT::i64);
2361 bool NVPTXDAGToDAGISel::SelectADDRri_imp(
2364 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
2365 Offset = CurDAG->getTargetConstant(0, mvt);
2373 if (SelectDirectAddr(Addr.
getOperand(0), Addr)) {
2378 dyn_cast<FrameIndexSDNode>(Addr.
getOperand(0)))
2380 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), mvt);
2383 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), mvt);
2391 bool NVPTXDAGToDAGISel::SelectADDRri(
SDNode *OpNode,
SDValue Addr,
2393 return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i32);
2397 bool NVPTXDAGToDAGISel::SelectADDRri64(
SDNode *OpNode,
SDValue Addr,
2399 return SelectADDRri_imp(OpNode, Addr, Base, Offset, MVT::i64);
2402 bool NVPTXDAGToDAGISel::ChkMemSDNodeAddressSpace(
SDNode *N,
2403 unsigned int spN)
const {
2404 const Value *Src = NULL;
2408 if (
MemSDNode *mN = dyn_cast<MemSDNode>(N)) {
2409 Src = mN->getSrcValue();
2410 }
else if (
MemSDNode *mN = dyn_cast<MemIntrinsicSDNode>(N)) {
2411 Src = mN->getSrcValue();
2416 return (PT->getAddressSpace() == spN);
2422 bool NVPTXDAGToDAGISel::SelectInlineAsmMemoryOperand(
2423 const SDValue &Op,
char ConstraintCode, std::vector<SDValue> &OutOps) {
2425 switch (ConstraintCode) {
2429 if (SelectDirectAddr(Op, Op0)) {
2430 OutOps.push_back(Op0);
2431 OutOps.push_back(CurDAG->getTargetConstant(0, MVT::i32));
2434 if (SelectADDRri(Op.
getNode(), Op, Op0, Op1)) {
2435 OutOps.push_back(Op0);
2436 OutOps.push_back(Op1);
2456 Retval = CurDAG->getTargetConstant(0, MVT::i8);
2460 Retval = CurDAG->getTargetConstant(retval, MVT::i8);
static unsigned int getCodeAddrSpace(MemSDNode *N, const NVPTXSubtarget &Subtarget)
void push_back(const T &Elt)
SDVTList getVTList() const
static cl::opt< int > FMAContractLevel("nvptx-fma-level", cl::ZeroOrMore, cl::Hidden, cl::desc("NVPTX Specific: FMA contraction (0: don't do it"" 1: do it 2: do it aggressively"), cl::init(2))
unsigned getOpcode() const
unsigned getSizeInBits() const
unsigned getNumOperands() const
const SDValue & getOperand(unsigned Num) const
void setNodeId(int Id)
setNodeId - Set unique node id.
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
EVT getValueType(unsigned ResNo) const
MVT getScalarType() const
EVT getVectorElementType() const
EVT getMemoryVT() const
getMemoryVT - Return the type of the in-memory value.
UNDEF - An undefined node.
SDNode * getNode() const
get the SDNode which holds the desired result
initializer< Ty > init(const Ty &Val)
unsigned getVectorNumElements() const
const SDValue & getOperand(unsigned i) const
bool isVector() const
isVector - Return true if this is a vector value type.
bool isFloatingPoint() const
isFloatingPoint - Return true if this is a FP, or a vector FP type.
static cl::opt< bool > UsePrecSqrtF32("nvptx-prec-sqrtf32", cl::Hidden, cl::desc("NVPTX Specific: 0 use sqrt.approx, 1 use sqrt.rn."), cl::init(true))
static ManagedStatic< std::set< EVT, EVT::compareRawBits > > EVTs
unsigned getOpcode() const
Abstact virtual class for operations for memory operations.
AttributeSet getAttributes() const
Return the attribute list for this Function.
ISD::LoadExtType getExtensionType() const
static cl::opt< bool > FtzEnabled("nvptx-f32ftz", cl::ZeroOrMore, cl::Hidden, cl::desc("NVPTX Specific: Flush f32 subnormals to sign-preserving zero."), cl::init(false))
static cl::opt< int > UsePrecDivF32("nvptx-prec-divf32", cl::ZeroOrMore, cl::Hidden, cl::desc("NVPTX Specifies: 0 use div.approx, 1 use div.full, 2 use"" IEEE Compliant F32 div.rnd if avaiable."), cl::init(2))
FunctionPass * createNVPTXISelDag(NVPTXTargetMachine &TM, llvm::CodeGenOpt::Level OptLevel)
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
bool isIndexed() const
isIndexed - Return true if this is a pre/post inc/dec load/store.
const Value * getSrcValue() const
Returns the SrcValue and offset that describes the location of the access.
Attribute getAttribute(unsigned Index, Attribute::AttrKind Kind) const
Return the attribute object that exists at the given index.
StringRef getValueAsString() const
Return the attribute's value as a string. This requires the attribute to be a string attribute...
LLVM Value Representation.
MVT getSimpleValueType(unsigned ResNo) const
bool isMachineOpcode() const
uint64_t getZExtValue() const