diff --git a/src/sort/genzfunc.go b/src/sort/genzfunc.go
index 6d2b471b62e4ea38114ad849c133d3c0b9039885..3bb7691f6a87f1dcace0167a08a099cc355410c5 100644
--- a/src/sort/genzfunc.go
+++ b/src/sort/genzfunc.go
@@ -115,6 +115,10 @@ func rewriteCall(ce *ast.CallExpr) {
 		// e.g. skip SelectorExpr (data.Less(..) calls)
 		return
 	}
+	// skip casts
+	if ident.Name == "int" || ident.Name == "uint" {
+		return
+	}
 	if len(ce.Args) < 1 {
 		return
 	}
diff --git a/src/sort/sort.go b/src/sort/sort.go
index 72d24efceab4df096442e51ee24032fdf946ba74..54f92a42176848fc4bc4689d871939a7302f687b 100644
--- a/src/sort/sort.go
+++ b/src/sort/sort.go
@@ -96,7 +96,7 @@ func swapRange(data Interface, a, b, n int) {
 }
 
 func doPivot(data Interface, lo, hi int) (midlo, midhi int) {
-	m := lo + (hi-lo)/2 // Written like this to avoid integer overflow.
+	m := int(uint(lo+hi) >> 1) // Written like this to avoid integer overflow.
 	if hi-lo > 40 {
 		// Tukey's ``Ninther,'' median of three medians of three.
 		s := (hi - lo) / 8
@@ -447,7 +447,7 @@ func symMerge(data Interface, a, m, b int) {
 		i := m
 		j := b
 		for i < j {
-			h := i + (j-i)/2
+			h := int(uint(i+j) >> 1)
 			if data.Less(h, a) {
 				i = h + 1
 			} else {
@@ -471,7 +471,7 @@ func symMerge(data Interface, a, m, b int) {
 		i := a
 		j := m
 		for i < j {
-			h := i + (j-i)/2
+			h := int(uint(i+j) >> 1)
 			if !data.Less(m, h) {
 				i = h + 1
 			} else {
@@ -485,7 +485,7 @@ func symMerge(data Interface, a, m, b int) {
 		return
 	}
 
-	mid := a + (b-a)/2
+	mid := int(uint(a+b) >> 1)
 	n := mid + m
 	var start, r int
 	if m > mid {
@@ -498,7 +498,7 @@ func symMerge(data Interface, a, m, b int) {
 	p := n - 1
 
 	for start < r {
-		c := start + (r-start)/2
+		c := int(uint(start+r) >> 1)
 		if !data.Less(p-c, c) {
 			start = c + 1
 		} else {
diff --git a/src/sort/zfuncversion.go b/src/sort/zfuncversion.go
index 7abb18a24d5e62cbd02d695cd1990567d8a3b025..99c95a22c1ff792249e265920947f5dd1bec7ea4 100644
--- a/src/sort/zfuncversion.go
+++ b/src/sort/zfuncversion.go
@@ -70,7 +70,7 @@ func swapRange_func(data lessSwap, a, b, n int) {
 
 // Auto-generated variant of sort.go:doPivot
 func doPivot_func(data lessSwap, lo, hi int) (midlo, midhi int) {
-	m := lo + (hi-lo)/2
+	m := int(uint(lo+hi) >> 1)
 	if hi-lo > 40 {
 		s := (hi - lo) / 8
 		medianOfThree_func(data, lo, lo+s, lo+2*s)
@@ -189,7 +189,7 @@ func symMerge_func(data lessSwap, a, m, b int) {
 		i := m
 		j := b
 		for i < j {
-			h := i + (j-i)/2
+			h := int(uint(i+j) >> 1)
 			if data.Less(h, a) {
 				i = h + 1
 			} else {
@@ -205,7 +205,7 @@ func symMerge_func(data lessSwap, a, m, b int) {
 		i := a
 		j := m
 		for i < j {
-			h := i + (j-i)/2
+			h := int(uint(i+j) >> 1)
 			if !data.Less(m, h) {
 				i = h + 1
 			} else {
@@ -217,7 +217,7 @@ func symMerge_func(data lessSwap, a, m, b int) {
 		}
 		return
 	}
-	mid := a + (b-a)/2
+	mid := int(uint(a+b) >> 1)
 	n := mid + m
 	var start, r int
 	if m > mid {
@@ -229,7 +229,7 @@ func symMerge_func(data lessSwap, a, m, b int) {
 	}
 	p := n - 1
 	for start < r {
-		c := start + (r-start)/2
+		c := int(uint(start+r) >> 1)
 		if !data.Less(p-c, c) {
 			start = c + 1
 		} else {