public inbox for java-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [JAVA PATCH] Builtin support for popcount* and bswap* functions
@ 2016-02-22 18:13 roger
  2016-02-22 18:16 ` Andrew Haley
  2016-05-19 18:09 ` Jeff Law
  0 siblings, 2 replies; 3+ messages in thread
From: roger @ 2016-02-22 18:13 UTC (permalink / raw)
  To: java-patches, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 1695 bytes --]


The following patch provides builtin support for byte swapping and bit counting.
On suitable hardware, these generate the x86 popcount instructions, as also
generated by the SUN HotSpot JIT/JVM for these method calls.

java.lang.Integer.bitCount -> __builtin_popcount
java.lang.Long.bitCount -> __builtin_popcountl

java.lang.Short.reverseBytes -> __builtin_bswap16
java.lang.Integer.reverseBytes -> __builtin_bswap32
java.lang.Long.reverseBytes -> __builtin_bswap64

New test cases have been added to libjava to double check nothing breaks.
Whist I was there I noticed that the math builtins (many of which I added support for
back in 2003/2004) weren't marked as ECF_LEAF, indicating that they don't/can't
invoke any user specified functions.   This has also been fixed in the patch below.

The following patch has been tested on x86_64-pc-linux-gnu with a full make bootstrap
and make check with no new failures/regressions.

Ok for stage1 once it reopens?

Cheers,

Roger
--
Roger Sayle, Ph.D.
CEO and founder
NextMove Software Limited
Registered in England No. 07588305
Registered Office: Innovation Centre (Unit 23), Cambridge Science Park, Cambridge CB4 0EY

2016-02-21  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.

 

[-- Attachment #2: patch7b.txt --]
[-- Type: text/plain, Size: 4959 bytes --]

Index: builtins.c
===================================================================
--- builtins.c	(revision 233190)
+++ builtins.c	(working copy)
@@ -98,6 +98,11 @@
   { { "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 @@
   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 @@
 				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,

[-- Attachment #3: BuiltinBitCount.java --]
[-- Type: application/octet-stream, Size: 1135 bytes --]

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();
  }
}

[-- Attachment #4: BuiltinReverseBytes.java --]
[-- Type: application/octet-stream, Size: 1569 bytes --]

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();
  }
}

[-- Attachment #5: Type: text/plain, Size: 2 bytes --]




^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [JAVA PATCH] Builtin support for popcount* and bswap* functions
  2016-02-22 18:13 [JAVA PATCH] Builtin support for popcount* and bswap* functions roger
@ 2016-02-22 18:16 ` Andrew Haley
  2016-05-19 18:09 ` Jeff Law
  1 sibling, 0 replies; 3+ messages in thread
From: Andrew Haley @ 2016-02-22 18:16 UTC (permalink / raw)
  To: java-patches

On 02/22/2016 06:13 PM, roger@nextmovesoftware.com wrote:
> Ok for stage1 once it reopens?

Yes, thanks.

Andrew.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [JAVA PATCH] Builtin support for popcount* and bswap* functions
  2016-02-22 18:13 [JAVA PATCH] Builtin support for popcount* and bswap* functions roger
  2016-02-22 18:16 ` Andrew Haley
@ 2016-05-19 18:09 ` Jeff Law
  1 sibling, 0 replies; 3+ messages in thread
From: Jeff Law @ 2016-05-19 18:09 UTC (permalink / raw)
  To: roger, java-patches, gcc-patches

On 02/22/2016 11:13 AM, roger@nextmovesoftware.com wrote:
>
> The following patch provides builtin support for byte swapping and bit counting.
> On suitable hardware, these generate the x86 popcount instructions, as also
> generated by the SUN HotSpot JIT/JVM for these method calls.
>
> java.lang.Integer.bitCount -> __builtin_popcount
> java.lang.Long.bitCount -> __builtin_popcountl
>
> java.lang.Short.reverseBytes -> __builtin_bswap16
> java.lang.Integer.reverseBytes -> __builtin_bswap32
> java.lang.Long.reverseBytes -> __builtin_bswap64
>
> New test cases have been added to libjava to double check nothing breaks.
> Whist I was there I noticed that the math builtins (many of which I added support for
> back in 2003/2004) weren't marked as ECF_LEAF, indicating that they don't/can't
> invoke any user specified functions.   This has also been fixed in the patch below.
>
> The following patch has been tested on x86_64-pc-linux-gnu with a full make bootstrap
> and make check with no new failures/regressions.
>
> Ok for stage1 once it reopens?
>
> Cheers,
>
> Roger
> --
> Roger Sayle, Ph.D.
> CEO and founder
> NextMove Software Limited
> Registered in England No. 07588305
> Registered Office: Innovation Centre (Unit 23), Cambridge Science Park, Cambridge CB4 0EY
>
> 2016-02-21  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.
OK for the trunk.

Thanks,
Jeff

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-05-19 18:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-22 18:13 [JAVA PATCH] Builtin support for popcount* and bswap* functions roger
2016-02-22 18:16 ` Andrew Haley
2016-05-19 18:09 ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).