This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
iWMMXt offsets bug fix
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: binutils at sourceware dot org
- Date: Fri, 28 Apr 2006 19:39:44 +0000 (UTC)
- Subject: iWMMXt offsets bug fix
The ARM assembler fails to accept the full offset range for some iWMMXt
instructions (wstrb, wstrh, wldrb, wldrh) because it multiplies the offset
by 4 before checking against the correct range for the original offset.
This patch fixes the problem by moving the multiplication to after the
check.
OK to commit to mainline? CSL branch? 2.17 release branch? (Tested all
three places.)
2006-04-28 Joseph Myers <joseph@codesourcery.com>
* config/tc-arm.c (do_iwmmxt_wldstbh): Don't multiply offset by 4
here.
(md_apply_fix3): Multiply offset by 4 here for
BFD_RELOC_ARM_CP_OFF_IMM_S2 and BFD_RELOC_ARM_T32_CP_OFF_IMM_S2.
2006-04-28 Joseph Myers <joseph@codesourcery.com>
* gas/arm/iwmmxt.s: Increase offsets for wstrb and wstrh.
* gas/arm/iwmmxt.d: Update expected results.
* gas/arm/iwmmxt-bad2.s: Test wstrb, wstrh, wldrb and wldrh.
* gas/arm/iwmmxt-bad2.l: Update expected error messages.
Index: config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.261
diff -u -r1.261 tc-arm.c
--- config/tc-arm.c 26 Apr 2006 16:03:02 -0000 1.261
+++ config/tc-arm.c 28 Apr 2006 19:18:52 -0000
@@ -7187,7 +7187,6 @@
{
int reloc;
inst.instruction |= inst.operands[0].reg << 12;
- inst.reloc.exp.X_add_number *= 4;
if (thumb_mode)
reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
else
@@ -16477,6 +16476,7 @@
if (value < -255 || value > 255)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("co-processor offset out of range"));
+ value *= 4;
goto cp_off_common;
case BFD_RELOC_ARM_THUMB_OFFSET:
Index: testsuite/gas/arm/iwmmxt-bad2.l
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/iwmmxt-bad2.l,v
retrieving revision 1.1
diff -u -r1.1 iwmmxt-bad2.l
--- testsuite/gas/arm/iwmmxt-bad2.l 3 Aug 2005 09:50:43 -0000 1.1
+++ testsuite/gas/arm/iwmmxt-bad2.l 28 Apr 2006 19:18:52 -0000
@@ -1,3 +1,7 @@
[^:]*: Assembler messages:
[^:]*:1: Error: co-processor offset out of range
[^:]*:2: Error: co-processor offset out of range
+[^:]*:3: Error: co-processor offset out of range
+[^:]*:4: Error: co-processor offset out of range
+[^:]*:5: Error: co-processor offset out of range
+[^:]*:6: Error: co-processor offset out of range
Index: testsuite/gas/arm/iwmmxt-bad2.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/iwmmxt-bad2.s,v
retrieving revision 1.1
diff -u -r1.1 iwmmxt-bad2.s
--- testsuite/gas/arm/iwmmxt-bad2.s 3 Aug 2005 09:50:43 -0000 1.1
+++ testsuite/gas/arm/iwmmxt-bad2.s 28 Apr 2006 19:18:52 -0000
@@ -1,2 +1,6 @@
wldrd wr1, [r0, #3]
wstrd wr1, [r0, #0x400]
+ wstrb wr1, [r0, #0x100]
+ wstrh wr1, [r0, #0x100]
+ wldrb wr1, [r0, #-0x100]
+ wldrh wr1, [r0, #-0x100]
Index: testsuite/gas/arm/iwmmxt.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/iwmmxt.d,v
retrieving revision 1.5
diff -u -r1.5 iwmmxt.d
--- testsuite/gas/arm/iwmmxt.d 3 Aug 2005 09:50:43 -0000 1.5
+++ testsuite/gas/arm/iwmmxt.d 28 Apr 2006 19:18:52 -0000
@@ -135,8 +135,8 @@
0+1fc <[^>]*> ee65114b[ ]+wsrlhg[ ]+wr1, wr5, wcgr3
0+200 <[^>]*> 4ea51148[ ]+wsrlwgmi[ ]+wr1, wr5, wcgr0
0+204 <[^>]*> eee51149[ ]+wsrldg[ ]+wr1, wr5, wcgr1
-0+208 <[^>]*> ed811004[ ]+wstrb[ ]+wr1, \[r1, #4\]
-0+20c <[^>]*> ede11004[ ]+wstrh[ ]+wr1, \[r1, #4\]!
+0+208 <[^>]*> ed8110ff[ ]+wstrb[ ]+wr1, \[r1, #255\]
+0+20c <[^>]*> ed6110ff[ ]+wstrh[ ]+wr1, \[r1, #-255\]!
0+210 <[^>]*> eca11101[ ]+wstrw[ ]+wr1, \[r1\], #4
0+214 <[^>]*> edc111ff[ ]+wstrd[ ]+wr1, \[r1, #1020\]
0+218 <[^>]*> fca1314b[ ]+wstrw[ ]+wcasf, \[r1\], #300
Index: testsuite/gas/arm/iwmmxt.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/iwmmxt.s,v
retrieving revision 1.4
diff -u -r1.4 iwmmxt.s
--- testsuite/gas/arm/iwmmxt.s 3 Aug 2005 09:50:43 -0000 1.4
+++ testsuite/gas/arm/iwmmxt.s 28 Apr 2006 19:18:52 -0000
@@ -164,8 +164,8 @@
wsrlwgmi wr1, wr5, wcgr0
wsrldg wr1, wr5, wcgr1
- wstrb wr1, [r1, #4]
- wstrh wr1, [r1, #4]!
+ wstrb wr1, [r1, #0xFF]
+ wstrh wr1, [r1, #-0xFF]!
wstrw wr1, [r1], #4
wstrd wr1, [r1, #0x3FC]
wstrw wcasf, [r1], #300
--
Joseph S. Myers
joseph@codesourcery.com