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