xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
106c3fb27SDimitry Andric //===-- SystemZMCExpr.cpp - SystemZ specific MC expression classes --------===//
206c3fb27SDimitry Andric //
306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606c3fb27SDimitry Andric //
706c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
806c3fb27SDimitry Andric 
906c3fb27SDimitry Andric #include "SystemZMCExpr.h"
1006c3fb27SDimitry Andric #include "llvm/MC/MCContext.h"
1106c3fb27SDimitry Andric using namespace llvm;
1206c3fb27SDimitry Andric 
1306c3fb27SDimitry Andric #define DEBUG_TYPE "systemzmcexpr"
1406c3fb27SDimitry Andric 
1506c3fb27SDimitry Andric const SystemZMCExpr *SystemZMCExpr::create(VariantKind Kind, const MCExpr *Expr,
1606c3fb27SDimitry Andric                                            MCContext &Ctx) {
1706c3fb27SDimitry Andric   return new (Ctx) SystemZMCExpr(Kind, Expr);
1806c3fb27SDimitry Andric }
1906c3fb27SDimitry Andric 
2006c3fb27SDimitry Andric StringRef SystemZMCExpr::getVariantKindName() const {
2106c3fb27SDimitry Andric   switch (static_cast<uint32_t>(getKind())) {
2206c3fb27SDimitry Andric   case VK_SystemZ_None:
2306c3fb27SDimitry Andric     return "A";
2406c3fb27SDimitry Andric   case VK_SystemZ_RCon:
2506c3fb27SDimitry Andric     return "R";
2606c3fb27SDimitry Andric   case VK_SystemZ_VCon:
2706c3fb27SDimitry Andric     return "V";
2806c3fb27SDimitry Andric   default:
2906c3fb27SDimitry Andric     llvm_unreachable("Invalid kind");
3006c3fb27SDimitry Andric   }
3106c3fb27SDimitry Andric }
3206c3fb27SDimitry Andric 
3306c3fb27SDimitry Andric void SystemZMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
3406c3fb27SDimitry Andric   OS << getVariantKindName() << '(';
3506c3fb27SDimitry Andric   Expr->print(OS, MAI);
3606c3fb27SDimitry Andric   OS << ')';
3706c3fb27SDimitry Andric }
3806c3fb27SDimitry Andric 
3906c3fb27SDimitry Andric bool SystemZMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
40*0fca6ea1SDimitry Andric                                               const MCAssembler *Asm,
4106c3fb27SDimitry Andric                                               const MCFixup *Fixup) const {
42*0fca6ea1SDimitry Andric   if (!getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup))
4306c3fb27SDimitry Andric     return false;
4406c3fb27SDimitry Andric 
4506c3fb27SDimitry Andric   Res =
4606c3fb27SDimitry Andric       MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind());
4706c3fb27SDimitry Andric 
4806c3fb27SDimitry Andric   return true;
4906c3fb27SDimitry Andric }
50