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