// gcc -O -S -o mod_arith.s mod_arith.cpp #include typedef int32_t jint; typedef uint32_t juint; typedef int64_t jlong; typedef uint64_t julong; #define JAVA_INTEGER_OP(OP, NAME, TYPE, UNSIGNED_TYPE) \ TYPE NAME (TYPE in1, TYPE in2) { \ UNSIGNED_TYPE ures = static_cast(in1); \ ures OP ## = static_cast(in2); \ return reinterpret_cast(ures); \ } JAVA_INTEGER_OP(+, java_add, jint, juint) JAVA_INTEGER_OP(-, java_subtract, jint, juint) JAVA_INTEGER_OP(*, java_multiply, jint, juint) JAVA_INTEGER_OP(+, java_add, jlong, julong) JAVA_INTEGER_OP(-, java_subtract, jlong, julong) JAVA_INTEGER_OP(*, java_multiply, jlong, julong)