LLVM 24.0.0git
MipsISelLowering.cpp
Go to the documentation of this file.
1//===- MipsISelLowering.cpp - Mips DAG Lowering Implementation ------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the interfaces that Mips uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MipsISelLowering.h"
18#include "MipsCCState.h"
19#include "MipsInstrInfo.h"
20#include "MipsMachineFunction.h"
21#include "MipsRegisterInfo.h"
22#include "MipsSubtarget.h"
23#include "MipsTargetMachine.h"
25#include "llvm/ADT/APFloat.h"
26#include "llvm/ADT/ArrayRef.h"
28#include "llvm/ADT/Statistic.h"
29#include "llvm/ADT/StringRef.h"
49#include "llvm/IR/CallingConv.h"
50#include "llvm/IR/Constants.h"
51#include "llvm/IR/DataLayout.h"
52#include "llvm/IR/DebugLoc.h"
54#include "llvm/IR/Function.h"
55#include "llvm/IR/GlobalValue.h"
56#include "llvm/IR/Module.h"
57#include "llvm/IR/Type.h"
58#include "llvm/IR/Value.h"
59#include "llvm/MC/MCContext.h"
67#include <algorithm>
68#include <cassert>
69#include <cctype>
70#include <cstdint>
71#include <deque>
72#include <iterator>
73#include <string>
74#include <utility>
75#include <vector>
76
77using namespace llvm;
78
79#define DEBUG_TYPE "mips-lower"
80
81STATISTIC(NumTailCalls, "Number of tail calls");
82
83static const MCPhysReg Mips64DPRegs[8] = {
84 Mips::D12_64, Mips::D13_64, Mips::D14_64, Mips::D15_64,
85 Mips::D16_64, Mips::D17_64, Mips::D18_64, Mips::D19_64
86};
87
89 Break, // MIPS I
90 Teq, // MIPS II+
91 TeqMM, // microMIPS
92};
93
94// The MIPS MSA ABI passes vector arguments in the integer register set.
95// The number of integer registers used is dependant on the ABI used.
98 EVT VT) const {
99 if (!VT.isVector())
100 return getRegisterType(Context, VT);
101
103 return Subtarget.isABI_O32() || VT.getSizeInBits() == 32 ? MVT::i32
104 : MVT::i64;
105 return getRegisterType(Context, VT.getVectorElementType());
106}
107
110 EVT VT) const {
111 if (VT.isVector()) {
113 return divideCeil(VT.getSizeInBits(), Subtarget.isABI_O32() ? 32 : 64);
114 return VT.getVectorNumElements() *
116 }
117 return MipsTargetLowering::getNumRegisters(Context, VT);
118}
119
121 LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
122 unsigned &NumIntermediates, MVT &RegisterVT) const {
123 if (VT.isPow2VectorType() && VT.getVectorElementType().isRound()) {
124 IntermediateVT = getRegisterTypeForCallingConv(Context, CC, VT);
125 RegisterVT = IntermediateVT.getSimpleVT();
126 NumIntermediates = getNumRegistersForCallingConv(Context, CC, VT);
127 return NumIntermediates;
128 }
129 IntermediateVT = VT.getVectorElementType();
130 NumIntermediates = VT.getVectorNumElements();
131 RegisterVT = getRegisterType(Context, IntermediateVT);
132 return NumIntermediates * getNumRegisters(Context, IntermediateVT);
133}
134
140
141SDValue MipsTargetLowering::getTargetNode(GlobalAddressSDNode *N, EVT Ty,
142 SelectionDAG &DAG,
143 unsigned Flag) const {
144 return DAG.getTargetGlobalAddress(N->getGlobal(), SDLoc(N), Ty, 0, Flag);
145}
146
147SDValue MipsTargetLowering::getTargetNode(ExternalSymbolSDNode *N, EVT Ty,
148 SelectionDAG &DAG,
149 unsigned Flag) const {
150 return DAG.getTargetExternalSymbol(N->getSymbol(), Ty, Flag);
151}
152
153SDValue MipsTargetLowering::getTargetNode(BlockAddressSDNode *N, EVT Ty,
154 SelectionDAG &DAG,
155 unsigned Flag) const {
156 return DAG.getTargetBlockAddress(N->getBlockAddress(), Ty, 0, Flag);
157}
158
159SDValue MipsTargetLowering::getTargetNode(JumpTableSDNode *N, EVT Ty,
160 SelectionDAG &DAG,
161 unsigned Flag) const {
162 return DAG.getTargetJumpTable(N->getIndex(), Ty, Flag);
163}
164
165SDValue MipsTargetLowering::getTargetNode(ConstantPoolSDNode *N, EVT Ty,
166 SelectionDAG &DAG,
167 unsigned Flag) const {
168 return DAG.getTargetConstantPool(N->getConstVal(), Ty, N->getAlign(),
169 N->getOffset(), Flag);
170}
171
173 const MipsSubtarget &STI)
174 : TargetLowering(TM, STI), Subtarget(STI), ABI(STI.getABI()) {
175 // Mips does not have i1 type, so use i32 for
176 // setcc operations results (slt, sgt, ...).
179 // The cmp.cond.fmt instruction in MIPS32r6/MIPS64r6 uses 0 and -1 like MSA
180 // does. Integer booleans still use 0 and 1.
181 if (Subtarget.hasMips32r6())
184
185 // Load extented operations for i1 types must be promoted
186 for (MVT VT : MVT::integer_valuetypes()) {
190 }
191
192 // MIPS doesn't have extending float->double load/store. Set LoadExtAction
193 // for f32, f16
194 for (MVT VT : MVT::fp_valuetypes()) {
195 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f32, Expand);
196 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f16, Expand);
197 }
198
199 // Set LoadExtAction for f16 vectors to Expand
201 MVT F16VT = MVT::getVectorVT(MVT::f16, VT.getVectorNumElements());
202 if (F16VT.isValid())
204 }
205
206 setTruncStoreAction(MVT::f32, MVT::f16, Expand);
207 setTruncStoreAction(MVT::f64, MVT::f16, Expand);
208
209 setTruncStoreAction(MVT::f64, MVT::f32, Expand);
210
211 // Used by legalize types to correctly generate the setcc result.
212 // Without this, every float setcc comes with a AND/OR with the result,
213 // we don't want this, since the fpcmp result goes to a flag register,
214 // which is used implicitly by brcond and select operations.
215 AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
216
217 // Mips Custom Operations
223 if (!Subtarget.inMips16Mode())
238
243
244 if (Subtarget.hasMips32r2() ||
245 getTargetMachine().getTargetTriple().isOSLinux())
247
248 // Lower fmin/fmax/fclass operations for MIPS R6.
249 if (Subtarget.hasMips32r6()) {
262 } else {
265 }
266
267 if (Subtarget.hasMTHC1())
269
270 if (Subtarget.isGP64bit()) {
275 if (!Subtarget.inMips16Mode())
278 if (Subtarget.hasMips64r6()) {
281 } else {
284 }
291 }
292
293 if (!Subtarget.isGP64bit()) {
297 }
298
300 if (Subtarget.isGP64bit())
302
311
312 // Operations not directly supported by Mips.
326
327 if (Subtarget.hasCnMips()) {
330 } else {
333 }
340
341 if (!Subtarget.hasMips32r2())
343
344 if (!Subtarget.hasMips64r2())
346
363
364 // Lower f16 conversion operations into library calls
369
371
376
377 // Use the default for now
380
381 if (!Subtarget.isGP64bit()) {
384 }
385
386 if (!Subtarget.hasMips32r2()) {
389 }
390
391 // MIPS16 lacks MIPS32's clz and clo instructions.
392 if (!Subtarget.hasMips32() || Subtarget.inMips16Mode())
394 if (!Subtarget.hasMips64())
396
397 if (!Subtarget.hasMips32r2())
399 if (!Subtarget.hasMips64r2())
401
402 if (Subtarget.isGP64bit() && Subtarget.hasMips64r6()) {
403 setLoadExtAction(ISD::SEXTLOAD, MVT::i64, MVT::i32, Legal);
404 setLoadExtAction(ISD::ZEXTLOAD, MVT::i64, MVT::i32, Legal);
405 setLoadExtAction(ISD::EXTLOAD, MVT::i64, MVT::i32, Legal);
406 setTruncStoreAction(MVT::i64, MVT::i32, Legal);
407 } else if (Subtarget.isGP64bit()) {
408 setLoadExtAction(ISD::SEXTLOAD, MVT::i64, MVT::i32, Custom);
409 setLoadExtAction(ISD::ZEXTLOAD, MVT::i64, MVT::i32, Custom);
410 setLoadExtAction(ISD::EXTLOAD, MVT::i64, MVT::i32, Custom);
411 setTruncStoreAction(MVT::i64, MVT::i32, Custom);
412 }
413
414 setOperationAction(ISD::TRAP, MVT::Other, Legal);
415
419
420 // Sink shifts into their users' blocks to expose extract patterns.
421 setHasExtractBitsInsn(Subtarget.hasExtractInsert());
422
423 // R5900 has no LL/SC instructions for atomic operations
424 if (Subtarget.isR5900())
426 else if (Subtarget.isGP64bit())
428 else
430
431 setMinFunctionAlignment(Subtarget.isGP64bit() ? Align(8) : Align(4));
432
433 // The arguments on the stack are defined in terms of 4-byte slots on O32
434 // and 8-byte slots on N32/N64.
435 setMinStackArgumentAlignment((ABI.IsN32() || ABI.IsN64()) ? Align(8)
436 : Align(4));
437
439
441
442 isMicroMips = Subtarget.inMicroMipsMode();
443}
444
445const MipsTargetLowering *
447 const MipsSubtarget &STI) {
448 if (STI.inMips16Mode())
449 return createMips16TargetLowering(TM, STI);
450
451 return createMipsSETargetLowering(TM, STI);
452}
453
454// Create a fast isel object.
456 FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo,
457 const LibcallLoweringInfo *libcallLowering) const {
458 const MipsTargetMachine &TM =
459 static_cast<const MipsTargetMachine &>(funcInfo.MF->getTarget());
460
461 // We support only the standard encoding [MIPS32,MIPS32R5] ISAs.
462 bool UseFastISel = TM.Options.EnableFastISel && Subtarget.hasMips32() &&
463 !Subtarget.hasMips32r6() && !Subtarget.inMips16Mode() &&
464 !Subtarget.inMicroMipsMode();
465
466 // Disable if either of the following is true:
467 // We do not generate PIC, the ABI is not O32, XGOT is being used.
468 if (!TM.isPositionIndependent() || !Subtarget.getABI().IsO32() ||
469 Subtarget.useXGOT())
470 UseFastISel = false;
471
472 return UseFastISel ? Mips::createFastISel(funcInfo, libInfo, libcallLowering)
473 : nullptr;
474}
475
477 EVT VT) const {
478 if (!VT.isVector())
479 return MVT::i32;
481}
482
485 const MipsSubtarget &Subtarget) {
486 if (DCI.isBeforeLegalizeOps())
487 return SDValue();
488
489 EVT Ty = N->getValueType(0);
490 unsigned LO = (Ty == MVT::i32) ? Mips::LO0 : Mips::LO0_64;
491 unsigned HI = (Ty == MVT::i32) ? Mips::HI0 : Mips::HI0_64;
492 unsigned Opc = N->getOpcode() == ISD::SDIVREM ? MipsISD::DivRem16 :
493 MipsISD::DivRemU16;
494 SDLoc DL(N);
495
496 SDValue DivRem = DAG.getNode(Opc, DL, MVT::Glue,
497 N->getOperand(0), N->getOperand(1));
498 SDValue InChain = DAG.getEntryNode();
499 SDValue InGlue = DivRem;
500
501 // insert MFLO
502 if (N->hasAnyUseOfValue(0)) {
503 SDValue CopyFromLo = DAG.getCopyFromReg(InChain, DL, LO, Ty,
504 InGlue);
505 DAG.ReplaceAllUsesOfValueWith(SDValue(N, 0), CopyFromLo);
506 InChain = CopyFromLo.getValue(1);
507 InGlue = CopyFromLo.getValue(2);
508 }
509
510 // insert MFHI
511 if (N->hasAnyUseOfValue(1)) {
512 SDValue CopyFromHi = DAG.getCopyFromReg(InChain, DL,
513 HI, Ty, InGlue);
514 DAG.ReplaceAllUsesOfValueWith(SDValue(N, 1), CopyFromHi);
515 }
516
517 return SDValue();
518}
519
521 switch (CC) {
522 default: llvm_unreachable("Unknown fp condition code!");
523 case ISD::SETEQ:
524 case ISD::SETOEQ: return Mips::FCOND_OEQ;
525 case ISD::SETUNE: return Mips::FCOND_UNE;
526 case ISD::SETLT:
527 case ISD::SETOLT: return Mips::FCOND_OLT;
528 case ISD::SETGT:
529 case ISD::SETOGT: return Mips::FCOND_OGT;
530 case ISD::SETLE:
531 case ISD::SETOLE: return Mips::FCOND_OLE;
532 case ISD::SETGE:
533 case ISD::SETOGE: return Mips::FCOND_OGE;
534 case ISD::SETULT: return Mips::FCOND_ULT;
535 case ISD::SETULE: return Mips::FCOND_ULE;
536 case ISD::SETUGT: return Mips::FCOND_UGT;
537 case ISD::SETUGE: return Mips::FCOND_UGE;
538 case ISD::SETUO: return Mips::FCOND_UN;
539 case ISD::SETO: return Mips::FCOND_OR;
540 case ISD::SETNE:
541 case ISD::SETONE: return Mips::FCOND_ONE;
542 case ISD::SETUEQ: return Mips::FCOND_UEQ;
543 }
544}
545
546/// This function returns true if the floating point conditional branches and
547/// conditional moves which use condition code CC should be inverted.
549 if (CC >= Mips::FCOND_F && CC <= Mips::FCOND_NGT)
550 return false;
551
552 assert((CC >= Mips::FCOND_T && CC <= Mips::FCOND_GT) &&
553 "Illegal Condition Code");
554
555 return true;
556}
557
558// Creates and returns an FPCmp node from a setcc node.
559// Returns Op if setcc is not a floating point comparison.
561 // must be a SETCC node
562 if (Op.getOpcode() != ISD::SETCC && Op.getOpcode() != ISD::STRICT_FSETCC &&
563 Op.getOpcode() != ISD::STRICT_FSETCCS)
564 return Op;
565
566 SDValue LHS = Op.getOperand(0);
567
568 if (!LHS.getValueType().isFloatingPoint())
569 return Op;
570
571 SDValue RHS = Op.getOperand(1);
572 SDLoc DL(Op);
573
574 // Assume the 3rd operand is a CondCodeSDNode. Add code to check the type of
575 // node if necessary.
576 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
577
578 return DAG.getNode(MipsISD::FPCmp, DL, MVT::Glue, LHS, RHS,
579 DAG.getConstant(condCodeToFCC(CC), DL, MVT::i32));
580}
581
582// Creates and returns a CMovFPT/F node.
584 SDValue False, const SDLoc &DL) {
585 ConstantSDNode *CC = cast<ConstantSDNode>(Cond.getOperand(2));
587 SDValue FCC0 = DAG.getRegister(Mips::FCC0, MVT::i32);
588
589 return DAG.getNode((invert ? MipsISD::CMovFP_F : MipsISD::CMovFP_T), DL,
590 True.getValueType(), True, FCC0, False, Cond);
591}
592
595 const MipsSubtarget &Subtarget) {
596 if (DCI.isBeforeLegalizeOps())
597 return SDValue();
598
599 SDValue SetCC = N->getOperand(0);
600
601 if ((SetCC.getOpcode() != ISD::SETCC) ||
602 !SetCC.getOperand(0).getValueType().isInteger())
603 return SDValue();
604
605 SDValue False = N->getOperand(2);
606 EVT FalseTy = False.getValueType();
607
608 if (!FalseTy.isInteger())
609 return SDValue();
610
612
613 // If the RHS (False) is 0, we swap the order of the operands
614 // of ISD::SELECT (obviously also inverting the condition) so that we can
615 // take advantage of conditional moves using the $0 register.
616 // Example:
617 // return (a != 0) ? x : 0;
618 // load $reg, x
619 // movz $reg, $0, a
620 if (!FalseC)
621 return SDValue();
622
623 const SDLoc DL(N);
624
625 if (!FalseC->getZExtValue()) {
626 ISD::CondCode CC = cast<CondCodeSDNode>(SetCC.getOperand(2))->get();
627 SDValue True = N->getOperand(1);
628
629 SetCC = DAG.getSetCC(DL, SetCC.getValueType(), SetCC.getOperand(0),
630 SetCC.getOperand(1),
632
633 return DAG.getNode(ISD::SELECT, DL, FalseTy, SetCC, False, True);
634 }
635
636 // If both operands are integer constants there's a possibility that we
637 // can do some interesting optimizations.
638 SDValue True = N->getOperand(1);
640
641 if (!TrueC || !True.getValueType().isInteger())
642 return SDValue();
643
644 // We'll also ignore MVT::i64 operands as this optimizations proves
645 // to be ineffective because of the required sign extensions as the result
646 // of a SETCC operator is always MVT::i32 for non-vector types.
647 if (True.getValueType() == MVT::i64)
648 return SDValue();
649
650 int64_t Diff = TrueC->getSExtValue() - FalseC->getSExtValue();
651
652 // 1) (a < x) ? y : y-1
653 // slti $reg1, a, x
654 // addiu $reg2, $reg1, y-1
655 if (Diff == 1)
656 return DAG.getNode(ISD::ADD, DL, SetCC.getValueType(), SetCC, False);
657
658 // 2) (a < x) ? y-1 : y
659 // slti $reg1, a, x
660 // xor $reg1, $reg1, 1
661 // addiu $reg2, $reg1, y-1
662 if (Diff == -1) {
663 ISD::CondCode CC = cast<CondCodeSDNode>(SetCC.getOperand(2))->get();
664 SetCC = DAG.getSetCC(DL, SetCC.getValueType(), SetCC.getOperand(0),
665 SetCC.getOperand(1),
667 return DAG.getNode(ISD::ADD, DL, SetCC.getValueType(), SetCC, True);
668 }
669
670 // Could not optimize.
671 return SDValue();
672}
673
676 const MipsSubtarget &Subtarget) {
677 if (DCI.isBeforeLegalizeOps())
678 return SDValue();
679
680 SDValue ValueIfTrue = N->getOperand(0), ValueIfFalse = N->getOperand(2);
681
682 ConstantSDNode *FalseC = dyn_cast<ConstantSDNode>(ValueIfFalse);
683 if (!FalseC || FalseC->getZExtValue())
684 return SDValue();
685
686 // Since RHS (False) is 0, we swap the order of the True/False operands
687 // (obviously also inverting the condition) so that we can
688 // take advantage of conditional moves using the $0 register.
689 // Example:
690 // return (a != 0) ? x : 0;
691 // load $reg, x
692 // movz $reg, $0, a
693 unsigned Opc = (N->getOpcode() == MipsISD::CMovFP_T) ? MipsISD::CMovFP_F :
694 MipsISD::CMovFP_T;
695
696 SDValue FCC = N->getOperand(1), Glue = N->getOperand(3);
697 return DAG.getNode(Opc, SDLoc(N), ValueIfFalse.getValueType(),
698 ValueIfFalse, FCC, ValueIfTrue, Glue);
699}
700
703 const MipsSubtarget &Subtarget) {
704 if (DCI.isBeforeLegalizeOps() || !Subtarget.hasExtractInsert())
705 return SDValue();
706
707 SDValue FirstOperand = N->getOperand(0);
708 unsigned FirstOperandOpc = FirstOperand.getOpcode();
709 SDValue Mask = N->getOperand(1);
710 EVT ValTy = N->getValueType(0);
711 SDLoc DL(N);
712
713 uint64_t Pos = 0;
714 unsigned SMPos, SMSize;
715 ConstantSDNode *CN;
716 SDValue NewOperand;
717 unsigned Opc;
718
719 // Op's second operand must be a shifted mask.
720 if (!(CN = dyn_cast<ConstantSDNode>(Mask)) ||
721 !isShiftedMask_64(CN->getZExtValue(), SMPos, SMSize))
722 return SDValue();
723
724 if (FirstOperandOpc == ISD::SRA || FirstOperandOpc == ISD::SRL) {
725 // Pattern match EXT.
726 // $dst = and ((sra or srl) $src , pos), (2**size - 1)
727 // => ext $dst, $src, pos, size
728
729 // The second operand of the shift must be an immediate.
730 if (!(CN = dyn_cast<ConstantSDNode>(FirstOperand.getOperand(1))))
731 return SDValue();
732
733 Pos = CN->getZExtValue();
734
735 // Return if the shifted mask does not start at bit 0 or the sum of its size
736 // and Pos exceeds the word's size.
737 if (SMPos != 0 || Pos + SMSize > ValTy.getSizeInBits())
738 return SDValue();
739
740 Opc = MipsISD::Ext;
741 NewOperand = FirstOperand.getOperand(0);
742 } else if (FirstOperandOpc == ISD::SHL && Subtarget.hasCnMips()) {
743 // Pattern match CINS.
744 // $dst = and (shl $src , pos), mask
745 // => cins $dst, $src, pos, size
746 // mask is a shifted mask with consecutive 1's, pos = shift amount,
747 // size = population count.
748
749 // The second operand of the shift must be an immediate.
750 if (!(CN = dyn_cast<ConstantSDNode>(FirstOperand.getOperand(1))))
751 return SDValue();
752
753 Pos = CN->getZExtValue();
754
755 if (SMPos != Pos || Pos >= ValTy.getSizeInBits() || SMSize >= 32 ||
756 Pos + SMSize > ValTy.getSizeInBits())
757 return SDValue();
758
759 NewOperand = FirstOperand.getOperand(0);
760 // SMSize is 'location' (position) in this case, not size.
761 SMSize--;
762 Opc = MipsISD::CIns;
763 } else {
764 // Pattern match EXT.
765 // $dst = and $src, (2**size - 1) , if size > 16
766 // => ext $dst, $src, pos, size , pos = 0
767
768 // If the mask is <= 0xffff, andi can be used instead.
769 if (CN->getZExtValue() <= 0xffff)
770 return SDValue();
771
772 // Return if the mask doesn't start at position 0.
773 if (SMPos)
774 return SDValue();
775
776 Opc = MipsISD::Ext;
777 NewOperand = FirstOperand;
778 }
779 return DAG.getNode(Opc, DL, ValTy, NewOperand,
780 DAG.getConstant(Pos, DL, MVT::i32),
781 DAG.getConstant(SMSize, DL, MVT::i32));
782}
783
786 const MipsSubtarget &Subtarget) {
787 if (DCI.isBeforeLegalizeOps() || !Subtarget.hasExtractInsert())
788 return SDValue();
789
790 SDValue FirstOperand = N->getOperand(0), SecondOperand = N->getOperand(1);
791 unsigned SMPos0, SMSize0, SMPos1, SMSize1;
792 ConstantSDNode *CN, *CN1;
793
794 if ((FirstOperand.getOpcode() == ISD::AND &&
795 SecondOperand.getOpcode() == ISD::SHL) ||
796 (FirstOperand.getOpcode() == ISD::SHL &&
797 SecondOperand.getOpcode() == ISD::AND)) {
798 // Pattern match INS.
799 // $dst = or (and $src1, (2**size0 - 1)), (shl $src2, size0)
800 // ==> ins $src1, $src2, pos, size, pos = size0, size = 32 - pos;
801 // Or:
802 // $dst = or (shl $src2, size0), (and $src1, (2**size0 - 1))
803 // ==> ins $src1, $src2, pos, size, pos = size0, size = 32 - pos;
804 SDValue AndOperand0 = FirstOperand.getOpcode() == ISD::AND
805 ? FirstOperand.getOperand(0)
806 : SecondOperand.getOperand(0);
807 SDValue ShlOperand0 = FirstOperand.getOpcode() == ISD::AND
808 ? SecondOperand.getOperand(0)
809 : FirstOperand.getOperand(0);
810 SDValue AndMask = FirstOperand.getOpcode() == ISD::AND
811 ? FirstOperand.getOperand(1)
812 : SecondOperand.getOperand(1);
813 if (!(CN = dyn_cast<ConstantSDNode>(AndMask)) ||
814 !isShiftedMask_64(CN->getZExtValue(), SMPos0, SMSize0))
815 return SDValue();
816
817 SDValue ShlShift = FirstOperand.getOpcode() == ISD::AND
818 ? SecondOperand.getOperand(1)
819 : FirstOperand.getOperand(1);
820 if (!(CN = dyn_cast<ConstantSDNode>(ShlShift)))
821 return SDValue();
822 uint64_t ShlShiftValue = CN->getZExtValue();
823
824 if (SMPos0 != 0 || SMSize0 != ShlShiftValue)
825 return SDValue();
826
827 SDLoc DL(N);
828 EVT ValTy = N->getValueType(0);
829 SMPos1 = ShlShiftValue;
830 assert(SMPos1 < ValTy.getSizeInBits());
831 SMSize1 = (ValTy == MVT::i64 ? 64 : 32) - SMPos1;
832 return DAG.getNode(MipsISD::Ins, DL, ValTy, ShlOperand0,
833 DAG.getConstant(SMPos1, DL, MVT::i32),
834 DAG.getConstant(SMSize1, DL, MVT::i32), AndOperand0);
835 }
836
837 // See if Op's first operand matches (and $src1 , mask0).
838 if (FirstOperand.getOpcode() != ISD::AND)
839 return SDValue();
840
841 // Pattern match INS.
842 // $dst = or (and $src1 , mask0), (and (shl $src, pos), mask1),
843 // where mask1 = (2**size - 1) << pos, mask0 = ~mask1
844 // => ins $dst, $src, size, pos, $src1
845 if (!(CN = dyn_cast<ConstantSDNode>(FirstOperand.getOperand(1))) ||
846 !isShiftedMask_64(~CN->getSExtValue(), SMPos0, SMSize0))
847 return SDValue();
848
849 // See if Op's second operand matches (and (shl $src, pos), mask1).
850 if (SecondOperand.getOpcode() == ISD::AND &&
851 SecondOperand.getOperand(0).getOpcode() == ISD::SHL) {
852
853 if (!(CN = dyn_cast<ConstantSDNode>(SecondOperand.getOperand(1))) ||
854 !isShiftedMask_64(CN->getZExtValue(), SMPos1, SMSize1))
855 return SDValue();
856
857 // The shift masks must have the same position and size.
858 if (SMPos0 != SMPos1 || SMSize0 != SMSize1)
859 return SDValue();
860
861 SDValue Shl = SecondOperand.getOperand(0);
862
863 if (!(CN = dyn_cast<ConstantSDNode>(Shl.getOperand(1))))
864 return SDValue();
865
866 unsigned Shamt = CN->getZExtValue();
867
868 // Return if the shift amount and the first bit position of mask are not the
869 // same.
870 EVT ValTy = N->getValueType(0);
871 if ((Shamt != SMPos0) || (SMPos0 + SMSize0 > ValTy.getSizeInBits()))
872 return SDValue();
873
874 SDLoc DL(N);
875 return DAG.getNode(MipsISD::Ins, DL, ValTy, Shl.getOperand(0),
876 DAG.getConstant(SMPos0, DL, MVT::i32),
877 DAG.getConstant(SMSize0, DL, MVT::i32),
878 FirstOperand.getOperand(0));
879 } else {
880 // Pattern match DINS.
881 // $dst = or (and $src, mask0), mask1
882 // where mask0 = maskTrailingOnes<uint64_t>(SMSize0) << SMPos0
883 // => dins $dst, $src, pos, size
884 uint64_t Mask = maskTrailingOnes<uint64_t>(SMSize0) << SMPos0;
885 if (~CN->getSExtValue() == (int64_t)Mask &&
886 ((SMSize0 + SMPos0 <= 64 && Subtarget.hasMips64r2()) ||
887 (SMSize0 + SMPos0 <= 32))) {
888 // Check if AND instruction has constant as argument
889 bool isConstCase = SecondOperand.getOpcode() != ISD::AND;
890 if (SecondOperand.getOpcode() == ISD::AND) {
891 if (!(CN1 = dyn_cast<ConstantSDNode>(SecondOperand->getOperand(1))))
892 return SDValue();
893 } else {
894 if (!(CN1 = dyn_cast<ConstantSDNode>(N->getOperand(1))))
895 return SDValue();
896 }
897 // Don't generate INS if constant OR operand doesn't fit into bits
898 // cleared by constant AND operand.
899 if (CN->getSExtValue() & CN1->getSExtValue())
900 return SDValue();
901
902 SDLoc DL(N);
903 EVT ValTy = N->getOperand(0)->getValueType(0);
904 SDValue Const1;
905 SDValue SrlX;
906 if (!isConstCase) {
907 Const1 = DAG.getConstant(SMPos0, DL, MVT::i32);
908 SrlX = DAG.getNode(ISD::SRL, DL, SecondOperand->getValueType(0),
909 SecondOperand, Const1);
910 }
911 return DAG.getNode(
912 MipsISD::Ins, DL, N->getValueType(0),
913 isConstCase
914 ? DAG.getSignedConstant(CN1->getSExtValue() >> SMPos0, DL, ValTy)
915 : SrlX,
916 DAG.getConstant(SMPos0, DL, MVT::i32),
917 DAG.getConstant(ValTy.getSizeInBits() / 8 < 8 ? SMSize0 & 31
918 : SMSize0,
919 DL, MVT::i32),
920 FirstOperand->getOperand(0));
921 }
922 return SDValue();
923 }
924}
925
927 const MipsSubtarget &Subtarget) {
928 // ROOTNode must have a multiplication as an operand for the match to be
929 // successful.
930 if (ROOTNode->getOperand(0).getOpcode() != ISD::MUL &&
931 ROOTNode->getOperand(1).getOpcode() != ISD::MUL)
932 return SDValue();
933
934 // In the case where we have a multiplication as the left operand of
935 // of a subtraction, we can't combine into a MipsISD::MSub node as the
936 // the instruction definition of msub(u) places the multiplication on
937 // on the right.
938 if (ROOTNode->getOpcode() == ISD::SUB &&
939 ROOTNode->getOperand(0).getOpcode() == ISD::MUL)
940 return SDValue();
941
942 // We don't handle vector types here.
943 if (ROOTNode->getValueType(0).isVector())
944 return SDValue();
945
946 // For MIPS64, madd / msub instructions are inefficent to use with 64 bit
947 // arithmetic. E.g.
948 // (add (mul a b) c) =>
949 // let res = (madd (mthi (drotr c 32))x(mtlo c) a b) in
950 // MIPS64: (or (dsll (mfhi res) 32) (dsrl (dsll (mflo res) 32) 32)
951 // or
952 // MIPS64R2: (dins (mflo res) (mfhi res) 32 32)
953 //
954 // The overhead of setting up the Hi/Lo registers and reassembling the
955 // result makes this a dubious optimzation for MIPS64. The core of the
956 // problem is that Hi/Lo contain the upper and lower 32 bits of the
957 // operand and result.
958 //
959 // It requires a chain of 4 add/mul for MIPS64R2 to get better code
960 // density than doing it naively, 5 for MIPS64. Additionally, using
961 // madd/msub on MIPS64 requires the operands actually be 32 bit sign
962 // extended operands, not true 64 bit values.
963 //
964 // FIXME: For the moment, disable this completely for MIPS64.
965 if (Subtarget.hasMips64())
966 return SDValue();
967
968 SDValue Mult = ROOTNode->getOperand(0).getOpcode() == ISD::MUL
969 ? ROOTNode->getOperand(0)
970 : ROOTNode->getOperand(1);
971
972 SDValue AddOperand = ROOTNode->getOperand(0).getOpcode() == ISD::MUL
973 ? ROOTNode->getOperand(1)
974 : ROOTNode->getOperand(0);
975
976 // Transform this to a MADD only if the user of this node is the add.
977 // If there are other users of the mul, this function returns here.
978 if (!Mult.hasOneUse())
979 return SDValue();
980
981 // maddu and madd are unusual instructions in that on MIPS64 bits 63..31
982 // must be in canonical form, i.e. sign extended. For MIPS32, the operands
983 // of the multiply must have 32 or more sign bits, otherwise we cannot
984 // perform this optimization. We have to check this here as we're performing
985 // this optimization pre-legalization.
986 SDValue MultLHS = Mult->getOperand(0);
987 SDValue MultRHS = Mult->getOperand(1);
988
989 bool IsSigned = MultLHS->getOpcode() == ISD::SIGN_EXTEND &&
990 MultRHS->getOpcode() == ISD::SIGN_EXTEND;
991 bool IsUnsigned = MultLHS->getOpcode() == ISD::ZERO_EXTEND &&
992 MultRHS->getOpcode() == ISD::ZERO_EXTEND;
993
994 if (!IsSigned && !IsUnsigned)
995 return SDValue();
996
997 // Initialize accumulator.
998 SDLoc DL(ROOTNode);
999 SDValue BottomHalf, TopHalf;
1000 std::tie(BottomHalf, TopHalf) =
1001 CurDAG.SplitScalar(AddOperand, DL, MVT::i32, MVT::i32);
1002 SDValue ACCIn =
1003 CurDAG.getNode(MipsISD::MTLOHI, DL, MVT::Untyped, BottomHalf, TopHalf);
1004
1005 // Create MipsMAdd(u) / MipsMSub(u) node.
1006 bool IsAdd = ROOTNode->getOpcode() == ISD::ADD;
1007 unsigned Opcode = IsAdd ? (IsUnsigned ? MipsISD::MAddu : MipsISD::MAdd)
1008 : (IsUnsigned ? MipsISD::MSubu : MipsISD::MSub);
1009 SDValue MAddOps[3] = {
1010 CurDAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Mult->getOperand(0)),
1011 CurDAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Mult->getOperand(1)), ACCIn};
1012 SDValue MAdd = CurDAG.getNode(Opcode, DL, MVT::Untyped, MAddOps);
1013
1014 SDValue ResLo = CurDAG.getNode(MipsISD::MFLO, DL, MVT::i32, MAdd);
1015 SDValue ResHi = CurDAG.getNode(MipsISD::MFHI, DL, MVT::i32, MAdd);
1016 SDValue Combined =
1017 CurDAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, ResLo, ResHi);
1018 return Combined;
1019}
1020
1023 const MipsSubtarget &Subtarget) {
1024 // (sub v0 (mul v1, v2)) => (msub v1, v2, v0)
1025 if (DCI.isBeforeLegalizeOps()) {
1026 if (Subtarget.hasMips32() && !Subtarget.hasMips32r6() &&
1027 !Subtarget.inMips16Mode() && N->getValueType(0) == MVT::i64)
1028 return performMADD_MSUBCombine(N, DAG, Subtarget);
1029
1030 return SDValue();
1031 }
1032
1033 return SDValue();
1034}
1035
1038 const MipsSubtarget &Subtarget) {
1039 // (add v0 (mul v1, v2)) => (madd v1, v2, v0)
1040 if (DCI.isBeforeLegalizeOps()) {
1041 if (Subtarget.hasMips32() && !Subtarget.hasMips32r6() &&
1042 !Subtarget.inMips16Mode() && N->getValueType(0) == MVT::i64)
1043 return performMADD_MSUBCombine(N, DAG, Subtarget);
1044
1045 return SDValue();
1046 }
1047
1048 // When loading from a jump table, push the Lo node to the position that
1049 // allows folding it into a load immediate.
1050 // (add v0, (add v1, abs_lo(tjt))) => (add (add v0, v1), abs_lo(tjt))
1051 // (add (add abs_lo(tjt), v1), v0) => (add (add v0, v1), abs_lo(tjt))
1052 SDValue InnerAdd = N->getOperand(1);
1053 SDValue Index = N->getOperand(0);
1054 if (InnerAdd.getOpcode() != ISD::ADD)
1055 std::swap(InnerAdd, Index);
1056 if (InnerAdd.getOpcode() != ISD::ADD)
1057 return SDValue();
1058
1059 SDValue Lo = InnerAdd.getOperand(0);
1060 SDValue Other = InnerAdd.getOperand(1);
1061 if (Lo.getOpcode() != MipsISD::Lo)
1062 std::swap(Lo, Other);
1063
1064 if ((Lo.getOpcode() != MipsISD::Lo) ||
1065 (Lo.getOperand(0).getOpcode() != ISD::TargetJumpTable))
1066 return SDValue();
1067
1068 EVT ValTy = N->getValueType(0);
1069 SDLoc DL(N);
1070
1071 SDValue Add1 = DAG.getNode(ISD::ADD, DL, ValTy, Index, Other);
1072 return DAG.getNode(ISD::ADD, DL, ValTy, Add1, Lo);
1073}
1074
1077 const MipsSubtarget &Subtarget) {
1078 // Pattern match CINS.
1079 // $dst = shl (and $src , imm), pos
1080 // => cins $dst, $src, pos, size
1081
1082 if (DCI.isBeforeLegalizeOps() || !Subtarget.hasCnMips())
1083 return SDValue();
1084
1085 SDValue FirstOperand = N->getOperand(0);
1086 unsigned FirstOperandOpc = FirstOperand.getOpcode();
1087 SDValue SecondOperand = N->getOperand(1);
1088 EVT ValTy = N->getValueType(0);
1089 SDLoc DL(N);
1090
1091 uint64_t Pos = 0;
1092 unsigned SMPos, SMSize;
1093 ConstantSDNode *CN;
1094 SDValue NewOperand;
1095
1096 // The second operand of the shift must be an immediate.
1097 if (!(CN = dyn_cast<ConstantSDNode>(SecondOperand)))
1098 return SDValue();
1099
1100 Pos = CN->getZExtValue();
1101
1102 if (Pos >= ValTy.getSizeInBits())
1103 return SDValue();
1104
1105 if (FirstOperandOpc != ISD::AND)
1106 return SDValue();
1107
1108 // AND's second operand must be a shifted mask.
1109 if (!(CN = dyn_cast<ConstantSDNode>(FirstOperand.getOperand(1))) ||
1110 !isShiftedMask_64(CN->getZExtValue(), SMPos, SMSize))
1111 return SDValue();
1112
1113 // Return if the shifted mask does not start at bit 0 or the sum of its size
1114 // and Pos exceeds the word's size.
1115 if (SMPos != 0 || SMSize > 32 || Pos + SMSize > ValTy.getSizeInBits())
1116 return SDValue();
1117
1118 NewOperand = FirstOperand.getOperand(0);
1119 // SMSize is 'location' (position) in this case, not size.
1120 SMSize--;
1121
1122 return DAG.getNode(MipsISD::CIns, DL, ValTy, NewOperand,
1123 DAG.getConstant(Pos, DL, MVT::i32),
1124 DAG.getConstant(SMSize, DL, MVT::i32));
1125}
1126
1129 const MipsSubtarget &Subtarget) {
1130 if (DCI.Level != AfterLegalizeDAG || !Subtarget.isGP64bit()) {
1131 return SDValue();
1132 }
1133
1134 SDValue N0 = N->getOperand(0);
1135 EVT VT = N->getValueType(0);
1136
1137 // Pattern match XOR.
1138 // $dst = sign_extend (xor (trunc $src, i32), imm)
1139 // => $dst = xor (signext_inreg $src, i32), imm
1140 if (N0.getOpcode() == ISD::XOR &&
1141 N0.getOperand(0).getOpcode() == ISD::TRUNCATE &&
1142 N0.getOperand(1).getOpcode() == ISD::Constant) {
1143 SDValue TruncateSource = N0.getOperand(0).getOperand(0);
1144 auto *ConstantOperand = dyn_cast<ConstantSDNode>(N0->getOperand(1));
1145
1146 SDValue FirstOperand =
1147 DAG.getNode(ISD::SIGN_EXTEND_INREG, SDLoc(N0), VT, TruncateSource,
1148 DAG.getValueType(N0.getOperand(0).getValueType()));
1149
1150 int64_t ConstImm = ConstantOperand->getSExtValue();
1151 return DAG.getNode(ISD::XOR, SDLoc(N0), VT, FirstOperand,
1152 DAG.getConstant(ConstImm, SDLoc(N0), VT));
1153 }
1154
1155 return SDValue();
1156}
1157
1159 const {
1160 SelectionDAG &DAG = DCI.DAG;
1161 unsigned Opc = N->getOpcode();
1162
1163 switch (Opc) {
1164 default: break;
1165 case ISD::SDIVREM:
1166 case ISD::UDIVREM:
1167 return performDivRemCombine(N, DAG, DCI, Subtarget);
1168 case ISD::SELECT:
1169 return performSELECTCombine(N, DAG, DCI, Subtarget);
1170 case MipsISD::CMovFP_F:
1171 case MipsISD::CMovFP_T:
1172 return performCMovFPCombine(N, DAG, DCI, Subtarget);
1173 case ISD::AND:
1174 return performANDCombine(N, DAG, DCI, Subtarget);
1175 case ISD::OR:
1176 return performORCombine(N, DAG, DCI, Subtarget);
1177 case ISD::ADD:
1178 return performADDCombine(N, DAG, DCI, Subtarget);
1179 case ISD::SHL:
1180 return performSHLCombine(N, DAG, DCI, Subtarget);
1181 case ISD::SUB:
1182 return performSUBCombine(N, DAG, DCI, Subtarget);
1183 case ISD::SIGN_EXTEND:
1184 return performSignExtendCombine(N, DAG, DCI, Subtarget);
1185 }
1186
1187 return SDValue();
1188}
1189
1191 return Subtarget.hasMips32();
1192}
1193
1195 return Subtarget.hasMips32();
1196}
1197
1199 // We can use ANDI+SLTIU as a bit test. Y contains the bit position.
1200 // For MIPSR2 or later, we may be able to use the `ext` instruction or its
1201 // double-word variants.
1202 if (auto *C = dyn_cast<ConstantSDNode>(Y))
1203 return C->getAPIntValue().ule(15);
1204
1205 return false;
1206}
1207
1209 const SDNode *N) const {
1210 assert(((N->getOpcode() == ISD::SHL &&
1211 N->getOperand(0).getOpcode() == ISD::SRL) ||
1212 (N->getOpcode() == ISD::SRL &&
1213 N->getOperand(0).getOpcode() == ISD::SHL)) &&
1214 "Expected shift-shift mask");
1215
1216 if (N->getOperand(0).getValueType().isVector())
1217 return false;
1218 return true;
1219}
1220
1221void
1227
1230{
1231 switch (Op.getOpcode())
1232 {
1233 case ISD::BRCOND: return lowerBRCOND(Op, DAG);
1234 case ISD::ConstantPool: return lowerConstantPool(Op, DAG);
1235 case ISD::GlobalAddress: return lowerGlobalAddress(Op, DAG);
1236 case ISD::BlockAddress: return lowerBlockAddress(Op, DAG);
1237 case ISD::GlobalTLSAddress: return lowerGlobalTLSAddress(Op, DAG);
1238 case ISD::JumpTable: return lowerJumpTable(Op, DAG);
1239 case ISD::SELECT: return lowerSELECT(Op, DAG);
1240 case ISD::SETCC: return lowerSETCC(Op, DAG);
1241 case ISD::STRICT_FSETCC:
1243 return lowerFSETCC(Op, DAG);
1244 case ISD::VASTART: return lowerVASTART(Op, DAG);
1245 case ISD::VAARG: return lowerVAARG(Op, DAG);
1246 case ISD::FCOPYSIGN: return lowerFCOPYSIGN(Op, DAG);
1247 case ISD::FABS: return lowerFABS(Op, DAG);
1248 case ISD::FCANONICALIZE:
1249 return lowerFCANONICALIZE(Op, DAG);
1250 case ISD::FRAMEADDR: return lowerFRAMEADDR(Op, DAG);
1251 case ISD::RETURNADDR: return lowerRETURNADDR(Op, DAG);
1252 case ISD::EH_RETURN: return lowerEH_RETURN(Op, DAG);
1253 case ISD::ATOMIC_FENCE: return lowerATOMIC_FENCE(Op, DAG);
1254 case ISD::SHL_PARTS: return lowerShiftLeftParts(Op, DAG);
1255 case ISD::SRA_PARTS: return lowerShiftRightParts(Op, DAG, true);
1256 case ISD::SRL_PARTS: return lowerShiftRightParts(Op, DAG, false);
1257 case ISD::LOAD: return lowerLOAD(Op, DAG);
1258 case ISD::STORE: return lowerSTORE(Op, DAG);
1259 case ISD::EH_DWARF_CFA: return lowerEH_DWARF_CFA(Op, DAG);
1262 return lowerSTRICT_FP_TO_INT(Op, DAG);
1263 case ISD::FP_TO_SINT: return lowerFP_TO_SINT(Op, DAG);
1265 return lowerREADCYCLECOUNTER(Op, DAG);
1266 case ISD::ConstantFP:
1267 return lowerConstantFP(Op, DAG);
1268 }
1269 return SDValue();
1270}
1271
1272//===----------------------------------------------------------------------===//
1273// Lower helper functions
1274//===----------------------------------------------------------------------===//
1275
1276// addLiveIn - This helper function adds the specified physical register to the
1277// MachineFunction as a live in value. It also creates a corresponding
1278// virtual register for it.
1279static unsigned
1280addLiveIn(MachineFunction &MF, unsigned PReg, const TargetRegisterClass *RC)
1281{
1283 MF.getRegInfo().addLiveIn(PReg, VReg);
1284 return VReg;
1285}
1286
1287static MachineBasicBlock *
1288insertDivByZeroTrap(const MipsMCOptions &MCCLOpts, MachineInstr &MI,
1290 bool Is64Bit, const DivByZeroTrapKind TrapKind) {
1291 if (MCCLOpts.mno_check_zero_division)
1292 return &MBB;
1293
1294 MachineOperand &Divisor = MI.getOperand(2);
1295
1296 if (TrapKind == DivByZeroTrapKind::Break) {
1297 // Build instructions:
1298 // MBB:
1299 // bnez $divisor, $zero, SinkMBB
1300 // MI $dst, $dividend, $divisor (delay slot)
1301 //
1302 // BreakMBB:
1303 // break 7
1304 //
1305 // SinkMBB:
1306 // fallthrough
1307 const DebugLoc &DL = MI.getDebugLoc();
1308 const BasicBlock *BB = MBB.getBasicBlock();
1309
1310 // Place all instructions after MI into SinkMBB.
1311 MachineBasicBlock *SinkMBB = MBB.splitAt(MI, true);
1312
1313 // BreakMBB setup.
1314 MachineFunction *MF = MBB.getParent();
1315 MachineBasicBlock *BreakMBB = MF->CreateMachineBasicBlock(BB);
1316 MF->insert(++MBB.getIterator(), BreakMBB);
1317
1318 // Place the branch at the end of the block. Since MI is defined as having
1319 // no side effects in TableGen, the filler will place it in the branch delay
1320 // slot.
1321 BuildMI(&MBB, DL, TII.get(Mips::BNE))
1322 .addReg(Divisor.getReg(), getKillRegState(Divisor.isKill()))
1323 .addReg(Mips::R0)
1324 .addMBB(SinkMBB);
1325
1326 // BreakMBB: break 7
1327 BuildMI(BreakMBB, DL, TII.get(Mips::BREAK)).addImm(7).addImm(0);
1328
1329 MBB.addSuccessor(BreakMBB);
1330 BreakMBB->addSuccessor(SinkMBB);
1331
1332 Divisor.setIsKill(false);
1333
1334 return SinkMBB;
1335 }
1336
1337 // Insert instruction "teq $divisor_reg, $zero, 7".
1340 MIB = BuildMI(MBB, std::next(I), MI.getDebugLoc(),
1341 TII.get(TrapKind == DivByZeroTrapKind::TeqMM ? Mips::TEQ_MM
1342 : Mips::TEQ))
1343 .addReg(Divisor.getReg(), getKillRegState(Divisor.isKill()))
1344 .addReg(Mips::R0)
1345 .addImm(7);
1346
1347 // Use the 32-bit sub-register if this is a 64-bit division.
1348 if (Is64Bit)
1349 MIB->getOperand(0).setSubReg(Mips::sub_32);
1350
1351 // Clear Divisor's kill flag.
1352 Divisor.setIsKill(false);
1353
1354 // We would normally delete the original instruction here but in this case
1355 // we only needed to inject an additional instruction rather than replace it.
1356
1357 return &MBB;
1358}
1359
1362 MachineBasicBlock *BB) const {
1363 switch (MI.getOpcode()) {
1364 default:
1365 llvm_unreachable("Unexpected instr type to insert");
1366 case Mips::ATOMIC_LOAD_ADD_I8:
1367 return emitAtomicBinaryPartword(MI, BB, 1);
1368 case Mips::ATOMIC_LOAD_ADD_I16:
1369 return emitAtomicBinaryPartword(MI, BB, 2);
1370 case Mips::ATOMIC_LOAD_ADD_I32:
1371 return emitAtomicBinary(MI, BB);
1372 case Mips::ATOMIC_LOAD_ADD_I64:
1373 return emitAtomicBinary(MI, BB);
1374
1375 case Mips::ATOMIC_LOAD_AND_I8:
1376 return emitAtomicBinaryPartword(MI, BB, 1);
1377 case Mips::ATOMIC_LOAD_AND_I16:
1378 return emitAtomicBinaryPartword(MI, BB, 2);
1379 case Mips::ATOMIC_LOAD_AND_I32:
1380 return emitAtomicBinary(MI, BB);
1381 case Mips::ATOMIC_LOAD_AND_I64:
1382 return emitAtomicBinary(MI, BB);
1383
1384 case Mips::ATOMIC_LOAD_OR_I8:
1385 return emitAtomicBinaryPartword(MI, BB, 1);
1386 case Mips::ATOMIC_LOAD_OR_I16:
1387 return emitAtomicBinaryPartword(MI, BB, 2);
1388 case Mips::ATOMIC_LOAD_OR_I32:
1389 return emitAtomicBinary(MI, BB);
1390 case Mips::ATOMIC_LOAD_OR_I64:
1391 return emitAtomicBinary(MI, BB);
1392
1393 case Mips::ATOMIC_LOAD_XOR_I8:
1394 return emitAtomicBinaryPartword(MI, BB, 1);
1395 case Mips::ATOMIC_LOAD_XOR_I16:
1396 return emitAtomicBinaryPartword(MI, BB, 2);
1397 case Mips::ATOMIC_LOAD_XOR_I32:
1398 return emitAtomicBinary(MI, BB);
1399 case Mips::ATOMIC_LOAD_XOR_I64:
1400 return emitAtomicBinary(MI, BB);
1401
1402 case Mips::ATOMIC_LOAD_NAND_I8:
1403 return emitAtomicBinaryPartword(MI, BB, 1);
1404 case Mips::ATOMIC_LOAD_NAND_I16:
1405 return emitAtomicBinaryPartword(MI, BB, 2);
1406 case Mips::ATOMIC_LOAD_NAND_I32:
1407 return emitAtomicBinary(MI, BB);
1408 case Mips::ATOMIC_LOAD_NAND_I64:
1409 return emitAtomicBinary(MI, BB);
1410
1411 case Mips::ATOMIC_LOAD_SUB_I8:
1412 return emitAtomicBinaryPartword(MI, BB, 1);
1413 case Mips::ATOMIC_LOAD_SUB_I16:
1414 return emitAtomicBinaryPartword(MI, BB, 2);
1415 case Mips::ATOMIC_LOAD_SUB_I32:
1416 return emitAtomicBinary(MI, BB);
1417 case Mips::ATOMIC_LOAD_SUB_I64:
1418 return emitAtomicBinary(MI, BB);
1419
1420 case Mips::ATOMIC_SWAP_I8:
1421 return emitAtomicBinaryPartword(MI, BB, 1);
1422 case Mips::ATOMIC_SWAP_I16:
1423 return emitAtomicBinaryPartword(MI, BB, 2);
1424 case Mips::ATOMIC_SWAP_I32:
1425 return emitAtomicBinary(MI, BB);
1426 case Mips::ATOMIC_SWAP_I64:
1427 return emitAtomicBinary(MI, BB);
1428
1429 case Mips::ATOMIC_CMP_SWAP_I8:
1430 return emitAtomicCmpSwapPartword(MI, BB, 1);
1431 case Mips::ATOMIC_CMP_SWAP_I16:
1432 return emitAtomicCmpSwapPartword(MI, BB, 2);
1433 case Mips::ATOMIC_CMP_SWAP_I32:
1434 return emitAtomicCmpSwap(MI, BB);
1435 case Mips::ATOMIC_CMP_SWAP_I64:
1436 return emitAtomicCmpSwap(MI, BB);
1437
1438 case Mips::ATOMIC_LOAD_MIN_I8:
1439 return emitAtomicBinaryPartword(MI, BB, 1);
1440 case Mips::ATOMIC_LOAD_MIN_I16:
1441 return emitAtomicBinaryPartword(MI, BB, 2);
1442 case Mips::ATOMIC_LOAD_MIN_I32:
1443 return emitAtomicBinary(MI, BB);
1444 case Mips::ATOMIC_LOAD_MIN_I64:
1445 return emitAtomicBinary(MI, BB);
1446
1447 case Mips::ATOMIC_LOAD_MAX_I8:
1448 return emitAtomicBinaryPartword(MI, BB, 1);
1449 case Mips::ATOMIC_LOAD_MAX_I16:
1450 return emitAtomicBinaryPartword(MI, BB, 2);
1451 case Mips::ATOMIC_LOAD_MAX_I32:
1452 return emitAtomicBinary(MI, BB);
1453 case Mips::ATOMIC_LOAD_MAX_I64:
1454 return emitAtomicBinary(MI, BB);
1455
1456 case Mips::ATOMIC_LOAD_UMIN_I8:
1457 return emitAtomicBinaryPartword(MI, BB, 1);
1458 case Mips::ATOMIC_LOAD_UMIN_I16:
1459 return emitAtomicBinaryPartword(MI, BB, 2);
1460 case Mips::ATOMIC_LOAD_UMIN_I32:
1461 return emitAtomicBinary(MI, BB);
1462 case Mips::ATOMIC_LOAD_UMIN_I64:
1463 return emitAtomicBinary(MI, BB);
1464
1465 case Mips::ATOMIC_LOAD_UMAX_I8:
1466 return emitAtomicBinaryPartword(MI, BB, 1);
1467 case Mips::ATOMIC_LOAD_UMAX_I16:
1468 return emitAtomicBinaryPartword(MI, BB, 2);
1469 case Mips::ATOMIC_LOAD_UMAX_I32:
1470 return emitAtomicBinary(MI, BB);
1471 case Mips::ATOMIC_LOAD_UMAX_I64:
1472 return emitAtomicBinary(MI, BB);
1473
1474 case Mips::PseudoSDIV:
1475 case Mips::PseudoUDIV:
1476 case Mips::DIV:
1477 case Mips::DIVU:
1478 case Mips::MOD:
1479 case Mips::MODU: {
1480 const DivByZeroTrapKind TrapKind = !Subtarget.hasMips2()
1483 return insertDivByZeroTrap(Subtarget.getMCCLOpts(), MI, *BB,
1484 *Subtarget.getInstrInfo(), false, TrapKind);
1485 }
1486 case Mips::SDIV_MM_Pseudo:
1487 case Mips::UDIV_MM_Pseudo:
1488 case Mips::SDIV_MM:
1489 case Mips::UDIV_MM:
1490 case Mips::DIV_MMR6:
1491 case Mips::DIVU_MMR6:
1492 case Mips::MOD_MMR6:
1493 case Mips::MODU_MMR6:
1494 return insertDivByZeroTrap(Subtarget.getMCCLOpts(), MI, *BB,
1495 *Subtarget.getInstrInfo(), false,
1497 case Mips::PseudoDSDIV:
1498 case Mips::PseudoDUDIV:
1499 case Mips::DDIV:
1500 case Mips::DDIVU:
1501 case Mips::DMOD:
1502 case Mips::DMODU:
1503 return insertDivByZeroTrap(Subtarget.getMCCLOpts(), MI, *BB,
1504 *Subtarget.getInstrInfo(), true,
1506
1507 case Mips::PseudoSELECT_I:
1508 case Mips::PseudoSELECT_I64:
1509 case Mips::PseudoSELECT_S:
1510 case Mips::PseudoSELECT_D32:
1511 case Mips::PseudoSELECT_D64:
1512 return emitPseudoSELECT(MI, BB, false, Mips::BNE);
1513 case Mips::PseudoSELECTFP_F_I:
1514 case Mips::PseudoSELECTFP_F_I64:
1515 case Mips::PseudoSELECTFP_F_S:
1516 case Mips::PseudoSELECTFP_F_D32:
1517 case Mips::PseudoSELECTFP_F_D64:
1518 return emitPseudoSELECT(MI, BB, true, Mips::BC1F);
1519 case Mips::PseudoSELECTFP_T_I:
1520 case Mips::PseudoSELECTFP_T_I64:
1521 case Mips::PseudoSELECTFP_T_S:
1522 case Mips::PseudoSELECTFP_T_D32:
1523 case Mips::PseudoSELECTFP_T_D64:
1524 return emitPseudoSELECT(MI, BB, true, Mips::BC1T);
1525 case Mips::PseudoD_SELECT_I:
1526 case Mips::PseudoD_SELECT_I64:
1527 return emitPseudoD_SELECT(MI, BB);
1528 case Mips::LDR_W:
1529 return emitLDR_W(MI, BB);
1530 case Mips::LDR_D:
1531 return emitLDR_D(MI, BB);
1532 case Mips::STR_W:
1533 return emitSTR_W(MI, BB);
1534 case Mips::STR_D:
1535 return emitSTR_D(MI, BB);
1536 }
1537}
1538
1539// This function also handles Mips::ATOMIC_SWAP_I32 (when BinOpcode == 0), and
1540// Mips::ATOMIC_LOAD_NAND_I32 (when Nand == true)
1542MipsTargetLowering::emitAtomicBinary(MachineInstr &MI,
1543 MachineBasicBlock *BB) const {
1544
1545 MachineFunction *MF = BB->getParent();
1546 MachineRegisterInfo &RegInfo = MF->getRegInfo();
1548 DebugLoc DL = MI.getDebugLoc();
1549
1550 unsigned AtomicOp;
1551 bool NeedsAdditionalReg = false;
1552 switch (MI.getOpcode()) {
1553 case Mips::ATOMIC_LOAD_ADD_I32:
1554 AtomicOp = Mips::ATOMIC_LOAD_ADD_I32_POSTRA;
1555 break;
1556 case Mips::ATOMIC_LOAD_SUB_I32:
1557 AtomicOp = Mips::ATOMIC_LOAD_SUB_I32_POSTRA;
1558 break;
1559 case Mips::ATOMIC_LOAD_AND_I32:
1560 AtomicOp = Mips::ATOMIC_LOAD_AND_I32_POSTRA;
1561 break;
1562 case Mips::ATOMIC_LOAD_OR_I32:
1563 AtomicOp = Mips::ATOMIC_LOAD_OR_I32_POSTRA;
1564 break;
1565 case Mips::ATOMIC_LOAD_XOR_I32:
1566 AtomicOp = Mips::ATOMIC_LOAD_XOR_I32_POSTRA;
1567 break;
1568 case Mips::ATOMIC_LOAD_NAND_I32:
1569 AtomicOp = Mips::ATOMIC_LOAD_NAND_I32_POSTRA;
1570 break;
1571 case Mips::ATOMIC_SWAP_I32:
1572 AtomicOp = Mips::ATOMIC_SWAP_I32_POSTRA;
1573 break;
1574 case Mips::ATOMIC_LOAD_ADD_I64:
1575 AtomicOp = Mips::ATOMIC_LOAD_ADD_I64_POSTRA;
1576 break;
1577 case Mips::ATOMIC_LOAD_SUB_I64:
1578 AtomicOp = Mips::ATOMIC_LOAD_SUB_I64_POSTRA;
1579 break;
1580 case Mips::ATOMIC_LOAD_AND_I64:
1581 AtomicOp = Mips::ATOMIC_LOAD_AND_I64_POSTRA;
1582 break;
1583 case Mips::ATOMIC_LOAD_OR_I64:
1584 AtomicOp = Mips::ATOMIC_LOAD_OR_I64_POSTRA;
1585 break;
1586 case Mips::ATOMIC_LOAD_XOR_I64:
1587 AtomicOp = Mips::ATOMIC_LOAD_XOR_I64_POSTRA;
1588 break;
1589 case Mips::ATOMIC_LOAD_NAND_I64:
1590 AtomicOp = Mips::ATOMIC_LOAD_NAND_I64_POSTRA;
1591 break;
1592 case Mips::ATOMIC_SWAP_I64:
1593 AtomicOp = Mips::ATOMIC_SWAP_I64_POSTRA;
1594 break;
1595 case Mips::ATOMIC_LOAD_MIN_I32:
1596 AtomicOp = Mips::ATOMIC_LOAD_MIN_I32_POSTRA;
1597 NeedsAdditionalReg = true;
1598 break;
1599 case Mips::ATOMIC_LOAD_MAX_I32:
1600 AtomicOp = Mips::ATOMIC_LOAD_MAX_I32_POSTRA;
1601 NeedsAdditionalReg = true;
1602 break;
1603 case Mips::ATOMIC_LOAD_UMIN_I32:
1604 AtomicOp = Mips::ATOMIC_LOAD_UMIN_I32_POSTRA;
1605 NeedsAdditionalReg = true;
1606 break;
1607 case Mips::ATOMIC_LOAD_UMAX_I32:
1608 AtomicOp = Mips::ATOMIC_LOAD_UMAX_I32_POSTRA;
1609 NeedsAdditionalReg = true;
1610 break;
1611 case Mips::ATOMIC_LOAD_MIN_I64:
1612 AtomicOp = Mips::ATOMIC_LOAD_MIN_I64_POSTRA;
1613 NeedsAdditionalReg = true;
1614 break;
1615 case Mips::ATOMIC_LOAD_MAX_I64:
1616 AtomicOp = Mips::ATOMIC_LOAD_MAX_I64_POSTRA;
1617 NeedsAdditionalReg = true;
1618 break;
1619 case Mips::ATOMIC_LOAD_UMIN_I64:
1620 AtomicOp = Mips::ATOMIC_LOAD_UMIN_I64_POSTRA;
1621 NeedsAdditionalReg = true;
1622 break;
1623 case Mips::ATOMIC_LOAD_UMAX_I64:
1624 AtomicOp = Mips::ATOMIC_LOAD_UMAX_I64_POSTRA;
1625 NeedsAdditionalReg = true;
1626 break;
1627 default:
1628 llvm_unreachable("Unknown pseudo atomic for replacement!");
1629 }
1630
1631 Register OldVal = MI.getOperand(0).getReg();
1632 Register Ptr = MI.getOperand(1).getReg();
1633 Register Incr = MI.getOperand(2).getReg();
1634 Register Scratch = RegInfo.createVirtualRegister(RegInfo.getRegClass(OldVal));
1635
1637
1638 // The scratch registers here with the EarlyClobber | Define | Implicit
1639 // flags is used to persuade the register allocator and the machine
1640 // verifier to accept the usage of this register. This has to be a real
1641 // register which has an UNDEF value but is dead after the instruction which
1642 // is unique among the registers chosen for the instruction.
1643
1644 // The EarlyClobber flag has the semantic properties that the operand it is
1645 // attached to is clobbered before the rest of the inputs are read. Hence it
1646 // must be unique among the operands to the instruction.
1647 // The Define flag is needed to coerce the machine verifier that an Undef
1648 // value isn't a problem.
1649 // The Dead flag is needed as the value in scratch isn't used by any other
1650 // instruction. Kill isn't used as Dead is more precise.
1651 // The implicit flag is here due to the interaction between the other flags
1652 // and the machine verifier.
1653
1654 // For correctness purpose, a new pseudo is introduced here. We need this
1655 // new pseudo, so that FastRegisterAllocator does not see an ll/sc sequence
1656 // that is spread over >1 basic blocks. A register allocator which
1657 // introduces (or any codegen infact) a store, can violate the expectations
1658 // of the hardware.
1659 //
1660 // An atomic read-modify-write sequence starts with a linked load
1661 // instruction and ends with a store conditional instruction. The atomic
1662 // read-modify-write sequence fails if any of the following conditions
1663 // occur between the execution of ll and sc:
1664 // * A coherent store is completed by another process or coherent I/O
1665 // module into the block of synchronizable physical memory containing
1666 // the word. The size and alignment of the block is
1667 // implementation-dependent.
1668 // * A coherent store is executed between an LL and SC sequence on the
1669 // same processor to the block of synchornizable physical memory
1670 // containing the word.
1671 //
1672
1673 Register PtrCopy = RegInfo.createVirtualRegister(RegInfo.getRegClass(Ptr));
1674 Register IncrCopy = RegInfo.createVirtualRegister(RegInfo.getRegClass(Incr));
1675
1676 BuildMI(*BB, II, DL, TII->get(Mips::COPY), IncrCopy).addReg(Incr);
1677 BuildMI(*BB, II, DL, TII->get(Mips::COPY), PtrCopy).addReg(Ptr);
1678
1680 BuildMI(*BB, II, DL, TII->get(AtomicOp))
1682 .addReg(PtrCopy)
1683 .addReg(IncrCopy)
1686 if (NeedsAdditionalReg) {
1687 Register Scratch2 =
1688 RegInfo.createVirtualRegister(RegInfo.getRegClass(OldVal));
1691 }
1692
1693 MI.eraseFromParent();
1694
1695 return BB;
1696}
1697
1698MachineBasicBlock *MipsTargetLowering::emitSignExtendToI32InReg(
1699 MachineInstr &MI, MachineBasicBlock *BB, unsigned Size, unsigned DstReg,
1700 unsigned SrcReg) const {
1701 const TargetInstrInfo *TII = Subtarget.getInstrInfo();
1702 const DebugLoc &DL = MI.getDebugLoc();
1703
1704 if (Subtarget.hasMips32r2() && Size == 1) {
1705 BuildMI(BB, DL, TII->get(Mips::SEB), DstReg).addReg(SrcReg);
1706 return BB;
1707 }
1708
1709 if (Subtarget.hasMips32r2() && Size == 2) {
1710 BuildMI(BB, DL, TII->get(Mips::SEH), DstReg).addReg(SrcReg);
1711 return BB;
1712 }
1713
1714 MachineFunction *MF = BB->getParent();
1715 MachineRegisterInfo &RegInfo = MF->getRegInfo();
1716 const TargetRegisterClass *RC = getRegClassFor(MVT::i32);
1717 Register ScrReg = RegInfo.createVirtualRegister(RC);
1718
1719 assert(Size < 32);
1720 int64_t ShiftImm = 32 - (Size * 8);
1721
1722 BuildMI(BB, DL, TII->get(Mips::SLL), ScrReg).addReg(SrcReg).addImm(ShiftImm);
1723 BuildMI(BB, DL, TII->get(Mips::SRA), DstReg).addReg(ScrReg).addImm(ShiftImm);
1724
1725 return BB;
1726}
1727
1728MachineBasicBlock *MipsTargetLowering::emitAtomicBinaryPartword(
1729 MachineInstr &MI, MachineBasicBlock *BB, unsigned Size) const {
1730 assert((Size == 1 || Size == 2) &&
1731 "Unsupported size for EmitAtomicBinaryPartial.");
1732
1733 MachineFunction *MF = BB->getParent();
1734 MachineRegisterInfo &RegInfo = MF->getRegInfo();
1735 const TargetRegisterClass *RC = getRegClassFor(MVT::i32);
1736 const bool ArePtrs64bit = ABI.ArePtrs64bit();
1737 const TargetRegisterClass *RCp =
1738 getRegClassFor(ArePtrs64bit ? MVT::i64 : MVT::i32);
1739 const TargetInstrInfo *TII = Subtarget.getInstrInfo();
1740 DebugLoc DL = MI.getDebugLoc();
1741
1742 Register Dest = MI.getOperand(0).getReg();
1743 Register Ptr = MI.getOperand(1).getReg();
1744 Register Incr = MI.getOperand(2).getReg();
1745
1746 Register AlignedAddr = RegInfo.createVirtualRegister(RCp);
1747 Register ShiftAmt = RegInfo.createVirtualRegister(RC);
1748 Register Mask = RegInfo.createVirtualRegister(RC);
1749 Register Mask2 = RegInfo.createVirtualRegister(RC);
1750 Register Incr2 = RegInfo.createVirtualRegister(RC);
1751 Register MaskLSB2 = RegInfo.createVirtualRegister(RCp);
1752 Register PtrLSB2 = RegInfo.createVirtualRegister(RC);
1753 Register MaskUpper = RegInfo.createVirtualRegister(RC);
1754 Register Scratch = RegInfo.createVirtualRegister(RC);
1755 Register Scratch2 = RegInfo.createVirtualRegister(RC);
1756 Register Scratch3 = RegInfo.createVirtualRegister(RC);
1757
1758 unsigned AtomicOp = 0;
1759 bool NeedsAdditionalReg = false;
1760 switch (MI.getOpcode()) {
1761 case Mips::ATOMIC_LOAD_NAND_I8:
1762 AtomicOp = Mips::ATOMIC_LOAD_NAND_I8_POSTRA;
1763 break;
1764 case Mips::ATOMIC_LOAD_NAND_I16:
1765 AtomicOp = Mips::ATOMIC_LOAD_NAND_I16_POSTRA;
1766 break;
1767 case Mips::ATOMIC_SWAP_I8:
1768 AtomicOp = Mips::ATOMIC_SWAP_I8_POSTRA;
1769 break;
1770 case Mips::ATOMIC_SWAP_I16:
1771 AtomicOp = Mips::ATOMIC_SWAP_I16_POSTRA;
1772 break;
1773 case Mips::ATOMIC_LOAD_ADD_I8:
1774 AtomicOp = Mips::ATOMIC_LOAD_ADD_I8_POSTRA;
1775 break;
1776 case Mips::ATOMIC_LOAD_ADD_I16:
1777 AtomicOp = Mips::ATOMIC_LOAD_ADD_I16_POSTRA;
1778 break;
1779 case Mips::ATOMIC_LOAD_SUB_I8:
1780 AtomicOp = Mips::ATOMIC_LOAD_SUB_I8_POSTRA;
1781 break;
1782 case Mips::ATOMIC_LOAD_SUB_I16:
1783 AtomicOp = Mips::ATOMIC_LOAD_SUB_I16_POSTRA;
1784 break;
1785 case Mips::ATOMIC_LOAD_AND_I8:
1786 AtomicOp = Mips::ATOMIC_LOAD_AND_I8_POSTRA;
1787 break;
1788 case Mips::ATOMIC_LOAD_AND_I16:
1789 AtomicOp = Mips::ATOMIC_LOAD_AND_I16_POSTRA;
1790 break;
1791 case Mips::ATOMIC_LOAD_OR_I8:
1792 AtomicOp = Mips::ATOMIC_LOAD_OR_I8_POSTRA;
1793 break;
1794 case Mips::ATOMIC_LOAD_OR_I16:
1795 AtomicOp = Mips::ATOMIC_LOAD_OR_I16_POSTRA;
1796 break;
1797 case Mips::ATOMIC_LOAD_XOR_I8:
1798 AtomicOp = Mips::ATOMIC_LOAD_XOR_I8_POSTRA;
1799 break;
1800 case Mips::ATOMIC_LOAD_XOR_I16:
1801 AtomicOp = Mips::ATOMIC_LOAD_XOR_I16_POSTRA;
1802 break;
1803 case Mips::ATOMIC_LOAD_MIN_I8:
1804 AtomicOp = Mips::ATOMIC_LOAD_MIN_I8_POSTRA;
1805 NeedsAdditionalReg = true;
1806 break;
1807 case Mips::ATOMIC_LOAD_MIN_I16:
1808 AtomicOp = Mips::ATOMIC_LOAD_MIN_I16_POSTRA;
1809 NeedsAdditionalReg = true;
1810 break;
1811 case Mips::ATOMIC_LOAD_MAX_I8:
1812 AtomicOp = Mips::ATOMIC_LOAD_MAX_I8_POSTRA;
1813 NeedsAdditionalReg = true;
1814 break;
1815 case Mips::ATOMIC_LOAD_MAX_I16:
1816 AtomicOp = Mips::ATOMIC_LOAD_MAX_I16_POSTRA;
1817 NeedsAdditionalReg = true;
1818 break;
1819 case Mips::ATOMIC_LOAD_UMIN_I8:
1820 AtomicOp = Mips::ATOMIC_LOAD_UMIN_I8_POSTRA;
1821 NeedsAdditionalReg = true;
1822 break;
1823 case Mips::ATOMIC_LOAD_UMIN_I16:
1824 AtomicOp = Mips::ATOMIC_LOAD_UMIN_I16_POSTRA;
1825 NeedsAdditionalReg = true;
1826 break;
1827 case Mips::ATOMIC_LOAD_UMAX_I8:
1828 AtomicOp = Mips::ATOMIC_LOAD_UMAX_I8_POSTRA;
1829 NeedsAdditionalReg = true;
1830 break;
1831 case Mips::ATOMIC_LOAD_UMAX_I16:
1832 AtomicOp = Mips::ATOMIC_LOAD_UMAX_I16_POSTRA;
1833 NeedsAdditionalReg = true;
1834 break;
1835 default:
1836 llvm_unreachable("Unknown subword atomic pseudo for expansion!");
1837 }
1838
1839 // insert new blocks after the current block
1840 const BasicBlock *LLVM_BB = BB->getBasicBlock();
1841 MachineBasicBlock *exitMBB = MF->CreateMachineBasicBlock(LLVM_BB);
1843 MF->insert(It, exitMBB);
1844
1845 // Transfer the remainder of BB and its successor edges to exitMBB.
1846 exitMBB->splice(exitMBB->begin(), BB,
1847 std::next(MachineBasicBlock::iterator(MI)), BB->end());
1849
1851
1852 // thisMBB:
1853 // addiu masklsb2,$0,-4 # 0xfffffffc
1854 // and alignedaddr,ptr,masklsb2
1855 // andi ptrlsb2,ptr,3
1856 // sll shiftamt,ptrlsb2,3
1857 // ori maskupper,$0,255 # 0xff
1858 // sll mask,maskupper,shiftamt
1859 // nor mask2,$0,mask
1860 // sll incr2,incr,shiftamt
1861
1862 int64_t MaskImm = (Size == 1) ? 255 : 65535;
1863 BuildMI(BB, DL, TII->get(ABI.GetPtrAddiuOp()), MaskLSB2)
1864 .addReg(ABI.GetNullPtr()).addImm(-4);
1865 BuildMI(BB, DL, TII->get(ABI.GetPtrAndOp()), AlignedAddr)
1866 .addReg(Ptr).addReg(MaskLSB2);
1867 BuildMI(BB, DL, TII->get(Mips::ANDi), PtrLSB2)
1868 .addReg(Ptr, {}, ArePtrs64bit ? Mips::sub_32 : 0)
1869 .addImm(3);
1870 if (Subtarget.isLittle()) {
1871 BuildMI(BB, DL, TII->get(Mips::SLL), ShiftAmt).addReg(PtrLSB2).addImm(3);
1872 } else {
1873 Register Off = RegInfo.createVirtualRegister(RC);
1874 BuildMI(BB, DL, TII->get(Mips::XORi), Off)
1875 .addReg(PtrLSB2).addImm((Size == 1) ? 3 : 2);
1876 BuildMI(BB, DL, TII->get(Mips::SLL), ShiftAmt).addReg(Off).addImm(3);
1877 }
1878 BuildMI(BB, DL, TII->get(Mips::ORi), MaskUpper)
1879 .addReg(Mips::R0)
1880 .addImm(MaskImm);
1881 BuildMI(BB, DL, TII->get(Mips::SLLV), Mask)
1882 .addReg(MaskUpper).addReg(ShiftAmt);
1883 BuildMI(BB, DL, TII->get(Mips::NOR), Mask2).addReg(Mips::R0).addReg(Mask);
1884 BuildMI(BB, DL, TII->get(Mips::SLLV), Incr2).addReg(Incr).addReg(ShiftAmt);
1885
1886
1887 // The purposes of the flags on the scratch registers is explained in
1888 // emitAtomicBinary. In summary, we need a scratch register which is going to
1889 // be undef, that is unique among registers chosen for the instruction.
1890
1891 MachineInstrBuilder MIB =
1892 BuildMI(BB, DL, TII->get(AtomicOp))
1894 .addReg(AlignedAddr)
1895 .addReg(Incr2)
1896 .addReg(Mask)
1897 .addReg(Mask2)
1898 .addReg(ShiftAmt)
1905 if (NeedsAdditionalReg) {
1906 Register Scratch4 = RegInfo.createVirtualRegister(RC);
1909 }
1910
1911 MI.eraseFromParent(); // The instruction is gone now.
1912
1913 return exitMBB;
1914}
1915
1916// Lower atomic compare and swap to a pseudo instruction, taking care to
1917// define a scratch register for the pseudo instruction's expansion. The
1918// instruction is expanded after the register allocator as to prevent
1919// the insertion of stores between the linked load and the store conditional.
1920
1922MipsTargetLowering::emitAtomicCmpSwap(MachineInstr &MI,
1923 MachineBasicBlock *BB) const {
1924
1925 assert((MI.getOpcode() == Mips::ATOMIC_CMP_SWAP_I32 ||
1926 MI.getOpcode() == Mips::ATOMIC_CMP_SWAP_I64) &&
1927 "Unsupported atomic pseudo for EmitAtomicCmpSwap.");
1928
1929 const unsigned Size = MI.getOpcode() == Mips::ATOMIC_CMP_SWAP_I32 ? 4 : 8;
1930
1931 MachineFunction *MF = BB->getParent();
1932 MachineRegisterInfo &MRI = MF->getRegInfo();
1934 const TargetInstrInfo *TII = Subtarget.getInstrInfo();
1935 DebugLoc DL = MI.getDebugLoc();
1936
1937 unsigned AtomicOp = MI.getOpcode() == Mips::ATOMIC_CMP_SWAP_I32
1938 ? Mips::ATOMIC_CMP_SWAP_I32_POSTRA
1939 : Mips::ATOMIC_CMP_SWAP_I64_POSTRA;
1940 Register Dest = MI.getOperand(0).getReg();
1941 Register Ptr = MI.getOperand(1).getReg();
1942 Register OldVal = MI.getOperand(2).getReg();
1943 Register NewVal = MI.getOperand(3).getReg();
1944
1945 Register Scratch = MRI.createVirtualRegister(RC);
1947
1948 // We need to create copies of the various registers and kill them at the
1949 // atomic pseudo. If the copies are not made, when the atomic is expanded
1950 // after fast register allocation, the spills will end up outside of the
1951 // blocks that their values are defined in, causing livein errors.
1952
1953 Register PtrCopy = MRI.createVirtualRegister(MRI.getRegClass(Ptr));
1954 Register OldValCopy = MRI.createVirtualRegister(MRI.getRegClass(OldVal));
1955 Register NewValCopy = MRI.createVirtualRegister(MRI.getRegClass(NewVal));
1956
1957 BuildMI(*BB, II, DL, TII->get(Mips::COPY), PtrCopy).addReg(Ptr);
1958 BuildMI(*BB, II, DL, TII->get(Mips::COPY), OldValCopy).addReg(OldVal);
1959 BuildMI(*BB, II, DL, TII->get(Mips::COPY), NewValCopy).addReg(NewVal);
1960
1961 // The purposes of the flags on the scratch registers is explained in
1962 // emitAtomicBinary. In summary, we need a scratch register which is going to
1963 // be undef, that is unique among registers chosen for the instruction.
1964
1965 BuildMI(*BB, II, DL, TII->get(AtomicOp))
1967 .addReg(PtrCopy)
1968 .addReg(OldValCopy)
1969 .addReg(NewValCopy)
1972
1973 MI.eraseFromParent(); // The instruction is gone now.
1974
1975 return BB;
1976}
1977
1978MachineBasicBlock *MipsTargetLowering::emitAtomicCmpSwapPartword(
1979 MachineInstr &MI, MachineBasicBlock *BB, unsigned Size) const {
1980 assert((Size == 1 || Size == 2) &&
1981 "Unsupported size for EmitAtomicCmpSwapPartial.");
1982
1983 MachineFunction *MF = BB->getParent();
1984 MachineRegisterInfo &RegInfo = MF->getRegInfo();
1985 const TargetRegisterClass *RC = getRegClassFor(MVT::i32);
1986 const bool ArePtrs64bit = ABI.ArePtrs64bit();
1987 const TargetRegisterClass *RCp =
1988 getRegClassFor(ArePtrs64bit ? MVT::i64 : MVT::i32);
1989 const TargetInstrInfo *TII = Subtarget.getInstrInfo();
1990 DebugLoc DL = MI.getDebugLoc();
1991
1992 Register Dest = MI.getOperand(0).getReg();
1993 Register Ptr = MI.getOperand(1).getReg();
1994 Register CmpVal = MI.getOperand(2).getReg();
1995 Register NewVal = MI.getOperand(3).getReg();
1996
1997 Register AlignedAddr = RegInfo.createVirtualRegister(RCp);
1998 Register ShiftAmt = RegInfo.createVirtualRegister(RC);
1999 Register Mask = RegInfo.createVirtualRegister(RC);
2000 Register Mask2 = RegInfo.createVirtualRegister(RC);
2001 Register ShiftedCmpVal = RegInfo.createVirtualRegister(RC);
2002 Register ShiftedNewVal = RegInfo.createVirtualRegister(RC);
2003 Register MaskLSB2 = RegInfo.createVirtualRegister(RCp);
2004 Register PtrLSB2 = RegInfo.createVirtualRegister(RC);
2005 Register MaskUpper = RegInfo.createVirtualRegister(RC);
2006 Register MaskedCmpVal = RegInfo.createVirtualRegister(RC);
2007 Register MaskedNewVal = RegInfo.createVirtualRegister(RC);
2008 unsigned AtomicOp = MI.getOpcode() == Mips::ATOMIC_CMP_SWAP_I8
2009 ? Mips::ATOMIC_CMP_SWAP_I8_POSTRA
2010 : Mips::ATOMIC_CMP_SWAP_I16_POSTRA;
2011
2012 // The scratch registers here with the EarlyClobber | Define | Dead | Implicit
2013 // flags are used to coerce the register allocator and the machine verifier to
2014 // accept the usage of these registers.
2015 // The EarlyClobber flag has the semantic properties that the operand it is
2016 // attached to is clobbered before the rest of the inputs are read. Hence it
2017 // must be unique among the operands to the instruction.
2018 // The Define flag is needed to coerce the machine verifier that an Undef
2019 // value isn't a problem.
2020 // The Dead flag is needed as the value in scratch isn't used by any other
2021 // instruction. Kill isn't used as Dead is more precise.
2022 Register Scratch = RegInfo.createVirtualRegister(RC);
2023 Register Scratch2 = RegInfo.createVirtualRegister(RC);
2024
2025 // insert new blocks after the current block
2026 const BasicBlock *LLVM_BB = BB->getBasicBlock();
2027 MachineBasicBlock *exitMBB = MF->CreateMachineBasicBlock(LLVM_BB);
2029 MF->insert(It, exitMBB);
2030
2031 // Transfer the remainder of BB and its successor edges to exitMBB.
2032 exitMBB->splice(exitMBB->begin(), BB,
2033 std::next(MachineBasicBlock::iterator(MI)), BB->end());
2035
2037
2038 // thisMBB:
2039 // addiu masklsb2,$0,-4 # 0xfffffffc
2040 // and alignedaddr,ptr,masklsb2
2041 // andi ptrlsb2,ptr,3
2042 // xori ptrlsb2,ptrlsb2,3 # Only for BE
2043 // sll shiftamt,ptrlsb2,3
2044 // ori maskupper,$0,255 # 0xff
2045 // sll mask,maskupper,shiftamt
2046 // nor mask2,$0,mask
2047 // andi maskedcmpval,cmpval,255
2048 // sll shiftedcmpval,maskedcmpval,shiftamt
2049 // andi maskednewval,newval,255
2050 // sll shiftednewval,maskednewval,shiftamt
2051 int64_t MaskImm = (Size == 1) ? 255 : 65535;
2052 BuildMI(BB, DL, TII->get(ArePtrs64bit ? Mips::DADDiu : Mips::ADDiu), MaskLSB2)
2053 .addReg(ABI.GetNullPtr()).addImm(-4);
2054 BuildMI(BB, DL, TII->get(ArePtrs64bit ? Mips::AND64 : Mips::AND), AlignedAddr)
2055 .addReg(Ptr).addReg(MaskLSB2);
2056 BuildMI(BB, DL, TII->get(Mips::ANDi), PtrLSB2)
2057 .addReg(Ptr, {}, ArePtrs64bit ? Mips::sub_32 : 0)
2058 .addImm(3);
2059 if (Subtarget.isLittle()) {
2060 BuildMI(BB, DL, TII->get(Mips::SLL), ShiftAmt).addReg(PtrLSB2).addImm(3);
2061 } else {
2062 Register Off = RegInfo.createVirtualRegister(RC);
2063 BuildMI(BB, DL, TII->get(Mips::XORi), Off)
2064 .addReg(PtrLSB2).addImm((Size == 1) ? 3 : 2);
2065 BuildMI(BB, DL, TII->get(Mips::SLL), ShiftAmt).addReg(Off).addImm(3);
2066 }
2067 BuildMI(BB, DL, TII->get(Mips::ORi), MaskUpper)
2068 .addReg(Mips::R0)
2069 .addImm(MaskImm);
2070 BuildMI(BB, DL, TII->get(Mips::SLLV), Mask)
2071 .addReg(MaskUpper).addReg(ShiftAmt);
2072 BuildMI(BB, DL, TII->get(Mips::NOR), Mask2).addReg(Mips::R0).addReg(Mask);
2073 BuildMI(BB, DL, TII->get(Mips::ANDi), MaskedCmpVal)
2074 .addReg(CmpVal).addImm(MaskImm);
2075 BuildMI(BB, DL, TII->get(Mips::SLLV), ShiftedCmpVal)
2076 .addReg(MaskedCmpVal).addReg(ShiftAmt);
2077 BuildMI(BB, DL, TII->get(Mips::ANDi), MaskedNewVal)
2078 .addReg(NewVal).addImm(MaskImm);
2079 BuildMI(BB, DL, TII->get(Mips::SLLV), ShiftedNewVal)
2080 .addReg(MaskedNewVal).addReg(ShiftAmt);
2081
2082 // The purposes of the flags on the scratch registers are explained in
2083 // emitAtomicBinary. In summary, we need a scratch register which is going to
2084 // be undef, that is unique among the register chosen for the instruction.
2085
2086 BuildMI(BB, DL, TII->get(AtomicOp))
2088 .addReg(AlignedAddr)
2089 .addReg(Mask)
2090 .addReg(ShiftedCmpVal)
2091 .addReg(Mask2)
2092 .addReg(ShiftedNewVal)
2093 .addReg(ShiftAmt)
2098
2099 MI.eraseFromParent(); // The instruction is gone now.
2100
2101 return exitMBB;
2102}
2103
2104SDValue MipsTargetLowering::lowerConstantFP(SDValue Op,
2105 SelectionDAG &DAG) const {
2106 EVT VT = Op.getValueType();
2107 ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(Op);
2108 const APFloat &FPVal = CFP->getValueAPF();
2109
2110 if (FPVal.isZero())
2111 return SDValue();
2112
2113 SDLoc DL(CFP);
2114 APInt INTVal = FPVal.bitcastToAPInt();
2115 switch (VT.getSimpleVT().SimpleTy) {
2116 default:
2117 llvm_unreachable("Unknown floating point type!");
2118 break;
2119 case MVT::f64: {
2120 if (!Subtarget.hasMTHC1() || !Subtarget.hasMips32r2())
2121 return SDValue();
2122 uint64_t Bits = INTVal.getZExtValue();
2123 uint32_t Lo = Bits & 0xFFFFFFFF;
2124 if (Lo != 0 || Bits == 0)
2125 return SDValue();
2126
2127 // TODO: DAG.getConstant(0) should be optimized to avoid generate an extra
2128 // instr `addiu $x, $zero, 0`.
2129 SDValue Low =
2130 DAG.getCopyFromReg(DAG.getEntryNode(), DL, Mips::R0, MVT::i32);
2131 SDValue Hi = DAG.getConstant(INTVal.extractBits(32, 32), DL, MVT::i32);
2132 return DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, Low, Hi);
2133 }
2134 }
2135
2136 return SDValue();
2137}
2138
2139SDValue MipsTargetLowering::lowerREADCYCLECOUNTER(SDValue Op,
2140 SelectionDAG &DAG) const {
2142 SDLoc DL(Op);
2144 unsigned RdhwrOpc, DestReg;
2145 EVT PtrVT = getPointerTy(DAG.getDataLayout());
2146
2147 if (PtrVT == MVT::i64) {
2148 RdhwrOpc = Mips::RDHWR64;
2149 DestReg = MF.getRegInfo().createVirtualRegister(getRegClassFor(MVT::i64));
2150 SDNode *Rdhwr = DAG.getMachineNode(RdhwrOpc, DL, MVT::i64, MVT::Glue,
2151 DAG.getRegister(Mips::HWR2, MVT::i32),
2152 DAG.getTargetConstant(0, DL, MVT::i32));
2153 SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), DL, DestReg,
2154 SDValue(Rdhwr, 0), SDValue(Rdhwr, 1));
2155 SDValue ResNode =
2156 DAG.getCopyFromReg(Chain, DL, DestReg, MVT::i64, Chain.getValue(1));
2157 Results.push_back(ResNode);
2158 Results.push_back(ResNode.getValue(1));
2159 } else {
2160 RdhwrOpc = Mips::RDHWR;
2161 DestReg = MF.getRegInfo().createVirtualRegister(getRegClassFor(MVT::i32));
2162 SDNode *Rdhwr = DAG.getMachineNode(RdhwrOpc, DL, MVT::i32, MVT::Glue,
2163 DAG.getRegister(Mips::HWR2, MVT::i32),
2164 DAG.getTargetConstant(0, DL, MVT::i32));
2165 SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), DL, DestReg,
2166 SDValue(Rdhwr, 0), SDValue(Rdhwr, 1));
2167 SDValue ResNode =
2168 DAG.getCopyFromReg(Chain, DL, DestReg, MVT::i32, Chain.getValue(1));
2169 Results.push_back(DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, ResNode,
2170 DAG.getConstant(0, DL, MVT::i32)));
2171 Results.push_back(ResNode.getValue(1));
2172 }
2173
2174 return DAG.getMergeValues(Results, DL);
2175}
2176
2177SDValue MipsTargetLowering::lowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
2178 // The first operand is the chain, the second is the condition, the third is
2179 // the block to branch to if the condition is true.
2180 SDValue Chain = Op.getOperand(0);
2181 SDValue Dest = Op.getOperand(2);
2182 SDLoc DL(Op);
2183
2184 assert(!Subtarget.hasMips32r6() && !Subtarget.hasMips64r6());
2185 SDValue CondRes = createFPCmp(DAG, Op.getOperand(1));
2186
2187 // Return if flag is not set by a floating point comparison.
2188 if (CondRes.getOpcode() != MipsISD::FPCmp)
2189 return Op;
2190
2191 SDValue CCNode = CondRes.getOperand(2);
2194 SDValue BrCode = DAG.getConstant(Opc, DL, MVT::i32);
2195 SDValue FCC0 = DAG.getRegister(Mips::FCC0, MVT::i32);
2196 return DAG.getNode(MipsISD::FPBrcond, DL, Op.getValueType(), Chain, BrCode,
2197 FCC0, Dest, CondRes);
2198}
2199
2200SDValue MipsTargetLowering::
2201lowerSELECT(SDValue Op, SelectionDAG &DAG) const
2202{
2203 assert(!Subtarget.hasMips32r6() && !Subtarget.hasMips64r6());
2204 SDValue Cond = createFPCmp(DAG, Op.getOperand(0));
2205
2206 // Return if flag is not set by a floating point comparison.
2207 if (Cond.getOpcode() != MipsISD::FPCmp)
2208 return Op;
2209
2210 return createCMovFP(DAG, Cond, Op.getOperand(1), Op.getOperand(2),
2211 SDLoc(Op));
2212}
2213
2214SDValue MipsTargetLowering::lowerSETCC(SDValue Op, SelectionDAG &DAG) const {
2215 assert(!Subtarget.hasMips32r6() && !Subtarget.hasMips64r6());
2216 SDValue Cond = createFPCmp(DAG, Op);
2217
2218 assert(Cond.getOpcode() == MipsISD::FPCmp &&
2219 "Floating point operand expected.");
2220
2221 SDLoc DL(Op);
2222 SDValue True = DAG.getConstant(1, DL, MVT::i32);
2223 SDValue False = DAG.getConstant(0, DL, MVT::i32);
2224
2225 return createCMovFP(DAG, Cond, True, False, DL);
2226}
2227
2228SDValue MipsTargetLowering::lowerFSETCC(SDValue Op, SelectionDAG &DAG) const {
2229 assert(!Subtarget.hasMips32r6() && !Subtarget.hasMips64r6());
2230
2231 SDLoc DL(Op);
2232 SDValue Chain = Op.getOperand(0);
2233 SDValue LHS = Op.getOperand(1);
2234 SDValue RHS = Op.getOperand(2);
2235 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(3))->get();
2236
2237 SDValue Cond = DAG.getNode(MipsISD::FPCmp, DL, MVT::Glue, LHS, RHS,
2238 DAG.getConstant(condCodeToFCC(CC), DL, MVT::i32));
2239 SDValue True = DAG.getConstant(1, DL, MVT::i32);
2240 SDValue False = DAG.getConstant(0, DL, MVT::i32);
2241 SDValue CMovFP = createCMovFP(DAG, Cond, True, False, DL);
2242
2243 return DAG.getMergeValues({CMovFP, Chain}, DL);
2244}
2245
2246SDValue MipsTargetLowering::lowerGlobalAddress(SDValue Op,
2247 SelectionDAG &DAG) const {
2248 EVT Ty = Op.getValueType();
2249 GlobalAddressSDNode *N = cast<GlobalAddressSDNode>(Op);
2250 const GlobalValue *GV = N->getGlobal();
2251
2252 if (GV->hasDLLImportStorageClass()) {
2253 assert(Subtarget.isTargetWindows() &&
2254 "Windows is the only supported COFF target");
2255 return getDllimportVariable(
2256 N, SDLoc(N), Ty, DAG, DAG.getEntryNode(),
2258 }
2259
2260 if (!isPositionIndependent()) {
2261 const MipsTargetObjectFile *TLOF =
2262 static_cast<const MipsTargetObjectFile *>(
2264 const GlobalObject *GO = GV->getAliaseeObject();
2265 if (Subtarget.useSmallSection() && GO && TLOF->IsGlobalInSmallSection(GO))
2266 // %gp_rel relocation
2267 return getAddrGPRel(N, SDLoc(N), Ty, DAG, ABI.IsN64());
2268
2269 // %hi/%lo relocation
2270 return Subtarget.hasSym32() ? getAddrNonPIC(N, SDLoc(N), Ty, DAG)
2271 // %highest/%higher/%hi/%lo relocation
2272 : getAddrNonPICSym64(N, SDLoc(N), Ty, DAG);
2273 }
2274
2275 // Every other architecture would use shouldAssumeDSOLocal in here, but
2276 // mips is special.
2277 // * In PIC code mips requires got loads even for local statics!
2278 // * To save on got entries, for local statics the got entry contains the
2279 // page and an additional add instruction takes care of the low bits.
2280 // * It is legal to access a hidden symbol with a non hidden undefined,
2281 // so one cannot guarantee that all access to a hidden symbol will know
2282 // it is hidden.
2283 // * Mips linkers don't support creating a page and a full got entry for
2284 // the same symbol.
2285 // * Given all that, we have to use a full got entry for hidden symbols :-(
2286 if (GV->hasLocalLinkage())
2287 return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());
2288
2289 if (Subtarget.useXGOT())
2290 return getAddrGlobalLargeGOT(
2291 N, SDLoc(N), Ty, DAG, MipsII::MO_GOT_HI16, MipsII::MO_GOT_LO16,
2292 DAG.getEntryNode(),
2294
2295 return getAddrGlobal(
2296 N, SDLoc(N), Ty, DAG,
2297 (ABI.IsN32() || ABI.IsN64()) ? MipsII::MO_GOT_DISP : MipsII::MO_GOT,
2299}
2300
2301SDValue MipsTargetLowering::lowerBlockAddress(SDValue Op,
2302 SelectionDAG &DAG) const {
2303 BlockAddressSDNode *N = cast<BlockAddressSDNode>(Op);
2304 EVT Ty = Op.getValueType();
2305
2306 if (!isPositionIndependent())
2307 return Subtarget.hasSym32() ? getAddrNonPIC(N, SDLoc(N), Ty, DAG)
2308 : getAddrNonPICSym64(N, SDLoc(N), Ty, DAG);
2309
2310 return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());
2311}
2312
2313SDValue MipsTargetLowering::
2314lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
2315{
2316 // If the relocation model is PIC, use the General Dynamic TLS Model or
2317 // Local Dynamic TLS model, otherwise use the Initial Exec or
2318 // Local Exec TLS Model.
2319
2320 GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
2321 if (DAG.getTarget().useEmulatedTLS())
2322 return LowerToTLSEmulatedModel(GA, DAG);
2323
2324 SDLoc DL(GA);
2325 const GlobalValue *GV = GA->getGlobal();
2326 EVT PtrVT = getPointerTy(DAG.getDataLayout());
2327
2329
2330 if (model == TLSModel::GeneralDynamic || model == TLSModel::LocalDynamic) {
2331 // General Dynamic and Local Dynamic TLS Model.
2332 unsigned Flag = (model == TLSModel::LocalDynamic) ? MipsII::MO_TLSLDM
2333 : MipsII::MO_TLSGD;
2334
2335 SDValue TGA = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, Flag);
2336 SDValue Argument = DAG.getNode(MipsISD::Wrapper, DL, PtrVT,
2337 getGlobalReg(DAG, PtrVT), TGA);
2338 unsigned PtrSize = PtrVT.getSizeInBits();
2339 IntegerType *PtrTy = Type::getIntNTy(*DAG.getContext(), PtrSize);
2340
2341 SDValue TlsGetAddr = DAG.getExternalSymbol("__tls_get_addr", PtrVT);
2342
2344 Args.emplace_back(Argument, PtrTy);
2345
2346 TargetLowering::CallLoweringInfo CLI(DAG);
2347 CLI.setDebugLoc(DL)
2348 .setChain(DAG.getEntryNode())
2349 .setLibCallee(CallingConv::C, PtrTy, TlsGetAddr, std::move(Args));
2350 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
2351
2352 SDValue Ret = CallResult.first;
2353
2354 if (model != TLSModel::LocalDynamic)
2355 return Ret;
2356
2357 SDValue TGAHi = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2359 SDValue Hi = DAG.getNode(MipsISD::TlsHi, DL, PtrVT, TGAHi);
2360 SDValue TGALo = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2362 SDValue Lo = DAG.getNode(MipsISD::Lo, DL, PtrVT, TGALo);
2363 SDValue Add = DAG.getNode(ISD::ADD, DL, PtrVT, Hi, Ret);
2364 return DAG.getNode(ISD::ADD, DL, PtrVT, Add, Lo);
2365 }
2366
2367 SDValue Offset;
2368 if (model == TLSModel::InitialExec) {
2369 // Initial Exec TLS Model
2370 SDValue TGA = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2372 TGA = DAG.getNode(MipsISD::Wrapper, DL, PtrVT, getGlobalReg(DAG, PtrVT),
2373 TGA);
2374 Offset =
2375 DAG.getLoad(PtrVT, DL, DAG.getEntryNode(), TGA, MachinePointerInfo());
2376 } else {
2377 // Local Exec TLS Model
2378 assert(model == TLSModel::LocalExec);
2379 SDValue TGAHi = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2381 SDValue TGALo = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0,
2383 SDValue Hi = DAG.getNode(MipsISD::TlsHi, DL, PtrVT, TGAHi);
2384 SDValue Lo = DAG.getNode(MipsISD::Lo, DL, PtrVT, TGALo);
2385 Offset = DAG.getNode(ISD::ADD, DL, PtrVT, Hi, Lo);
2386 }
2387
2388 SDValue ThreadPointer = DAG.getNode(MipsISD::ThreadPointer, DL, PtrVT);
2389 return DAG.getNode(ISD::ADD, DL, PtrVT, ThreadPointer, Offset);
2390}
2391
2392SDValue MipsTargetLowering::
2393lowerJumpTable(SDValue Op, SelectionDAG &DAG) const
2394{
2395 JumpTableSDNode *N = cast<JumpTableSDNode>(Op);
2396 EVT Ty = Op.getValueType();
2397
2398 if (!isPositionIndependent())
2399 return Subtarget.hasSym32() ? getAddrNonPIC(N, SDLoc(N), Ty, DAG)
2400 : getAddrNonPICSym64(N, SDLoc(N), Ty, DAG);
2401
2402 return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());
2403}
2404
2405SDValue MipsTargetLowering::
2406lowerConstantPool(SDValue Op, SelectionDAG &DAG) const
2407{
2408 ConstantPoolSDNode *N = cast<ConstantPoolSDNode>(Op);
2409 EVT Ty = Op.getValueType();
2410
2411 if (!isPositionIndependent()) {
2412 const MipsTargetObjectFile *TLOF =
2413 static_cast<const MipsTargetObjectFile *>(
2415
2416 if (TLOF->IsConstantInSmallSection(DAG.getDataLayout(), N->getConstVal(),
2418 // %gp_rel relocation
2419 return getAddrGPRel(N, SDLoc(N), Ty, DAG, ABI.IsN64());
2420
2421 return Subtarget.hasSym32() ? getAddrNonPIC(N, SDLoc(N), Ty, DAG)
2422 : getAddrNonPICSym64(N, SDLoc(N), Ty, DAG);
2423 }
2424
2425 return getAddrLocal(N, SDLoc(N), Ty, DAG, ABI.IsN32() || ABI.IsN64());
2426}
2427
2428SDValue MipsTargetLowering::lowerVASTART(SDValue Op, SelectionDAG &DAG) const {
2430 MipsFunctionInfo *FuncInfo = MF.getInfo<MipsFunctionInfo>();
2431
2432 SDLoc DL(Op);
2433 SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
2435
2436 // vastart just stores the address of the VarArgsFrameIndex slot into the
2437 // memory location argument.
2438 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
2439 return DAG.getStore(Op.getOperand(0), DL, FI, Op.getOperand(1),
2440 MachinePointerInfo(SV));
2441}
2442
2443SDValue MipsTargetLowering::lowerVAARG(SDValue Op, SelectionDAG &DAG) const {
2444 SDNode *Node = Op.getNode();
2445 EVT VT = Node->getValueType(0);
2446 SDValue Chain = Node->getOperand(0);
2447 SDValue VAListPtr = Node->getOperand(1);
2448 const Align Align =
2449 llvm::MaybeAlign(Node->getConstantOperandVal(3)).valueOrOne();
2450 const Value *SV = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2451 SDLoc DL(Node);
2452 unsigned ArgSlotSizeInBytes = (ABI.IsN32() || ABI.IsN64()) ? 8 : 4;
2453
2454 SDValue VAListLoad = DAG.getLoad(getPointerTy(DAG.getDataLayout()), DL, Chain,
2455 VAListPtr, MachinePointerInfo(SV));
2456 SDValue VAList = VAListLoad;
2457
2458 // Re-align the pointer if necessary.
2459 // It should only ever be necessary for 64-bit types on O32 since the minimum
2460 // argument alignment is the same as the maximum type alignment for N32/N64.
2461 //
2462 // FIXME: We currently align too often. The code generator doesn't notice
2463 // when the pointer is still aligned from the last va_arg (or pair of
2464 // va_args for the i64 on O32 case).
2465 if (Align > getMinStackArgumentAlignment()) {
2466 VAList = DAG.getNode(
2467 ISD::ADD, DL, VAList.getValueType(), VAList,
2468 DAG.getConstant(Align.value() - 1, DL, VAList.getValueType()));
2469
2470 VAList = DAG.getNode(ISD::AND, DL, VAList.getValueType(), VAList,
2471 DAG.getSignedConstant(-(int64_t)Align.value(), DL,
2472 VAList.getValueType()));
2473 }
2474
2475 // Increment the pointer, VAList, to the next vaarg.
2476 auto &TD = DAG.getDataLayout();
2477 unsigned ArgSizeInBytes =
2479 SDValue Tmp3 =
2480 DAG.getNode(ISD::ADD, DL, VAList.getValueType(), VAList,
2481 DAG.getConstant(alignTo(ArgSizeInBytes, ArgSlotSizeInBytes),
2482 DL, VAList.getValueType()));
2483 // Store the incremented VAList to the legalized pointer
2484 Chain = DAG.getStore(VAListLoad.getValue(1), DL, Tmp3, VAListPtr,
2485 MachinePointerInfo(SV));
2486
2487 // In big-endian mode we must adjust the pointer when the load size is smaller
2488 // than the argument slot size. We must also reduce the known alignment to
2489 // match. For example in the N64 ABI, we must add 4 bytes to the offset to get
2490 // the correct half of the slot, and reduce the alignment from 8 (slot
2491 // alignment) down to 4 (type alignment).
2492 if (!Subtarget.isLittle() && ArgSizeInBytes < ArgSlotSizeInBytes) {
2493 unsigned Adjustment = ArgSlotSizeInBytes - ArgSizeInBytes;
2494 VAList = DAG.getNode(ISD::ADD, DL, VAListPtr.getValueType(), VAList,
2495 DAG.getIntPtrConstant(Adjustment, DL));
2496 }
2497 // Load the actual argument out of the pointer VAList
2498 return DAG.getLoad(VT, DL, Chain, VAList, MachinePointerInfo());
2499}
2500
2502 bool HasExtractInsert) {
2503 EVT TyX = Op.getOperand(0).getValueType();
2504 EVT TyY = Op.getOperand(1).getValueType();
2505 SDLoc DL(Op);
2506 SDValue Const1 = DAG.getConstant(1, DL, MVT::i32);
2507 SDValue Const31 = DAG.getConstant(31, DL, MVT::i32);
2508 SDValue Res;
2509
2510 // If operand is of type f64, extract the upper 32-bit. Otherwise, bitcast it
2511 // to i32.
2512 SDValue X = (TyX == MVT::f32) ?
2513 DAG.getNode(ISD::BITCAST, DL, MVT::i32, Op.getOperand(0)) :
2514 DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32, Op.getOperand(0),
2515 Const1);
2516 SDValue Y = (TyY == MVT::f32) ?
2517 DAG.getNode(ISD::BITCAST, DL, MVT::i32, Op.getOperand(1)) :
2518 DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32, Op.getOperand(1),
2519 Const1);
2520
2521 if (HasExtractInsert) {
2522 // ext E, Y, 31, 1 ; extract bit31 of Y
2523 // ins X, E, 31, 1 ; insert extracted bit at bit31 of X
2524 SDValue E = DAG.getNode(MipsISD::Ext, DL, MVT::i32, Y, Const31, Const1);
2525 Res = DAG.getNode(MipsISD::Ins, DL, MVT::i32, E, Const31, Const1, X);
2526 } else {
2527 // sll SllX, X, 1
2528 // srl SrlX, SllX, 1
2529 // srl SrlY, Y, 31
2530 // sll SllY, SrlX, 31
2531 // or Or, SrlX, SllY
2532 SDValue SllX = DAG.getNode(ISD::SHL, DL, MVT::i32, X, Const1);
2533 SDValue SrlX = DAG.getNode(ISD::SRL, DL, MVT::i32, SllX, Const1);
2534 SDValue SrlY = DAG.getNode(ISD::SRL, DL, MVT::i32, Y, Const31);
2535 SDValue SllY = DAG.getNode(ISD::SHL, DL, MVT::i32, SrlY, Const31);
2536 Res = DAG.getNode(ISD::OR, DL, MVT::i32, SrlX, SllY);
2537 }
2538
2539 if (TyX == MVT::f32)
2540 return DAG.getNode(ISD::BITCAST, DL, Op.getOperand(0).getValueType(), Res);
2541
2542 SDValue LowX = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
2543 Op.getOperand(0),
2544 DAG.getConstant(0, DL, MVT::i32));
2545 return DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, LowX, Res);
2546}
2547
2549 bool HasExtractInsert) {
2550 unsigned WidthX = Op.getOperand(0).getValueSizeInBits();
2551 unsigned WidthY = Op.getOperand(1).getValueSizeInBits();
2552 EVT TyX = MVT::getIntegerVT(WidthX), TyY = MVT::getIntegerVT(WidthY);
2553 SDLoc DL(Op);
2554 SDValue Const1 = DAG.getConstant(1, DL, MVT::i32);
2555
2556 // Bitcast to integer nodes.
2557 SDValue X = DAG.getNode(ISD::BITCAST, DL, TyX, Op.getOperand(0));
2558 SDValue Y = DAG.getNode(ISD::BITCAST, DL, TyY, Op.getOperand(1));
2559
2560 if (HasExtractInsert) {
2561 // ext E, Y, width(Y) - 1, 1 ; extract bit width(Y)-1 of Y
2562 // ins X, E, width(X) - 1, 1 ; insert extracted bit at bit width(X)-1 of X
2563 SDValue E = DAG.getNode(MipsISD::Ext, DL, TyY, Y,
2564 DAG.getConstant(WidthY - 1, DL, MVT::i32), Const1);
2565
2566 if (WidthX > WidthY)
2567 E = DAG.getNode(ISD::ZERO_EXTEND, DL, TyX, E);
2568 else if (WidthY > WidthX)
2569 E = DAG.getNode(ISD::TRUNCATE, DL, TyX, E);
2570
2571 SDValue I = DAG.getNode(MipsISD::Ins, DL, TyX, E,
2572 DAG.getConstant(WidthX - 1, DL, MVT::i32), Const1,
2573 X);
2574 return DAG.getNode(ISD::BITCAST, DL, Op.getOperand(0).getValueType(), I);
2575 }
2576
2577 // (d)sll SllX, X, 1
2578 // (d)srl SrlX, SllX, 1
2579 // (d)srl SrlY, Y, width(Y)-1
2580 // (d)sll SllY, SrlX, width(Y)-1
2581 // or Or, SrlX, SllY
2582 SDValue SllX = DAG.getNode(ISD::SHL, DL, TyX, X, Const1);
2583 SDValue SrlX = DAG.getNode(ISD::SRL, DL, TyX, SllX, Const1);
2584 SDValue SrlY = DAG.getNode(ISD::SRL, DL, TyY, Y,
2585 DAG.getConstant(WidthY - 1, DL, MVT::i32));
2586
2587 if (WidthX > WidthY)
2588 SrlY = DAG.getNode(ISD::ZERO_EXTEND, DL, TyX, SrlY);
2589 else if (WidthY > WidthX)
2590 SrlY = DAG.getNode(ISD::TRUNCATE, DL, TyX, SrlY);
2591
2592 SDValue SllY = DAG.getNode(ISD::SHL, DL, TyX, SrlY,
2593 DAG.getConstant(WidthX - 1, DL, MVT::i32));
2594 SDValue Or = DAG.getNode(ISD::OR, DL, TyX, SrlX, SllY);
2595 return DAG.getNode(ISD::BITCAST, DL, Op.getOperand(0).getValueType(), Or);
2596}
2597
2598SDValue
2599MipsTargetLowering::lowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const {
2600 if (Subtarget.isGP64bit())
2601 return lowerFCOPYSIGN64(Op, DAG, Subtarget.hasExtractInsert());
2602
2603 return lowerFCOPYSIGN32(Op, DAG, Subtarget.hasExtractInsert());
2604}
2605
2606SDValue MipsTargetLowering::lowerFABS32(SDValue Op, SelectionDAG &DAG,
2607 bool HasExtractInsert) const {
2608 SDLoc DL(Op);
2609 SDValue Res, Const1 = DAG.getConstant(1, DL, MVT::i32);
2610
2611 if (Op->getFlags().hasNoNaNs() || Subtarget.inAbs2008Mode())
2612 return DAG.getNode(MipsISD::FAbs, DL, Op.getValueType(), Op.getOperand(0));
2613
2614 // If operand is of type f64, extract the upper 32-bit. Otherwise, bitcast it
2615 // to i32.
2616 SDValue X = (Op.getValueType() == MVT::f32)
2617 ? DAG.getNode(ISD::BITCAST, DL, MVT::i32, Op.getOperand(0))
2618 : DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
2619 Op.getOperand(0), Const1);
2620
2621 // Clear MSB.
2622 if (HasExtractInsert)
2623 Res = DAG.getNode(MipsISD::Ins, DL, MVT::i32,
2624 DAG.getRegister(Mips::R0, MVT::i32),
2625 DAG.getConstant(31, DL, MVT::i32), Const1, X);
2626 else {
2627 // TODO: Provide DAG patterns which transform (and x, cst)
2628 // back to a (shl (srl x (clz cst)) (clz cst)) sequence.
2629 SDValue SllX = DAG.getNode(ISD::SHL, DL, MVT::i32, X, Const1);
2630 Res = DAG.getNode(ISD::SRL, DL, MVT::i32, SllX, Const1);
2631 }
2632
2633 if (Op.getValueType() == MVT::f32)
2634 return DAG.getNode(ISD::BITCAST, DL, MVT::f32, Res);
2635
2636 // FIXME: For mips32r2, the sequence of (BuildPairF64 (ins (ExtractElementF64
2637 // Op 1), $zero, 31 1) (ExtractElementF64 Op 0)) and the Op has one use, we
2638 // should be able to drop the usage of mfc1/mtc1 and rewrite the register in
2639 // place.
2640 SDValue LowX =
2641 DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32, Op.getOperand(0),
2642 DAG.getConstant(0, DL, MVT::i32));
2643 return DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, LowX, Res);
2644}
2645
2646SDValue MipsTargetLowering::lowerFABS64(SDValue Op, SelectionDAG &DAG,
2647 bool HasExtractInsert) const {
2648 SDLoc DL(Op);
2649 SDValue Res, Const1 = DAG.getConstant(1, DL, MVT::i32);
2650
2651 if (Op->getFlags().hasNoNaNs() || Subtarget.inAbs2008Mode())
2652 return DAG.getNode(MipsISD::FAbs, DL, Op.getValueType(), Op.getOperand(0));
2653
2654 // Bitcast to integer node.
2655 SDValue X = DAG.getNode(ISD::BITCAST, DL, MVT::i64, Op.getOperand(0));
2656
2657 // Clear MSB.
2658 if (HasExtractInsert)
2659 Res = DAG.getNode(MipsISD::Ins, DL, MVT::i64,
2660 DAG.getRegister(Mips::R0_64, MVT::i64),
2661 DAG.getConstant(63, DL, MVT::i32), Const1, X);
2662 else {
2663 SDValue SllX = DAG.getNode(ISD::SHL, DL, MVT::i64, X, Const1);
2664 Res = DAG.getNode(ISD::SRL, DL, MVT::i64, SllX, Const1);
2665 }
2666
2667 return DAG.getNode(ISD::BITCAST, DL, MVT::f64, Res);
2668}
2669
2670SDValue MipsTargetLowering::lowerFABS(SDValue Op, SelectionDAG &DAG) const {
2671 if ((ABI.IsN32() || ABI.IsN64()) && (Op.getValueType() == MVT::f64))
2672 return lowerFABS64(Op, DAG, Subtarget.hasExtractInsert());
2673
2674 return lowerFABS32(Op, DAG, Subtarget.hasExtractInsert());
2675}
2676
2677SDValue MipsTargetLowering::lowerFCANONICALIZE(SDValue Op,
2678 SelectionDAG &DAG) const {
2679 SDLoc DL(Op);
2680 EVT VT = Op.getValueType();
2681 SDValue Operand = Op.getOperand(0);
2682 SDNodeFlags Flags = Op->getFlags();
2683
2684 if (Flags.hasNoNaNs() || DAG.isKnownNeverNaN(Operand))
2685 return Operand;
2686
2687 SDValue Quiet = DAG.getNode(ISD::FADD, DL, VT, Operand, Operand);
2688 return DAG.getSelectCC(DL, Operand, Operand, Quiet, Operand, ISD::SETUO);
2689}
2690
2691SDValue MipsTargetLowering::
2692lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
2693 // check the depth
2694 if (Op.getConstantOperandVal(0) != 0) {
2695 DAG.getContext()->emitError(
2696 "return address can be determined only for current frame");
2697 return SDValue();
2698 }
2699
2700 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
2701 MFI.setFrameAddressIsTaken(true);
2702 EVT VT = Op.getValueType();
2703 SDLoc DL(Op);
2704 SDValue FrameAddr = DAG.getCopyFromReg(
2705 DAG.getEntryNode(), DL, ABI.IsN64() ? Mips::FP_64 : Mips::FP, VT);
2706 return FrameAddr;
2707}
2708
2709SDValue MipsTargetLowering::lowerRETURNADDR(SDValue Op,
2710 SelectionDAG &DAG) const {
2711 // check the depth
2712 if (Op.getConstantOperandVal(0) != 0) {
2713 DAG.getContext()->emitError(
2714 "return address can be determined only for current frame");
2715 return SDValue();
2716 }
2717
2719 MachineFrameInfo &MFI = MF.getFrameInfo();
2720 MVT VT = Op.getSimpleValueType();
2721 unsigned RA = ABI.IsN64() ? Mips::RA_64 : Mips::RA;
2722 MFI.setReturnAddressIsTaken(true);
2723
2724 // Return RA, which contains the return address. Mark it an implicit live-in.
2726 return DAG.getCopyFromReg(DAG.getEntryNode(), SDLoc(Op), Reg, VT);
2727}
2728
2729// An EH_RETURN is the result of lowering llvm.eh.return which in turn is
2730// generated from __builtin_eh_return (offset, handler)
2731// The effect of this is to adjust the stack pointer by "offset"
2732// and then branch to "handler".
2733SDValue MipsTargetLowering::lowerEH_RETURN(SDValue Op, SelectionDAG &DAG)
2734 const {
2736 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
2737
2738 MipsFI->setCallsEhReturn();
2739 SDValue Chain = Op.getOperand(0);
2740 SDValue Offset = Op.getOperand(1);
2741 SDValue Handler = Op.getOperand(2);
2742 SDLoc DL(Op);
2743 EVT Ty = ABI.IsN64() ? MVT::i64 : MVT::i32;
2744
2745 // Store stack offset in V1, store jump target in V0. Glue CopyToReg and
2746 // EH_RETURN nodes, so that instructions are emitted back-to-back.
2747 unsigned OffsetReg = ABI.getReturnRegPtr(1);
2748 unsigned AddrReg = ABI.getReturnRegPtr(0);
2749 Chain = DAG.getCopyToReg(Chain, DL, OffsetReg, Offset, SDValue());
2750 Chain = DAG.getCopyToReg(Chain, DL, AddrReg, Handler, Chain.getValue(1));
2751 return DAG.getNode(MipsISD::EH_RETURN, DL, MVT::Other, Chain,
2752 DAG.getRegister(OffsetReg, Ty),
2753 DAG.getRegister(AddrReg, getPointerTy(MF.getDataLayout())),
2754 Chain.getValue(1));
2755}
2756
2757SDValue MipsTargetLowering::lowerATOMIC_FENCE(SDValue Op,
2758 SelectionDAG &DAG) const {
2759 // FIXME: Need pseudo-fence for 'singlethread' fences
2760 // FIXME: Set SType for weaker fences where supported/appropriate.
2761 unsigned SType = 0;
2762 SDLoc DL(Op);
2763 SyncScope::ID FenceSSID =
2764 static_cast<SyncScope::ID>(Op.getConstantOperandVal(2));
2765
2766 if (Subtarget.hasMips2() && FenceSSID == SyncScope::System)
2767 return DAG.getNode(MipsISD::Sync, DL, MVT::Other, Op.getOperand(0),
2768 DAG.getTargetConstant(SType, DL, MVT::i32));
2769
2770 // singlethread fences only synchronize with signal handlers on the same
2771 // thread and thus only need to preserve instruction order, not actually
2772 // enforce memory ordering.
2773 if ((Subtarget.hasMips1() && !Subtarget.hasMips2()) ||
2774 FenceSSID == SyncScope::SingleThread) {
2775 // MEMBARRIER is a compiler barrier; it codegens to a no-op.
2776 return DAG.getNode(ISD::MEMBARRIER, DL, MVT::Other, Op.getOperand(0));
2777 }
2778
2779 return Op;
2780}
2781
2782SDValue MipsTargetLowering::lowerShiftLeftParts(SDValue Op,
2783 SelectionDAG &DAG) const {
2784 SDLoc DL(Op);
2785 MVT VT = Subtarget.isGP64bit() ? MVT::i64 : MVT::i32;
2786
2787 SDValue Lo = Op.getOperand(0), Hi = Op.getOperand(1);
2788 SDValue Shamt = Op.getOperand(2);
2789 // if shamt < (VT.bits):
2790 // lo = (shl lo, shamt)
2791 // hi = (or (shl hi, shamt) (srl (srl lo, 1), (xor shamt, (VT.bits-1))))
2792 // else:
2793 // lo = 0
2794 // hi = (shl lo, shamt[4:0])
2795 SDValue Not =
2796 DAG.getNode(ISD::XOR, DL, MVT::i32, Shamt,
2797 DAG.getConstant(VT.getSizeInBits() - 1, DL, MVT::i32));
2798 SDValue ShiftRight1Lo = DAG.getNode(ISD::SRL, DL, VT, Lo,
2799 DAG.getConstant(1, DL, VT));
2800 SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, VT, ShiftRight1Lo, Not);
2801 SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, VT, Hi, Shamt);
2802 SDValue Or = DAG.getNode(ISD::OR, DL, VT, ShiftLeftHi, ShiftRightLo);
2803 SDValue ShiftLeftLo = DAG.getNode(ISD::SHL, DL, VT, Lo, Shamt);
2804 SDValue Cond = DAG.getNode(ISD::AND, DL, MVT::i32, Shamt,
2805 DAG.getConstant(VT.getSizeInBits(), DL, MVT::i32));
2806 Lo = DAG.getNode(ISD::SELECT, DL, VT, Cond,
2807 DAG.getConstant(0, DL, VT), ShiftLeftLo);
2808 Hi = DAG.getNode(ISD::SELECT, DL, VT, Cond, ShiftLeftLo, Or);
2809
2810 SDValue Ops[2] = {Lo, Hi};
2811 return DAG.getMergeValues(Ops, DL);
2812}
2813
2814SDValue MipsTargetLowering::lowerShiftRightParts(SDValue Op, SelectionDAG &DAG,
2815 bool IsSRA) const {
2816 SDLoc DL(Op);
2817 SDValue Lo = Op.getOperand(0), Hi = Op.getOperand(1);
2818 SDValue Shamt = Op.getOperand(2);
2819 MVT VT = Subtarget.isGP64bit() ? MVT::i64 : MVT::i32;
2820
2821 // if shamt < (VT.bits):
2822 // lo = (or (shl (shl hi, 1), (xor shamt, (VT.bits-1))) (srl lo, shamt))
2823 // if isSRA:
2824 // hi = (sra hi, shamt)
2825 // else:
2826 // hi = (srl hi, shamt)
2827 // else:
2828 // if isSRA:
2829 // lo = (sra hi, shamt[4:0])
2830 // hi = (sra hi, 31)
2831 // else:
2832 // lo = (srl hi, shamt[4:0])
2833 // hi = 0
2834 SDValue Not =
2835 DAG.getNode(ISD::XOR, DL, MVT::i32, Shamt,
2836 DAG.getConstant(VT.getSizeInBits() - 1, DL, MVT::i32));
2837 SDValue ShiftLeft1Hi = DAG.getNode(ISD::SHL, DL, VT, Hi,
2838 DAG.getConstant(1, DL, VT));
2839 SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, VT, ShiftLeft1Hi, Not);
2840 SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, VT, Lo, Shamt);
2841 SDValue Or = DAG.getNode(ISD::OR, DL, VT, ShiftLeftHi, ShiftRightLo);
2842 SDValue ShiftRightHi = DAG.getNode(IsSRA ? ISD::SRA : ISD::SRL,
2843 DL, VT, Hi, Shamt);
2844 SDValue Cond = DAG.getNode(ISD::AND, DL, MVT::i32, Shamt,
2845 DAG.getConstant(VT.getSizeInBits(), DL, MVT::i32));
2846 SDValue Ext = DAG.getNode(ISD::SRA, DL, VT, Hi,
2847 DAG.getConstant(VT.getSizeInBits() - 1, DL, VT));
2848
2849 if (!(Subtarget.hasMips4() || Subtarget.hasMips32())) {
2850 SDVTList VTList = DAG.getVTList(VT, VT);
2851 return DAG.getNode(Subtarget.isGP64bit() ? MipsISD::DOUBLE_SELECT_I64
2853 DL, VTList, Cond, ShiftRightHi,
2854 IsSRA ? Ext : DAG.getConstant(0, DL, VT), Or,
2855 ShiftRightHi);
2856 }
2857
2858 Lo = DAG.getNode(ISD::SELECT, DL, VT, Cond, ShiftRightHi, Or);
2859 Hi = DAG.getNode(ISD::SELECT, DL, VT, Cond,
2860 IsSRA ? Ext : DAG.getConstant(0, DL, VT), ShiftRightHi);
2861
2862 SDValue Ops[2] = {Lo, Hi};
2863 return DAG.getMergeValues(Ops, DL);
2864}
2865
2867 SDValue Chain, SDValue Src, unsigned Offset) {
2868 SDValue Ptr = LD->getBasePtr();
2869 EVT VT = LD->getValueType(0), MemVT = LD->getMemoryVT();
2870 EVT BasePtrVT = Ptr.getValueType();
2871 SDLoc DL(LD);
2872 SDVTList VTList = DAG.getVTList(VT, MVT::Other);
2873
2874 if (Offset)
2875 Ptr = DAG.getNode(ISD::ADD, DL, BasePtrVT, Ptr,
2876 DAG.getConstant(Offset, DL, BasePtrVT));
2877
2878 SDValue Ops[] = { Chain, Ptr, Src };
2879 return DAG.getMemIntrinsicNode(Opc, DL, VTList, Ops, MemVT,
2880 LD->getMemOperand());
2881}
2882
2883// Expand an unaligned 32 or 64-bit integer load node.
2886 EVT MemVT = LD->getMemoryVT();
2887
2888 if (Subtarget.systemSupportsUnalignedAccess())
2889 return Op;
2890
2891 // Return if load is aligned or if MemVT is neither i32 nor i64.
2892 if ((LD->getAlign().value() >= (MemVT.getSizeInBits() / 8)) ||
2893 ((MemVT != MVT::i32) && (MemVT != MVT::i64)))
2894 return SDValue();
2895
2896 bool IsLittle = Subtarget.isLittle();
2897 EVT VT = Op.getValueType();
2898 ISD::LoadExtType ExtType = LD->getExtensionType();
2899 SDValue Chain = LD->getChain(), Undef = DAG.getUNDEF(VT);
2900
2901 assert((VT == MVT::i32) || (VT == MVT::i64));
2902
2903 // Expand
2904 // (set dst, (i64 (load baseptr)))
2905 // to
2906 // (set tmp, (ldl (add baseptr, 7), undef))
2907 // (set dst, (ldr baseptr, tmp))
2908 if ((VT == MVT::i64) && (ExtType == ISD::NON_EXTLOAD)) {
2909 SDValue LDL = createLoadLR(MipsISD::LDL, DAG, LD, Chain, Undef,
2910 IsLittle ? 7 : 0);
2911 return createLoadLR(MipsISD::LDR, DAG, LD, LDL.getValue(1), LDL,
2912 IsLittle ? 0 : 7);
2913 }
2914
2915 SDValue LWL = createLoadLR(MipsISD::LWL, DAG, LD, Chain, Undef,
2916 IsLittle ? 3 : 0);
2917 SDValue LWR = createLoadLR(MipsISD::LWR, DAG, LD, LWL.getValue(1), LWL,
2918 IsLittle ? 0 : 3);
2919
2920 // Expand
2921 // (set dst, (i32 (load baseptr))) or
2922 // (set dst, (i64 (sextload baseptr))) or
2923 // (set dst, (i64 (extload baseptr)))
2924 // to
2925 // (set tmp, (lwl (add baseptr, 3), undef))
2926 // (set dst, (lwr baseptr, tmp))
2927 if ((VT == MVT::i32) || (ExtType == ISD::SEXTLOAD) ||
2928 (ExtType == ISD::EXTLOAD))
2929 return LWR;
2930
2931 assert((VT == MVT::i64) && (ExtType == ISD::ZEXTLOAD));
2932
2933 // Expand
2934 // (set dst, (i64 (zextload baseptr)))
2935 // to
2936 // (set tmp0, (lwl (add baseptr, 3), undef))
2937 // (set tmp1, (lwr baseptr, tmp0))
2938 // (set tmp2, (shl tmp1, 32))
2939 // (set dst, (srl tmp2, 32))
2940 SDLoc DL(LD);
2941 SDValue Const32 = DAG.getConstant(32, DL, MVT::i32);
2942 SDValue SLL = DAG.getNode(ISD::SHL, DL, MVT::i64, LWR, Const32);
2943 SDValue SRL = DAG.getNode(ISD::SRL, DL, MVT::i64, SLL, Const32);
2944 SDValue Ops[] = { SRL, LWR.getValue(1) };
2945 return DAG.getMergeValues(Ops, DL);
2946}
2947
2949 SDValue Chain, unsigned Offset) {
2950 SDValue Ptr = SD->getBasePtr(), Value = SD->getValue();
2951 EVT MemVT = SD->getMemoryVT(), BasePtrVT = Ptr.getValueType();
2952 SDLoc DL(SD);
2953 SDVTList VTList = DAG.getVTList(MVT::Other);
2954
2955 if (Offset)
2956 Ptr = DAG.getNode(ISD::ADD, DL, BasePtrVT, Ptr,
2957 DAG.getConstant(Offset, DL, BasePtrVT));
2958
2959 SDValue Ops[] = { Chain, Value, Ptr };
2960 return DAG.getMemIntrinsicNode(Opc, DL, VTList, Ops, MemVT,
2961 SD->getMemOperand());
2962}
2963
2964// Expand an unaligned 32 or 64-bit integer store node.
2966 bool IsLittle) {
2967 SDValue Value = SD->getValue(), Chain = SD->getChain();
2968 EVT VT = Value.getValueType();
2969
2970 // Expand
2971 // (store val, baseptr) or
2972 // (truncstore val, baseptr)
2973 // to
2974 // (swl val, (add baseptr, 3))
2975 // (swr val, baseptr)
2976 if ((VT == MVT::i32) || SD->isTruncatingStore()) {
2977 SDValue SWL = createStoreLR(MipsISD::SWL, DAG, SD, Chain,
2978 IsLittle ? 3 : 0);
2979 return createStoreLR(MipsISD::SWR, DAG, SD, SWL, IsLittle ? 0 : 3);
2980 }
2981
2982 assert(VT == MVT::i64);
2983
2984 // Expand
2985 // (store val, baseptr)
2986 // to
2987 // (sdl val, (add baseptr, 7))
2988 // (sdr val, baseptr)
2989 SDValue SDL = createStoreLR(MipsISD::SDL, DAG, SD, Chain, IsLittle ? 7 : 0);
2990 return createStoreLR(MipsISD::SDR, DAG, SD, SDL, IsLittle ? 0 : 7);
2991}
2992
2993// Lower (store (fp_to_sint $fp) $ptr) to (store (TruncIntFP $fp), $ptr).
2995 bool SingleFloat) {
2996 SDValue Val = SD->getValue();
2997
2998 if (Val.getOpcode() != ISD::FP_TO_SINT ||
2999 (Val.getValueSizeInBits() > 32 && SingleFloat))
3000 return SDValue();
3001
3003 SDValue Tr = DAG.getNode(MipsISD::TruncIntFP, SDLoc(Val), FPTy,
3004 Val.getOperand(0));
3005 return DAG.getStore(SD->getChain(), SDLoc(SD), Tr, SD->getBasePtr(),
3006 SD->getPointerInfo(), SD->getAlign(),
3007 SD->getMemOperand()->getFlags());
3008}
3009
3012 EVT MemVT = SD->getMemoryVT();
3013
3014 // Lower unaligned integer stores.
3015 if (!Subtarget.systemSupportsUnalignedAccess() &&
3016 (SD->getAlign().value() < (MemVT.getSizeInBits() / 8)) &&
3017 ((MemVT == MVT::i32) || (MemVT == MVT::i64)))
3018 return lowerUnalignedIntStore(SD, DAG, Subtarget.isLittle());
3019
3020 return lowerFP_TO_SINT_STORE(SD, DAG, Subtarget.isSingleFloat());
3021}
3022
3023SDValue MipsTargetLowering::lowerEH_DWARF_CFA(SDValue Op,
3024 SelectionDAG &DAG) const {
3025
3026 // Return a fixed StackObject with offset 0 which points to the old stack
3027 // pointer.
3029 EVT ValTy = Op->getValueType(0);
3030 int FI = MFI.CreateFixedObject(Op.getValueSizeInBits() / 8, 0, false);
3031 return DAG.getFrameIndex(FI, ValTy);
3032}
3033
3034SDValue MipsTargetLowering::lowerFP_TO_SINT(SDValue Op,
3035 SelectionDAG &DAG) const {
3036 if (Op.getValueSizeInBits() > 32 && Subtarget.isSingleFloat())
3037 return SDValue();
3038
3039 EVT FPTy = EVT::getFloatingPointVT(Op.getValueSizeInBits());
3040 SDValue Trunc = DAG.getNode(MipsISD::TruncIntFP, SDLoc(Op), FPTy,
3041 Op.getOperand(0));
3042 return DAG.getNode(ISD::BITCAST, SDLoc(Op), Op.getValueType(), Trunc);
3043}
3044
3045SDValue MipsTargetLowering::lowerSTRICT_FP_TO_INT(SDValue Op,
3046 SelectionDAG &DAG) const {
3047 assert(Op->isStrictFPOpcode());
3048 SDValue SrcVal = Op.getOperand(1);
3049 SDLoc Loc(Op);
3050
3051 SDValue Result =
3054 Loc, Op.getValueType(), SrcVal);
3055
3056 return DAG.getMergeValues({Result, Op.getOperand(0)}, Loc);
3057}
3058
3060 static const MCPhysReg RCRegs[] = {Mips::FCR31};
3061 return RCRegs;
3062}
3063
3064//===----------------------------------------------------------------------===//
3065// Calling Convention Implementation
3066//===----------------------------------------------------------------------===//
3067
3068//===----------------------------------------------------------------------===//
3069// TODO: Implement a generic logic using tblgen that can support this.
3070// Mips O32 ABI rules:
3071// ---
3072// i32 - Passed in A0, A1, A2, A3 and stack
3073// f32 - Only passed in f32 registers if no int reg has been used yet to hold
3074// an argument. Otherwise, passed in A1, A2, A3 and stack.
3075// f64 - Only passed in two aliased f32 registers if no int reg has been used
3076// yet to hold an argument. Otherwise, use A2, A3 and stack. If A1 is
3077// not used, it must be shadowed. If only A3 is available, shadow it and
3078// go to stack.
3079// vXiX - Received as scalarized i32s, passed in A0 - A3 and the stack.
3080// vXf32 - Passed in either a pair of registers {A0, A1}, {A2, A3} or {A0 - A3}
3081// with the remainder spilled to the stack.
3082// vXf64 - Passed in either {A0, A1, A2, A3} or {A2, A3} and in both cases
3083// spilling the remainder to the stack.
3084//
3085// For vararg functions, all arguments are passed in A0, A1, A2, A3 and stack.
3086//===----------------------------------------------------------------------===//
3087
3088static bool CC_MipsO32(unsigned ValNo, MVT ValVT, MVT LocVT,
3089 CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags,
3090 Type *OrigTy, CCState &State,
3091 ArrayRef<MCPhysReg> F64Regs) {
3092 const MipsSubtarget &Subtarget = static_cast<const MipsSubtarget &>(
3093 State.getMachineFunction().getSubtarget());
3094
3095 const MipsABIInfo &ABI = Subtarget.getABI();
3096 ArrayRef<MCPhysReg> IntRegs = ABI.getArgRegs(false);
3097
3098 static const MCPhysReg F32Regs[] = { Mips::F12, Mips::F14 };
3099
3100 const MCPhysReg FloatVectorIntRegs[] = {IntRegs[0], IntRegs[2]};
3101
3102 // Do not process byval args here.
3103 if (ArgFlags.isByVal())
3104 return true;
3105
3106 // Promote i8 and i16
3107 if (ArgFlags.isInReg() && !Subtarget.isLittle()) {
3108 if (LocVT == MVT::i8 || LocVT == MVT::i16 || LocVT == MVT::i32) {
3109 LocVT = MVT::i32;
3110 if (ArgFlags.isSExt())
3111 LocInfo = CCValAssign::SExtUpper;
3112 else if (ArgFlags.isZExt())
3113 LocInfo = CCValAssign::ZExtUpper;
3114 else
3115 LocInfo = CCValAssign::AExtUpper;
3116 }
3117 }
3118
3119 // Promote i8 and i16
3120 if (LocVT == MVT::i8 || LocVT == MVT::i16) {
3121 LocVT = MVT::i32;
3122 if (ArgFlags.isSExt())
3123 LocInfo = CCValAssign::SExt;
3124 else if (ArgFlags.isZExt())
3125 LocInfo = CCValAssign::ZExt;
3126 else
3127 LocInfo = CCValAssign::AExt;
3128 }
3129
3130 unsigned Reg;
3131
3132 // f32 and f64 are allocated in A0, A1, A2, A3 when either of the following
3133 // is true: function is vararg, argument is 3rd or higher, there is previous
3134 // argument which is not f32 or f64.
3135 bool AllocateFloatsInIntReg = State.isVarArg() || ValNo > 1 ||
3136 State.getFirstUnallocated(F32Regs) != ValNo;
3137 Align OrigAlign = ArgFlags.getNonZeroOrigAlign();
3138 bool isI64 = (ValVT == MVT::i32 && OrigAlign == Align(8));
3139 bool isVectorFloat = OrigTy->isVectorTy() && OrigTy->isFPOrFPVectorTy();
3140
3141 // The MIPS vector ABI for floats passes them in a pair of registers
3142 if (ValVT == MVT::i32 && isVectorFloat) {
3143 // This is the start of an vector that was scalarized into an unknown number
3144 // of components. It doesn't matter how many there are. Allocate one of the
3145 // notional 8 byte aligned registers which map onto the argument stack, and
3146 // shadow the register lost to alignment requirements.
3147 if (ArgFlags.isSplit()) {
3148 Reg = State.AllocateReg(FloatVectorIntRegs);
3149 if (Reg == IntRegs[2])
3150 State.AllocateReg(IntRegs[1]);
3151 else if (Reg == 0)
3152 State.AllocateReg(IntRegs[3]);
3153 } else {
3154 // If we're an intermediate component of the split, we can just attempt to
3155 // allocate a register directly.
3156 Reg = State.AllocateReg(IntRegs);
3157 }
3158 } else if (ValVT == MVT::i32 ||
3159 (ValVT == MVT::f32 && AllocateFloatsInIntReg)) {
3160 Reg = State.AllocateReg(IntRegs);
3161 // If this is the first part of an i64 arg,
3162 // the allocated register must be either A0 or A2.
3163 if (isI64 && (Reg == IntRegs[1] || Reg == IntRegs[3]))
3164 Reg = State.AllocateReg(IntRegs);
3165 LocVT = MVT::i32;
3166 } else if (ValVT == MVT::f64 && AllocateFloatsInIntReg) {
3167 // Allocate int register and shadow next int register. If first
3168 // available register is $a1 or $a3, shadow it too.
3169 Reg = State.AllocateReg(IntRegs);
3170 if (Reg == IntRegs[1] || Reg == IntRegs[3])
3171 Reg = State.AllocateReg(IntRegs);
3172
3173 if (Reg) {
3174 LocVT = MVT::i32;
3175
3176 State.addLoc(
3177 CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
3178 MCRegister HiReg = State.AllocateReg(IntRegs);
3179 assert(HiReg);
3180 State.addLoc(
3181 CCValAssign::getCustomReg(ValNo, ValVT, HiReg, LocVT, LocInfo));
3182 return false;
3183 }
3184 } else if (ValVT.isFloatingPoint() && !AllocateFloatsInIntReg) {
3185 // we are guaranteed to find an available float register
3186 if (ValVT == MVT::f32) {
3187 Reg = State.AllocateReg(F32Regs);
3188 // Shadow int register
3189 State.AllocateReg(IntRegs);
3190 } else {
3191 Reg = State.AllocateReg(F64Regs);
3192 // Shadow int registers
3193 MCRegister Reg2 = State.AllocateReg(IntRegs);
3194 if (Reg2 == IntRegs[1] || Reg2 == IntRegs[3])
3195 State.AllocateReg(IntRegs);
3196 State.AllocateReg(IntRegs);
3197 }
3198 } else
3199 llvm_unreachable("Cannot handle this ValVT.");
3200
3201 if (!Reg) {
3202 unsigned Offset = State.AllocateStack(ValVT.getStoreSize(), OrigAlign);
3203 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo));
3204 } else
3205 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
3206
3207 return false;
3208}
3209
3210static bool CC_MipsO32_FP32(unsigned ValNo, MVT ValVT, MVT LocVT,
3211 CCValAssign::LocInfo LocInfo,
3212 ISD::ArgFlagsTy ArgFlags, Type *OrigTy,
3213 CCState &State) {
3214 static const MCPhysReg F64Regs[] = { Mips::D6, Mips::D7 };
3215
3216 return CC_MipsO32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State,
3217 F64Regs);
3218}
3219
3220static bool CC_MipsO32_FP64(unsigned ValNo, MVT ValVT, MVT LocVT,
3221 CCValAssign::LocInfo LocInfo,
3222 ISD::ArgFlagsTy ArgFlags, Type *OrigTy,
3223 CCState &State) {
3224 static const MCPhysReg F64Regs[] = { Mips::D12_64, Mips::D14_64 };
3225
3226 return CC_MipsO32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, OrigTy, State,
3227 F64Regs);
3228}
3229
3230[[maybe_unused]] static bool CC_MipsO32(unsigned ValNo, MVT ValVT, MVT LocVT,
3231 CCValAssign::LocInfo LocInfo,
3232 ISD::ArgFlagsTy ArgFlags, Type *OrigTy,
3233 CCState &State);
3234
3235#define GET_CALLING_CONV_IMPL
3236#include "MipsGenCallingConv.inc"
3237
3239 return CC_Mips_FixedArg;
3240 }
3241
3243 return RetCC_Mips;
3244 }
3245//===----------------------------------------------------------------------===//
3246// Call Calling Convention Implementation
3247//===----------------------------------------------------------------------===//
3248
3249SDValue MipsTargetLowering::passArgOnStack(SDValue StackPtr, unsigned Offset,
3250 SDValue Chain, SDValue Arg,
3251 const SDLoc &DL, bool IsTailCall,
3252 SelectionDAG &DAG) const {
3253 if (!IsTailCall) {
3254 SDValue PtrOff =
3255 DAG.getNode(ISD::ADD, DL, getPointerTy(DAG.getDataLayout()), StackPtr,
3257 return DAG.getStore(Chain, DL, Arg, PtrOff, MachinePointerInfo());
3258 }
3259
3261 int FI = MFI.CreateFixedObject(Arg.getValueSizeInBits() / 8, Offset, false);
3262 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
3263 return DAG.getStore(Chain, DL, Arg, FIN, MachinePointerInfo(), MaybeAlign(),
3265}
3266
3269 std::deque<std::pair<unsigned, SDValue>> &RegsToPass, bool IsPICCall,
3270 bool GlobalOrExternal, bool LocalLinkage, bool IsCallReloc,
3271 CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const {
3272 // Insert node "GP copy globalreg" before call to function.
3273 //
3274 // R_MIPS_CALL* operators (emitted when non-local functions are called
3275 // in PIC mode) allow symbols to be resolved via lazy binding.
3276 // The lazy binding stub requires GP to point to the GOT.
3277 // Note that we don't need GP to point to the GOT for indirect calls
3278 // (when R_MIPS_CALL* is not used for the call) because Mips linker generates
3279 // lazy binding stub for a function only when R_MIPS_CALL* are the only relocs
3280 // used for the function (that is, Mips linker doesn't generate lazy binding
3281 // stub for a function whose address is taken in the program).
3282 if (IsPICCall && !LocalLinkage && IsCallReloc) {
3283 unsigned GPReg = ABI.IsN64() ? Mips::GP_64 : Mips::GP;
3284 EVT Ty = ABI.IsN64() ? MVT::i64 : MVT::i32;
3285 RegsToPass.push_back(std::make_pair(GPReg, getGlobalReg(CLI.DAG, Ty)));
3286 }
3287
3288 // Build a sequence of copy-to-reg nodes chained together with token
3289 // chain and flag operands which copy the outgoing args into registers.
3290 // The InGlue in necessary since all emitted instructions must be
3291 // stuck together.
3292 SDValue InGlue;
3293
3294 for (auto &R : RegsToPass) {
3295 Chain = CLI.DAG.getCopyToReg(Chain, CLI.DL, R.first, R.second, InGlue);
3296 InGlue = Chain.getValue(1);
3297 }
3298
3299 // Add argument registers to the end of the list so that they are
3300 // known live into the call.
3301 for (auto &R : RegsToPass)
3302 Ops.push_back(CLI.DAG.getRegister(R.first, R.second.getValueType()));
3303
3304 // Add a register mask operand representing the call-preserved registers.
3305 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
3306 const uint32_t *Mask =
3307 TRI->getCallPreservedMask(CLI.DAG.getMachineFunction(), CLI.CallConv);
3308 assert(Mask && "Missing call preserved mask for calling convention");
3309 if (Subtarget.inMips16HardFloat()) {
3311 StringRef Sym = G->getGlobal()->getName();
3312 Function *F = G->getGlobal()->getParent()->getFunction(Sym);
3313 if (F && F->hasFnAttribute("__Mips16RetHelper")) {
3315 }
3316 }
3317 }
3318 Ops.push_back(CLI.DAG.getRegisterMask(Mask));
3319
3320 if (InGlue.getNode())
3321 Ops.push_back(InGlue);
3322}
3323
3325 SDNode *Node) const {
3326 switch (MI.getOpcode()) {
3327 default:
3328 return;
3329 case Mips::JALR:
3330 case Mips::JALRPseudo:
3331 case Mips::JALR64:
3332 case Mips::JALR64Pseudo:
3333 case Mips::JALR16_MM:
3334 case Mips::JALRC16_MMR6:
3335 case Mips::TAILCALLREG:
3336 case Mips::TAILCALLREG64:
3337 case Mips::TAILCALLR6REG:
3338 case Mips::TAILCALL64R6REG:
3339 case Mips::TAILCALLREG_MM:
3340 case Mips::TAILCALLREG_MMR6: {
3341 if (!Subtarget.getMCCLOpts().jalr_reloc || Subtarget.inMips16Mode() ||
3342 !isPositionIndependent() || Node->getNumOperands() < 1 ||
3343 Node->getOperand(0).getNumOperands() < 2) {
3344 return;
3345 }
3346 // We are after the callee address, set by LowerCall().
3347 // If added to MI, asm printer will emit .reloc R_MIPS_JALR for the
3348 // symbol.
3349 const SDValue TargetAddr = Node->getOperand(0).getOperand(1);
3350 MCSymbol *S = nullptr;
3351 if (const GlobalAddressSDNode *G =
3353 const GlobalValue *GV = G->getGlobal();
3354
3355 // We must not emit the R_MIPS_JALR relocation against data symbols
3356 // since this will cause run-time crashes if the linker replaces the
3357 // call instruction with a relative branch to the data symbol.
3358 if (!isa<Function>(GV)) {
3359 LLVM_DEBUG(dbgs() << "Not adding R_MIPS_JALR against data symbol "
3360 << GV->getName() << "\n");
3361 return;
3362 }
3363 S = getTargetMachine().getSymbol(GV);
3364 }
3365 else if (const ExternalSymbolSDNode *ES =
3367 S = MI.getParent()->getParent()->getContext().getOrCreateSymbol(
3368 ES->getSymbol());
3369 }
3370
3371 if (!S)
3372 return;
3373
3374 LLVM_DEBUG(dbgs() << "Adding R_MIPS_JALR against " << S->getName()
3375 << "\n");
3377 }
3378 }
3379}
3380
3381/// LowerCall - functions arguments are copied from virtual regs to
3382/// (physical regs)/(stack frame), CALLSEQ_START and CALLSEQ_END are emitted.
3383SDValue
3384MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
3385 SmallVectorImpl<SDValue> &InVals) const {
3386 SelectionDAG &DAG = CLI.DAG;
3387 SDLoc DL = CLI.DL;
3389 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
3391 SDValue Chain = CLI.Chain;
3392 SDValue Callee = CLI.Callee;
3393 bool &IsTailCall = CLI.IsTailCall;
3394 CallingConv::ID CallConv = CLI.CallConv;
3395 bool IsVarArg = CLI.IsVarArg;
3396 const CallBase *CB = CLI.CB;
3397
3399 MachineFrameInfo &MFI = MF.getFrameInfo();
3401 MipsFunctionInfo *FuncInfo = MF.getInfo<MipsFunctionInfo>();
3402 bool IsPIC = isPositionIndependent();
3403
3404 // Analyze operands of the call, assigning locations to each operand.
3406 MipsCCState CCInfo(
3407 CallConv, IsVarArg, DAG.getMachineFunction(), ArgLocs, *DAG.getContext(),
3409
3410 const ExternalSymbolSDNode *ES =
3412
3413 // There is one case where CALLSEQ_START..CALLSEQ_END can be nested, which
3414 // is during the lowering of a call with a byval argument which produces
3415 // a call to memcpy. For the O32 case, this causes the caller to allocate
3416 // stack space for the reserved argument area for the callee, then recursively
3417 // again for the memcpy call. In the NEWABI case, this doesn't occur as those
3418 // ABIs mandate that the callee allocates the reserved argument area. We do
3419 // still produce nested CALLSEQ_START..CALLSEQ_END with zero space though.
3420 //
3421 // If the callee has a byval argument and memcpy is used, we are mandated
3422 // to already have produced a reserved argument area for the callee for O32.
3423 // Therefore, the reserved argument area can be reused for both calls.
3424 //
3425 // Other cases of calling memcpy cannot have a chain with a CALLSEQ_START
3426 // present, as we have yet to hook that node onto the chain.
3427 //
3428 // Hence, the CALLSEQ_START and CALLSEQ_END nodes can be eliminated in this
3429 // case. GCC does a similar trick, in that wherever possible, it calculates
3430 // the maximum out going argument area (including the reserved area), and
3431 // preallocates the stack space on entrance to the caller.
3432 //
3433 // FIXME: We should do the same for efficiency and space.
3434
3435 // Note: The check on the calling convention below must match
3436 // MipsABIInfo::GetCalleeAllocdArgSizeInBytes().
3437 bool MemcpyInByVal = ES && StringRef(ES->getSymbol()) == "memcpy" &&
3438 CallConv != CallingConv::Fast &&
3439 Chain.getOpcode() == ISD::CALLSEQ_START;
3440
3441 // Allocate the reserved argument area. It seems strange to do this from the
3442 // caller side but removing it breaks the frame size calculation.
3443 unsigned ReservedArgArea =
3444 MemcpyInByVal ? 0 : ABI.GetCalleeAllocdArgSizeInBytes(CallConv);
3445 CCInfo.AllocateStack(ReservedArgArea, Align(1));
3446
3447 CCInfo.AnalyzeCallOperands(Outs, CC_Mips);
3448
3449 // Get a count of how many bytes are to be pushed on the stack.
3450 unsigned StackSize = CCInfo.getStackSize();
3451
3452 // Call site info for function parameters tracking and call base type info.
3454 // Set type id for call site info.
3455 setTypeIdForCallsiteInfo(CB, MF, CSInfo);
3456
3457 // Check if it's really possible to do a tail call.
3458 // For non-musttail calls, restrict to functions that won't require $gp
3459 // restoration. In PIC mode, calling external functions via tail call can
3460 // cause issues with $gp register handling (see D24763).
3461 bool IsMustTail = CLI.CB && CLI.CB->isMustTailCall();
3462 bool CalleeIsLocal = true;
3464 const GlobalValue *GV = G->getGlobal();
3465 bool HasLocalLinkage = GV->hasLocalLinkage() || GV->hasPrivateLinkage();
3466 bool HasHiddenVisibility =
3468 if (GV->isDeclarationForLinker())
3469 CalleeIsLocal = HasLocalLinkage || HasHiddenVisibility;
3470 else
3471 CalleeIsLocal = GV->isDSOLocal();
3472 }
3473
3474 if (IsTailCall) {
3475 if (!Subtarget.getCLOpts().tail_calls) {
3476 IsTailCall = false;
3477 if (IsMustTail)
3478 report_fatal_error("failed to perform tail call elimination on a call "
3479 "site marked musttail");
3480 } else {
3481 bool Eligible = isEligibleForTailCallOptimization(
3482 CCInfo, StackSize, *MF.getInfo<MipsFunctionInfo>());
3483 if (!Eligible || !CalleeIsLocal) {
3484 IsTailCall = false;
3485 if (IsMustTail)
3487 "failed to perform tail call elimination on a call "
3488 "site marked musttail");
3489 }
3490 }
3491 }
3492
3493 if (IsTailCall)
3494 ++NumTailCalls;
3495
3496 // Chain is the output chain of the last Load/Store or CopyToReg node.
3497 // ByValChain is the output chain of the last Memcpy node created for copying
3498 // byval arguments to the stack.
3499 unsigned StackAlignment = TFL->getStackAlignment();
3500 StackSize = alignTo(StackSize, StackAlignment);
3501
3502 if (!(IsTailCall || MemcpyInByVal))
3503 Chain = DAG.getCALLSEQ_START(Chain, StackSize, 0, DL);
3504
3505 SDValue StackPtr =
3506 DAG.getCopyFromReg(Chain, DL, ABI.IsN64() ? Mips::SP_64 : Mips::SP,
3508 std::deque<std::pair<unsigned, SDValue>> RegsToPass;
3509 SmallVector<SDValue, 8> MemOpChains;
3510
3511 CCInfo.rewindByValRegsInfo();
3512
3513 // Walk the register/memloc assignments, inserting copies/loads.
3514 for (unsigned i = 0, e = ArgLocs.size(), OutIdx = 0; i != e; ++i, ++OutIdx) {
3515 SDValue Arg = OutVals[OutIdx];
3516 CCValAssign &VA = ArgLocs[i];
3517 MVT ValVT = VA.getValVT(), LocVT = VA.getLocVT();
3518 ISD::ArgFlagsTy Flags = Outs[OutIdx].Flags;
3519 bool UseUpperBits = false;
3520
3521 // ByVal Arg.
3522 if (Flags.isByVal()) {
3523 unsigned FirstByValReg, LastByValReg;
3524 unsigned ByValIdx = CCInfo.getInRegsParamsProcessed();
3525 CCInfo.getInRegsParamInfo(ByValIdx, FirstByValReg, LastByValReg);
3526
3527 assert(Flags.getByValSize() &&
3528 "ByVal args of size 0 should have been ignored by front-end.");
3529 assert(ByValIdx < CCInfo.getInRegsParamsCount());
3530 assert(!IsTailCall &&
3531 "Do not tail-call optimize if there is a byval argument.");
3532 passByValArg(Chain, DL, RegsToPass, MemOpChains, StackPtr, MFI, DAG, Arg,
3533 FirstByValReg, LastByValReg, Flags, Subtarget.isLittle(),
3534 VA);
3535 CCInfo.nextInRegsParam();
3536 continue;
3537 }
3538
3539 // Promote the value if needed.
3540 switch (VA.getLocInfo()) {
3541 default:
3542 llvm_unreachable("Unknown loc info!");
3543 case CCValAssign::Full:
3544 if (VA.isRegLoc()) {
3545 if ((ValVT == MVT::f32 && LocVT == MVT::i32) ||
3546 (ValVT == MVT::f64 && LocVT == MVT::i64) ||
3547 (ValVT == MVT::i64 && LocVT == MVT::f64))
3548 Arg = DAG.getNode(ISD::BITCAST, DL, LocVT, Arg);
3549 else if (ValVT == MVT::f64 && LocVT == MVT::i32) {
3550 SDValue Lo = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
3551 Arg, DAG.getConstant(0, DL, MVT::i32));
3552 SDValue Hi = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
3553 Arg, DAG.getConstant(1, DL, MVT::i32));
3554 if (!Subtarget.isLittle())
3555 std::swap(Lo, Hi);
3556
3557 assert(VA.needsCustom());
3558
3559 Register LocRegLo = VA.getLocReg();
3560 Register LocRegHigh = ArgLocs[++i].getLocReg();
3561 RegsToPass.push_back(std::make_pair(LocRegLo, Lo));
3562 RegsToPass.push_back(std::make_pair(LocRegHigh, Hi));
3563 continue;
3564 }
3565 }
3566 break;
3567 case CCValAssign::BCvt:
3568 Arg = DAG.getNode(ISD::BITCAST, DL, LocVT, Arg);
3569 break;
3571 UseUpperBits = true;
3572 [[fallthrough]];
3573 case CCValAssign::SExt:
3574 Arg = DAG.getNode(ISD::SIGN_EXTEND, DL, LocVT, Arg);
3575 break;
3577 UseUpperBits = true;
3578 [[fallthrough]];
3579 case CCValAssign::ZExt:
3580 Arg = DAG.getNode(ISD::ZERO_EXTEND, DL, LocVT, Arg);
3581 break;
3583 UseUpperBits = true;
3584 [[fallthrough]];
3585 case CCValAssign::AExt:
3586 Arg = DAG.getNode(ISD::ANY_EXTEND, DL, LocVT, Arg);
3587 break;
3588 }
3589
3590 if (UseUpperBits) {
3591 unsigned ValSizeInBits = Outs[OutIdx].ArgVT.getSizeInBits();
3592 unsigned LocSizeInBits = VA.getLocVT().getSizeInBits();
3593 Arg = DAG.getNode(
3594 ISD::SHL, DL, VA.getLocVT(), Arg,
3595 DAG.getConstant(LocSizeInBits - ValSizeInBits, DL, VA.getLocVT()));
3596 }
3597
3598 // Arguments that can be passed on register must be kept at
3599 // RegsToPass vector
3600 if (VA.isRegLoc()) {
3601 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
3602
3603 // If the parameter is passed through reg $D, which splits into
3604 // two physical registers, avoid creating call site info.
3605 if (Mips::AFGR64RegClass.contains(VA.getLocReg()))
3606 continue;
3607
3608 // Collect CSInfo about which register passes which parameter.
3609 const TargetOptions &Options = DAG.getTarget().Options;
3610 if (Options.EmitCallSiteInfo)
3611 CSInfo.ArgRegPairs.emplace_back(VA.getLocReg(), i);
3612
3613 continue;
3614 }
3615
3616 // Register can't get to this point...
3617 assert(VA.isMemLoc());
3618
3619 // emit ISD::STORE whichs stores the
3620 // parameter value to a stack Location
3621 MemOpChains.push_back(passArgOnStack(StackPtr, VA.getLocMemOffset(),
3622 Chain, Arg, DL, IsTailCall, DAG));
3623 }
3624
3625 // Transform all store nodes into one single node because all store
3626 // nodes are independent of each other.
3627 if (!MemOpChains.empty())
3628 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains);
3629
3630 // If the callee is a GlobalAddress/ExternalSymbol node (quite common, every
3631 // direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol
3632 // node so that legalize doesn't hack it.
3633
3634 EVT Ty = Callee.getValueType();
3635 bool GlobalOrExternal = false, IsCallReloc = false;
3636
3637 // The long-calls feature is ignored in case of PIC.
3638 // While we do not support -mshared / -mno-shared properly,
3639 // ignore long-calls in case of -mabicalls too.
3640 if (!Subtarget.isABICalls() && !IsPIC) {
3641 // If the function should be called using "long call",
3642 // get its address into a register to prevent using
3643 // of the `jal` instruction for the direct call.
3644 if (auto *N = dyn_cast<ExternalSymbolSDNode>(Callee)) {
3645 if (Subtarget.useLongCalls())
3646 Callee = Subtarget.hasSym32()
3647 ? getAddrNonPIC(N, SDLoc(N), Ty, DAG)
3648 : getAddrNonPICSym64(N, SDLoc(N), Ty, DAG);
3649 } else if (auto *N = dyn_cast<GlobalAddressSDNode>(Callee)) {
3650 bool UseLongCalls = Subtarget.useLongCalls();
3651 // If the function has long-call/far/near attribute
3652 // it overrides command line switch pased to the backend.
3653 if (auto *F = dyn_cast<Function>(N->getGlobal())) {
3654 if (F->hasFnAttribute("long-call"))
3655 UseLongCalls = true;
3656 else if (F->hasFnAttribute("short-call"))
3657 UseLongCalls = false;
3658 }
3659 if (UseLongCalls)
3660 Callee = Subtarget.hasSym32()
3661 ? getAddrNonPIC(N, SDLoc(N), Ty, DAG)
3662 : getAddrNonPICSym64(N, SDLoc(N), Ty, DAG);
3663 }
3664 }
3665
3666 bool LocalLinkage = false;
3667 if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
3668 if (Subtarget.isTargetCOFF() &&
3669 G->getGlobal()->hasDLLImportStorageClass()) {
3670 assert(Subtarget.isTargetWindows() &&
3671 "Windows is the only supported COFF target");
3672 auto PtrInfo = MachinePointerInfo();
3673 Callee = DAG.getLoad(Ty, DL, Chain,
3674 getDllimportSymbol(G, SDLoc(G), Ty, DAG), PtrInfo);
3675 } else if (IsPIC) {
3676 const GlobalValue *Val = G->getGlobal();
3677 LocalLinkage = Val->hasLocalLinkage();
3678
3679 if (LocalLinkage)
3680 Callee = getAddrLocal(G, DL, Ty, DAG, ABI.IsN32() || ABI.IsN64());
3681 else if (Subtarget.useXGOT()) {
3683 MipsII::MO_CALL_LO16, Chain,
3684 FuncInfo->callPtrInfo(MF, Val));
3685 IsCallReloc = true;
3686 } else {
3687 Callee = getAddrGlobal(G, DL, Ty, DAG, MipsII::MO_GOT_CALL, Chain,
3688 FuncInfo->callPtrInfo(MF, Val));
3689 IsCallReloc = true;
3690 }
3691 } else
3692 Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL,
3693 getPointerTy(DAG.getDataLayout()), 0,
3695 GlobalOrExternal = true;
3696 }
3697 else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
3698 const char *Sym = S->getSymbol();
3699
3700 if (!IsPIC) // static
3703 else if (Subtarget.useXGOT()) {
3705 MipsII::MO_CALL_LO16, Chain,
3706 FuncInfo->callPtrInfo(MF, Sym));
3707 IsCallReloc = true;
3708 } else { // PIC
3709 Callee = getAddrGlobal(S, DL, Ty, DAG, MipsII::MO_GOT_CALL, Chain,
3710 FuncInfo->callPtrInfo(MF, Sym));
3711 IsCallReloc = true;
3712 }
3713
3714 GlobalOrExternal = true;
3715 }
3716
3717 SmallVector<SDValue, 8> Ops(1, Chain);
3718 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
3719
3720 getOpndList(Ops, RegsToPass, IsPIC, GlobalOrExternal, LocalLinkage,
3721 IsCallReloc, CLI, Callee, Chain);
3722
3723 if (IsTailCall) {
3725 SDValue Ret = DAG.getNode(MipsISD::TailCall, DL, MVT::Other, Ops);
3726 DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
3727 return Ret;
3728 }
3729
3730 Chain = DAG.getNode(MipsISD::JmpLink, DL, NodeTys, Ops);
3731 SDValue InGlue = Chain.getValue(1);
3732
3733 DAG.addCallSiteInfo(Chain.getNode(), std::move(CSInfo));
3734
3735 // Create the CALLSEQ_END node in the case of where it is not a call to
3736 // memcpy.
3737 if (!(MemcpyInByVal)) {
3738 Chain = DAG.getCALLSEQ_END(Chain, StackSize, 0, InGlue, DL);
3739 InGlue = Chain.getValue(1);
3740 }
3741
3742 // Handle result values, copying them out of physregs into vregs that we
3743 // return.
3744 return LowerCallResult(Chain, InGlue, CallConv, IsVarArg, Ins, DL, DAG,
3745 InVals, CLI);
3746}
3747
3748/// LowerCallResult - Lower the result values of a call into the
3749/// appropriate copies out of appropriate physical registers.
3750SDValue MipsTargetLowering::LowerCallResult(
3751 SDValue Chain, SDValue InGlue, CallingConv::ID CallConv, bool IsVarArg,
3752 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL,
3755 // Assign locations to each value returned by this call.
3757 MipsCCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), RVLocs,
3758 *DAG.getContext());
3759
3760 CCInfo.AnalyzeCallResult(Ins, RetCC_Mips);
3761
3762 // Copy all of the result registers out of their specified physreg.
3763 for (unsigned i = 0; i != RVLocs.size(); ++i) {
3764 CCValAssign &VA = RVLocs[i];
3765 assert(VA.isRegLoc() && "Can only return in registers!");
3766
3767 SDValue Val = DAG.getCopyFromReg(Chain, DL, RVLocs[i].getLocReg(),
3768 RVLocs[i].getLocVT(), InGlue);
3769 Chain = Val.getValue(1);
3770 InGlue = Val.getValue(2);
3771
3772 if (VA.isUpperBitsInLoc()) {
3773 unsigned ValSizeInBits = Ins[i].ArgVT.getSizeInBits();
3774 unsigned LocSizeInBits = VA.getLocVT().getSizeInBits();
3775 unsigned Shift =
3777 Val = DAG.getNode(
3778 Shift, DL, VA.getLocVT(), Val,
3779 DAG.getConstant(LocSizeInBits - ValSizeInBits, DL, VA.getLocVT()));
3780 }
3781
3782 switch (VA.getLocInfo()) {
3783 default:
3784 llvm_unreachable("Unknown loc info!");
3785 case CCValAssign::Full:
3786 break;
3787 case CCValAssign::BCvt:
3788 Val = DAG.getNode(ISD::BITCAST, DL, VA.getValVT(), Val);
3789 break;
3790 case CCValAssign::AExt:
3792 Val = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), Val);
3793 break;
3794 case CCValAssign::ZExt:
3796 Val = DAG.getNode(ISD::AssertZext, DL, VA.getLocVT(), Val,
3797 DAG.getValueType(VA.getValVT()));
3798 Val = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), Val);
3799 break;
3800 case CCValAssign::SExt:
3802 Val = DAG.getNode(ISD::AssertSext, DL, VA.getLocVT(), Val,
3803 DAG.getValueType(VA.getValVT()));
3804 Val = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), Val);
3805 break;
3806 }
3807
3808 InVals.push_back(Val);
3809 }
3810
3811 return Chain;
3812}
3813
3815 EVT ArgVT, const SDLoc &DL,
3816 SelectionDAG &DAG) {
3817 MVT LocVT = VA.getLocVT();
3818 EVT ValVT = VA.getValVT();
3819
3820 // Shift into the upper bits if necessary.
3821 switch (VA.getLocInfo()) {
3822 default:
3823 break;
3827 unsigned ValSizeInBits = ArgVT.getSizeInBits();
3828 unsigned LocSizeInBits = VA.getLocVT().getSizeInBits();
3829 unsigned Opcode =
3831 Val = DAG.getNode(
3832 Opcode, DL, VA.getLocVT(), Val,
3833 DAG.getConstant(LocSizeInBits - ValSizeInBits, DL, VA.getLocVT()));
3834 break;
3835 }
3836 }
3837
3838 // If this is an value smaller than the argument slot size (32-bit for O32,
3839 // 64-bit for N32/N64), it has been promoted in some way to the argument slot
3840 // size. Extract the value and insert any appropriate assertions regarding
3841 // sign/zero extension.
3842 switch (VA.getLocInfo()) {
3843 default:
3844 llvm_unreachable("Unknown loc info!");
3845 case CCValAssign::Full:
3846 break;
3848 case CCValAssign::AExt:
3849 Val = DAG.getNode(ISD::TRUNCATE, DL, ValVT, Val);
3850 break;
3852 case CCValAssign::SExt:
3853 Val = DAG.getNode(ISD::AssertSext, DL, LocVT, Val, DAG.getValueType(ValVT));
3854 Val = DAG.getNode(ISD::TRUNCATE, DL, ValVT, Val);
3855 break;
3857 case CCValAssign::ZExt:
3858 Val = DAG.getNode(ISD::AssertZext, DL, LocVT, Val, DAG.getValueType(ValVT));
3859 Val = DAG.getNode(ISD::TRUNCATE, DL, ValVT, Val);
3860 break;
3861 case CCValAssign::BCvt:
3862 Val = DAG.getNode(ISD::BITCAST, DL, ValVT, Val);
3863 break;
3864 }
3865
3866 return Val;
3867}
3868
3869//===----------------------------------------------------------------------===//
3870// Formal Arguments Calling Convention Implementation
3871//===----------------------------------------------------------------------===//
3872/// LowerFormalArguments - transform physical registers into virtual registers
3873/// and generate load operations for arguments places on the stack.
3874SDValue MipsTargetLowering::LowerFormalArguments(
3875 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
3876 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL,
3877 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
3879 MachineFrameInfo &MFI = MF.getFrameInfo();
3880 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
3881
3882 MipsFI->setVarArgsFrameIndex(0);
3883
3884 // Used with vargs to acumulate store chains.
3885 std::vector<SDValue> OutChains;
3886
3887 // Assign locations to all of the incoming arguments.
3889 MipsCCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), ArgLocs,
3890 *DAG.getContext());
3891 CCInfo.AllocateStack(ABI.GetCalleeAllocdArgSizeInBytes(CallConv), Align(1));
3893 Function::const_arg_iterator FuncArg = Func.arg_begin();
3894
3895 if (Func.hasFnAttribute("interrupt") && !Func.arg_empty())
3897 "Functions with the interrupt attribute cannot have arguments!");
3898
3899 CCInfo.AnalyzeFormalArguments(Ins, CC_Mips_FixedArg);
3900 MipsFI->setFormalArgInfo(CCInfo.getStackSize(),
3901 CCInfo.getInRegsParamsCount() > 0);
3902
3903 unsigned CurArgIdx = 0;
3904 CCInfo.rewindByValRegsInfo();
3905
3906 for (unsigned i = 0, e = ArgLocs.size(), InsIdx = 0; i != e; ++i, ++InsIdx) {
3907 CCValAssign &VA = ArgLocs[i];
3908 if (Ins[InsIdx].isOrigArg()) {
3909 std::advance(FuncArg, Ins[InsIdx].getOrigArgIndex() - CurArgIdx);
3910 CurArgIdx = Ins[InsIdx].getOrigArgIndex();
3911 }
3912 EVT ValVT = VA.getValVT();
3913 ISD::ArgFlagsTy Flags = Ins[InsIdx].Flags;
3914 bool IsRegLoc = VA.isRegLoc();
3915
3916 if (Flags.isByVal()) {
3917 assert(Ins[InsIdx].isOrigArg() && "Byval arguments cannot be implicit");
3918 unsigned FirstByValReg, LastByValReg;
3919 unsigned ByValIdx = CCInfo.getInRegsParamsProcessed();
3920 CCInfo.getInRegsParamInfo(ByValIdx, FirstByValReg, LastByValReg);
3921
3922 assert(Flags.getByValSize() &&
3923 "ByVal args of size 0 should have been ignored by front-end.");
3924 assert(ByValIdx < CCInfo.getInRegsParamsCount());
3925 copyByValRegs(Chain, DL, OutChains, DAG, Flags, InVals, &*FuncArg,
3926 FirstByValReg, LastByValReg, VA, CCInfo);
3927 CCInfo.nextInRegsParam();
3928 continue;
3929 }
3930
3931 // Arguments stored on registers
3932 if (IsRegLoc) {
3933 MVT RegVT = VA.getLocVT();
3934 Register ArgReg = VA.getLocReg();
3935 const TargetRegisterClass *RC = getRegClassFor(RegVT);
3936
3937 // Transform the arguments stored on
3938 // physical registers into virtual ones
3939 unsigned Reg = addLiveIn(DAG.getMachineFunction(), ArgReg, RC);
3940 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegVT);
3941
3942 ArgValue =
3943 UnpackFromArgumentSlot(ArgValue, VA, Ins[InsIdx].ArgVT, DL, DAG);
3944
3945 // Handle floating point arguments passed in integer registers and
3946 // long double arguments passed in floating point registers.
3947 if ((RegVT == MVT::i32 && ValVT == MVT::f32) ||
3948 (RegVT == MVT::i64 && ValVT == MVT::f64) ||
3949 (RegVT == MVT::f64 && ValVT == MVT::i64))
3950 ArgValue = DAG.getNode(ISD::BITCAST, DL, ValVT, ArgValue);
3951 else if (ABI.IsO32() && RegVT == MVT::i32 &&
3952 ValVT == MVT::f64) {
3953 assert(VA.needsCustom() && "Expected custom argument for f64 split");
3954 CCValAssign &NextVA = ArgLocs[++i];
3955 unsigned Reg2 =
3956 addLiveIn(DAG.getMachineFunction(), NextVA.getLocReg(), RC);
3957 SDValue ArgValue2 = DAG.getCopyFromReg(Chain, DL, Reg2, RegVT);
3958 if (!Subtarget.isLittle())
3959 std::swap(ArgValue, ArgValue2);
3960 ArgValue = DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64,
3961 ArgValue, ArgValue2);
3962 }
3963
3964 InVals.push_back(ArgValue);
3965 } else { // VA.isRegLoc()
3966 MVT LocVT = VA.getLocVT();
3967
3968 assert(!VA.needsCustom() && "unexpected custom memory argument");
3969
3970 // Only arguments pased on the stack should make it here.
3971 assert(VA.isMemLoc());
3972
3973 // The stack pointer offset is relative to the caller stack frame.
3974 int FI = MFI.CreateFixedObject(LocVT.getSizeInBits() / 8,
3975 VA.getLocMemOffset(), true);
3976
3977 // Create load nodes to retrieve arguments from the stack
3978 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
3979 SDValue ArgValue = DAG.getLoad(
3980 LocVT, DL, Chain, FIN,
3982 OutChains.push_back(ArgValue.getValue(1));
3983
3984 ArgValue =
3985 UnpackFromArgumentSlot(ArgValue, VA, Ins[InsIdx].ArgVT, DL, DAG);
3986
3987 InVals.push_back(ArgValue);
3988 }
3989 }
3990
3991 for (unsigned i = 0, e = ArgLocs.size(), InsIdx = 0; i != e; ++i, ++InsIdx) {
3992
3993 if (ArgLocs[i].needsCustom()) {
3994 ++i;
3995 continue;
3996 }
3997
3998 // The mips ABIs for returning structs by value requires that we copy
3999 // the sret argument into $v0 for the return. Save the argument into
4000 // a virtual register so that we can access it from the return points.
4001 if (Ins[InsIdx].Flags.isSRet()) {
4002 unsigned Reg = MipsFI->getSRetReturnReg();
4003 if (!Reg) {
4005 getRegClassFor(ABI.IsN64() ? MVT::i64 : MVT::i32));
4006 MipsFI->setSRetReturnReg(Reg);
4007 }
4008 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), DL, Reg, InVals[i]);
4009 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Copy, Chain);
4010 break;
4011 }
4012 }
4013
4014 if (IsVarArg)
4015 writeVarArgRegs(OutChains, Chain, DL, DAG, CCInfo);
4016
4017 // All stores are grouped in one node to allow the matching between
4018 // the size of Ins and InVals. This only happens when on varg functions
4019 if (!OutChains.empty()) {
4020 OutChains.push_back(Chain);
4021 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, OutChains);
4022 }
4023
4024 return Chain;
4025}
4026
4027//===----------------------------------------------------------------------===//
4028// Return Value Calling Convention Implementation
4029//===----------------------------------------------------------------------===//
4030
4031bool
4032MipsTargetLowering::CanLowerReturn(CallingConv::ID CallConv,
4033 MachineFunction &MF, bool IsVarArg,
4035 LLVMContext &Context, const Type *RetTy) const {
4037 MipsCCState CCInfo(CallConv, IsVarArg, MF, RVLocs, Context);
4038 return CCInfo.CheckReturn(Outs, RetCC_Mips);
4039}
4040
4041bool MipsTargetLowering::shouldSignExtendTypeInLibCall(Type *Ty,
4042 bool IsSigned) const {
4043 if ((ABI.IsN32() || ABI.IsN64()) && Ty->isIntegerTy(32))
4044 return true;
4045
4046 return IsSigned;
4047}
4048
4049SDValue
4050MipsTargetLowering::LowerInterruptReturn(SmallVectorImpl<SDValue> &RetOps,
4051 const SDLoc &DL,
4052 SelectionDAG &DAG) const {
4054 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
4055
4056 MipsFI->setISR();
4057
4058 return DAG.getNode(MipsISD::ERet, DL, MVT::Other, RetOps);
4059}
4060
4061SDValue
4062MipsTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
4063 bool IsVarArg,
4065 const SmallVectorImpl<SDValue> &OutVals,
4066 const SDLoc &DL, SelectionDAG &DAG) const {
4067 // CCValAssign - represent the assignment of
4068 // the return value to a location
4071
4072 // CCState - Info about the registers and stack slot.
4073 MipsCCState CCInfo(CallConv, IsVarArg, MF, RVLocs, *DAG.getContext());
4074
4075 // Analyze return values.
4076 CCInfo.AnalyzeReturn(Outs, RetCC_Mips);
4077
4078 SDValue Glue;
4079 SmallVector<SDValue, 4> RetOps(1, Chain);
4080
4081 // Copy the result values into the output registers.
4082 for (unsigned i = 0; i != RVLocs.size(); ++i) {
4083 SDValue Val = OutVals[i];
4084 CCValAssign &VA = RVLocs[i];
4085 assert(VA.isRegLoc() && "Can only return in registers!");
4086 bool UseUpperBits = false;
4087
4088 switch (VA.getLocInfo()) {
4089 default:
4090 llvm_unreachable("Unknown loc info!");
4091 case CCValAssign::Full:
4092 break;
4093 case CCValAssign::BCvt:
4094 Val = DAG.getNode(ISD::BITCAST, DL, VA.getLocVT(), Val);
4095 break;
4097 UseUpperBits = true;
4098 [[fallthrough]];
4099 case CCValAssign::AExt:
4100 Val = DAG.getNode(ISD::ANY_EXTEND, DL, VA.getLocVT(), Val);
4101 break;
4103 UseUpperBits = true;
4104 [[fallthrough]];
4105 case CCValAssign::ZExt:
4106 Val = DAG.getNode(ISD::ZERO_EXTEND, DL, VA.getLocVT(), Val);
4107 break;
4109 UseUpperBits = true;
4110 [[fallthrough]];
4111 case CCValAssign::SExt:
4112 Val = DAG.getNode(ISD::SIGN_EXTEND, DL, VA.getLocVT(), Val);
4113 break;
4114 }
4115
4116 if (UseUpperBits) {
4117 unsigned ValSizeInBits = Outs[i].ArgVT.getSizeInBits();
4118 unsigned LocSizeInBits = VA.getLocVT().getSizeInBits();
4119 Val = DAG.getNode(
4120 ISD::SHL, DL, VA.getLocVT(), Val,
4121 DAG.getConstant(LocSizeInBits - ValSizeInBits, DL, VA.getLocVT()));
4122 }
4123
4124 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), Val, Glue);
4125
4126 // Guarantee that all emitted copies are stuck together with flags.
4127 Glue = Chain.getValue(1);
4128 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
4129 }
4130
4131 // The mips ABIs for returning structs by value requires that we copy
4132 // the sret argument into $v0 for the return. We saved the argument into
4133 // a virtual register in the entry block, so now we copy the value out
4134 // and into $v0.
4135 if (MF.getFunction().hasStructRetAttr()) {
4136 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
4137 unsigned Reg = MipsFI->getSRetReturnReg();
4138
4139 if (!Reg)
4140 llvm_unreachable("sret virtual register not created in the entry block");
4141 SDValue Val =
4142 DAG.getCopyFromReg(Chain, DL, Reg, getPointerTy(DAG.getDataLayout()));
4143 unsigned V0 = ABI.getReturnRegPtr(0);
4144
4145 Chain = DAG.getCopyToReg(Chain, DL, V0, Val, Glue);
4146 Glue = Chain.getValue(1);
4147 RetOps.push_back(DAG.getRegister(V0, getPointerTy(DAG.getDataLayout())));
4148 }
4149
4150 RetOps[0] = Chain; // Update chain.
4151
4152 // Add the glue if we have it.
4153 if (Glue.getNode())
4154 RetOps.push_back(Glue);
4155
4156 // ISRs must use "eret".
4157 if (DAG.getMachineFunction().getFunction().hasFnAttribute("interrupt"))
4158 return LowerInterruptReturn(RetOps, DL, DAG);
4159
4160 // Standard return on Mips is a "jr $ra"
4161 return DAG.getNode(MipsISD::Ret, DL, MVT::Other, RetOps);
4162}
4163
4164//===----------------------------------------------------------------------===//
4165// Mips Inline Assembly Support
4166//===----------------------------------------------------------------------===//
4167
4168/// getConstraintType - Given a constraint letter, return the type of
4169/// constraint it is for this target.
4171MipsTargetLowering::getConstraintType(StringRef Constraint) const {
4172 // Mips specific constraints
4173 // GCC config/mips/constraints.md
4174 //
4175 // 'd' : An address register. Equivalent to r
4176 // unless generating MIPS16 code.
4177 // 'y' : Equivalent to r; retained for
4178 // backwards compatibility.
4179 // 'c' : A register suitable for use in an indirect
4180 // jump. This will always be $25 for -mabicalls.
4181 // 'l' : The lo register. 1 word storage.
4182 // 'x' : The hilo register pair. Double word storage.
4183 if (Constraint.size() == 1) {
4184 switch (Constraint[0]) {
4185 default : break;
4186 case 'd':
4187 case 'y':
4188 case 'f':
4189 case 'c':
4190 case 'l':
4191 case 'x':
4192 return C_RegisterClass;
4193 case 'R':
4194 return C_Memory;
4195 }
4196 }
4197
4198 if (Constraint == "ZC")
4199 return C_Memory;
4200
4201 return TargetLowering::getConstraintType(Constraint);
4202}
4203
4204/// Examine constraint type and operand type and determine a weight value.
4205/// This object must already have been set up with the operand type
4206/// and the current alternative constraint selected.
4208MipsTargetLowering::getSingleConstraintMatchWeight(
4209 AsmOperandInfo &info, const char *constraint) const {
4211 Value *CallOperandVal = info.CallOperandVal;
4212 // If we don't have a value, we can't do a match,
4213 // but allow it at the lowest weight.
4214 if (!CallOperandVal)
4215 return CW_Default;
4216 Type *type = CallOperandVal->getType();
4217 // Look at the constraint type.
4218 switch (*constraint) {
4219 default:
4221 break;
4222 case 'd':
4223 case 'y':
4224 if (type->isIntegerTy())
4225 weight = CW_Register;
4226 break;
4227 case 'f': // FPU or MSA register
4228 if (Subtarget.hasMSA() && type->isVectorTy() &&
4229 type->getPrimitiveSizeInBits().getFixedValue() == 128)
4230 weight = CW_Register;
4231 else if (type->isFloatTy())
4232 weight = CW_Register;
4233 break;
4234 case 'c': // $25 for indirect jumps
4235 case 'l': // lo register
4236 case 'x': // hilo register pair
4237 if (type->isIntegerTy())
4238 weight = CW_SpecificReg;
4239 break;
4240 case 'I': // signed 16 bit immediate
4241 case 'J': // integer zero
4242 case 'K': // unsigned 16 bit immediate
4243 case 'L': // signed 32 bit immediate where lower 16 bits are 0
4244 case 'N': // immediate in the range of -65535 to -1 (inclusive)
4245 case 'O': // signed 15 bit immediate (+- 16383)
4246 case 'P': // immediate in the range of 65535 to 1 (inclusive)
4247 if (isa<ConstantInt>(CallOperandVal))
4248 weight = CW_Constant;
4249 break;
4250 case 'R':
4251 weight = CW_Memory;
4252 break;
4253 }
4254 return weight;
4255}
4256
4257/// This is a helper function to parse a physical register string and split it
4258/// into non-numeric and numeric parts (Prefix and Reg). The first boolean flag
4259/// that is returned indicates whether parsing was successful. The second flag
4260/// is true if the numeric part exists.
4261static std::pair<bool, bool> parsePhysicalReg(StringRef C, StringRef &Prefix,
4262 unsigned long long &Reg) {
4263 if (C.front() != '{' || C.back() != '}')
4264 return std::make_pair(false, false);
4265
4266 // Search for the first numeric character.
4267 StringRef::const_iterator I, B = C.begin() + 1, E = C.end() - 1;
4268 I = std::find_if(B, E, isdigit);
4269
4270 Prefix = StringRef(B, I - B);
4271
4272 // The second flag is set to false if no numeric characters were found.
4273 if (I == E)
4274 return std::make_pair(true, false);
4275
4276 // Parse the numeric characters.
4277 return std::make_pair(!getAsUnsignedInteger(StringRef(I, E - I), 10, Reg),
4278 true);
4279}
4280
4282 ISD::NodeType) const {
4283 bool Cond = !Subtarget.isABI_O32() && VT.getSizeInBits() == 32;
4284 EVT MinVT = getRegisterType(Context, Cond ? MVT::i64 : MVT::i32);
4285 return VT.bitsLT(MinVT) ? MinVT : VT;
4286}
4287
4288std::pair<unsigned, const TargetRegisterClass *> MipsTargetLowering::
4289parseRegForInlineAsmConstraint(StringRef C, MVT VT) const {
4290 const TargetRegisterInfo *TRI =
4292 const TargetRegisterClass *RC;
4293 StringRef Prefix;
4294 unsigned long long Reg;
4295
4296 std::pair<bool, bool> R = parsePhysicalReg(C, Prefix, Reg);
4297
4298 if (!R.first)
4299 return std::make_pair(0U, nullptr);
4300
4301 for (unsigned RegClassID : {Mips::HI32RegClassID, Mips::LO32RegClassID}) {
4303 Prefix, *TRI, RegClassID, Mips::RegAliasName)) {
4304 // No numeric characters follow a hi/lo register name.
4305 if (R.second)
4306 return std::make_pair(0U, nullptr);
4307 return std::make_pair(NamedReg.id(), TRI->getRegClass(RegClassID));
4308 }
4309 }
4310
4311 if (Prefix.starts_with("$msa")) {
4312 // Parse $msa(ir|csr|access|save|modify|request|map|unmap)
4313
4314 // No numeric characters follow the name.
4315 if (R.second)
4316 return std::make_pair(0U, nullptr);
4317
4318 RC = TRI->getRegClass(Mips::MSACtrlRegClassID);
4320 Prefix.drop_front(), *TRI, Mips::MSACtrlRegClassID, Mips::RegAliasName);
4321 if (!Reg)
4322 return std::make_pair(0U, nullptr);
4323
4324 return std::make_pair(Reg, RC);
4325 }
4326
4327 if (!R.second)
4328 return std::make_pair(0U, nullptr);
4329
4330 if (Prefix == "$f") { // Parse $f0-$f31.
4331 // If the targets is single float only, always select 32-bit registers,
4332 // otherwise if the size of FP registers is 64-bit or Reg is an even number,
4333 // select the 64-bit register class. Otherwise, select the 32-bit register
4334 // class.
4335 if (VT == MVT::Other) {
4336 if (Subtarget.isSingleFloat())
4337 VT = MVT::f32;
4338 else
4339 VT = (Subtarget.isFP64bit() || !(Reg % 2)) ? MVT::f64 : MVT::f32;
4340 }
4341
4342 RC = getRegClassFor(VT);
4343
4344 if (RC == &Mips::AFGR64RegClass) {
4345 assert(Reg % 2 == 0);
4346 Reg >>= 1;
4347 }
4348 } else if (Prefix == "$fcc") // Parse $fcc0-$fcc7.
4349 RC = TRI->getRegClass(Mips::FCCRegClassID);
4350 else if (Prefix == "$w") { // Parse $w0-$w31.
4351 RC = getRegClassFor((VT == MVT::Other) ? MVT::v16i8 : VT);
4352 } else { // Parse $0-$31.
4353 assert(Prefix == "$");
4354 RC = getRegClassFor((VT == MVT::Other) ? MVT::i32 : VT);
4355 }
4356
4357 assert(Reg < RC->getNumRegs());
4358 return std::make_pair(*(RC->begin() + Reg), RC);
4359}
4360
4361/// Given a register class constraint, like 'r', if this corresponds directly
4362/// to an LLVM register class, return a register of 0 and the register class
4363/// pointer.
4364std::pair<unsigned, const TargetRegisterClass *>
4365MipsTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
4366 StringRef Constraint,
4367 MVT VT) const {
4368 if (Constraint.size() == 1) {
4369 switch (Constraint[0]) {
4370 case 'd': // Address register. Same as 'r' unless generating MIPS16 code.
4371 case 'y': // Same as 'r'. Exists for compatibility.
4372 case 'r':
4373 if ((VT == MVT::i32 || VT == MVT::i16 || VT == MVT::i8 ||
4374 VT == MVT::i1) ||
4375 (VT == MVT::f32 && Subtarget.useSoftFloat())) {
4376 if (Subtarget.inMips16Mode())
4377 return std::make_pair(0U, &Mips::CPU16RegsRegClass);
4378 return std::make_pair(0U, &Mips::GPR32RegClass);
4379 }
4380 if ((VT == MVT::i64 || (VT == MVT::f64 && Subtarget.useSoftFloat()) ||
4381 (VT == MVT::f64 && Subtarget.isSingleFloat())) &&
4382 !Subtarget.isGP64bit())
4383 return std::make_pair(0U, &Mips::GPR32RegClass);
4384 if ((VT == MVT::i64 || (VT == MVT::f64 && Subtarget.useSoftFloat()) ||
4385 (VT == MVT::f64 && Subtarget.isSingleFloat())) &&
4386 Subtarget.isGP64bit())
4387 return std::make_pair(0U, &Mips::GPR64RegClass);
4388 // This will generate an error message
4389 return std::make_pair(0U, nullptr);
4390 case 'f': // FPU or MSA register
4391 if (VT == MVT::v16i8)
4392 return std::make_pair(0U, &Mips::MSA128BRegClass);
4393 else if (VT == MVT::v8i16 || VT == MVT::v8f16)
4394 return std::make_pair(0U, &Mips::MSA128HRegClass);
4395 else if (VT == MVT::v4i32 || VT == MVT::v4f32)
4396 return std::make_pair(0U, &Mips::MSA128WRegClass);
4397 else if (VT == MVT::v2i64 || VT == MVT::v2f64)
4398 return std::make_pair(0U, &Mips::MSA128DRegClass);
4399 else if (VT == MVT::f32)
4400 return std::make_pair(0U, &Mips::FGR32RegClass);
4401 else if ((VT == MVT::f64) && (!Subtarget.isSingleFloat())) {
4402 if (Subtarget.isFP64bit())
4403 return std::make_pair(0U, &Mips::FGR64RegClass);
4404 return std::make_pair(0U, &Mips::AFGR64RegClass);
4405 }
4406 break;
4407 case 'c': // register suitable for indirect jump
4408 if (VT == MVT::i32)
4409 return std::make_pair(ABI.getTempReg(9, false).id(),
4410 &Mips::GPR32RegClass);
4411 if (VT == MVT::i64)
4412 return std::make_pair(ABI.getTempReg(9, true).id(),
4413 &Mips::GPR64RegClass);
4414 // This will generate an error message
4415 return std::make_pair(0U, nullptr);
4416 case 'l': // use the `lo` register to store values
4417 // that are no bigger than a word
4418 if (VT == MVT::i32 || VT == MVT::i16 || VT == MVT::i8)
4419 return std::make_pair((unsigned)Mips::LO0, &Mips::LO32RegClass);
4420 return std::make_pair((unsigned)Mips::LO0_64, &Mips::LO64RegClass);
4421 case 'x': // use the concatenated `hi` and `lo` registers
4422 // to store doubleword values
4423 // Fixme: Not triggering the use of both hi and low
4424 // This will generate an error message
4425 return std::make_pair(0U, nullptr);
4426 }
4427 }
4428
4429 if (!Constraint.empty()) {
4430 std::pair<unsigned, const TargetRegisterClass *> R;
4431 R = parseRegForInlineAsmConstraint(Constraint, VT);
4432
4433 if (R.second)
4434 return R;
4435 }
4436
4437 return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
4438}
4439
4440/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
4441/// vector. If it is invalid, don't add anything to Ops.
4442void MipsTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
4443 StringRef Constraint,
4444 std::vector<SDValue> &Ops,
4445 SelectionDAG &DAG) const {
4446 SDLoc DL(Op);
4447 SDValue Result;
4448
4449 // Only support length 1 constraints for now.
4450 if (Constraint.size() > 1)
4451 return;
4452
4453 char ConstraintLetter = Constraint[0];
4454 switch (ConstraintLetter) {
4455 default: break; // This will fall through to the generic implementation
4456 case 'I': // Signed 16 bit constant
4457 // If this fails, the parent routine will give an error
4458 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
4459 EVT Type = Op.getValueType();
4460 int64_t Val = C->getSExtValue();
4461 if (isInt<16>(Val)) {
4463 break;
4464 }
4465 }
4466 return;
4467 case 'J': // integer zero
4468 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
4469 EVT Type = Op.getValueType();
4470 int64_t Val = C->getZExtValue();
4471 if (Val == 0) {
4472 Result = DAG.getTargetConstant(0, DL, Type);
4473 break;
4474 }
4475 }
4476 return;
4477 case 'K': // unsigned 16 bit immediate
4478 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
4479 EVT Type = Op.getValueType();
4480 uint64_t Val = C->getZExtValue();
4481 if (isUInt<16>(Val)) {
4482 Result = DAG.getTargetConstant(Val, DL, Type);
4483 break;
4484 }
4485 }
4486 return;
4487 case 'L': // signed 32 bit immediate where lower 16 bits are 0
4488 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
4489 EVT Type = Op.getValueType();
4490 int64_t Val = C->getSExtValue();
4491 if ((isInt<32>(Val)) && ((Val & 0xffff) == 0)){
4493 break;
4494 }
4495 }
4496 return;
4497 case 'N': // immediate in the range of -65535 to -1 (inclusive)
4498 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
4499 EVT Type = Op.getValueType();
4500 int64_t Val = C->getSExtValue();
4501 if ((Val >= -65535) && (Val <= -1)) {
4503 break;
4504 }
4505 }
4506 return;
4507 case 'O': // signed 15 bit immediate
4508 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
4509 EVT Type = Op.getValueType();
4510 int64_t Val = C->getSExtValue();
4511 if ((isInt<15>(Val))) {
4513 break;
4514 }
4515 }
4516 return;
4517 case 'P': // immediate in the range of 1 to 65535 (inclusive)
4518 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
4519 EVT Type = Op.getValueType();
4520 int64_t Val = C->getSExtValue();
4521 if ((Val <= 65535) && (Val >= 1)) {
4522 Result = DAG.getTargetConstant(Val, DL, Type);
4523 break;
4524 }
4525 }
4526 return;
4527 }
4528
4529 if (Result.getNode()) {
4530 Ops.push_back(Result);
4531 return;
4532 }
4533
4535}
4536
4537bool MipsTargetLowering::isLegalAddressingMode(const DataLayout &DL,
4538 const AddrMode &AM, Type *Ty,
4539 unsigned AS,
4540 Instruction *I) const {
4541 // No global is ever allowed as a base.
4542 if (AM.BaseGV)
4543 return false;
4544
4545 switch (AM.Scale) {
4546 case 0: // "r+i" or just "i", depending on HasBaseReg.
4547 break;
4548 case 1:
4549 if (!AM.HasBaseReg) // allow "r+i".
4550 break;
4551 return false; // disallow "r+r" or "r+r+i".
4552 default:
4553 return false;
4554 }
4555
4556 return true;
4557}
4558
4559bool
4560MipsTargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
4561 // The Mips target isn't yet aware of offsets.
4562 return false;
4563}
4564
4565EVT MipsTargetLowering::getOptimalMemOpType(
4566 LLVMContext &Context, const MemOp &Op,
4567 const AttributeList &FuncAttributes) const {
4568 if (Subtarget.hasMips64())
4569 return MVT::i64;
4570
4571 return MVT::i32;
4572}
4573
4574bool MipsTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
4575 bool ForCodeSize) const {
4576 if (VT != MVT::f32 && VT != MVT::f64)
4577 return false;
4578 if (Imm.isNegZero())
4579 return false;
4580 return Imm.isZero();
4581}
4582
4583bool MipsTargetLowering::isLegalICmpImmediate(int64_t Imm) const {
4584 return isInt<16>(Imm);
4585}
4586
4587bool MipsTargetLowering::isLegalAddImmediate(int64_t Imm) const {
4588 return isInt<16>(Imm);
4589}
4590
4592 if (!isPositionIndependent())
4594 if (ABI.IsN64())
4597}
4598
4599SDValue MipsTargetLowering::getPICJumpTableRelocBase(SDValue Table,
4600 SelectionDAG &DAG) const {
4601 if (!isPositionIndependent())
4602 return Table;
4604}
4605
4607 return Subtarget.useSoftFloat();
4608}
4609
4610void MipsTargetLowering::copyByValRegs(
4611 SDValue Chain, const SDLoc &DL, std::vector<SDValue> &OutChains,
4612 SelectionDAG &DAG, const ISD::ArgFlagsTy &Flags,
4613 SmallVectorImpl<SDValue> &InVals, const Argument *FuncArg,
4614 unsigned FirstReg, unsigned LastReg, const CCValAssign &VA,
4615 MipsCCState &State) const {
4617 MachineFrameInfo &MFI = MF.getFrameInfo();
4618 unsigned GPRSizeInBytes = Subtarget.getGPRSizeInBytes();
4619 unsigned NumRegs = LastReg - FirstReg;
4620 unsigned RegAreaSize = NumRegs * GPRSizeInBytes;
4621 unsigned FrameObjSize = std::max(Flags.getByValSize(), RegAreaSize);
4622 int FrameObjOffset;
4623 ArrayRef<MCPhysReg> ByValArgRegs = ABI.GetByValArgRegs();
4624
4625 if (RegAreaSize)
4626 FrameObjOffset =
4627 (int)ABI.GetCalleeAllocdArgSizeInBytes(State.getCallingConv()) -
4628 (int)((ByValArgRegs.size() - FirstReg) * GPRSizeInBytes);
4629 else
4630 FrameObjOffset = VA.getLocMemOffset();
4631
4632 // Create frame object.
4633 EVT PtrTy = getPointerTy(DAG.getDataLayout());
4634 // Make the fixed object stored to mutable so that the load instructions
4635 // referencing it have their memory dependencies added.
4636 // Set the frame object as isAliased which clears the underlying objects
4637 // vector in ScheduleDAGInstrs::buildSchedGraph() resulting in addition of all
4638 // stores as dependencies for loads referencing this fixed object.
4639 int FI = MFI.CreateFixedObject(FrameObjSize, FrameObjOffset, false, true);
4640 SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
4641 InVals.push_back(FIN);
4642
4643 if (!NumRegs)
4644 return;
4645
4646 // Copy arg registers.
4647 MVT RegTy = MVT::getIntegerVT(GPRSizeInBytes * 8);
4648 const TargetRegisterClass *RC = getRegClassFor(RegTy);
4649
4650 for (unsigned I = 0; I < NumRegs; ++I) {
4651 unsigned ArgReg = ByValArgRegs[FirstReg + I];
4652 unsigned VReg = addLiveIn(MF, ArgReg, RC);
4653 unsigned Offset = I * GPRSizeInBytes;
4654 SDValue StorePtr = DAG.getNode(ISD::ADD, DL, PtrTy, FIN,
4655 DAG.getConstant(Offset, DL, PtrTy));
4656 SDValue Store = DAG.getStore(Chain, DL, DAG.getRegister(VReg, RegTy),
4657 StorePtr, MachinePointerInfo(FuncArg, Offset));
4658 OutChains.push_back(Store);
4659 }
4660}
4661
4662// Copy byVal arg to registers and stack.
4663void MipsTargetLowering::passByValArg(
4664 SDValue Chain, const SDLoc &DL,
4665 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
4666 SmallVectorImpl<SDValue> &MemOpChains, SDValue StackPtr,
4667 MachineFrameInfo &MFI, SelectionDAG &DAG, SDValue Arg, unsigned FirstReg,
4668 unsigned LastReg, const ISD::ArgFlagsTy &Flags, bool isLittle,
4669 const CCValAssign &VA) const {
4670 unsigned ByValSizeInBytes = Flags.getByValSize();
4671 unsigned OffsetInBytes = 0; // From beginning of struct
4672 unsigned RegSizeInBytes = Subtarget.getGPRSizeInBytes();
4674 std::min(Flags.getNonZeroByValAlign(), Align(RegSizeInBytes));
4675 EVT PtrTy = getPointerTy(DAG.getDataLayout()),
4676 RegTy = MVT::getIntegerVT(RegSizeInBytes * 8);
4677 unsigned NumRegs = LastReg - FirstReg;
4678
4679 if (NumRegs) {
4680 ArrayRef<MCPhysReg> ArgRegs = ABI.GetByValArgRegs();
4681 bool LeftoverBytes = (NumRegs * RegSizeInBytes > ByValSizeInBytes);
4682 unsigned I = 0;
4683
4684 // Copy words to registers.
4685 for (; I < NumRegs - LeftoverBytes; ++I, OffsetInBytes += RegSizeInBytes) {
4686 SDValue LoadPtr = DAG.getNode(ISD::ADD, DL, PtrTy, Arg,
4687 DAG.getConstant(OffsetInBytes, DL, PtrTy));
4688 SDValue LoadVal = DAG.getLoad(RegTy, DL, Chain, LoadPtr,
4689 MachinePointerInfo(), Alignment);
4690 MemOpChains.push_back(LoadVal.getValue(1));
4691 unsigned ArgReg = ArgRegs[FirstReg + I];
4692 RegsToPass.push_back(std::make_pair(ArgReg, LoadVal));
4693 }
4694
4695 // Return if the struct has been fully copied.
4696 if (ByValSizeInBytes == OffsetInBytes)
4697 return;
4698
4699 // Copy the remainder of the byval argument with sub-word loads and shifts.
4700 if (LeftoverBytes) {
4701 SDValue Val;
4702
4703 for (unsigned LoadSizeInBytes = RegSizeInBytes / 2, TotalBytesLoaded = 0;
4704 OffsetInBytes < ByValSizeInBytes; LoadSizeInBytes /= 2) {
4705 unsigned RemainingSizeInBytes = ByValSizeInBytes - OffsetInBytes;
4706
4707 if (RemainingSizeInBytes < LoadSizeInBytes)
4708 continue;
4709
4710 // Load subword.
4711 SDValue LoadPtr = DAG.getNode(ISD::ADD, DL, PtrTy, Arg,
4712 DAG.getConstant(OffsetInBytes, DL,
4713 PtrTy));
4714 SDValue LoadVal = DAG.getExtLoad(
4715 ISD::ZEXTLOAD, DL, RegTy, Chain, LoadPtr, MachinePointerInfo(),
4716 MVT::getIntegerVT(LoadSizeInBytes * 8), Alignment);
4717 MemOpChains.push_back(LoadVal.getValue(1));
4718
4719 // Shift the loaded value.
4720 unsigned Shamt;
4721
4722 if (isLittle)
4723 Shamt = TotalBytesLoaded * 8;
4724 else
4725 Shamt = (RegSizeInBytes - (TotalBytesLoaded + LoadSizeInBytes)) * 8;
4726
4727 SDValue Shift = DAG.getNode(ISD::SHL, DL, RegTy, LoadVal,
4728 DAG.getConstant(Shamt, DL, MVT::i32));
4729
4730 if (Val.getNode())
4731 Val = DAG.getNode(ISD::OR, DL, RegTy, Val, Shift);
4732 else
4733 Val = Shift;
4734
4735 OffsetInBytes += LoadSizeInBytes;
4736 TotalBytesLoaded += LoadSizeInBytes;
4737 Alignment = std::min(Alignment, Align(LoadSizeInBytes));
4738 }
4739
4740 unsigned ArgReg = ArgRegs[FirstReg + I];
4741 RegsToPass.push_back(std::make_pair(ArgReg, Val));
4742 return;
4743 }
4744 }
4745
4746 // Copy remainder of byval arg to it with memcpy.
4747 unsigned MemCpySize = ByValSizeInBytes - OffsetInBytes;
4748 SDValue Src = DAG.getNode(ISD::ADD, DL, PtrTy, Arg,
4749 DAG.getConstant(OffsetInBytes, DL, PtrTy));
4750 SDValue Dst = DAG.getNode(ISD::ADD, DL, PtrTy, StackPtr,
4752 Chain = DAG.getMemcpy(
4753 Chain, DL, Dst, Src, DAG.getConstant(MemCpySize, DL, PtrTy), Alignment,
4754 Alignment, /*isVolatile=*/false, /*AlwaysInline=*/false,
4755 /*CI=*/nullptr, std::nullopt, MachinePointerInfo(), MachinePointerInfo());
4756 MemOpChains.push_back(Chain);
4757}
4758
4759void MipsTargetLowering::writeVarArgRegs(std::vector<SDValue> &OutChains,
4760 SDValue Chain, const SDLoc &DL,
4761 SelectionDAG &DAG,
4762 CCState &State) const {
4763 ArrayRef<MCPhysReg> ArgRegs = ABI.getVarArgRegs(Subtarget.isGP64bit());
4764 unsigned Idx = State.getFirstUnallocated(ArgRegs);
4765 unsigned RegSizeInBytes = Subtarget.getGPRSizeInBytes();
4766 MVT RegTy = MVT::getIntegerVT(RegSizeInBytes * 8);
4767 const TargetRegisterClass *RC = getRegClassFor(RegTy);
4769 MachineFrameInfo &MFI = MF.getFrameInfo();
4770 MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
4771
4772 // Offset of the first variable argument from stack pointer.
4773 int VaArgOffset;
4774
4775 if (ArgRegs.size() == Idx)
4776 VaArgOffset = alignTo(State.getStackSize(), RegSizeInBytes);
4777 else {
4778 VaArgOffset =
4779 (int)ABI.GetCalleeAllocdArgSizeInBytes(State.getCallingConv()) -
4780 (int)(RegSizeInBytes * (ArgRegs.size() - Idx));
4781 }
4782
4783 // Record the frame index of the first variable argument
4784 // which is a value necessary to VASTART.
4785 int FI = MFI.CreateFixedObject(RegSizeInBytes, VaArgOffset, true);
4786 MipsFI->setVarArgsFrameIndex(FI);
4787
4788 // Copy the integer registers that have not been used for argument passing
4789 // to the argument register save area. For O32, the save area is allocated
4790 // in the caller's stack frame, while for N32/64, it is allocated in the
4791 // callee's stack frame.
4792 for (unsigned I = Idx; I < ArgRegs.size();
4793 ++I, VaArgOffset += RegSizeInBytes) {
4794 unsigned Reg = addLiveIn(MF, ArgRegs[I], RC);
4795 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegTy);
4796 FI = MFI.CreateFixedObject(RegSizeInBytes, VaArgOffset, true);
4797 SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
4798 SDValue Store =
4799 DAG.getStore(Chain, DL, ArgValue, PtrOff, MachinePointerInfo());
4800 cast<StoreSDNode>(Store.getNode())->getMemOperand()->setValue(
4801 (Value *)nullptr);
4802 OutChains.push_back(Store);
4803 }
4804}
4805
4807 Align Alignment) const {
4808 const TargetFrameLowering *TFL = Subtarget.getFrameLowering();
4809
4810 assert(Size && "Byval argument's size shouldn't be 0.");
4811
4812 Alignment = std::min(Alignment, TFL->getStackAlign());
4813
4814 unsigned FirstReg = 0;
4815 unsigned NumRegs = 0;
4816
4817 if (State->getCallingConv() != CallingConv::Fast) {
4818 unsigned RegSizeInBytes = Subtarget.getGPRSizeInBytes();
4819 ArrayRef<MCPhysReg> IntArgRegs = ABI.GetByValArgRegs();
4820 // FIXME: The O32 case actually describes no shadow registers.
4821 const MCPhysReg *ShadowRegs =
4822 ABI.IsO32() ? IntArgRegs.data() : Mips64DPRegs;
4823
4824 // We used to check the size as well but we can't do that anymore since
4825 // CCState::HandleByVal() rounds up the size after calling this function.
4826 assert(
4827 Alignment >= Align(RegSizeInBytes) &&
4828 "Byval argument's alignment should be a multiple of RegSizeInBytes.");
4829
4830 FirstReg = State->getFirstUnallocated(IntArgRegs);
4831
4832 // If Alignment > RegSizeInBytes, the first arg register must be even.
4833 // FIXME: This condition happens to do the right thing but it's not the
4834 // right way to test it. We want to check that the stack frame offset
4835 // of the register is aligned.
4836 if ((Alignment > RegSizeInBytes) && (FirstReg % 2)) {
4837 State->AllocateReg(IntArgRegs[FirstReg], ShadowRegs[FirstReg]);
4838 ++FirstReg;
4839 }
4840
4841 // Mark the registers allocated.
4842 Size = alignTo(Size, RegSizeInBytes);
4843 for (unsigned I = FirstReg; Size > 0 && (I < IntArgRegs.size());
4844 Size -= RegSizeInBytes, ++I, ++NumRegs)
4845 State->AllocateReg(IntArgRegs[I], ShadowRegs[I]);
4846 }
4847
4848 State->addInRegsParamInfo(FirstReg, FirstReg + NumRegs);
4849}
4850
4851MachineBasicBlock *MipsTargetLowering::emitPseudoSELECT(MachineInstr &MI,
4853 bool isFPCmp,
4854 unsigned Opc) const {
4856 "Subtarget already supports SELECT nodes with the use of"
4857 "conditional-move instructions.");
4858
4859 const TargetInstrInfo *TII =
4861 DebugLoc DL = MI.getDebugLoc();
4862
4863 // To "insert" a SELECT instruction, we actually have to insert the
4864 // diamond control-flow pattern. The incoming instruction knows the
4865 // destination vreg to set, the condition code register to branch on, the
4866 // true/false values to select between, and a branch opcode to use.
4867 const BasicBlock *LLVM_BB = BB->getBasicBlock();
4869
4870 // thisMBB:
4871 // ...
4872 // TrueVal = ...
4873 // setcc r1, r2, r3
4874 // bNE r1, r0, copy1MBB
4875 // fallthrough --> copy0MBB
4876 MachineBasicBlock *thisMBB = BB;
4877 MachineFunction *F = BB->getParent();
4878 MachineBasicBlock *copy0MBB = F->CreateMachineBasicBlock(LLVM_BB);
4879 MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB);
4880 F->insert(It, copy0MBB);
4881 F->insert(It, sinkMBB);
4882
4883 // Transfer the remainder of BB and its successor edges to sinkMBB.
4884 sinkMBB->splice(sinkMBB->begin(), BB,
4885 std::next(MachineBasicBlock::iterator(MI)), BB->end());
4887
4888 // Next, add the true and fallthrough blocks as its successors.
4889 BB->addSuccessor(copy0MBB);
4890 BB->addSuccessor(sinkMBB);
4891
4892 if (isFPCmp) {
4893 // bc1[tf] cc, sinkMBB
4894 BuildMI(BB, DL, TII->get(Opc))
4895 .addReg(MI.getOperand(1).getReg())
4896 .addMBB(sinkMBB);
4897 } else {
4898 // bne rs, $0, sinkMBB
4899 BuildMI(BB, DL, TII->get(Opc))
4900 .addReg(MI.getOperand(1).getReg())
4901 .addReg(Mips::R0)
4902 .addMBB(sinkMBB);
4903 }
4904
4905 // copy0MBB:
4906 // %FalseValue = ...
4907 // # fallthrough to sinkMBB
4908 BB = copy0MBB;
4909
4910 // Update machine-CFG edges
4911 BB->addSuccessor(sinkMBB);
4912
4913 // sinkMBB:
4914 // %Result = phi [ %TrueValue, thisMBB ], [ %FalseValue, copy0MBB ]
4915 // ...
4916 BB = sinkMBB;
4917
4918 BuildMI(*BB, BB->begin(), DL, TII->get(Mips::PHI), MI.getOperand(0).getReg())
4919 .addReg(MI.getOperand(2).getReg())
4920 .addMBB(thisMBB)
4921 .addReg(MI.getOperand(3).getReg())
4922 .addMBB(copy0MBB);
4923
4924 MI.eraseFromParent(); // The pseudo instruction is gone now.
4925
4926 return BB;
4927}
4928
4930MipsTargetLowering::emitPseudoD_SELECT(MachineInstr &MI,
4931 MachineBasicBlock *BB) const {
4932 assert(!(Subtarget.hasMips4() || Subtarget.hasMips32()) &&
4933 "Subtarget already supports SELECT nodes with the use of"
4934 "conditional-move instructions.");
4935
4936 const TargetInstrInfo *TII = Subtarget.getInstrInfo();
4937 DebugLoc DL = MI.getDebugLoc();
4938
4939 // D_SELECT substitutes two SELECT nodes that goes one after another and
4940 // have the same condition operand. On machines which don't have
4941 // conditional-move instruction, it reduces unnecessary branch instructions
4942 // which are result of using two diamond patterns that are result of two
4943 // SELECT pseudo instructions.
4944 const BasicBlock *LLVM_BB = BB->getBasicBlock();
4946
4947 // thisMBB:
4948 // ...
4949 // TrueVal = ...
4950 // setcc r1, r2, r3
4951 // bNE r1, r0, copy1MBB
4952 // fallthrough --> copy0MBB
4953 MachineBasicBlock *thisMBB = BB;
4954 MachineFunction *F = BB->getParent();
4955 MachineBasicBlock *copy0MBB = F->CreateMachineBasicBlock(LLVM_BB);
4956 MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB);
4957 F->insert(It, copy0MBB);
4958 F->insert(It, sinkMBB);
4959
4960 // Transfer the remainder of BB and its successor edges to sinkMBB.
4961 sinkMBB->splice(sinkMBB->begin(), BB,
4962 std::next(MachineBasicBlock::iterator(MI)), BB->end());
4964
4965 // Next, add the true and fallthrough blocks as its successors.
4966 BB->addSuccessor(copy0MBB);
4967 BB->addSuccessor(sinkMBB);
4968
4969 // bne rs, $0, sinkMBB
4970 BuildMI(BB, DL, TII->get(Mips::BNE))
4971 .addReg(MI.getOperand(2).getReg())
4972 .addReg(Mips::R0)
4973 .addMBB(sinkMBB);
4974
4975 // copy0MBB:
4976 // %FalseValue = ...
4977 // # fallthrough to sinkMBB
4978 BB = copy0MBB;
4979
4980 // Update machine-CFG edges
4981 BB->addSuccessor(sinkMBB);
4982
4983 // sinkMBB:
4984 // %Result = phi [ %TrueValue, thisMBB ], [ %FalseValue, copy0MBB ]
4985 // ...
4986 BB = sinkMBB;
4987
4988 // Use two PHI nodes to select two reults
4989 BuildMI(*BB, BB->begin(), DL, TII->get(Mips::PHI), MI.getOperand(0).getReg())
4990 .addReg(MI.getOperand(3).getReg())
4991 .addMBB(thisMBB)
4992 .addReg(MI.getOperand(5).getReg())
4993 .addMBB(copy0MBB);
4994 BuildMI(*BB, BB->begin(), DL, TII->get(Mips::PHI), MI.getOperand(1).getReg())
4995 .addReg(MI.getOperand(4).getReg())
4996 .addMBB(thisMBB)
4997 .addReg(MI.getOperand(6).getReg())
4998 .addMBB(copy0MBB);
4999
5000 MI.eraseFromParent(); // The pseudo instruction is gone now.
5001
5002 return BB;
5003}
5004
5007 const MachineFunction &MF) const {
5008 StringRef Name(RegName);
5009 Name.consume_front("$");
5010
5011 unsigned RegIdx;
5012 if (Name.getAsInteger(10, RegIdx)) {
5013 std::string LowerName = Name.lower();
5014 const MCRegisterInfo &MRI = *MF.getContext().getRegisterInfo();
5015 int Index =
5016 MIPS_MC::getCPURegisterIndex(LowerName, MRI, ABI.getRegAltNameIndex());
5017 if (Index < 0)
5019 Twine("Invalid register name \"" + StringRef(RegName) + "\"."));
5020 RegIdx = Index;
5021 }
5022
5023 if (RegIdx < 32) {
5024 const MCRegisterInfo *MRI = MF.getContext().getRegisterInfo();
5025 unsigned RegClassID = Mips::GPR32RegClassID;
5026 if (VT.isValid()) {
5027 if (VT.getSizeInBits() == 64) {
5028 if (!Subtarget.isGP64bit())
5029 report_fatal_error("64-bit registers not supported on 32-bit target");
5030 RegClassID = Mips::GPR64RegClassID;
5031 } else if (VT.getSizeInBits() == 32) {
5032 RegClassID = Mips::GPR32RegClassID;
5033 } else {
5034 report_fatal_error(Twine("Invalid register \"" + StringRef(RegName) +
5035 "\" for " + Twine(VT.getSizeInBits()) +
5036 "-bit type."));
5037 }
5038 } else if (Subtarget.isGP64bit()) {
5039 RegClassID = Mips::GPR64RegClassID;
5040 }
5041 const MCRegisterClass &RC = MRI->getRegClass(RegClassID);
5042 Register Reg = RC.getRegister(RegIdx);
5043 BitVector ReservedRegs = Subtarget.getRegisterInfo()->getReservedRegs(MF);
5044 if (!ReservedRegs.test(Reg))
5045 reportFatalUsageError(Twine("Trying to obtain non-reserved register \"" +
5046 StringRef(RegName) + "\"."));
5047 return Reg;
5048 }
5049
5051 Twine("Invalid register name \"" + StringRef(RegName) + "\"."));
5052}
5053
5054MachineBasicBlock *MipsTargetLowering::emitLDR_W(MachineInstr &MI,
5055 MachineBasicBlock *BB) const {
5056 MachineFunction *MF = BB->getParent();
5057 MachineRegisterInfo &MRI = MF->getRegInfo();
5059 const bool IsLittle = Subtarget.isLittle();
5060 DebugLoc DL = MI.getDebugLoc();
5061
5062 Register Dest = MI.getOperand(0).getReg();
5063 Register Address = MI.getOperand(1).getReg();
5064 unsigned Imm = MI.getOperand(2).getImm();
5065
5067
5069 // Mips release 6 can load from adress that is not naturally-aligned.
5070 Register Temp = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5071 BuildMI(*BB, I, DL, TII->get(Mips::LW))
5072 .addDef(Temp)
5073 .addUse(Address)
5074 .addImm(Imm);
5075 BuildMI(*BB, I, DL, TII->get(Mips::FILL_W)).addDef(Dest).addUse(Temp);
5076 } else {
5077 // Mips release 5 needs to use instructions that can load from an unaligned
5078 // memory address.
5079 Register LoadHalf = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5080 Register LoadFull = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5081 Register Undef = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5082 BuildMI(*BB, I, DL, TII->get(Mips::IMPLICIT_DEF)).addDef(Undef);
5083 BuildMI(*BB, I, DL, TII->get(Mips::LWR))
5084 .addDef(LoadHalf)
5085 .addUse(Address)
5086 .addImm(Imm + (IsLittle ? 0 : 3))
5087 .addUse(Undef);
5088 BuildMI(*BB, I, DL, TII->get(Mips::LWL))
5089 .addDef(LoadFull)
5090 .addUse(Address)
5091 .addImm(Imm + (IsLittle ? 3 : 0))
5092 .addUse(LoadHalf);
5093 BuildMI(*BB, I, DL, TII->get(Mips::FILL_W)).addDef(Dest).addUse(LoadFull);
5094 }
5095
5096 MI.eraseFromParent();
5097 return BB;
5098}
5099
5100MachineBasicBlock *MipsTargetLowering::emitLDR_D(MachineInstr &MI,
5101 MachineBasicBlock *BB) const {
5102 MachineFunction *MF = BB->getParent();
5103 MachineRegisterInfo &MRI = MF->getRegInfo();
5104 const TargetInstrInfo *TII = Subtarget.getInstrInfo();
5105 const bool IsLittle = Subtarget.isLittle();
5106 DebugLoc DL = MI.getDebugLoc();
5107
5108 Register Dest = MI.getOperand(0).getReg();
5109 Register Address = MI.getOperand(1).getReg();
5110 unsigned Imm = MI.getOperand(2).getImm();
5111
5113
5114 if (Subtarget.hasMips32r6() || Subtarget.hasMips64r6()) {
5115 // Mips release 6 can load from adress that is not naturally-aligned.
5116 if (Subtarget.isGP64bit()) {
5117 Register Temp = MRI.createVirtualRegister(&Mips::GPR64RegClass);
5118 BuildMI(*BB, I, DL, TII->get(Mips::LD))
5119 .addDef(Temp)
5120 .addUse(Address)
5121 .addImm(Imm);
5122 BuildMI(*BB, I, DL, TII->get(Mips::FILL_D)).addDef(Dest).addUse(Temp);
5123 } else {
5124 Register Wtemp = MRI.createVirtualRegister(&Mips::MSA128WRegClass);
5125 Register Lo = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5126 Register Hi = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5127 BuildMI(*BB, I, DL, TII->get(Mips::LW))
5128 .addDef(Lo)
5129 .addUse(Address)
5130 .addImm(Imm + (IsLittle ? 0 : 4));
5131 BuildMI(*BB, I, DL, TII->get(Mips::LW))
5132 .addDef(Hi)
5133 .addUse(Address)
5134 .addImm(Imm + (IsLittle ? 4 : 0));
5135 BuildMI(*BB, I, DL, TII->get(Mips::FILL_W)).addDef(Wtemp).addUse(Lo);
5136 BuildMI(*BB, I, DL, TII->get(Mips::INSERT_W), Dest)
5137 .addUse(Wtemp)
5138 .addUse(Hi)
5139 .addImm(1);
5140 }
5141 } else {
5142 // Mips release 5 needs to use instructions that can load from an unaligned
5143 // memory address.
5144 Register LoHalf = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5145 Register LoFull = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5146 Register LoUndef = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5147 Register HiHalf = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5148 Register HiFull = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5149 Register HiUndef = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5150 Register Wtemp = MRI.createVirtualRegister(&Mips::MSA128WRegClass);
5151 BuildMI(*BB, I, DL, TII->get(Mips::IMPLICIT_DEF)).addDef(LoUndef);
5152 BuildMI(*BB, I, DL, TII->get(Mips::LWR))
5153 .addDef(LoHalf)
5154 .addUse(Address)
5155 .addImm(Imm + (IsLittle ? 0 : 7))
5156 .addUse(LoUndef);
5157 BuildMI(*BB, I, DL, TII->get(Mips::LWL))
5158 .addDef(LoFull)
5159 .addUse(Address)
5160 .addImm(Imm + (IsLittle ? 3 : 4))
5161 .addUse(LoHalf);
5162 BuildMI(*BB, I, DL, TII->get(Mips::IMPLICIT_DEF)).addDef(HiUndef);
5163 BuildMI(*BB, I, DL, TII->get(Mips::LWR))
5164 .addDef(HiHalf)
5165 .addUse(Address)
5166 .addImm(Imm + (IsLittle ? 4 : 3))
5167 .addUse(HiUndef);
5168 BuildMI(*BB, I, DL, TII->get(Mips::LWL))
5169 .addDef(HiFull)
5170 .addUse(Address)
5171 .addImm(Imm + (IsLittle ? 7 : 0))
5172 .addUse(HiHalf);
5173 BuildMI(*BB, I, DL, TII->get(Mips::FILL_W)).addDef(Wtemp).addUse(LoFull);
5174 BuildMI(*BB, I, DL, TII->get(Mips::INSERT_W), Dest)
5175 .addUse(Wtemp)
5176 .addUse(HiFull)
5177 .addImm(1);
5178 }
5179
5180 MI.eraseFromParent();
5181 return BB;
5182}
5183
5184MachineBasicBlock *MipsTargetLowering::emitSTR_W(MachineInstr &MI,
5185 MachineBasicBlock *BB) const {
5186 MachineFunction *MF = BB->getParent();
5187 MachineRegisterInfo &MRI = MF->getRegInfo();
5188 const TargetInstrInfo *TII = Subtarget.getInstrInfo();
5189 const bool IsLittle = Subtarget.isLittle();
5190 DebugLoc DL = MI.getDebugLoc();
5191
5192 Register StoreVal = MI.getOperand(0).getReg();
5193 Register Address = MI.getOperand(1).getReg();
5194 unsigned Imm = MI.getOperand(2).getImm();
5195
5197
5198 if (Subtarget.hasMips32r6() || Subtarget.hasMips64r6()) {
5199 // Mips release 6 can store to adress that is not naturally-aligned.
5200 Register BitcastW = MRI.createVirtualRegister(&Mips::MSA128WRegClass);
5201 Register Tmp = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5202 BuildMI(*BB, I, DL, TII->get(Mips::COPY)).addDef(BitcastW).addUse(StoreVal);
5203 BuildMI(*BB, I, DL, TII->get(Mips::COPY_S_W))
5204 .addDef(Tmp)
5205 .addUse(BitcastW)
5206 .addImm(0);
5207 BuildMI(*BB, I, DL, TII->get(Mips::SW))
5208 .addUse(Tmp)
5209 .addUse(Address)
5210 .addImm(Imm);
5211 } else {
5212 // Mips release 5 needs to use instructions that can store to an unaligned
5213 // memory address.
5214 Register Tmp = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5215 BuildMI(*BB, I, DL, TII->get(Mips::COPY_S_W))
5216 .addDef(Tmp)
5217 .addUse(StoreVal)
5218 .addImm(0);
5219 BuildMI(*BB, I, DL, TII->get(Mips::SWR))
5220 .addUse(Tmp)
5221 .addUse(Address)
5222 .addImm(Imm + (IsLittle ? 0 : 3));
5223 BuildMI(*BB, I, DL, TII->get(Mips::SWL))
5224 .addUse(Tmp)
5225 .addUse(Address)
5226 .addImm(Imm + (IsLittle ? 3 : 0));
5227 }
5228
5229 MI.eraseFromParent();
5230
5231 return BB;
5232}
5233
5234MachineBasicBlock *MipsTargetLowering::emitSTR_D(MachineInstr &MI,
5235 MachineBasicBlock *BB) const {
5236 MachineFunction *MF = BB->getParent();
5237 MachineRegisterInfo &MRI = MF->getRegInfo();
5238 const TargetInstrInfo *TII = Subtarget.getInstrInfo();
5239 const bool IsLittle = Subtarget.isLittle();
5240 DebugLoc DL = MI.getDebugLoc();
5241
5242 Register StoreVal = MI.getOperand(0).getReg();
5243 Register Address = MI.getOperand(1).getReg();
5244 unsigned Imm = MI.getOperand(2).getImm();
5245
5247
5248 if (Subtarget.hasMips32r6() || Subtarget.hasMips64r6()) {
5249 // Mips release 6 can store to adress that is not naturally-aligned.
5250 if (Subtarget.isGP64bit()) {
5251 Register BitcastD = MRI.createVirtualRegister(&Mips::MSA128DRegClass);
5252 Register Lo = MRI.createVirtualRegister(&Mips::GPR64RegClass);
5253 BuildMI(*BB, I, DL, TII->get(Mips::COPY))
5254 .addDef(BitcastD)
5255 .addUse(StoreVal);
5256 BuildMI(*BB, I, DL, TII->get(Mips::COPY_S_D))
5257 .addDef(Lo)
5258 .addUse(BitcastD)
5259 .addImm(0);
5260 BuildMI(*BB, I, DL, TII->get(Mips::SD))
5261 .addUse(Lo)
5262 .addUse(Address)
5263 .addImm(Imm);
5264 } else {
5265 Register BitcastW = MRI.createVirtualRegister(&Mips::MSA128WRegClass);
5266 Register Lo = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5267 Register Hi = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5268 BuildMI(*BB, I, DL, TII->get(Mips::COPY))
5269 .addDef(BitcastW)
5270 .addUse(StoreVal);
5271 BuildMI(*BB, I, DL, TII->get(Mips::COPY_S_W))
5272 .addDef(Lo)
5273 .addUse(BitcastW)
5274 .addImm(0);
5275 BuildMI(*BB, I, DL, TII->get(Mips::COPY_S_W))
5276 .addDef(Hi)
5277 .addUse(BitcastW)
5278 .addImm(1);
5279 BuildMI(*BB, I, DL, TII->get(Mips::SW))
5280 .addUse(Lo)
5281 .addUse(Address)
5282 .addImm(Imm + (IsLittle ? 0 : 4));
5283 BuildMI(*BB, I, DL, TII->get(Mips::SW))
5284 .addUse(Hi)
5285 .addUse(Address)
5286 .addImm(Imm + (IsLittle ? 4 : 0));
5287 }
5288 } else {
5289 // Mips release 5 needs to use instructions that can store to an unaligned
5290 // memory address.
5291 Register Bitcast = MRI.createVirtualRegister(&Mips::MSA128WRegClass);
5292 Register Lo = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5293 Register Hi = MRI.createVirtualRegister(&Mips::GPR32RegClass);
5294 BuildMI(*BB, I, DL, TII->get(Mips::COPY)).addDef(Bitcast).addUse(StoreVal);
5295 BuildMI(*BB, I, DL, TII->get(Mips::COPY_S_W))
5296 .addDef(Lo)
5297 .addUse(Bitcast)
5298 .addImm(0);
5299 BuildMI(*BB, I, DL, TII->get(Mips::COPY_S_W))
5300 .addDef(Hi)
5301 .addUse(Bitcast)
5302 .addImm(1);
5303 BuildMI(*BB, I, DL, TII->get(Mips::SWR))
5304 .addUse(Lo)
5305 .addUse(Address)
5306 .addImm(Imm + (IsLittle ? 0 : 3));
5307 BuildMI(*BB, I, DL, TII->get(Mips::SWL))
5308 .addUse(Lo)
5309 .addUse(Address)
5310 .addImm(Imm + (IsLittle ? 3 : 0));
5311 BuildMI(*BB, I, DL, TII->get(Mips::SWR))
5312 .addUse(Hi)
5313 .addUse(Address)
5314 .addImm(Imm + (IsLittle ? 4 : 7));
5315 BuildMI(*BB, I, DL, TII->get(Mips::SWL))
5316 .addUse(Hi)
5317 .addUse(Address)
5318 .addImm(Imm + (IsLittle ? 7 : 4));
5319 }
5320
5321 MI.eraseFromParent();
5322 return BB;
5323}
static SDValue performSHLCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, SelectionDAG &DAG)
If the operand is a bitwise AND with a constant RHS, and the shift has a constant RHS and is the only...
static SDValue performORCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue performANDCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned Imm
unsigned uint64_t
This file declares a class to represent arbitrary precision floating point values and provide a varie...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
static LVOptions Options
Definition LVOptions.cpp:25
lazy value info
static SDValue performADDCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const LoongArchSubtarget &Subtarget)
static SDValue performSUBCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const LoongArchSubtarget &Subtarget)
static MachineBasicBlock * insertDivByZeroTrap(MachineInstr &MI, MachineBasicBlock *MBB)
static SDValue performSELECTCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const LoongArchSubtarget &Subtarget)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static bool CC_Mips(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
static bool CC_MipsO32_FP64(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
static bool CC_MipsO32_FP32(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
static SDValue performMADD_MSUBCombine(SDNode *ROOTNode, SelectionDAG &CurDAG, const MipsSubtarget &Subtarget)
static bool invertFPCondCodeUser(Mips::CondCode CC)
This function returns true if the floating point conditional branches and conditional moves which use...
static bool CC_MipsO32(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State, ArrayRef< MCPhysReg > F64Regs)
static SDValue lowerFP_TO_SINT_STORE(StoreSDNode *SD, SelectionDAG &DAG, bool SingleFloat)
static SDValue performDivRemCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
static const MCPhysReg Mips64DPRegs[8]
static SDValue lowerUnalignedIntStore(StoreSDNode *SD, SelectionDAG &DAG, bool IsLittle)
static SDValue createStoreLR(unsigned Opc, SelectionDAG &DAG, StoreSDNode *SD, SDValue Chain, unsigned Offset)
static unsigned addLiveIn(MachineFunction &MF, unsigned PReg, const TargetRegisterClass *RC)
static std::pair< bool, bool > parsePhysicalReg(StringRef C, StringRef &Prefix, unsigned long long &Reg)
This is a helper function to parse a physical register string and split it into non-numeric and numer...
static SDValue createLoadLR(unsigned Opc, SelectionDAG &DAG, LoadSDNode *LD, SDValue Chain, SDValue Src, unsigned Offset)
static SDValue lowerFCOPYSIGN64(SDValue Op, SelectionDAG &DAG, bool HasExtractInsert)
static SDValue createFPCmp(SelectionDAG &DAG, const SDValue &Op)
static SDValue lowerFCOPYSIGN32(SDValue Op, SelectionDAG &DAG, bool HasExtractInsert)
DivByZeroTrapKind
static SDValue performSignExtendCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
static SDValue performCMovFPCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
static SDValue UnpackFromArgumentSlot(SDValue Val, const CCValAssign &VA, EVT ArgVT, const SDLoc &DL, SelectionDAG &DAG)
static Mips::CondCode condCodeToFCC(ISD::CondCode CC)
static SDValue createCMovFP(SelectionDAG &DAG, SDValue Cond, SDValue True, SDValue False, const SDLoc &DL)
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > & Cond
SI optimize exec mask operations pre RA
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Definition Value.cpp:484
This file defines the SmallVector class.
static const MCPhysReg IntRegs[32]
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static const MCPhysReg F32Regs[64]
Value * RHS
Value * LHS
bool isZero() const
Definition APFloat.h:1579
APInt bitcastToAPInt() const
Definition APFloat.h:1475
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:478
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
const T * data() const
Definition ArrayRef.h:138
LLVM Basic Block Representation.
Definition BasicBlock.h:62
bool test(unsigned Idx) const
Returns true if bit Idx is set.
Definition BitVector.h:482
static constexpr BranchProbability getOne()
CCState - This class holds information needed while lowering arguments and return values.
unsigned getFirstUnallocated(ArrayRef< MCPhysReg > Regs) const
getFirstUnallocated - Return the index of the first unallocated register in the set,...
CallingConv::ID getCallingConv() const
uint64_t getStackSize() const
Returns the size of the currently allocated portion of the stack.
CCValAssign - Represent assignment of one arg/retval to a location.
Register getLocReg() const
LocInfo getLocInfo() const
static CCValAssign getReg(unsigned ValNo, MVT ValVT, MCRegister Reg, MVT LocVT, LocInfo HTP, bool IsCustom=false)
static CCValAssign getCustomReg(unsigned ValNo, MVT ValVT, MCRegister Reg, MVT LocVT, LocInfo HTP)
bool isUpperBitsInLoc() const
static CCValAssign getMem(unsigned ValNo, MVT ValVT, int64_t Offset, MVT LocVT, LocInfo HTP, bool IsCustom=false)
bool needsCustom() const
int64_t getLocMemOffset() const
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
const APFloat & getValueAPF() const
uint64_t getZExtValue() const
int64_t getSExtValue() const
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
A debug info location.
Definition DebugLoc.h:126
const char * getSymbol() const
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:67
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
bool hasStructRetAttr() const
Determine if the function returns a structure through first or second pointer argument.
Definition Function.h:673
const Argument * const_arg_iterator
Definition Function.h:74
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:734
const GlobalValue * getGlobal() const
bool isDSOLocal() const
bool hasLocalLinkage() const
bool hasPrivateLinkage() const
bool hasHiddenVisibility() const
bool hasDLLImportStorageClass() const
bool isDeclarationForLinker() const
LLVM_ABI const GlobalObject * getAliaseeObject() const
Definition Globals.cpp:521
bool hasProtectedVisibility() const
constexpr bool isValid() const
constexpr TypeSize getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:71
LLVM_ABI void emitError(const Instruction *I, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
Tracks which library functions to use for a particular subtarget or function.
This class is used to represent ISD::LOAD nodes.
const MCRegisterInfo * getRegisterInfo() const
Definition MCContext.h:411
MCRegisterClass - Base class of TargetRegisterClass.
MCRegister getRegister(unsigned i) const
getRegister - Return the specified register in the class.
iterator begin() const
begin/end - Return all of the registers in this class.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
StringRef getName() const
getName - Get the symbol name.
Definition MCSymbol.h:188
Machine Value Type.
SimpleValueType SimpleTy
static auto integer_valuetypes()
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
bool isValid() const
Return true if this is a valid simple valuetype.
static MVT getIntegerVT(unsigned BitWidth)
static auto fp_valuetypes()
static auto fp_fixedlen_vector_valuetypes()
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
void setFrameAddressIsTaken(bool T)
void setHasTailCall(bool V=true)
void setReturnAddressIsTaken(bool s)
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Register addLiveIn(MCRegister PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addUse(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a virtual register use operand.
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & addDef(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a virtual register definition operand.
Representation of each machine instruction.
const MachineOperand & getOperand(unsigned i) const
@ EK_GPRel32BlockAddress
EK_GPRel32BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
@ EK_GPRel64BlockAddress
EK_GPRel64BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
@ MOVolatile
The memory access is volatile.
Flags getFlags() const
Return the raw flags of the source value,.
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
static MachineOperand CreateMCSymbol(MCSymbol *Sym, unsigned TargetFlags=0)
void setIsKill(bool Val=true)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
void addLiveIn(MCRegister Reg, Register vreg=Register())
addLiveIn - Add the specified register as a live-in.
Align getAlign() const
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
const SDValue & getChain() const
EVT getMemoryVT() const
Return the type of the in-memory value.
static SpecialCallingConvType getSpecialCallingConvForCallee(const SDNode *Callee, const MipsSubtarget &Subtarget)
Determine the SpecialCallingConvType for the given callee.
MipsFunctionInfo - This class is derived from MachineFunction private Mips target-specific informatio...
void setVarArgsFrameIndex(int Index)
unsigned getSRetReturnReg() const
MachinePointerInfo callPtrInfo(MachineFunction &MF, const char *ES)
Create a MachinePointerInfo that has an ExternalSymbolPseudoSourceValue object representing a GOT ent...
Register getGlobalBaseReg(MachineFunction &MF)
void setSRetReturnReg(unsigned Reg)
void setFormalArgInfo(unsigned Size, bool HasByval)
static const uint32_t * getMips16RetHelperMask()
bool hasMips32r6() const
bool hasMips4() const
bool hasMips64r2() const
bool isLittle() const
const MipsInstrInfo * getInstrInfo() const override
bool hasMips64r6() const
bool inMips16Mode() const
bool hasMips64() const
bool hasMips32() const
const MipsOptions & getCLOpts() const
const MipsRegisterInfo * getRegisterInfo() const override
bool hasCnMips() const
bool isGP64bit() const
bool hasExtractInsert() const
Features related to the presence of specific instructions.
bool isSingleFloat() const
const MipsABIInfo & getABI() const
const TargetFrameLowering * getFrameLowering() const override
MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Return the register type for a given MVT, ensuring vectors are treated as a series of gpr sized integ...
bool hasBitTest(SDValue X, SDValue Y) const override
Return true if the target has a bit-test instruction: (X & (1 << Y)) ==/!= 0 This knowledge can be us...
static const MipsTargetLowering * create(const MipsTargetMachine &TM, const MipsSubtarget &STI)
SDValue getAddrGPRel(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, bool IsN64) const
unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const override
Break down vectors to the correct number of gpr sized integers.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
SDValue getAddrNonPICSym64(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG) const
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
getSetCCResultType - get the ISD::SETCC result ValueType
SDValue getAddrGlobal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, unsigned Flag, SDValue Chain, const MachinePointerInfo &PtrInfo) const
MipsTargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
const MipsABIInfo & ABI
SDValue getAddrGlobalLargeGOT(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, unsigned HiFlag, unsigned LoFlag, SDValue Chain, const MachinePointerInfo &PtrInfo) const
SDValue getDllimportVariable(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, SDValue Chain, const MachinePointerInfo &PtrInfo) const
bool shouldFoldConstantShiftPairToMask(const SDNode *N) const override
Return true if it is profitable to fold a pair of shifts into a mask.
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
CCAssignFn * CCAssignFnForReturn() const
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
ReplaceNodeResults - Replace the results of node with an illegal result type with new values built ou...
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
SDValue getDllimportSymbol(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG) const
CCAssignFn * CCAssignFnForCall() const
unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Return the number of registers for a given MVT, ensuring vectors are treated as a series of gpr sized...
virtual void getOpndList(SmallVectorImpl< SDValue > &Ops, std::deque< std::pair< unsigned, SDValue > > &RegsToPass, bool IsPICCall, bool GlobalOrExternal, bool LocalLinkage, bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const
This function fills Ops, which is the list of operands that will later be used when a function call n...
SDValue getAddrNonPIC(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG) const
SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering) const override
createFastISel - This method returns a target specific FastISel object, or null if the target does no...
void AdjustInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const override
This method should be implemented by targets that mark instructions with the 'hasPostISelHook' flag.
EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const override
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
bool isCheapToSpeculateCtlz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
LowerOperation - Provide custom lowering hooks for some operations.
bool isCheapToSpeculateCttz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
SDValue getAddrLocal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, bool IsN32OrN64) const
SDValue getGlobalReg(SelectionDAG &DAG, EVT Ty) const
const MipsSubtarget & Subtarget
void HandleByVal(CCState *, unsigned &, Align) const override
Target-specific cleanup for formal ByVal parameters.
SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const
bool IsConstantInSmallSection(const DataLayout &DL, const Constant *CN, const Function *F) const
Return true if this constant should be placed into small data section.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node, in exactly one operand.
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
unsigned getOpcode() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, unsigned TargetFlags=0)
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
SDValue getGLOBAL_OFFSET_TABLE(EVT VT)
Return a GLOBAL_OFFSET_TABLE node. This does not have a useful SDLoc.
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
SDValue getTargetJumpTable(int JTI, EVT VT, unsigned TargetFlags=0)
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2, SDValue InGlue, const SDLoc &DL)
Return a new CALLSEQ_END node, which always must have a glue result (to ensure it's not CSE'd).
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
SDValue getSignedTargetConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
SDValue getCALLSEQ_START(SDValue Chain, uint64_t InSize, uint64_t OutSize, const SDLoc &DL)
Return a new CALLSEQ_START node, that starts new call frame, in which InSize bytes are set up inside ...
SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True, SDValue False, ISD::CondCode Cond, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build SelectCC's if you just have an ISD::CondCode instead of an...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
SDValue getTargetBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, unsigned TargetFlags=0)
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
void addCallSiteInfo(const SDNode *Node, CallSiteInfo &&CallInfo)
Set CallSiteInfo to be associated with Node.
LLVMContext * getContext() const
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
SDValue getTargetConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offset=0, unsigned TargetFlags=0)
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
const SDValue & getBasePtr() const
const SDValue & getValue() const
bool isTruncatingStore() const
Return true if the op does a truncation before store.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
const char * const_iterator
Definition StringRef.h:61
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
Information about stack frame layout on the target.
unsigned getStackAlignment() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
Provides information about what library functions are available for the current target.
void setBooleanVectorContents(BooleanContent Ty)
Specify how the target extends the result of a vector boolean value from a vector of i1 to a wider ty...
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
Indicate that the specified operation does not work with the specified type and indicate what to do a...
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
void setMinStackArgumentAlignment(Align Alignment)
Set the minimum stack alignment of an argument.
const TargetMachine & getTargetMachine() const
void setHasExtractBitsInsn(bool hasExtractInsn=true)
Tells the code generator that the target has BitExtract instructions.
MVT getRegisterType(LLVMContext &Context, EVT VT) const
Return the type of registers that this ValueType will eventually require.
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
void setMaxAtomicSizeInBitsSupported(unsigned SizeInBits)
Set the maximum atomic operation size supported by the backend.
void setMinFunctionAlignment(Align Alignment)
Set the target's minimum function alignment.
void setBooleanContents(BooleanContent Ty)
Specify how the target extends the result of integer and floating point boolean values from i1 to a w...
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified truncating store does not work with the specified type and indicate what ...
void setStackPointerRegisterToSaveRestore(Register R)
If set to a physical register, this specifies the register that llvm.savestack/llvm....
void AddPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT)
If Opc/OrigVT is specified as being promoted, the promotion code defaults to trying a larger integer/...
void setTargetDAGCombine(ArrayRef< ISD::NodeType > NTs)
Targets should invoke this method for each target independent node that they want to provide a custom...
virtual bool useSoftFloat() const
Align getMinStackArgumentAlignment() const
Return the minimum stack alignment of an argument.
void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified load with extension does not work with the specified type and indicate wh...
std::vector< ArgListEntry > ArgListTy
unsigned MaxStoresPerMemcpy
Specify maximum number of store instructions per memcpy call.
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA, SelectionDAG &DAG) const
Lower TLS global address SDNode for target independent emulated TLS model.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
bool isPositionIndependent() const
virtual ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const
Examine constraint string and operand type and determine a weight value.
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
TargetLowering(const TargetLowering &)=delete
virtual ArrayRef< MCPhysReg > getRoundingControlRegisters() const
Returns a 0 terminated array of rounding control registers that can be attached into strict FP call.
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
virtual unsigned getJumpTableEncoding() const
Return the entry encoding for a jump table in the current function.
virtual void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
void setTypeIdForCallsiteInfo(const CallBase *CB, MachineFunction &MF, MachineFunction::CallSiteInfo &CSInfo) const
TLSModel::Model getTLSModel(const GlobalValue *GV) const
Returns the TLS model which should be used for the given global variable.
bool useEmulatedTLS() const
Returns true if this target uses emulated TLS.
virtual TargetLoweringObjectFile * getObjFileLowering() const
TargetOptions Options
MCSymbol * getSymbol(const GlobalValue *GV) const
unsigned EnableFastISel
EnableFastISel - This flag enables fast-path instruction selection which trades away generated code q...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition Type.h:155
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:187
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:303
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:222
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
self_iterator getIterator()
Definition ilist_node.h:123
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:43
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:845
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:516
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:805
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:266
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:879
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:523
@ GlobalAddress
Definition ISDOpcodes.h:90
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:420
@ MEMBARRIER
MEMBARRIER - Compiler barrier only; generate a no-op.
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
Definition ISDOpcodes.h:282
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:256
@ GlobalTLSAddress
Definition ISDOpcodes.h:91
@ EH_RETURN
OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents 'eh_return' gcc dwarf builtin,...
Definition ISDOpcodes.h:158
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:870
@ TargetJumpTable
Definition ISDOpcodes.h:190
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ BR_CC
BR_CC - Conditional branch.
@ BR_JT
BR_JT - Jumptable branch.
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:546
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:553
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:822
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:787
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:876
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:837
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:914
@ EH_DWARF_CFA
EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical Frame Address (CFA),...
Definition ISDOpcodes.h:152
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:112
@ STRICT_FP_TO_UINT
Definition ISDOpcodes.h:483
@ STRICT_FP_TO_SINT
STRICT_FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:482
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:952
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:757
@ TRAP
TRAP - Trapping instruction.
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:55
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:882
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ BRCOND
BRCOND - Conditional branch.
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:859
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:64
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:539
@ CALLSEQ_START
CALLSEQ_START/CALLSEQ_END - These operators mark the beginning and end of a call sequence,...
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
@ Bitcast
Perform the operation on a different, but equivalently sized type.
@ MO_TLSGD
On a symbol operand, this indicates that the immediate is the offset to the slot in GOT which stores ...
Flag
These should be considered private to the implementation of the MCInstrDesc class.
MCRegister matchRegisterName(StringRef Name, const MCRegisterInfo &MRI, unsigned RegClassID, unsigned AltIdx)
Match a symbolic name in RegClassID, or return an invalid register.
int getCPURegisterIndex(StringRef Name, const MCRegisterInfo &MRI, unsigned AltIdx, bool *IsDeprecated=nullptr)
Return a GPR name's hardware index, or -1 if unknown.
constexpr MCPhysReg FP_64
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering)
constexpr MCPhysReg GP_64
constexpr MCPhysReg FP
constexpr MCPhysReg GP
constexpr MCPhysReg RA_64
constexpr MCPhysReg SP
constexpr MCPhysReg SP_64
constexpr MCPhysReg RA
Not(const Pred &P) -> Not< Pred >
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
Definition LLVMContext.h:58
@ System
Synchronized with respect to all concurrently executing threads.
Definition LLVMContext.h:61
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
This is an optimization pass for GlobalISel generic memory operations.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:280
@ Offset
Definition DWP.cpp:577
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
Definition MathExtras.h:166
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Dead
Unused definition.
@ Undef
Value of the register doesn't matter.
@ EarlyClobber
Register definition happens before uses.
@ Define
Register definition.
constexpr RegState getKillRegState(bool B)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool CCAssignFn(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
CCAssignFn - This function assigns a location for Val, updating State to reflect the change.
@ Store
The extracted value is stored (ExtractElement only).
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
constexpr bool isShiftedMask_64(uint64_t Value)
Return true if the argument contains a non-empty sequence of ones with the remainder zero (64 bit ver...
Definition MathExtras.h:274
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:149
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:190
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:389
@ Other
Any other memory.
Definition ModRef.h:68
@ AfterLegalizeDAG
Definition DAGCombine.h:19
const MipsTargetLowering * createMips16TargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
Create MipsTargetLowering objects.
@ Or
Bitwise or logical OR of integers.
@ Add
Sum of integers.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
const MipsTargetLowering * createMipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
LLVM_ABI bool getAsUnsignedInteger(StringRef Str, unsigned Radix, unsigned long long &Result)
Helper functions for StringRef::getAsInteger.
constexpr T maskTrailingOnes(unsigned N)
Create a bitmask with the N right-most bits set to 1, and all other bits set to 0.
Definition MathExtras.h:78
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:82
Extended Value Type.
Definition ValueTypes.h:35
EVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
Definition ValueTypes.h:90
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
bool isPow2VectorType() const
Returns true if the given vector is a power of 2.
Definition ValueTypes.h:501
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getFloatingPointVT(unsigned BitWidth)
Returns the EVT that represents a floating-point type with the given number of bits.
Definition ValueTypes.h:55
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isRound() const
Return true if the size is a power-of-two number of bytes.
Definition ValueTypes.h:271
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
Align getNonZeroOrigAlign() const
SmallVector< ArgRegPair, 1 > ArgRegPairs
Vector of call argument and its forwarding register.
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getGOT(MachineFunction &MF)
Return a MachinePointerInfo record that refers to a GOT entry.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:111
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
This structure contains all information that is necessary for lowering calls.
SmallVector< ISD::InputArg, 32 > Ins
SmallVector< ISD::OutputArg, 32 > Outs