Files
linux/include/linux
Sasha Levin d7e35dfa25 bitops.h: correctly handle rol32 with 0 byte shift
ROL on a 32 bit integer with a shift of 32 or more is undefined and the
result is arch-dependent. Avoid this by handling the trivial case of
roling by 0 correctly.

The trivial solution of checking if shift is 0 breaks gcc's detection
of this code as a ROL instruction, which is unacceptable.

This bug was reported and fixed in GCC
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57157):

	The standard rotate idiom,

	  (x << n) | (x >> (32 - n))

	is recognized by gcc (for concreteness, I discuss only the case that x
	is an uint32_t here).

	However, this is portable C only for n in the range 0 < n < 32. For n
	== 0, we get x >> 32 which gives undefined behaviour according to the
	C standard (6.5.7, Bitwise shift operators). To portably support n ==
	0, one has to write the rotate as something like

	  (x << n) | (x >> ((-n) & 31))

	And this is apparently not recognized by gcc.

Note that this is broken on older GCCs and will result in slower ROL.

Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2015-12-09 10:35:16 -08:00
..
2015-10-01 12:48:11 -07:00
2015-06-25 11:49:31 +03:00
2015-10-17 21:22:08 -07:00
2015-10-07 18:08:15 +01:00
2015-08-27 20:47:09 +01:00
2015-10-27 19:34:54 -07:00
2015-05-13 12:04:55 -05:00
2015-08-03 12:01:54 -04:00
2015-11-07 10:40:47 -07:00
2015-10-07 16:02:49 -07:00
2015-09-04 16:54:41 -07:00
2015-09-08 15:35:28 -07:00
2015-10-18 10:14:39 -07:00
2015-10-31 19:05:59 -04:00
2015-10-30 01:47:27 -04:00
2015-06-24 17:49:45 -07:00
2015-05-12 10:46:53 +02:00
2015-06-19 15:18:28 +02:00
2015-09-08 15:35:28 -07:00
2015-05-05 13:40:42 -06:00
2015-10-23 05:44:28 -07:00
2015-08-27 19:40:58 -04:00
2015-10-01 15:06:43 +02:00
2015-10-13 19:01:25 +02:00
2015-06-25 12:06:45 +02:00
2015-11-09 15:11:24 -08:00
2015-08-18 15:49:15 -07:00
2015-07-28 08:50:42 +01:00
2015-04-29 17:17:17 -05:00
2015-11-23 09:44:58 +01:00
2015-04-14 16:49:05 -07:00
2015-10-27 18:55:31 -07:00
2015-06-24 17:49:41 -07:00
2015-11-06 17:50:42 -08:00
2015-10-20 22:10:45 +08:00
2015-07-21 10:39:05 -07:00
2015-06-25 04:20:04 -04:00
2015-08-17 13:32:56 -05:00
2015-09-10 13:29:01 -07:00
2015-09-10 13:29:01 -07:00
2015-11-06 17:50:42 -08:00
2015-04-12 21:03:31 +02:00
2015-10-09 17:00:32 -04:00
2015-10-06 17:08:19 +02:00
2015-10-22 08:59:18 -07:00
2015-05-26 15:23:23 +02:00
2015-06-25 01:13:43 +02:00
2015-04-11 15:53:35 -04:00
2015-09-10 15:36:59 -04:00
2015-06-25 17:00:39 -07:00
2015-11-05 14:36:09 -05:00
2015-08-17 11:25:28 -07:00
2015-10-01 09:57:59 -07:00
2015-10-19 01:01:21 +02:00
2015-11-20 16:19:54 -08:00
2015-04-11 22:29:44 -04:00
2015-11-23 09:44:58 +01:00
2015-11-04 09:56:16 -07:00
2015-11-13 20:34:33 -05:00
2015-09-08 15:35:28 -07:00