* gas/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.
	* gas/testsuite/gas/arm/arm.exp: Run iwmmxt-bad2.
	* gas/testsuite/gas/arm/iwmmxt.s: Increase offsets for wstrb and
	wstrh.
	* gas/testsuite/gas/arm/iwmmxt.d: Update expected results.
	* gas/testsuite/gas/arm/iwmmxt-bad2.s: Test wstrb, wstrh, wldrb
	and wldrh.
	* gas/testsuite/gas/arm/iwmmxt-bad2.l: Update expected error
	messages.
diff --git a/ChangeLog.csl b/ChangeLog.csl
index 873367d..55c3d63 100644
--- a/ChangeLog.csl
+++ b/ChangeLog.csl
@@ -1,3 +1,18 @@
+2006-04-28  Joseph Myers  <joseph@codesourcery.com>
+
+	* gas/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.
+	* gas/testsuite/gas/arm/arm.exp: Run iwmmxt-bad2.
+	* gas/testsuite/gas/arm/iwmmxt.s: Increase offsets for wstrb and
+	wstrh.
+	* gas/testsuite/gas/arm/iwmmxt.d: Update expected results.
+	* gas/testsuite/gas/arm/iwmmxt-bad2.s: Test wstrb, wstrh, wldrb
+	and wldrh.
+	* gas/testsuite/gas/arm/iwmmxt-bad2.l: Update expected error
+	messages.
+
 2006-01-16  Joseph Myers  <joseph@codesourcery.com>
 
 	Backport:
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 1d02805..10d7d91 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -5446,7 +5446,6 @@
 do_iwmmxt_wldstbh (void)
 {
   inst.instruction |= inst.operands[0].reg << 12;
-  inst.reloc.exp.X_add_number *= 4;
   encode_arm_cp_address (1, TRUE, FALSE, BFD_RELOC_ARM_CP_OFF_IMM_S2);
 }
 
@@ -10886,6 +10885,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:
diff --git a/gas/testsuite/gas/arm/arm.exp b/gas/testsuite/gas/arm/arm.exp
index 5fb82ad..9faab60 100644
--- a/gas/testsuite/gas/arm/arm.exp
+++ b/gas/testsuite/gas/arm/arm.exp
@@ -64,6 +64,7 @@
     run_errors_test "archv6t2-bad" "-march=armv6t2" "Invalid V6T2 instructions"
     run_errors_test "t16-bad" "-march=armv6k" "Valid ARM, invalid Thumb"
     run_errors_test "iwmmxt-bad" "-mcpu=iwmmxt" "iWMMXt errors"
+    run_errors_test "iwmmxt-bad2" "-mcpu=iwmmxt" "iWMMXt errors"
 
     if {[istarget *-*-*coff] || [istarget *-*-pe] || [istarget *-*-wince] ||
         [istarget *-*-*aout*] || [istarget *-*-netbsd] || [istarget *-*-riscix*]} then {
diff --git a/gas/testsuite/gas/arm/iwmmxt-bad2.l b/gas/testsuite/gas/arm/iwmmxt-bad2.l
index 3305bdf..1a43ebc 100644
--- a/gas/testsuite/gas/arm/iwmmxt-bad2.l
+++ b/gas/testsuite/gas/arm/iwmmxt-bad2.l
@@ -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
diff --git a/gas/testsuite/gas/arm/iwmmxt-bad2.s b/gas/testsuite/gas/arm/iwmmxt-bad2.s
index 1132e10..dc559a8 100644
--- a/gas/testsuite/gas/arm/iwmmxt-bad2.s
+++ b/gas/testsuite/gas/arm/iwmmxt-bad2.s
@@ -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]
diff --git a/gas/testsuite/gas/arm/iwmmxt.d b/gas/testsuite/gas/arm/iwmmxt.d
index 8565f52..494199d 100644
--- a/gas/testsuite/gas/arm/iwmmxt.d
+++ b/gas/testsuite/gas/arm/iwmmxt.d
@@ -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
diff --git a/gas/testsuite/gas/arm/iwmmxt.s b/gas/testsuite/gas/arm/iwmmxt.s
index ba599c1..0ebbad5 100644
--- a/gas/testsuite/gas/arm/iwmmxt.s
+++ b/gas/testsuite/gas/arm/iwmmxt.s
@@ -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