changeset 17521:b0c0aa299763 draft

(svn r22284) -Codechange [FS#4564]: cast values to uint before computing modulus in direction_func.h, so compiler can generate superior code (adf88)
author smatz <smatz@openttd.org>
date Fri, 01 Apr 2011 12:17:23 +0000
parents bf14404ac816
children 19ce3a176e65
files src/direction_func.h
diffstat 1 files changed, 9 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/direction_func.h
+++ b/src/direction_func.h
@@ -35,7 +35,9 @@
  */
 static inline DirDiff DirDifference(Direction d0, Direction d1)
 {
-	return (DirDiff)((d0 + 8 - d1) % 8);
+	/* Cast to uint so compiler can use bitmask. If the difference is negative
+	 * and we used int instead of uint, further "+ 8" would have to be added. */
+	return (DirDiff)((uint)(d0 - d1) % 8);
 }
 
 /**
@@ -51,7 +53,8 @@
  */
 static inline DirDiff ChangeDirDiff(DirDiff d, DirDiff delta)
 {
-	return (DirDiff)((d + delta) % 8);
+	/* Cast to uint so compiler can use bitmask. Result can never be negative. */
+	return (DirDiff)((uint)(d + delta) % 8);
 }
 
 /**
@@ -66,7 +69,8 @@
  */
 static inline Direction ChangeDir(Direction d, DirDiff delta)
 {
-	return (Direction)((d + delta) % 8);
+	/* Cast to uint so compiler can use bitmask. Result can never be negative. */
+	return (Direction)((uint)(d + delta) % 8);
 }
 
 
@@ -94,7 +98,8 @@
  */
 static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta)
 {
-	return (DiagDirection)((d + delta) % 4);
+	/* Cast to uint so compiler can use bitmask. Result can never be negative. */
+	return (DiagDirection)((uint)(d + delta) % 4);
 }
 
 /**