|
|
case OP_Multiply: b *= a; break; | case OP_Multiply: b *= a; break; |
case OP_Divide: { | case OP_Divide: { |
if( a==0 ) goto divide_by_zero; | if( a==0 ) goto divide_by_zero; |
|
/* Dividing the largest possible negative 64-bit integer (1<<63) by |
|
** -1 returns an integer to large to store in a 64-bit data-type. On |
|
** some architectures, the value overflows to (1<<63). On others, |
|
** a SIGFPE is issued. The following statement normalizes this |
|
** behaviour so that all architectures behave as if integer |
|
** overflow occured. |
|
*/ |
|
if( a==-1 && b==(1<<63) ) a = 1; |
b /= a; | b /= a; |
break; | break; |
} | } |
default: { | default: { |
if( a==0 ) goto divide_by_zero; | if( a==0 ) goto divide_by_zero; |
|
if( a==-1 ) a = 1; |
b %= a; | b %= a; |
break; | break; |
} | } |
|
|
i64 ia = (i64)a; | i64 ia = (i64)a; |
i64 ib = (i64)b; | i64 ib = (i64)b; |
if( ia==0 ) goto divide_by_zero; | if( ia==0 ) goto divide_by_zero; |
|
if( ia==-1 ) ia = 1; |
b = ib % ia; | b = ib % ia; |
break; | break; |
} | } |
|
|
test_expr expr-1.104 {i1=0} {(-9223372036854775808.0 % -1)} 0.0 | test_expr expr-1.104 {i1=0} {(-9223372036854775808.0 % -1)} 0.0 |
test_expr expr-1.105 {i1=0} {(-9223372036854775808.0 / -1)>1} 1 | test_expr expr-1.105 {i1=0} {(-9223372036854775808.0 / -1)>1} 1 |
| |
|
test_expr expr-1.106 {i1=0} {(1<<63)/-1} -9223372036854775808 |
|
test_expr expr-1.107 {i1=0} {(1<<63)%-1} 0 |
|
|
test_expr expr-2.1 {r1=1.23, r2=2.34} {r1+r2} 3.57 | test_expr expr-2.1 {r1=1.23, r2=2.34} {r1+r2} 3.57 |
test_expr expr-2.2 {r1=1.23, r2=2.34} {r1-r2} -1.11 | test_expr expr-2.2 {r1=1.23, r2=2.34} {r1-r2} -1.11 |
test_expr expr-2.3 {r1=1.23, r2=2.34} {r1*r2} 2.8782 | test_expr expr-2.3 {r1=1.23, r2=2.34} {r1*r2} 2.8782 |