From 5c746cad4c6fb09a86e322bd4992237023d0fe87 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Sun, 27 Mar 2011 23:42:43 -0700 Subject: [PATCH] fix 64 bit sign extension bug --- src/backend/cod4.c | 4 ++-- test/runnable/literal.d | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/backend/cod4.c b/src/backend/cod4.c index f15004e3c616..eac0f9e6f5b9 100644 --- a/src/backend/cod4.c +++ b/src/backend/cod4.c @@ -493,8 +493,8 @@ code *cdeq(elem *e,regm_t *pretregs) cl = movregconst(cl,cs.Irm & 7,p[1],0); } } - else if (I64 && sz == 8 && *p != *(unsigned *)p) - { + else if (I64 && sz == 8 && *p >= 0x80000000) + { // Use 64 bit MOV, as the 32 bit one gets sign extended // MOV reg,imm64 // MOV EA,reg regm_t rregm = allregs & ~idxregm(&cs); diff --git a/test/runnable/literal.d b/test/runnable/literal.d index a6285792af0d..39a8dd93f2c9 100644 --- a/test/runnable/literal.d +++ b/test/runnable/literal.d @@ -30,7 +30,7 @@ int dotype(uint x) { return T_uint; } int dotype(long x) { return T_long; } int dotype(ulong x) { return T_ulong; } -int main() +void test1() { /* * 0x7FFF 077777 32767 @@ -209,7 +209,21 @@ int main() assert(dotype(9223372036854775807uL) == T_ulong); assert(dotype(9223372036854775808uL) == T_ulong); assert(dotype(18446744073709551615uL) == T_ulong); +} + +void test2() +{ + ulong[] a = [ 2_463_534_242UL ]; + + foreach(e; a) + assert(e == 2_463_534_242UL); +} + +int main() +{ + test1(); + test2(); printf("Success\n"); - return EXIT_SUCCESS; + return 0; }