mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-14 10:30:56 +08:00
builtins.c (java_builtins): Use popcount* and bswap* builtins to implement bitCount() and reverseBytes()...
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
This commit is contained in:
parent
051154a1f6
commit
a1293f402a
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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.
|
||||
|
BIN
libjava/testsuite/libjava.lang/BuiltinBitCount.jar
Normal file
BIN
libjava/testsuite/libjava.lang/BuiltinBitCount.jar
Normal file
Binary file not shown.
51
libjava/testsuite/libjava.lang/BuiltinBitCount.java
Normal file
51
libjava/testsuite/libjava.lang/BuiltinBitCount.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
0
libjava/testsuite/libjava.lang/BuiltinBitCount.out
Normal file
0
libjava/testsuite/libjava.lang/BuiltinBitCount.out
Normal file
BIN
libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar
Normal file
BIN
libjava/testsuite/libjava.lang/BuiltinReverseBytes.jar
Normal file
Binary file not shown.
62
libjava/testsuite/libjava.lang/BuiltinReverseBytes.java
Normal file
62
libjava/testsuite/libjava.lang/BuiltinReverseBytes.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user