< prev index next > src/hotspot/cpu/aarch64/vm_version_aarch64.cpp
Print this page
/*
* Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2020, Red Hat Inc. All rights reserved.
+ * Copyright 2025 Arm Limited and/or its affiliates.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
uintptr_t VM_Version::_pac_mask;
SpinWait VM_Version::_spin_wait;
static SpinWait get_spin_wait_desc() {
- if (strcmp(OnSpinWaitInst, "nop") == 0) {
- return SpinWait(SpinWait::NOP, OnSpinWaitInstCount);
- } else if (strcmp(OnSpinWaitInst, "isb") == 0) {
- return SpinWait(SpinWait::ISB, OnSpinWaitInstCount);
- } else if (strcmp(OnSpinWaitInst, "yield") == 0) {
- return SpinWait(SpinWait::YIELD, OnSpinWaitInstCount);
- } else if (strcmp(OnSpinWaitInst, "none") != 0) {
- vm_exit_during_initialization("The options for OnSpinWaitInst are nop, isb, yield, and none", OnSpinWaitInst);
+ SpinWait spin_wait(OnSpinWaitInst, OnSpinWaitInstCount);
+ if (spin_wait.inst() == SpinWait::SB && !VM_Version::supports_sb()) {
+ vm_exit_during_initialization("OnSpinWaitInst is SB but current CPU does not support SB instruction");
}
- if (!FLAG_IS_DEFAULT(OnSpinWaitInstCount) && OnSpinWaitInstCount > 0) {
- vm_exit_during_initialization("OnSpinWaitInstCount cannot be used for OnSpinWaitInst 'none'");
- }
-
- return SpinWait{};
+ return spin_wait;
}
void VM_Version::initialize() {
_supports_atomic_getset4 = true;
_supports_atomic_getadd4 = true;
}
// Neoverse
// N1: 0xd0c
// N2: 0xd49
+ // N3: 0xd8e
// V1: 0xd40
// V2: 0xd4f
+ // V3: 0xd84
if (_cpu == CPU_ARM && (model_is(0xd0c) || model_is(0xd49) ||
- model_is(0xd40) || model_is(0xd4f))) {
+ model_is(0xd40) || model_is(0xd4f) ||
+ model_is(0xd8e) || model_is(0xd84))) {
if (FLAG_IS_DEFAULT(UseSIMDForMemoryOps)) {
FLAG_SET_DEFAULT(UseSIMDForMemoryOps, true);
}
if (FLAG_IS_DEFAULT(OnSpinWaitInst)) {
- FLAG_SET_DEFAULT(OnSpinWaitInst, "isb");
+ if (model_is(0xd4f) && VM_Version::supports_sb()) {
+ FLAG_SET_DEFAULT(OnSpinWaitInst, "sb");
+ } else {
+ FLAG_SET_DEFAULT(OnSpinWaitInst, "isb");
+ }
}
if (FLAG_IS_DEFAULT(OnSpinWaitInstCount)) {
FLAG_SET_DEFAULT(OnSpinWaitInstCount, 1);
}
}
// Neoverse
// V1: 0xd40
// V2: 0xd4f
- if (_cpu == CPU_ARM && (model_is(0xd40) || model_is(0xd4f))) {
+ // V3: 0xd84
+ if (_cpu == CPU_ARM &&
+ (model_is(0xd40) || model_is(0xd4f) || model_is(0xd84))) {
if (FLAG_IS_DEFAULT(UseCryptoPmullForCRC32)) {
FLAG_SET_DEFAULT(UseCryptoPmullForCRC32, true);
}
if (FLAG_IS_DEFAULT(CodeEntryAlignment)) {
FLAG_SET_DEFAULT(CodeEntryAlignment, 32);
< prev index next >