builtins.c (java_builtins): Use popcount* and bswap* builtins to implement bitCount...
authorRoger Sayle <roger@nextmovesoftware.com>
Tue, 31 May 2016 11:30:56 +0000 (11:30 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Tue, 31 May 2016 11:30:56 +0000 (11:30 +0000)
2016-05-31  Roger Sayle  <roger@nextmovesoftware.com>

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
gcc/java/builtins.c
libjava/ChangeLog
libjava/testsuite/libjava.lang/BuiltinBitCount.jar [new file with mode: 0644]
libjava/testsuite/libjava.lang/BuiltinBitCount.java [new file with mode: 0644]
libjava/testsuite/libjava.lang/BuiltinBitCount.out [new file with mode: 0644]
libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar [new file with mode: 0644]
libjava/testsuite/libjava.lang/BuiltinReverseBytes.java [new file with mode: 0644]
libjava/testsuite/libjava.lang/BuiltinReverseBytes.out [new file with mode: 0644]

index 8aa55ab7a40d7e458e0987d1f71201d3b4c91309..58e40a6c1337ab79a080525f22d7c5cc362c8425 100644 (file)
@@ -1,3 +1,11 @@
+2016-05-31  Roger Sayle  <roger@nextmovesoftware.com>
+
+       * 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  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR java/70839
index 033e086dc4b38ac667abed46eef40554df647b16..f27831d51c24ffa42c8cc6030780afa1489d59cd 100644 (file)
@@ -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,
index 596fc0529edd3857546f073a6e519ddcf7f57b72..0a2830555d3d8bc8fe21b33e540851e0e4b739da 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-31  Roger Sayle  <roger@nextmovesoftware.com>
+
+       * testsuite/libjava.lang/BuiltinBitCount.java: New test case.
+       * testsuite/libjava.lang/BuiltinReverseBytes.java: Likewise.
+
 2016-04-30  Oleg Endo  <olegendo@gcc.gnu.org>
 
        * 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 (file)
index 0000000..0f6591c
Binary files /dev/null and b/libjava/testsuite/libjava.lang/BuiltinBitCount.jar differ
diff --git a/libjava/testsuite/libjava.lang/BuiltinBitCount.java b/libjava/testsuite/libjava.lang/BuiltinBitCount.java
new file mode 100644 (file)
index 0000000..bcafd31
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
diff --git a/libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar b/libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar
new file mode 100644 (file)
index 0000000..283a178
Binary files /dev/null and b/libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar differ
diff --git a/libjava/testsuite/libjava.lang/BuiltinReverseBytes.java b/libjava/testsuite/libjava.lang/BuiltinReverseBytes.java
new file mode 100644 (file)
index 0000000..0d2e332
--- /dev/null
@@ -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 (file)
index 0000000..e69de29