From a1293f402a25801d03a58312b06b65c33702c726 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Tue, 31 May 2016 11:30:56 +0000 Subject: [PATCH] builtins.c (java_builtins): Use popcount* and bswap* builtins to implement bitCount() and reverseBytes()... 2016-05-31 Roger Sayle gcc/java: * builtins.c (java_builtins): Use popcount* and bswap* builtins to implement bitCount() and reverseBytes() methods in java.lang.Integer and friends. (initialize_builtins): Annotate math builtins with ECF_LEAF. Call define_builtin for the new popcount* and bswap* builtins. libjava: * testsuite/libjava.lang/BuiltinBitCount.java: New test case. * testsuite/libjava.lang/BuiltinReverseBytes.java: Likewise. From-SVN: r236919 --- gcc/java/ChangeLog | 8 +++ gcc/java/builtins.c | 65 +++++++++++++----- libjava/ChangeLog | 5 ++ .../libjava.lang/BuiltinBitCount.jar | Bin 0 -> 1033 bytes .../libjava.lang/BuiltinBitCount.java | 51 ++++++++++++++ .../libjava.lang/BuiltinBitCount.out | 0 .../libjava.lang/BuiltinReverseBytes.jar | Bin 0 -> 1126 bytes .../libjava.lang/BuiltinReverseBytes.java | 62 +++++++++++++++++ .../libjava.lang/BuiltinReverseBytes.out | 0 9 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 libjava/testsuite/libjava.lang/BuiltinBitCount.jar create mode 100644 libjava/testsuite/libjava.lang/BuiltinBitCount.java create mode 100644 libjava/testsuite/libjava.lang/BuiltinBitCount.out create mode 100644 libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar create mode 100644 libjava/testsuite/libjava.lang/BuiltinReverseBytes.java create mode 100644 libjava/testsuite/libjava.lang/BuiltinReverseBytes.out diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 8aa55ab7a40d..58e40a6c1337 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,11 @@ +2016-05-31 Roger Sayle + + * builtins.c (java_builtins): Use popcount* and bswap* builtins to + implement bitCount() and reverseBytes() methods in java.lang.Integer + and friends. + (initialize_builtins): Annotate math builtins with ECF_LEAF. Call + define_builtin for the new popcount* and bswap* builtins. + 2016-04-28 Rainer Orth PR java/70839 diff --git a/gcc/java/builtins.c b/gcc/java/builtins.c index 033e086dc4b3..f27831d51c24 100644 --- a/gcc/java/builtins.c +++ b/gcc/java/builtins.c @@ -98,6 +98,11 @@ static GTY(()) struct builtin_record java_builtins[] = { { "java.lang.Math" }, { "sin" }, NULL, BUILT_IN_SIN }, { { "java.lang.Math" }, { "sqrt" }, NULL, BUILT_IN_SQRT }, { { "java.lang.Math" }, { "tan" }, NULL, BUILT_IN_TAN }, + { { "java.lang.Integer" }, { "bitCount" }, NULL, BUILT_IN_POPCOUNT }, + { { "java.lang.Integer" }, { "reverseBytes" }, NULL, BUILT_IN_BSWAP32 }, + { { "java.lang.Long" }, { "bitCount" }, NULL, BUILT_IN_POPCOUNTL }, + { { "java.lang.Long" }, { "reverseBytes" }, NULL, BUILT_IN_BSWAP64 }, + { { "java.lang.Short" }, { "reverseBytes" }, NULL, BUILT_IN_BSWAP16 }, { { "java.lang.Float" }, { "intBitsToFloat" }, convert_real, (enum built_in_function) 0 }, { { "java.lang.Double" }, { "longBitsToDouble" }, convert_real, @@ -483,6 +488,7 @@ initialize_builtins (void) tree double_ftype_double, double_ftype_double_double; tree float_ftype_float_float; tree boolean_ftype_boolean_boolean; + tree int_ftype_int; int i; for (i = 0; java_builtins[i].builtin_code != END_BUILTINS; ++i) @@ -507,50 +513,77 @@ initialize_builtins (void) double_type_node, double_type_node, NULL_TREE); define_builtin (BUILT_IN_FMOD, "__builtin_fmod", - double_ftype_double_double, "fmod", ECF_CONST); + double_ftype_double_double, "fmod", ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_FMODF, "__builtin_fmodf", - float_ftype_float_float, "fmodf", ECF_CONST); + float_ftype_float_float, "fmodf", ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_ACOS, "__builtin_acos", double_ftype_double, "_ZN4java4lang4Math4acosEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_ASIN, "__builtin_asin", double_ftype_double, "_ZN4java4lang4Math4asinEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_ATAN, "__builtin_atan", double_ftype_double, "_ZN4java4lang4Math4atanEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_ATAN2, "__builtin_atan2", double_ftype_double_double, "_ZN4java4lang4Math5atan2EJddd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_CEIL, "__builtin_ceil", double_ftype_double, "_ZN4java4lang4Math4ceilEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_COS, "__builtin_cos", double_ftype_double, "_ZN4java4lang4Math3cosEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_EXP, "__builtin_exp", double_ftype_double, "_ZN4java4lang4Math3expEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_FLOOR, "__builtin_floor", double_ftype_double, "_ZN4java4lang4Math5floorEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_LOG, "__builtin_log", double_ftype_double, "_ZN4java4lang4Math3logEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_POW, "__builtin_pow", double_ftype_double_double, "_ZN4java4lang4Math3powEJddd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_SIN, "__builtin_sin", double_ftype_double, "_ZN4java4lang4Math3sinEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_SQRT, "__builtin_sqrt", double_ftype_double, "_ZN4java4lang4Math4sqrtEJdd", - ECF_CONST); + ECF_CONST | ECF_LEAF); define_builtin (BUILT_IN_TAN, "__builtin_tan", double_ftype_double, "_ZN4java4lang4Math3tanEJdd", - ECF_CONST); - + ECF_CONST | ECF_LEAF); + + int_ftype_int = build_function_type_list (int_type_node, + int_type_node, NULL_TREE); + + define_builtin (BUILT_IN_POPCOUNT, "__builtin_popcount", int_ftype_int, + "_ZN4java4lang7Integer8bitCountEJii", + ECF_CONST | ECF_LEAF | ECF_NOTHROW); + define_builtin (BUILT_IN_BSWAP32, "__builtin_bswap32", int_ftype_int, + "_ZN4java4lang7Integer12reverseBytesEJii", + ECF_CONST | ECF_LEAF | ECF_NOTHROW); + + define_builtin (BUILT_IN_POPCOUNTL, "__builtin_popcountl", + build_function_type_list (int_type_node, + long_type_node, NULL_TREE), + "_ZN4java4lang4Long8bitCountEJix", + ECF_CONST | ECF_LEAF | ECF_NOTHROW); + define_builtin (BUILT_IN_BSWAP64, "__builtin_bswap64", + build_function_type_list (long_type_node, + long_type_node, NULL_TREE), + "_ZN4java4lang4Long12reverseBytesEJxx", + ECF_CONST | ECF_LEAF | ECF_NOTHROW); + + define_builtin (BUILT_IN_BSWAP16, "__builtin_bswap16", + build_function_type_list (short_type_node, + short_type_node, NULL_TREE), + "_ZN4java4lang5Short12reverseBytesEJss", + ECF_CONST | ECF_LEAF | ECF_NOTHROW); + boolean_ftype_boolean_boolean = build_function_type_list (boolean_type_node, boolean_type_node, boolean_type_node, diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 596fc0529edd..0a2830555d3d 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,8 @@ +2016-05-31 Roger Sayle + + * testsuite/libjava.lang/BuiltinBitCount.java: New test case. + * testsuite/libjava.lang/BuiltinReverseBytes.java: Likewise. + 2016-04-30 Oleg Endo * classpath/config.guess: Revert r235676. diff --git a/libjava/testsuite/libjava.lang/BuiltinBitCount.jar b/libjava/testsuite/libjava.lang/BuiltinBitCount.jar new file mode 100644 index 0000000000000000000000000000000000000000..0f6591c1e27bbf1e37f53cc917ca4de610d1b5f0 GIT binary patch literal 1033 zc-jl_W@Zs#;Nak3IF+#9g8>O}GO#fCx`sIFdiuHP|2xINz|0Wf&CUUmVuC6Oz^PdT zh~b)j9sNArT!TaOeBD0#o;mH~t*dvD*IQTX+?n&6gAA@1KX_WC=jE&8>3gws6$@v? z3&|t1XJ}>o5LZ=uzC_F7xwz;Pan)%IQ?ox6eJo-GJ7VRr3sTNND_l?Cv7G77r^ZwoE z>OIvp@$XL0|304~=IAOmW=r1Z6R#VzSBi2=i99(ZU~i`MLVn}FR+W18_BIu_PWbX^OTLNE{FU`RpFTP@TyMuLDL|sh6?TW zUY_$8<(_n;tXWXp}#Idksd3|ccs^O9^ebzHY25ea*n}y#%VjMTUFO?UdHuO%)NU0 z;o6SOHwkQdyDOSx=6&+5_Ujj)aokSq16OxNuj-z|Ms`W8?ivrY@9s+!yJRW{WdkW-2EqeC+L#%{ F0|4?Uaen{+ literal 0 Hc-jL100001 diff --git a/libjava/testsuite/libjava.lang/BuiltinBitCount.java b/libjava/testsuite/libjava.lang/BuiltinBitCount.java new file mode 100644 index 000000000000..bcafd310a212 --- /dev/null +++ b/libjava/testsuite/libjava.lang/BuiltinBitCount.java @@ -0,0 +1,51 @@ +class BuiltinBitCount +{ + public static int popcount(int x) + { + return Integer.bitCount(x); + } + + public static int popcountl(long x) + { + return Long.bitCount(x); + } + + public static void main(String[] args) + { + if (Integer.bitCount(0) != 0) + throw new Error(); + if (Integer.bitCount(8) != 1) + throw new Error(); + if (Integer.bitCount(123456) != 6) + throw new Error(); + if (Integer.bitCount(-1) != 32) + throw new Error(); + + if (Long.bitCount(0) != 0) + throw new Error(); + if (Long.bitCount(8) != 1) + throw new Error(); + if (Long.bitCount(123456) != 6) + throw new Error(); + if (Long.bitCount(-1) != 64) + throw new Error(); + + if (popcount(0) != 0) + throw new Error(); + if (popcount(8) != 1) + throw new Error(); + if (popcount(123456) != 6) + throw new Error(); + if (popcount(-1) != 32) + throw new Error(); + + if (popcountl(0) != 0) + throw new Error(); + if (popcountl(8) != 1) + throw new Error(); + if (popcountl(123456) != 6) + throw new Error(); + if (popcountl(-1) != 64) + throw new Error(); + } +} diff --git a/libjava/testsuite/libjava.lang/BuiltinBitCount.out b/libjava/testsuite/libjava.lang/BuiltinBitCount.out new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar b/libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar new file mode 100644 index 0000000000000000000000000000000000000000..283a178eedbe65b7cad9419934c39860370dd544 GIT binary patch literal 1126 zc-jl_W@Zs#;Nak3xR9{lg8>O}GO#fCx`sIFdiuHP|2xINz|0Wf&CUUmVuC6Oz^PdT zh~b)j9sNArT!TaOeBD0#o;mH~t*dvD*IQTX+?n&6gAA@1KX_WC=jE&8>3gws6$@v? z3&|t1XJ}>o5LZ=uzC_F7xwz;Pan)%IQ?ox6eJo-GJ7VRr3sTNND_l?;K!l0fWK znwe9QnHQ8=mReMt>Qq^hTCA6xlUQ7wJH^-Ma)QM1|L;$&&~9CKH)NlvK;%!U4P9Iv zCwtVCgN5CvN$f3IJk#}s$92Ux+bT1uodutlsLfOGF!^}m;%srD^K!PcR-BJkxXqRO ztM1RI`g_msf3Lj#cmM8qh9wCe9f=NyRC&C1^eA$2zEEmYZ822HaI15^aY8z3M!(s2 zz9}1uHf(=6x!!#`3$OAX$){&$bQB7Dwmq}Fy>V|Po8rRflC$!rPS;^m&9=U__f^)x zBJs0_xCA!_RHm)-^_#3R@pAET1=FLBZs%p1Gn<=PYa4fkUM`b3rz)2^{cNf6&Lpd) zDd&oFmz$g}-uldD^N%m)u69E!@}B zV{xu)#stGoKEdEU?}a8ls^zy_zjW8zU8&)2)>bJci@e>;#gF(!&QOfv-W?yYtt;-Z z*G~1+=^by(j;t_sJoa(Tq^Cw(u10KoGo@hSH!HTf)|ZOU7w|3&|l1g_<18(hXzVN%j#3!g~d+-vc0Ii8zZcmr-axR&?rJUVYo++qx$=)3W8oYt3 zmZ|2fMjym<=L^>D=zX?+RhmEmZ|>@2PA*QR#ax1~oJ=M@yEXF|!$La+r!uAWubdt| z(CC}ycH`CIYgHaQr!262+G4Akpf9ySocC5Y+nbf@Z&xnA8O;2xVyg2$wf)By)JwQn z@p0uAieF@0^@HQ8jq7H~Rl&2grYu#`36hk%Y#8NaALbdlH2wg0SG{L_qq)Q(v64N9 z4eWxx=(&C5O}=s5VqY?o{fo&zIyL_+3avkUKt3jsX`PYe^$3~kk@9IX`XbGGEzSC+ zr?l?AG-bx6Wm*?2_Pnidc>4bH-S7X|K`FU4)ZDrmn4c!HfKoCelL!N9hGIg>ji>-6 uZ=!2O&LAQv+H7&;Ok@*4841~8k|-t|!k4WAyjj^mikN}$2$1e!2Jryo2Ac%{ literal 0 Hc-jL100001 diff --git a/libjava/testsuite/libjava.lang/BuiltinReverseBytes.java b/libjava/testsuite/libjava.lang/BuiltinReverseBytes.java new file mode 100644 index 000000000000..0d2e332081d8 --- /dev/null +++ b/libjava/testsuite/libjava.lang/BuiltinReverseBytes.java @@ -0,0 +1,62 @@ +class BuiltinReverseBytes +{ + public static short bswap16(short x) + { + return Short.reverseBytes(x); + } + + public static int bswap32(int x) + { + return Integer.reverseBytes(x); + } + + public static long bswap64(long x) + { + return Long.reverseBytes(x); + } + + public static void main(String[] args) + { + if (Short.reverseBytes((short)0) != (short)0) + throw new Error(); + if (Short.reverseBytes((short)0x1234) != (short)0x3412) + throw new Error(); + if (Short.reverseBytes((short)-1) != (short)-1) + throw new Error(); + + if (Integer.reverseBytes(0) != 0) + throw new Error(); + if (Integer.reverseBytes(0x12345678) != 0x78563412) + throw new Error(); + if (Integer.reverseBytes(-1) != -1) + throw new Error(); + + if (Long.reverseBytes(0L) != 0L) + throw new Error(); + if (Long.reverseBytes(0x123456789abcde0fL) != 0x0fdebc9a78563412L) + throw new Error(); + if (Long.reverseBytes(-1L) != -1L) + throw new Error(); + + if (bswap16((short)0) != (short)0) + throw new Error(); + if (bswap16((short)0x1234) != (short)0x3412) + throw new Error(); + if (bswap16((short)-1) != (short)-1) + throw new Error(); + + if (bswap32(0) != 0) + throw new Error(); + if (bswap32(0x12345678) != 0x78563412) + throw new Error(); + if (bswap32(-1) != -1) + throw new Error(); + + if (bswap64(0L) != 0L) + throw new Error(); + if (bswap64(0x123456789abcde0fL) != 0x0fdebc9a78563412L) + throw new Error(); + if (bswap64(-1L) != -1L) + throw new Error(); + } +} diff --git a/libjava/testsuite/libjava.lang/BuiltinReverseBytes.out b/libjava/testsuite/libjava.lang/BuiltinReverseBytes.out new file mode 100644 index 000000000000..e69de29bb2d1 -- 2.47.3