< prev index next >

src/hotspot/cpu/aarch64/vm_version_aarch64.cpp

Print this page
@@ -1,8 +1,9 @@
  /*
   * 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.

@@ -49,25 +50,16 @@
  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;

@@ -221,20 +213,27 @@
    }
  
    // 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);
      }

@@ -259,11 +258,13 @@
    }
  
    // 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 >