From 0c7a6c76a990ce243308d8c16094c92b802a1ab3 Mon Sep 17 00:00:00 2001
From: Tim McCormack <cortex@brainonfire.net>
Date: Mon, 16 Jan 2012 18:57:06 -0500
Subject: [PATCH] CLJ-827: Add bit-shift-right-logical

---
 src/clj/clojure/core.clj             |    6 ++++++
 src/jvm/clojure/lang/Intrinsics.java |    2 ++
 src/jvm/clojure/lang/Numbers.java    |   17 +++++++++++++++++
 3 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 47fd767..42591b5 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -1301,6 +1301,12 @@
    :added "1.0"}
   [x n] (. clojure.lang.Numbers shiftRight x n))
 
+(defn bit-shift-right-logical
+  "Bitwise shift right, without sign-extension."
+  {:inline (fn [x n] `(. clojure.lang.Numbers (shiftRightLogical ~x ~n)))
+   :added "1.4"}
+  [x n] (. clojure.lang.Numbers shiftRightLogical x n))
+
 (defn integer?
   "Returns true if n is an integer"
   {:added "1.0"
diff --git a/src/jvm/clojure/lang/Intrinsics.java b/src/jvm/clojure/lang/Intrinsics.java
index 88d3b2d..df2e2f3 100644
--- a/src/jvm/clojure/lang/Intrinsics.java
+++ b/src/jvm/clojure/lang/Intrinsics.java
@@ -29,6 +29,7 @@ static IPersistentMap ops = RT.map(
  "public static long clojure.lang.Numbers.remainder(long,long)", LREM,
  "public static long clojure.lang.Numbers.shiftLeft(long,long)", oa(L2I, LSHL),
  "public static long clojure.lang.Numbers.shiftRight(long,long)", oa(L2I, LSHR),
+ "public static long clojure.lang.Numbers.shiftRightLogical(long,long)", oa(L2I, LUSHR),
  "public static double clojure.lang.Numbers.minus(double)", DNEG,
  "public static double clojure.lang.Numbers.minus(double,double)", DSUB,
  "public static double clojure.lang.Numbers.inc(double)", oa(DCONST_1, DADD),
@@ -36,6 +37,7 @@ static IPersistentMap ops = RT.map(
  "public static long clojure.lang.Numbers.quotient(long,long)", LDIV,
  "public static int clojure.lang.Numbers.shiftLeftInt(int,int)", ISHL,
  "public static int clojure.lang.Numbers.shiftRightInt(int,int)", ISHR,
+ "public static int clojure.lang.Numbers.shiftRightLogicalInt(int,int)", IUSHR,
  "public static int clojure.lang.Numbers.unchecked_int_add(int,int)", IADD,
  "public static int clojure.lang.Numbers.unchecked_int_subtract(int,int)", ISUB,
  "public static int clojure.lang.Numbers.unchecked_int_negate(int)", INEG,
diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java
index a50f287..aaf7195 100644
--- a/src/jvm/clojure/lang/Numbers.java
+++ b/src/jvm/clojure/lang/Numbers.java
@@ -389,6 +389,23 @@ static public long shiftRight(long x, long n){
 	return x >> n;
 }
 
+static public int shiftRightLogicalInt(int x, int n){
+	return x >>> n;
+}
+
+static public long shiftRightLogical(Object x, Object y){
+    return shiftRightLogical(bitOpsCast(x),bitOpsCast(y));
+}
+static public long shiftRightLogical(Object x, long y){
+    return shiftRightLogical(bitOpsCast(x),y);
+}
+static public long shiftRightLogical(long x, Object y){
+    return shiftRightLogical(x,bitOpsCast(y));
+}
+static public long shiftRightLogical(long x, long n){
+	return x >>> n;
+}
+
 final static class LongOps implements Ops{
 	public Ops combine(Ops y){
 		return y.opsWith(this);
-- 
1.7.4.1

