Mercurial > hg > graal-jvmci-8
comparison src/share/vm/opto/library_call.cpp @ 643:c771b7f43bbf
6378821: bitCount() should use POPC on SPARC processors and AMD+10h
Summary: bitCount() should use POPC on SPARC processors where POPC is implemented directly in hardware.
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Fri, 13 Mar 2009 11:35:17 -0700 |
parents | 98cb887364d3 |
children | fbde8ec322d0 |
comparison
equal
deleted
inserted
replaced
642:660978a2a31a | 643:c771b7f43bbf |
---|---|
1 /* | 1 /* |
2 * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. | 2 * Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 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 | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
219 Node* dest, Node* dest_offset, | 219 Node* dest, Node* dest_offset, |
220 Node* copy_length); | 220 Node* copy_length); |
221 bool inline_unsafe_CAS(BasicType type); | 221 bool inline_unsafe_CAS(BasicType type); |
222 bool inline_unsafe_ordered_store(BasicType type); | 222 bool inline_unsafe_ordered_store(BasicType type); |
223 bool inline_fp_conversions(vmIntrinsics::ID id); | 223 bool inline_fp_conversions(vmIntrinsics::ID id); |
224 bool inline_bitCount(vmIntrinsics::ID id); | |
224 bool inline_reverseBytes(vmIntrinsics::ID id); | 225 bool inline_reverseBytes(vmIntrinsics::ID id); |
225 }; | 226 }; |
226 | 227 |
227 | 228 |
228 //---------------------------make_vm_intrinsic---------------------------- | 229 //---------------------------make_vm_intrinsic---------------------------- |
312 if (!UseNewReflection) return NULL; | 313 if (!UseNewReflection) return NULL; |
313 if (!InlineReflectionGetCallerClass) return NULL; | 314 if (!InlineReflectionGetCallerClass) return NULL; |
314 if (!JDK_Version::is_gte_jdk14x_version()) return NULL; | 315 if (!JDK_Version::is_gte_jdk14x_version()) return NULL; |
315 break; | 316 break; |
316 | 317 |
318 case vmIntrinsics::_bitCount_i: | |
319 case vmIntrinsics::_bitCount_l: | |
320 if (!UsePopCountInstruction) return NULL; | |
321 break; | |
322 | |
317 default: | 323 default: |
318 break; | 324 break; |
319 } | 325 } |
320 | 326 |
321 // -XX:-InlineClassNatives disables natives from the Class class. | 327 // -XX:-InlineClassNatives disables natives from the Class class. |
614 case vmIntrinsics::_intBitsToFloat: | 620 case vmIntrinsics::_intBitsToFloat: |
615 case vmIntrinsics::_doubleToRawLongBits: | 621 case vmIntrinsics::_doubleToRawLongBits: |
616 case vmIntrinsics::_doubleToLongBits: | 622 case vmIntrinsics::_doubleToLongBits: |
617 case vmIntrinsics::_longBitsToDouble: | 623 case vmIntrinsics::_longBitsToDouble: |
618 return inline_fp_conversions(intrinsic_id()); | 624 return inline_fp_conversions(intrinsic_id()); |
625 | |
626 case vmIntrinsics::_bitCount_i: | |
627 case vmIntrinsics::_bitCount_l: | |
628 return inline_bitCount(intrinsic_id()); | |
619 | 629 |
620 case vmIntrinsics::_reverseBytes_i: | 630 case vmIntrinsics::_reverseBytes_i: |
621 case vmIntrinsics::_reverseBytes_l: | 631 case vmIntrinsics::_reverseBytes_l: |
622 return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id()); | 632 return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id()); |
623 | 633 |
1712 } else { | 1722 } else { |
1713 return basic_plus_adr(base, offset); | 1723 return basic_plus_adr(base, offset); |
1714 } | 1724 } |
1715 } | 1725 } |
1716 | 1726 |
1727 //----------------------------inline_bitCount_int/long----------------------- | |
1728 // inline int Integer.bitCount(int) | |
1729 // inline int Long.bitCount(long) | |
1730 bool LibraryCallKit::inline_bitCount(vmIntrinsics::ID id) { | |
1731 assert(id == vmIntrinsics::_bitCount_i || id == vmIntrinsics::_bitCount_l, "not bitCount"); | |
1732 if (id == vmIntrinsics::_bitCount_i && !Matcher::has_match_rule(Op_PopCountI)) return false; | |
1733 if (id == vmIntrinsics::_bitCount_l && !Matcher::has_match_rule(Op_PopCountL)) return false; | |
1734 _sp += arg_size(); // restore stack pointer | |
1735 switch (id) { | |
1736 case vmIntrinsics::_bitCount_i: | |
1737 push(_gvn.transform(new (C, 2) PopCountINode(pop()))); | |
1738 break; | |
1739 case vmIntrinsics::_bitCount_l: | |
1740 push(_gvn.transform(new (C, 2) PopCountLNode(pop_pair()))); | |
1741 break; | |
1742 default: | |
1743 ShouldNotReachHere(); | |
1744 } | |
1745 return true; | |
1746 } | |
1747 | |
1717 //----------------------------inline_reverseBytes_int/long------------------- | 1748 //----------------------------inline_reverseBytes_int/long------------------- |
1718 // inline Integer.reverseBytes(int) | 1749 // inline Integer.reverseBytes(int) |
1719 // inline Long.reverseBytes(long) | 1750 // inline Long.reverseBytes(long) |
1720 bool LibraryCallKit::inline_reverseBytes(vmIntrinsics::ID id) { | 1751 bool LibraryCallKit::inline_reverseBytes(vmIntrinsics::ID id) { |
1721 assert(id == vmIntrinsics::_reverseBytes_i || id == vmIntrinsics::_reverseBytes_l, "not reverse Bytes"); | 1752 assert(id == vmIntrinsics::_reverseBytes_i || id == vmIntrinsics::_reverseBytes_l, "not reverse Bytes"); |