Path: blob/master/runtime/compiler/z/codegen/J9MemoryReference.hpp
6004 views
/*******************************************************************************1* Copyright (c) 2000, 2016 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/2122#ifndef J9_Z_MEMORY_REFERENCE_INCL23#define J9_Z_MEMORY_REFERENCE_INCL2425/*26* The following #define and typedef must appear before any #includes in this file27*/28#ifndef J9_MEMORY_REFERENCE_CONNECTOR29#define J9_MEMORY_REFERENCE_CONNECTOR30namespace J9 { namespace Z { class MemoryReference; } }31namespace J9 {typedef J9::Z::MemoryReference MemoryReferenceConnector; }32#else33#error J9::Z::MemoryReference expected to be a primary connector, but a J9 connector is already defined34#endif3536#include "codegen/OMRMemoryReference.hpp"3738namespace TR { class Snippet; }394041namespace J942{4344namespace Z45{4647class OMR_EXTENSIBLE MemoryReference : public OMR::MemoryReferenceConnector48{49public:50MemoryReference(TR::CodeGenerator *cg) : OMR::MemoryReferenceConnector(cg) {}5152MemoryReference(TR::Register *br,53int32_t disp,54TR::CodeGenerator *cg,55const char *name=NULL ) :56OMR::MemoryReferenceConnector(br, disp, cg, name) {}5758MemoryReference(TR::Register *br,59int32_t disp,60TR::SymbolReference *symRef,61TR::CodeGenerator *cg) :62OMR::MemoryReferenceConnector(br, disp, symRef, cg) {}6364MemoryReference(TR::Register *br,65TR::Register *ir,66int32_t disp,67TR::CodeGenerator *cg) :68OMR::MemoryReferenceConnector(br, ir, disp, cg) {}6970MemoryReference(int32_t disp, TR::CodeGenerator *cg, bool isConstantDataSnippet=false) :71OMR::MemoryReferenceConnector(disp, cg, isConstantDataSnippet) {}7273MemoryReference(TR::Node *rootLoadOrStore, TR::CodeGenerator *cg, bool canUseRX = false, TR_StorageReference *storageReference=NULL) :74OMR::MemoryReferenceConnector(rootLoadOrStore, cg, canUseRX, storageReference) {}7576MemoryReference(TR::Node *addressTree, bool canUseIndex, TR::CodeGenerator *cg) :77OMR::MemoryReferenceConnector(addressTree, canUseIndex, cg) {}7879MemoryReference(TR::Node *node, TR::SymbolReference *symRef, TR::CodeGenerator *cg, TR_StorageReference *storageReference=NULL) :80OMR::MemoryReferenceConnector(node, symRef, cg, storageReference) {}81MemoryReference(TR::Snippet *s, TR::CodeGenerator *cg, TR::Register* base, TR::Node* node) :82OMR::MemoryReferenceConnector(s, cg, base, node) {}8384MemoryReference(TR::Snippet *s, TR::Register* indx, int32_t disp, TR::CodeGenerator *cg) :85OMR::MemoryReferenceConnector(s, indx, disp, cg) {}8687MemoryReference(MemoryReference& mr, int32_t n, TR::CodeGenerator *cg) :88OMR::MemoryReferenceConnector(mr, n, cg) {}8990void addInstrSpecificRelocation(TR::CodeGenerator* cg, TR::Instruction* instr, int32_t disp, uint8_t * cursor);919293static bool typeNeedsAlignment(TR::Node *node);9495TR::UnresolvedDataSnippet * createUnresolvedDataSnippet(TR::Node * node, TR::CodeGenerator * cg, TR::SymbolReference * symRef, TR::Register * tempReg, bool isStore);96TR::UnresolvedDataSnippet * createUnresolvedDataSnippetForiaload(TR::Node * node, TR::CodeGenerator * cg, TR::SymbolReference * symRef, TR::Register * tempReg, bool & isStore);97void createUnresolvedSnippetWithNodeRegister(TR::Node * node, TR::CodeGenerator * cg, TR::SymbolReference * symRef, TR::Register *& writableLiteralPoolRegister);98void createUnresolvedDataSnippetForBaseNode(TR::CodeGenerator * cg, TR::Register * writableLiteralPoolRegister);99100void createPatchableDataInLitpool(TR::Node * node, TR::CodeGenerator * cg, TR::Register * tempReg, TR::UnresolvedDataSnippet * uds);101102void incRefCountForOpaquePseudoRegister(TR::Node * node, TR::CodeGenerator * cg, TR::Compilation * comp);103104bool symRefHasTemporaryNegativeOffset();105106void setMemRefAndGetUnresolvedData(TR::Snippet *& snippet);107void tryForceFolding(TR::Node *& rootLoadOrStore, TR::CodeGenerator *& cg, TR_StorageReference *& storageReference, TR::SymbolReference *& symRef, TR::Symbol *& symbol,108List<TR::Node>& nodesAlreadyEvaluatedBeforeFoldingList);109};110}111112}113114TR::MemoryReference * reuseS390MemRefFromStorageRef(TR::MemoryReference *baseMR, int32_t offset, TR::Node *node, TR_StorageReference *storageReference, TR::CodeGenerator *cg, bool enforceSSLimits=true);115TR::MemoryReference * generateS390MemRefFromStorageRef(TR::Node *node, TR_StorageReference *storageReference, TR::CodeGenerator * cg, bool enforceSSLimits=true, bool isNewTemp=false);116TR::MemoryReference * generateS390RightAlignedMemoryReference(TR::Node *node, TR_StorageReference *storageReference, TR::CodeGenerator * cg, bool enforceSSLimits=true, bool isNewTemp=false);117TR::MemoryReference * generateS390LeftAlignedMemoryReference(TR::Node *node, TR_StorageReference *storageReference, TR::CodeGenerator * cg, int32_t leftMostByte, bool enforceSSLimits=true, bool isNewTemp=false);118119TR::MemoryReference * reuseS390LeftAlignedMemoryReference(TR::MemoryReference *baseMR, TR::Node *node, TR_StorageReference *storageReference, TR::CodeGenerator *cg, int32_t leftMostByte, bool enforceSSLimits=true);120TR::MemoryReference * reuseS390RightAlignedMemoryReference(TR::MemoryReference *baseMR, TR::Node *node, TR_StorageReference *storageReference, TR::CodeGenerator *cg, bool enforceSSLimits=true);121122#endif123124125