hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp
changeset 5419 f2e8cc8c12ea
parent 5055 743f38c6e179
child 5688 9052dc91ea67
child 5547 f4b087cbb361
equal deleted inserted replaced
5418:c4955cb6ed33 5419:f2e8cc8c12ea
    56 static inline Address aaddress(int n) {
    56 static inline Address aaddress(int n) {
    57   return iaddress(n);
    57   return iaddress(n);
    58 }
    58 }
    59 
    59 
    60 static inline Address iaddress(Register r) {
    60 static inline Address iaddress(Register r) {
    61   return Address(r14, r, Address::times_8, Interpreter::value_offset_in_bytes());
    61   return Address(r14, r, Address::times_8);
    62 }
    62 }
    63 
    63 
    64 static inline Address laddress(Register r) {
    64 static inline Address laddress(Register r) {
    65   return Address(r14, r, Address::times_8, Interpreter::local_offset_in_bytes(1));
    65   return Address(r14, r, Address::times_8, Interpreter::local_offset_in_bytes(1));
    66 }
    66 }
   416 }
   416 }
   417 
   417 
   418 void TemplateTable::locals_index(Register reg, int offset) {
   418 void TemplateTable::locals_index(Register reg, int offset) {
   419   __ load_unsigned_byte(reg, at_bcp(offset));
   419   __ load_unsigned_byte(reg, at_bcp(offset));
   420   __ negptr(reg);
   420   __ negptr(reg);
   421   if (TaggedStackInterpreter) __ shlptr(reg, 1);  // index = index*2
       
   422 }
   421 }
   423 
   422 
   424 void TemplateTable::iload() {
   423 void TemplateTable::iload() {
   425   transition(vtos, itos);
   424   transition(vtos, itos);
   426   if (RewriteFrequentPairs) {
   425   if (RewriteFrequentPairs) {
   458   }
   457   }
   459 
   458 
   460   // Get the local value into tos
   459   // Get the local value into tos
   461   locals_index(rbx);
   460   locals_index(rbx);
   462   __ movl(rax, iaddress(rbx));
   461   __ movl(rax, iaddress(rbx));
   463   debug_only(__ verify_local_tag(frame::TagValue, rbx));
       
   464 }
   462 }
   465 
   463 
   466 void TemplateTable::fast_iload2() {
   464 void TemplateTable::fast_iload2() {
   467   transition(vtos, itos);
   465   transition(vtos, itos);
   468   locals_index(rbx);
   466   locals_index(rbx);
   469   __ movl(rax, iaddress(rbx));
   467   __ movl(rax, iaddress(rbx));
   470   debug_only(__ verify_local_tag(frame::TagValue, rbx));
       
   471   __ push(itos);
   468   __ push(itos);
   472   locals_index(rbx, 3);
   469   locals_index(rbx, 3);
   473   __ movl(rax, iaddress(rbx));
   470   __ movl(rax, iaddress(rbx));
   474   debug_only(__ verify_local_tag(frame::TagValue, rbx));
       
   475 }
   471 }
   476 
   472 
   477 void TemplateTable::fast_iload() {
   473 void TemplateTable::fast_iload() {
   478   transition(vtos, itos);
   474   transition(vtos, itos);
   479   locals_index(rbx);
   475   locals_index(rbx);
   480   __ movl(rax, iaddress(rbx));
   476   __ movl(rax, iaddress(rbx));
   481   debug_only(__ verify_local_tag(frame::TagValue, rbx));
       
   482 }
   477 }
   483 
   478 
   484 void TemplateTable::lload() {
   479 void TemplateTable::lload() {
   485   transition(vtos, ltos);
   480   transition(vtos, ltos);
   486   locals_index(rbx);
   481   locals_index(rbx);
   487   __ movq(rax, laddress(rbx));
   482   __ movq(rax, laddress(rbx));
   488   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
       
   489 }
   483 }
   490 
   484 
   491 void TemplateTable::fload() {
   485 void TemplateTable::fload() {
   492   transition(vtos, ftos);
   486   transition(vtos, ftos);
   493   locals_index(rbx);
   487   locals_index(rbx);
   494   __ movflt(xmm0, faddress(rbx));
   488   __ movflt(xmm0, faddress(rbx));
   495   debug_only(__ verify_local_tag(frame::TagValue, rbx));
       
   496 }
   489 }
   497 
   490 
   498 void TemplateTable::dload() {
   491 void TemplateTable::dload() {
   499   transition(vtos, dtos);
   492   transition(vtos, dtos);
   500   locals_index(rbx);
   493   locals_index(rbx);
   501   __ movdbl(xmm0, daddress(rbx));
   494   __ movdbl(xmm0, daddress(rbx));
   502   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
       
   503 }
   495 }
   504 
   496 
   505 void TemplateTable::aload() {
   497 void TemplateTable::aload() {
   506   transition(vtos, atos);
   498   transition(vtos, atos);
   507   locals_index(rbx);
   499   locals_index(rbx);
   508   __ movptr(rax, aaddress(rbx));
   500   __ movptr(rax, aaddress(rbx));
   509   debug_only(__ verify_local_tag(frame::TagReference, rbx));
       
   510 }
   501 }
   511 
   502 
   512 void TemplateTable::locals_index_wide(Register reg) {
   503 void TemplateTable::locals_index_wide(Register reg) {
   513   __ movl(reg, at_bcp(2));
   504   __ movl(reg, at_bcp(2));
   514   __ bswapl(reg);
   505   __ bswapl(reg);
   515   __ shrl(reg, 16);
   506   __ shrl(reg, 16);
   516   __ negptr(reg);
   507   __ negptr(reg);
   517   if (TaggedStackInterpreter) __ shlptr(reg, 1);  // index = index*2
       
   518 }
   508 }
   519 
   509 
   520 void TemplateTable::wide_iload() {
   510 void TemplateTable::wide_iload() {
   521   transition(vtos, itos);
   511   transition(vtos, itos);
   522   locals_index_wide(rbx);
   512   locals_index_wide(rbx);
   523   __ movl(rax, iaddress(rbx));
   513   __ movl(rax, iaddress(rbx));
   524   debug_only(__ verify_local_tag(frame::TagValue, rbx));
       
   525 }
   514 }
   526 
   515 
   527 void TemplateTable::wide_lload() {
   516 void TemplateTable::wide_lload() {
   528   transition(vtos, ltos);
   517   transition(vtos, ltos);
   529   locals_index_wide(rbx);
   518   locals_index_wide(rbx);
   530   __ movq(rax, laddress(rbx));
   519   __ movq(rax, laddress(rbx));
   531   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
       
   532 }
   520 }
   533 
   521 
   534 void TemplateTable::wide_fload() {
   522 void TemplateTable::wide_fload() {
   535   transition(vtos, ftos);
   523   transition(vtos, ftos);
   536   locals_index_wide(rbx);
   524   locals_index_wide(rbx);
   537   __ movflt(xmm0, faddress(rbx));
   525   __ movflt(xmm0, faddress(rbx));
   538   debug_only(__ verify_local_tag(frame::TagValue, rbx));
       
   539 }
   526 }
   540 
   527 
   541 void TemplateTable::wide_dload() {
   528 void TemplateTable::wide_dload() {
   542   transition(vtos, dtos);
   529   transition(vtos, dtos);
   543   locals_index_wide(rbx);
   530   locals_index_wide(rbx);
   544   __ movdbl(xmm0, daddress(rbx));
   531   __ movdbl(xmm0, daddress(rbx));
   545   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
       
   546 }
   532 }
   547 
   533 
   548 void TemplateTable::wide_aload() {
   534 void TemplateTable::wide_aload() {
   549   transition(vtos, atos);
   535   transition(vtos, atos);
   550   locals_index_wide(rbx);
   536   locals_index_wide(rbx);
   551   __ movptr(rax, aaddress(rbx));
   537   __ movptr(rax, aaddress(rbx));
   552   debug_only(__ verify_local_tag(frame::TagReference, rbx));
       
   553 }
   538 }
   554 
   539 
   555 void TemplateTable::index_check(Register array, Register index) {
   540 void TemplateTable::index_check(Register array, Register index) {
   556   // destroys rbx
   541   // destroys rbx
   557   // check array
   542   // check array
   652 void TemplateTable::fast_icaload() {
   637 void TemplateTable::fast_icaload() {
   653   transition(vtos, itos);
   638   transition(vtos, itos);
   654   // load index out of locals
   639   // load index out of locals
   655   locals_index(rbx);
   640   locals_index(rbx);
   656   __ movl(rax, iaddress(rbx));
   641   __ movl(rax, iaddress(rbx));
   657   debug_only(__ verify_local_tag(frame::TagValue, rbx));
       
   658 
   642 
   659   // eax: index
   643   // eax: index
   660   // rdx: array
   644   // rdx: array
   661   __ pop_ptr(rdx);
   645   __ pop_ptr(rdx);
   662   index_check(rdx, rax); // kills rbx
   646   index_check(rdx, rax); // kills rbx
   679 }
   663 }
   680 
   664 
   681 void TemplateTable::iload(int n) {
   665 void TemplateTable::iload(int n) {
   682   transition(vtos, itos);
   666   transition(vtos, itos);
   683   __ movl(rax, iaddress(n));
   667   __ movl(rax, iaddress(n));
   684   debug_only(__ verify_local_tag(frame::TagValue, n));
       
   685 }
   668 }
   686 
   669 
   687 void TemplateTable::lload(int n) {
   670 void TemplateTable::lload(int n) {
   688   transition(vtos, ltos);
   671   transition(vtos, ltos);
   689   __ movq(rax, laddress(n));
   672   __ movq(rax, laddress(n));
   690   debug_only(__ verify_local_tag(frame::TagCategory2, n));
       
   691 }
   673 }
   692 
   674 
   693 void TemplateTable::fload(int n) {
   675 void TemplateTable::fload(int n) {
   694   transition(vtos, ftos);
   676   transition(vtos, ftos);
   695   __ movflt(xmm0, faddress(n));
   677   __ movflt(xmm0, faddress(n));
   696   debug_only(__ verify_local_tag(frame::TagValue, n));
       
   697 }
   678 }
   698 
   679 
   699 void TemplateTable::dload(int n) {
   680 void TemplateTable::dload(int n) {
   700   transition(vtos, dtos);
   681   transition(vtos, dtos);
   701   __ movdbl(xmm0, daddress(n));
   682   __ movdbl(xmm0, daddress(n));
   702   debug_only(__ verify_local_tag(frame::TagCategory2, n));
       
   703 }
   683 }
   704 
   684 
   705 void TemplateTable::aload(int n) {
   685 void TemplateTable::aload(int n) {
   706   transition(vtos, atos);
   686   transition(vtos, atos);
   707   __ movptr(rax, aaddress(n));
   687   __ movptr(rax, aaddress(n));
   708   debug_only(__ verify_local_tag(frame::TagReference, n));
       
   709 }
   688 }
   710 
   689 
   711 void TemplateTable::aload_0() {
   690 void TemplateTable::aload_0() {
   712   transition(vtos, atos);
   691   transition(vtos, atos);
   713   // According to bytecode histograms, the pairs:
   692   // According to bytecode histograms, the pairs:
   789 
   768 
   790 void TemplateTable::istore() {
   769 void TemplateTable::istore() {
   791   transition(itos, vtos);
   770   transition(itos, vtos);
   792   locals_index(rbx);
   771   locals_index(rbx);
   793   __ movl(iaddress(rbx), rax);
   772   __ movl(iaddress(rbx), rax);
   794   __ tag_local(frame::TagValue, rbx);
       
   795 }
   773 }
   796 
   774 
   797 void TemplateTable::lstore() {
   775 void TemplateTable::lstore() {
   798   transition(ltos, vtos);
   776   transition(ltos, vtos);
   799   locals_index(rbx);
   777   locals_index(rbx);
   800   __ movq(laddress(rbx), rax);
   778   __ movq(laddress(rbx), rax);
   801   __ tag_local(frame::TagCategory2, rbx);
       
   802 }
   779 }
   803 
   780 
   804 void TemplateTable::fstore() {
   781 void TemplateTable::fstore() {
   805   transition(ftos, vtos);
   782   transition(ftos, vtos);
   806   locals_index(rbx);
   783   locals_index(rbx);
   807   __ movflt(faddress(rbx), xmm0);
   784   __ movflt(faddress(rbx), xmm0);
   808   __ tag_local(frame::TagValue, rbx);
       
   809 }
   785 }
   810 
   786 
   811 void TemplateTable::dstore() {
   787 void TemplateTable::dstore() {
   812   transition(dtos, vtos);
   788   transition(dtos, vtos);
   813   locals_index(rbx);
   789   locals_index(rbx);
   814   __ movdbl(daddress(rbx), xmm0);
   790   __ movdbl(daddress(rbx), xmm0);
   815   __ tag_local(frame::TagCategory2, rbx);
       
   816 }
   791 }
   817 
   792 
   818 void TemplateTable::astore() {
   793 void TemplateTable::astore() {
   819   transition(vtos, vtos);
   794   transition(vtos, vtos);
   820   __ pop_ptr(rax, rdx);    // will need to pop tag too
   795   __ pop_ptr(rax);
   821   locals_index(rbx);
   796   locals_index(rbx);
   822   __ movptr(aaddress(rbx), rax);
   797   __ movptr(aaddress(rbx), rax);
   823   __ tag_local(rdx, rbx);  // store tag from stack, might be returnAddr
       
   824 }
   798 }
   825 
   799 
   826 void TemplateTable::wide_istore() {
   800 void TemplateTable::wide_istore() {
   827   transition(vtos, vtos);
   801   transition(vtos, vtos);
   828   __ pop_i();
   802   __ pop_i();
   829   locals_index_wide(rbx);
   803   locals_index_wide(rbx);
   830   __ movl(iaddress(rbx), rax);
   804   __ movl(iaddress(rbx), rax);
   831   __ tag_local(frame::TagValue, rbx);
       
   832 }
   805 }
   833 
   806 
   834 void TemplateTable::wide_lstore() {
   807 void TemplateTable::wide_lstore() {
   835   transition(vtos, vtos);
   808   transition(vtos, vtos);
   836   __ pop_l();
   809   __ pop_l();
   837   locals_index_wide(rbx);
   810   locals_index_wide(rbx);
   838   __ movq(laddress(rbx), rax);
   811   __ movq(laddress(rbx), rax);
   839   __ tag_local(frame::TagCategory2, rbx);
       
   840 }
   812 }
   841 
   813 
   842 void TemplateTable::wide_fstore() {
   814 void TemplateTable::wide_fstore() {
   843   transition(vtos, vtos);
   815   transition(vtos, vtos);
   844   __ pop_f();
   816   __ pop_f();
   845   locals_index_wide(rbx);
   817   locals_index_wide(rbx);
   846   __ movflt(faddress(rbx), xmm0);
   818   __ movflt(faddress(rbx), xmm0);
   847   __ tag_local(frame::TagValue, rbx);
       
   848 }
   819 }
   849 
   820 
   850 void TemplateTable::wide_dstore() {
   821 void TemplateTable::wide_dstore() {
   851   transition(vtos, vtos);
   822   transition(vtos, vtos);
   852   __ pop_d();
   823   __ pop_d();
   853   locals_index_wide(rbx);
   824   locals_index_wide(rbx);
   854   __ movdbl(daddress(rbx), xmm0);
   825   __ movdbl(daddress(rbx), xmm0);
   855   __ tag_local(frame::TagCategory2, rbx);
       
   856 }
   826 }
   857 
   827 
   858 void TemplateTable::wide_astore() {
   828 void TemplateTable::wide_astore() {
   859   transition(vtos, vtos);
   829   transition(vtos, vtos);
   860   __ pop_ptr(rax, rdx);    // will need to pop tag too
   830   __ pop_ptr(rax);
   861   locals_index_wide(rbx);
   831   locals_index_wide(rbx);
   862   __ movptr(aaddress(rbx), rax);
   832   __ movptr(aaddress(rbx), rax);
   863   __ tag_local(rdx, rbx);  // store tag from stack, might be returnAddr
       
   864 }
   833 }
   865 
   834 
   866 void TemplateTable::iastore() {
   835 void TemplateTable::iastore() {
   867   transition(itos, vtos);
   836   transition(itos, vtos);
   868   __ pop_i(rbx);
   837   __ pop_i(rbx);
   970   // Store a NULL
   939   // Store a NULL
   971   do_oop_store(_masm, element_address, noreg, _bs->kind(), true);
   940   do_oop_store(_masm, element_address, noreg, _bs->kind(), true);
   972 
   941 
   973   // Pop stack arguments
   942   // Pop stack arguments
   974   __ bind(done);
   943   __ bind(done);
   975   __ addptr(rsp, 3 * Interpreter::stackElementSize());
   944   __ addptr(rsp, 3 * Interpreter::stackElementSize);
   976 }
   945 }
   977 
   946 
   978 void TemplateTable::bastore() {
   947 void TemplateTable::bastore() {
   979   transition(itos, vtos);
   948   transition(itos, vtos);
   980   __ pop_i(rbx);
   949   __ pop_i(rbx);
  1008 }
   977 }
  1009 
   978 
  1010 void TemplateTable::istore(int n) {
   979 void TemplateTable::istore(int n) {
  1011   transition(itos, vtos);
   980   transition(itos, vtos);
  1012   __ movl(iaddress(n), rax);
   981   __ movl(iaddress(n), rax);
  1013   __ tag_local(frame::TagValue, n);
       
  1014 }
   982 }
  1015 
   983 
  1016 void TemplateTable::lstore(int n) {
   984 void TemplateTable::lstore(int n) {
  1017   transition(ltos, vtos);
   985   transition(ltos, vtos);
  1018   __ movq(laddress(n), rax);
   986   __ movq(laddress(n), rax);
  1019   __ tag_local(frame::TagCategory2, n);
       
  1020 }
   987 }
  1021 
   988 
  1022 void TemplateTable::fstore(int n) {
   989 void TemplateTable::fstore(int n) {
  1023   transition(ftos, vtos);
   990   transition(ftos, vtos);
  1024   __ movflt(faddress(n), xmm0);
   991   __ movflt(faddress(n), xmm0);
  1025   __ tag_local(frame::TagValue, n);
       
  1026 }
   992 }
  1027 
   993 
  1028 void TemplateTable::dstore(int n) {
   994 void TemplateTable::dstore(int n) {
  1029   transition(dtos, vtos);
   995   transition(dtos, vtos);
  1030   __ movdbl(daddress(n), xmm0);
   996   __ movdbl(daddress(n), xmm0);
  1031   __ tag_local(frame::TagCategory2, n);
       
  1032 }
   997 }
  1033 
   998 
  1034 void TemplateTable::astore(int n) {
   999 void TemplateTable::astore(int n) {
  1035   transition(vtos, vtos);
  1000   transition(vtos, vtos);
  1036   __ pop_ptr(rax, rdx);
  1001   __ pop_ptr(rax);
  1037   __ movptr(aaddress(n), rax);
  1002   __ movptr(aaddress(n), rax);
  1038   __ tag_local(rdx, n);
       
  1039 }
  1003 }
  1040 
  1004 
  1041 void TemplateTable::pop() {
  1005 void TemplateTable::pop() {
  1042   transition(vtos, vtos);
  1006   transition(vtos, vtos);
  1043   __ addptr(rsp, Interpreter::stackElementSize());
  1007   __ addptr(rsp, Interpreter::stackElementSize);
  1044 }
  1008 }
  1045 
  1009 
  1046 void TemplateTable::pop2() {
  1010 void TemplateTable::pop2() {
  1047   transition(vtos, vtos);
  1011   transition(vtos, vtos);
  1048   __ addptr(rsp, 2 * Interpreter::stackElementSize());
  1012   __ addptr(rsp, 2 * Interpreter::stackElementSize);
  1049 }
  1013 }
  1050 
  1014 
  1051 void TemplateTable::dup() {
  1015 void TemplateTable::dup() {
  1052   transition(vtos, vtos);
  1016   transition(vtos, vtos);
  1053   __ load_ptr_and_tag(0, rax, rdx);
  1017   __ load_ptr(0, rax);
  1054   __ push_ptr(rax, rdx);
  1018   __ push_ptr(rax);
  1055   // stack: ..., a, a
  1019   // stack: ..., a, a
  1056 }
  1020 }
  1057 
  1021 
  1058 void TemplateTable::dup_x1() {
  1022 void TemplateTable::dup_x1() {
  1059   transition(vtos, vtos);
  1023   transition(vtos, vtos);
  1060   // stack: ..., a, b
  1024   // stack: ..., a, b
  1061   __ load_ptr_and_tag(0, rax, rdx);  // load b
  1025   __ load_ptr( 0, rax);  // load b
  1062   __ load_ptr_and_tag(1, rcx, rbx);  // load a
  1026   __ load_ptr( 1, rcx);  // load a
  1063   __ store_ptr_and_tag(1, rax, rdx); // store b
  1027   __ store_ptr(1, rax);  // store b
  1064   __ store_ptr_and_tag(0, rcx, rbx); // store a
  1028   __ store_ptr(0, rcx);  // store a
  1065   __ push_ptr(rax, rdx);             // push b
  1029   __ push_ptr(rax);      // push b
  1066   // stack: ..., b, a, b
  1030   // stack: ..., b, a, b
  1067 }
  1031 }
  1068 
  1032 
  1069 void TemplateTable::dup_x2() {
  1033 void TemplateTable::dup_x2() {
  1070   transition(vtos, vtos);
  1034   transition(vtos, vtos);
  1071   // stack: ..., a, b, c
  1035   // stack: ..., a, b, c
  1072   __ load_ptr_and_tag(0, rax, rdx);  // load c
  1036   __ load_ptr( 0, rax);  // load c
  1073   __ load_ptr_and_tag(2, rcx, rbx);  // load a
  1037   __ load_ptr( 2, rcx);  // load a
  1074   __ store_ptr_and_tag(2, rax, rdx); // store c in a
  1038   __ store_ptr(2, rax);  // store c in a
  1075   __ push_ptr(rax, rdx);             // push c
  1039   __ push_ptr(rax);      // push c
  1076   // stack: ..., c, b, c, c
  1040   // stack: ..., c, b, c, c
  1077   __ load_ptr_and_tag(2, rax, rdx);  // load b
  1041   __ load_ptr( 2, rax);  // load b
  1078   __ store_ptr_and_tag(2, rcx, rbx); // store a in b
  1042   __ store_ptr(2, rcx);  // store a in b
  1079   // stack: ..., c, a, c, c
  1043   // stack: ..., c, a, c, c
  1080   __ store_ptr_and_tag(1, rax, rdx); // store b in c
  1044   __ store_ptr(1, rax);  // store b in c
  1081   // stack: ..., c, a, b, c
  1045   // stack: ..., c, a, b, c
  1082 }
  1046 }
  1083 
  1047 
  1084 void TemplateTable::dup2() {
  1048 void TemplateTable::dup2() {
  1085   transition(vtos, vtos);
  1049   transition(vtos, vtos);
  1086   // stack: ..., a, b
  1050   // stack: ..., a, b
  1087   __ load_ptr_and_tag(1, rax, rdx);  // load a
  1051   __ load_ptr(1, rax);  // load a
  1088   __ push_ptr(rax, rdx);             // push a
  1052   __ push_ptr(rax);     // push a
  1089   __ load_ptr_and_tag(1, rax, rdx);  // load b
  1053   __ load_ptr(1, rax);  // load b
  1090   __ push_ptr(rax, rdx);             // push b
  1054   __ push_ptr(rax);     // push b
  1091   // stack: ..., a, b, a, b
  1055   // stack: ..., a, b, a, b
  1092 }
  1056 }
  1093 
  1057 
  1094 void TemplateTable::dup2_x1() {
  1058 void TemplateTable::dup2_x1() {
  1095   transition(vtos, vtos);
  1059   transition(vtos, vtos);
  1096   // stack: ..., a, b, c
  1060   // stack: ..., a, b, c
  1097   __ load_ptr_and_tag(0, rcx, rbx);  // load c
  1061   __ load_ptr( 0, rcx);  // load c
  1098   __ load_ptr_and_tag(1, rax, rdx);  // load b
  1062   __ load_ptr( 1, rax);  // load b
  1099   __ push_ptr(rax, rdx);             // push b
  1063   __ push_ptr(rax);      // push b
  1100   __ push_ptr(rcx, rbx);             // push c
  1064   __ push_ptr(rcx);      // push c
  1101   // stack: ..., a, b, c, b, c
  1065   // stack: ..., a, b, c, b, c
  1102   __ store_ptr_and_tag(3, rcx, rbx); // store c in b
  1066   __ store_ptr(3, rcx);  // store c in b
  1103   // stack: ..., a, c, c, b, c
  1067   // stack: ..., a, c, c, b, c
  1104   __ load_ptr_and_tag(4, rcx, rbx);  // load a
  1068   __ load_ptr( 4, rcx);  // load a
  1105   __ store_ptr_and_tag(2, rcx, rbx); // store a in 2nd c
  1069   __ store_ptr(2, rcx);  // store a in 2nd c
  1106   // stack: ..., a, c, a, b, c
  1070   // stack: ..., a, c, a, b, c
  1107   __ store_ptr_and_tag(4, rax, rdx); // store b in a
  1071   __ store_ptr(4, rax);  // store b in a
  1108   // stack: ..., b, c, a, b, c
  1072   // stack: ..., b, c, a, b, c
  1109 }
  1073 }
  1110 
  1074 
  1111 void TemplateTable::dup2_x2() {
  1075 void TemplateTable::dup2_x2() {
  1112   transition(vtos, vtos);
  1076   transition(vtos, vtos);
  1113   // stack: ..., a, b, c, d
  1077   // stack: ..., a, b, c, d
  1114   __ load_ptr_and_tag(0, rcx, rbx);  // load d
  1078   __ load_ptr( 0, rcx);  // load d
  1115   __ load_ptr_and_tag(1, rax, rdx);  // load c
  1079   __ load_ptr( 1, rax);  // load c
  1116   __ push_ptr(rax, rdx);             // push c
  1080   __ push_ptr(rax);      // push c
  1117   __ push_ptr(rcx, rbx);             // push d
  1081   __ push_ptr(rcx);      // push d
  1118   // stack: ..., a, b, c, d, c, d
  1082   // stack: ..., a, b, c, d, c, d
  1119   __ load_ptr_and_tag(4, rax, rdx);  // load b
  1083   __ load_ptr( 4, rax);  // load b
  1120   __ store_ptr_and_tag(2, rax, rdx); // store b in d
  1084   __ store_ptr(2, rax);  // store b in d
  1121   __ store_ptr_and_tag(4, rcx, rbx); // store d in b
  1085   __ store_ptr(4, rcx);  // store d in b
  1122   // stack: ..., a, d, c, b, c, d
  1086   // stack: ..., a, d, c, b, c, d
  1123   __ load_ptr_and_tag(5, rcx, rbx);  // load a
  1087   __ load_ptr( 5, rcx);  // load a
  1124   __ load_ptr_and_tag(3, rax, rdx);  // load c
  1088   __ load_ptr( 3, rax);  // load c
  1125   __ store_ptr_and_tag(3, rcx, rbx); // store a in c
  1089   __ store_ptr(3, rcx);  // store a in c
  1126   __ store_ptr_and_tag(5, rax, rdx); // store c in a
  1090   __ store_ptr(5, rax);  // store c in a
  1127   // stack: ..., c, d, a, b, c, d
  1091   // stack: ..., c, d, a, b, c, d
  1128 }
  1092 }
  1129 
  1093 
  1130 void TemplateTable::swap() {
  1094 void TemplateTable::swap() {
  1131   transition(vtos, vtos);
  1095   transition(vtos, vtos);
  1132   // stack: ..., a, b
  1096   // stack: ..., a, b
  1133   __ load_ptr_and_tag(1, rcx, rbx);  // load a
  1097   __ load_ptr( 1, rcx);  // load a
  1134   __ load_ptr_and_tag(0, rax, rdx);  // load b
  1098   __ load_ptr( 0, rax);  // load b
  1135   __ store_ptr_and_tag(0, rcx, rbx); // store a in b
  1099   __ store_ptr(0, rcx);  // store a in b
  1136   __ store_ptr_and_tag(1, rax, rdx); // store b in a
  1100   __ store_ptr(1, rax);  // store b in a
  1137   // stack: ..., b, a
  1101   // stack: ..., b, a
  1138 }
  1102 }
  1139 
  1103 
  1140 void TemplateTable::iop2(Operation op) {
  1104 void TemplateTable::iop2(Operation op) {
  1141   transition(itos, itos);
  1105   transition(itos, itos);
  1154 }
  1118 }
  1155 
  1119 
  1156 void TemplateTable::lop2(Operation op) {
  1120 void TemplateTable::lop2(Operation op) {
  1157   transition(ltos, ltos);
  1121   transition(ltos, ltos);
  1158   switch (op) {
  1122   switch (op) {
  1159   case add  :                    __ pop_l(rdx); __ addptr (rax, rdx); break;
  1123   case add  :                    __ pop_l(rdx); __ addptr(rax, rdx); break;
  1160   case sub  : __ mov(rdx, rax);  __ pop_l(rax); __ subptr (rax, rdx); break;
  1124   case sub  : __ mov(rdx, rax);  __ pop_l(rax); __ subptr(rax, rdx); break;
  1161   case _and :                    __ pop_l(rdx); __ andptr (rax, rdx); break;
  1125   case _and :                    __ pop_l(rdx); __ andptr(rax, rdx); break;
  1162   case _or  :                    __ pop_l(rdx); __ orptr  (rax, rdx); break;
  1126   case _or  :                    __ pop_l(rdx); __ orptr (rax, rdx); break;
  1163   case _xor :                    __ pop_l(rdx); __ xorptr (rax, rdx); break;
  1127   case _xor :                    __ pop_l(rdx); __ xorptr(rax, rdx); break;
  1164   default : ShouldNotReachHere();
  1128   default   : ShouldNotReachHere();
  1165   }
  1129   }
  1166 }
  1130 }
  1167 
  1131 
  1168 void TemplateTable::idiv() {
  1132 void TemplateTable::idiv() {
  1169   transition(itos, itos);
  1133   transition(itos, itos);
  1248 void TemplateTable::fop2(Operation op) {
  1212 void TemplateTable::fop2(Operation op) {
  1249   transition(ftos, ftos);
  1213   transition(ftos, ftos);
  1250   switch (op) {
  1214   switch (op) {
  1251   case add:
  1215   case add:
  1252     __ addss(xmm0, at_rsp());
  1216     __ addss(xmm0, at_rsp());
  1253     __ addptr(rsp, Interpreter::stackElementSize());
  1217     __ addptr(rsp, Interpreter::stackElementSize);
  1254     break;
  1218     break;
  1255   case sub:
  1219   case sub:
  1256     __ movflt(xmm1, xmm0);
  1220     __ movflt(xmm1, xmm0);
  1257     __ pop_f(xmm0);
  1221     __ pop_f(xmm0);
  1258     __ subss(xmm0, xmm1);
  1222     __ subss(xmm0, xmm1);
  1259     break;
  1223     break;
  1260   case mul:
  1224   case mul:
  1261     __ mulss(xmm0, at_rsp());
  1225     __ mulss(xmm0, at_rsp());
  1262     __ addptr(rsp, Interpreter::stackElementSize());
  1226     __ addptr(rsp, Interpreter::stackElementSize);
  1263     break;
  1227     break;
  1264   case div:
  1228   case div:
  1265     __ movflt(xmm1, xmm0);
  1229     __ movflt(xmm1, xmm0);
  1266     __ pop_f(xmm0);
  1230     __ pop_f(xmm0);
  1267     __ divss(xmm0, xmm1);
  1231     __ divss(xmm0, xmm1);
  1280 void TemplateTable::dop2(Operation op) {
  1244 void TemplateTable::dop2(Operation op) {
  1281   transition(dtos, dtos);
  1245   transition(dtos, dtos);
  1282   switch (op) {
  1246   switch (op) {
  1283   case add:
  1247   case add:
  1284     __ addsd(xmm0, at_rsp());
  1248     __ addsd(xmm0, at_rsp());
  1285     __ addptr(rsp, 2 * Interpreter::stackElementSize());
  1249     __ addptr(rsp, 2 * Interpreter::stackElementSize);
  1286     break;
  1250     break;
  1287   case sub:
  1251   case sub:
  1288     __ movdbl(xmm1, xmm0);
  1252     __ movdbl(xmm1, xmm0);
  1289     __ pop_d(xmm0);
  1253     __ pop_d(xmm0);
  1290     __ subsd(xmm0, xmm1);
  1254     __ subsd(xmm0, xmm1);
  1291     break;
  1255     break;
  1292   case mul:
  1256   case mul:
  1293     __ mulsd(xmm0, at_rsp());
  1257     __ mulsd(xmm0, at_rsp());
  1294     __ addptr(rsp, 2 * Interpreter::stackElementSize());
  1258     __ addptr(rsp, 2 * Interpreter::stackElementSize);
  1295     break;
  1259     break;
  1296   case div:
  1260   case div:
  1297     __ movdbl(xmm1, xmm0);
  1261     __ movdbl(xmm1, xmm0);
  1298     __ pop_d(xmm0);
  1262     __ pop_d(xmm0);
  1299     __ divsd(xmm0, xmm1);
  1263     __ divsd(xmm0, xmm1);
  2780 void TemplateTable::fast_xaccess(TosState state) {
  2744 void TemplateTable::fast_xaccess(TosState state) {
  2781   transition(vtos, state);
  2745   transition(vtos, state);
  2782 
  2746 
  2783   // get receiver
  2747   // get receiver
  2784   __ movptr(rax, aaddress(0));
  2748   __ movptr(rax, aaddress(0));
  2785   debug_only(__ verify_local_tag(frame::TagReference, 0));
       
  2786   // access constant pool cache
  2749   // access constant pool cache
  2787   __ get_cache_and_index_at_bcp(rcx, rdx, 2);
  2750   __ get_cache_and_index_at_bcp(rcx, rdx, 2);
  2788   __ movptr(rbx,
  2751   __ movptr(rbx,
  2789             Address(rcx, rdx, Address::times_8,
  2752             Address(rcx, rdx, Address::times_8,
  2790                     in_bytes(constantPoolCacheOopDesc::base_offset() +
  2753                     in_bytes(constantPoolCacheOopDesc::base_offset() +
  2856 
  2819 
  2857   // load receiver if needed (note: no return address pushed yet)
  2820   // load receiver if needed (note: no return address pushed yet)
  2858   if (load_receiver) {
  2821   if (load_receiver) {
  2859     __ movl(recv, flags);
  2822     __ movl(recv, flags);
  2860     __ andl(recv, 0xFF);
  2823     __ andl(recv, 0xFF);
  2861     if (TaggedStackInterpreter) __ shll(recv, 1);  // index*2
       
  2862     Address recv_addr(rsp, recv, Address::times_8, -Interpreter::expr_offset_in_bytes(1));
  2824     Address recv_addr(rsp, recv, Address::times_8, -Interpreter::expr_offset_in_bytes(1));
  2863     __ movptr(recv, recv_addr);
  2825     __ movptr(recv, recv_addr);
  2864     __ verify_oop(recv);
  2826     __ verify_oop(recv);
  2865   }
  2827   }
  2866 
  2828 
  3608 void TemplateTable::multianewarray() {
  3570 void TemplateTable::multianewarray() {
  3609   transition(vtos, atos);
  3571   transition(vtos, atos);
  3610   __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
  3572   __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
  3611   // last dim is on top of stack; we want address of first one:
  3573   // last dim is on top of stack; we want address of first one:
  3612   // first_addr = last_addr + (ndims - 1) * wordSize
  3574   // first_addr = last_addr + (ndims - 1) * wordSize
  3613   if (TaggedStackInterpreter) __ shll(rax, 1);  // index*2
       
  3614   __ lea(c_rarg1, Address(rsp, rax, Address::times_8, -wordSize));
  3575   __ lea(c_rarg1, Address(rsp, rax, Address::times_8, -wordSize));
  3615   call_VM(rax,
  3576   call_VM(rax,
  3616           CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray),
  3577           CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray),
  3617           c_rarg1);
  3578           c_rarg1);
  3618   __ load_unsigned_byte(rbx, at_bcp(3));
  3579   __ load_unsigned_byte(rbx, at_bcp(3));
  3619   if (TaggedStackInterpreter) __ shll(rbx, 1);  // index*2
       
  3620   __ lea(rsp, Address(rsp, rbx, Address::times_8));
  3580   __ lea(rsp, Address(rsp, rbx, Address::times_8));
  3621 }
  3581 }
  3622 #endif // !CC_INTERP
  3582 #endif // !CC_INTERP