Path: blob/master/runtime/compiler/il/J9IL.cpp
6000 views
/*******************************************************************************1* Copyright (c) 2000, 2021 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#include "il/IL.hpp"23#include "il/ILOpCodes.hpp"24#include "il/DataTypes.hpp"25#include "infra/Assert.hpp"262728TR::ILOpCodes J9::IL::opCodesForConst[] =29{30TR::BadILOp, // TR::PackedDecimal31TR::BadILOp, // TR::ZonedDecimal32TR::BadILOp, // TR::ZonedDecimalSignLeadingEmbedded33TR::BadILOp, // TR::ZonedDecimalSignLeadingSeparate34TR::BadILOp, // TR::ZonedDecimalSignTrailingSeparate35TR::BadILOp, // TR::UnicodeDecimal36TR::BadILOp, // TR::UnicodeDecimalSignLeading37TR::BadILOp // TR::UnicodeDecimalSignTrailing38};3940TR::ILOpCodes J9::IL::opCodesForDirectLoad[] =41{42TR::pdload, // TR::PackedDecimal43TR::zdload, // TR::ZonedDecimal44TR::zdsleLoad, // TR::ZonedDecimalSignLeadingEmbedded45TR::zdslsLoad, // TR::ZonedDecimalSignLeadingSeparate46TR::zdstsLoad, // TR::ZonedDecimalSignTrailingSeparate47TR::udLoad, // TR::UnicodeDecimal48TR::udslLoad, // TR::UnicodeDecimalSignLeading49TR::udstLoad // TR::UnicodeDecimalSignTrailing50};5152TR::ILOpCodes J9::IL::opCodesForDirectStore[] =53{54TR::pdstore, // TR::PackedDecimal55TR::zdstore, // TR::ZonedDecimal56TR::zdsleStore, // TR::ZonedDecimalSignLeadingEmbedded57TR::zdslsStore, // TR::ZonedDecimalSignLeadingSeparate58TR::zdstsStore, // TR::ZonedDecimalSignTrailingSeparate59TR::udStore, // TR::UnicodeDecimal60TR::udslStore, // TR::UnicodeDecimalSignLeading61TR::udstStore // TR::UnicodeDecimalSignTrailing62};6364TR::ILOpCodes J9::IL::opCodesForIndirectLoad[] =65{66TR::pdloadi, // TR::PackedDecimal67TR::zdloadi, // TR::ZonedDecimal68TR::zdsleLoadi, // TR::ZonedDecimalSignLeadingEmbedded69TR::zdslsLoadi, // TR::ZonedDecimalSignLeadingSeparate70TR::zdstsLoadi, // TR::ZonedDecimalSignTrailingSeparate71TR::udLoadi, // TR::UnicodeDecimal72TR::udslLoadi, // TR::UnicodeDecimalSignLeading73TR::udstLoadi // TR::UnicodeDecimalSignTrailing74};7576TR::ILOpCodes J9::IL::opCodesForIndirectStore[] =77{78TR::pdstorei, // TR::PackedDecimal79TR::zdstorei, // TR::ZonedDecimal80TR::zdsleStorei, // TR::ZonedDecimalSignLeadingEmbedded81TR::zdslsStorei, // TR::ZonedDecimalSignLeadingSeparate82TR::zdstsStorei, // TR::ZonedDecimalSignTrailingSeparate83TR::udStorei, // TR::UnicodeDecimal84TR::udslStorei, // TR::UnicodeDecimalSignLeading85TR::udstStorei // TR::UnicodeDecimalSignTrailing86};8788TR::ILOpCodes J9::IL::opCodesForIndirectArrayLoad[] =89{90TR::pdloadi, // TR::PackedDecimal91TR::zdloadi, // TR::ZonedDecimal92TR::zdsleLoadi, // TR::ZonedDecimalSignLeadingEmbedded93TR::zdslsLoadi, // TR::ZonedDecimalSignLeadingSeparate94TR::zdstsLoadi, // TR::ZonedDecimalSignTrailingSeparate95TR::udLoadi, // TR::UnicodeDecimal96TR::udslLoadi, // TR::UnicodeDecimalSignLeading97TR::udstLoadi // TR::UnicodeDecimalSignTrailing98};99100TR::ILOpCodes J9::IL::opCodesForIndirectArrayStore[] =101{102TR::pdstorei, // TR::PackedDecimal103TR::zdstorei, // TR::ZonedDecimal104TR::zdsleStorei, // TR::ZonedDecimalSignLeadingEmbedded105TR::zdslsStorei, // TR::ZonedDecimalSignLeadingSeparate106TR::zdstsStorei, // TR::ZonedDecimalSignTrailingSeparate107TR::udStorei, // TR::UnicodeDecimal108TR::udslStorei, // TR::UnicodeDecimalSignLeading109TR::udstStorei // TR::UnicodeDecimalSignTrailing110};111112TR::ILOpCodes J9::IL::opCodesForRegisterLoad[] =113{114TR::BadILOp, // TR::PackedDecimal115TR::BadILOp, // TR::ZonedDecimal116TR::BadILOp, // TR::ZonedDecimalSignLeadingEmbedded117TR::BadILOp, // TR::ZonedDecimalSignLeadingSeparate118TR::BadILOp, // TR::ZonedDecimalSignTrailingSeparate119TR::BadILOp, // TR::UnicodeDecimal120TR::BadILOp, // TR::UnicodeDecimalSignLeading121TR::BadILOp // TR::UnicodeDecimalSignTrailing122};123124TR::ILOpCodes J9::IL::opCodesForRegisterStore[] =125{126TR::BadILOp, // TR::PackedDecimal127TR::BadILOp, // TR::ZonedDecimal128TR::BadILOp, // TR::ZonedDecimalSignLeadingEmbedded129TR::BadILOp, // TR::ZonedDecimalSignLeadingSeparate130TR::BadILOp, // TR::ZonedDecimalSignTrailingSeparate131TR::BadILOp, // TR::UnicodeDecimal132TR::BadILOp, // TR::UnicodeDecimalSignLeading133TR::BadILOp // TR::UnicodeDecimalSignTrailing134};135136TR::ILOpCodes J9::IL::opCodesForCompareEquals[] =137{138TR::pdcmpeq, // TR::PackedDecimal139TR::BadILOp, // TR::ZonedDecimal140TR::BadILOp, // TR::ZonedDecimalSignLeadingEmbedded141TR::BadILOp, // TR::ZonedDecimalSignLeadingSeparate142TR::BadILOp, // TR::ZonedDecimalSignTrailingSeparate143TR::BadILOp, // TR::UnicodeDecimal144TR::BadILOp, // TR::UnicodeDecimalSignLeading145TR::BadILOp // TR::UnicodeDecimalSignTrailing146};147148TR::ILOpCodes J9::IL::opCodesForCompareNotEquals[] =149{150TR::pdcmpne, // TR::PackedDecimal151TR::BadILOp, // TR::ZonedDecimal152TR::BadILOp, // TR::ZonedDecimalSignLeadingEmbedded153TR::BadILOp, // TR::ZonedDecimalSignLeadingSeparate154TR::BadILOp, // TR::ZonedDecimalSignTrailingSeparate155TR::BadILOp, // TR::UnicodeDecimal156TR::BadILOp, // TR::UnicodeDecimalSignLeading157TR::BadILOp // TR::UnicodeDecimalSignTrailing158};159160static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForConst) / sizeof(J9::IL::opCodesForConst[0])),161"J9::IL::opCodesForConst is not the correct size");162163static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForDirectLoad) / sizeof(J9::IL::opCodesForDirectLoad[0])),164"J9::IL::opCodesForDirectLoad is not the correct size");165166static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForDirectStore) / sizeof(J9::IL::opCodesForDirectStore[0])),167"J9::IL::opCodesForDirectStore is not the correct size");168169static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForIndirectLoad) / sizeof(J9::IL::opCodesForIndirectLoad[0])),170"J9::IL::opCodesForIndirectLoad is not the correct size");171172static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForIndirectStore) / sizeof(J9::IL::opCodesForIndirectStore[0])),173"J9::IL::opCodesForIndirectStore is not the correct size");174175static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForIndirectArrayLoad) / sizeof(J9::IL::opCodesForIndirectArrayLoad[0])),176"J9::IL::opCodesForIndirectArrayLoad is not the correct size");177178static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForIndirectArrayStore) / sizeof(J9::IL::opCodesForIndirectArrayStore[0])),179"J9::IL::opCodesForIndirectArrayStore is not the correct size");180181static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForRegisterLoad) / sizeof(J9::IL::opCodesForRegisterLoad[0])),182"J9::IL::opCodesForRegisterLoad is not the correct size");183184static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForRegisterStore) / sizeof(J9::IL::opCodesForRegisterStore[0])),185"J9::IL::opCodesForRegisterStore is not the correct size");186187static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForCompareEquals) / sizeof(J9::IL::opCodesForCompareEquals[0])),188"J9::IL::opCodesForCompareEquals is not the correct size");189190static_assert(TR::LastJ9Type - TR::FirstJ9Type + 1 == (sizeof(J9::IL::opCodesForCompareNotEquals) / sizeof(J9::IL::opCodesForCompareNotEquals[0])),191"J9::IL::opCodesForCompareNotEquals is not the correct size");192193194TR::ILOpCodes195J9::IL::opCodeForCorrespondingIndirectLoad(TR::ILOpCodes loadOpCode)196{197198if (loadOpCode <= TR::LastOMROp)199{200return OMR::IL::opCodeForCorrespondingIndirectLoad(loadOpCode);201}202203switch (loadOpCode)204{205case TR::pdloadi: return TR::pdstorei;206case TR::zdloadi: return TR::zdstorei;207case TR::zdsleLoadi: return TR::zdsleStorei;208case TR::zdslsLoadi: return TR::zdslsStorei;209case TR::zdstsLoadi: return TR::zdstsStorei;210case TR::udLoadi: return TR::udStorei;211case TR::udslLoadi: return TR::udslStorei;212case TR::udstLoadi: return TR::udstStorei;213default: return OMR::IL::opCodeForCorrespondingIndirectLoad(loadOpCode);214}215216TR_ASSERT(0, "no corresponding store opcode for specified load opcode");217return TR::BadILOp;218}219220221TR::ILOpCodes222J9::IL::opCodeForCorrespondingIndirectStore(TR::ILOpCodes storeOpCode)223{224225if (storeOpCode <= TR::LastOMROp)226{227return OMR::IL::opCodeForCorrespondingIndirectStore(storeOpCode);228}229230switch (storeOpCode)231{232case TR::pdstorei: return TR::pdloadi;233case TR::zdstorei: return TR::zdloadi;234case TR::zdsleStorei: return TR::zdsleLoadi;235case TR::zdslsStorei: return TR::zdslsLoadi;236case TR::zdstsStorei: return TR::zdstsLoadi;237case TR::udStorei: return TR::udLoadi;238case TR::udslStorei: return TR::udslLoadi;239case TR::udstStorei: return TR::udstLoadi;240default: return OMR::IL::opCodeForCorrespondingIndirectStore(storeOpCode);241}242243TR_ASSERT(0, "no corresponding load opcode for specified store opcode");244return TR::BadILOp;245}246247TR::ILOpCodes248J9::IL::opCodeForCorrespondingDirectLoad(TR::ILOpCodes loadOpCode)249{250251if (loadOpCode <= TR::LastOMROp)252{253return OMR::IL::opCodeForCorrespondingDirectLoad(loadOpCode);254}255256switch (loadOpCode)257{258case TR::pdload: return TR::pdstore;259case TR::zdload: return TR::zdstore;260case TR::zdsleLoad: return TR::zdsleStore;261case TR::zdslsLoad: return TR::zdslsStore;262case TR::zdstsLoad: return TR::zdstsStore;263case TR::udLoad: return TR::udStore;264case TR::udslLoad: return TR::udslStore;265case TR::udstLoad: return TR::udstStore;266default: return OMR::IL::opCodeForCorrespondingDirectLoad(loadOpCode);267}268269TR_ASSERT(0, "no corresponding store opcode for specified load opcode");270return TR::BadILOp;271}272273274TR::ILOpCodes275J9::IL::opCodeForCorrespondingDirectStore(TR::ILOpCodes storeOpCode)276{277278if (storeOpCode <= TR::LastOMROp)279{280return OMR::IL::opCodeForCorrespondingDirectStore(storeOpCode);281}282283switch (storeOpCode)284{285case TR::pdstore: return TR::pdload;286case TR::zdstore: return TR::zdload;287case TR::zdsleStore: return TR::zdsleLoad;288case TR::zdslsStore: return TR::zdslsLoad;289case TR::zdstsStore: return TR::zdstsLoad;290case TR::udStore: return TR::udLoad;291case TR::udslStore: return TR::udslLoad;292case TR::udstStore: return TR::udstLoad;293default: return OMR::IL::opCodeForCorrespondingDirectStore(storeOpCode);294}295296TR_ASSERT(0, "no corresponding load opcode for specified store opcode");297return TR::BadILOp;298}299300TR::ILOpCodes301J9::IL::opCodeForConst(TR::DataType dt)302{303if (dt == TR::Int8 || dt == TR::Int16)304{305return TR::iconst;306}307308if (dt < TR::FirstJ9Type)309{310return OMR::IL::opCodeForConst(dt);311}312313return J9::IL::opCodesForConst[dt - TR::FirstJ9Type];314}315316317TR::ILOpCodes318J9::IL::opCodeForDirectReadBarrier(TR::DataType dt)319{320if (dt == TR::Int8 || dt == TR::Int16)321{322return TR::irdbar;323}324325return OMR::IL::opCodeForDirectReadBarrier(dt);326}327328TR::ILOpCodes329J9::IL::opCodeForDirectLoad(TR::DataType dt)330{331if (dt == TR::Int8 || dt == TR::Int16)332{333return TR::iload;334}335336if (dt < TR::FirstJ9Type)337{338return OMR::IL::opCodeForDirectLoad(dt);339}340341return J9::IL::opCodesForDirectLoad[dt - TR::FirstJ9Type];342}343344TR::ILOpCodes345J9::IL::opCodeForDirectStore(TR::DataType dt)346{347if (dt == TR::Int8 || dt == TR::Int16)348{349return TR::istore;350}351352if (dt < TR::FirstJ9Type)353{354return OMR::IL::opCodeForDirectStore(dt);355}356357return J9::IL::opCodesForDirectStore[dt - TR::FirstJ9Type];358}359360TR::ILOpCodes361J9::IL::opCodeForDirectWriteBarrier(TR::DataType dt)362{363if (dt == TR::Int8 || dt == TR::Int16)364{365return TR::iwrtbar;366}367368return OMR::IL::opCodeForDirectWriteBarrier(dt);369}370371TR::ILOpCodes372J9::IL::opCodeForIndirectReadBarrier(TR::DataType dt)373{374if (dt == TR::Int8 || dt == TR::Int16)375{376return TR::irdbari;377}378379return OMR::IL::opCodeForIndirectReadBarrier(dt);380}381382TR::ILOpCodes383J9::IL::opCodeForIndirectLoad(TR::DataType dt)384{385if (dt == TR::Int8 || dt == TR::Int16)386{387return TR::iloadi;388}389390if (dt < TR::FirstJ9Type)391{392return OMR::IL::opCodeForIndirectLoad(dt);393}394395return J9::IL::opCodesForIndirectLoad[dt - TR::FirstJ9Type];396}397398TR::ILOpCodes399J9::IL::opCodeForIndirectStore(TR::DataType dt)400{401if (dt == TR::Int8 || dt == TR::Int16)402{403return TR::istorei;404}405406if (dt < TR::FirstJ9Type)407{408return OMR::IL::opCodeForIndirectStore(dt);409}410411return J9::IL::opCodesForIndirectStore[dt - TR::FirstJ9Type];412}413414TR::ILOpCodes415J9::IL::opCodeForIndirectWriteBarrier(TR::DataType dt)416{417if (dt == TR::Int8 || dt == TR::Int16)418{419return TR::iwrtbari;420}421422return OMR::IL::opCodeForIndirectWriteBarrier(dt);423}424425426TR::ILOpCodes427J9::IL::opCodeForIndirectArrayLoad(TR::DataType dt)428{429if (dt < TR::FirstJ9Type)430{431return OMR::IL::opCodeForIndirectArrayLoad(dt);432}433434return J9::IL::opCodesForIndirectArrayLoad[dt - TR::FirstJ9Type];435}436437TR::ILOpCodes438J9::IL::opCodeForIndirectArrayStore(TR::DataType dt)439{440if (dt < TR::FirstJ9Type)441{442return OMR::IL::opCodeForIndirectArrayStore(dt);443}444445return J9::IL::opCodesForIndirectArrayStore[dt - TR::FirstJ9Type];446}447448TR::ILOpCodes449J9::IL::opCodeForRegisterLoad(TR::DataType dt)450{451if (dt < TR::FirstJ9Type)452{453return OMR::IL::opCodeForRegisterLoad(dt);454}455456return J9::IL::opCodesForRegisterLoad[dt - TR::FirstJ9Type];457}458459TR::ILOpCodes460J9::IL::opCodeForRegisterStore(TR::DataType dt)461{462if (dt < TR::FirstJ9Type)463{464return OMR::IL::opCodeForRegisterStore(dt);465}466467return J9::IL::opCodesForRegisterStore[dt - TR::FirstJ9Type];468}469470TR::ILOpCodes471J9::IL::opCodeForCompareEquals(TR::DataType dt)472{473if (dt == TR::Int8 || dt == TR::Int16)474{475return TR::icmpeq;476}477478if (dt < TR::FirstJ9Type)479{480return OMR::IL::opCodeForCompareEquals(dt);481}482483return J9::IL::opCodesForCompareEquals[dt - TR::FirstJ9Type];484}485486TR::ILOpCodes487J9::IL::opCodeForCompareNotEquals(TR::DataType dt)488{489if (dt == TR::Int8 || dt == TR::Int16)490{491return TR::icmpne;492}493494if (dt < TR::FirstJ9Type)495{496return OMR::IL::opCodeForCompareNotEquals(dt);497}498499return J9::IL::opCodesForCompareNotEquals[dt - TR::FirstJ9Type];500}501502503504