[Bug target/54089] [SH] Refactor shift patterns
olegendo at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Aug 9 21:55:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54089
Oleg Endo <olegendo at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |kkojima at gcc dot gnu.org
--- Comment #4 from Oleg Endo <olegendo at gcc dot gnu.org> 2012-08-09 21:54:42 UTC ---
I'm currently playing around with the macro SHIFT_COUNT_TRUNCATED (sh.h) and
the target hook TARGET_SHIFT_TRUNCATION_MASK (which is not implemented yet).
Doing the following on rev 190259 (which is actually wrong):
sh.h:
-#define SHIFT_COUNT_TRUNCATED (! TARGET_SH3 && ! TARGET_SH2A)
+#define SHIFT_COUNT_TRUNCATED (1)
sh.c:
+/* Implement the TARGET_SHIFT_TRUNCATION_MASK target hook. */
+
+#undef TARGET_SHIFT_TRUNCATION_MASK
+#define TARGET_SHIFT_TRUNCATION_MASK sh_shift_truncation_mask
+
+static unsigned HOST_WIDE_INT
+sh_shift_truncation_mask (enum machine_mode mode)
+{
+ int bitsize = GET_MODE_BIT_SIZE (mode);
+
+ if (TARGET_SHMEDIA)
+ return bitsize - 1;
+
+ return MAX (32, bitsize) - 1;
+}
... and looking at some CSiBE size results, I see the a couple of weird cases
similar to what happens to the set_bh_page function in
linux-2.4.23-pre3-testplatform/fs/buffer.c.
Without the changes:
...
.L592:
mov.l .L598,r1 !!
mov r9,r3
mov.l @r1,r2 !! r2 = zone_table[0]
add #124,r2
mov.l @(36,r2),r1
mov.l @(32,r2),r2
add r10,r1
mov.l r9,@(56,r8)
sub r2,r3
mov r3,r2
mov.l .L599,r3
shar r2
shar r2
mul.l r3,r2
mov #12,r3
sts macl,r2
shld r3,r2
add r2,r1
mov.l r1,@(52,r8)
With the changes:
...
.L592:
mov.l @(24,r8),r0 !!
mov r8,r3
mov.l .L598,r1
shlr16 r0 !!
shlr8 r0 !!
shll2 r0 !!
mov.l @(r0,r1),r2 !! r2 = zone_table[page->flags >> ZONE_SHIFT]
add #124,r2
mov.l @(36,r2),r1
mov.l @(32,r2),r2
add r10,r1
mov.l r8,@(56,r9)
sub r2,r3
mov r3,r2
mov.l .L599,r3
shar r2
shar r2
mul.l r3,r2
mov #12,r3
sts macl,r2
shld r3,r2
add r2,r1
mov.l r1,@(52,r9)
It seems that without the (wrong) patch, the index in the inline function
'page_zone' is reduced from 'page->flags >> ZONE_SHIFT' to '0', and thus the
resulting code is wrong?!
I've tried to reproduce this in an isolated test case but couldn't get it to do
the same - the generated code seems always correct, with and without the
changes.
I'm confused... Kaz, do you have any idea what could be going on there?
More information about the Gcc-bugs
mailing list