Lines Matching +full:hi +full:- +full:fi
1 //===- MCExpr.cpp - Assembly Level Expression Implementation --------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
12 #include "llvm/Config/llvm-config.h"
43 return cast<MCTargetExpr>(this)->printImpl(OS, MAI);
48 if (Value < 0 && MAI && !MAI->supportsSignedData())
77 bool UseParens = MAI && MAI->useParensForDollarSignNames() && !InParens &&
89 if (MAI && MAI->useParensForSymbolVariant()) // ARM
102 case MCUnaryExpr::Minus: OS << '-'; break;
106 bool Binary = UE.getSubExpr()->getKind() == MCExpr::Binary;
108 UE.getSubExpr()->print(OS, MAI);
116 // Only print parens around the LHS if it is non-trivial.
118 BE.getLHS()->print(OS, MAI);
121 BE.getLHS()->print(OS, MAI);
127 // Print "X-42" instead of "X+-42".
129 if (RHSC->getValue() < 0) {
130 OS << RHSC->getValue();
154 case MCBinaryExpr::Sub: OS << '-'; break;
158 // Only print parens around the LHS if it is non-trivial.
160 BE.getRHS()->print(OS, MAI);
163 BE.getRHS()->print(OS, MAI);
204 encodeSubclassData(Kind, MAI->hasSubsectionsViaSymbols())),
222 // clang-format off
379 case VK_AMDGPU_GOTPCREL32_HI: return "gotpcrel32@hi";
381 case VK_AMDGPU_REL32_HI: return "rel32@hi";
384 case VK_AMDGPU_ABS32_HI: return "abs32@hi";
385 case VK_VE_HI32: return "hi";
399 // clang-format on
517 .Case("gotpcrel32@hi", VK_AMDGPU_GOTPCREL32_HI)
519 .Case("rel32@hi", VK_AMDGPU_REL32_HI)
522 .Case("abs32@hi", VK_AMDGPU_ABS32_HI)
523 .Case("hi", VK_VE_HI32)
575 Res = CE->getValue();
595 const MCSymbol &SA = A->getSymbol();
596 const MCSymbol &SB = B->getSymbol();
601 if (!Asm->getWriter().isSymbolRefDifferenceFullyResolved(*Asm, A, B, InSet))
605 // Pointers to Thumb symbols need to have their low-bit set to allow
607 if (Asm->isThumbFunc(&SA))
617 const MCSection &SecA = *FA->getParent();
618 const MCSection &SecB = *FB->getParent();
624 // However, linker relaxation may cause incorrect fold of A-B if A and B are
625 // separated by a linker-relaxable instruction. If the section contains
628 bool Layout = Asm->hasLayout();
630 !(Asm->getContext().getTargetTriple().isRISCV() ||
631 Asm->getContext().getTargetTriple().isLoongArch()))) {
635 Addend += SA.getOffset() - SB.getOffset();
640 Addend += Asm->getSymbolOffset(A->getSymbol()) -
641 Asm->getSymbolOffset(B->getSymbol());
643 Addend += (Addrs->lookup(&SecA) - Addrs->lookup(&SecB));
650 // fixed-size fragments so the difference can be calculated. For example,
652 // is created in the case of foo: instr; .arch_extension ext; instr .if . -
663 Reverse = FA->getLayoutOrder() < FB->getLayoutOrder();
666 int64_t Displacement = SA.getOffset() - SB.getOffset();
670 Displacement *= -1;
674 // a relaxable instruction. If SA and SB are separated by a linker-relaxable
678 for (auto FI = FB; FI; FI = FI->getNext()) {
679 auto DF = dyn_cast<MCDataFragment>(FI);
680 if (DF && DF->isLinkerRelaxable()) {
681 if (&*FI != FB || SBOffset != DF->getContents().size())
683 if (&*FI != FA || SAOffset == DF->getContents().size())
688 if (&*FI == FA) {
691 Addend += Reverse ? -Displacement : Displacement;
699 Displacement += DF->getContents().size();
700 } else if (auto *AF = dyn_cast<MCAlignFragment>(FI);
701 AF && Layout && AF->hasEmitNops() &&
702 !Asm->getBackend().shouldInsertExtraNopBytesForCodeAlign(
704 Displacement += Asm->computeFragmentSize(*AF);
705 } else if (auto *FF = dyn_cast<MCFillFragment>(FI);
706 FF && FF->getNumValues().evaluateAsAbsolute(Num)) {
707 Displacement += Num * FF->getValueSize();
718 /// Result = (Result_A - Result_B + Result_Cst)
722 /// Result = (LHS_A - LHS_B + LHS_Cst) + (RHS_A - RHS_B + RHS_Cst).
758 // Result = (LHS_A - LHS_B + LHS_Cst) + (RHS_A - RHS_B + RHS_Cst).
760 // (LHS_A - LHS_B),
761 // (LHS_A - RHS_B),
762 // (RHS_A - LHS_B),
763 // (RHS_A - RHS_B).
781 // symbol -- find them.
805 if (Inner->getKind() == MCSymbolRefExpr::VK_WEAKREF)
821 return cast<MCTargetExpr>(this)->evaluateAsRelocatableImpl(Res, Asm, Fixup);
824 Res = MCValue::get(cast<MCConstantExpr>(this)->getValue());
829 const MCSymbol &Sym = SRE->getSymbol();
830 const auto Kind = SRE->getKind();
831 bool Layout = Asm && Asm->hasLayout();
836 bool IsMachO = SRE->hasSubsectionsViaSymbols();
837 if (Sym.getVariableValue()->evaluateAsRelocatableImpl(
851 MCValue::get(MCSymbolRefExpr::create(&Res.getSymA()->getSymbol(),
852 Kind, Asm->getContext()),
883 if (!AUE->getSubExpr()->evaluateAsRelocatableImpl(Value, Asm, Fixup, Addrs,
887 switch (AUE->getOpcode()) {
894 /// -(a - b + const) ==> (b - a - const)
900 -(uint64_t)Value.getConstant());
919 if (!ABE->getLHS()->evaluateAsRelocatableImpl(LHSValue, Asm, Fixup, Addrs,
921 !ABE->getRHS()->evaluateAsRelocatableImpl(RHSValue, Asm, Fixup, Addrs,
924 if (const MCTargetExpr *L = dyn_cast<MCTargetExpr>(ABE->getLHS())) {
925 if (const MCTargetExpr *R = dyn_cast<MCTargetExpr>(ABE->getRHS())) {
926 switch (ABE->getOpcode()) {
928 Res = MCValue::get(L->isEqualTo(R) ? -1 : 0);
931 Res = MCValue::get(L->isEqualTo(R) ? 0 : -1);
941 // We only support a few operations on non-constant expressions, handle
944 switch (ABE->getOpcode()) {
953 -(uint64_t)RHSValue.getConstant(),
971 auto Op = ABE->getOpcode();
986 if (ABE->getOpcode() == MCBinaryExpr::Div)
1004 case MCBinaryExpr::Sub: Result = LHS - RHS; break;
1018 // A comparison operator returns a -1 if true and 0 if false.
1019 Res = MCValue::get(Result ? -1 : 0);
1034 return cast<MCTargetExpr>(this)->findAssociatedFragment();
1041 const MCSymbol &Sym = SRE->getSymbol();
1046 return cast<MCUnaryExpr>(this)->getSubExpr()->findAssociatedFragment();
1050 MCFragment *LHS_F = BE->getLHS()->findAssociatedFragment();
1051 MCFragment *RHS_F = BE->getRHS()->findAssociatedFragment();
1060 if (BE->getOpcode() == MCBinaryExpr::Sub)
1063 // Otherwise, return the first non-null fragment.