about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2011-11-13 21:34:58 -0800
committerNiko Matsakis <niko@alum.mit.edu>2011-11-16 15:16:42 -0800
commit96cdfa11dbc4d3c02fa2ecb2674aaa15ab099674 (patch)
tree1a9d1faf2ad4f102a9541216dc92505c81b2a8be /src/comp
parent5cabfb3a395995083468b29d8cc061cd1d9ef6bf (diff)
downloadrust-96cdfa11dbc4d3c02fa2ecb2674aaa15ab099674.tar.gz
rust-96cdfa11dbc4d3c02fa2ecb2674aaa15ab099674.zip
correct translation of neg. numbers in 64-bit architectures
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs4
-rw-r--r--src/comp/middle/trans_common.rs24
2 files changed, 11 insertions, 17 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 78652b9cb5e..60225b35a52 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2142,7 +2142,7 @@ fn trans_crate_lit(cx: @crate_ctxt, lit: ast::lit) -> ValueRef {
           ast::ty_i32. { t = T_i32(); }
           ast::ty_i64. { t = T_i64(); }
         }
-        ret C_integral(t, i as uint, s);
+        ret C_integral(t, i as u64, s);
       }
       ast::lit_float(fs) { ret C_float(cx, fs); }
       ast::lit_mach_float(tm, s) {
@@ -2150,7 +2150,7 @@ fn trans_crate_lit(cx: @crate_ctxt, lit: ast::lit) -> ValueRef {
         alt tm { ast::ty_f32. { t = T_f32(); } ast::ty_f64. { t = T_f64(); } }
         ret C_floating(s, t);
       }
-      ast::lit_char(c) { ret C_integral(T_char(), c as uint, False); }
+      ast::lit_char(c) { ret C_integral(T_char(), c as u64, False); }
       ast::lit_bool(b) { ret C_bool(b); }
       ast::lit_nil. { ret C_nil(); }
       ast::lit_str(s) {
diff --git a/src/comp/middle/trans_common.rs b/src/comp/middle/trans_common.rs
index f89d1dd930d..276a7460f8c 100644
--- a/src/comp/middle/trans_common.rs
+++ b/src/comp/middle/trans_common.rs
@@ -724,14 +724,8 @@ fn T_opaque_chan_ptr() -> TypeRef { ret T_ptr(T_i8()); }
 // LLVM constant constructors.
 fn C_null(t: TypeRef) -> ValueRef { ret llvm::LLVMConstNull(t); }
 
-fn C_integral(t: TypeRef, u: uint, sign_extend: Bool) -> ValueRef {
-    // FIXME: We can't use LLVM::ULongLong with our existing minimal native
-    // API, which only knows word-sized args.
-    //
-    // ret llvm::LLVMConstInt(.int_type, t as LLVM::ULongLong, False);
-    //
-
-    ret llvm::LLVMRustConstSmallInt(t, u, sign_extend);
+fn C_integral(t: TypeRef, u: u64, sign_extend: Bool) -> ValueRef {
+    ret llvm::LLVMConstInt(t, u, sign_extend);
 }
 
 fn C_float(cx: @crate_ctxt, s: str) -> ValueRef {
@@ -747,28 +741,28 @@ fn C_floating(s: str, t: TypeRef) -> ValueRef {
 fn C_nil() -> ValueRef {
     // NB: See comment above in T_void().
 
-    ret C_integral(T_i1(), 0u, False);
+    ret C_integral(T_i1(), 0u64, False);
 }
 
 fn C_bool(b: bool) -> ValueRef {
     if b {
-        ret C_integral(T_bool(), 1u, False);
-    } else { ret C_integral(T_bool(), 0u, False); }
+        ret C_integral(T_bool(), 1u64, False);
+    } else { ret C_integral(T_bool(), 0u64, False); }
 }
 
 fn C_i32(i: i32) -> ValueRef {
-    ret C_integral(T_i32(), i as uint, True);
+    ret C_integral(T_i32(), i as u64, True);
 }
 
 fn C_int(cx: @crate_ctxt, i: int) -> ValueRef {
-    ret C_integral(cx.int_type, i as uint, True);
+    ret C_integral(cx.int_type, i as u64, True);
 }
 
 fn C_uint(cx: @crate_ctxt, i: uint) -> ValueRef {
-    ret C_integral(cx.int_type, i, False);
+    ret C_integral(cx.int_type, i as u64, False);
 }
 
-fn C_u8(i: uint) -> ValueRef { ret C_integral(T_i8(), i, False); }
+fn C_u8(i: uint) -> ValueRef { ret C_integral(T_i8(), i as u64, False); }
 
 
 // This is a 'c-like' raw string, which differs from