@@ -819,39 +819,57 @@ class StubGenerator: public StubCodeGenerator {
819819 }
820820
821821 // Generate indices for iota vector.
822- address generate_iota_indices (StubId stub_id) {
822+ void generate_iota_indices (StubId stub_id) {
823+ GrowableArray<address> entries;
823824 int entry_count = StubInfo::entry_count (stub_id);
824- assert (entry_count == 1 , " sanity check" );
825- address start = load_archive_data (stub_id);
825+ assert (entry_count == VECTOR_IOTA_COUNT , " sanity check" );
826+ address start = load_archive_data (stub_id, &entries );
826827 if (start != nullptr ) {
827- return start;
828+ assert (entries.length () == entry_count - 1 ,
829+ " unexpected entries count %d" , entries.length ());
830+ StubRoutines::aarch64::_vector_iota_indices[0 ] = start;
831+ for (int i = 1 ; i < VECTOR_IOTA_COUNT; i++) {
832+ StubRoutines::aarch64::_vector_iota_indices[i] = entries.at (i - 1 );
833+ }
834+ return ;
828835 }
829836 __ align (CodeEntryAlignment);
830837 StubCodeMark mark (this , stub_id);
831838 start = __ pc ();
832839 // B
833840 __ emit_data64 (0x0706050403020100 , relocInfo::none);
834841 __ emit_data64 (0x0F0E0D0C0B0A0908 , relocInfo::none);
842+ entries.append (__ pc ());
835843 // H
836844 __ emit_data64 (0x0003000200010000 , relocInfo::none);
837845 __ emit_data64 (0x0007000600050004 , relocInfo::none);
846+ entries.append (__ pc ());
838847 // S
839848 __ emit_data64 (0x0000000100000000 , relocInfo::none);
840849 __ emit_data64 (0x0000000300000002 , relocInfo::none);
850+ entries.append (__ pc ());
841851 // D
842852 __ emit_data64 (0x0000000000000000 , relocInfo::none);
843853 __ emit_data64 (0x0000000000000001 , relocInfo::none);
854+ entries.append (__ pc ());
844855 // S - FP
845856 __ emit_data64 (0x3F80000000000000 , relocInfo::none); // 0.0f, 1.0f
846857 __ emit_data64 (0x4040000040000000 , relocInfo::none); // 2.0f, 3.0f
858+ entries.append (__ pc ());
847859 // D - FP
848860 __ emit_data64 (0x0000000000000000 , relocInfo::none); // 0.0d
849861 __ emit_data64 (0x3FF0000000000000 , relocInfo::none); // 1.0d
850862
851863 // record the stub entry and end
852- store_archive_data (stub_id, start, __ pc ());
864+ store_archive_data (stub_id, start, __ pc (), &entries );
853865
854- return start;
866+ // install the entry addresses in the entry array
867+ assert (entries.length () == entry_count - 1 ,
868+ " unexpected entries count %d" , entries.length ());
869+ StubRoutines::aarch64::_vector_iota_indices[0 ] = start;
870+ for (int i = 1 ; i < VECTOR_IOTA_COUNT; i++) {
871+ StubRoutines::aarch64::_vector_iota_indices[i] = entries.at (i - 1 );
872+ }
855873 }
856874
857875 // The inner part of zero_words(). This is the bulk operation,
@@ -12621,7 +12639,7 @@ class StubGenerator: public StubCodeGenerator {
1262112639#if COMPILER2_OR_JVMCI
1262212640
1262312641 if (UseSVE == 0 ) {
12624- StubRoutines::aarch64::_vector_iota_indices = generate_iota_indices (StubId::stubgen_vector_iota_indices_id);
12642+ generate_iota_indices (StubId::stubgen_vector_iota_indices_id);
1262512643 }
1262612644
1262712645 // array equals stub for large arrays.
0 commit comments