aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Lefevre <vincent@vinc17.net>2012-06-27 13:31:44 +0200
committerMilutin Jovanović <jovanovic.milutin@gmail.com>2012-06-27 08:23:52 -0400
commit240064c03bbc4264ff972f4dbd2d0e2f6d4222c7 (patch)
treeb89ce44a614ce5a20e1712c853c8f4539ea2e973
parent42c1b6ba380d9d1ab85f0cc21db07e71667cc682 (diff)
downloadtinycc-240064c03bbc4264ff972f4dbd2d0e2f6d4222c7.tar.gz
tinycc-240064c03bbc4264ff972f4dbd2d0e2f6d4222c7.tar.bz2
Incorrect shift result type with 64-bit ABI
On 2012-06-26 15:07:57 +0200, Vincent Lefevre wrote: > ISO C99 TC3 says: [6.5.7#3] "The integer promotions are performed on > each of the operands. The type of the result is that of the promoted > left operand." I've written a patch (attached). Now the shift problems no longer occur with the testcase and with GNU MPFR's "make check". -- Vincent Lefèvre <vincent@vinc17.net> - Web: <http://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)
-rw-r--r--tccgen.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/tccgen.c b/tccgen.c
index 7295267..26a5781 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -1678,6 +1678,9 @@ ST_FUNC void gen_op(int op)
(op < TOK_ULT || op > TOK_GT))
tcc_error("invalid operands for binary operation");
goto std_op;
+ } else if (op == TOK_SHR || op == TOK_SAR || op == TOK_SHL) {
+ t = (bt1 == VT_LLONG ? VT_LLONG : VT_INT) | (t1 & VT_UNSIGNED);
+ goto std_op;
} else if (bt1 == VT_LLONG || bt2 == VT_LLONG) {
/* cast to biggest op */
t = VT_LLONG;