hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp
changeset 5419 f2e8cc8c12ea
parent 5416 5f6377fcfd3e
child 5688 9052dc91ea67
child 5547 f4b087cbb361
equal deleted inserted replaced
5418:c4955cb6ed33 5419:f2e8cc8c12ea
   578 }
   578 }
   579 
   579 
   580 
   580 
   581 void TemplateTable::iload(int n) {
   581 void TemplateTable::iload(int n) {
   582   transition(vtos, itos);
   582   transition(vtos, itos);
   583   debug_only(__ verify_local_tag(frame::TagValue, Llocals, Otos_i, n));
       
   584   __ ld( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
   583   __ ld( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
   585 }
   584 }
   586 
   585 
   587 
   586 
   588 void TemplateTable::lload(int n) {
   587 void TemplateTable::lload(int n) {
   589   transition(vtos, ltos);
   588   transition(vtos, ltos);
   590   assert(n+1 < Argument::n_register_parameters, "would need more code");
   589   assert(n+1 < Argument::n_register_parameters, "would need more code");
   591   debug_only(__ verify_local_tag(frame::TagCategory2, Llocals, Otos_l, n));
       
   592   __ load_unaligned_long(Llocals, Interpreter::local_offset_in_bytes(n+1), Otos_l);
   590   __ load_unaligned_long(Llocals, Interpreter::local_offset_in_bytes(n+1), Otos_l);
   593 }
   591 }
   594 
   592 
   595 
   593 
   596 void TemplateTable::fload(int n) {
   594 void TemplateTable::fload(int n) {
   597   transition(vtos, ftos);
   595   transition(vtos, ftos);
   598   assert(n < Argument::n_register_parameters, "would need more code");
   596   assert(n < Argument::n_register_parameters, "would need more code");
   599   debug_only(__ verify_local_tag(frame::TagValue, Llocals, G3_scratch, n));
       
   600   __ ldf( FloatRegisterImpl::S, Llocals, Interpreter::local_offset_in_bytes(n),     Ftos_f );
   597   __ ldf( FloatRegisterImpl::S, Llocals, Interpreter::local_offset_in_bytes(n),     Ftos_f );
   601 }
   598 }
   602 
   599 
   603 
   600 
   604 void TemplateTable::dload(int n) {
   601 void TemplateTable::dload(int n) {
   605   transition(vtos, dtos);
   602   transition(vtos, dtos);
   606   FloatRegister dst = Ftos_d;
   603   FloatRegister dst = Ftos_d;
   607   debug_only(__ verify_local_tag(frame::TagCategory2, Llocals, G3_scratch, n));
       
   608   __ load_unaligned_double(Llocals, Interpreter::local_offset_in_bytes(n+1), dst);
   604   __ load_unaligned_double(Llocals, Interpreter::local_offset_in_bytes(n+1), dst);
   609 }
   605 }
   610 
   606 
   611 
   607 
   612 void TemplateTable::aload(int n) {
   608 void TemplateTable::aload(int n) {
   613   transition(vtos, atos);
   609   transition(vtos, atos);
   614   debug_only(__ verify_local_tag(frame::TagReference, Llocals, Otos_i, n));
       
   615   __ ld_ptr( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
   610   __ ld_ptr( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
   616 }
   611 }
   617 
   612 
   618 
   613 
   619 void TemplateTable::aload_0() {
   614 void TemplateTable::aload_0() {
   705 }
   700 }
   706 
   701 
   707 
   702 
   708 void TemplateTable::astore() {
   703 void TemplateTable::astore() {
   709   transition(vtos, vtos);
   704   transition(vtos, vtos);
   710   // astore tos can also be a returnAddress, so load and store the tag too
   705   __ load_ptr(0, Otos_i);
   711   __ load_ptr_and_tag(0, Otos_i, Otos_l2);
   706   __ inc(Lesp, Interpreter::stackElementSize);
   712   __ inc(Lesp, Interpreter::stackElementSize());
       
   713   __ verify_oop_or_return_address(Otos_i, G3_scratch);
   707   __ verify_oop_or_return_address(Otos_i, G3_scratch);
   714   locals_index(G3_scratch);
   708   locals_index(G3_scratch);
   715   __ store_local_ptr( G3_scratch, Otos_i, Otos_l2 );
   709   __ store_local_ptr(G3_scratch, Otos_i);
   716 }
   710 }
   717 
   711 
   718 
   712 
   719 void TemplateTable::wide_istore() {
   713 void TemplateTable::wide_istore() {
   720   transition(vtos, vtos);
   714   transition(vtos, vtos);
   748 }
   742 }
   749 
   743 
   750 
   744 
   751 void TemplateTable::wide_astore() {
   745 void TemplateTable::wide_astore() {
   752   transition(vtos, vtos);
   746   transition(vtos, vtos);
   753   // astore tos can also be a returnAddress, so load and store the tag too
   747   __ load_ptr(0, Otos_i);
   754   __ load_ptr_and_tag(0, Otos_i, Otos_l2);
   748   __ inc(Lesp, Interpreter::stackElementSize);
   755   __ inc(Lesp, Interpreter::stackElementSize());
       
   756   __ verify_oop_or_return_address(Otos_i, G3_scratch);
   749   __ verify_oop_or_return_address(Otos_i, G3_scratch);
   757   locals_index_wide(G3_scratch);
   750   locals_index_wide(G3_scratch);
   758   __ store_local_ptr( G3_scratch, Otos_i, Otos_l2 );
   751   __ store_local_ptr(G3_scratch, Otos_i);
   759 }
   752 }
   760 
   753 
   761 
   754 
   762 void TemplateTable::iastore() {
   755 void TemplateTable::iastore() {
   763   transition(itos, vtos);
   756   transition(itos, vtos);
   843   // Store is OK.
   836   // Store is OK.
   844   __ bind(store_ok);
   837   __ bind(store_ok);
   845   do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i, G3_scratch, _bs->kind(), true);
   838   do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i, G3_scratch, _bs->kind(), true);
   846 
   839 
   847   __ ba(false,done);
   840   __ ba(false,done);
   848   __ delayed()->inc(Lesp, 3* Interpreter::stackElementSize()); // adj sp (pops array, index and value)
   841   __ delayed()->inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
   849 
   842 
   850   __ bind(is_null);
   843   __ bind(is_null);
   851   do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), G0, G4_scratch, _bs->kind(), true);
   844   do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), G0, G4_scratch, _bs->kind(), true);
   852 
   845 
   853   __ profile_null_seen(G3_scratch);
   846   __ profile_null_seen(G3_scratch);
   854   __ inc(Lesp, 3* Interpreter::stackElementSize());     // adj sp (pops array, index and value)
   847   __ inc(Lesp, 3* Interpreter::stackElementSize);     // adj sp (pops array, index and value)
   855   __ bind(done);
   848   __ bind(done);
   856 }
   849 }
   857 
   850 
   858 
   851 
   859 void TemplateTable::bastore() {
   852 void TemplateTable::bastore() {
   882 }
   875 }
   883 
   876 
   884 
   877 
   885 void TemplateTable::istore(int n) {
   878 void TemplateTable::istore(int n) {
   886   transition(itos, vtos);
   879   transition(itos, vtos);
   887   __ tag_local(frame::TagValue, Llocals, Otos_i, n);
       
   888   __ st(Otos_i, Llocals, Interpreter::local_offset_in_bytes(n));
   880   __ st(Otos_i, Llocals, Interpreter::local_offset_in_bytes(n));
   889 }
   881 }
   890 
   882 
   891 
   883 
   892 void TemplateTable::lstore(int n) {
   884 void TemplateTable::lstore(int n) {
   893   transition(ltos, vtos);
   885   transition(ltos, vtos);
   894   assert(n+1 < Argument::n_register_parameters, "only handle register cases");
   886   assert(n+1 < Argument::n_register_parameters, "only handle register cases");
   895   __ tag_local(frame::TagCategory2, Llocals, Otos_l, n);
       
   896   __ store_unaligned_long(Otos_l, Llocals, Interpreter::local_offset_in_bytes(n+1));
   887   __ store_unaligned_long(Otos_l, Llocals, Interpreter::local_offset_in_bytes(n+1));
   897 
   888 
   898 }
   889 }
   899 
   890 
   900 
   891 
   901 void TemplateTable::fstore(int n) {
   892 void TemplateTable::fstore(int n) {
   902   transition(ftos, vtos);
   893   transition(ftos, vtos);
   903   assert(n < Argument::n_register_parameters, "only handle register cases");
   894   assert(n < Argument::n_register_parameters, "only handle register cases");
   904   __ tag_local(frame::TagValue, Llocals, Otos_l, n);
       
   905   __ stf(FloatRegisterImpl::S, Ftos_f, Llocals, Interpreter::local_offset_in_bytes(n));
   895   __ stf(FloatRegisterImpl::S, Ftos_f, Llocals, Interpreter::local_offset_in_bytes(n));
   906 }
   896 }
   907 
   897 
   908 
   898 
   909 void TemplateTable::dstore(int n) {
   899 void TemplateTable::dstore(int n) {
   910   transition(dtos, vtos);
   900   transition(dtos, vtos);
   911   FloatRegister src = Ftos_d;
   901   FloatRegister src = Ftos_d;
   912   __ tag_local(frame::TagCategory2, Llocals, Otos_l, n);
       
   913   __ store_unaligned_double(src, Llocals, Interpreter::local_offset_in_bytes(n+1));
   902   __ store_unaligned_double(src, Llocals, Interpreter::local_offset_in_bytes(n+1));
   914 }
   903 }
   915 
   904 
   916 
   905 
   917 void TemplateTable::astore(int n) {
   906 void TemplateTable::astore(int n) {
   918   transition(vtos, vtos);
   907   transition(vtos, vtos);
   919   // astore tos can also be a returnAddress, so load and store the tag too
   908   __ load_ptr(0, Otos_i);
   920   __ load_ptr_and_tag(0, Otos_i, Otos_l2);
   909   __ inc(Lesp, Interpreter::stackElementSize);
   921   __ inc(Lesp, Interpreter::stackElementSize());
       
   922   __ verify_oop_or_return_address(Otos_i, G3_scratch);
   910   __ verify_oop_or_return_address(Otos_i, G3_scratch);
   923   __ store_local_ptr( n, Otos_i, Otos_l2 );
   911   __ store_local_ptr(n, Otos_i);
   924 }
   912 }
   925 
   913 
   926 
   914 
   927 void TemplateTable::pop() {
   915 void TemplateTable::pop() {
   928   transition(vtos, vtos);
   916   transition(vtos, vtos);
   929   __ inc(Lesp, Interpreter::stackElementSize());
   917   __ inc(Lesp, Interpreter::stackElementSize);
   930 }
   918 }
   931 
   919 
   932 
   920 
   933 void TemplateTable::pop2() {
   921 void TemplateTable::pop2() {
   934   transition(vtos, vtos);
   922   transition(vtos, vtos);
   935   __ inc(Lesp, 2 * Interpreter::stackElementSize());
   923   __ inc(Lesp, 2 * Interpreter::stackElementSize);
   936 }
   924 }
   937 
   925 
   938 
   926 
   939 void TemplateTable::dup() {
   927 void TemplateTable::dup() {
   940   transition(vtos, vtos);
   928   transition(vtos, vtos);
   941   // stack: ..., a
   929   // stack: ..., a
   942   // load a and tag
   930   // load a and tag
   943   __ load_ptr_and_tag(0, Otos_i, Otos_l2);
   931   __ load_ptr(0, Otos_i);
   944   __ push_ptr(Otos_i, Otos_l2);
   932   __ push_ptr(Otos_i);
   945   // stack: ..., a, a
   933   // stack: ..., a, a
   946 }
   934 }
   947 
   935 
   948 
   936 
   949 void TemplateTable::dup_x1() {
   937 void TemplateTable::dup_x1() {
   950   transition(vtos, vtos);
   938   transition(vtos, vtos);
   951   // stack: ..., a, b
   939   // stack: ..., a, b
   952   __ load_ptr_and_tag(1, G3_scratch, G4_scratch);   // get a
   940   __ load_ptr( 1, G3_scratch);  // get a
   953   __ load_ptr_and_tag(0, Otos_l1, Otos_l2);         // get b
   941   __ load_ptr( 0, Otos_l1);     // get b
   954   __ store_ptr_and_tag(1, Otos_l1, Otos_l2);        // put b
   942   __ store_ptr(1, Otos_l1);     // put b
   955   __ store_ptr_and_tag(0, G3_scratch, G4_scratch);  // put a - like swap
   943   __ store_ptr(0, G3_scratch);  // put a - like swap
   956   __ push_ptr(Otos_l1, Otos_l2);                    // push b
   944   __ push_ptr(Otos_l1);         // push b
   957   // stack: ..., b, a, b
   945   // stack: ..., b, a, b
   958 }
   946 }
   959 
   947 
   960 
   948 
   961 void TemplateTable::dup_x2() {
   949 void TemplateTable::dup_x2() {
   962   transition(vtos, vtos);
   950   transition(vtos, vtos);
   963   // stack: ..., a, b, c
   951   // stack: ..., a, b, c
   964   // get c and push on stack, reuse registers
   952   // get c and push on stack, reuse registers
   965   __ load_ptr_and_tag(0, G3_scratch, G4_scratch);     // get c
   953   __ load_ptr( 0, G3_scratch);  // get c
   966   __ push_ptr(G3_scratch, G4_scratch);               // push c with tag
   954   __ push_ptr(G3_scratch);      // push c with tag
   967   // stack: ..., a, b, c, c  (c in reg)  (Lesp - 4)
   955   // stack: ..., a, b, c, c  (c in reg)  (Lesp - 4)
   968   // (stack offsets n+1 now)
   956   // (stack offsets n+1 now)
   969   __ load_ptr_and_tag(3, Otos_l1, Otos_l2);          // get a
   957   __ load_ptr( 3, Otos_l1);     // get a
   970   __ store_ptr_and_tag(3, G3_scratch, G4_scratch);   // put c at 3
   958   __ store_ptr(3, G3_scratch);  // put c at 3
   971   // stack: ..., c, b, c, c  (a in reg)
   959   // stack: ..., c, b, c, c  (a in reg)
   972   __ load_ptr_and_tag(2, G3_scratch, G4_scratch);    // get b
   960   __ load_ptr( 2, G3_scratch);  // get b
   973   __ store_ptr_and_tag(2, Otos_l1, Otos_l2);         // put a at 2
   961   __ store_ptr(2, Otos_l1);     // put a at 2
   974   // stack: ..., c, a, c, c  (b in reg)
   962   // stack: ..., c, a, c, c  (b in reg)
   975   __ store_ptr_and_tag(1, G3_scratch, G4_scratch);   // put b at 1
   963   __ store_ptr(1, G3_scratch);  // put b at 1
   976   // stack: ..., c, a, b, c
   964   // stack: ..., c, a, b, c
   977 }
   965 }
   978 
   966 
   979 
   967 
   980 void TemplateTable::dup2() {
   968 void TemplateTable::dup2() {
   981   transition(vtos, vtos);
   969   transition(vtos, vtos);
   982   __ load_ptr_and_tag(1, G3_scratch, G4_scratch);     // get a
   970   __ load_ptr(1, G3_scratch);  // get a
   983   __ load_ptr_and_tag(0, Otos_l1, Otos_l2);           // get b
   971   __ load_ptr(0, Otos_l1);     // get b
   984   __ push_ptr(G3_scratch, G4_scratch);                // push a
   972   __ push_ptr(G3_scratch);     // push a
   985   __ push_ptr(Otos_l1, Otos_l2);                      // push b
   973   __ push_ptr(Otos_l1);        // push b
   986   // stack: ..., a, b, a, b
   974   // stack: ..., a, b, a, b
   987 }
   975 }
   988 
   976 
   989 
   977 
   990 void TemplateTable::dup2_x1() {
   978 void TemplateTable::dup2_x1() {
   991   transition(vtos, vtos);
   979   transition(vtos, vtos);
   992   // stack: ..., a, b, c
   980   // stack: ..., a, b, c
   993   __ load_ptr_and_tag(1, Lscratch, G1_scratch);       // get b
   981   __ load_ptr( 1, Lscratch);    // get b
   994   __ load_ptr_and_tag(2, Otos_l1, Otos_l2);           // get a
   982   __ load_ptr( 2, Otos_l1);     // get a
   995   __ store_ptr_and_tag(2, Lscratch, G1_scratch);      // put b at a
   983   __ store_ptr(2, Lscratch);    // put b at a
   996   // stack: ..., b, b, c
   984   // stack: ..., b, b, c
   997   __ load_ptr_and_tag(0, G3_scratch, G4_scratch);     // get c
   985   __ load_ptr( 0, G3_scratch);  // get c
   998   __ store_ptr_and_tag(1, G3_scratch, G4_scratch);    // put c at b
   986   __ store_ptr(1, G3_scratch);  // put c at b
   999   // stack: ..., b, c, c
   987   // stack: ..., b, c, c
  1000   __ store_ptr_and_tag(0, Otos_l1, Otos_l2);          // put a at c
   988   __ store_ptr(0, Otos_l1);     // put a at c
  1001   // stack: ..., b, c, a
   989   // stack: ..., b, c, a
  1002   __ push_ptr(Lscratch, G1_scratch);                  // push b
   990   __ push_ptr(Lscratch);        // push b
  1003   __ push_ptr(G3_scratch, G4_scratch);                // push c
   991   __ push_ptr(G3_scratch);      // push c
  1004   // stack: ..., b, c, a, b, c
   992   // stack: ..., b, c, a, b, c
  1005 }
   993 }
  1006 
   994 
  1007 
   995 
  1008 // The spec says that these types can be a mixture of category 1 (1 word)
   996 // The spec says that these types can be a mixture of category 1 (1 word)
  1009 // types and/or category 2 types (long and doubles)
   997 // types and/or category 2 types (long and doubles)
  1010 void TemplateTable::dup2_x2() {
   998 void TemplateTable::dup2_x2() {
  1011   transition(vtos, vtos);
   999   transition(vtos, vtos);
  1012   // stack: ..., a, b, c, d
  1000   // stack: ..., a, b, c, d
  1013   __ load_ptr_and_tag(1, Lscratch, G1_scratch);       // get c
  1001   __ load_ptr( 1, Lscratch);    // get c
  1014   __ load_ptr_and_tag(3, Otos_l1, Otos_l2);           // get a
  1002   __ load_ptr( 3, Otos_l1);     // get a
  1015   __ store_ptr_and_tag(3, Lscratch, G1_scratch);      // put c at 3
  1003   __ store_ptr(3, Lscratch);    // put c at 3
  1016   __ store_ptr_and_tag(1, Otos_l1, Otos_l2);          // put a at 1
  1004   __ store_ptr(1, Otos_l1);     // put a at 1
  1017   // stack: ..., c, b, a, d
  1005   // stack: ..., c, b, a, d
  1018   __ load_ptr_and_tag(2, G3_scratch, G4_scratch);     // get b
  1006   __ load_ptr( 2, G3_scratch);  // get b
  1019   __ load_ptr_and_tag(0, Otos_l1, Otos_l2);           // get d
  1007   __ load_ptr( 0, Otos_l1);     // get d
  1020   __ store_ptr_and_tag(0, G3_scratch, G4_scratch);    // put b at 0
  1008   __ store_ptr(0, G3_scratch);  // put b at 0
  1021   __ store_ptr_and_tag(2, Otos_l1, Otos_l2);          // put d at 2
  1009   __ store_ptr(2, Otos_l1);     // put d at 2
  1022   // stack: ..., c, d, a, b
  1010   // stack: ..., c, d, a, b
  1023   __ push_ptr(Lscratch, G1_scratch);                  // push c
  1011   __ push_ptr(Lscratch);        // push c
  1024   __ push_ptr(Otos_l1, Otos_l2);                      // push d
  1012   __ push_ptr(Otos_l1);         // push d
  1025   // stack: ..., c, d, a, b, c, d
  1013   // stack: ..., c, d, a, b, c, d
  1026 }
  1014 }
  1027 
  1015 
  1028 
  1016 
  1029 void TemplateTable::swap() {
  1017 void TemplateTable::swap() {
  1030   transition(vtos, vtos);
  1018   transition(vtos, vtos);
  1031   // stack: ..., a, b
  1019   // stack: ..., a, b
  1032   __ load_ptr_and_tag(1, G3_scratch, G4_scratch);     // get a
  1020   __ load_ptr( 1, G3_scratch);  // get a
  1033   __ load_ptr_and_tag(0, Otos_l1, Otos_l2);           // get b
  1021   __ load_ptr( 0, Otos_l1);     // get b
  1034   __ store_ptr_and_tag(0, G3_scratch, G4_scratch);    // put b
  1022   __ store_ptr(0, G3_scratch);  // put b
  1035   __ store_ptr_and_tag(1, Otos_l1, Otos_l2);          // put a
  1023   __ store_ptr(1, Otos_l1);     // put a
  1036   // stack: ..., b, a
  1024   // stack: ..., b, a
  1037 }
  1025 }
  1038 
  1026 
  1039 
  1027 
  1040 void TemplateTable::iop2(Operation op) {
  1028 void TemplateTable::iop2(Operation op) {
  1043   switch (op) {
  1031   switch (op) {
  1044    case  add:  __  add(O1, Otos_i, Otos_i);  break;
  1032    case  add:  __  add(O1, Otos_i, Otos_i);  break;
  1045    case  sub:  __  sub(O1, Otos_i, Otos_i);  break;
  1033    case  sub:  __  sub(O1, Otos_i, Otos_i);  break;
  1046      // %%%%% Mul may not exist: better to call .mul?
  1034      // %%%%% Mul may not exist: better to call .mul?
  1047    case  mul:  __ smul(O1, Otos_i, Otos_i);  break;
  1035    case  mul:  __ smul(O1, Otos_i, Otos_i);  break;
  1048    case _and:  __  and3(O1, Otos_i, Otos_i);  break;
  1036    case _and:  __ and3(O1, Otos_i, Otos_i);  break;
  1049    case  _or:  __   or3(O1, Otos_i, Otos_i);  break;
  1037    case  _or:  __  or3(O1, Otos_i, Otos_i);  break;
  1050    case _xor:  __  xor3(O1, Otos_i, Otos_i);  break;
  1038    case _xor:  __ xor3(O1, Otos_i, Otos_i);  break;
  1051    case  shl:  __  sll(O1, Otos_i, Otos_i);  break;
  1039    case  shl:  __  sll(O1, Otos_i, Otos_i);  break;
  1052    case  shr:  __  sra(O1, Otos_i, Otos_i);  break;
  1040    case  shr:  __  sra(O1, Otos_i, Otos_i);  break;
  1053    case ushr:  __  srl(O1, Otos_i, Otos_i);  break;
  1041    case ushr:  __  srl(O1, Otos_i, Otos_i);  break;
  1054    default: ShouldNotReachHere();
  1042    default: ShouldNotReachHere();
  1055   }
  1043   }
  1059 void TemplateTable::lop2(Operation op) {
  1047 void TemplateTable::lop2(Operation op) {
  1060   transition(ltos, ltos);
  1048   transition(ltos, ltos);
  1061   __ pop_l(O2);
  1049   __ pop_l(O2);
  1062   switch (op) {
  1050   switch (op) {
  1063 #ifdef _LP64
  1051 #ifdef _LP64
  1064    case  add:  __ add(O2, Otos_l, Otos_l);  break;
  1052    case  add:  __  add(O2, Otos_l, Otos_l);  break;
  1065    case  sub:  __ sub(O2, Otos_l, Otos_l);  break;
  1053    case  sub:  __  sub(O2, Otos_l, Otos_l);  break;
  1066    case _and:  __ and3( O2, Otos_l, Otos_l);  break;
  1054    case _and:  __ and3(O2, Otos_l, Otos_l);  break;
  1067    case  _or:  __  or3( O2, Otos_l, Otos_l);  break;
  1055    case  _or:  __  or3(O2, Otos_l, Otos_l);  break;
  1068    case _xor:  __ xor3( O2, Otos_l, Otos_l);  break;
  1056    case _xor:  __ xor3(O2, Otos_l, Otos_l);  break;
  1069 #else
  1057 #else
  1070    case  add:  __ addcc(O3, Otos_l2, Otos_l2);  __ addc(O2, Otos_l1, Otos_l1);  break;
  1058    case  add:  __ addcc(O3, Otos_l2, Otos_l2);  __ addc(O2, Otos_l1, Otos_l1);  break;
  1071    case  sub:  __ subcc(O3, Otos_l2, Otos_l2);  __ subc(O2, Otos_l1, Otos_l1);  break;
  1059    case  sub:  __ subcc(O3, Otos_l2, Otos_l2);  __ subc(O2, Otos_l1, Otos_l1);  break;
  1072    case _and:  __ and3(  O3, Otos_l2, Otos_l2);  __ and3( O2, Otos_l1, Otos_l1);  break;
  1060    case _and:  __  and3(O3, Otos_l2, Otos_l2);  __ and3(O2, Otos_l1, Otos_l1);  break;
  1073    case  _or:  __  or3(  O3, Otos_l2, Otos_l2);  __  or3( O2, Otos_l1, Otos_l1);  break;
  1061    case  _or:  __   or3(O3, Otos_l2, Otos_l2);  __  or3(O2, Otos_l1, Otos_l1);  break;
  1074    case _xor:  __ xor3(  O3, Otos_l2, Otos_l2);  __ xor3( O2, Otos_l1, Otos_l1);  break;
  1062    case _xor:  __  xor3(O3, Otos_l2, Otos_l2);  __ xor3(O2, Otos_l1, Otos_l1);  break;
  1075 #endif
  1063 #endif
  1076    default: ShouldNotReachHere();
  1064    default: ShouldNotReachHere();
  1077   }
  1065   }
  1078 }
  1066 }
  1079 
  1067 
  1305   transition(vtos, vtos);
  1293   transition(vtos, vtos);
  1306   locals_index(G3_scratch);
  1294   locals_index(G3_scratch);
  1307   __ ldsb(Lbcp, 2, O2);  // load constant
  1295   __ ldsb(Lbcp, 2, O2);  // load constant
  1308   __ access_local_int(G3_scratch, Otos_i);
  1296   __ access_local_int(G3_scratch, Otos_i);
  1309   __ add(Otos_i, O2, Otos_i);
  1297   __ add(Otos_i, O2, Otos_i);
  1310   __ st(Otos_i, G3_scratch, Interpreter::value_offset_in_bytes());    // access_local_int puts E.A. in G3_scratch
  1298   __ st(Otos_i, G3_scratch, 0);    // access_local_int puts E.A. in G3_scratch
  1311 }
  1299 }
  1312 
  1300 
  1313 
  1301 
  1314 void TemplateTable::wide_iinc() {
  1302 void TemplateTable::wide_iinc() {
  1315   transition(vtos, vtos);
  1303   transition(vtos, vtos);
  1316   locals_index_wide(G3_scratch);
  1304   locals_index_wide(G3_scratch);
  1317   __ get_2_byte_integer_at_bcp( 4,  O2, O3, InterpreterMacroAssembler::Signed);
  1305   __ get_2_byte_integer_at_bcp( 4,  O2, O3, InterpreterMacroAssembler::Signed);
  1318   __ access_local_int(G3_scratch, Otos_i);
  1306   __ access_local_int(G3_scratch, Otos_i);
  1319   __ add(Otos_i, O3, Otos_i);
  1307   __ add(Otos_i, O3, Otos_i);
  1320   __ st(Otos_i, G3_scratch, Interpreter::value_offset_in_bytes());    // access_local_int puts E.A. in G3_scratch
  1308   __ st(Otos_i, G3_scratch, 0);    // access_local_int puts E.A. in G3_scratch
  1321 }
  1309 }
  1322 
  1310 
  1323 
  1311 
  1324 void TemplateTable::convert() {
  1312 void TemplateTable::convert() {
  1325 // %%%%% Factor this first part accross platforms
  1313 // %%%%% Factor this first part accross platforms
  1553     __ sub(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()) - (is_wide ? 5 : 3), Otos_i);
  1541     __ sub(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()) - (is_wide ? 5 : 3), Otos_i);
  1554 
  1542 
  1555     // Bump Lbcp to target of JSR
  1543     // Bump Lbcp to target of JSR
  1556     __ add(Lbcp, O1_disp, Lbcp);
  1544     __ add(Lbcp, O1_disp, Lbcp);
  1557     // Push returnAddress for "ret" on stack
  1545     // Push returnAddress for "ret" on stack
  1558     __ push_ptr(Otos_i, G0); // push ptr sized thing plus 0 for tag.
  1546     __ push_ptr(Otos_i);
  1559     // And away we go!
  1547     // And away we go!
  1560     __ dispatch_next(vtos);
  1548     __ dispatch_next(vtos);
  1561     return;
  1549     return;
  1562   }
  1550   }
  1563 
  1551 
  2752   Register Rcache = G3_scratch;
  2740   Register Rcache = G3_scratch;
  2753   Register Roffset = G4_scratch;
  2741   Register Roffset = G4_scratch;
  2754   Register Rflags  = G4_scratch;
  2742   Register Rflags  = G4_scratch;
  2755   Register Rreceiver = Lscratch;
  2743   Register Rreceiver = Lscratch;
  2756 
  2744 
  2757   __ ld_ptr(Llocals, Interpreter::value_offset_in_bytes(), Rreceiver);
  2745   __ ld_ptr(Llocals, 0, Rreceiver);
  2758 
  2746 
  2759   // access constant pool cache  (is resolved)
  2747   // access constant pool cache  (is resolved)
  2760   __ get_cache_and_index_at_bcp(Rcache, G4_scratch, 2);
  2748   __ get_cache_and_index_at_bcp(Rcache, G4_scratch, 2);
  2761   __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset(), Roffset);
  2749   __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset(), Roffset);
  2762   __ add(Lbcp, 1, Lbcp);       // needed to report exception at the correct bcp
  2750   __ add(Lbcp, 1, Lbcp);       // needed to report exception at the correct bcp
  3694 
  3682 
  3695 void TemplateTable::multianewarray() {
  3683 void TemplateTable::multianewarray() {
  3696   transition(vtos, atos);
  3684   transition(vtos, atos);
  3697      // put ndims * wordSize into Lscratch
  3685      // put ndims * wordSize into Lscratch
  3698   __ ldub( Lbcp,     3,               Lscratch);
  3686   __ ldub( Lbcp,     3,               Lscratch);
  3699   __ sll(  Lscratch, Interpreter::logStackElementSize(), Lscratch);
  3687   __ sll(  Lscratch, Interpreter::logStackElementSize, Lscratch);
  3700      // Lesp points past last_dim, so set to O1 to first_dim address
  3688      // Lesp points past last_dim, so set to O1 to first_dim address
  3701   __ add(  Lesp,     Lscratch,        O1);
  3689   __ add(  Lesp,     Lscratch,        O1);
  3702      call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), O1);
  3690      call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), O1);
  3703   __ add(  Lesp,     Lscratch,        Lesp); // pop all dimensions off the stack
  3691   __ add(  Lesp,     Lscratch,        Lesp); // pop all dimensions off the stack
  3704 }
  3692 }