5744 __ st_ptr(AT, counter_addr); |
5744 __ st_ptr(AT, counter_addr); |
5745 } |
5745 } |
5746 } |
5746 } |
5747 |
5747 |
5748 void LIR_Assembler::emit_profile_type(LIR_OpProfileType* op) { |
5748 void LIR_Assembler::emit_profile_type(LIR_OpProfileType* op) { |
5749 // Newly added in OpenJDK 8 |
5749 Register obj = op->obj()->as_register(); |
5750 Unimplemented(); |
5750 Register tmp = op->tmp()->as_pointer_register(); |
|
5751 Register tmp1 = T1; |
|
5752 Address mdo_addr = as_Address(op->mdp()->as_address_ptr()); |
|
5753 ciKlass* exact_klass = op->exact_klass(); |
|
5754 intptr_t current_klass = op->current_klass(); |
|
5755 bool not_null = op->not_null(); |
|
5756 bool no_conflict = op->no_conflict(); |
|
5757 |
|
5758 Label update, next, none; |
|
5759 |
|
5760 bool do_null = !not_null; |
|
5761 bool exact_klass_set = exact_klass != NULL && ciTypeEntries::valid_ciklass(current_klass) == exact_klass; |
|
5762 bool do_update = !TypeEntries::is_type_unknown(current_klass) && !exact_klass_set; |
|
5763 |
|
5764 assert(do_null || do_update, "why are we here?"); |
|
5765 assert(!TypeEntries::was_null_seen(current_klass) || do_update, "why are we here?"); |
|
5766 |
|
5767 __ verify_oop(obj); |
|
5768 |
|
5769 if (tmp != obj) { |
|
5770 __ move(tmp, obj); |
|
5771 } |
|
5772 if (do_null) { |
|
5773 __ bne(tmp, R0, update); |
|
5774 __ delayed()->nop(); |
|
5775 if (!TypeEntries::was_null_seen(current_klass)) { |
|
5776 __ push(tmp1); |
|
5777 if (mdo_addr.index() == noreg) { |
|
5778 __ ld(tmp1, mdo_addr); |
|
5779 } else { |
|
5780 guarantee(tmp1 != mdo_addr.base(), "The base register will be corrupted !"); |
|
5781 guarantee(tmp1 != mdo_addr.index(), "The index register will be corrupted !"); |
|
5782 |
|
5783 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5784 __ daddu(AT, AT, mdo_addr.base()); |
|
5785 __ ld(tmp1, AT, mdo_addr.disp()); |
|
5786 } |
|
5787 __ li(AT, TypeEntries::null_seen); |
|
5788 __ orr(AT, tmp1, AT); |
|
5789 if (mdo_addr.index() == noreg) { |
|
5790 __ sd(AT, mdo_addr); |
|
5791 } else { |
|
5792 guarantee(tmp1 != mdo_addr.base(), "The base register will be corrupted !"); |
|
5793 guarantee(tmp1 != mdo_addr.index(), "The index register will be corrupted !"); |
|
5794 |
|
5795 __ dsll(tmp1, mdo_addr.index(), mdo_addr.scale()); |
|
5796 __ daddu(tmp1, tmp1, mdo_addr.base()); |
|
5797 __ sd(AT, tmp1, mdo_addr.disp()); |
|
5798 } |
|
5799 __ pop(tmp1); |
|
5800 |
|
5801 } |
|
5802 if (do_update) { |
|
5803 #ifndef ASSERT |
|
5804 __ b(next); |
|
5805 __ delayed()->nop(); |
|
5806 } |
|
5807 #else |
|
5808 __ b(next); |
|
5809 __ delayed()->nop(); |
|
5810 } |
|
5811 } else { |
|
5812 __ bne(tmp, R0, update); |
|
5813 __ delayed()->nop(); |
|
5814 __ stop("unexpect null obj"); |
|
5815 #endif |
|
5816 } |
|
5817 |
|
5818 __ bind(update); |
|
5819 |
|
5820 if (do_update) { |
|
5821 #ifdef ASSERT |
|
5822 if (exact_klass != NULL) { |
|
5823 Label ok; |
|
5824 __ load_klass(tmp, tmp); |
|
5825 __ push(tmp); |
|
5826 __ mov_metadata(tmp, exact_klass->constant_encoding()); |
|
5827 __ ld(AT, Address(SP, 0)); |
|
5828 __ beq(tmp, AT, ok); |
|
5829 __ delayed()->nop(); |
|
5830 __ stop("exact klass and actual klass differ"); |
|
5831 __ bind(ok); |
|
5832 __ pop(tmp); |
|
5833 } |
|
5834 #endif |
|
5835 if (!no_conflict) { |
|
5836 if (exact_klass == NULL || TypeEntries::is_type_none(current_klass)) { |
|
5837 if (exact_klass != NULL) { |
|
5838 __ mov_metadata(tmp, exact_klass->constant_encoding()); |
|
5839 } else { |
|
5840 __ load_klass(tmp, tmp); |
|
5841 } |
|
5842 |
|
5843 if (mdo_addr.index() == noreg) { |
|
5844 __ ld(AT, mdo_addr); |
|
5845 } else { |
|
5846 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5847 __ daddu(AT, AT, mdo_addr.base()); |
|
5848 __ ld(AT, AT, mdo_addr.disp()); |
|
5849 } |
|
5850 __ xorr(tmp, tmp, AT); |
|
5851 __ li(AT, TypeEntries::type_klass_mask); |
|
5852 __ andr(AT, tmp, AT); |
|
5853 // klass seen before, nothing to do. The unknown bit may have been |
|
5854 // set already but no need to check. |
|
5855 __ beq(AT, R0, next); |
|
5856 __ delayed()->nop(); |
|
5857 |
|
5858 __ li(AT, TypeEntries::type_unknown); |
|
5859 __ andr(AT, tmp, AT); |
|
5860 __ bne(AT, R0, next); // already unknown. Nothing to do anymore. |
|
5861 __ delayed()->nop(); |
|
5862 |
|
5863 if (TypeEntries::is_type_none(current_klass)) { |
|
5864 if (mdo_addr.index() == noreg) { |
|
5865 __ ld(AT, mdo_addr); |
|
5866 } else { |
|
5867 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5868 __ daddu(AT, AT, mdo_addr.base()); |
|
5869 __ ld(AT, AT, mdo_addr.disp()); |
|
5870 } |
|
5871 __ beq(AT, R0, none); |
|
5872 __ delayed()->nop(); |
|
5873 |
|
5874 __ push(tmp1); |
|
5875 if (mdo_addr.index() == noreg) { |
|
5876 __ ld(tmp1, mdo_addr); |
|
5877 } else { |
|
5878 guarantee(tmp1 != mdo_addr.base(), "The base register will be corrupted !"); |
|
5879 guarantee(tmp1 != mdo_addr.index(), "The index register will be corrupted !"); |
|
5880 |
|
5881 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5882 __ daddu(AT, AT, mdo_addr.base()); |
|
5883 __ ld(tmp1, AT, mdo_addr.disp()); |
|
5884 } |
|
5885 __ li(AT, TypeEntries::null_seen); |
|
5886 __ subu(AT, AT, tmp1); |
|
5887 __ pop(tmp1); |
|
5888 __ beq(AT, R0, none); |
|
5889 __ delayed()->nop(); |
|
5890 // There is a chance that the checks above (re-reading profiling |
|
5891 // data from memory) fail if another thread has just set the |
|
5892 // profiling to this obj's klass |
|
5893 |
|
5894 if (mdo_addr.index() == noreg) { |
|
5895 __ ld(AT, mdo_addr); |
|
5896 } else { |
|
5897 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5898 __ daddu(AT, AT, mdo_addr.base()); |
|
5899 __ ld(AT, AT, mdo_addr.disp()); |
|
5900 } |
|
5901 __ xorr(tmp, tmp, AT); |
|
5902 __ li(AT, TypeEntries::type_klass_mask); |
|
5903 __ andr(AT, tmp, AT); |
|
5904 __ beq(AT, R0, next); |
|
5905 __ delayed()->nop(); |
|
5906 } |
|
5907 } else { |
|
5908 assert(ciTypeEntries::valid_ciklass(current_klass) != NULL && |
|
5909 ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "conflict only"); |
|
5910 if (mdo_addr.index() == noreg) { |
|
5911 __ ld(tmp, mdo_addr); |
|
5912 } else { |
|
5913 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5914 __ daddu(AT, AT, mdo_addr.base()); |
|
5915 __ ld(tmp, AT, mdo_addr.disp()); |
|
5916 } |
|
5917 __ li(AT, TypeEntries::type_unknown); |
|
5918 __ andr(AT, tmp, AT); |
|
5919 __ bne(AT, R0, next); // already unknown. Nothing to do anymore. |
|
5920 __ delayed()->nop(); |
|
5921 } |
|
5922 |
|
5923 // different than before. Cannot keep accurate profile. |
|
5924 __ push(tmp1); |
|
5925 if (mdo_addr.index() == noreg) { |
|
5926 __ ld(tmp1, mdo_addr); |
|
5927 } else { |
|
5928 guarantee(tmp1 != mdo_addr.base(), "The base register will be corrupted !"); |
|
5929 guarantee(tmp1 != mdo_addr.index(), "The index register will be corrupted !"); |
|
5930 |
|
5931 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5932 __ daddu(AT, AT, mdo_addr.base()); |
|
5933 __ ld(tmp1, AT, mdo_addr.disp()); |
|
5934 } |
|
5935 __ li(AT, TypeEntries::type_unknown); |
|
5936 __ orr(AT, tmp1, AT); |
|
5937 if (mdo_addr.index() == noreg) { |
|
5938 __ sd(AT, mdo_addr); |
|
5939 } else { |
|
5940 guarantee(tmp1 != mdo_addr.base(), "The base register will be corrupted !"); |
|
5941 guarantee(tmp1 != mdo_addr.index(), "The index register will be corrupted !"); |
|
5942 |
|
5943 __ dsll(tmp1, mdo_addr.index(), mdo_addr.scale()); |
|
5944 __ daddu(tmp1, tmp1, mdo_addr.base()); |
|
5945 __ sd(AT, tmp1, mdo_addr.disp()); |
|
5946 } |
|
5947 __ pop(tmp1); |
|
5948 |
|
5949 if (TypeEntries::is_type_none(current_klass)) { |
|
5950 __ b(next); |
|
5951 __ delayed()->nop(); |
|
5952 |
|
5953 __ bind(none); |
|
5954 // first time here. Set profile type. |
|
5955 if (mdo_addr.index() == noreg) { |
|
5956 __ sd(tmp, mdo_addr); |
|
5957 } else { |
|
5958 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5959 __ daddu(AT, AT, mdo_addr.base()); |
|
5960 __ sd(tmp, AT, mdo_addr.disp()); |
|
5961 } |
|
5962 } |
|
5963 } else { |
|
5964 // There's a single possible klass at this profile point |
|
5965 assert(exact_klass != NULL, "should be"); |
|
5966 if (TypeEntries::is_type_none(current_klass)) { |
|
5967 __ mov_metadata(tmp, exact_klass->constant_encoding()); |
|
5968 if (mdo_addr.index() == noreg) { |
|
5969 __ ld(AT, mdo_addr); |
|
5970 } else { |
|
5971 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5972 __ daddu(AT, AT, mdo_addr.base()); |
|
5973 __ ld(AT, AT, mdo_addr.disp()); |
|
5974 } |
|
5975 __ xorr(tmp, tmp, AT); |
|
5976 __ li(AT, TypeEntries::type_klass_mask); |
|
5977 __ andr(AT, tmp, AT); |
|
5978 #ifdef ASSERT |
|
5979 __ beq_far(AT, R0, next); |
|
5980 __ delayed()->nop(); |
|
5981 |
|
5982 { |
|
5983 Label ok; |
|
5984 __ push(tmp); |
|
5985 if (mdo_addr.index() == noreg) { |
|
5986 __ ld(AT, mdo_addr); |
|
5987 } else { |
|
5988 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
5989 __ daddu(AT, AT, mdo_addr.base()); |
|
5990 __ ld(AT, AT, mdo_addr.disp()); |
|
5991 } |
|
5992 __ beq_far(AT, R0, ok); |
|
5993 __ delayed()->nop(); |
|
5994 |
|
5995 __ push(tmp1); |
|
5996 if (mdo_addr.index() == noreg) { |
|
5997 __ ld(tmp1, mdo_addr); |
|
5998 } else { |
|
5999 guarantee(tmp1 != mdo_addr.base(), "The base register will be corrupted !"); |
|
6000 guarantee(tmp1 != mdo_addr.index(), "The index register will be corrupted !"); |
|
6001 |
|
6002 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
6003 __ daddu(AT, AT, mdo_addr.base()); |
|
6004 __ ld(tmp1, AT, mdo_addr.disp()); |
|
6005 } |
|
6006 __ li(AT, TypeEntries::null_seen); |
|
6007 __ subu(AT, AT, tmp1); |
|
6008 __ pop(tmp1); |
|
6009 __ beq_far(AT, R0, ok); |
|
6010 __ delayed()->nop(); |
|
6011 // may have been set by another thread |
|
6012 __ mov_metadata(tmp, exact_klass->constant_encoding()); |
|
6013 if (mdo_addr.index() == noreg) { |
|
6014 __ ld(AT, mdo_addr); |
|
6015 } else { |
|
6016 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
6017 __ daddu(AT, AT, mdo_addr.base()); |
|
6018 __ ld(AT, AT, mdo_addr.disp()); |
|
6019 } |
|
6020 __ xorr(tmp, tmp, AT); |
|
6021 __ li(AT, TypeEntries::type_mask); |
|
6022 __ andr(AT, tmp, AT); |
|
6023 __ beq_far(AT, R0, ok); |
|
6024 __ delayed()->nop(); |
|
6025 |
|
6026 __ stop("unexpected profiling mismatch"); |
|
6027 __ bind(ok); |
|
6028 __ pop(tmp); |
|
6029 } |
|
6030 #else |
|
6031 __ beq(AT, R0, next); |
|
6032 __ delayed()->nop(); |
|
6033 #endif |
|
6034 // first time here. Set profile type. |
|
6035 if (mdo_addr.index() == noreg) { |
|
6036 __ sd(tmp, mdo_addr); |
|
6037 } else { |
|
6038 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
6039 __ daddu(AT, AT, mdo_addr.base()); |
|
6040 __ sd(tmp, AT, mdo_addr.disp()); |
|
6041 } |
|
6042 } else { |
|
6043 assert(ciTypeEntries::valid_ciklass(current_klass) != NULL && |
|
6044 ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "inconsistent"); |
|
6045 |
|
6046 if (mdo_addr.index() == noreg) { |
|
6047 __ ld(tmp, mdo_addr); |
|
6048 } else { |
|
6049 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
6050 __ daddu(AT, AT, mdo_addr.base()); |
|
6051 __ ld(tmp, AT, mdo_addr.disp()); |
|
6052 } |
|
6053 __ li(AT, TypeEntries::type_unknown); |
|
6054 __ andr(AT, tmp, AT); |
|
6055 __ bne(AT, R0, next); // already unknown. Nothing to do anymore. |
|
6056 __ delayed()->nop(); |
|
6057 |
|
6058 __ push(tmp1); |
|
6059 if (mdo_addr.index() == noreg) { |
|
6060 __ ld(tmp1, mdo_addr); |
|
6061 } else { |
|
6062 guarantee(tmp1 != mdo_addr.base(), "The base register will be corrupted !"); |
|
6063 guarantee(tmp1 != mdo_addr.index(), "The index register will be corrupted !"); |
|
6064 |
|
6065 __ dsll(AT, mdo_addr.index(), mdo_addr.scale()); |
|
6066 __ daddu(AT, AT, mdo_addr.base()); |
|
6067 __ ld(tmp1, AT, mdo_addr.disp()); |
|
6068 } |
|
6069 __ li(AT, TypeEntries::type_unknown); |
|
6070 __ orr(AT, tmp1, AT); |
|
6071 if (mdo_addr.index() == noreg) { |
|
6072 __ sd(AT, mdo_addr); |
|
6073 } else { |
|
6074 guarantee(tmp1 != mdo_addr.base(), "The base register will be corrupted !"); |
|
6075 guarantee(tmp1 != mdo_addr.index(), "The index register will be corrupted !"); |
|
6076 |
|
6077 __ dsll(tmp1, mdo_addr.index(), mdo_addr.scale()); |
|
6078 __ daddu(tmp1, tmp1, mdo_addr.base()); |
|
6079 __ sd(AT, tmp1, mdo_addr.disp()); |
|
6080 } |
|
6081 __ pop(tmp1); |
|
6082 } |
|
6083 } |
|
6084 |
|
6085 __ bind(next); |
|
6086 } |
5751 } |
6087 } |
5752 |
6088 |
5753 void LIR_Assembler::emit_delay(LIR_OpDelay*) { |
6089 void LIR_Assembler::emit_delay(LIR_OpDelay*) { |
5754 Unimplemented(); |
6090 Unimplemented(); |
5755 } |
6091 } |