summaryrefslogtreecommitdiff
path: root/insns.def
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-26 06:23:34 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-26 06:23:34 +0000
commitc179584ba4949a6f569e2c0734a6f01dbdae3f60 (patch)
tree96b063d6df2cc6e0690fac33ef705ee6ac83a34f /insns.def
parent931574010102b4bd9db6cfb17b840e28b26030e6 (diff)
* include/ruby/ruby.h: IL32LLP64 support.
* bignum.c (bigfixize, rb_cstr_to_inum): ditto. * insns.def (opt_plus, opt_minus, opt_mult): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12622 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insns.def')
-rw-r--r--insns.def25
1 files changed, 21 insertions, 4 deletions
diff --git a/insns.def b/insns.def
index 9e8ceb49cd..9db85ff162 100644
--- a/insns.def
+++ b/insns.def
@@ -1623,12 +1623,25 @@ opt_plus
else if (FIXNUM_2_P(recv, obj) &&
BASIC_OP_UNREDEFINED_P(BOP_PLUS)) {
/* fixnum + fixnum */
+#ifndef LONG_LONG_VALUE
val = (recv + (obj & (~1)));
if ((~(recv ^ obj) & (recv ^ val)) &
((VALUE)0x01 << ((sizeof(VALUE) * CHAR_BIT) - 1))) {
val = rb_big_plus(rb_int2big(FIX2INT(recv)),
rb_int2big(FIX2INT(obj)));
}
+#else
+ long a, b, c;
+ a = FIX2LONG(recv);
+ b = FIX2LONG(obj);
+ c = a + b;
+ if (FIXABLE(c)) {
+ val = LONG2FIX(c);
+ }
+ else {
+ val = rb_big_plus(rb_int2big(a), rb_int2big(b));
+ }
+#endif
}
#endif
@@ -1686,9 +1699,11 @@ opt_minus
a = FIX2LONG(recv);
b = FIX2LONG(obj);
c = a - b;
- val = LONG2FIX(c);
- if (FIX2LONG(val) != c) {
+ if (FIXABLE(c)) {
+ val = LONG2FIX(c);
+ }
+ else {
val = rb_big_minus(rb_int2big(a), rb_int2big(b));
}
}
@@ -1722,9 +1737,11 @@ opt_mult
else {
b = FIX2LONG(obj);
c = a * b;
- val = LONG2FIX(c);
- if (FIX2LONG(val) != c || c / a != b) {
+ if (FIXABLE(c) && c / a == b) {
+ val = LONG2FIX(c);
+ }
+ else {
val = rb_big_mul(rb_int2big(a), rb_int2big(b));
}
}