@@ -547,38 +547,23 @@ int ZeroInterpreter::native_entry(Method* method, intptr_t UNUSED, TRAPS) {
547
547
return 0 ;
548
548
}
549
549
550
- int ZeroInterpreter::accessor_entry (Method* method, intptr_t UNUSED, TRAPS) {
551
- JavaThread *thread = THREAD->as_Java_thread ();
552
- ZeroStack *stack = thread->zero_stack ();
553
- intptr_t *locals = stack->sp ();
554
-
550
+ int ZeroInterpreter::getter_entry (Method* method, intptr_t UNUSED, TRAPS) {
555
551
// Drop into the slow path if we need a safepoint check
556
552
if (SafepointMechanism::should_process (THREAD)) {
557
553
return normal_entry (method, 0 , THREAD);
558
554
}
559
555
560
- // Load the object pointer and drop into the slow path
561
- // if we have a NullPointerException
562
- oop object = LOCALS_OBJECT (0 );
563
- if (object == NULL ) {
564
- return normal_entry (method, 0 , THREAD);
565
- }
566
-
567
- // Read the field index from the bytecode, which looks like this:
556
+ // Read the field index from the bytecode:
568
557
// 0: aload_0
569
558
// 1: getfield
570
559
// 2: index
571
560
// 3: index
572
- // 4: ireturn/areturn/freturn/lreturn/dreturn
561
+ // 4: return
562
+ //
573
563
// NB this is not raw bytecode: index is in machine order
574
- u1 *code = method->code_base ();
575
- assert (code[0 ] == Bytecodes::_aload_0 &&
576
- code[1 ] == Bytecodes::_getfield &&
577
- (code[4 ] == Bytecodes::_ireturn ||
578
- code[4 ] == Bytecodes::_freturn ||
579
- code[4 ] == Bytecodes::_lreturn ||
580
- code[4 ] == Bytecodes::_dreturn ||
581
- code[4 ] == Bytecodes::_areturn), " should do" );
564
+
565
+ assert (method->is_getter (), " Expect the particular bytecode shape" );
566
+ u1* code = method->code_base ();
582
567
u2 index = Bytes::get_native_u2 (&code[2 ]);
583
568
584
569
// Get the entry from the constant pool cache, and drop into
@@ -589,96 +574,154 @@ int ZeroInterpreter::accessor_entry(Method* method, intptr_t UNUSED, TRAPS) {
589
574
return normal_entry (method, 0 , THREAD);
590
575
}
591
576
592
- // Get the result and push it onto the stack
577
+ JavaThread* thread = THREAD->as_Java_thread ();
578
+ ZeroStack* stack = thread->zero_stack ();
579
+ intptr_t * topOfStack = stack->sp ();
580
+
581
+ // Load the object pointer and drop into the slow path
582
+ // if we have a NullPointerException
583
+ oop object = STACK_OBJECT (0 );
584
+ if (object == NULL ) {
585
+ return normal_entry (method, 0 , THREAD);
586
+ }
587
+
588
+ // If needed, allocate additional slot on stack: we already have one
589
+ // for receiver, and double/long need another one.
593
590
switch (entry->flag_state ()) {
594
- case ltos:
595
- case dtos:
596
- stack->overflow_check (1 , CHECK_0);
597
- stack->alloc (wordSize);
598
- break ;
591
+ case ltos:
592
+ case dtos:
593
+ stack->overflow_check (1 , CHECK_0);
594
+ stack->alloc (wordSize);
595
+ topOfStack = stack->sp ();
596
+ break ;
599
597
}
598
+
599
+ // Read the field to stack(0)
600
+ int offset = entry->f2_as_index ();
600
601
if (entry->is_volatile ()) {
601
602
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
602
603
OrderAccess::fence ();
603
604
}
604
605
switch (entry->flag_state ()) {
605
- case ctos:
606
- SET_LOCALS_INT (object->char_field_acquire (entry->f2_as_index ()), 0 );
607
- break ;
608
-
609
- case btos:
610
- case ztos:
611
- SET_LOCALS_INT (object->byte_field_acquire (entry->f2_as_index ()), 0 );
612
- break ;
613
-
614
- case stos:
615
- SET_LOCALS_INT (object->short_field_acquire (entry->f2_as_index ()), 0 );
616
- break ;
617
-
618
- case itos:
619
- SET_LOCALS_INT (object->int_field_acquire (entry->f2_as_index ()), 0 );
620
- break ;
606
+ case btos:
607
+ case ztos: SET_STACK_INT (object->byte_field_acquire (offset), 0 ); break ;
608
+ case ctos: SET_STACK_INT (object->char_field_acquire (offset), 0 ); break ;
609
+ case stos: SET_STACK_INT (object->short_field_acquire (offset), 0 ); break ;
610
+ case itos: SET_STACK_INT (object->int_field_acquire (offset), 0 ); break ;
611
+ case ltos: SET_STACK_LONG (object->long_field_acquire (offset), 0 ); break ;
612
+ case ftos: SET_STACK_FLOAT (object->float_field_acquire (offset), 0 ); break ;
613
+ case dtos: SET_STACK_DOUBLE (object->double_field_acquire (offset), 0 ); break ;
614
+ case atos: SET_STACK_OBJECT (object->obj_field_acquire (offset), 0 ); break ;
615
+ default :
616
+ ShouldNotReachHere ();
617
+ }
618
+ } else {
619
+ switch (entry->flag_state ()) {
620
+ case btos:
621
+ case ztos: SET_STACK_INT (object->byte_field (offset), 0 ); break ;
622
+ case ctos: SET_STACK_INT (object->char_field (offset), 0 ); break ;
623
+ case stos: SET_STACK_INT (object->short_field (offset), 0 ); break ;
624
+ case itos: SET_STACK_INT (object->int_field (offset), 0 ); break ;
625
+ case ltos: SET_STACK_LONG (object->long_field (offset), 0 ); break ;
626
+ case ftos: SET_STACK_FLOAT (object->float_field (offset), 0 ); break ;
627
+ case dtos: SET_STACK_DOUBLE (object->double_field (offset), 0 ); break ;
628
+ case atos: SET_STACK_OBJECT (object->obj_field (offset), 0 ); break ;
629
+ default :
630
+ ShouldNotReachHere ();
631
+ }
632
+ }
621
633
622
- case ltos:
623
- SET_LOCALS_LONG (object-> long_field_acquire (entry-> f2_as_index ()), 0 ) ;
624
- break ;
634
+ // No deoptimized frames on the stack
635
+ return 0 ;
636
+ }
625
637
626
- case ftos:
627
- SET_LOCALS_FLOAT (object->float_field_acquire (entry->f2_as_index ()), 0 );
628
- break ;
638
+ int ZeroInterpreter::setter_entry (Method* method, intptr_t UNUSED, TRAPS) {
639
+ // Drop into the slow path if we need a safepoint check
640
+ if (SafepointMechanism::should_process (THREAD)) {
641
+ return normal_entry (method, 0 , THREAD);
642
+ }
629
643
630
- case dtos:
631
- SET_LOCALS_DOUBLE (object->double_field_acquire (entry->f2_as_index ()), 0 );
632
- break ;
644
+ // Read the field index from the bytecode:
645
+ // 0: aload_0
646
+ // 1: *load_1
647
+ // 2: putfield
648
+ // 3: index
649
+ // 4: index
650
+ // 5: return
651
+ //
652
+ // NB this is not raw bytecode: index is in machine order
633
653
634
- case atos:
635
- SET_LOCALS_OBJECT (object-> obj_field_acquire (entry-> f2_as_index ()), 0 );
636
- break ;
654
+ assert (method-> is_setter (), " Expect the particular bytecode shape " );
655
+ u1* code = method-> code_base ( );
656
+ u2 index = Bytes::get_native_u2 (&code[ 3 ]) ;
637
657
638
- default :
639
- ShouldNotReachHere ();
640
- }
658
+ // Get the entry from the constant pool cache, and drop into
659
+ // the slow path if it has not been resolved
660
+ ConstantPoolCache* cache = method->constants ()->cache ();
661
+ ConstantPoolCacheEntry* entry = cache->entry_at (index);
662
+ if (!entry->is_resolved (Bytecodes::_putfield)) {
663
+ return normal_entry (method, 0 , THREAD);
641
664
}
642
- else {
643
- switch (entry->flag_state ()) {
644
- case ctos:
645
- SET_LOCALS_INT (object->char_field (entry->f2_as_index ()), 0 );
646
- break ;
647
665
648
- case btos:
649
- case ztos:
650
- SET_LOCALS_INT (object->byte_field (entry->f2_as_index ()), 0 );
651
- break ;
652
-
653
- case stos:
654
- SET_LOCALS_INT (object->short_field (entry->f2_as_index ()), 0 );
655
- break ;
656
-
657
- case itos:
658
- SET_LOCALS_INT (object->int_field (entry->f2_as_index ()), 0 );
659
- break ;
666
+ JavaThread* thread = THREAD->as_Java_thread ();
667
+ ZeroStack* stack = thread->zero_stack ();
668
+ intptr_t * topOfStack = stack->sp ();
660
669
670
+ // Figure out where the receiver is. If there is a long/double
671
+ // operand on stack top, then receiver is two slots down.
672
+ oop object = NULL ;
673
+ switch (entry->flag_state ()) {
661
674
case ltos:
662
- SET_LOCALS_LONG (object->long_field (entry->f2_as_index ()), 0 );
663
- break ;
664
-
665
- case ftos:
666
- SET_LOCALS_FLOAT (object->float_field (entry->f2_as_index ()), 0 );
667
- break ;
668
-
669
675
case dtos:
670
- SET_LOCALS_DOUBLE ( object-> double_field (entry-> f2_as_index ()), 0 );
676
+ object = STACK_OBJECT (- 2 );
671
677
break ;
672
-
673
- case atos:
674
- SET_LOCALS_OBJECT (object->obj_field (entry->f2_as_index ()), 0 );
678
+ default :
679
+ object = STACK_OBJECT (-1 );
675
680
break ;
681
+ }
676
682
677
- default :
678
- ShouldNotReachHere ();
683
+ // Load the receiver pointer and drop into the slow path
684
+ // if we have a NullPointerException
685
+ if (object == NULL ) {
686
+ return normal_entry (method, 0 , THREAD);
687
+ }
688
+
689
+ // Store the stack(0) to field
690
+ int offset = entry->f2_as_index ();
691
+ if (entry->is_volatile ()) {
692
+ switch (entry->flag_state ()) {
693
+ case btos: object->release_byte_field_put (offset, STACK_INT (0 )); break ;
694
+ case ztos: object->release_byte_field_put (offset, STACK_INT (0 ) & 1 ); break ; // only store LSB
695
+ case ctos: object->release_char_field_put (offset, STACK_INT (0 )); break ;
696
+ case stos: object->release_short_field_put (offset, STACK_INT (0 )); break ;
697
+ case itos: object->release_int_field_put (offset, STACK_INT (0 )); break ;
698
+ case ltos: object->release_long_field_put (offset, STACK_LONG (0 )); break ;
699
+ case ftos: object->release_float_field_put (offset, STACK_FLOAT (0 )); break ;
700
+ case dtos: object->release_double_field_put (offset, STACK_DOUBLE (0 )); break ;
701
+ case atos: object->release_obj_field_put (offset, STACK_OBJECT (0 )); break ;
702
+ default :
703
+ ShouldNotReachHere ();
704
+ }
705
+ OrderAccess::storeload ();
706
+ } else {
707
+ switch (entry->flag_state ()) {
708
+ case btos: object->byte_field_put (offset, STACK_INT (0 )); break ;
709
+ case ztos: object->byte_field_put (offset, STACK_INT (0 ) & 1 ); break ; // only store LSB
710
+ case ctos: object->char_field_put (offset, STACK_INT (0 )); break ;
711
+ case stos: object->short_field_put (offset, STACK_INT (0 )); break ;
712
+ case itos: object->int_field_put (offset, STACK_INT (0 )); break ;
713
+ case ltos: object->long_field_put (offset, STACK_LONG (0 )); break ;
714
+ case ftos: object->float_field_put (offset, STACK_FLOAT (0 )); break ;
715
+ case dtos: object->double_field_put (offset, STACK_DOUBLE (0 )); break ;
716
+ case atos: object->obj_field_put (offset, STACK_OBJECT (0 )); break ;
717
+ default :
718
+ ShouldNotReachHere ();
679
719
}
680
720
}
681
721
722
+ // Nothing is returned, pop out parameters
723
+ stack->set_sp (stack->sp () + method->size_of_parameters ());
724
+
682
725
// No deoptimized frames on the stack
683
726
return 0 ;
684
727
}
0 commit comments