summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2012-06-10 23:33:05 +0300
committerZahary Karadjov <zahary@gmail.com>2012-06-11 21:38:01 +0300
commite2d38a57ecdc3aa7b5cd81a9f2f588eb0dc5586f (patch)
tree396ef1c332c4ec460cd91ec0358a9ec02f76052c /compiler
parentce933c90a48ddf0331016edbc684ba6937412e22 (diff)
downloadNim-e2d38a57ecdc3aa7b5cd81a9f2f588eb0dc5586f.tar.gz
better support for unsigned integers.
Diffstat (limited to 'compiler')
-rwxr-xr-xcompiler/ast.nim40
-rwxr-xr-xcompiler/ccgexprs.nim12
-rwxr-xr-xcompiler/ccgtypes.nim12
-rwxr-xr-xcompiler/ccgutils.nim4
-rw-r--r--compiler/cgendata.nim8
-rwxr-xr-xcompiler/docgen.nim4
-rwxr-xr-xcompiler/evals.nim2
-rwxr-xr-xcompiler/extccomp.nim2
-rwxr-xr-xcompiler/lexer.nim41
-rwxr-xr-xcompiler/magicsys.nim6
-rwxr-xr-xcompiler/parser.nim24
-rwxr-xr-xcompiler/renderer.nim6
-rwxr-xr-xcompiler/semexprs.nim36
-rwxr-xr-xcompiler/semfold.nim12
-rwxr-xr-xcompiler/semtypes.nim6
-rwxr-xr-xcompiler/sigmatch.nim8
-rwxr-xr-xcompiler/types.nim22
17 files changed, 186 insertions, 59 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 0c25b24a1..eb258e383 100755
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -52,9 +52,15 @@ type
     nkInt16Lit,
     nkInt32Lit,
     nkInt64Lit,
+    nkUIntLit,            # an unsigned integer literal
+    nkUInt8Lit,
+    nkUInt16Lit,
+    nkUInt32Lit,
+    nkUInt64Lit,
     nkFloatLit,           # a floating point literal
     nkFloat32Lit,
     nkFloat64Lit,
+    nkFloat128Lit,
     nkStrLit,             # a string literal ""
     nkRStrLit,            # a raw string literal r""
     nkTripleStrLit,       # a triple string literal """
@@ -323,6 +329,7 @@ type
     tfEnumHasHoles,   # enum cannot be mapped into a range
     tfShallow,        # type can be shallow copied on assignment
     tfThread,         # proc type is marked as ``thread``
+    tfLiteral         # type represents literal value
     tfFromGeneric     # type is an instantiation of a generic; this is needed
                       # because for instantiations of objects, structural
                       # type equality has to be used
@@ -406,8 +413,11 @@ type
     mNewString, mNewStringOfCap,
     mReset,
     mArray, mOpenArray, mRange, mSet, mSeq, 
-    mOrdinal, mInt, mInt8, mInt16, mInt32, 
-    mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, mString, mCstring, 
+    mOrdinal,
+    mInt, mInt8, mInt16, mInt32, mInt64,
+    mUInt, mUInt8, mUInt16, mUInt32, mUInt64,
+    mFloat, mFloat32, mFloat64, mFloat128,
+    mBool, mChar, mString, mCstring,
     mPointer, mEmptySet, mIntSetBaseType, mNil, mExpr, mStmt, mTypeDesc, 
     mVoidType, mPNimrodNode,
     mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, 
@@ -462,11 +472,11 @@ type
     info*: TLineInfo
     flags*: TNodeFlags
     case Kind*: TNodeKind
-    of nkCharLit..nkInt64Lit: 
+    of nkCharLit..nkUInt64Lit:
       intVal*: biggestInt
-    of nkFloatLit..nkFloat64Lit: 
+    of nkFloatLit..nkFloat128Lit:
       floatVal*: biggestFloat
-    of nkStrLit..nkTripleStrLit: 
+    of nkStrLit..nkTripleStrLit:
       strVal*: string
     of nkSym: 
       sym*: PSym
@@ -763,8 +773,8 @@ const                         # for all kind of hash tables:
 
 proc ValueToString*(a: PNode): string = 
   case a.kind
-  of nkCharLit..nkInt64Lit: result = $(a.intVal)
-  of nkFloatLit, nkFloat32Lit, nkFloat64Lit: result = $(a.floatVal)
+  of nkCharLit..nkUInt64Lit: result = $(a.intVal)
+  of nkFloatLit..nkFloat128Lit: result = $(a.floatVal)
   of nkStrLit..nkTripleStrLit: result = a.strVal
   else: 
     InternalError(a.info, "valueToString")
@@ -1019,8 +1029,8 @@ proc copyNode(src: PNode): PNode =
   result.typ = src.typ
   result.flags = src.flags * PersistentNodeFlags
   case src.Kind
-  of nkCharLit..nkInt64Lit: result.intVal = src.intVal
-  of nkFloatLit, nkFloat32Lit, nkFloat64Lit: result.floatVal = src.floatVal
+  of nkCharLit..nkUInt64Lit: result.intVal = src.intVal
+  of nkFloatLit..nkFloat128Lit: result.floatVal = src.floatVal
   of nkSym: result.sym = src.sym
   of nkIdent: result.ident = src.ident
   of nkStrLit..nkTripleStrLit: result.strVal = src.strVal
@@ -1034,8 +1044,8 @@ proc shallowCopy*(src: PNode): PNode =
   result.typ = src.typ
   result.flags = src.flags * PersistentNodeFlags
   case src.Kind
-  of nkCharLit..nkInt64Lit: result.intVal = src.intVal
-  of nkFloatLit, nkFloat32Lit, nkFloat64Lit: result.floatVal = src.floatVal
+  of nkCharLit..nkUInt64Lit: result.intVal = src.intVal
+  of nkFloatLit..nkFloat128Lit: result.floatVal = src.floatVal
   of nkSym: result.sym = src.sym
   of nkIdent: result.ident = src.ident
   of nkStrLit..nkTripleStrLit: result.strVal = src.strVal
@@ -1050,8 +1060,8 @@ proc copyTree(src: PNode): PNode =
   result.typ = src.typ
   result.flags = src.flags * PersistentNodeFlags
   case src.Kind
-  of nkCharLit..nkInt64Lit: result.intVal = src.intVal
-  of nkFloatLit, nkFloat32Lit, nkFloat64Lit: result.floatVal = src.floatVal
+  of nkCharLit..nkUInt64Lit: result.intVal = src.intVal
+  of nkFloatLit..nkFloat128Lit: result.floatVal = src.floatVal
   of nkSym: result.sym = src.sym
   of nkIdent: result.ident = src.ident
   of nkStrLit..nkTripleStrLit: result.strVal = src.strVal
@@ -1101,14 +1111,14 @@ proc sonsNotNil(n: PNode): bool =
 
 proc getInt*(a: PNode): biggestInt = 
   case a.kind
-  of nkIntLit..nkInt64Lit: result = a.intVal
+  of nkIntLit..nkUInt64Lit: result = a.intVal
   else: 
     internalError(a.info, "getInt")
     result = 0
 
 proc getFloat*(a: PNode): biggestFloat = 
   case a.kind
-  of nkFloatLit..nkFloat64Lit: result = a.floatVal
+  of nkFloatLit..nkFloat128Lit: result = a.floatVal
   else: 
     internalError(a.info, "getFloat")
     result = 0.0
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index 5b04111b3..a929b5af0 100755
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -34,7 +34,7 @@ proc int32Literal(i: Int): PRope =
 proc genHexLiteral(v: PNode): PRope =
   # hex literals are unsigned in C
   # so we don't generate hex literals any longer.
-  if not (v.kind in {nkIntLit..nkInt64Lit}):
+  if not (v.kind in {nkIntLit..nkUInt64Lit}):
     internalError(v.info, "genHexLiteral")
   result = intLiteral(v.intVal)
 
@@ -47,7 +47,7 @@ proc getStrLit(m: BModule, s: string): PRope =
 proc genLiteral(p: BProc, v: PNode, ty: PType): PRope =
   if ty == nil: internalError(v.info, "genLiteral: ty is nil")
   case v.kind
-  of nkCharLit..nkInt64Lit:
+  of nkCharLit..nkUInt64Lit:
     case skipTypes(ty, abstractVarRange).kind
     of tyChar, tyInt64, tyNil:
       result = intLiteral(v.intVal)
@@ -277,7 +277,7 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
     else:
       appcg(p, cpsStmts, "$1 = $2;$n", [rdLoc(dest), rdLoc(src)])
   of tyPtr, tyPointer, tyChar, tyBool, tyEnum, tyCString,
-     tyInt..tyFloat128, tyRange:
+     tyInt..tyUInt64, tyRange:
     appcg(p, cpsStmts, "$1 = $2;$n", [rdLoc(dest), rdLoc(src)])
   else: InternalError("genAssignment(" & $ty.kind & ')')
 
@@ -582,7 +582,7 @@ proc genTupleElem(p: BProc, e: PNode, d: var TLoc) =
   var ty = a.t
   var r = rdLoc(a)
   case e.sons[1].kind
-  of nkIntLit..nkInt64Lit: i = int(e.sons[1].intVal)
+  of nkIntLit..nkUInt64Lit: i = int(e.sons[1].intVal)
   else: internalError(e.info, "genTupleElem")
   when false:
     if ty.n != nil:
@@ -1684,8 +1684,8 @@ proc expr(p: BProc, e: PNode, d: var TLoc) =
         InternalError(e.info, "expr: param not init " & sym.name.s)
       putLocIntoDest(p, d, sym.loc)
     else: InternalError(e.info, "expr(" & $sym.kind & "); unknown symbol")
-  of nkStrLit..nkTripleStrLit, nkIntLit..nkInt64Lit, nkFloatLit..nkFloat64Lit,
-     nkNilLit, nkCharLit:
+  of nkStrLit..nkTripleStrLit, nkIntLit..nkUInt64Lit,
+     nkFloatLit..nkFloat128Lit, nkNilLit, nkCharLit:
     putIntoDest(p, d, e.typ, genLiteral(p, e))
   of nkCall, nkHiddenCallConv, nkInfix, nkPrefix, nkPostfix, nkCommand,
      nkCallStrLit:
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim
index 4492c2fea..e456a1eaa 100755
--- a/compiler/ccgtypes.nim
+++ b/compiler/ccgtypes.nim
@@ -174,7 +174,7 @@ proc mapType(typ: PType): TCTypeKind =
   of tyProc: result = if typ.callConv != ccClosure: ctProc else: ctStruct
   of tyString: result = ctNimStr
   of tyCString: result = ctCString
-  of tyInt..tyFloat128:
+  of tyInt..tyUInt64:
     result = TCTypeKind(ord(typ.kind) - ord(tyInt) + ord(ctInt))
   else: InternalError("mapType")
   
@@ -313,8 +313,10 @@ proc typeNameOrLiteral(t: PType, literal: string): PRope =
   
 proc getSimpleTypeDesc(m: BModule, typ: PType): PRope = 
   const 
-    NumericalTypeToStr: array[tyInt..tyFloat128, string] = ["NI", "NI8",
-      "NI16", "NI32", "NI64", "NF", "NF32", "NF64", "NF128"]
+    NumericalTypeToStr: array[tyInt..tyUInt64, string] = [
+      "NI", "NI8", "NI16", "NI32", "NI64",
+      "NF", "NF32", "NF64", "NF128",
+      "NU", "NU8", "NU16", "NU32", "NU64",]
   case typ.Kind
   of tyPointer: 
     result = typeNameOrLiteral(typ, "void*")
@@ -337,7 +339,7 @@ proc getSimpleTypeDesc(m: BModule, typ: PType): PRope =
   of tyBool: result = typeNameOrLiteral(typ, "NIM_BOOL")
   of tyChar: result = typeNameOrLiteral(typ, "NIM_CHAR")
   of tyNil: result = typeNameOrLiteral(typ, "0")
-  of tyInt..tyFloat128, tyUInt..tyUInt64: 
+  of tyInt..tyUInt64: 
     result = typeNameOrLiteral(typ, NumericalTypeToStr[typ.Kind])
   of tyRange: result = getSimpleTypeDesc(m, typ.sons[0])
   else: result = nil
@@ -871,7 +873,7 @@ proc genTypeInfo(m: BModule, typ: PType): PRope =
   if dataGenerated: return 
   case t.kind
   of tyEmpty: result = toRope"0"
-  of tyPointer, tyBool, tyChar, tyCString, tyString, tyInt..tyFloat128, tyVar:
+  of tyPointer, tyBool, tyChar, tyCString, tyString, tyInt..tyUInt64, tyVar:
     genTypeInfoAuxBase(gNimDat, t, result, toRope"0")
   of tyProc:
     if t.callConv != ccClosure:
diff --git a/compiler/ccgutils.nim b/compiler/ccgutils.nim
index 5ba523070..de49897c5 100755
--- a/compiler/ccgutils.nim
+++ b/compiler/ccgutils.nim
@@ -70,9 +70,7 @@ proc GetUniqueType*(key: PType): PType =
   var k = key.kind
   case k
   of  tyBool, tyChar, 
-      tyInt, tyInt8, tyInt16, tyInt32, tyInt64,
-      tyFloat, tyFloat32, tyFloat64, tyFloat128,
-      tyUInt, tyUInt8, tyUInt16, tyUInt32, tyUInt64:
+      tyInt..tyUInt64:
     # no canonicalization for integral types, so that e.g. ``pid_t`` is
     # produced instead of ``NI``.
     result = key
diff --git a/compiler/cgendata.nim b/compiler/cgendata.nim
index bcdf53afd..72c7ceae5 100644
--- a/compiler/cgendata.nim
+++ b/compiler/cgendata.nim
@@ -37,9 +37,11 @@ type
     cfsDynLibDeinit           # section for deinitialization of dynamic
                               # libraries
   TCTypeKind* = enum          # describes the type kind of a C type
-    ctVoid, ctChar, ctBool, ctUInt, ctUInt8, ctUInt16, ctUInt32, ctUInt64, 
-    ctInt, ctInt8, ctInt16, ctInt32, ctInt64, ctFloat, ctFloat32, ctFloat64, 
-    ctFloat128, ctArray, ctStruct, ctPtr, ctNimStr, ctNimSeq, ctProc, ctCString
+    ctVoid, ctChar, ctBool,
+    ctInt, ctInt8, ctInt16, ctInt32, ctInt64,
+    ctFloat, ctFloat32, ctFloat64, ctFloat128,
+    ctUInt, ctUInt8, ctUInt16, ctUInt32, ctUInt64,
+    ctArray, ctStruct, ctPtr, ctNimStr, ctNimSeq, ctProc, ctCString
   TCFileSections* = array[TCFileSection, PRope] # represents a generated C file
   TCProcSection* = enum       # the sections a generated C proc consists of
     cpsLocals,                # section of local variables for C proc
diff --git a/compiler/docgen.nim b/compiler/docgen.nim
index 6e249b888..ae654fda4 100755
--- a/compiler/docgen.nim
+++ b/compiler/docgen.nim
@@ -206,10 +206,10 @@ proc genItem(d: PDoc, n, nameNode: PNode, k: TSymKind) =
     of tkCharLit: 
       dispA(result, "<span class=\"CharLit\">$1</span>", "\\spanCharLit{$1}", 
             [toRope(esc(d.target, literal))])
-    of tkIntLit..tkInt64Lit: 
+    of tkIntLit..tkUInt64Lit: 
       dispA(result, "<span class=\"DecNumber\">$1</span>", 
             "\\spanDecNumber{$1}", [toRope(esc(d.target, literal))])
-    of tkFloatLit..tkFloat64Lit: 
+    of tkFloatLit..tkFloat128Lit: 
       dispA(result, "<span class=\"FloatNumber\">$1</span>", 
             "\\spanFloatNumber{$1}", [toRope(esc(d.target, literal))])
     of tkSymbol: 
diff --git a/compiler/evals.nim b/compiler/evals.nim
index 5c77a4d94..62649cb08 100755
--- a/compiler/evals.nim
+++ b/compiler/evals.nim
@@ -235,6 +235,8 @@ proc getNullValue(typ: PType, info: TLineInfo): PNode =
   case t.kind
   of tyBool, tyEnum, tyChar, tyInt..tyInt64: 
     result = newNodeIT(nkIntLit, info, t)
+  of tyUInt..tyUInt64:
+    result = newNodeIT(nkUIntLit, info, t)
   of tyFloat..tyFloat128: 
     result = newNodeIt(nkFloatLit, info, t)
   of tyVar, tyPointer, tyPtr, tyRef, tyCString, tySequence, tyString, tyExpr, 
diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim
index fb2e5f3f5..2872f28a7 100755
--- a/compiler/extccomp.nim
+++ b/compiler/extccomp.nim
@@ -597,7 +597,7 @@ proc CallCCompiler*(projectfile: string) =
 proc genMappingFiles(list: TLinkedList): PRope = 
   var it = PStrEntry(list.head)
   while it != nil: 
-    appf(result, "--file:r\"$1\"$n", [toRope(AddFileExt(it.data, cExt))])
+    appf(result, "--file:r\"$1\"$N", [toRope(AddFileExt(it.data, cExt))])
     it = PStrEntry(it.next)
 
 proc writeMapping*(gSymbolMapping: PRope) = 
diff --git a/compiler/lexer.nim b/compiler/lexer.nim
index a17871e3a..73a818e32 100755
--- a/compiler/lexer.nim
+++ b/compiler/lexer.nim
@@ -45,8 +45,10 @@ type
     tkTemplate, 
     tkTry, tkTuple, tkType, tkVar, tkWhen, tkWhile, tkWith, tkWithout, tkXor,
     tkYield, # end of keywords
-    tkIntLit, tkInt8Lit, tkInt16Lit, tkInt32Lit, tkInt64Lit, tkFloatLit, 
-    tkFloat32Lit, tkFloat64Lit, tkStrLit, tkRStrLit, tkTripleStrLit, 
+    tkIntLit, tkInt8Lit, tkInt16Lit, tkInt32Lit, tkInt64Lit,
+    tkUIntLit, tkUInt8Lit, tkUInt16Lit, tkUInt32Lit, tkUInt64Lit,
+    tkFloatLit, tkFloat32Lit, tkFloat64Lit, tkFloat128Lit,
+    tkStrLit, tkRStrLit, tkTripleStrLit,
     tkGStrLit, tkGTripleStrLit, tkCharLit, tkParLe, tkParRi, tkBracketLe, 
     tkBracketRi, tkCurlyLe, tkCurlyRi, 
     tkBracketDotLe, tkBracketDotRi, # [. and  .]
@@ -77,8 +79,10 @@ const
     "template", 
     "try", "tuple", "type", "var", "when", "while", "with", "without", "xor",
     "yield",
-    "tkIntLit", "tkInt8Lit", "tkInt16Lit", "tkInt32Lit", "tkInt64Lit", 
-    "tkFloatLit", "tkFloat32Lit", "tkFloat64Lit", "tkStrLit", "tkRStrLit", 
+    "tkIntLit", "tkInt8Lit", "tkInt16Lit", "tkInt32Lit", "tkInt64Lit",
+    "tkUIntLit", "tkUInt8Lit", "tkUInt16Lit", "tkUInt32Lit", "tkUInt64Lit",
+    "tkFloatLit", "tkFloat32Lit", "tkFloat64Lit", "tkFloat128Lit",
+    "tkStrLit", "tkRStrLit",
     "tkTripleStrLit", "tkGStrLit", "tkGTripleStrLit", "tkCharLit", "(", 
     ")", "[", "]", "{", "}", "[.", ".]", "{.", ".}", "(.", ".)",
     ",", ";",
@@ -283,12 +287,17 @@ proc GetNumber(L: var TLexer): TToken =
     case L.buf[endpos]
     of 'f', 'F': 
       inc(endpos)
-      if (L.buf[endpos] == '6') and (L.buf[endpos + 1] == '4'): 
-        result.tokType = tkFloat64Lit
-        inc(endpos, 2)
-      elif (L.buf[endpos] == '3') and (L.buf[endpos + 1] == '2'): 
+      if (L.buf[endpos] == '3') and (L.buf[endpos + 1] == '2'):
         result.tokType = tkFloat32Lit
         inc(endpos, 2)
+      elif (L.buf[endpos] == '6') and (L.buf[endpos + 1] == '4'):
+        result.tokType = tkFloat64Lit
+        inc(endpos, 2)
+      elif (L.buf[endpos] == '1') and
+           (L.buf[endpos + 1] == '2') and
+           (L.buf[endpos + 2] == '8'):
+        result.tokType = tkFloat128Lit
+        inc(endpos, 3)
       else: 
         lexMessage(L, errInvalidNumber, result.literal & "'f" & L.buf[endpos])
     of 'i', 'I': 
@@ -307,6 +316,22 @@ proc GetNumber(L: var TLexer): TToken =
         inc(endpos)
       else: 
         lexMessage(L, errInvalidNumber, result.literal & "'i" & L.buf[endpos])
+    of 'u', 'U':
+      inc(endpos)
+      if (L.buf[endpos] == '6') and (L.buf[endpos + 1] == '4'): 
+        result.tokType = tkUInt64Lit
+        inc(endpos, 2)
+      elif (L.buf[endpos] == '3') and (L.buf[endpos + 1] == '2'): 
+        result.tokType = tkUInt32Lit
+        inc(endpos, 2)
+      elif (L.buf[endpos] == '1') and (L.buf[endpos + 1] == '6'): 
+        result.tokType = tkUInt16Lit
+        inc(endpos, 2)
+      elif (L.buf[endpos] == '8'): 
+        result.tokType = tkUInt8Lit
+        inc(endpos)
+      else:
+        result.tokType = tkUIntLit
     else: lexMessage(L, errInvalidNumber, result.literal & "'" & L.buf[endpos])
   else:
     L.bufpos = pos            # restore position
diff --git a/compiler/magicsys.nim b/compiler/magicsys.nim
index 5b9987efa..a69b40fbf 100755
--- a/compiler/magicsys.nim
+++ b/compiler/magicsys.nim
@@ -53,9 +53,15 @@ proc getSysType(kind: TTypeKind): PType =
     of tyInt16: result = sysTypeFromName("int16")
     of tyInt32: result = sysTypeFromName("int32")
     of tyInt64: result = sysTypeFromName("int64")
+    of tyUInt: result = sysTypeFromName("uint")
+    of tyUInt8: result = sysTypeFromName("uint8")
+    of tyUInt16: result = sysTypeFromName("uint16")
+    of tyUInt32: result = sysTypeFromName("uint32")
+    of tyUInt64: result = sysTypeFromName("uint64")
     of tyFloat: result = sysTypeFromName("float")
     of tyFloat32: result = sysTypeFromName("float32")
     of tyFloat64: result = sysTypeFromName("float64")
+    of tyFloat128: result = sysTypeFromName("float128")
     of tyBool: result = sysTypeFromName("bool")
     of tyChar: result = sysTypeFromName("char")
     of tyString: result = sysTypeFromName("string")
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 4baee5b43..d1042b04d 100755
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -416,6 +416,26 @@ proc identOrLiteral(p: var TParser): PNode =
     result = newIntNodeP(nkInt64Lit, p.tok.iNumber, p)
     setBaseFlags(result, p.tok.base)
     getTok(p)
+  of tkUIntLit: 
+    result = newIntNodeP(nkUIntLit, p.tok.iNumber, p)
+    setBaseFlags(result, p.tok.base)
+    getTok(p)
+  of tkUInt8Lit: 
+    result = newIntNodeP(nkUInt8Lit, p.tok.iNumber, p)
+    setBaseFlags(result, p.tok.base)
+    getTok(p)
+  of tkUInt16Lit: 
+    result = newIntNodeP(nkUInt16Lit, p.tok.iNumber, p)
+    setBaseFlags(result, p.tok.base)
+    getTok(p)
+  of tkUInt32Lit: 
+    result = newIntNodeP(nkUInt32Lit, p.tok.iNumber, p)
+    setBaseFlags(result, p.tok.base)
+    getTok(p)
+  of tkUInt64Lit: 
+    result = newIntNodeP(nkUInt64Lit, p.tok.iNumber, p)
+    setBaseFlags(result, p.tok.base)
+    getTok(p)
   of tkFloatLit: 
     result = newFloatNodeP(nkFloatLit, p.tok.fNumber, p)
     setBaseFlags(result, p.tok.base)
@@ -428,6 +448,10 @@ proc identOrLiteral(p: var TParser): PNode =
     result = newFloatNodeP(nkFloat64Lit, p.tok.fNumber, p)
     setBaseFlags(result, p.tok.base)
     getTok(p)
+  of tkFloat128Lit:
+    result = newFloatNodeP(nkFloat128Lit, p.tok.fNumber, p)
+    setBaseFlags(result, p.tok.base)
+    getTok(p)
   of tkStrLit: 
     result = newStrNodeP(nkStrLit, p.tok.literal, p)
     getTok(p)
diff --git a/compiler/renderer.nim b/compiler/renderer.nim
index a5e79762c..21b0f2287 100755
--- a/compiler/renderer.nim
+++ b/compiler/renderer.nim
@@ -705,9 +705,15 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
   of nkInt16Lit: put(g, tkInt16Lit, atom(n))
   of nkInt32Lit: put(g, tkInt32Lit, atom(n))
   of nkInt64Lit: put(g, tkInt64Lit, atom(n))
+  of nkUIntLit: put(g, tkUIntLit, atom(n))
+  of nkUInt8Lit: put(g, tkUInt8Lit, atom(n))
+  of nkUInt16Lit: put(g, tkUInt16Lit, atom(n))
+  of nkUInt32Lit: put(g, tkUInt32Lit, atom(n))
+  of nkUInt64Lit: put(g, tkUInt64Lit, atom(n))
   of nkFloatLit: put(g, tkFloatLit, atom(n))
   of nkFloat32Lit: put(g, tkFloat32Lit, atom(n))
   of nkFloat64Lit: put(g, tkFloat64Lit, atom(n))
+  of nkFloat128Lit: put(g, tkFloat128Lit, atom(n))
   of nkStrLit: put(g, tkStrLit, atom(n))
   of nkRStrLit: put(g, tkRStrLit, atom(n))
   of nkCharLit: put(g, tkCharLit, atom(n))
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index ac9075d4f..8910e54c2 100755
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -132,10 +132,10 @@ proc checkConversionBetweenObjects(info: TLineInfo, castDest, src: PType) =
   
 proc checkConvertible(info: TLineInfo, castDest, src: PType) = 
   const 
-    IntegralTypes = {tyBool, tyEnum, tyChar, tyInt..tyFloat128}
+    IntegralTypes = {tyBool, tyEnum, tyChar, tyInt..tyUInt64}
   if sameType(castDest, src) and castDest.sym == src.sym: 
     # don't annoy conversions that may be needed on another processor:
-    if not (castDest.kind in {tyInt..tyFloat128, tyNil}): 
+    if not (castDest.kind in {tyInt..tyUInt64, tyNil}): 
       Message(info, hintConvFromXtoItselfNotNeeded, typeToString(castDest))
     return 
   var d = skipTypes(castDest, abstractVar)
@@ -143,7 +143,7 @@ proc checkConvertible(info: TLineInfo, castDest, src: PType) =
   while (d != nil) and (d.Kind in {tyPtr, tyRef}) and (d.Kind == s.Kind): 
     d = base(d)
     s = base(s)
-  if d == nil: 
+  if d == nil:
     GlobalError(info, errGenerated, msgKindToString(errIllegalConvFromXtoY) % [
         src.typeToString, castDest.typeToString])
   elif d.Kind == tyObject and s.Kind == tyObject: 
@@ -1283,6 +1283,20 @@ proc semMacroStmt(c: PContext, n: PNode, semCheck = true): PNode =
     GlobalError(n.info, errInvalidExpressionX, 
                 renderTree(a, {renderNoComments}))
 
+proc litIntType(kind: TTypeKind): PType =
+  result = getSysType(kind).copyType(getCurrOwner(), true)
+  result.flags.incl(tfLiteral)
+
+template memoize(e: expr): expr =
+  var `*guard` {.global.} = false
+  var `*memo` {.global.} : type(e)
+
+  if not `*guard`:
+    `*memo` = e
+    `*guard` = true
+
+  `*memo`
+
 proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = 
   result = n
   if gCmd == cmdIdeTools: suggestExpr(c, n)
@@ -1303,9 +1317,9 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
     if result.typ == nil: 
       let i = result.intVal
       if i >= low(int32) and i <= high(int32):
-        result.typ = getSysType(tyInt)
+        result.typ = litIntType(tyInt).memoize
       else:
-        result.typ = getSysType(tyInt64)
+        result.typ = litIntType(tyInt64).memoize
   of nkInt8Lit: 
     if result.typ == nil: result.typ = getSysType(tyInt8)
   of nkInt16Lit: 
@@ -1314,12 +1328,24 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
     if result.typ == nil: result.typ = getSysType(tyInt32)
   of nkInt64Lit: 
     if result.typ == nil: result.typ = getSysType(tyInt64)
+  of nkUIntLit:
+    if result.typ == nil: result.typ = getSysType(tyUInt)
+  of nkUInt8Lit: 
+    if result.typ == nil: result.typ = getSysType(tyUInt8)
+  of nkUInt16Lit: 
+    if result.typ == nil: result.typ = getSysType(tyUInt16)
+  of nkUInt32Lit: 
+    if result.typ == nil: result.typ = getSysType(tyUInt32)
+  of nkUInt64Lit: 
+    if result.typ == nil: result.typ = getSysType(tyUInt64)
   of nkFloatLit: 
     if result.typ == nil: result.typ = getSysType(tyFloat)
   of nkFloat32Lit: 
     if result.typ == nil: result.typ = getSysType(tyFloat32)
   of nkFloat64Lit: 
     if result.typ == nil: result.typ = getSysType(tyFloat64)
+  of nkFloat128Lit: 
+    if result.typ == nil: result.typ = getSysType(tyFloat128)
   of nkStrLit..nkTripleStrLit: 
     if result.typ == nil: result.typ = getSysType(tyString)
   of nkCharLit: 
diff --git a/compiler/semfold.nim b/compiler/semfold.nim
index 565155791..f67e58e2f 100755
--- a/compiler/semfold.nim
+++ b/compiler/semfold.nim
@@ -258,15 +258,15 @@ proc partialOrExpr(c: PSym, n: PNode): PNode =
 proc leValueConv(a, b: PNode): bool = 
   result = false
   case a.kind
-  of nkCharLit..nkInt64Lit: 
+  of nkCharLit..nkUInt64Lit: 
     case b.kind
-    of nkCharLit..nkInt64Lit: result = a.intVal <= b.intVal
-    of nkFloatLit..nkFloat64Lit: result = a.intVal <= round(b.floatVal)
+    of nkCharLit..nkUInt64Lit: result = a.intVal <= b.intVal
+    of nkFloatLit..nkFloat128Lit: result = a.intVal <= round(b.floatVal)
     else: InternalError(a.info, "leValueConv")
-  of nkFloatLit..nkFloat64Lit: 
+  of nkFloatLit..nkFloat128Lit: 
     case b.kind
-    of nkFloatLit..nkFloat64Lit: result = a.floatVal <= b.floatVal
-    of nkCharLit..nkInt64Lit: result = a.floatVal <= toFloat(int(b.intVal))
+    of nkFloatLit..nkFloat128Lit: result = a.floatVal <= b.floatVal
+    of nkCharLit..nkUInt64Lit: result = a.floatVal <= toFloat(int(b.intVal))
     else: InternalError(a.info, "leValueConv")
   else: InternalError(a.info, "leValueConv")
   
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index 19f37f405..e68ea007e 100755
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -822,9 +822,15 @@ proc processMagicType(c: PContext, m: PSym) =
   of mInt16: setMagicType(m, tyInt16, 2)
   of mInt32: setMagicType(m, tyInt32, 4)
   of mInt64: setMagicType(m, tyInt64, 8)
+  of mUInt: setMagicType(m, tyUInt, intSize)
+  of mUInt8: setMagicType(m, tyUInt8, 1)
+  of mUInt16: setMagicType(m, tyUInt16, 2)
+  of mUInt32: setMagicType(m, tyUInt32, 4)
+  of mUInt64: setMagicType(m, tyUInt64, 8)
   of mFloat: setMagicType(m, tyFloat, floatSize)
   of mFloat32: setMagicType(m, tyFloat32, 4)
   of mFloat64: setMagicType(m, tyFloat64, 8)
+  of mFloat128: setMagicType(m, tyFloat128, 16)
   of mBool: setMagicType(m, tyBool, 1)
   of mChar: setMagicType(m, tyChar, 1)
   of mString: 
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index 9881e84a3..168936ed4 100755
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -163,6 +163,9 @@ proc handleRange(f, a: PType, min, max: TTypeKind): TTypeRelation =
     var k = skipTypes(a, {tyRange}).kind
     if k == f.kind: result = isSubtype
     elif f.kind == tyInt and k in {tyInt..tyInt32}: result = isIntConv
+    elif f.kind == tyUInt and k in {tyUInt..tyUInt32}: result = isIntConv
+    elif f.kind in {tyUInt..tyUInt64} and k == tyInt and tfLiteral in a.flags:
+      result = isIntConv
     elif k >= min and k <= max: result = isConvertible
     else: result = isNone
   
@@ -306,6 +309,11 @@ proc typeRel(mapping: var TIdTable, f, a: PType): TTypeRelation =
   of tyInt16:    result = handleRange(f, a, tyInt8, tyInt16)
   of tyInt32:    result = handleRange(f, a, tyInt, tyInt32)
   of tyInt64:    result = handleRange(f, a, tyInt, tyInt64)
+  of tyUInt:      result = handleRange(f, a, tyUInt8, tyUInt32)
+  of tyUInt8:     result = handleRange(f, a, tyUInt8, tyUInt8)
+  of tyUInt16:    result = handleRange(f, a, tyUInt8, tyUInt16)
+  of tyUInt32:    result = handleRange(f, a, tyUInt, tyUInt32)
+  of tyUInt64:    result = handleRange(f, a, tyUInt, tyUInt64)
   of tyFloat:    result = handleFloatRange(f, a)
   of tyFloat32:  result = handleFloatRange(f, a)
   of tyFloat64:  result = handleFloatRange(f, a)
diff --git a/compiler/types.nim b/compiler/types.nim
index ecc250a5a..fb0e9a123 100755
--- a/compiler/types.nim
+++ b/compiler/types.nim
@@ -141,7 +141,7 @@ proc skipTypes(t: PType, kinds: TTypeKinds): PType =
   
 proc isOrdinalType(t: PType): bool = 
   assert(t != nil)
-  result = (t.Kind in {tyChar, tyInt..tyInt64, tyBool, tyEnum}) or
+  result = (t.Kind in {tyChar, tyInt..tyInt64, tyUInt..tyUInt64, tyBool, tyEnum}) or
       (t.Kind in {tyRange, tyOrdinal, tyConst, tyMutable, tyGenericInst}) and
        isOrdinalType(t.sons[0])
 
@@ -386,10 +386,11 @@ proc TypeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
       "GenericInvokation", "GenericBody", "GenericInst", "GenericParam", 
       "distinct $1", "enum", "ordinal[$1]", "array[$1, $2]", "object", "tuple", 
       "set[$1]", "range[$1]", "ptr ", "ref ", "var ", "seq[$1]", "proc", 
-      "pointer", "OpenArray[$1]", "string", "CString", "Forward", "int", "int8", 
-      "int16", "int32", "int64", "float", "float32", "float64", "float128",
-      
-      "uint", "uint8", "uint16", "uint32", "uint64", "bignum", "const ",
+      "pointer", "OpenArray[$1]", "string", "CString", "Forward",
+      "int", "int8", "int16", "int32", "int64",
+      "float", "float32", "float64", "float128",
+      "uint", "uint8", "uint16", "uint32", "uint64",
+      "bignum", "const ",
       "!", "varargs[$1]", "iter[$1]", "proxy[$1]", "TypeClass" ]
   var t = typ
   result = ""
@@ -494,6 +495,7 @@ proc firstOrd(t: PType): biggestInt =
   of tyInt16: result = - 32768
   of tyInt32: result = - 2147483646 - 2
   of tyInt64: result = 0x8000000000000000'i64
+  of tyUInt..tyUInt64: result = 0
   of tyEnum: 
     # if basetype <> nil then return firstOrd of basetype
     if (sonsLen(t) > 0) and (t.sons[0] != nil): 
@@ -524,6 +526,13 @@ proc lastOrd(t: PType): biggestInt =
   of tyInt16: result = 0x00007FFF
   of tyInt32: result = 0x7FFFFFFF
   of tyInt64: result = 0x7FFFFFFFFFFFFFFF'i64
+  of tyUInt: 
+    if platform.intSize == 4: result = 0xFFFFFFFF
+    else: result = 0x7FFFFFFFFFFFFFFF'i64
+  of tyUInt8: result = 0x7F # XXX: Fix these
+  of tyUInt16: result = 0x7FFF
+  of tyUInt32: result = 0x7FFFFFFF
+  of tyUInt64: result = 0x7FFFFFFFFFFFFFFF'i64
   of tyEnum: 
     assert(t.n.sons[sonsLen(t.n) - 1].kind == nkSym)
     result = t.n.sons[sonsLen(t.n) - 1].sym.position
@@ -980,6 +989,9 @@ proc computeSizeAux(typ: PType, a: var biggestInt): biggestInt =
   of tyInt64, tyUInt64, tyFloat64: 
     result = 8
     a = result
+  of tyFloat128:
+    result = 16
+    a = result
   of tyFloat: 
     result = floatSize
     a = result