1 #ifdef USE_PRAGMA_IDENT_SRC
2 #pragma ident "@(#)templateTable_x86_64.cpp 1.58 07/09/17 09:25:59 JVM"
3 #endif
4 /*
5 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
6 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7 *
8 * This code is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License version 2 only, as
10 * published by the Free Software Foundation.
11 *
12 * This code is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 * version 2 for more details (a copy is included in the LICENSE file that
16 * accompanied this code).
17 *
18 * You should have received a copy of the GNU General Public License version
19 * 2 along with this work; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21 *
22 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23 * CA 95054 USA or visit www.sun.com if you need additional information or
24 * have any questions.
25 *
26 */
27
28 #include "incls/_precompiled.incl"
29 #include "incls/_templateTable_x86_64.cpp.incl"
30
31 #define __ _masm->
32
33 // Platform-dependent initialization
34
35 void TemplateTable::pd_initialize() {
36 // No amd64 specific initialization
37 }
38
39 // Address computation: local variables
40
41 static inline Address iaddress(int n) {
42 return Address(r14, Interpreter::local_offset_in_bytes(n));
43 }
44
45 static inline Address laddress(int n) {
46 return iaddress(n + 1);
47 }
48
49 static inline Address faddress(int n) {
50 return iaddress(n);
99 static inline Address at_tos_p3() {
100 return Address(rsp, Interpreter::expr_offset_in_bytes(3));
101 }
102
103 // Condition conversion
104 static Assembler::Condition j_not(TemplateTable::Condition cc) {
105 switch (cc) {
106 case TemplateTable::equal : return Assembler::notEqual;
107 case TemplateTable::not_equal : return Assembler::equal;
108 case TemplateTable::less : return Assembler::greaterEqual;
109 case TemplateTable::less_equal : return Assembler::greater;
110 case TemplateTable::greater : return Assembler::lessEqual;
111 case TemplateTable::greater_equal: return Assembler::less;
112 }
113 ShouldNotReachHere();
114 return Assembler::zero;
115 }
116
117
118 // Miscelaneous helper routines
119
120 Address TemplateTable::at_bcp(int offset) {
121 assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
122 return Address(r13, offset);
123 }
124
125 void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
126 Register scratch,
127 bool load_bc_into_scratch/*=true*/) {
128 if (!RewriteBytecodes) {
129 return;
130 }
131 // the pair bytecodes have already done the load.
132 if (load_bc_into_scratch) {
133 __ movl(bc, bytecode);
134 }
135 Label patch_done;
136 if (JvmtiExport::can_post_breakpoint()) {
137 Label fast_patch;
138 // if a breakpoint is present we can't rewrite the stream directly
303 #ifdef ASSERT
304 {
305 Label L;
306 __ cmpl(rdx, JVM_CONSTANT_Integer);
307 __ jcc(Assembler::equal, L);
308 __ cmpl(rdx, JVM_CONSTANT_String);
309 __ jcc(Assembler::equal, L);
310 __ stop("unexpected tag type in ldc");
311 __ bind(L);
312 }
313 #endif
314 // atos and itos
315 Label isOop;
316 __ cmpl(rdx, JVM_CONSTANT_Integer);
317 __ jcc(Assembler::notEqual, isOop);
318 __ movl(rax, Address(rcx, rbx, Address::times_8, base_offset));
319 __ push_i(rax);
320 __ jmp(Done);
321
322 __ bind(isOop);
323 __ movq(rax, Address(rcx, rbx, Address::times_8, base_offset));
324 __ push_ptr(rax);
325
326 if (VerifyOops) {
327 __ verify_oop(rax);
328 }
329
330 __ bind(Done);
331 }
332
333 void TemplateTable::ldc2_w() {
334 transition(vtos, vtos);
335 Label Long, Done;
336 __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
337
338 __ get_cpool_and_tags(rcx, rax);
339 const int base_offset = constantPoolOopDesc::header_size() * wordSize;
340 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
341
342 // get type
343 __ cmpb(Address(rax, rbx, Address::times_1, tags_offset),
344 JVM_CONSTANT_Double);
345 __ jccb(Assembler::notEqual, Long);
346 // dtos
347 __ movdbl(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
348 __ push_d();
349 __ jmpb(Done);
350
351 __ bind(Long);
352 // ltos
353 __ movq(rax, Address(rcx, rbx, Address::times_8, base_offset));
354 __ push_l();
355
356 __ bind(Done);
357 }
358
359 void TemplateTable::locals_index(Register reg, int offset) {
360 __ load_unsigned_byte(reg, at_bcp(offset));
361 __ negq(reg);
362 if (TaggedStackInterpreter) __ shlq(reg, 1); // index = index*2
363 }
364
365 void TemplateTable::iload() {
366 transition(vtos, itos);
367 if (RewriteFrequentPairs) {
368 Label rewrite, done;
369 const Register bc = c_rarg3;
370 assert(rbx != bc, "register damaged");
371
372 // get next byte
373 __ load_unsigned_byte(rbx,
374 at_bcp(Bytecodes::length_for(Bytecodes::_iload)));
375 // if _iload, wait to rewrite to iload2. We only want to rewrite the
376 // last two iloads in a pair. Comparing against fast_iload means that
377 // the next bytecode is neither an iload or a caload, and therefore
378 // an iload pair.
379 __ cmpl(rbx, Bytecodes::_iload);
380 __ jcc(Assembler::equal, done);
381
382 __ cmpl(rbx, Bytecodes::_fast_iload);
429 debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
430 }
431
432 void TemplateTable::fload() {
433 transition(vtos, ftos);
434 locals_index(rbx);
435 __ movflt(xmm0, faddress(rbx));
436 debug_only(__ verify_local_tag(frame::TagValue, rbx));
437 }
438
439 void TemplateTable::dload() {
440 transition(vtos, dtos);
441 locals_index(rbx);
442 __ movdbl(xmm0, daddress(rbx));
443 debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
444 }
445
446 void TemplateTable::aload() {
447 transition(vtos, atos);
448 locals_index(rbx);
449 __ movq(rax, aaddress(rbx));
450 debug_only(__ verify_local_tag(frame::TagReference, rbx));
451 }
452
453 void TemplateTable::locals_index_wide(Register reg) {
454 __ movl(reg, at_bcp(2));
455 __ bswapl(reg);
456 __ shrl(reg, 16);
457 __ negq(reg);
458 if (TaggedStackInterpreter) __ shlq(reg, 1); // index = index*2
459 }
460
461 void TemplateTable::wide_iload() {
462 transition(vtos, itos);
463 locals_index_wide(rbx);
464 __ movl(rax, iaddress(rbx));
465 debug_only(__ verify_local_tag(frame::TagValue, rbx));
466 }
467
468 void TemplateTable::wide_lload() {
469 transition(vtos, ltos);
470 locals_index_wide(rbx);
471 __ movq(rax, laddress(rbx));
472 debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
473 }
474
475 void TemplateTable::wide_fload() {
476 transition(vtos, ftos);
477 locals_index_wide(rbx);
478 __ movflt(xmm0, faddress(rbx));
479 debug_only(__ verify_local_tag(frame::TagValue, rbx));
480 }
481
482 void TemplateTable::wide_dload() {
483 transition(vtos, dtos);
484 locals_index_wide(rbx);
485 __ movdbl(xmm0, daddress(rbx));
486 debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
487 }
488
489 void TemplateTable::wide_aload() {
490 transition(vtos, atos);
491 locals_index_wide(rbx);
492 __ movq(rax, aaddress(rbx));
493 debug_only(__ verify_local_tag(frame::TagReference, rbx));
494 }
495
496 void TemplateTable::index_check(Register array, Register index) {
497 // destroys rbx
498 // check array
499 __ null_check(array, arrayOopDesc::length_offset_in_bytes());
500 // sign extend index for use by indexed load
501 __ movslq(index, index);
502 // check index
503 __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
504 if (index != rbx) {
505 // ??? convention: move aberrant index into ebx for exception message
506 assert(rbx != array, "different registers");
507 __ movl(rbx, index);
508 }
509 __ jump_cc(Assembler::aboveEqual,
510 ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
511 }
512
513 void TemplateTable::iaload() {
514 transition(itos, itos);
515 __ pop_ptr(rdx);
516 // eax: index
517 // rdx: array
518 index_check(rdx, rax); // kills rbx
519 __ movl(rax, Address(rdx, rax,
520 Address::times_4,
521 arrayOopDesc::base_offset_in_bytes(T_INT)));
543 arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
544 }
545
546 void TemplateTable::daload() {
547 transition(itos, dtos);
548 __ pop_ptr(rdx);
549 // eax: index
550 // rdx: array
551 index_check(rdx, rax); // kills rbx
552 __ movdbl(xmm0, Address(rdx, rax,
553 Address::times_8,
554 arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
555 }
556
557 void TemplateTable::aaload() {
558 transition(itos, atos);
559 __ pop_ptr(rdx);
560 // eax: index
561 // rdx: array
562 index_check(rdx, rax); // kills rbx
563 __ movq(rax, Address(rdx, rax,
564 Address::times_8,
565 arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
566 }
567
568 void TemplateTable::baload() {
569 transition(itos, itos);
570 __ pop_ptr(rdx);
571 // eax: index
572 // rdx: array
573 index_check(rdx, rax); // kills rbx
574 __ load_signed_byte(rax,
575 Address(rdx, rax,
576 Address::times_1,
577 arrayOopDesc::base_offset_in_bytes(T_BYTE)));
578 }
579
580 void TemplateTable::caload() {
581 transition(itos, itos);
582 __ pop_ptr(rdx);
583 // eax: index
584 // rdx: array
628 void TemplateTable::lload(int n) {
629 transition(vtos, ltos);
630 __ movq(rax, laddress(n));
631 debug_only(__ verify_local_tag(frame::TagCategory2, n));
632 }
633
634 void TemplateTable::fload(int n) {
635 transition(vtos, ftos);
636 __ movflt(xmm0, faddress(n));
637 debug_only(__ verify_local_tag(frame::TagValue, n));
638 }
639
640 void TemplateTable::dload(int n) {
641 transition(vtos, dtos);
642 __ movdbl(xmm0, daddress(n));
643 debug_only(__ verify_local_tag(frame::TagCategory2, n));
644 }
645
646 void TemplateTable::aload(int n) {
647 transition(vtos, atos);
648 __ movq(rax, aaddress(n));
649 debug_only(__ verify_local_tag(frame::TagReference, n));
650 }
651
652 void TemplateTable::aload_0() {
653 transition(vtos, atos);
654 // According to bytecode histograms, the pairs:
655 //
656 // _aload_0, _fast_igetfield
657 // _aload_0, _fast_agetfield
658 // _aload_0, _fast_fgetfield
659 //
660 // occur frequently. If RewriteFrequentPairs is set, the (slow)
661 // _aload_0 bytecode checks if the next bytecode is either
662 // _fast_igetfield, _fast_agetfield or _fast_fgetfield and then
663 // rewrites the current bytecode into a pair bytecode; otherwise it
664 // rewrites the current bytecode into _fast_aload_0 that doesn't do
665 // the pair check anymore.
666 //
667 // Note: If the next bytecode is _getfield, the rewrite must be
668 // delayed, otherwise we may miss an opportunity for a pair.
743 }
744
745 void TemplateTable::fstore() {
746 transition(ftos, vtos);
747 locals_index(rbx);
748 __ movflt(faddress(rbx), xmm0);
749 __ tag_local(frame::TagValue, rbx);
750 }
751
752 void TemplateTable::dstore() {
753 transition(dtos, vtos);
754 locals_index(rbx);
755 __ movdbl(daddress(rbx), xmm0);
756 __ tag_local(frame::TagCategory2, rbx);
757 }
758
759 void TemplateTable::astore() {
760 transition(vtos, vtos);
761 __ pop_ptr(rax, rdx); // will need to pop tag too
762 locals_index(rbx);
763 __ movq(aaddress(rbx), rax);
764 __ tag_local(rdx, rbx); // store tag from stack, might be returnAddr
765 }
766
767 void TemplateTable::wide_istore() {
768 transition(vtos, vtos);
769 __ pop_i();
770 locals_index_wide(rbx);
771 __ movl(iaddress(rbx), rax);
772 __ tag_local(frame::TagValue, rbx);
773 }
774
775 void TemplateTable::wide_lstore() {
776 transition(vtos, vtos);
777 __ pop_l();
778 locals_index_wide(rbx);
779 __ movq(laddress(rbx), rax);
780 __ tag_local(frame::TagCategory2, rbx);
781 }
782
783 void TemplateTable::wide_fstore() {
784 transition(vtos, vtos);
785 __ pop_f();
786 locals_index_wide(rbx);
787 __ movflt(faddress(rbx), xmm0);
788 __ tag_local(frame::TagValue, rbx);
789 }
790
791 void TemplateTable::wide_dstore() {
792 transition(vtos, vtos);
793 __ pop_d();
794 locals_index_wide(rbx);
795 __ movdbl(daddress(rbx), xmm0);
796 __ tag_local(frame::TagCategory2, rbx);
797 }
798
799 void TemplateTable::wide_astore() {
800 transition(vtos, vtos);
801 __ pop_ptr(rax, rdx); // will need to pop tag too
802 locals_index_wide(rbx);
803 __ movq(aaddress(rbx), rax);
804 __ tag_local(rdx, rbx); // store tag from stack, might be returnAddr
805 }
806
807 void TemplateTable::iastore() {
808 transition(itos, vtos);
809 __ pop_i(rbx);
810 __ pop_ptr(rdx);
811 // eax: value
812 // ebx: index
813 // rdx: array
814 index_check(rdx, rbx); // prefer index in ebx
815 __ movl(Address(rdx, rbx,
816 Address::times_4,
817 arrayOopDesc::base_offset_in_bytes(T_INT)),
818 rax);
819 }
820
821 void TemplateTable::lastore() {
822 transition(ltos, vtos);
823 __ pop_i(rbx);
847 }
848
849 void TemplateTable::dastore() {
850 transition(dtos, vtos);
851 __ pop_i(rbx);
852 __ pop_ptr(rdx);
853 // xmm0: value
854 // ebx: index
855 // rdx: array
856 index_check(rdx, rbx); // prefer index in ebx
857 __ movdbl(Address(rdx, rbx,
858 Address::times_8,
859 arrayOopDesc::base_offset_in_bytes(T_DOUBLE)),
860 xmm0);
861 }
862
863 void TemplateTable::aastore() {
864 Label is_null, ok_is_subtype, done;
865 transition(vtos, vtos);
866 // stack: ..., array, index, value
867 __ movq(rax, at_tos()); // value
868 __ movl(rcx, at_tos_p1()); // index
869 __ movq(rdx, at_tos_p2()); // array
870 index_check(rdx, rcx); // kills rbx
871 // do array store check - check for NULL value first
872 __ testq(rax, rax);
873 __ jcc(Assembler::zero, is_null);
874
875 // Move subklass into rbx
876 __ movq(rbx, Address(rax, oopDesc::klass_offset_in_bytes()));
877 // Move superklass into rax
878 __ movq(rax, Address(rdx, oopDesc::klass_offset_in_bytes()));
879 __ movq(rax, Address(rax,
880 sizeof(oopDesc) +
881 objArrayKlass::element_klass_offset_in_bytes()));
882 // Compress array + index*8 + 12 into a single register. Frees rcx.
883 __ leaq(rdx, Address(rdx, rcx,
884 Address::times_8,
885 arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
886
887 // Generate subtype check. Blows rcx, rdi
888 // Superklass in rax. Subklass in rbx.
889 __ gen_subtype_check(rbx, ok_is_subtype);
890
891 // Come here on failure
892 // object is at TOS
893 __ jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry));
894
895 // Come here on success
896 __ bind(ok_is_subtype);
897 __ movq(rax, at_tos()); // Value
898 __ movq(Address(rdx, 0), rax);
899 __ store_check(rdx);
900 __ jmp(done);
901
902 // Have a NULL in rax, rdx=array, ecx=index. Store NULL at ary[idx]
903 __ bind(is_null);
904 __ profile_null_seen(rbx);
905 __ movq(Address(rdx, rcx,
906 Address::times_8,
907 arrayOopDesc::base_offset_in_bytes(T_OBJECT)),
908 rax);
909
910 // Pop stack arguments
911 __ bind(done);
912 __ addq(rsp, 3 * Interpreter::stackElementSize());
913 }
914
915 void TemplateTable::bastore() {
916 transition(itos, vtos);
917 __ pop_i(rbx);
918 __ pop_ptr(rdx);
919 // eax: value
920 // ebx: index
921 // rdx: array
922 index_check(rdx, rbx); // prefer index in ebx
923 __ movb(Address(rdx, rbx,
924 Address::times_1,
925 arrayOopDesc::base_offset_in_bytes(T_BYTE)),
926 rax);
927 }
928
929 void TemplateTable::castore() {
930 transition(itos, vtos);
931 __ pop_i(rbx);
932 __ pop_ptr(rdx);
954 transition(ltos, vtos);
955 __ movq(laddress(n), rax);
956 __ tag_local(frame::TagCategory2, n);
957 }
958
959 void TemplateTable::fstore(int n) {
960 transition(ftos, vtos);
961 __ movflt(faddress(n), xmm0);
962 __ tag_local(frame::TagValue, n);
963 }
964
965 void TemplateTable::dstore(int n) {
966 transition(dtos, vtos);
967 __ movdbl(daddress(n), xmm0);
968 __ tag_local(frame::TagCategory2, n);
969 }
970
971 void TemplateTable::astore(int n) {
972 transition(vtos, vtos);
973 __ pop_ptr(rax, rdx);
974 __ movq(aaddress(n), rax);
975 __ tag_local(rdx, n);
976 }
977
978 void TemplateTable::pop() {
979 transition(vtos, vtos);
980 __ addq(rsp, Interpreter::stackElementSize());
981 }
982
983 void TemplateTable::pop2() {
984 transition(vtos, vtos);
985 __ addq(rsp, 2 * Interpreter::stackElementSize());
986 }
987
988 void TemplateTable::dup() {
989 transition(vtos, vtos);
990 __ load_ptr_and_tag(0, rax, rdx);
991 __ push_ptr(rax, rdx);
992 // stack: ..., a, a
993 }
994
995 void TemplateTable::dup_x1() {
996 transition(vtos, vtos);
997 // stack: ..., a, b
998 __ load_ptr_and_tag(0, rax, rdx); // load b
999 __ load_ptr_and_tag(1, rcx, rbx); // load a
1000 __ store_ptr_and_tag(1, rax, rdx); // store b
1001 __ store_ptr_and_tag(0, rcx, rbx); // store a
1002 __ push_ptr(rax, rdx); // push b
1003 // stack: ..., b, a, b
1004 }
1005
1076
1077 void TemplateTable::iop2(Operation op) {
1078 transition(itos, itos);
1079 switch (op) {
1080 case add : __ pop_i(rdx); __ addl (rax, rdx); break;
1081 case sub : __ movl(rdx, rax); __ pop_i(rax); __ subl (rax, rdx); break;
1082 case mul : __ pop_i(rdx); __ imull(rax, rdx); break;
1083 case _and : __ pop_i(rdx); __ andl (rax, rdx); break;
1084 case _or : __ pop_i(rdx); __ orl (rax, rdx); break;
1085 case _xor : __ pop_i(rdx); __ xorl (rax, rdx); break;
1086 case shl : __ movl(rcx, rax); __ pop_i(rax); __ shll (rax); break;
1087 case shr : __ movl(rcx, rax); __ pop_i(rax); __ sarl (rax); break;
1088 case ushr : __ movl(rcx, rax); __ pop_i(rax); __ shrl (rax); break;
1089 default : ShouldNotReachHere();
1090 }
1091 }
1092
1093 void TemplateTable::lop2(Operation op) {
1094 transition(ltos, ltos);
1095 switch (op) {
1096 case add : __ pop_l(rdx); __ addq (rax, rdx); break;
1097 case sub : __ movq(rdx, rax); __ pop_l(rax); __ subq (rax, rdx); break;
1098 case _and : __ pop_l(rdx); __ andq (rax, rdx); break;
1099 case _or : __ pop_l(rdx); __ orq (rax, rdx); break;
1100 case _xor : __ pop_l(rdx); __ xorq (rax, rdx); break;
1101 default : ShouldNotReachHere();
1102 }
1103 }
1104
1105 void TemplateTable::idiv() {
1106 transition(itos, itos);
1107 __ movl(rcx, rax);
1108 __ pop_i(rax);
1109 // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
1110 // they are not equal, one could do a normal division (no correction
1111 // needed), which may speed up this implementation for the common case.
1112 // (see also JVM spec., p.243 & p.271)
1113 __ corrected_idivl(rcx);
1114 }
1115
1116 void TemplateTable::irem() {
1117 transition(itos, itos);
1118 __ movl(rcx, rax);
1119 __ pop_i(rax);
1120 // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
1121 // they are not equal, one could do a normal division (no correction
1122 // needed), which may speed up this implementation for the common case.
1123 // (see also JVM spec., p.243 & p.271)
1124 __ corrected_idivl(rcx);
1125 __ movl(rax, rdx);
1126 }
1127
1128 void TemplateTable::lmul() {
1129 transition(ltos, ltos);
1130 __ pop_l(rdx);
1131 __ imulq(rax, rdx);
1132 }
1133
1134 void TemplateTable::ldiv() {
1135 transition(ltos, ltos);
1136 __ movq(rcx, rax);
1137 __ pop_l(rax);
1138 // generate explicit div0 check
1139 __ testq(rcx, rcx);
1140 __ jump_cc(Assembler::zero,
1141 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1142 // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1143 // they are not equal, one could do a normal division (no correction
1144 // needed), which may speed up this implementation for the common case.
1145 // (see also JVM spec., p.243 & p.271)
1146 __ corrected_idivq(rcx); // kills rbx
1147 }
1148
1149 void TemplateTable::lrem() {
1150 transition(ltos, ltos);
1151 __ movq(rcx, rax);
1152 __ pop_l(rax);
1153 __ testq(rcx, rcx);
1154 __ jump_cc(Assembler::zero,
1155 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1156 // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1157 // they are not equal, one could do a normal division (no correction
1158 // needed), which may speed up this implementation for the common case.
1159 // (see also JVM spec., p.243 & p.271)
1160 __ corrected_idivq(rcx); // kills rbx
1161 __ movq(rax, rdx);
1162 }
1163
1164 void TemplateTable::lshl() {
1165 transition(itos, ltos);
1166 __ movl(rcx, rax); // get shift count
1167 __ pop_l(rax); // get shift value
1168 __ shlq(rax);
1169 }
1170
1171 void TemplateTable::lshr() {
1172 transition(itos, ltos);
1173 __ movl(rcx, rax); // get shift count
1174 __ pop_l(rax); // get shift value
1175 __ sarq(rax);
1176 }
1177
1178 void TemplateTable::lushr() {
1179 transition(itos, ltos);
1180 __ movl(rcx, rax); // get shift count
1181 __ pop_l(rax); // get shift value
1182 __ shrq(rax);
1183 }
1184
1185 void TemplateTable::fop2(Operation op) {
1186 transition(ftos, ftos);
1187 switch (op) {
1188 case add:
1189 __ addss(xmm0, at_rsp());
1190 __ addq(rsp, Interpreter::stackElementSize());
1191 break;
1192 case sub:
1193 __ movflt(xmm1, xmm0);
1194 __ pop_f(xmm0);
1195 __ subss(xmm0, xmm1);
1196 break;
1197 case mul:
1198 __ mulss(xmm0, at_rsp());
1199 __ addq(rsp, Interpreter::stackElementSize());
1200 break;
1201 case div:
1202 __ movflt(xmm1, xmm0);
1203 __ pop_f(xmm0);
1204 __ divss(xmm0, xmm1);
1205 break;
1206 case rem:
1207 __ movflt(xmm1, xmm0);
1208 __ pop_f(xmm0);
1209 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), 2);
1210 break;
1211 default:
1212 ShouldNotReachHere();
1213 break;
1214 }
1215 }
1216
1217 void TemplateTable::dop2(Operation op) {
1218 transition(dtos, dtos);
1219 switch (op) {
1220 case add:
1221 __ addsd(xmm0, at_rsp());
1222 __ addq(rsp, 2 * Interpreter::stackElementSize());
1223 break;
1224 case sub:
1225 __ movdbl(xmm1, xmm0);
1226 __ pop_d(xmm0);
1227 __ subsd(xmm0, xmm1);
1228 break;
1229 case mul:
1230 __ mulsd(xmm0, at_rsp());
1231 __ addq(rsp, 2 * Interpreter::stackElementSize());
1232 break;
1233 case div:
1234 __ movdbl(xmm1, xmm0);
1235 __ pop_d(xmm0);
1236 __ divsd(xmm0, xmm1);
1237 break;
1238 case rem:
1239 __ movdbl(xmm1, xmm0);
1240 __ pop_d(xmm0);
1241 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), 2);
1242 break;
1243 default:
1244 ShouldNotReachHere();
1245 break;
1246 }
1247 }
1248
1249 void TemplateTable::ineg() {
1250 transition(itos, itos);
1251 __ negl(rax);
1472 }
1473
1474 void TemplateTable::branch(bool is_jsr, bool is_wide) {
1475 __ get_method(rcx); // rcx holds method
1476 __ profile_taken_branch(rax, rbx); // rax holds updated MDP, rbx
1477 // holds bumped taken count
1478
1479 const ByteSize be_offset = methodOopDesc::backedge_counter_offset() +
1480 InvocationCounter::counter_offset();
1481 const ByteSize inv_offset = methodOopDesc::invocation_counter_offset() +
1482 InvocationCounter::counter_offset();
1483 const int method_offset = frame::interpreter_frame_method_offset * wordSize;
1484
1485 // Load up edx with the branch displacement
1486 __ movl(rdx, at_bcp(1));
1487 __ bswapl(rdx);
1488
1489 if (!is_wide) {
1490 __ sarl(rdx, 16);
1491 }
1492 __ movslq(rdx, rdx);
1493
1494 // Handle all the JSR stuff here, then exit.
1495 // It's much shorter and cleaner than intermingling with the non-JSR
1496 // normal-branch stuff occuring below.
1497 if (is_jsr) {
1498 // Pre-load the next target bytecode into rbx
1499 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1, 0));
1500
1501 // compute return address as bci in rax
1502 __ leaq(rax, at_bcp((is_wide ? 5 : 3) -
1503 in_bytes(constMethodOopDesc::codes_offset())));
1504 __ subq(rax, Address(rcx, methodOopDesc::const_offset()));
1505 // Adjust the bcp in r13 by the displacement in rdx
1506 __ addq(r13, rdx);
1507 // jsr returns atos that is not an oop
1508 __ push_i(rax);
1509 __ dispatch_only(vtos);
1510 return;
1511 }
1512
1513 // Normal (non-jsr) branch handling
1514
1515 // Adjust the bcp in r13 by the displacement in rdx
1516 __ addq(r13, rdx);
1517
1518 assert(UseLoopCounter || !UseOnStackReplacement,
1519 "on-stack-replacement requires loop counters");
1520 Label backedge_counter_overflow;
1521 Label profile_method;
1522 Label dispatch;
1523 if (UseLoopCounter) {
1524 // increment backedge counter for backward branches
1525 // rax: MDO
1526 // ebx: MDO bumped taken-count
1527 // rcx: method
1528 // rdx: target offset
1529 // r13: target bcp
1530 // r14: locals pointer
1531 __ testl(rdx, rdx); // check if forward or backward branch
1532 __ jcc(Assembler::positive, dispatch); // count only if backward branch
1533
1534 // increment counter
1535 __ movl(rax, Address(rcx, be_offset)); // load backedge counter
1536 __ incrementl(rax, InvocationCounter::count_increment); // increment
1580 __ bind(dispatch);
1581 }
1582
1583 // Pre-load the next target bytecode into rbx
1584 __ load_unsigned_byte(rbx, Address(r13, 0));
1585
1586 // continue with the bytecode @ target
1587 // eax: return bci for jsr's, unused otherwise
1588 // ebx: target bytecode
1589 // r13: target bcp
1590 __ dispatch_only(vtos);
1591
1592 if (UseLoopCounter) {
1593 if (ProfileInterpreter) {
1594 // Out-of-line code to allocate method data oop.
1595 __ bind(profile_method);
1596 __ call_VM(noreg,
1597 CAST_FROM_FN_PTR(address,
1598 InterpreterRuntime::profile_method), r13);
1599 __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode
1600 __ movq(rcx, Address(rbp, method_offset));
1601 __ movq(rcx, Address(rcx,
1602 in_bytes(methodOopDesc::method_data_offset())));
1603 __ movq(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
1604 rcx);
1605 __ test_method_data_pointer(rcx, dispatch);
1606 // offset non-null mdp by MDO::data_offset() + IR::profile_method()
1607 __ addq(rcx, in_bytes(methodDataOopDesc::data_offset()));
1608 __ addq(rcx, rax);
1609 __ movq(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
1610 rcx);
1611 __ jmp(dispatch);
1612 }
1613
1614 if (UseOnStackReplacement) {
1615 // invocation counter overflow
1616 __ bind(backedge_counter_overflow);
1617 __ negq(rdx);
1618 __ addq(rdx, r13); // branch bcp
1619 // IcoResult frequency_counter_overflow([JavaThread*], address branch_bcp)
1620 __ call_VM(noreg,
1621 CAST_FROM_FN_PTR(address,
1622 InterpreterRuntime::frequency_counter_overflow),
1623 rdx);
1624 __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode
1625
1626 // rax: osr nmethod (osr ok) or NULL (osr not possible)
1627 // ebx: target bytecode
1628 // rdx: scratch
1629 // r14: locals pointer
1630 // r13: bcp
1631 __ testq(rax, rax); // test result
1632 __ jcc(Assembler::zero, dispatch); // no osr if null
1633 // nmethod may have been invalidated (VM may block upon call_VM return)
1634 __ movl(rcx, Address(rax, nmethod::entry_bci_offset()));
1635 __ cmpl(rcx, InvalidOSREntryBci);
1636 __ jcc(Assembler::equal, dispatch);
1637
1638 // We have the address of an on stack replacement routine in eax
1639 // We need to prepare to execute the OSR method. First we must
1640 // migrate the locals and monitors off of the stack.
1641
1642 __ movq(r13, rax); // save the nmethod
1643
1644 call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
1645
1646 // eax is OSR buffer, move it to expected parameter location
1647 __ movq(j_rarg0, rax);
1648
1649 // We use j_rarg definitions here so that registers don't conflict as parameter
1650 // registers change across platforms as we are in the midst of a calling
1651 // sequence to the OSR nmethod and we don't want collision. These are NOT parameters.
1652
1653 const Register retaddr = j_rarg2;
1654 const Register sender_sp = j_rarg1;
1655
1656 // pop the interpreter frame
1657 __ movq(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
1658 __ leave(); // remove frame anchor
1659 __ popq(retaddr); // get return address
1660 __ movq(rsp, sender_sp); // set sp to sender sp
1661 // Ensure compiled code always sees stack at proper alignment
1662 __ andq(rsp, -(StackAlignmentInBytes));
1663
1664 // unlike x86 we need no specialized return from compiled code
1665 // to the interpreter or the call stub.
1666
1667 // push the return address
1668 __ pushq(retaddr);
1669
1670 // and begin the OSR nmethod
1671 __ jmp(Address(r13, nmethod::osr_entry_point_offset()));
1672 }
1673 }
1674 }
1675
1676
1677 void TemplateTable::if_0cmp(Condition cc) {
1678 transition(itos, vtos);
1679 // assume branch is more often taken than not (loops use backward branches)
1680 Label not_taken;
1681 __ testl(rax, rax);
1682 __ jcc(j_not(cc), not_taken);
1683 branch(false, false);
1684 __ bind(not_taken);
1685 __ profile_not_taken_branch(rax);
1686 }
1687
1688 void TemplateTable::if_icmp(Condition cc) {
1689 transition(itos, vtos);
1690 // assume branch is more often taken than not (loops use backward branches)
1691 Label not_taken;
1692 __ pop_i(rdx);
1693 __ cmpl(rdx, rax);
1694 __ jcc(j_not(cc), not_taken);
1695 branch(false, false);
1696 __ bind(not_taken);
1697 __ profile_not_taken_branch(rax);
1698 }
1699
1700 void TemplateTable::if_nullcmp(Condition cc) {
1701 transition(atos, vtos);
1702 // assume branch is more often taken than not (loops use backward branches)
1703 Label not_taken;
1704 __ testq(rax, rax);
1705 __ jcc(j_not(cc), not_taken);
1706 branch(false, false);
1707 __ bind(not_taken);
1708 __ profile_not_taken_branch(rax);
1709 }
1710
1711 void TemplateTable::if_acmp(Condition cc) {
1712 transition(atos, vtos);
1713 // assume branch is more often taken than not (loops use backward branches)
1714 Label not_taken;
1715 __ pop_ptr(rdx);
1716 __ cmpq(rdx, rax);
1717 __ jcc(j_not(cc), not_taken);
1718 branch(false, false);
1719 __ bind(not_taken);
1720 __ profile_not_taken_branch(rax);
1721 }
1722
1723 void TemplateTable::ret() {
1724 transition(vtos, vtos);
1725 locals_index(rbx);
1726 __ movq(rbx, aaddress(rbx)); // get return bci, compute return bcp
1727 __ profile_ret(rbx, rcx);
1728 __ get_method(rax);
1729 __ movq(r13, Address(rax, methodOopDesc::const_offset()));
1730 __ leaq(r13, Address(r13, rbx, Address::times_1,
1731 constMethodOopDesc::codes_offset()));
1732 __ dispatch_next(vtos);
1733 }
1734
1735 void TemplateTable::wide_ret() {
1736 transition(vtos, vtos);
1737 locals_index_wide(rbx);
1738 __ movq(rbx, aaddress(rbx)); // get return bci, compute return bcp
1739 __ profile_ret(rbx, rcx);
1740 __ get_method(rax);
1741 __ movq(r13, Address(rax, methodOopDesc::const_offset()));
1742 __ leaq(r13, Address(r13, rbx, Address::times_1, constMethodOopDesc::codes_offset()));
1743 __ dispatch_next(vtos);
1744 }
1745
1746 void TemplateTable::tableswitch() {
1747 Label default_case, continue_execution;
1748 transition(itos, vtos);
1749 // align r13
1750 __ leaq(rbx, at_bcp(BytesPerInt));
1751 __ andq(rbx, -BytesPerInt);
1752 // load lo & hi
1753 __ movl(rcx, Address(rbx, BytesPerInt));
1754 __ movl(rdx, Address(rbx, 2 * BytesPerInt));
1755 __ bswapl(rcx);
1756 __ bswapl(rdx);
1757 // check against lo & hi
1758 __ cmpl(rax, rcx);
1759 __ jcc(Assembler::less, default_case);
1760 __ cmpl(rax, rdx);
1761 __ jcc(Assembler::greater, default_case);
1762 // lookup dispatch offset
1763 __ subl(rax, rcx);
1764 __ movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt));
1765 __ profile_switch_case(rax, rbx, rcx);
1766 // continue execution
1767 __ bind(continue_execution);
1768 __ bswapl(rdx);
1769 __ movslq(rdx, rdx);
1770 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
1771 __ addq(r13, rdx);
1772 __ dispatch_only(vtos);
1773 // handle default
1774 __ bind(default_case);
1775 __ profile_switch_default(rax);
1776 __ movl(rdx, Address(rbx, 0));
1777 __ jmp(continue_execution);
1778 }
1779
1780 void TemplateTable::lookupswitch() {
1781 transition(itos, itos);
1782 __ stop("lookupswitch bytecode should have been rewritten");
1783 }
1784
1785 void TemplateTable::fast_linearswitch() {
1786 transition(itos, vtos);
1787 Label loop_entry, loop, found, continue_execution;
1788 // bswap rax so we can avoid bswapping the table entries
1789 __ bswapl(rax);
1790 // align r13
1791 __ leaq(rbx, at_bcp(BytesPerInt)); // btw: should be able to get rid of
1792 // this instruction (change offsets
1793 // below)
1794 __ andq(rbx, -BytesPerInt);
1795 // set counter
1796 __ movl(rcx, Address(rbx, BytesPerInt));
1797 __ bswapl(rcx);
1798 __ jmpb(loop_entry);
1799 // table search
1800 __ bind(loop);
1801 __ cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * BytesPerInt));
1802 __ jcc(Assembler::equal, found);
1803 __ bind(loop_entry);
1804 __ decrementl(rcx);
1805 __ jcc(Assembler::greaterEqual, loop);
1806 // default case
1807 __ profile_switch_default(rax);
1808 __ movl(rdx, Address(rbx, 0));
1809 __ jmp(continue_execution);
1810 // entry found -> get offset
1811 __ bind(found);
1812 __ movl(rdx, Address(rbx, rcx, Address::times_8, 3 * BytesPerInt));
1813 __ profile_switch_case(rcx, rax, rbx);
1814 // continue execution
1815 __ bind(continue_execution);
1816 __ bswapl(rdx);
1817 __ movslq(rdx, rdx);
1818 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
1819 __ addq(r13, rdx);
1820 __ dispatch_only(vtos);
1821 }
1822
1823 void TemplateTable::fast_binaryswitch() {
1824 transition(itos, vtos);
1825 // Implementation using the following core algorithm:
1826 //
1827 // int binary_search(int key, LookupswitchPair* array, int n) {
1828 // // Binary search according to "Methodik des Programmierens" by
1829 // // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
1830 // int i = 0;
1831 // int j = n;
1832 // while (i+1 < j) {
1833 // // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
1834 // // with Q: for all i: 0 <= i < n: key < a[i]
1835 // // where a stands for the array and assuming that the (inexisting)
1836 // // element a[n] is infinitely big.
1837 // int h = (i + j) >> 1;
1838 // // i < h < j
1839 // if (key < array[h].fast_match()) {
1840 // j = h;
1841 // } else {
1842 // i = h;
1843 // }
1844 // }
1845 // // R: a[i] <= key < a[i+1] or Q
1846 // // (i.e., if key is within array, i is the correct index)
1847 // return i;
1848 // }
1849
1850 // Register allocation
1851 const Register key = rax; // already set (tosca)
1852 const Register array = rbx;
1853 const Register i = rcx;
1854 const Register j = rdx;
1855 const Register h = rdi;
1856 const Register temp = rsi;
1857
1858 // Find array start
1859 __ leaq(array, at_bcp(3 * BytesPerInt)); // btw: should be able to
1860 // get rid of this
1861 // instruction (change
1862 // offsets below)
1863 __ andq(array, -BytesPerInt);
1864
1865 // Initialize i & j
1866 __ xorl(i, i); // i = 0;
1867 __ movl(j, Address(array, -BytesPerInt)); // j = length(array);
1868
1869 // Convert j into native byteordering
1870 __ bswapl(j);
1871
1872 // And start
1873 Label entry;
1874 __ jmp(entry);
1875
1876 // binary search loop
1877 {
1878 Label loop;
1879 __ bind(loop);
1880 // int h = (i + j) >> 1;
1881 __ leal(h, Address(i, j, Address::times_1)); // h = i + j;
1882 __ sarl(h, 1); // h = (i + j) >> 1;
1883 // if (key < array[h].fast_match()) {
1895 __ cmovl(Assembler::greaterEqual, i, h);
1896 // while (i+1 < j)
1897 __ bind(entry);
1898 __ leal(h, Address(i, 1)); // i+1
1899 __ cmpl(h, j); // i+1 < j
1900 __ jcc(Assembler::less, loop);
1901 }
1902
1903 // end of binary search, result index is i (must check again!)
1904 Label default_case;
1905 // Convert array[i].match to native byte-ordering before compare
1906 __ movl(temp, Address(array, i, Address::times_8));
1907 __ bswapl(temp);
1908 __ cmpl(key, temp);
1909 __ jcc(Assembler::notEqual, default_case);
1910
1911 // entry found -> j = offset
1912 __ movl(j , Address(array, i, Address::times_8, BytesPerInt));
1913 __ profile_switch_case(i, key, array);
1914 __ bswapl(j);
1915 __ movslq(j, j);
1916 __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
1917 __ addq(r13, j);
1918 __ dispatch_only(vtos);
1919
1920 // default case -> j = default offset
1921 __ bind(default_case);
1922 __ profile_switch_default(i);
1923 __ movl(j, Address(array, -2 * BytesPerInt));
1924 __ bswapl(j);
1925 __ movslq(j, j);
1926 __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
1927 __ addq(r13, j);
1928 __ dispatch_only(vtos);
1929 }
1930
1931
1932 void TemplateTable::_return(TosState state) {
1933 transition(state, state);
1934 assert(_desc->calls_vm(),
1935 "inconsistent calls_vm information"); // call in remove_activation
1936
1937 if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
1938 assert(state == vtos, "only valid state");
1939 __ movq(c_rarg1, aaddress(0));
1940 __ movq(rdi, Address(c_rarg1, oopDesc::klass_offset_in_bytes()));
1941 __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
1942 __ testl(rdi, JVM_ACC_HAS_FINALIZER);
1943 Label skip_register_finalizer;
1944 __ jcc(Assembler::zero, skip_register_finalizer);
1945
1946 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1);
1947
1948 __ bind(skip_register_finalizer);
1949 }
1950
1951 __ remove_activation(state, r13);
1952 __ jmp(r13);
1953 }
1954
1955 // ----------------------------------------------------------------------------
1956 // Volatile variables demand their effects be made known to all CPU's
1957 // in order. Store buffers on most chips allow reads & writes to
1958 // reorder; the JMM's ReadAfterWrite.java test fails in -Xint mode
1959 // without some kind of memory barrier (i.e., it's not sufficient that
1960 // the interpreter does not reorder volatile references, the hardware
2030 }
2031 __ movl(temp, (int) bytecode());
2032 __ call_VM(noreg, entry, temp);
2033
2034 // Update registers with resolved info
2035 __ get_cache_and_index_at_bcp(Rcache, index, 1);
2036 __ bind(resolved);
2037 }
2038
2039 // The Rcache and index registers must be set before call
2040 void TemplateTable::load_field_cp_cache_entry(Register obj,
2041 Register cache,
2042 Register index,
2043 Register off,
2044 Register flags,
2045 bool is_static = false) {
2046 assert_different_registers(cache, index, flags, off);
2047
2048 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
2049 // Field offset
2050 __ movq(off, Address(cache, index, Address::times_8,
2051 in_bytes(cp_base_offset +
2052 ConstantPoolCacheEntry::f2_offset())));
2053 // Flags
2054 __ movl(flags, Address(cache, index, Address::times_8,
2055 in_bytes(cp_base_offset +
2056 ConstantPoolCacheEntry::flags_offset())));
2057
2058 // klass overwrite register
2059 if (is_static) {
2060 __ movq(obj, Address(cache, index, Address::times_8,
2061 in_bytes(cp_base_offset +
2062 ConstantPoolCacheEntry::f1_offset())));
2063 }
2064 }
2065
2066 void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
2067 Register method,
2068 Register itable_index,
2069 Register flags,
2070 bool is_invokevirtual,
2071 bool is_invokevfinal /*unused*/) {
2072 // setup registers
2073 const Register cache = rcx;
2074 const Register index = rdx;
2075 assert_different_registers(method, flags);
2076 assert_different_registers(method, cache, index);
2077 assert_different_registers(itable_index, flags);
2078 assert_different_registers(itable_index, cache, index);
2079 // determine constant pool cache field offsets
2080 const int method_offset = in_bytes(
2081 constantPoolCacheOopDesc::base_offset() +
2082 (is_invokevirtual
2083 ? ConstantPoolCacheEntry::f2_offset()
2084 : ConstantPoolCacheEntry::f1_offset()));
2085 const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2086 ConstantPoolCacheEntry::flags_offset());
2087 // access constant pool cache fields
2088 const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2089 ConstantPoolCacheEntry::f2_offset());
2090
2091 resolve_cache_and_index(byte_no, cache, index);
2092
2093 assert(wordSize == 8, "adjust code below");
2094 __ movq(method, Address(cache, index, Address::times_8, method_offset));
2095 if (itable_index != noreg) {
2096 __ movq(itable_index,
2097 Address(cache, index, Address::times_8, index_offset));
2098 }
2099 __ movl(flags , Address(cache, index, Address::times_8, flags_offset));
2100 }
2101
2102
2103 // The registers cache and index expected to be set before call.
2104 // Correct values of the cache and index registers are preserved.
2105 void TemplateTable::jvmti_post_field_access(Register cache, Register index,
2106 bool is_static, bool has_tos) {
2107 // do the JVMTI work here to avoid disturbing the register state below
2108 // We use c_rarg registers here because we want to use the register used in
2109 // the call to the VM
2110 if (JvmtiExport::can_post_field_access()) {
2111 // Check to see if a field access watch has been set before we
2112 // take the time to call into the VM.
2113 Label L1;
2114 assert_different_registers(cache, index, rax);
2115 __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2116 __ testl(rax, rax);
2117 __ jcc(Assembler::zero, L1);
2118
2119 __ get_cache_and_index_at_bcp(c_rarg2, c_rarg3, 1);
2120
2121 // cache entry pointer
2122 __ addq(c_rarg2, in_bytes(constantPoolCacheOopDesc::base_offset()));
2123 __ shll(c_rarg3, LogBytesPerWord);
2124 __ addq(c_rarg2, c_rarg3);
2125 if (is_static) {
2126 __ xorl(c_rarg1, c_rarg1); // NULL object reference
2127 } else {
2128 __ movq(c_rarg1, at_tos()); // get object pointer without popping it
2129 __ verify_oop(c_rarg1);
2130 }
2131 // c_rarg1: object pointer or NULL
2132 // c_rarg2: cache entry pointer
2133 // c_rarg3: jvalue object on the stack
2134 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
2135 InterpreterRuntime::post_field_access),
2136 c_rarg1, c_rarg2, c_rarg3);
2137 __ get_cache_and_index_at_bcp(cache, index, 1);
2138 __ bind(L1);
2139 }
2140 }
2141
2142 void TemplateTable::pop_and_check_object(Register r) {
2143 __ pop_ptr(r);
2144 __ null_check(r); // for field access must check obj.
2145 __ verify_oop(r);
2146 }
2147
2148 void TemplateTable::getfield_or_static(int byte_no, bool is_static) {
2170 notLong, notFloat, notObj, notDouble;
2171
2172 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2173 assert(btos == 0, "change code, btos != 0");
2174
2175 __ andl(flags, 0x0F);
2176 __ jcc(Assembler::notZero, notByte);
2177 // btos
2178 __ load_signed_byte(rax, field);
2179 __ push(btos);
2180 // Rewrite bytecode to be faster
2181 if (!is_static) {
2182 patch_bytecode(Bytecodes::_fast_bgetfield, bc, rbx);
2183 }
2184 __ jmp(Done);
2185
2186 __ bind(notByte);
2187 __ cmpl(flags, atos);
2188 __ jcc(Assembler::notEqual, notObj);
2189 // atos
2190 __ movq(rax, field);
2191 __ push(atos);
2192 if (!is_static) {
2193 patch_bytecode(Bytecodes::_fast_agetfield, bc, rbx);
2194 }
2195 __ jmp(Done);
2196
2197 __ bind(notObj);
2198 __ cmpl(flags, itos);
2199 __ jcc(Assembler::notEqual, notInt);
2200 // itos
2201 __ movl(rax, field);
2202 __ push(itos);
2203 // Rewrite bytecode to be faster
2204 if (!is_static) {
2205 patch_bytecode(Bytecodes::_fast_igetfield, bc, rbx);
2206 }
2207 __ jmp(Done);
2208
2209 __ bind(notInt);
2210 __ cmpl(flags, ctos);
2305 __ jcc(Assembler::zero, L1);
2306
2307 __ get_cache_and_index_at_bcp(c_rarg2, rscratch1, 1);
2308
2309 if (is_static) {
2310 // Life is simple. Null out the object pointer.
2311 __ xorl(c_rarg1, c_rarg1);
2312 } else {
2313 // Life is harder. The stack holds the value on top, followed by
2314 // the object. We don't know the size of the value, though; it
2315 // could be one or two words depending on its type. As a result,
2316 // we must find the type to determine where the object is.
2317 __ movl(c_rarg3, Address(c_rarg2, rscratch1,
2318 Address::times_8,
2319 in_bytes(cp_base_offset +
2320 ConstantPoolCacheEntry::flags_offset())));
2321 __ shrl(c_rarg3, ConstantPoolCacheEntry::tosBits);
2322 // Make sure we don't need to mask rcx for tosBits after the
2323 // above shift
2324 ConstantPoolCacheEntry::verify_tosBits();
2325 __ movq(c_rarg1, at_tos_p1()); // initially assume a one word jvalue
2326 __ cmpl(c_rarg3, ltos);
2327 __ cmovq(Assembler::equal,
2328 c_rarg1, at_tos_p2()); // ltos (two word jvalue)
2329 __ cmpl(c_rarg3, dtos);
2330 __ cmovq(Assembler::equal,
2331 c_rarg1, at_tos_p2()); // dtos (two word jvalue)
2332 }
2333 // cache entry pointer
2334 __ addq(c_rarg2, in_bytes(cp_base_offset));
2335 __ shll(rscratch1, LogBytesPerWord);
2336 __ addq(c_rarg2, rscratch1);
2337 // object (tos)
2338 __ movq(c_rarg3, rsp);
2339 // c_rarg1: object pointer set up above (NULL if static)
2340 // c_rarg2: cache entry pointer
2341 // c_rarg3: jvalue object on the stack
2342 __ call_VM(noreg,
2343 CAST_FROM_FN_PTR(address,
2344 InterpreterRuntime::post_field_modification),
2345 c_rarg1, c_rarg2, c_rarg3);
2346 __ get_cache_and_index_at_bcp(cache, index, 1);
2347 __ bind(L1);
2348 }
2349 }
2350
2351 void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
2352 transition(vtos, vtos);
2353
2354 const Register cache = rcx;
2355 const Register index = rdx;
2356 const Register obj = rcx;
2357 const Register off = rbx;
2358 const Register flags = rax;
2380 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2381
2382 assert(btos == 0, "change code, btos != 0");
2383 __ andl(flags, 0x0f);
2384 __ jcc(Assembler::notZero, notByte);
2385 // btos
2386 __ pop(btos);
2387 if (!is_static) pop_and_check_object(obj);
2388 __ movb(field, rax);
2389 if (!is_static) {
2390 patch_bytecode(Bytecodes::_fast_bputfield, bc, rbx);
2391 }
2392 __ jmp(Done);
2393
2394 __ bind(notByte);
2395 __ cmpl(flags, atos);
2396 __ jcc(Assembler::notEqual, notObj);
2397 // atos
2398 __ pop(atos);
2399 if (!is_static) pop_and_check_object(obj);
2400 __ movq(field, rax);
2401 __ store_check(obj, field); // Need to mark card
2402 if (!is_static) {
2403 patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx);
2404 }
2405 __ jmp(Done);
2406
2407 __ bind(notObj);
2408 __ cmpl(flags, itos);
2409 __ jcc(Assembler::notEqual, notInt);
2410 // itos
2411 __ pop(itos);
2412 if (!is_static) pop_and_check_object(obj);
2413 __ movl(field, rax);
2414 if (!is_static) {
2415 patch_bytecode(Bytecodes::_fast_iputfield, bc, rbx);
2416 }
2417 __ jmp(Done);
2418
2419 __ bind(notInt);
2420 __ cmpl(flags, ctos);
2421 __ jcc(Assembler::notEqual, notChar);
2496
2497 void TemplateTable::putfield(int byte_no) {
2498 putfield_or_static(byte_no, false);
2499 }
2500
2501 void TemplateTable::putstatic(int byte_no) {
2502 putfield_or_static(byte_no, true);
2503 }
2504
2505 void TemplateTable::jvmti_post_fast_field_mod() {
2506 if (JvmtiExport::can_post_field_modification()) {
2507 // Check to see if a field modification watch has been set before
2508 // we take the time to call into the VM.
2509 Label L2;
2510 __ mov32(c_rarg3, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
2511 __ testl(c_rarg3, c_rarg3);
2512 __ jcc(Assembler::zero, L2);
2513 __ pop_ptr(rbx); // copy the object pointer from tos
2514 __ verify_oop(rbx);
2515 __ push_ptr(rbx); // put the object pointer back on tos
2516 __ subq(rsp, sizeof(jvalue)); // add space for a jvalue object
2517 __ movq(c_rarg3, rsp);
2518 const Address field(c_rarg3, 0);
2519
2520 switch (bytecode()) { // load values into the jvalue object
2521 case Bytecodes::_fast_aputfield: // fall through
2522 case Bytecodes::_fast_lputfield: __ movq(field, rax); break;
2523 case Bytecodes::_fast_iputfield: __ movl(field, rax); break;
2524 case Bytecodes::_fast_bputfield: __ movb(field, rax); break;
2525 case Bytecodes::_fast_sputfield: // fall through
2526 case Bytecodes::_fast_cputfield: __ movw(field, rax); break;
2527 case Bytecodes::_fast_fputfield: __ movflt(field, xmm0); break;
2528 case Bytecodes::_fast_dputfield: __ movdbl(field, xmm0); break;
2529 default:
2530 ShouldNotReachHere();
2531 }
2532
2533 // Save rax because call_VM() will clobber it, then use it for
2534 // JVMTI purposes
2535 __ pushq(rax);
2536 // access constant pool cache entry
2537 __ get_cache_entry_pointer_at_bcp(c_rarg2, rax, 1);
2538 __ verify_oop(rbx);
2539 // rbx: object pointer copied above
2540 // c_rarg2: cache entry pointer
2541 // c_rarg3: jvalue object on the stack
2542 __ call_VM(noreg,
2543 CAST_FROM_FN_PTR(address,
2544 InterpreterRuntime::post_field_modification),
2545 rbx, c_rarg2, c_rarg3);
2546 __ popq(rax); // restore lower value
2547 __ addq(rsp, sizeof(jvalue)); // release jvalue object space
2548 __ bind(L2);
2549 }
2550 }
2551
2552 void TemplateTable::fast_storefield(TosState state) {
2553 transition(state, vtos);
2554
2555 ByteSize base = constantPoolCacheOopDesc::base_offset();
2556
2557 jvmti_post_fast_field_mod();
2558
2559 // access constant pool cache
2560 __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2561
2562 // test for volatile with rdx
2563 __ movl(rdx, Address(rcx, rbx, Address::times_8,
2564 in_bytes(base +
2565 ConstantPoolCacheEntry::flags_offset())));
2566
2567 // replace index with field offset from cache entry
2568 __ movq(rbx, Address(rcx, rbx, Address::times_8,
2569 in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
2570
2571 // [jk] not needed currently
2572 // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore |
2573 // Assembler::StoreStore));
2574
2575 Label notVolatile;
2576 __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2577 __ andl(rdx, 0x1);
2578
2579 // Get object from stack
2580 pop_and_check_object(rcx);
2581
2582 // field address
2583 const Address field(rcx, rbx, Address::times_1);
2584
2585 // access field
2586 switch (bytecode()) {
2587 case Bytecodes::_fast_aputfield:
2588 __ movq(field, rax);
2589 __ store_check(rcx, field);
2590 break;
2591 case Bytecodes::_fast_lputfield:
2592 __ movq(field, rax);
2593 break;
2594 case Bytecodes::_fast_iputfield:
2595 __ movl(field, rax);
2596 break;
2597 case Bytecodes::_fast_bputfield:
2598 __ movb(field, rax);
2599 break;
2600 case Bytecodes::_fast_sputfield:
2601 // fall through
2602 case Bytecodes::_fast_cputfield:
2603 __ movw(field, rax);
2604 break;
2605 case Bytecodes::_fast_fputfield:
2606 __ movflt(field, xmm0);
2607 break;
2608 case Bytecodes::_fast_dputfield:
2609 __ movdbl(field, xmm0);
2617 __ jcc(Assembler::zero, notVolatile);
2618 volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
2619 Assembler::StoreStore));
2620 __ bind(notVolatile);
2621 }
2622
2623
2624 void TemplateTable::fast_accessfield(TosState state) {
2625 transition(atos, state);
2626
2627 // Do the JVMTI work here to avoid disturbing the register state below
2628 if (JvmtiExport::can_post_field_access()) {
2629 // Check to see if a field access watch has been set before we
2630 // take the time to call into the VM.
2631 Label L1;
2632 __ mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2633 __ testl(rcx, rcx);
2634 __ jcc(Assembler::zero, L1);
2635 // access constant pool cache entry
2636 __ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1);
2637 __ movq(r12, rax); // save object pointer before call_VM() clobbers it
2638 __ verify_oop(rax);
2639 __ movq(c_rarg1, rax);
2640 // c_rarg1: object pointer copied above
2641 // c_rarg2: cache entry pointer
2642 __ call_VM(noreg,
2643 CAST_FROM_FN_PTR(address,
2644 InterpreterRuntime::post_field_access),
2645 c_rarg1, c_rarg2);
2646 __ movq(rax, r12); // restore object pointer
2647 __ bind(L1);
2648 }
2649
2650 // access constant pool cache
2651 __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2652 // replace index with field offset from cache entry
2653 // [jk] not needed currently
2654 // if (os::is_MP()) {
2655 // __ movl(rdx, Address(rcx, rbx, Address::times_8,
2656 // in_bytes(constantPoolCacheOopDesc::base_offset() +
2657 // ConstantPoolCacheEntry::flags_offset())));
2658 // __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2659 // __ andl(rdx, 0x1);
2660 // }
2661 __ movq(rbx, Address(rcx, rbx, Address::times_8,
2662 in_bytes(constantPoolCacheOopDesc::base_offset() +
2663 ConstantPoolCacheEntry::f2_offset())));
2664
2665 // rax: object
2666 __ verify_oop(rax);
2667 __ null_check(rax);
2668 Address field(rax, rbx, Address::times_1);
2669
2670 // access field
2671 switch (bytecode()) {
2672 case Bytecodes::_fast_agetfield:
2673 __ movq(rax, field);
2674 __ verify_oop(rax);
2675 break;
2676 case Bytecodes::_fast_lgetfield:
2677 __ movq(rax, field);
2678 break;
2679 case Bytecodes::_fast_igetfield:
2680 __ movl(rax, field);
2681 break;
2682 case Bytecodes::_fast_bgetfield:
2683 __ movsbl(rax, field);
2684 break;
2685 case Bytecodes::_fast_sgetfield:
2686 __ load_signed_word(rax, field);
2687 break;
2688 case Bytecodes::_fast_cgetfield:
2689 __ load_unsigned_word(rax, field);
2690 break;
2691 case Bytecodes::_fast_fgetfield:
2692 __ movflt(xmm0, field);
2693 break;
2694 case Bytecodes::_fast_dgetfield:
2695 __ movdbl(xmm0, field);
2696 break;
2697 default:
2698 ShouldNotReachHere();
2699 }
2700 // [jk] not needed currently
2701 // if (os::is_MP()) {
2702 // Label notVolatile;
2703 // __ testl(rdx, rdx);
2704 // __ jcc(Assembler::zero, notVolatile);
2705 // __ membar(Assembler::LoadLoad);
2706 // __ bind(notVolatile);
2707 //};
2708 }
2709
2710 void TemplateTable::fast_xaccess(TosState state) {
2711 transition(vtos, state);
2712
2713 // get receiver
2714 __ movq(rax, aaddress(0));
2715 debug_only(__ verify_local_tag(frame::TagReference, 0));
2716 // access constant pool cache
2717 __ get_cache_and_index_at_bcp(rcx, rdx, 2);
2718 __ movq(rbx,
2719 Address(rcx, rdx, Address::times_8,
2720 in_bytes(constantPoolCacheOopDesc::base_offset() +
2721 ConstantPoolCacheEntry::f2_offset())));
2722 // make sure exception is reported in correct bcp range (getfield is
2723 // next instruction)
2724 __ incrementq(r13);
2725 __ null_check(rax);
2726 switch (state) {
2727 case itos:
2728 __ movl(rax, Address(rax, rbx, Address::times_1));
2729 break;
2730 case atos:
2731 __ movq(rax, Address(rax, rbx, Address::times_1));
2732 __ verify_oop(rax);
2733 break;
2734 case ftos:
2735 __ movflt(xmm0, Address(rax, rbx, Address::times_1));
2736 break;
2737 default:
2738 ShouldNotReachHere();
2739 }
2740
2741 // [jk] not needed currently
2742 // if (os::is_MP()) {
2743 // Label notVolatile;
2744 // __ movl(rdx, Address(rcx, rdx, Address::times_8,
2745 // in_bytes(constantPoolCacheOopDesc::base_offset() +
2746 // ConstantPoolCacheEntry::flags_offset())));
2747 // __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2748 // __ testl(rdx, 0x1);
2749 // __ jcc(Assembler::zero, notVolatile);
2750 // __ membar(Assembler::LoadLoad);
2751 // __ bind(notVolatile);
2752 // }
2753
2754 __ decrementq(r13);
2755 }
2756
2757
2758
2759 //-----------------------------------------------------------------------------
2760 // Calls
2761
2762 void TemplateTable::count_calls(Register method, Register temp) {
2763 // implemented elsewhere
2764 ShouldNotReachHere();
2765 }
2766
2767 void TemplateTable::prepare_invoke(Register method,
2768 Register index,
2769 int byte_no,
2770 Bytecodes::Code code) {
2771 // determine flags
2772 const bool is_invokeinterface = code == Bytecodes::_invokeinterface;
2773 const bool is_invokevirtual = code == Bytecodes::_invokevirtual;
2774 const bool is_invokespecial = code == Bytecodes::_invokespecial;
2775 const bool load_receiver = code != Bytecodes::_invokestatic;
2776 const bool receiver_null_check = is_invokespecial;
2777 const bool save_flags = is_invokeinterface || is_invokevirtual;
2778 // setup registers & access constant pool cache
2779 const Register recv = rcx;
2780 const Register flags = rdx;
2781 assert_different_registers(method, index, recv, flags);
2782
2783 // save 'interpreter return address'
2784 __ save_bcp();
2785
2786 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual);
2787
2788 // load receiver if needed (note: no return address pushed yet)
2789 if (load_receiver) {
2790 __ movl(recv, flags);
2791 __ andl(recv, 0xFF);
2792 if (TaggedStackInterpreter) __ shll(recv, 1); // index*2
2793 __ movq(recv, Address(rsp, recv, Address::times_8, -Interpreter::expr_offset_in_bytes(1)));
2794 __ verify_oop(recv);
2795 }
2796
2797 // do null check if needed
2798 if (receiver_null_check) {
2799 __ null_check(recv);
2800 }
2801
2802 if (save_flags) {
2803 __ movl(r13, flags);
2804 }
2805
2806 // compute return type
2807 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2808 // Make sure we don't need to mask flags for tosBits after the above shift
2809 ConstantPoolCacheEntry::verify_tosBits();
2810 // load return address
2811 {
2812 ExternalAddress return_5((address)Interpreter::return_5_addrs_by_index_table());
2813 ExternalAddress return_3((address)Interpreter::return_3_addrs_by_index_table());
2814 __ lea(rscratch1, (is_invokeinterface ? return_5 : return_3));
2815 __ movq(flags, Address(rscratch1, flags, Address::times_8));
2816 }
2817
2818 // push return address
2819 __ pushq(flags);
2820
2821 // Restore flag field from the constant pool cache, and restore esi
2822 // for later null checks. r13 is the bytecode pointer
2823 if (save_flags) {
2824 __ movl(flags, r13);
2825 __ restore_bcp();
2826 }
2827 }
2828
2829
2830 void TemplateTable::invokevirtual_helper(Register index,
2831 Register recv,
2832 Register flags) {
2833 // Uses temporary registers rax, rdx assert_different_registers(index, recv, rax, rdx);
2834
2835 // Test for an invoke of a final method
2836 Label notFinal;
2837 __ movl(rax, flags);
2838 __ andl(rax, (1 << ConstantPoolCacheEntry::vfinalMethod));
2839 __ jcc(Assembler::zero, notFinal);
2840
2841 const Register method = index; // method must be rbx
2842 assert(method == rbx,
2843 "methodOop must be rbx for interpreter calling convention");
2844
2845 // do the call - the index is actually the method to call
2846 __ verify_oop(method);
2847
2848 // It's final, need a null check here!
2849 __ null_check(recv);
2850
2851 // profile this call
2852 __ profile_final_call(rax);
2853
2854 __ jump_from_interpreted(method, rax);
2855
2856 __ bind(notFinal);
2857
2858 // get receiver klass
2859 __ null_check(recv, oopDesc::klass_offset_in_bytes());
2860 __ movq(rax, Address(recv, oopDesc::klass_offset_in_bytes()));
2861
2862 __ verify_oop(rax);
2863
2864 // profile this call
2865 __ profile_virtual_call(rax, r14, rdx);
2866
2867 // get target methodOop & entry point
2868 const int base = instanceKlass::vtable_start_offset() * wordSize;
2869 assert(vtableEntry::size() * wordSize == 8,
2870 "adjust the scaling in the code below");
2871 __ movq(method, Address(rax, index,
2872 Address::times_8,
2873 base + vtableEntry::method_offset_in_bytes()));
2874 __ movq(rdx, Address(method, methodOopDesc::interpreter_entry_offset()));
2875 __ jump_from_interpreted(method, rdx);
2876 }
2877
2878
2879 void TemplateTable::invokevirtual(int byte_no) {
2880 transition(vtos, vtos);
2881 prepare_invoke(rbx, noreg, byte_no, bytecode());
2882
2883 // rbx: index
2884 // rcx: receiver
2885 // rdx: flags
2886
2887 invokevirtual_helper(rbx, rcx, rdx);
2888 }
2889
2890
2891 void TemplateTable::invokespecial(int byte_no) {
2892 transition(vtos, vtos);
2893 prepare_invoke(rbx, noreg, byte_no, bytecode());
2894 // do the call
2918
2919 // rax: Interface
2920 // rbx: index
2921 // rcx: receiver
2922 // rdx: flags
2923
2924 // Special case of invokeinterface called for virtual method of
2925 // java.lang.Object. See cpCacheOop.cpp for details.
2926 // This code isn't produced by javac, but could be produced by
2927 // another compliant java compiler.
2928 Label notMethod;
2929 __ movl(r14, rdx);
2930 __ andl(r14, (1 << ConstantPoolCacheEntry::methodInterface));
2931 __ jcc(Assembler::zero, notMethod);
2932
2933 invokevirtual_helper(rbx, rcx, rdx);
2934 __ bind(notMethod);
2935
2936 // Get receiver klass into rdx - also a null check
2937 __ restore_locals(); // restore r14
2938 __ movq(rdx, Address(rcx, oopDesc::klass_offset_in_bytes()));
2939 __ verify_oop(rdx);
2940
2941 // profile this call
2942 __ profile_virtual_call(rdx, r13, r14);
2943
2944 __ movq(r14, rdx); // Save klassOop in r14
2945
2946 // Compute start of first itableOffsetEntry (which is at the end of
2947 // the vtable)
2948 const int base = instanceKlass::vtable_start_offset() * wordSize;
2949 // Get length of vtable
2950 assert(vtableEntry::size() * wordSize == 8,
2951 "adjust the scaling in the code below");
2952 __ movl(r13, Address(rdx,
2953 instanceKlass::vtable_length_offset() * wordSize));
2954 __ leaq(rdx, Address(rdx, r13, Address::times_8, base));
2955
2956 if (HeapWordsPerLong > 1) {
2957 // Round up to align_object_offset boundary
2958 __ round_to_q(rdx, BytesPerLong);
2959 }
2960
2961 Label entry, search, interface_ok;
2962
2963 __ jmpb(entry);
2964 __ bind(search);
2965 __ addq(rdx, itableOffsetEntry::size() * wordSize);
2966
2967 __ bind(entry);
2968
2969 // Check that the entry is non-null. A null entry means that the
2970 // receiver class doesn't implement the interface, and wasn't the
2971 // same as the receiver class checked when the interface was
2972 // resolved.
2973 __ pushq(rdx);
2974 __ movq(rdx, Address(rdx, itableOffsetEntry::interface_offset_in_bytes()));
2975 __ testq(rdx, rdx);
2976 __ jcc(Assembler::notZero, interface_ok);
2977 // throw exception
2978 __ popq(rdx); // pop saved register first.
2979 __ popq(rbx); // pop return address (pushed by prepare_invoke)
2980 __ restore_bcp(); // r13 must be correct for exception handler (was
2981 // destroyed)
2982 __ restore_locals(); // make sure locals pointer is correct as well
2983 // (was destroyed)
2984 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
2985 InterpreterRuntime::throw_IncompatibleClassChangeError));
2986 // the call_VM checks for exception, so we should never return here.
2987 __ should_not_reach_here();
2988 __ bind(interface_ok);
2989
2990 __ popq(rdx);
2991
2992 __ cmpq(rax, Address(rdx, itableOffsetEntry::interface_offset_in_bytes()));
2993 __ jcc(Assembler::notEqual, search);
2994
2995 __ movl(rdx, Address(rdx, itableOffsetEntry::offset_offset_in_bytes()));
2996
2997 __ addq(rdx, r14); // Add offset to klassOop
2998 assert(itableMethodEntry::size() * wordSize == 8,
2999 "adjust the scaling in the code below");
3000 __ movq(rbx, Address(rdx, rbx, Address::times_8));
3001 // rbx: methodOop to call
3002 // rcx: receiver
3003 // Check for abstract method error
3004 // Note: This should be done more efficiently via a
3005 // throw_abstract_method_error interpreter entry point and a
3006 // conditional jump to it in case of a null method.
3007 {
3008 Label L;
3009 __ testq(rbx, rbx);
3010 __ jcc(Assembler::notZero, L);
3011 // throw exception
3012 // note: must restore interpreter registers to canonical
3013 // state for exception handling to work correctly!
3014 __ popq(rbx); // pop return address (pushed by prepare_invoke)
3015 __ restore_bcp(); // r13 must be correct for exception handler
3016 // (was destroyed)
3017 __ restore_locals(); // make sure locals pointer is correct as
3018 // well (was destroyed)
3019 __ call_VM(noreg,
3020 CAST_FROM_FN_PTR(address,
3021 InterpreterRuntime::throw_AbstractMethodError));
3022 // the call_VM checks for exception, so we should never return here.
3023 __ should_not_reach_here();
3024 __ bind(L);
3025 }
3026
3027 __ movq(rcx, Address(rbx, methodOopDesc::interpreter_entry_offset()));
3028
3029 // do the call
3030 // rcx: receiver
3031 // rbx: methodOop
3032 __ jump_from_interpreted(rbx, rdx);
3033 }
3034
3035 //-----------------------------------------------------------------------------
3036 // Allocation
3037
3038 void TemplateTable::_new() {
3039 transition(vtos, atos);
3040 __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3041 Label slow_case;
3042 Label done;
3043 Label initialize_header;
3044 Label initialize_object; // including clearing the fields
3045 Label allocate_shared;
3046 ExternalAddress top((address)Universe::heap()->top_addr());
3047 ExternalAddress end((address)Universe::heap()->end_addr());
3048
3049 __ get_cpool_and_tags(rsi, rax);
3050 // get instanceKlass
3051 __ movq(rsi, Address(rsi, rdx,
3052 Address::times_8, sizeof(constantPoolOopDesc)));
3053
3054 // make sure the class we're about to instantiate has been
3055 // resolved. Note: slow_case does a pop of stack, which is why we
3056 // loaded class/pushed above
3057 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
3058 __ cmpb(Address(rax, rdx, Address::times_1, tags_offset),
3059 JVM_CONSTANT_Class);
3060 __ jcc(Assembler::notEqual, slow_case);
3061
3062 // make sure klass is initialized & doesn't have finalizer
3063 // make sure klass is fully initialized
3064 __ cmpl(Address(rsi,
3065 instanceKlass::init_state_offset_in_bytes() +
3066 sizeof(oopDesc)),
3067 instanceKlass::fully_initialized);
3068 __ jcc(Assembler::notEqual, slow_case);
3069
3070 // get instance_size in instanceKlass (scaled to a count of bytes)
3071 __ movl(rdx,
3072 Address(rsi,
3073 Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
3074 // test to see if it has a finalizer or is malformed in some way
3075 __ testl(rdx, Klass::_lh_instance_slow_path_bit);
3076 __ jcc(Assembler::notZero, slow_case);
3077
3078 // Allocate the instance
3079 // 1) Try to allocate in the TLAB
3080 // 2) if fail and the object is large allocate in the shared Eden
3081 // 3) if the above fails (or is not applicable), go to a slow case
3082 // (creates a new TLAB, etc.)
3083
3084 const bool allow_shared_alloc =
3085 Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
3086
3087 if (UseTLAB) {
3088 __ movq(rax, Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())));
3089 __ leaq(rbx, Address(rax, rdx, Address::times_1));
3090 __ cmpq(rbx, Address(r15_thread, in_bytes(JavaThread::tlab_end_offset())));
3091 __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case);
3092 __ movq(Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())), rbx);
3093 if (ZeroTLAB) {
3094 // the fields have been already cleared
3095 __ jmp(initialize_header);
3096 } else {
3097 // initialize both the header and fields
3098 __ jmp(initialize_object);
3099 }
3100 }
3101
3102 // Allocation in the shared Eden, if allowed.
3103 //
3104 // rdx: instance size in bytes
3105 if (allow_shared_alloc) {
3106 __ bind(allocate_shared);
3107
3108 const Register RtopAddr = rscratch1;
3109 const Register RendAddr = rscratch2;
3110
3111 __ lea(RtopAddr, top);
3112 __ lea(RendAddr, end);
3113 __ movq(rax, Address(RtopAddr, 0));
3114
3115 // For retries rax gets set by cmpxchgq
3116 Label retry;
3117 __ bind(retry);
3118 __ leaq(rbx, Address(rax, rdx, Address::times_1));
3119 __ cmpq(rbx, Address(RendAddr, 0));
3120 __ jcc(Assembler::above, slow_case);
3121
3122 // Compare rax with the top addr, and if still equal, store the new
3123 // top addr in rbx at the address of the top addr pointer. Sets ZF if was
3124 // equal, and clears it otherwise. Use lock prefix for atomicity on MPs.
3125 //
3126 // rax: object begin
3127 // rbx: object end
3128 // rdx: instance size in bytes
3129 if (os::is_MP()) {
3130 __ lock();
3131 }
3132 __ cmpxchgq(rbx, Address(RtopAddr, 0));
3133
3134 // if someone beat us on the allocation, try again, otherwise continue
3135 __ jcc(Assembler::notEqual, retry);
3136 }
3137
3138 if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
3139 // The object is initialized before the header. If the object size is
3140 // zero, go directly to the header initialization.
3141 __ bind(initialize_object);
3142 __ decrementl(rdx, sizeof(oopDesc));
3143 __ jcc(Assembler::zero, initialize_header);
3144
3145 // Initialize object fields
3146 __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
3147 __ shrl(rdx, LogBytesPerLong); // divide by oopSize to simplify the loop
3148 {
3149 Label loop;
3150 __ bind(loop);
3151 __ movq(Address(rax, rdx, Address::times_8,
3152 sizeof(oopDesc) - oopSize),
3153 rcx);
3154 __ decrementl(rdx);
3155 __ jcc(Assembler::notZero, loop);
3156 }
3157
3158 // initialize object header only.
3159 __ bind(initialize_header);
3160 if (UseBiasedLocking) {
3161 __ movq(rscratch1, Address(rsi, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
3162 __ movq(Address(rax, oopDesc::mark_offset_in_bytes()), rscratch1);
3163 } else {
3164 __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()),
3165 (intptr_t) markOopDesc::prototype()); // header (address 0x1)
3166 }
3167 __ movq(Address(rax, oopDesc::klass_offset_in_bytes()), rsi); // klass
3168 __ jmp(done);
3169 }
3170
3171 {
3172 SkipIfEqual skip(_masm, &DTraceAllocProbes, false);
3173 // Trigger dtrace event for fastpath
3174 __ push(atos); // save the return value
3175 __ call_VM_leaf(
3176 CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax);
3177 __ pop(atos); // restore the return value
3178 }
3179
3180 // slow case
3181 __ bind(slow_case);
3182 __ get_constant_pool(c_rarg1);
3183 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3184 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
3185 __ verify_oop(rax);
3186
3187 // continue
3197 }
3198
3199 void TemplateTable::anewarray() {
3200 transition(itos, atos);
3201 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3202 __ get_constant_pool(c_rarg1);
3203 __ movl(c_rarg3, rax);
3204 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray),
3205 c_rarg1, c_rarg2, c_rarg3);
3206 }
3207
3208 void TemplateTable::arraylength() {
3209 transition(atos, itos);
3210 __ null_check(rax, arrayOopDesc::length_offset_in_bytes());
3211 __ movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes()));
3212 }
3213
3214 void TemplateTable::checkcast() {
3215 transition(atos, atos);
3216 Label done, is_null, ok_is_subtype, quicked, resolved;
3217 __ testq(rax, rax); // object is in rax
3218 __ jcc(Assembler::zero, is_null);
3219
3220 // Get cpool & tags index
3221 __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
3222 __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
3223 // See if bytecode has already been quicked
3224 __ cmpb(Address(rdx, rbx,
3225 Address::times_1,
3226 typeArrayOopDesc::header_size(T_BYTE) * wordSize),
3227 JVM_CONSTANT_Class);
3228 __ jcc(Assembler::equal, quicked);
3229
3230 __ movq(r12, rcx); // save rcx XXX
3231 __ push(atos); // save receiver for result, and for GC
3232 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));
3233 __ pop_ptr(rdx); // restore receiver
3234 __ movq(rcx, r12); // restore rcx XXX
3235 __ jmpb(resolved);
3236
3237 // Get superklass in rax and subklass in rbx
3238 __ bind(quicked);
3239 __ movq(rdx, rax); // Save object in rdx; rax needed for subtype check
3240 __ movq(rax, Address(rcx, rbx,
3241 Address::times_8, sizeof(constantPoolOopDesc)));
3242
3243 __ bind(resolved);
3244 __ movq(rbx, Address(rdx, oopDesc::klass_offset_in_bytes()));
3245
3246 // Generate subtype check. Blows rcx, rdi. Object in rdx.
3247 // Superklass in rax. Subklass in rbx.
3248 __ gen_subtype_check(rbx, ok_is_subtype);
3249
3250 // Come here on failure
3251 __ push_ptr(rdx);
3252 // object is at TOS
3253 __ jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry));
3254
3255 // Come here on success
3256 __ bind(ok_is_subtype);
3257 __ movq(rax, rdx); // Restore object in rdx
3258
3259 // Collect counts on whether this check-cast sees NULLs a lot or not.
3260 if (ProfileInterpreter) {
3261 __ jmp(done);
3262 __ bind(is_null);
3263 __ profile_null_seen(rcx);
3264 } else {
3265 __ bind(is_null); // same as 'done'
3266 }
3267 __ bind(done);
3268 }
3269
3270 void TemplateTable::instanceof() {
3271 transition(atos, itos);
3272 Label done, is_null, ok_is_subtype, quicked, resolved;
3273 __ testq(rax, rax);
3274 __ jcc(Assembler::zero, is_null);
3275
3276 // Get cpool & tags index
3277 __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
3278 __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
3279 // See if bytecode has already been quicked
3280 __ cmpb(Address(rdx, rbx,
3281 Address::times_1,
3282 typeArrayOopDesc::header_size(T_BYTE) * wordSize),
3283 JVM_CONSTANT_Class);
3284 __ jcc(Assembler::equal, quicked);
3285
3286 __ movq(r12, rcx); // save rcx
3287 __ push(atos); // save receiver for result, and for GC
3288 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));
3289 __ pop_ptr(rdx); // restore receiver
3290 __ movq(rdx, Address(rdx, oopDesc::klass_offset_in_bytes()));
3291 __ movq(rcx, r12); // restore rcx
3292 __ jmpb(resolved);
3293
3294 // Get superklass in rax and subklass in rdx
3295 __ bind(quicked);
3296 __ movq(rdx, Address(rax, oopDesc::klass_offset_in_bytes()));
3297 __ movq(rax, Address(rcx, rbx,
3298 Address::times_8, sizeof(constantPoolOopDesc)));
3299
3300 __ bind(resolved);
3301
3302 // Generate subtype check. Blows rcx, rdi
3303 // Superklass in rax. Subklass in rdx.
3304 __ gen_subtype_check(rdx, ok_is_subtype);
3305
3306 // Come here on failure
3307 __ xorl(rax, rax);
3308 __ jmpb(done);
3309 // Come here on success
3310 __ bind(ok_is_subtype);
3311 __ movl(rax, 1);
3312
3313 // Collect counts on whether this test sees NULLs a lot or not.
3314 if (ProfileInterpreter) {
3315 __ jmp(done);
3316 __ bind(is_null);
3317 __ profile_null_seen(rcx);
3321 __ bind(done);
3322 // rax = 0: obj == NULL or obj is not an instanceof the specified klass
3323 // rax = 1: obj != NULL and obj is an instanceof the specified klass
3324 }
3325
3326 //-----------------------------------------------------------------------------
3327 // Breakpoints
3328 void TemplateTable::_breakpoint() {
3329 // Note: We get here even if we are single stepping..
3330 // jbug inists on setting breakpoints at every bytecode
3331 // even if we are in single step mode.
3332
3333 transition(vtos, vtos);
3334
3335 // get the unpatched byte code
3336 __ get_method(c_rarg1);
3337 __ call_VM(noreg,
3338 CAST_FROM_FN_PTR(address,
3339 InterpreterRuntime::get_original_bytecode_at),
3340 c_rarg1, r13);
3341 __ movq(rbx, rax);
3342
3343 // post the breakpoint event
3344 __ get_method(c_rarg1);
3345 __ call_VM(noreg,
3346 CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint),
3347 c_rarg1, r13);
3348
3349 // complete the execution of original bytecode
3350 __ dispatch_only_normal(vtos);
3351 }
3352
3353 //-----------------------------------------------------------------------------
3354 // Exceptions
3355
3356 void TemplateTable::athrow() {
3357 transition(atos, vtos);
3358 __ null_check(rax);
3359 __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
3360 }
3361
3379 void TemplateTable::monitorenter() {
3380 transition(atos, vtos);
3381
3382 // check for NULL object
3383 __ null_check(rax);
3384
3385 const Address monitor_block_top(
3386 rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3387 const Address monitor_block_bot(
3388 rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
3389 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
3390
3391 Label allocated;
3392
3393 // initialize entry pointer
3394 __ xorl(c_rarg1, c_rarg1); // points to free slot or NULL
3395
3396 // find a free slot in the monitor block (result in c_rarg1)
3397 {
3398 Label entry, loop, exit;
3399 __ movq(c_rarg3, monitor_block_top); // points to current entry,
3400 // starting with top-most entry
3401 __ leaq(c_rarg2, monitor_block_bot); // points to word before bottom
3402 // of monitor block
3403 __ jmpb(entry);
3404
3405 __ bind(loop);
3406 // check if current entry is used
3407 __ cmpq(Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()), (int) NULL);
3408 // if not used then remember entry in c_rarg1
3409 __ cmovq(Assembler::equal, c_rarg1, c_rarg3);
3410 // check if current entry is for same object
3411 __ cmpq(rax, Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()));
3412 // if same object then stop searching
3413 __ jccb(Assembler::equal, exit);
3414 // otherwise advance to next entry
3415 __ addq(c_rarg3, entry_size);
3416 __ bind(entry);
3417 // check if bottom reached
3418 __ cmpq(c_rarg3, c_rarg2);
3419 // if not at bottom then check this entry
3420 __ jcc(Assembler::notEqual, loop);
3421 __ bind(exit);
3422 }
3423
3424 __ testq(c_rarg1, c_rarg1); // check if a slot has been found
3425 __ jcc(Assembler::notZero, allocated); // if found, continue with that one
3426
3427 // allocate one if there's no free slot
3428 {
3429 Label entry, loop;
3430 // 1. compute new pointers // rsp: old expression stack top
3431 __ movq(c_rarg1, monitor_block_bot); // c_rarg1: old expression stack bottom
3432 __ subq(rsp, entry_size); // move expression stack top
3433 __ subq(c_rarg1, entry_size); // move expression stack bottom
3434 __ movq(c_rarg3, rsp); // set start value for copy loop
3435 __ movq(monitor_block_bot, c_rarg1); // set new monitor block bottom
3436 __ jmp(entry);
3437 // 2. move expression stack contents
3438 __ bind(loop);
3439 __ movq(c_rarg2, Address(c_rarg3, entry_size)); // load expression stack
3440 // word from old location
3441 __ movq(Address(c_rarg3, 0), c_rarg2); // and store it at new location
3442 __ addq(c_rarg3, wordSize); // advance to next word
3443 __ bind(entry);
3444 __ cmpq(c_rarg3, c_rarg1); // check if bottom reached
3445 __ jcc(Assembler::notEqual, loop); // if not at bottom then
3446 // copy next word
3447 }
3448
3449 // call run-time routine
3450 // c_rarg1: points to monitor entry
3451 __ bind(allocated);
3452
3453 // Increment bcp to point to the next bytecode, so exception
3454 // handling for async. exceptions work correctly.
3455 // The object has already been poped from the stack, so the
3456 // expression stack looks correct.
3457 __ incrementq(r13);
3458
3459 // store object
3460 __ movq(Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()), rax);
3461 __ lock_object(c_rarg1);
3462
3463 // check to make sure this monitor doesn't cause stack overflow after locking
3464 __ save_bcp(); // in case of exception
3465 __ generate_stack_overflow_check(0);
3466
3467 // The bcp has already been incremented. Just need to dispatch to
3468 // next instruction.
3469 __ dispatch_next(vtos);
3470 }
3471
3472
3473 void TemplateTable::monitorexit() {
3474 transition(atos, vtos);
3475
3476 // check for NULL object
3477 __ null_check(rax);
3478
3479 const Address monitor_block_top(
3480 rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3481 const Address monitor_block_bot(
3482 rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
3483 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
3484
3485 Label found;
3486
3487 // find matching slot
3488 {
3489 Label entry, loop;
3490 __ movq(c_rarg1, monitor_block_top); // points to current entry,
3491 // starting with top-most entry
3492 __ leaq(c_rarg2, monitor_block_bot); // points to word before bottom
3493 // of monitor block
3494 __ jmpb(entry);
3495
3496 __ bind(loop);
3497 // check if current entry is for same object
3498 __ cmpq(rax, Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()));
3499 // if same object then stop searching
3500 __ jcc(Assembler::equal, found);
3501 // otherwise advance to next entry
3502 __ addq(c_rarg1, entry_size);
3503 __ bind(entry);
3504 // check if bottom reached
3505 __ cmpq(c_rarg1, c_rarg2);
3506 // if not at bottom then check this entry
3507 __ jcc(Assembler::notEqual, loop);
3508 }
3509
3510 // error handling. Unlocking was not block-structured
3511 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
3512 InterpreterRuntime::throw_illegal_monitor_state_exception));
3513 __ should_not_reach_here();
3514
3515 // call run-time routine
3516 // rsi: points to monitor entry
3517 __ bind(found);
3518 __ push_ptr(rax); // make sure object is on stack (contract with oopMaps)
3519 __ unlock_object(c_rarg1);
3520 __ pop_ptr(rax); // discard object
3521 }
3522
3523
3524 // Wide instructions
3525 void TemplateTable::wide() {
3526 transition(vtos, vtos);
3527 __ load_unsigned_byte(rbx, at_bcp(1));
3528 __ lea(rscratch1, ExternalAddress((address)Interpreter::_wentry_point));
3529 __ jmp(Address(rscratch1, rbx, Address::times_8));
3530 // Note: the r13 increment step is part of the individual wide
3531 // bytecode implementations
3532 }
3533
3534
3535 // Multi arrays
3536 void TemplateTable::multianewarray() {
3537 transition(vtos, atos);
3538 __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
3539 // last dim is on top of stack; we want address of first one:
3540 // first_addr = last_addr + (ndims - 1) * wordSize
3541 if (TaggedStackInterpreter) __ shll(rax, 1); // index*2
3542 __ leaq(c_rarg1, Address(rsp, rax, Address::times_8, -wordSize));
3543 call_VM(rax,
3544 CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray),
3545 c_rarg1);
3546 __ load_unsigned_byte(rbx, at_bcp(3));
3547 if (TaggedStackInterpreter) __ shll(rbx, 1); // index*2
3548 __ leaq(rsp, Address(rsp, rbx, Address::times_8));
3549 }
|
1 /*
2 * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
24
25 #include "incls/_precompiled.incl"
26 #include "incls/_templateTable_x86_64.cpp.incl"
27
28 #ifndef CC_INTERP
29
30 #define __ _masm->
31
32 // Platform-dependent initialization
33
34 void TemplateTable::pd_initialize() {
35 // No amd64 specific initialization
36 }
37
38 // Address computation: local variables
39
40 static inline Address iaddress(int n) {
41 return Address(r14, Interpreter::local_offset_in_bytes(n));
42 }
43
44 static inline Address laddress(int n) {
45 return iaddress(n + 1);
46 }
47
48 static inline Address faddress(int n) {
49 return iaddress(n);
98 static inline Address at_tos_p3() {
99 return Address(rsp, Interpreter::expr_offset_in_bytes(3));
100 }
101
102 // Condition conversion
103 static Assembler::Condition j_not(TemplateTable::Condition cc) {
104 switch (cc) {
105 case TemplateTable::equal : return Assembler::notEqual;
106 case TemplateTable::not_equal : return Assembler::equal;
107 case TemplateTable::less : return Assembler::greaterEqual;
108 case TemplateTable::less_equal : return Assembler::greater;
109 case TemplateTable::greater : return Assembler::lessEqual;
110 case TemplateTable::greater_equal: return Assembler::less;
111 }
112 ShouldNotReachHere();
113 return Assembler::zero;
114 }
115
116
117 // Miscelaneous helper routines
118 // Store an oop (or NULL) at the address described by obj.
119 // If val == noreg this means store a NULL
120
121 static void do_oop_store(InterpreterMacroAssembler* _masm,
122 Address obj,
123 Register val,
124 BarrierSet::Name barrier,
125 bool precise) {
126 assert(val == noreg || val == rax, "parameter is just for looks");
127 switch (barrier) {
128 #ifndef SERIALGC
129 case BarrierSet::G1SATBCT:
130 case BarrierSet::G1SATBCTLogging:
131 {
132 // flatten object address if needed
133 if (obj.index() == noreg && obj.disp() == 0) {
134 if (obj.base() != rdx) {
135 __ movq(rdx, obj.base());
136 }
137 } else {
138 __ leaq(rdx, obj);
139 }
140 __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
141 if (val == noreg) {
142 __ store_heap_oop(Address(rdx, 0), NULL_WORD);
143 } else {
144 __ store_heap_oop(Address(rdx, 0), val);
145 __ g1_write_barrier_post(rdx, val, r8, rbx);
146 }
147
148 }
149 break;
150 #endif // SERIALGC
151 case BarrierSet::CardTableModRef:
152 case BarrierSet::CardTableExtension:
153 {
154 if (val == noreg) {
155 __ store_heap_oop(obj, NULL_WORD);
156 } else {
157 __ store_heap_oop(obj, val);
158 // flatten object address if needed
159 if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
160 __ store_check(obj.base());
161 } else {
162 __ leaq(rdx, obj);
163 __ store_check(rdx);
164 }
165 }
166 }
167 break;
168 case BarrierSet::ModRef:
169 case BarrierSet::Other:
170 if (val == noreg) {
171 __ store_heap_oop(obj, NULL_WORD);
172 } else {
173 __ store_heap_oop(obj, val);
174 }
175 break;
176 default :
177 ShouldNotReachHere();
178
179 }
180 }
181
182 Address TemplateTable::at_bcp(int offset) {
183 assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
184 return Address(r13, offset);
185 }
186
187 void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
188 Register scratch,
189 bool load_bc_into_scratch/*=true*/) {
190 if (!RewriteBytecodes) {
191 return;
192 }
193 // the pair bytecodes have already done the load.
194 if (load_bc_into_scratch) {
195 __ movl(bc, bytecode);
196 }
197 Label patch_done;
198 if (JvmtiExport::can_post_breakpoint()) {
199 Label fast_patch;
200 // if a breakpoint is present we can't rewrite the stream directly
365 #ifdef ASSERT
366 {
367 Label L;
368 __ cmpl(rdx, JVM_CONSTANT_Integer);
369 __ jcc(Assembler::equal, L);
370 __ cmpl(rdx, JVM_CONSTANT_String);
371 __ jcc(Assembler::equal, L);
372 __ stop("unexpected tag type in ldc");
373 __ bind(L);
374 }
375 #endif
376 // atos and itos
377 Label isOop;
378 __ cmpl(rdx, JVM_CONSTANT_Integer);
379 __ jcc(Assembler::notEqual, isOop);
380 __ movl(rax, Address(rcx, rbx, Address::times_8, base_offset));
381 __ push_i(rax);
382 __ jmp(Done);
383
384 __ bind(isOop);
385 __ movptr(rax, Address(rcx, rbx, Address::times_8, base_offset));
386 __ push_ptr(rax);
387
388 if (VerifyOops) {
389 __ verify_oop(rax);
390 }
391
392 __ bind(Done);
393 }
394
395 void TemplateTable::ldc2_w() {
396 transition(vtos, vtos);
397 Label Long, Done;
398 __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
399
400 __ get_cpool_and_tags(rcx, rax);
401 const int base_offset = constantPoolOopDesc::header_size() * wordSize;
402 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
403
404 // get type
405 __ cmpb(Address(rax, rbx, Address::times_1, tags_offset),
406 JVM_CONSTANT_Double);
407 __ jccb(Assembler::notEqual, Long);
408 // dtos
409 __ movdbl(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
410 __ push_d();
411 __ jmpb(Done);
412
413 __ bind(Long);
414 // ltos
415 __ movq(rax, Address(rcx, rbx, Address::times_8, base_offset));
416 __ push_l();
417
418 __ bind(Done);
419 }
420
421 void TemplateTable::locals_index(Register reg, int offset) {
422 __ load_unsigned_byte(reg, at_bcp(offset));
423 __ negptr(reg);
424 if (TaggedStackInterpreter) __ shlptr(reg, 1); // index = index*2
425 }
426
427 void TemplateTable::iload() {
428 transition(vtos, itos);
429 if (RewriteFrequentPairs) {
430 Label rewrite, done;
431 const Register bc = c_rarg3;
432 assert(rbx != bc, "register damaged");
433
434 // get next byte
435 __ load_unsigned_byte(rbx,
436 at_bcp(Bytecodes::length_for(Bytecodes::_iload)));
437 // if _iload, wait to rewrite to iload2. We only want to rewrite the
438 // last two iloads in a pair. Comparing against fast_iload means that
439 // the next bytecode is neither an iload or a caload, and therefore
440 // an iload pair.
441 __ cmpl(rbx, Bytecodes::_iload);
442 __ jcc(Assembler::equal, done);
443
444 __ cmpl(rbx, Bytecodes::_fast_iload);
491 debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
492 }
493
494 void TemplateTable::fload() {
495 transition(vtos, ftos);
496 locals_index(rbx);
497 __ movflt(xmm0, faddress(rbx));
498 debug_only(__ verify_local_tag(frame::TagValue, rbx));
499 }
500
501 void TemplateTable::dload() {
502 transition(vtos, dtos);
503 locals_index(rbx);
504 __ movdbl(xmm0, daddress(rbx));
505 debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
506 }
507
508 void TemplateTable::aload() {
509 transition(vtos, atos);
510 locals_index(rbx);
511 __ movptr(rax, aaddress(rbx));
512 debug_only(__ verify_local_tag(frame::TagReference, rbx));
513 }
514
515 void TemplateTable::locals_index_wide(Register reg) {
516 __ movl(reg, at_bcp(2));
517 __ bswapl(reg);
518 __ shrl(reg, 16);
519 __ negptr(reg);
520 if (TaggedStackInterpreter) __ shlptr(reg, 1); // index = index*2
521 }
522
523 void TemplateTable::wide_iload() {
524 transition(vtos, itos);
525 locals_index_wide(rbx);
526 __ movl(rax, iaddress(rbx));
527 debug_only(__ verify_local_tag(frame::TagValue, rbx));
528 }
529
530 void TemplateTable::wide_lload() {
531 transition(vtos, ltos);
532 locals_index_wide(rbx);
533 __ movq(rax, laddress(rbx));
534 debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
535 }
536
537 void TemplateTable::wide_fload() {
538 transition(vtos, ftos);
539 locals_index_wide(rbx);
540 __ movflt(xmm0, faddress(rbx));
541 debug_only(__ verify_local_tag(frame::TagValue, rbx));
542 }
543
544 void TemplateTable::wide_dload() {
545 transition(vtos, dtos);
546 locals_index_wide(rbx);
547 __ movdbl(xmm0, daddress(rbx));
548 debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
549 }
550
551 void TemplateTable::wide_aload() {
552 transition(vtos, atos);
553 locals_index_wide(rbx);
554 __ movptr(rax, aaddress(rbx));
555 debug_only(__ verify_local_tag(frame::TagReference, rbx));
556 }
557
558 void TemplateTable::index_check(Register array, Register index) {
559 // destroys rbx
560 // check array
561 __ null_check(array, arrayOopDesc::length_offset_in_bytes());
562 // sign extend index for use by indexed load
563 __ movl2ptr(index, index);
564 // check index
565 __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
566 if (index != rbx) {
567 // ??? convention: move aberrant index into ebx for exception message
568 assert(rbx != array, "different registers");
569 __ movl(rbx, index);
570 }
571 __ jump_cc(Assembler::aboveEqual,
572 ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
573 }
574
575 void TemplateTable::iaload() {
576 transition(itos, itos);
577 __ pop_ptr(rdx);
578 // eax: index
579 // rdx: array
580 index_check(rdx, rax); // kills rbx
581 __ movl(rax, Address(rdx, rax,
582 Address::times_4,
583 arrayOopDesc::base_offset_in_bytes(T_INT)));
605 arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
606 }
607
608 void TemplateTable::daload() {
609 transition(itos, dtos);
610 __ pop_ptr(rdx);
611 // eax: index
612 // rdx: array
613 index_check(rdx, rax); // kills rbx
614 __ movdbl(xmm0, Address(rdx, rax,
615 Address::times_8,
616 arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
617 }
618
619 void TemplateTable::aaload() {
620 transition(itos, atos);
621 __ pop_ptr(rdx);
622 // eax: index
623 // rdx: array
624 index_check(rdx, rax); // kills rbx
625 __ load_heap_oop(rax, Address(rdx, rax,
626 UseCompressedOops ? Address::times_4 : Address::times_8,
627 arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
628 }
629
630 void TemplateTable::baload() {
631 transition(itos, itos);
632 __ pop_ptr(rdx);
633 // eax: index
634 // rdx: array
635 index_check(rdx, rax); // kills rbx
636 __ load_signed_byte(rax,
637 Address(rdx, rax,
638 Address::times_1,
639 arrayOopDesc::base_offset_in_bytes(T_BYTE)));
640 }
641
642 void TemplateTable::caload() {
643 transition(itos, itos);
644 __ pop_ptr(rdx);
645 // eax: index
646 // rdx: array
690 void TemplateTable::lload(int n) {
691 transition(vtos, ltos);
692 __ movq(rax, laddress(n));
693 debug_only(__ verify_local_tag(frame::TagCategory2, n));
694 }
695
696 void TemplateTable::fload(int n) {
697 transition(vtos, ftos);
698 __ movflt(xmm0, faddress(n));
699 debug_only(__ verify_local_tag(frame::TagValue, n));
700 }
701
702 void TemplateTable::dload(int n) {
703 transition(vtos, dtos);
704 __ movdbl(xmm0, daddress(n));
705 debug_only(__ verify_local_tag(frame::TagCategory2, n));
706 }
707
708 void TemplateTable::aload(int n) {
709 transition(vtos, atos);
710 __ movptr(rax, aaddress(n));
711 debug_only(__ verify_local_tag(frame::TagReference, n));
712 }
713
714 void TemplateTable::aload_0() {
715 transition(vtos, atos);
716 // According to bytecode histograms, the pairs:
717 //
718 // _aload_0, _fast_igetfield
719 // _aload_0, _fast_agetfield
720 // _aload_0, _fast_fgetfield
721 //
722 // occur frequently. If RewriteFrequentPairs is set, the (slow)
723 // _aload_0 bytecode checks if the next bytecode is either
724 // _fast_igetfield, _fast_agetfield or _fast_fgetfield and then
725 // rewrites the current bytecode into a pair bytecode; otherwise it
726 // rewrites the current bytecode into _fast_aload_0 that doesn't do
727 // the pair check anymore.
728 //
729 // Note: If the next bytecode is _getfield, the rewrite must be
730 // delayed, otherwise we may miss an opportunity for a pair.
805 }
806
807 void TemplateTable::fstore() {
808 transition(ftos, vtos);
809 locals_index(rbx);
810 __ movflt(faddress(rbx), xmm0);
811 __ tag_local(frame::TagValue, rbx);
812 }
813
814 void TemplateTable::dstore() {
815 transition(dtos, vtos);
816 locals_index(rbx);
817 __ movdbl(daddress(rbx), xmm0);
818 __ tag_local(frame::TagCategory2, rbx);
819 }
820
821 void TemplateTable::astore() {
822 transition(vtos, vtos);
823 __ pop_ptr(rax, rdx); // will need to pop tag too
824 locals_index(rbx);
825 __ movptr(aaddress(rbx), rax);
826 __ tag_local(rdx, rbx); // store tag from stack, might be returnAddr
827 }
828
829 void TemplateTable::wide_istore() {
830 transition(vtos, vtos);
831 __ pop_i();
832 locals_index_wide(rbx);
833 __ movl(iaddress(rbx), rax);
834 __ tag_local(frame::TagValue, rbx);
835 }
836
837 void TemplateTable::wide_lstore() {
838 transition(vtos, vtos);
839 __ pop_l();
840 locals_index_wide(rbx);
841 __ movq(laddress(rbx), rax);
842 __ tag_local(frame::TagCategory2, rbx);
843 }
844
845 void TemplateTable::wide_fstore() {
846 transition(vtos, vtos);
847 __ pop_f();
848 locals_index_wide(rbx);
849 __ movflt(faddress(rbx), xmm0);
850 __ tag_local(frame::TagValue, rbx);
851 }
852
853 void TemplateTable::wide_dstore() {
854 transition(vtos, vtos);
855 __ pop_d();
856 locals_index_wide(rbx);
857 __ movdbl(daddress(rbx), xmm0);
858 __ tag_local(frame::TagCategory2, rbx);
859 }
860
861 void TemplateTable::wide_astore() {
862 transition(vtos, vtos);
863 __ pop_ptr(rax, rdx); // will need to pop tag too
864 locals_index_wide(rbx);
865 __ movptr(aaddress(rbx), rax);
866 __ tag_local(rdx, rbx); // store tag from stack, might be returnAddr
867 }
868
869 void TemplateTable::iastore() {
870 transition(itos, vtos);
871 __ pop_i(rbx);
872 __ pop_ptr(rdx);
873 // eax: value
874 // ebx: index
875 // rdx: array
876 index_check(rdx, rbx); // prefer index in ebx
877 __ movl(Address(rdx, rbx,
878 Address::times_4,
879 arrayOopDesc::base_offset_in_bytes(T_INT)),
880 rax);
881 }
882
883 void TemplateTable::lastore() {
884 transition(ltos, vtos);
885 __ pop_i(rbx);
909 }
910
911 void TemplateTable::dastore() {
912 transition(dtos, vtos);
913 __ pop_i(rbx);
914 __ pop_ptr(rdx);
915 // xmm0: value
916 // ebx: index
917 // rdx: array
918 index_check(rdx, rbx); // prefer index in ebx
919 __ movdbl(Address(rdx, rbx,
920 Address::times_8,
921 arrayOopDesc::base_offset_in_bytes(T_DOUBLE)),
922 xmm0);
923 }
924
925 void TemplateTable::aastore() {
926 Label is_null, ok_is_subtype, done;
927 transition(vtos, vtos);
928 // stack: ..., array, index, value
929 __ movptr(rax, at_tos()); // value
930 __ movl(rcx, at_tos_p1()); // index
931 __ movptr(rdx, at_tos_p2()); // array
932
933 Address element_address(rdx, rcx,
934 UseCompressedOops? Address::times_4 : Address::times_8,
935 arrayOopDesc::base_offset_in_bytes(T_OBJECT));
936
937 index_check(rdx, rcx); // kills rbx
938 // do array store check - check for NULL value first
939 __ testptr(rax, rax);
940 __ jcc(Assembler::zero, is_null);
941
942 // Move subklass into rbx
943 __ load_klass(rbx, rax);
944 // Move superklass into rax
945 __ load_klass(rax, rdx);
946 __ movptr(rax, Address(rax,
947 sizeof(oopDesc) +
948 objArrayKlass::element_klass_offset_in_bytes()));
949 // Compress array + index*oopSize + 12 into a single register. Frees rcx.
950 __ lea(rdx, element_address);
951
952 // Generate subtype check. Blows rcx, rdi
953 // Superklass in rax. Subklass in rbx.
954 __ gen_subtype_check(rbx, ok_is_subtype);
955
956 // Come here on failure
957 // object is at TOS
958 __ jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry));
959
960 // Come here on success
961 __ bind(ok_is_subtype);
962
963 // Get the value we will store
964 __ movptr(rax, at_tos());
965 // Now store using the appropriate barrier
966 do_oop_store(_masm, Address(rdx, 0), rax, _bs->kind(), true);
967 __ jmp(done);
968
969 // Have a NULL in rax, rdx=array, ecx=index. Store NULL at ary[idx]
970 __ bind(is_null);
971 __ profile_null_seen(rbx);
972
973 // Store a NULL
974 do_oop_store(_masm, element_address, noreg, _bs->kind(), true);
975
976 // Pop stack arguments
977 __ bind(done);
978 __ addptr(rsp, 3 * Interpreter::stackElementSize());
979 }
980
981 void TemplateTable::bastore() {
982 transition(itos, vtos);
983 __ pop_i(rbx);
984 __ pop_ptr(rdx);
985 // eax: value
986 // ebx: index
987 // rdx: array
988 index_check(rdx, rbx); // prefer index in ebx
989 __ movb(Address(rdx, rbx,
990 Address::times_1,
991 arrayOopDesc::base_offset_in_bytes(T_BYTE)),
992 rax);
993 }
994
995 void TemplateTable::castore() {
996 transition(itos, vtos);
997 __ pop_i(rbx);
998 __ pop_ptr(rdx);
1020 transition(ltos, vtos);
1021 __ movq(laddress(n), rax);
1022 __ tag_local(frame::TagCategory2, n);
1023 }
1024
1025 void TemplateTable::fstore(int n) {
1026 transition(ftos, vtos);
1027 __ movflt(faddress(n), xmm0);
1028 __ tag_local(frame::TagValue, n);
1029 }
1030
1031 void TemplateTable::dstore(int n) {
1032 transition(dtos, vtos);
1033 __ movdbl(daddress(n), xmm0);
1034 __ tag_local(frame::TagCategory2, n);
1035 }
1036
1037 void TemplateTable::astore(int n) {
1038 transition(vtos, vtos);
1039 __ pop_ptr(rax, rdx);
1040 __ movptr(aaddress(n), rax);
1041 __ tag_local(rdx, n);
1042 }
1043
1044 void TemplateTable::pop() {
1045 transition(vtos, vtos);
1046 __ addptr(rsp, Interpreter::stackElementSize());
1047 }
1048
1049 void TemplateTable::pop2() {
1050 transition(vtos, vtos);
1051 __ addptr(rsp, 2 * Interpreter::stackElementSize());
1052 }
1053
1054 void TemplateTable::dup() {
1055 transition(vtos, vtos);
1056 __ load_ptr_and_tag(0, rax, rdx);
1057 __ push_ptr(rax, rdx);
1058 // stack: ..., a, a
1059 }
1060
1061 void TemplateTable::dup_x1() {
1062 transition(vtos, vtos);
1063 // stack: ..., a, b
1064 __ load_ptr_and_tag(0, rax, rdx); // load b
1065 __ load_ptr_and_tag(1, rcx, rbx); // load a
1066 __ store_ptr_and_tag(1, rax, rdx); // store b
1067 __ store_ptr_and_tag(0, rcx, rbx); // store a
1068 __ push_ptr(rax, rdx); // push b
1069 // stack: ..., b, a, b
1070 }
1071
1142
1143 void TemplateTable::iop2(Operation op) {
1144 transition(itos, itos);
1145 switch (op) {
1146 case add : __ pop_i(rdx); __ addl (rax, rdx); break;
1147 case sub : __ movl(rdx, rax); __ pop_i(rax); __ subl (rax, rdx); break;
1148 case mul : __ pop_i(rdx); __ imull(rax, rdx); break;
1149 case _and : __ pop_i(rdx); __ andl (rax, rdx); break;
1150 case _or : __ pop_i(rdx); __ orl (rax, rdx); break;
1151 case _xor : __ pop_i(rdx); __ xorl (rax, rdx); break;
1152 case shl : __ movl(rcx, rax); __ pop_i(rax); __ shll (rax); break;
1153 case shr : __ movl(rcx, rax); __ pop_i(rax); __ sarl (rax); break;
1154 case ushr : __ movl(rcx, rax); __ pop_i(rax); __ shrl (rax); break;
1155 default : ShouldNotReachHere();
1156 }
1157 }
1158
1159 void TemplateTable::lop2(Operation op) {
1160 transition(ltos, ltos);
1161 switch (op) {
1162 case add : __ pop_l(rdx); __ addptr (rax, rdx); break;
1163 case sub : __ mov(rdx, rax); __ pop_l(rax); __ subptr (rax, rdx); break;
1164 case _and : __ pop_l(rdx); __ andptr (rax, rdx); break;
1165 case _or : __ pop_l(rdx); __ orptr (rax, rdx); break;
1166 case _xor : __ pop_l(rdx); __ xorptr (rax, rdx); break;
1167 default : ShouldNotReachHere();
1168 }
1169 }
1170
1171 void TemplateTable::idiv() {
1172 transition(itos, itos);
1173 __ movl(rcx, rax);
1174 __ pop_i(rax);
1175 // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
1176 // they are not equal, one could do a normal division (no correction
1177 // needed), which may speed up this implementation for the common case.
1178 // (see also JVM spec., p.243 & p.271)
1179 __ corrected_idivl(rcx);
1180 }
1181
1182 void TemplateTable::irem() {
1183 transition(itos, itos);
1184 __ movl(rcx, rax);
1185 __ pop_i(rax);
1186 // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
1187 // they are not equal, one could do a normal division (no correction
1188 // needed), which may speed up this implementation for the common case.
1189 // (see also JVM spec., p.243 & p.271)
1190 __ corrected_idivl(rcx);
1191 __ movl(rax, rdx);
1192 }
1193
1194 void TemplateTable::lmul() {
1195 transition(ltos, ltos);
1196 __ pop_l(rdx);
1197 __ imulq(rax, rdx);
1198 }
1199
1200 void TemplateTable::ldiv() {
1201 transition(ltos, ltos);
1202 __ mov(rcx, rax);
1203 __ pop_l(rax);
1204 // generate explicit div0 check
1205 __ testq(rcx, rcx);
1206 __ jump_cc(Assembler::zero,
1207 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1208 // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1209 // they are not equal, one could do a normal division (no correction
1210 // needed), which may speed up this implementation for the common case.
1211 // (see also JVM spec., p.243 & p.271)
1212 __ corrected_idivq(rcx); // kills rbx
1213 }
1214
1215 void TemplateTable::lrem() {
1216 transition(ltos, ltos);
1217 __ mov(rcx, rax);
1218 __ pop_l(rax);
1219 __ testq(rcx, rcx);
1220 __ jump_cc(Assembler::zero,
1221 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1222 // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1223 // they are not equal, one could do a normal division (no correction
1224 // needed), which may speed up this implementation for the common case.
1225 // (see also JVM spec., p.243 & p.271)
1226 __ corrected_idivq(rcx); // kills rbx
1227 __ mov(rax, rdx);
1228 }
1229
1230 void TemplateTable::lshl() {
1231 transition(itos, ltos);
1232 __ movl(rcx, rax); // get shift count
1233 __ pop_l(rax); // get shift value
1234 __ shlq(rax);
1235 }
1236
1237 void TemplateTable::lshr() {
1238 transition(itos, ltos);
1239 __ movl(rcx, rax); // get shift count
1240 __ pop_l(rax); // get shift value
1241 __ sarq(rax);
1242 }
1243
1244 void TemplateTable::lushr() {
1245 transition(itos, ltos);
1246 __ movl(rcx, rax); // get shift count
1247 __ pop_l(rax); // get shift value
1248 __ shrq(rax);
1249 }
1250
1251 void TemplateTable::fop2(Operation op) {
1252 transition(ftos, ftos);
1253 switch (op) {
1254 case add:
1255 __ addss(xmm0, at_rsp());
1256 __ addptr(rsp, Interpreter::stackElementSize());
1257 break;
1258 case sub:
1259 __ movflt(xmm1, xmm0);
1260 __ pop_f(xmm0);
1261 __ subss(xmm0, xmm1);
1262 break;
1263 case mul:
1264 __ mulss(xmm0, at_rsp());
1265 __ addptr(rsp, Interpreter::stackElementSize());
1266 break;
1267 case div:
1268 __ movflt(xmm1, xmm0);
1269 __ pop_f(xmm0);
1270 __ divss(xmm0, xmm1);
1271 break;
1272 case rem:
1273 __ movflt(xmm1, xmm0);
1274 __ pop_f(xmm0);
1275 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), 2);
1276 break;
1277 default:
1278 ShouldNotReachHere();
1279 break;
1280 }
1281 }
1282
1283 void TemplateTable::dop2(Operation op) {
1284 transition(dtos, dtos);
1285 switch (op) {
1286 case add:
1287 __ addsd(xmm0, at_rsp());
1288 __ addptr(rsp, 2 * Interpreter::stackElementSize());
1289 break;
1290 case sub:
1291 __ movdbl(xmm1, xmm0);
1292 __ pop_d(xmm0);
1293 __ subsd(xmm0, xmm1);
1294 break;
1295 case mul:
1296 __ mulsd(xmm0, at_rsp());
1297 __ addptr(rsp, 2 * Interpreter::stackElementSize());
1298 break;
1299 case div:
1300 __ movdbl(xmm1, xmm0);
1301 __ pop_d(xmm0);
1302 __ divsd(xmm0, xmm1);
1303 break;
1304 case rem:
1305 __ movdbl(xmm1, xmm0);
1306 __ pop_d(xmm0);
1307 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), 2);
1308 break;
1309 default:
1310 ShouldNotReachHere();
1311 break;
1312 }
1313 }
1314
1315 void TemplateTable::ineg() {
1316 transition(itos, itos);
1317 __ negl(rax);
1538 }
1539
1540 void TemplateTable::branch(bool is_jsr, bool is_wide) {
1541 __ get_method(rcx); // rcx holds method
1542 __ profile_taken_branch(rax, rbx); // rax holds updated MDP, rbx
1543 // holds bumped taken count
1544
1545 const ByteSize be_offset = methodOopDesc::backedge_counter_offset() +
1546 InvocationCounter::counter_offset();
1547 const ByteSize inv_offset = methodOopDesc::invocation_counter_offset() +
1548 InvocationCounter::counter_offset();
1549 const int method_offset = frame::interpreter_frame_method_offset * wordSize;
1550
1551 // Load up edx with the branch displacement
1552 __ movl(rdx, at_bcp(1));
1553 __ bswapl(rdx);
1554
1555 if (!is_wide) {
1556 __ sarl(rdx, 16);
1557 }
1558 __ movl2ptr(rdx, rdx);
1559
1560 // Handle all the JSR stuff here, then exit.
1561 // It's much shorter and cleaner than intermingling with the non-JSR
1562 // normal-branch stuff occuring below.
1563 if (is_jsr) {
1564 // Pre-load the next target bytecode into rbx
1565 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1, 0));
1566
1567 // compute return address as bci in rax
1568 __ lea(rax, at_bcp((is_wide ? 5 : 3) -
1569 in_bytes(constMethodOopDesc::codes_offset())));
1570 __ subptr(rax, Address(rcx, methodOopDesc::const_offset()));
1571 // Adjust the bcp in r13 by the displacement in rdx
1572 __ addptr(r13, rdx);
1573 // jsr returns atos that is not an oop
1574 __ push_i(rax);
1575 __ dispatch_only(vtos);
1576 return;
1577 }
1578
1579 // Normal (non-jsr) branch handling
1580
1581 // Adjust the bcp in r13 by the displacement in rdx
1582 __ addptr(r13, rdx);
1583
1584 assert(UseLoopCounter || !UseOnStackReplacement,
1585 "on-stack-replacement requires loop counters");
1586 Label backedge_counter_overflow;
1587 Label profile_method;
1588 Label dispatch;
1589 if (UseLoopCounter) {
1590 // increment backedge counter for backward branches
1591 // rax: MDO
1592 // ebx: MDO bumped taken-count
1593 // rcx: method
1594 // rdx: target offset
1595 // r13: target bcp
1596 // r14: locals pointer
1597 __ testl(rdx, rdx); // check if forward or backward branch
1598 __ jcc(Assembler::positive, dispatch); // count only if backward branch
1599
1600 // increment counter
1601 __ movl(rax, Address(rcx, be_offset)); // load backedge counter
1602 __ incrementl(rax, InvocationCounter::count_increment); // increment
1646 __ bind(dispatch);
1647 }
1648
1649 // Pre-load the next target bytecode into rbx
1650 __ load_unsigned_byte(rbx, Address(r13, 0));
1651
1652 // continue with the bytecode @ target
1653 // eax: return bci for jsr's, unused otherwise
1654 // ebx: target bytecode
1655 // r13: target bcp
1656 __ dispatch_only(vtos);
1657
1658 if (UseLoopCounter) {
1659 if (ProfileInterpreter) {
1660 // Out-of-line code to allocate method data oop.
1661 __ bind(profile_method);
1662 __ call_VM(noreg,
1663 CAST_FROM_FN_PTR(address,
1664 InterpreterRuntime::profile_method), r13);
1665 __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode
1666 __ movptr(rcx, Address(rbp, method_offset));
1667 __ movptr(rcx, Address(rcx,
1668 in_bytes(methodOopDesc::method_data_offset())));
1669 __ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
1670 rcx);
1671 __ test_method_data_pointer(rcx, dispatch);
1672 // offset non-null mdp by MDO::data_offset() + IR::profile_method()
1673 __ addptr(rcx, in_bytes(methodDataOopDesc::data_offset()));
1674 __ addptr(rcx, rax);
1675 __ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
1676 rcx);
1677 __ jmp(dispatch);
1678 }
1679
1680 if (UseOnStackReplacement) {
1681 // invocation counter overflow
1682 __ bind(backedge_counter_overflow);
1683 __ negptr(rdx);
1684 __ addptr(rdx, r13); // branch bcp
1685 // IcoResult frequency_counter_overflow([JavaThread*], address branch_bcp)
1686 __ call_VM(noreg,
1687 CAST_FROM_FN_PTR(address,
1688 InterpreterRuntime::frequency_counter_overflow),
1689 rdx);
1690 __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode
1691
1692 // rax: osr nmethod (osr ok) or NULL (osr not possible)
1693 // ebx: target bytecode
1694 // rdx: scratch
1695 // r14: locals pointer
1696 // r13: bcp
1697 __ testptr(rax, rax); // test result
1698 __ jcc(Assembler::zero, dispatch); // no osr if null
1699 // nmethod may have been invalidated (VM may block upon call_VM return)
1700 __ movl(rcx, Address(rax, nmethod::entry_bci_offset()));
1701 __ cmpl(rcx, InvalidOSREntryBci);
1702 __ jcc(Assembler::equal, dispatch);
1703
1704 // We have the address of an on stack replacement routine in eax
1705 // We need to prepare to execute the OSR method. First we must
1706 // migrate the locals and monitors off of the stack.
1707
1708 __ mov(r13, rax); // save the nmethod
1709
1710 call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
1711
1712 // eax is OSR buffer, move it to expected parameter location
1713 __ mov(j_rarg0, rax);
1714
1715 // We use j_rarg definitions here so that registers don't conflict as parameter
1716 // registers change across platforms as we are in the midst of a calling
1717 // sequence to the OSR nmethod and we don't want collision. These are NOT parameters.
1718
1719 const Register retaddr = j_rarg2;
1720 const Register sender_sp = j_rarg1;
1721
1722 // pop the interpreter frame
1723 __ movptr(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
1724 __ leave(); // remove frame anchor
1725 __ pop(retaddr); // get return address
1726 __ mov(rsp, sender_sp); // set sp to sender sp
1727 // Ensure compiled code always sees stack at proper alignment
1728 __ andptr(rsp, -(StackAlignmentInBytes));
1729
1730 // unlike x86 we need no specialized return from compiled code
1731 // to the interpreter or the call stub.
1732
1733 // push the return address
1734 __ push(retaddr);
1735
1736 // and begin the OSR nmethod
1737 __ jmp(Address(r13, nmethod::osr_entry_point_offset()));
1738 }
1739 }
1740 }
1741
1742
1743 void TemplateTable::if_0cmp(Condition cc) {
1744 transition(itos, vtos);
1745 // assume branch is more often taken than not (loops use backward branches)
1746 Label not_taken;
1747 __ testl(rax, rax);
1748 __ jcc(j_not(cc), not_taken);
1749 branch(false, false);
1750 __ bind(not_taken);
1751 __ profile_not_taken_branch(rax);
1752 }
1753
1754 void TemplateTable::if_icmp(Condition cc) {
1755 transition(itos, vtos);
1756 // assume branch is more often taken than not (loops use backward branches)
1757 Label not_taken;
1758 __ pop_i(rdx);
1759 __ cmpl(rdx, rax);
1760 __ jcc(j_not(cc), not_taken);
1761 branch(false, false);
1762 __ bind(not_taken);
1763 __ profile_not_taken_branch(rax);
1764 }
1765
1766 void TemplateTable::if_nullcmp(Condition cc) {
1767 transition(atos, vtos);
1768 // assume branch is more often taken than not (loops use backward branches)
1769 Label not_taken;
1770 __ testptr(rax, rax);
1771 __ jcc(j_not(cc), not_taken);
1772 branch(false, false);
1773 __ bind(not_taken);
1774 __ profile_not_taken_branch(rax);
1775 }
1776
1777 void TemplateTable::if_acmp(Condition cc) {
1778 transition(atos, vtos);
1779 // assume branch is more often taken than not (loops use backward branches)
1780 Label not_taken;
1781 __ pop_ptr(rdx);
1782 __ cmpptr(rdx, rax);
1783 __ jcc(j_not(cc), not_taken);
1784 branch(false, false);
1785 __ bind(not_taken);
1786 __ profile_not_taken_branch(rax);
1787 }
1788
1789 void TemplateTable::ret() {
1790 transition(vtos, vtos);
1791 locals_index(rbx);
1792 __ movslq(rbx, iaddress(rbx)); // get return bci, compute return bcp
1793 __ profile_ret(rbx, rcx);
1794 __ get_method(rax);
1795 __ movptr(r13, Address(rax, methodOopDesc::const_offset()));
1796 __ lea(r13, Address(r13, rbx, Address::times_1,
1797 constMethodOopDesc::codes_offset()));
1798 __ dispatch_next(vtos);
1799 }
1800
1801 void TemplateTable::wide_ret() {
1802 transition(vtos, vtos);
1803 locals_index_wide(rbx);
1804 __ movptr(rbx, aaddress(rbx)); // get return bci, compute return bcp
1805 __ profile_ret(rbx, rcx);
1806 __ get_method(rax);
1807 __ movptr(r13, Address(rax, methodOopDesc::const_offset()));
1808 __ lea(r13, Address(r13, rbx, Address::times_1, constMethodOopDesc::codes_offset()));
1809 __ dispatch_next(vtos);
1810 }
1811
1812 void TemplateTable::tableswitch() {
1813 Label default_case, continue_execution;
1814 transition(itos, vtos);
1815 // align r13
1816 __ lea(rbx, at_bcp(BytesPerInt));
1817 __ andptr(rbx, -BytesPerInt);
1818 // load lo & hi
1819 __ movl(rcx, Address(rbx, BytesPerInt));
1820 __ movl(rdx, Address(rbx, 2 * BytesPerInt));
1821 __ bswapl(rcx);
1822 __ bswapl(rdx);
1823 // check against lo & hi
1824 __ cmpl(rax, rcx);
1825 __ jcc(Assembler::less, default_case);
1826 __ cmpl(rax, rdx);
1827 __ jcc(Assembler::greater, default_case);
1828 // lookup dispatch offset
1829 __ subl(rax, rcx);
1830 __ movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt));
1831 __ profile_switch_case(rax, rbx, rcx);
1832 // continue execution
1833 __ bind(continue_execution);
1834 __ bswapl(rdx);
1835 __ movl2ptr(rdx, rdx);
1836 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
1837 __ addptr(r13, rdx);
1838 __ dispatch_only(vtos);
1839 // handle default
1840 __ bind(default_case);
1841 __ profile_switch_default(rax);
1842 __ movl(rdx, Address(rbx, 0));
1843 __ jmp(continue_execution);
1844 }
1845
1846 void TemplateTable::lookupswitch() {
1847 transition(itos, itos);
1848 __ stop("lookupswitch bytecode should have been rewritten");
1849 }
1850
1851 void TemplateTable::fast_linearswitch() {
1852 transition(itos, vtos);
1853 Label loop_entry, loop, found, continue_execution;
1854 // bswap rax so we can avoid bswapping the table entries
1855 __ bswapl(rax);
1856 // align r13
1857 __ lea(rbx, at_bcp(BytesPerInt)); // btw: should be able to get rid of
1858 // this instruction (change offsets
1859 // below)
1860 __ andptr(rbx, -BytesPerInt);
1861 // set counter
1862 __ movl(rcx, Address(rbx, BytesPerInt));
1863 __ bswapl(rcx);
1864 __ jmpb(loop_entry);
1865 // table search
1866 __ bind(loop);
1867 __ cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * BytesPerInt));
1868 __ jcc(Assembler::equal, found);
1869 __ bind(loop_entry);
1870 __ decrementl(rcx);
1871 __ jcc(Assembler::greaterEqual, loop);
1872 // default case
1873 __ profile_switch_default(rax);
1874 __ movl(rdx, Address(rbx, 0));
1875 __ jmp(continue_execution);
1876 // entry found -> get offset
1877 __ bind(found);
1878 __ movl(rdx, Address(rbx, rcx, Address::times_8, 3 * BytesPerInt));
1879 __ profile_switch_case(rcx, rax, rbx);
1880 // continue execution
1881 __ bind(continue_execution);
1882 __ bswapl(rdx);
1883 __ movl2ptr(rdx, rdx);
1884 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
1885 __ addptr(r13, rdx);
1886 __ dispatch_only(vtos);
1887 }
1888
1889 void TemplateTable::fast_binaryswitch() {
1890 transition(itos, vtos);
1891 // Implementation using the following core algorithm:
1892 //
1893 // int binary_search(int key, LookupswitchPair* array, int n) {
1894 // // Binary search according to "Methodik des Programmierens" by
1895 // // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
1896 // int i = 0;
1897 // int j = n;
1898 // while (i+1 < j) {
1899 // // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
1900 // // with Q: for all i: 0 <= i < n: key < a[i]
1901 // // where a stands for the array and assuming that the (inexisting)
1902 // // element a[n] is infinitely big.
1903 // int h = (i + j) >> 1;
1904 // // i < h < j
1905 // if (key < array[h].fast_match()) {
1906 // j = h;
1907 // } else {
1908 // i = h;
1909 // }
1910 // }
1911 // // R: a[i] <= key < a[i+1] or Q
1912 // // (i.e., if key is within array, i is the correct index)
1913 // return i;
1914 // }
1915
1916 // Register allocation
1917 const Register key = rax; // already set (tosca)
1918 const Register array = rbx;
1919 const Register i = rcx;
1920 const Register j = rdx;
1921 const Register h = rdi;
1922 const Register temp = rsi;
1923
1924 // Find array start
1925 __ lea(array, at_bcp(3 * BytesPerInt)); // btw: should be able to
1926 // get rid of this
1927 // instruction (change
1928 // offsets below)
1929 __ andptr(array, -BytesPerInt);
1930
1931 // Initialize i & j
1932 __ xorl(i, i); // i = 0;
1933 __ movl(j, Address(array, -BytesPerInt)); // j = length(array);
1934
1935 // Convert j into native byteordering
1936 __ bswapl(j);
1937
1938 // And start
1939 Label entry;
1940 __ jmp(entry);
1941
1942 // binary search loop
1943 {
1944 Label loop;
1945 __ bind(loop);
1946 // int h = (i + j) >> 1;
1947 __ leal(h, Address(i, j, Address::times_1)); // h = i + j;
1948 __ sarl(h, 1); // h = (i + j) >> 1;
1949 // if (key < array[h].fast_match()) {
1961 __ cmovl(Assembler::greaterEqual, i, h);
1962 // while (i+1 < j)
1963 __ bind(entry);
1964 __ leal(h, Address(i, 1)); // i+1
1965 __ cmpl(h, j); // i+1 < j
1966 __ jcc(Assembler::less, loop);
1967 }
1968
1969 // end of binary search, result index is i (must check again!)
1970 Label default_case;
1971 // Convert array[i].match to native byte-ordering before compare
1972 __ movl(temp, Address(array, i, Address::times_8));
1973 __ bswapl(temp);
1974 __ cmpl(key, temp);
1975 __ jcc(Assembler::notEqual, default_case);
1976
1977 // entry found -> j = offset
1978 __ movl(j , Address(array, i, Address::times_8, BytesPerInt));
1979 __ profile_switch_case(i, key, array);
1980 __ bswapl(j);
1981 __ movl2ptr(j, j);
1982 __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
1983 __ addptr(r13, j);
1984 __ dispatch_only(vtos);
1985
1986 // default case -> j = default offset
1987 __ bind(default_case);
1988 __ profile_switch_default(i);
1989 __ movl(j, Address(array, -2 * BytesPerInt));
1990 __ bswapl(j);
1991 __ movl2ptr(j, j);
1992 __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
1993 __ addptr(r13, j);
1994 __ dispatch_only(vtos);
1995 }
1996
1997
1998 void TemplateTable::_return(TosState state) {
1999 transition(state, state);
2000 assert(_desc->calls_vm(),
2001 "inconsistent calls_vm information"); // call in remove_activation
2002
2003 if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
2004 assert(state == vtos, "only valid state");
2005 __ movptr(c_rarg1, aaddress(0));
2006 __ load_klass(rdi, c_rarg1);
2007 __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
2008 __ testl(rdi, JVM_ACC_HAS_FINALIZER);
2009 Label skip_register_finalizer;
2010 __ jcc(Assembler::zero, skip_register_finalizer);
2011
2012 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1);
2013
2014 __ bind(skip_register_finalizer);
2015 }
2016
2017 __ remove_activation(state, r13);
2018 __ jmp(r13);
2019 }
2020
2021 // ----------------------------------------------------------------------------
2022 // Volatile variables demand their effects be made known to all CPU's
2023 // in order. Store buffers on most chips allow reads & writes to
2024 // reorder; the JMM's ReadAfterWrite.java test fails in -Xint mode
2025 // without some kind of memory barrier (i.e., it's not sufficient that
2026 // the interpreter does not reorder volatile references, the hardware
2096 }
2097 __ movl(temp, (int) bytecode());
2098 __ call_VM(noreg, entry, temp);
2099
2100 // Update registers with resolved info
2101 __ get_cache_and_index_at_bcp(Rcache, index, 1);
2102 __ bind(resolved);
2103 }
2104
2105 // The Rcache and index registers must be set before call
2106 void TemplateTable::load_field_cp_cache_entry(Register obj,
2107 Register cache,
2108 Register index,
2109 Register off,
2110 Register flags,
2111 bool is_static = false) {
2112 assert_different_registers(cache, index, flags, off);
2113
2114 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
2115 // Field offset
2116 __ movptr(off, Address(cache, index, Address::times_8,
2117 in_bytes(cp_base_offset +
2118 ConstantPoolCacheEntry::f2_offset())));
2119 // Flags
2120 __ movl(flags, Address(cache, index, Address::times_8,
2121 in_bytes(cp_base_offset +
2122 ConstantPoolCacheEntry::flags_offset())));
2123
2124 // klass overwrite register
2125 if (is_static) {
2126 __ movptr(obj, Address(cache, index, Address::times_8,
2127 in_bytes(cp_base_offset +
2128 ConstantPoolCacheEntry::f1_offset())));
2129 }
2130 }
2131
2132 void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
2133 Register method,
2134 Register itable_index,
2135 Register flags,
2136 bool is_invokevirtual,
2137 bool is_invokevfinal /*unused*/) {
2138 // setup registers
2139 const Register cache = rcx;
2140 const Register index = rdx;
2141 assert_different_registers(method, flags);
2142 assert_different_registers(method, cache, index);
2143 assert_different_registers(itable_index, flags);
2144 assert_different_registers(itable_index, cache, index);
2145 // determine constant pool cache field offsets
2146 const int method_offset = in_bytes(
2147 constantPoolCacheOopDesc::base_offset() +
2148 (is_invokevirtual
2149 ? ConstantPoolCacheEntry::f2_offset()
2150 : ConstantPoolCacheEntry::f1_offset()));
2151 const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2152 ConstantPoolCacheEntry::flags_offset());
2153 // access constant pool cache fields
2154 const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2155 ConstantPoolCacheEntry::f2_offset());
2156
2157 resolve_cache_and_index(byte_no, cache, index);
2158
2159 assert(wordSize == 8, "adjust code below");
2160 __ movptr(method, Address(cache, index, Address::times_8, method_offset));
2161 if (itable_index != noreg) {
2162 __ movptr(itable_index,
2163 Address(cache, index, Address::times_8, index_offset));
2164 }
2165 __ movl(flags , Address(cache, index, Address::times_8, flags_offset));
2166 }
2167
2168
2169 // The registers cache and index expected to be set before call.
2170 // Correct values of the cache and index registers are preserved.
2171 void TemplateTable::jvmti_post_field_access(Register cache, Register index,
2172 bool is_static, bool has_tos) {
2173 // do the JVMTI work here to avoid disturbing the register state below
2174 // We use c_rarg registers here because we want to use the register used in
2175 // the call to the VM
2176 if (JvmtiExport::can_post_field_access()) {
2177 // Check to see if a field access watch has been set before we
2178 // take the time to call into the VM.
2179 Label L1;
2180 assert_different_registers(cache, index, rax);
2181 __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2182 __ testl(rax, rax);
2183 __ jcc(Assembler::zero, L1);
2184
2185 __ get_cache_and_index_at_bcp(c_rarg2, c_rarg3, 1);
2186
2187 // cache entry pointer
2188 __ addptr(c_rarg2, in_bytes(constantPoolCacheOopDesc::base_offset()));
2189 __ shll(c_rarg3, LogBytesPerWord);
2190 __ addptr(c_rarg2, c_rarg3);
2191 if (is_static) {
2192 __ xorl(c_rarg1, c_rarg1); // NULL object reference
2193 } else {
2194 __ movptr(c_rarg1, at_tos()); // get object pointer without popping it
2195 __ verify_oop(c_rarg1);
2196 }
2197 // c_rarg1: object pointer or NULL
2198 // c_rarg2: cache entry pointer
2199 // c_rarg3: jvalue object on the stack
2200 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
2201 InterpreterRuntime::post_field_access),
2202 c_rarg1, c_rarg2, c_rarg3);
2203 __ get_cache_and_index_at_bcp(cache, index, 1);
2204 __ bind(L1);
2205 }
2206 }
2207
2208 void TemplateTable::pop_and_check_object(Register r) {
2209 __ pop_ptr(r);
2210 __ null_check(r); // for field access must check obj.
2211 __ verify_oop(r);
2212 }
2213
2214 void TemplateTable::getfield_or_static(int byte_no, bool is_static) {
2236 notLong, notFloat, notObj, notDouble;
2237
2238 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2239 assert(btos == 0, "change code, btos != 0");
2240
2241 __ andl(flags, 0x0F);
2242 __ jcc(Assembler::notZero, notByte);
2243 // btos
2244 __ load_signed_byte(rax, field);
2245 __ push(btos);
2246 // Rewrite bytecode to be faster
2247 if (!is_static) {
2248 patch_bytecode(Bytecodes::_fast_bgetfield, bc, rbx);
2249 }
2250 __ jmp(Done);
2251
2252 __ bind(notByte);
2253 __ cmpl(flags, atos);
2254 __ jcc(Assembler::notEqual, notObj);
2255 // atos
2256 __ load_heap_oop(rax, field);
2257 __ push(atos);
2258 if (!is_static) {
2259 patch_bytecode(Bytecodes::_fast_agetfield, bc, rbx);
2260 }
2261 __ jmp(Done);
2262
2263 __ bind(notObj);
2264 __ cmpl(flags, itos);
2265 __ jcc(Assembler::notEqual, notInt);
2266 // itos
2267 __ movl(rax, field);
2268 __ push(itos);
2269 // Rewrite bytecode to be faster
2270 if (!is_static) {
2271 patch_bytecode(Bytecodes::_fast_igetfield, bc, rbx);
2272 }
2273 __ jmp(Done);
2274
2275 __ bind(notInt);
2276 __ cmpl(flags, ctos);
2371 __ jcc(Assembler::zero, L1);
2372
2373 __ get_cache_and_index_at_bcp(c_rarg2, rscratch1, 1);
2374
2375 if (is_static) {
2376 // Life is simple. Null out the object pointer.
2377 __ xorl(c_rarg1, c_rarg1);
2378 } else {
2379 // Life is harder. The stack holds the value on top, followed by
2380 // the object. We don't know the size of the value, though; it
2381 // could be one or two words depending on its type. As a result,
2382 // we must find the type to determine where the object is.
2383 __ movl(c_rarg3, Address(c_rarg2, rscratch1,
2384 Address::times_8,
2385 in_bytes(cp_base_offset +
2386 ConstantPoolCacheEntry::flags_offset())));
2387 __ shrl(c_rarg3, ConstantPoolCacheEntry::tosBits);
2388 // Make sure we don't need to mask rcx for tosBits after the
2389 // above shift
2390 ConstantPoolCacheEntry::verify_tosBits();
2391 __ movptr(c_rarg1, at_tos_p1()); // initially assume a one word jvalue
2392 __ cmpl(c_rarg3, ltos);
2393 __ cmovptr(Assembler::equal,
2394 c_rarg1, at_tos_p2()); // ltos (two word jvalue)
2395 __ cmpl(c_rarg3, dtos);
2396 __ cmovptr(Assembler::equal,
2397 c_rarg1, at_tos_p2()); // dtos (two word jvalue)
2398 }
2399 // cache entry pointer
2400 __ addptr(c_rarg2, in_bytes(cp_base_offset));
2401 __ shll(rscratch1, LogBytesPerWord);
2402 __ addptr(c_rarg2, rscratch1);
2403 // object (tos)
2404 __ mov(c_rarg3, rsp);
2405 // c_rarg1: object pointer set up above (NULL if static)
2406 // c_rarg2: cache entry pointer
2407 // c_rarg3: jvalue object on the stack
2408 __ call_VM(noreg,
2409 CAST_FROM_FN_PTR(address,
2410 InterpreterRuntime::post_field_modification),
2411 c_rarg1, c_rarg2, c_rarg3);
2412 __ get_cache_and_index_at_bcp(cache, index, 1);
2413 __ bind(L1);
2414 }
2415 }
2416
2417 void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
2418 transition(vtos, vtos);
2419
2420 const Register cache = rcx;
2421 const Register index = rdx;
2422 const Register obj = rcx;
2423 const Register off = rbx;
2424 const Register flags = rax;
2446 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2447
2448 assert(btos == 0, "change code, btos != 0");
2449 __ andl(flags, 0x0f);
2450 __ jcc(Assembler::notZero, notByte);
2451 // btos
2452 __ pop(btos);
2453 if (!is_static) pop_and_check_object(obj);
2454 __ movb(field, rax);
2455 if (!is_static) {
2456 patch_bytecode(Bytecodes::_fast_bputfield, bc, rbx);
2457 }
2458 __ jmp(Done);
2459
2460 __ bind(notByte);
2461 __ cmpl(flags, atos);
2462 __ jcc(Assembler::notEqual, notObj);
2463 // atos
2464 __ pop(atos);
2465 if (!is_static) pop_and_check_object(obj);
2466
2467 // Store into the field
2468 do_oop_store(_masm, field, rax, _bs->kind(), false);
2469
2470 if (!is_static) {
2471 patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx);
2472 }
2473 __ jmp(Done);
2474
2475 __ bind(notObj);
2476 __ cmpl(flags, itos);
2477 __ jcc(Assembler::notEqual, notInt);
2478 // itos
2479 __ pop(itos);
2480 if (!is_static) pop_and_check_object(obj);
2481 __ movl(field, rax);
2482 if (!is_static) {
2483 patch_bytecode(Bytecodes::_fast_iputfield, bc, rbx);
2484 }
2485 __ jmp(Done);
2486
2487 __ bind(notInt);
2488 __ cmpl(flags, ctos);
2489 __ jcc(Assembler::notEqual, notChar);
2564
2565 void TemplateTable::putfield(int byte_no) {
2566 putfield_or_static(byte_no, false);
2567 }
2568
2569 void TemplateTable::putstatic(int byte_no) {
2570 putfield_or_static(byte_no, true);
2571 }
2572
2573 void TemplateTable::jvmti_post_fast_field_mod() {
2574 if (JvmtiExport::can_post_field_modification()) {
2575 // Check to see if a field modification watch has been set before
2576 // we take the time to call into the VM.
2577 Label L2;
2578 __ mov32(c_rarg3, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
2579 __ testl(c_rarg3, c_rarg3);
2580 __ jcc(Assembler::zero, L2);
2581 __ pop_ptr(rbx); // copy the object pointer from tos
2582 __ verify_oop(rbx);
2583 __ push_ptr(rbx); // put the object pointer back on tos
2584 __ subptr(rsp, sizeof(jvalue)); // add space for a jvalue object
2585 __ mov(c_rarg3, rsp);
2586 const Address field(c_rarg3, 0);
2587
2588 switch (bytecode()) { // load values into the jvalue object
2589 case Bytecodes::_fast_aputfield: __ movq(field, rax); break;
2590 case Bytecodes::_fast_lputfield: __ movq(field, rax); break;
2591 case Bytecodes::_fast_iputfield: __ movl(field, rax); break;
2592 case Bytecodes::_fast_bputfield: __ movb(field, rax); break;
2593 case Bytecodes::_fast_sputfield: // fall through
2594 case Bytecodes::_fast_cputfield: __ movw(field, rax); break;
2595 case Bytecodes::_fast_fputfield: __ movflt(field, xmm0); break;
2596 case Bytecodes::_fast_dputfield: __ movdbl(field, xmm0); break;
2597 default:
2598 ShouldNotReachHere();
2599 }
2600
2601 // Save rax because call_VM() will clobber it, then use it for
2602 // JVMTI purposes
2603 __ push(rax);
2604 // access constant pool cache entry
2605 __ get_cache_entry_pointer_at_bcp(c_rarg2, rax, 1);
2606 __ verify_oop(rbx);
2607 // rbx: object pointer copied above
2608 // c_rarg2: cache entry pointer
2609 // c_rarg3: jvalue object on the stack
2610 __ call_VM(noreg,
2611 CAST_FROM_FN_PTR(address,
2612 InterpreterRuntime::post_field_modification),
2613 rbx, c_rarg2, c_rarg3);
2614 __ pop(rax); // restore lower value
2615 __ addptr(rsp, sizeof(jvalue)); // release jvalue object space
2616 __ bind(L2);
2617 }
2618 }
2619
2620 void TemplateTable::fast_storefield(TosState state) {
2621 transition(state, vtos);
2622
2623 ByteSize base = constantPoolCacheOopDesc::base_offset();
2624
2625 jvmti_post_fast_field_mod();
2626
2627 // access constant pool cache
2628 __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2629
2630 // test for volatile with rdx
2631 __ movl(rdx, Address(rcx, rbx, Address::times_8,
2632 in_bytes(base +
2633 ConstantPoolCacheEntry::flags_offset())));
2634
2635 // replace index with field offset from cache entry
2636 __ movptr(rbx, Address(rcx, rbx, Address::times_8,
2637 in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
2638
2639 // [jk] not needed currently
2640 // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore |
2641 // Assembler::StoreStore));
2642
2643 Label notVolatile;
2644 __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2645 __ andl(rdx, 0x1);
2646
2647 // Get object from stack
2648 pop_and_check_object(rcx);
2649
2650 // field address
2651 const Address field(rcx, rbx, Address::times_1);
2652
2653 // access field
2654 switch (bytecode()) {
2655 case Bytecodes::_fast_aputfield:
2656 do_oop_store(_masm, field, rax, _bs->kind(), false);
2657 break;
2658 case Bytecodes::_fast_lputfield:
2659 __ movq(field, rax);
2660 break;
2661 case Bytecodes::_fast_iputfield:
2662 __ movl(field, rax);
2663 break;
2664 case Bytecodes::_fast_bputfield:
2665 __ movb(field, rax);
2666 break;
2667 case Bytecodes::_fast_sputfield:
2668 // fall through
2669 case Bytecodes::_fast_cputfield:
2670 __ movw(field, rax);
2671 break;
2672 case Bytecodes::_fast_fputfield:
2673 __ movflt(field, xmm0);
2674 break;
2675 case Bytecodes::_fast_dputfield:
2676 __ movdbl(field, xmm0);
2684 __ jcc(Assembler::zero, notVolatile);
2685 volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
2686 Assembler::StoreStore));
2687 __ bind(notVolatile);
2688 }
2689
2690
2691 void TemplateTable::fast_accessfield(TosState state) {
2692 transition(atos, state);
2693
2694 // Do the JVMTI work here to avoid disturbing the register state below
2695 if (JvmtiExport::can_post_field_access()) {
2696 // Check to see if a field access watch has been set before we
2697 // take the time to call into the VM.
2698 Label L1;
2699 __ mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2700 __ testl(rcx, rcx);
2701 __ jcc(Assembler::zero, L1);
2702 // access constant pool cache entry
2703 __ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1);
2704 __ verify_oop(rax);
2705 __ mov(r12, rax); // save object pointer before call_VM() clobbers it
2706 __ mov(c_rarg1, rax);
2707 // c_rarg1: object pointer copied above
2708 // c_rarg2: cache entry pointer
2709 __ call_VM(noreg,
2710 CAST_FROM_FN_PTR(address,
2711 InterpreterRuntime::post_field_access),
2712 c_rarg1, c_rarg2);
2713 __ mov(rax, r12); // restore object pointer
2714 __ reinit_heapbase();
2715 __ bind(L1);
2716 }
2717
2718 // access constant pool cache
2719 __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2720 // replace index with field offset from cache entry
2721 // [jk] not needed currently
2722 // if (os::is_MP()) {
2723 // __ movl(rdx, Address(rcx, rbx, Address::times_8,
2724 // in_bytes(constantPoolCacheOopDesc::base_offset() +
2725 // ConstantPoolCacheEntry::flags_offset())));
2726 // __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2727 // __ andl(rdx, 0x1);
2728 // }
2729 __ movptr(rbx, Address(rcx, rbx, Address::times_8,
2730 in_bytes(constantPoolCacheOopDesc::base_offset() +
2731 ConstantPoolCacheEntry::f2_offset())));
2732
2733 // rax: object
2734 __ verify_oop(rax);
2735 __ null_check(rax);
2736 Address field(rax, rbx, Address::times_1);
2737
2738 // access field
2739 switch (bytecode()) {
2740 case Bytecodes::_fast_agetfield:
2741 __ load_heap_oop(rax, field);
2742 __ verify_oop(rax);
2743 break;
2744 case Bytecodes::_fast_lgetfield:
2745 __ movq(rax, field);
2746 break;
2747 case Bytecodes::_fast_igetfield:
2748 __ movl(rax, field);
2749 break;
2750 case Bytecodes::_fast_bgetfield:
2751 __ movsbl(rax, field);
2752 break;
2753 case Bytecodes::_fast_sgetfield:
2754 __ load_signed_word(rax, field);
2755 break;
2756 case Bytecodes::_fast_cgetfield:
2757 __ load_unsigned_word(rax, field);
2758 break;
2759 case Bytecodes::_fast_fgetfield:
2760 __ movflt(xmm0, field);
2761 break;
2762 case Bytecodes::_fast_dgetfield:
2763 __ movdbl(xmm0, field);
2764 break;
2765 default:
2766 ShouldNotReachHere();
2767 }
2768 // [jk] not needed currently
2769 // if (os::is_MP()) {
2770 // Label notVolatile;
2771 // __ testl(rdx, rdx);
2772 // __ jcc(Assembler::zero, notVolatile);
2773 // __ membar(Assembler::LoadLoad);
2774 // __ bind(notVolatile);
2775 //};
2776 }
2777
2778 void TemplateTable::fast_xaccess(TosState state) {
2779 transition(vtos, state);
2780
2781 // get receiver
2782 __ movptr(rax, aaddress(0));
2783 debug_only(__ verify_local_tag(frame::TagReference, 0));
2784 // access constant pool cache
2785 __ get_cache_and_index_at_bcp(rcx, rdx, 2);
2786 __ movptr(rbx,
2787 Address(rcx, rdx, Address::times_8,
2788 in_bytes(constantPoolCacheOopDesc::base_offset() +
2789 ConstantPoolCacheEntry::f2_offset())));
2790 // make sure exception is reported in correct bcp range (getfield is
2791 // next instruction)
2792 __ increment(r13);
2793 __ null_check(rax);
2794 switch (state) {
2795 case itos:
2796 __ movl(rax, Address(rax, rbx, Address::times_1));
2797 break;
2798 case atos:
2799 __ load_heap_oop(rax, Address(rax, rbx, Address::times_1));
2800 __ verify_oop(rax);
2801 break;
2802 case ftos:
2803 __ movflt(xmm0, Address(rax, rbx, Address::times_1));
2804 break;
2805 default:
2806 ShouldNotReachHere();
2807 }
2808
2809 // [jk] not needed currently
2810 // if (os::is_MP()) {
2811 // Label notVolatile;
2812 // __ movl(rdx, Address(rcx, rdx, Address::times_8,
2813 // in_bytes(constantPoolCacheOopDesc::base_offset() +
2814 // ConstantPoolCacheEntry::flags_offset())));
2815 // __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2816 // __ testl(rdx, 0x1);
2817 // __ jcc(Assembler::zero, notVolatile);
2818 // __ membar(Assembler::LoadLoad);
2819 // __ bind(notVolatile);
2820 // }
2821
2822 __ decrement(r13);
2823 }
2824
2825
2826
2827 //-----------------------------------------------------------------------------
2828 // Calls
2829
2830 void TemplateTable::count_calls(Register method, Register temp) {
2831 // implemented elsewhere
2832 ShouldNotReachHere();
2833 }
2834
2835 void TemplateTable::prepare_invoke(Register method,
2836 Register index,
2837 int byte_no,
2838 Bytecodes::Code code) {
2839 // determine flags
2840 const bool is_invokeinterface = code == Bytecodes::_invokeinterface;
2841 const bool is_invokevirtual = code == Bytecodes::_invokevirtual;
2842 const bool is_invokespecial = code == Bytecodes::_invokespecial;
2843 const bool load_receiver = code != Bytecodes::_invokestatic;
2844 const bool receiver_null_check = is_invokespecial;
2845 const bool save_flags = is_invokeinterface || is_invokevirtual;
2846 // setup registers & access constant pool cache
2847 const Register recv = rcx;
2848 const Register flags = rdx;
2849 assert_different_registers(method, index, recv, flags);
2850
2851 // save 'interpreter return address'
2852 __ save_bcp();
2853
2854 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual);
2855
2856 // load receiver if needed (note: no return address pushed yet)
2857 if (load_receiver) {
2858 __ movl(recv, flags);
2859 __ andl(recv, 0xFF);
2860 if (TaggedStackInterpreter) __ shll(recv, 1); // index*2
2861 __ movptr(recv, Address(rsp, recv, Address::times_8,
2862 -Interpreter::expr_offset_in_bytes(1)));
2863 __ verify_oop(recv);
2864 }
2865
2866 // do null check if needed
2867 if (receiver_null_check) {
2868 __ null_check(recv);
2869 }
2870
2871 if (save_flags) {
2872 __ movl(r13, flags);
2873 }
2874
2875 // compute return type
2876 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2877 // Make sure we don't need to mask flags for tosBits after the above shift
2878 ConstantPoolCacheEntry::verify_tosBits();
2879 // load return address
2880 {
2881 ExternalAddress return_5((address)Interpreter::return_5_addrs_by_index_table());
2882 ExternalAddress return_3((address)Interpreter::return_3_addrs_by_index_table());
2883 __ lea(rscratch1, (is_invokeinterface ? return_5 : return_3));
2884 __ movptr(flags, Address(rscratch1, flags, Address::times_8));
2885 }
2886
2887 // push return address
2888 __ push(flags);
2889
2890 // Restore flag field from the constant pool cache, and restore esi
2891 // for later null checks. r13 is the bytecode pointer
2892 if (save_flags) {
2893 __ movl(flags, r13);
2894 __ restore_bcp();
2895 }
2896 }
2897
2898
2899 void TemplateTable::invokevirtual_helper(Register index,
2900 Register recv,
2901 Register flags) {
2902 // Uses temporary registers rax, rdx assert_different_registers(index, recv, rax, rdx);
2903
2904 // Test for an invoke of a final method
2905 Label notFinal;
2906 __ movl(rax, flags);
2907 __ andl(rax, (1 << ConstantPoolCacheEntry::vfinalMethod));
2908 __ jcc(Assembler::zero, notFinal);
2909
2910 const Register method = index; // method must be rbx
2911 assert(method == rbx,
2912 "methodOop must be rbx for interpreter calling convention");
2913
2914 // do the call - the index is actually the method to call
2915 __ verify_oop(method);
2916
2917 // It's final, need a null check here!
2918 __ null_check(recv);
2919
2920 // profile this call
2921 __ profile_final_call(rax);
2922
2923 __ jump_from_interpreted(method, rax);
2924
2925 __ bind(notFinal);
2926
2927 // get receiver klass
2928 __ null_check(recv, oopDesc::klass_offset_in_bytes());
2929 __ load_klass(rax, recv);
2930
2931 __ verify_oop(rax);
2932
2933 // profile this call
2934 __ profile_virtual_call(rax, r14, rdx);
2935
2936 // get target methodOop & entry point
2937 const int base = instanceKlass::vtable_start_offset() * wordSize;
2938 assert(vtableEntry::size() * wordSize == 8,
2939 "adjust the scaling in the code below");
2940 __ movptr(method, Address(rax, index,
2941 Address::times_8,
2942 base + vtableEntry::method_offset_in_bytes()));
2943 __ movptr(rdx, Address(method, methodOopDesc::interpreter_entry_offset()));
2944 __ jump_from_interpreted(method, rdx);
2945 }
2946
2947
2948 void TemplateTable::invokevirtual(int byte_no) {
2949 transition(vtos, vtos);
2950 prepare_invoke(rbx, noreg, byte_no, bytecode());
2951
2952 // rbx: index
2953 // rcx: receiver
2954 // rdx: flags
2955
2956 invokevirtual_helper(rbx, rcx, rdx);
2957 }
2958
2959
2960 void TemplateTable::invokespecial(int byte_no) {
2961 transition(vtos, vtos);
2962 prepare_invoke(rbx, noreg, byte_no, bytecode());
2963 // do the call
2987
2988 // rax: Interface
2989 // rbx: index
2990 // rcx: receiver
2991 // rdx: flags
2992
2993 // Special case of invokeinterface called for virtual method of
2994 // java.lang.Object. See cpCacheOop.cpp for details.
2995 // This code isn't produced by javac, but could be produced by
2996 // another compliant java compiler.
2997 Label notMethod;
2998 __ movl(r14, rdx);
2999 __ andl(r14, (1 << ConstantPoolCacheEntry::methodInterface));
3000 __ jcc(Assembler::zero, notMethod);
3001
3002 invokevirtual_helper(rbx, rcx, rdx);
3003 __ bind(notMethod);
3004
3005 // Get receiver klass into rdx - also a null check
3006 __ restore_locals(); // restore r14
3007 __ load_klass(rdx, rcx);
3008 __ verify_oop(rdx);
3009
3010 // profile this call
3011 __ profile_virtual_call(rdx, r13, r14);
3012
3013 __ mov(r14, rdx); // Save klassOop in r14
3014
3015 // Compute start of first itableOffsetEntry (which is at the end of
3016 // the vtable)
3017 const int base = instanceKlass::vtable_start_offset() * wordSize;
3018 // Get length of vtable
3019 assert(vtableEntry::size() * wordSize == 8,
3020 "adjust the scaling in the code below");
3021 __ movl(r13, Address(rdx,
3022 instanceKlass::vtable_length_offset() * wordSize));
3023 __ lea(rdx, Address(rdx, r13, Address::times_8, base));
3024
3025 if (HeapWordsPerLong > 1) {
3026 // Round up to align_object_offset boundary
3027 __ round_to(rdx, BytesPerLong);
3028 }
3029
3030 Label entry, search, interface_ok;
3031
3032 __ jmpb(entry);
3033 __ bind(search);
3034 __ addptr(rdx, itableOffsetEntry::size() * wordSize);
3035
3036 __ bind(entry);
3037
3038 // Check that the entry is non-null. A null entry means that the
3039 // receiver class doesn't implement the interface, and wasn't the
3040 // same as the receiver class checked when the interface was
3041 // resolved.
3042 __ push(rdx);
3043 __ movptr(rdx, Address(rdx, itableOffsetEntry::interface_offset_in_bytes()));
3044 __ testptr(rdx, rdx);
3045 __ jcc(Assembler::notZero, interface_ok);
3046 // throw exception
3047 __ pop(rdx); // pop saved register first.
3048 __ pop(rbx); // pop return address (pushed by prepare_invoke)
3049 __ restore_bcp(); // r13 must be correct for exception handler (was
3050 // destroyed)
3051 __ restore_locals(); // make sure locals pointer is correct as well
3052 // (was destroyed)
3053 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
3054 InterpreterRuntime::throw_IncompatibleClassChangeError));
3055 // the call_VM checks for exception, so we should never return here.
3056 __ should_not_reach_here();
3057 __ bind(interface_ok);
3058
3059 __ pop(rdx);
3060
3061 __ cmpptr(rax, Address(rdx, itableOffsetEntry::interface_offset_in_bytes()));
3062 __ jcc(Assembler::notEqual, search);
3063
3064 __ movl(rdx, Address(rdx, itableOffsetEntry::offset_offset_in_bytes()));
3065
3066 __ addptr(rdx, r14); // Add offset to klassOop
3067 assert(itableMethodEntry::size() * wordSize == 8,
3068 "adjust the scaling in the code below");
3069 __ movptr(rbx, Address(rdx, rbx, Address::times_8));
3070 // rbx: methodOop to call
3071 // rcx: receiver
3072 // Check for abstract method error
3073 // Note: This should be done more efficiently via a
3074 // throw_abstract_method_error interpreter entry point and a
3075 // conditional jump to it in case of a null method.
3076 {
3077 Label L;
3078 __ testptr(rbx, rbx);
3079 __ jcc(Assembler::notZero, L);
3080 // throw exception
3081 // note: must restore interpreter registers to canonical
3082 // state for exception handling to work correctly!
3083 __ pop(rbx); // pop return address (pushed by prepare_invoke)
3084 __ restore_bcp(); // r13 must be correct for exception handler
3085 // (was destroyed)
3086 __ restore_locals(); // make sure locals pointer is correct as
3087 // well (was destroyed)
3088 __ call_VM(noreg,
3089 CAST_FROM_FN_PTR(address,
3090 InterpreterRuntime::throw_AbstractMethodError));
3091 // the call_VM checks for exception, so we should never return here.
3092 __ should_not_reach_here();
3093 __ bind(L);
3094 }
3095
3096 __ movptr(rcx, Address(rbx, methodOopDesc::interpreter_entry_offset()));
3097
3098 // do the call
3099 // rcx: receiver
3100 // rbx: methodOop
3101 __ jump_from_interpreted(rbx, rdx);
3102 }
3103
3104 //-----------------------------------------------------------------------------
3105 // Allocation
3106
3107 void TemplateTable::_new() {
3108 transition(vtos, atos);
3109 __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3110 Label slow_case;
3111 Label done;
3112 Label initialize_header;
3113 Label initialize_object; // including clearing the fields
3114 Label allocate_shared;
3115
3116 __ get_cpool_and_tags(rsi, rax);
3117 // get instanceKlass
3118 __ movptr(rsi, Address(rsi, rdx,
3119 Address::times_8, sizeof(constantPoolOopDesc)));
3120
3121 // make sure the class we're about to instantiate has been
3122 // resolved. Note: slow_case does a pop of stack, which is why we
3123 // loaded class/pushed above
3124 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
3125 __ cmpb(Address(rax, rdx, Address::times_1, tags_offset),
3126 JVM_CONSTANT_Class);
3127 __ jcc(Assembler::notEqual, slow_case);
3128
3129 // make sure klass is initialized & doesn't have finalizer
3130 // make sure klass is fully initialized
3131 __ cmpl(Address(rsi,
3132 instanceKlass::init_state_offset_in_bytes() +
3133 sizeof(oopDesc)),
3134 instanceKlass::fully_initialized);
3135 __ jcc(Assembler::notEqual, slow_case);
3136
3137 // get instance_size in instanceKlass (scaled to a count of bytes)
3138 __ movl(rdx,
3139 Address(rsi,
3140 Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
3141 // test to see if it has a finalizer or is malformed in some way
3142 __ testl(rdx, Klass::_lh_instance_slow_path_bit);
3143 __ jcc(Assembler::notZero, slow_case);
3144
3145 // Allocate the instance
3146 // 1) Try to allocate in the TLAB
3147 // 2) if fail and the object is large allocate in the shared Eden
3148 // 3) if the above fails (or is not applicable), go to a slow case
3149 // (creates a new TLAB, etc.)
3150
3151 const bool allow_shared_alloc =
3152 Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
3153
3154 if (UseTLAB) {
3155 __ movptr(rax, Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())));
3156 __ lea(rbx, Address(rax, rdx, Address::times_1));
3157 __ cmpptr(rbx, Address(r15_thread, in_bytes(JavaThread::tlab_end_offset())));
3158 __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case);
3159 __ movptr(Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())), rbx);
3160 if (ZeroTLAB) {
3161 // the fields have been already cleared
3162 __ jmp(initialize_header);
3163 } else {
3164 // initialize both the header and fields
3165 __ jmp(initialize_object);
3166 }
3167 }
3168
3169 // Allocation in the shared Eden, if allowed.
3170 //
3171 // rdx: instance size in bytes
3172 if (allow_shared_alloc) {
3173 __ bind(allocate_shared);
3174
3175 ExternalAddress top((address)Universe::heap()->top_addr());
3176 ExternalAddress end((address)Universe::heap()->end_addr());
3177
3178 const Register RtopAddr = rscratch1;
3179 const Register RendAddr = rscratch2;
3180
3181 __ lea(RtopAddr, top);
3182 __ lea(RendAddr, end);
3183 __ movptr(rax, Address(RtopAddr, 0));
3184
3185 // For retries rax gets set by cmpxchgq
3186 Label retry;
3187 __ bind(retry);
3188 __ lea(rbx, Address(rax, rdx, Address::times_1));
3189 __ cmpptr(rbx, Address(RendAddr, 0));
3190 __ jcc(Assembler::above, slow_case);
3191
3192 // Compare rax with the top addr, and if still equal, store the new
3193 // top addr in rbx at the address of the top addr pointer. Sets ZF if was
3194 // equal, and clears it otherwise. Use lock prefix for atomicity on MPs.
3195 //
3196 // rax: object begin
3197 // rbx: object end
3198 // rdx: instance size in bytes
3199 if (os::is_MP()) {
3200 __ lock();
3201 }
3202 __ cmpxchgptr(rbx, Address(RtopAddr, 0));
3203
3204 // if someone beat us on the allocation, try again, otherwise continue
3205 __ jcc(Assembler::notEqual, retry);
3206 }
3207
3208 if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
3209 // The object is initialized before the header. If the object size is
3210 // zero, go directly to the header initialization.
3211 __ bind(initialize_object);
3212 __ decrementl(rdx, sizeof(oopDesc));
3213 __ jcc(Assembler::zero, initialize_header);
3214
3215 // Initialize object fields
3216 __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
3217 __ shrl(rdx, LogBytesPerLong); // divide by oopSize to simplify the loop
3218 {
3219 Label loop;
3220 __ bind(loop);
3221 __ movq(Address(rax, rdx, Address::times_8,
3222 sizeof(oopDesc) - oopSize),
3223 rcx);
3224 __ decrementl(rdx);
3225 __ jcc(Assembler::notZero, loop);
3226 }
3227
3228 // initialize object header only.
3229 __ bind(initialize_header);
3230 if (UseBiasedLocking) {
3231 __ movptr(rscratch1, Address(rsi, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
3232 __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), rscratch1);
3233 } else {
3234 __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()),
3235 (intptr_t) markOopDesc::prototype()); // header (address 0x1)
3236 }
3237 __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
3238 __ store_klass_gap(rax, rcx); // zero klass gap for compressed oops
3239 __ store_klass(rax, rsi); // store klass last
3240 __ jmp(done);
3241 }
3242
3243 {
3244 SkipIfEqual skip(_masm, &DTraceAllocProbes, false);
3245 // Trigger dtrace event for fastpath
3246 __ push(atos); // save the return value
3247 __ call_VM_leaf(
3248 CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax);
3249 __ pop(atos); // restore the return value
3250 }
3251
3252 // slow case
3253 __ bind(slow_case);
3254 __ get_constant_pool(c_rarg1);
3255 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3256 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
3257 __ verify_oop(rax);
3258
3259 // continue
3269 }
3270
3271 void TemplateTable::anewarray() {
3272 transition(itos, atos);
3273 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3274 __ get_constant_pool(c_rarg1);
3275 __ movl(c_rarg3, rax);
3276 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray),
3277 c_rarg1, c_rarg2, c_rarg3);
3278 }
3279
3280 void TemplateTable::arraylength() {
3281 transition(atos, itos);
3282 __ null_check(rax, arrayOopDesc::length_offset_in_bytes());
3283 __ movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes()));
3284 }
3285
3286 void TemplateTable::checkcast() {
3287 transition(atos, atos);
3288 Label done, is_null, ok_is_subtype, quicked, resolved;
3289 __ testptr(rax, rax); // object is in rax
3290 __ jcc(Assembler::zero, is_null);
3291
3292 // Get cpool & tags index
3293 __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
3294 __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
3295 // See if bytecode has already been quicked
3296 __ cmpb(Address(rdx, rbx,
3297 Address::times_1,
3298 typeArrayOopDesc::header_size(T_BYTE) * wordSize),
3299 JVM_CONSTANT_Class);
3300 __ jcc(Assembler::equal, quicked);
3301 __ push(atos); // save receiver for result, and for GC
3302 __ mov(r12, rcx); // save rcx XXX
3303 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));
3304 __ movq(rcx, r12); // restore rcx XXX
3305 __ reinit_heapbase();
3306 __ pop_ptr(rdx); // restore receiver
3307 __ jmpb(resolved);
3308
3309 // Get superklass in rax and subklass in rbx
3310 __ bind(quicked);
3311 __ mov(rdx, rax); // Save object in rdx; rax needed for subtype check
3312 __ movptr(rax, Address(rcx, rbx,
3313 Address::times_8, sizeof(constantPoolOopDesc)));
3314
3315 __ bind(resolved);
3316 __ load_klass(rbx, rdx);
3317
3318 // Generate subtype check. Blows rcx, rdi. Object in rdx.
3319 // Superklass in rax. Subklass in rbx.
3320 __ gen_subtype_check(rbx, ok_is_subtype);
3321
3322 // Come here on failure
3323 __ push_ptr(rdx);
3324 // object is at TOS
3325 __ jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry));
3326
3327 // Come here on success
3328 __ bind(ok_is_subtype);
3329 __ mov(rax, rdx); // Restore object in rdx
3330
3331 // Collect counts on whether this check-cast sees NULLs a lot or not.
3332 if (ProfileInterpreter) {
3333 __ jmp(done);
3334 __ bind(is_null);
3335 __ profile_null_seen(rcx);
3336 } else {
3337 __ bind(is_null); // same as 'done'
3338 }
3339 __ bind(done);
3340 }
3341
3342 void TemplateTable::instanceof() {
3343 transition(atos, itos);
3344 Label done, is_null, ok_is_subtype, quicked, resolved;
3345 __ testptr(rax, rax);
3346 __ jcc(Assembler::zero, is_null);
3347
3348 // Get cpool & tags index
3349 __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
3350 __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
3351 // See if bytecode has already been quicked
3352 __ cmpb(Address(rdx, rbx,
3353 Address::times_1,
3354 typeArrayOopDesc::header_size(T_BYTE) * wordSize),
3355 JVM_CONSTANT_Class);
3356 __ jcc(Assembler::equal, quicked);
3357
3358 __ push(atos); // save receiver for result, and for GC
3359 __ mov(r12, rcx); // save rcx
3360 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));
3361 __ movq(rcx, r12); // restore rcx
3362 __ reinit_heapbase();
3363 __ pop_ptr(rdx); // restore receiver
3364 __ load_klass(rdx, rdx);
3365 __ jmpb(resolved);
3366
3367 // Get superklass in rax and subklass in rdx
3368 __ bind(quicked);
3369 __ load_klass(rdx, rax);
3370 __ movptr(rax, Address(rcx, rbx,
3371 Address::times_8, sizeof(constantPoolOopDesc)));
3372
3373 __ bind(resolved);
3374
3375 // Generate subtype check. Blows rcx, rdi
3376 // Superklass in rax. Subklass in rdx.
3377 __ gen_subtype_check(rdx, ok_is_subtype);
3378
3379 // Come here on failure
3380 __ xorl(rax, rax);
3381 __ jmpb(done);
3382 // Come here on success
3383 __ bind(ok_is_subtype);
3384 __ movl(rax, 1);
3385
3386 // Collect counts on whether this test sees NULLs a lot or not.
3387 if (ProfileInterpreter) {
3388 __ jmp(done);
3389 __ bind(is_null);
3390 __ profile_null_seen(rcx);
3394 __ bind(done);
3395 // rax = 0: obj == NULL or obj is not an instanceof the specified klass
3396 // rax = 1: obj != NULL and obj is an instanceof the specified klass
3397 }
3398
3399 //-----------------------------------------------------------------------------
3400 // Breakpoints
3401 void TemplateTable::_breakpoint() {
3402 // Note: We get here even if we are single stepping..
3403 // jbug inists on setting breakpoints at every bytecode
3404 // even if we are in single step mode.
3405
3406 transition(vtos, vtos);
3407
3408 // get the unpatched byte code
3409 __ get_method(c_rarg1);
3410 __ call_VM(noreg,
3411 CAST_FROM_FN_PTR(address,
3412 InterpreterRuntime::get_original_bytecode_at),
3413 c_rarg1, r13);
3414 __ mov(rbx, rax);
3415
3416 // post the breakpoint event
3417 __ get_method(c_rarg1);
3418 __ call_VM(noreg,
3419 CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint),
3420 c_rarg1, r13);
3421
3422 // complete the execution of original bytecode
3423 __ dispatch_only_normal(vtos);
3424 }
3425
3426 //-----------------------------------------------------------------------------
3427 // Exceptions
3428
3429 void TemplateTable::athrow() {
3430 transition(atos, vtos);
3431 __ null_check(rax);
3432 __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
3433 }
3434
3452 void TemplateTable::monitorenter() {
3453 transition(atos, vtos);
3454
3455 // check for NULL object
3456 __ null_check(rax);
3457
3458 const Address monitor_block_top(
3459 rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3460 const Address monitor_block_bot(
3461 rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
3462 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
3463
3464 Label allocated;
3465
3466 // initialize entry pointer
3467 __ xorl(c_rarg1, c_rarg1); // points to free slot or NULL
3468
3469 // find a free slot in the monitor block (result in c_rarg1)
3470 {
3471 Label entry, loop, exit;
3472 __ movptr(c_rarg3, monitor_block_top); // points to current entry,
3473 // starting with top-most entry
3474 __ lea(c_rarg2, monitor_block_bot); // points to word before bottom
3475 // of monitor block
3476 __ jmpb(entry);
3477
3478 __ bind(loop);
3479 // check if current entry is used
3480 __ cmpptr(Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()), (int32_t) NULL_WORD);
3481 // if not used then remember entry in c_rarg1
3482 __ cmov(Assembler::equal, c_rarg1, c_rarg3);
3483 // check if current entry is for same object
3484 __ cmpptr(rax, Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()));
3485 // if same object then stop searching
3486 __ jccb(Assembler::equal, exit);
3487 // otherwise advance to next entry
3488 __ addptr(c_rarg3, entry_size);
3489 __ bind(entry);
3490 // check if bottom reached
3491 __ cmpptr(c_rarg3, c_rarg2);
3492 // if not at bottom then check this entry
3493 __ jcc(Assembler::notEqual, loop);
3494 __ bind(exit);
3495 }
3496
3497 __ testptr(c_rarg1, c_rarg1); // check if a slot has been found
3498 __ jcc(Assembler::notZero, allocated); // if found, continue with that one
3499
3500 // allocate one if there's no free slot
3501 {
3502 Label entry, loop;
3503 // 1. compute new pointers // rsp: old expression stack top
3504 __ movptr(c_rarg1, monitor_block_bot); // c_rarg1: old expression stack bottom
3505 __ subptr(rsp, entry_size); // move expression stack top
3506 __ subptr(c_rarg1, entry_size); // move expression stack bottom
3507 __ mov(c_rarg3, rsp); // set start value for copy loop
3508 __ movptr(monitor_block_bot, c_rarg1); // set new monitor block bottom
3509 __ jmp(entry);
3510 // 2. move expression stack contents
3511 __ bind(loop);
3512 __ movptr(c_rarg2, Address(c_rarg3, entry_size)); // load expression stack
3513 // word from old location
3514 __ movptr(Address(c_rarg3, 0), c_rarg2); // and store it at new location
3515 __ addptr(c_rarg3, wordSize); // advance to next word
3516 __ bind(entry);
3517 __ cmpptr(c_rarg3, c_rarg1); // check if bottom reached
3518 __ jcc(Assembler::notEqual, loop); // if not at bottom then
3519 // copy next word
3520 }
3521
3522 // call run-time routine
3523 // c_rarg1: points to monitor entry
3524 __ bind(allocated);
3525
3526 // Increment bcp to point to the next bytecode, so exception
3527 // handling for async. exceptions work correctly.
3528 // The object has already been poped from the stack, so the
3529 // expression stack looks correct.
3530 __ increment(r13);
3531
3532 // store object
3533 __ movptr(Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()), rax);
3534 __ lock_object(c_rarg1);
3535
3536 // check to make sure this monitor doesn't cause stack overflow after locking
3537 __ save_bcp(); // in case of exception
3538 __ generate_stack_overflow_check(0);
3539
3540 // The bcp has already been incremented. Just need to dispatch to
3541 // next instruction.
3542 __ dispatch_next(vtos);
3543 }
3544
3545
3546 void TemplateTable::monitorexit() {
3547 transition(atos, vtos);
3548
3549 // check for NULL object
3550 __ null_check(rax);
3551
3552 const Address monitor_block_top(
3553 rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3554 const Address monitor_block_bot(
3555 rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
3556 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
3557
3558 Label found;
3559
3560 // find matching slot
3561 {
3562 Label entry, loop;
3563 __ movptr(c_rarg1, monitor_block_top); // points to current entry,
3564 // starting with top-most entry
3565 __ lea(c_rarg2, monitor_block_bot); // points to word before bottom
3566 // of monitor block
3567 __ jmpb(entry);
3568
3569 __ bind(loop);
3570 // check if current entry is for same object
3571 __ cmpptr(rax, Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()));
3572 // if same object then stop searching
3573 __ jcc(Assembler::equal, found);
3574 // otherwise advance to next entry
3575 __ addptr(c_rarg1, entry_size);
3576 __ bind(entry);
3577 // check if bottom reached
3578 __ cmpptr(c_rarg1, c_rarg2);
3579 // if not at bottom then check this entry
3580 __ jcc(Assembler::notEqual, loop);
3581 }
3582
3583 // error handling. Unlocking was not block-structured
3584 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
3585 InterpreterRuntime::throw_illegal_monitor_state_exception));
3586 __ should_not_reach_here();
3587
3588 // call run-time routine
3589 // rsi: points to monitor entry
3590 __ bind(found);
3591 __ push_ptr(rax); // make sure object is on stack (contract with oopMaps)
3592 __ unlock_object(c_rarg1);
3593 __ pop_ptr(rax); // discard object
3594 }
3595
3596
3597 // Wide instructions
3598 void TemplateTable::wide() {
3599 transition(vtos, vtos);
3600 __ load_unsigned_byte(rbx, at_bcp(1));
3601 __ lea(rscratch1, ExternalAddress((address)Interpreter::_wentry_point));
3602 __ jmp(Address(rscratch1, rbx, Address::times_8));
3603 // Note: the r13 increment step is part of the individual wide
3604 // bytecode implementations
3605 }
3606
3607
3608 // Multi arrays
3609 void TemplateTable::multianewarray() {
3610 transition(vtos, atos);
3611 __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
3612 // last dim is on top of stack; we want address of first one:
3613 // first_addr = last_addr + (ndims - 1) * wordSize
3614 if (TaggedStackInterpreter) __ shll(rax, 1); // index*2
3615 __ lea(c_rarg1, Address(rsp, rax, Address::times_8, -wordSize));
3616 call_VM(rax,
3617 CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray),
3618 c_rarg1);
3619 __ load_unsigned_byte(rbx, at_bcp(3));
3620 if (TaggedStackInterpreter) __ shll(rbx, 1); // index*2
3621 __ lea(rsp, Address(rsp, rbx, Address::times_8));
3622 }
3623 #endif // !CC_INTERP
|