Skip to content

Commit

Permalink
Override CPU::detect() on Z and X86
Browse files Browse the repository at this point in the history
Issue: #4339

Signed-off-by: Harry Yu <harryyu1994@gmail.com>
  • Loading branch information
harryyu1994 committed Mar 4, 2020
1 parent 3070301 commit 479d385
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 2 deletions.
9 changes: 9 additions & 0 deletions compiler/env/OMRCPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,12 @@ OMR::CPU::initializeByHostQuery()
#endif

}

TR::CPU
OMR::CPU::detect(OMRPortLibrary * const omrPortLib)
{
OMRPORT_ACCESS_FROM_OMRPORT(omrPortLib);
OMRProcessorDesc processorDescription;
omrsysinfo_get_processor_description(&processorDescription);
return TR::CPU(processorDescription);
}
7 changes: 7 additions & 0 deletions compiler/env/OMRCPU.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,13 @@ class CPU

TR::CPU *self();

/**
* @brief Detects the underlying processor type and features using the port library and constructs a TR::CPU object
* @param[in] omrPortLib : the port library
* @return TR::CPU
*/
static TR::CPU detect(OMRPortLibrary * const omrPortLib);

// Initialize CPU info by querying the host processor at compile-time
//
void initializeByHostQuery();
Expand Down
30 changes: 30 additions & 0 deletions compiler/x/env/OMRCPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,36 @@
#include "x/runtime/X86Runtime.hpp"


TR::CPU
OMR::X86::CPU::detect(OMRPortLibrary * const omrPortLib)
{
// Only enable the features that compiler currently uses
uint32_t enabledFeatures [] = {OMR_FEATURE_X86_FPU, OMR_FEATURE_X86_CX8, OMR_FEATURE_X86_CMOV,
OMR_FEATURE_X86_MMX, OMR_FEATURE_X86_SSE, OMR_FEATURE_X86_SSE2,
OMR_FEATURE_X86_SSSE3, OMR_FEATURE_X86_SSE4_1, OMR_FEATURE_X86_POPCNT,
OMR_FEATURE_X86_AESNI, OMR_FEATURE_X86_OSXSAVE, OMR_FEATURE_X86_AVX,
OMR_FEATURE_X86_HLE, OMR_FEATURE_X86_RTM};

uint32_t featureMasks[OMRPORT_SYSINFO_FEATURES_SIZE];
memset(featureMasks, 0, OMRPORT_SYSINFO_FEATURES_SIZE*sizeof(uint32_t));
for (size_t i = 0; i < sizeof(enabledFeatures)/sizeof(uint32_t); i++)
{
uint32_t index = enabledFeatures[i]/32;
uint32_t shift = enabledFeatures[i]%32;
featureMasks[index] |= (static_cast<uint32_t>(1) << shift);
}

OMRPORT_ACCESS_FROM_OMRPORT(omrPortLib);
OMRProcessorDesc processorDescription;
omrsysinfo_get_processor_description(&processorDescription);
for (size_t i = 0; i < OMRPORT_SYSINFO_FEATURES_SIZE; i++)
{
processorDescription.features[i] &= featureMasks[i];
}

return TR::CPU(processorDescription);
}

TR_X86CPUIDBuffer *
OMR::X86::CPU::queryX86TargetCPUID()
{
Expand Down
2 changes: 2 additions & 0 deletions compiler/x/env/OMRCPU.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ class CPU : public OMR::CPU

public:

static TR::CPU detect(OMRPortLibrary * const omrPortLib);

TR_X86CPUIDBuffer *queryX86TargetCPUID();
const char *getX86ProcessorVendorId();
uint32_t getX86ProcessorSignature();
Expand Down
60 changes: 60 additions & 0 deletions compiler/z/env/OMRCPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,65 @@

#include "env/CPU.hpp"

TR::CPU
OMR::Z::CPU::detect(OMRPortLibrary * const omrPortLib)
{
OMRPORT_ACCESS_FROM_OMRPORT(omrPortLib);
OMRProcessorDesc processorDescription;
omrsysinfo_get_processor_description(&processorDescription);

if (processorDescription.processor >= OMR_PROCESSOR_S390_Z10 && TR::Options::getCmdLineOptions()->getOption(TR_DisableZ10))
processorDescription.processor = OMR_PROCESSOR_S390_FIRST;
else if (processorDescription.processor >= OMR_PROCESSOR_S390_Z196 && TR::Options::getCmdLineOptions()->getOption(TR_DisableZ196))
processorDescription.processor = OMR_PROCESSOR_S390_Z10;
else if (processorDescription.processor >= OMR_PROCESSOR_S390_ZEC12 && TR::Options::getCmdLineOptions()->getOption(TR_DisableZEC12))
processorDescription.processor = OMR_PROCESSOR_S390_Z196;
else if (processorDescription.processor >= OMR_PROCESSOR_S390_Z13 && TR::Options::getCmdLineOptions()->getOption(TR_DisableZ13))
processorDescription.processor = OMR_PROCESSOR_S390_ZEC12;
else if (processorDescription.processor >= OMR_PROCESSOR_S390_Z14 && TR::Options::getCmdLineOptions()->getOption(TR_DisableZ14))
processorDescription.processor = OMR_PROCESSOR_S390_Z13;
else if (processorDescription.processor >= OMR_PROCESSOR_S390_Z15 && TR::Options::getCmdLineOptions()->getOption(TR_DisableZ15))
processorDescription.processor = OMR_PROCESSOR_S390_Z14;
else if (processorDescription.processor >= OMR_PROCESSOR_S390_ZNEXT && TR::Options::getCmdLineOptions()->getOption(TR_DisableZNext))
processorDescription.processor = OMR_PROCESSOR_S390_Z15;

if (processorDescription.processor < OMR_PROCESSOR_S390_Z10)
{
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_DFP);
}

if (processorDescription.processor < OMR_PROCESSOR_S390_Z196)
{
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_HIGH_WORD);
}

if (processorDescription.processor < OMR_PROCESSOR_S390_ZEC12)
{
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_TE);
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_RI);
}

if (processorDescription.processor < OMR_PROCESSOR_S390_Z13)
{
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_VECTOR_FACILITY);
}

if (processorDescription.processor < OMR_PROCESSOR_S390_Z14)
{
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_VECTOR_PACKED_DECIMAL);
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_GUARDED_STORAGE);
}

if (processorDescription.processor < OMR_PROCESSOR_S390_Z15)
{
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_MISCELLANEOUS_INSTRUCTION_EXTENSION_3);
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_VECTOR_FACILITY_ENHANCEMENT_2);
omrsysinfo_processor_disable_feature(&processorDescription, OMR_FEATURE_S390_VECTOR_PACKED_DECIMAL_ENHANCEMENT_FACILITY);
}

return TR::CPU(processorDescription);
}

const char*
OMR::Z::CPU::getProcessorName(int32_t machineId)
{
Expand Down Expand Up @@ -403,3 +462,4 @@ OMR::Z::CPU::isTargetWithinBranchRelativeRILRange(intptrj_t targetAddress, intpt
return (targetAddress == sourceAddress + ((intptrj_t)((int32_t)((targetAddress - sourceAddress) / 2))) * 2) &&
(targetAddress % 2 == 0);
}

4 changes: 2 additions & 2 deletions compiler/z/env/OMRCPU.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ class CPU : public OMR::CPU
*/
static const char* getProcessorName(int32_t machineId);

static TR::CPU detect(OMRPortLibrary * const omrPortLib);

public:

bool getSupportsArch(Architecture arch);
Expand Down Expand Up @@ -262,8 +264,6 @@ class CPU : public OMR::CPU

CPU();

protected:

enum
{
// Available = 0x00000001,
Expand Down

0 comments on commit 479d385

Please sign in to comment.