From 62e73da6124758c2e8c2a75defac2da092a93941 Mon Sep 17 00:00:00 2001
From: Shinichiro Hamaji <shinichiro.hamaji _at_ gmail.com>
Date: Sun, 15 Mar 2009 14:50:38 +0900
Subject: [PATCH] A uint64 bug fix on x86-64

64bit unsigned literal was handled as 32bit integer.
Added a unittest to catch this.
---
 tcctest.c    | 2 ++
 x86_64-gen.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/tcctest.c b/tcctest.c
index 6e716df1..050f522f 100644
--- a/tcctest.c
+++ b/tcctest.c
@@ -1693,6 +1693,8 @@ void longlong_test(void)
     a = 68719476720LL;
     b = 4294967295LL;
     printf("%d %d %d %d\n", a > b, a < b, a >= b, a <= b);
+
+    printf("%Ld\n", 0x123456789LLU);
 }
 
 void manyarg_test(void)
diff --git a/x86_64-gen.c b/x86_64-gen.c
index 2435d4d8..cfaf84c4 100644
--- a/x86_64-gen.c
+++ b/x86_64-gen.c
@@ -312,7 +312,7 @@ void load(int r, SValue *sv)
         gen_modrm(r, fr, sv->sym, fc);
     } else {
         if (v == VT_CONST) {
-            if ((ft & VT_TYPE) == VT_LLONG) {
+            if ((ft & VT_BTYPE) == VT_LLONG) {
                 o(0x48);
                 o(0xb8 + REG_VALUE(r)); /* mov $xx, r */
                 gen_addr64(fr, sv->sym, sv->c.ull);