[mips patch] fix annoyances w/ ror/rol/dror/drol implementation.
cgd@broadcom.com
cgd@broadcom.com
Wed Dec 18 14:02:00 GMT 2002
At Wed, 18 Dec 2002 20:13:46 +0000 (UTC), cgd@broadcom.com wrote:
> > There are several annoyances with the current MIPS assembler
> > implementation of ror, rol, dror, and drol:
> > [...]
>
> Actually, reading that patch over one last time, i notice one issue in
> the new code: immediate drol/dror counts > 64 still aren't being
> handled properly.
I was wrong, they're fine.
However, the fact that i was led to question the patch says that
there's not enough tests, so here's a new patch with some more. 8-)
chris
===================================================================
[ opcodes/ChangeLog ]
2002-12-18 Chris Demetriou <cgd@broadcom.com>
* mips-opc.c (mips_builtin_opcodes): Remove one "ror" and two
"dror" entries, and reorder the remaining "dror" and "ror" entries.
[ gas/ChangeLog ]
2002-12-18 Chris Demetriou <cgd@broadcom.com>
* config/tc-mips.c (macro): In M_DROL, M_DROR, M_ROL, and M_ROR,
use hardware rotate ops as appropriate. In M_DROL_I, M_DROR_I,
M_ROL_I, and M_ROR_I, simplify code, clean up warnings, and
arrange not to issue warnings about use of AT when AT is not
actually used.
[ gas/testsuite/ChangeLog ]
2002-12-18 Chris Demetriou <cgd@broadcom.com>
* gas/mips/rol.s: Add ".set noat" and some new instructions to test.
* gas/mips/rol64.s: Likewise.
* gas/mips/rol.l: New file.
* gas/mips/rol.d: Adjust to use rol.l and for rol.s changes.
* gas/mips/rol64.l: New file.
* gas/mips/rol64.d: Adjust to use rol64.l and for rol64.s changes.
* gas/mips/rol-hw.d: New file.
* gas/mips/rol-hw.l: New file.
* gas/mips/rol64-hw.d: New file.
* gas/mips/rol64-hw.l: New file.
* gas/mips/mips.exp: Run rol-hw and rol64-hw tests.
Index: opcodes/mips-opc.c
===================================================================
RCS file: /cvs/src/src/opcodes/mips-opc.c,v
retrieving revision 1.39
diff -u -p -r1.39 mips-opc.c
--- opcodes/mips-opc.c 30 Sep 2002 11:58:10 -0000 1.39
+++ opcodes/mips-opc.c 18 Dec 2002 21:47:47 -0000
@@ -550,13 +550,11 @@ const struct mips_opcode mips_builtin_op
{"dret", "", 0x7000003e, 0xffffffff, 0, N5 },
{"drol", "d,v,t", 0, (int) M_DROL, INSN_MACRO, I3 },
{"drol", "d,v,I", 0, (int) M_DROL_I, INSN_MACRO, I3 },
-{"drorv", "d,t,s", 0x00000056, 0xfc0007ff, RD_t|RD_s|WR_d, N5 },
-{"dror32", "d,w,<", 0x0020003e, 0xffe0003f, WR_d|RD_t, N5 },
-{"dror", "d,w,s", 0x00000056, 0xfc0007ff, RD_t|RD_s|WR_d, N5 }, /* drorv */
-{"dror", "d,w,>", 0x0020003e, 0xffe0003f, WR_d|RD_t, N5 },
-{"dror", "d,w,<", 0x0020003a, 0xffe0003f, WR_d|RD_t, N5 },
{"dror", "d,v,t", 0, (int) M_DROR, INSN_MACRO, I3 },
{"dror", "d,v,I", 0, (int) M_DROR_I, INSN_MACRO, I3 },
+{"dror", "d,w,<", 0x0020003a, 0xffe0003f, WR_d|RD_t, N5 },
+{"drorv", "d,t,s", 0x00000056, 0xfc0007ff, RD_t|RD_s|WR_d, N5 },
+{"dror32", "d,w,<", 0x0020003e, 0xffe0003f, WR_d|RD_t, N5 },
{"dsllv", "d,t,s", 0x00000014, 0xfc0007ff, WR_d|RD_t|RD_s, I3 },
{"dsll32", "d,w,<", 0x0000003c, 0xffe0003f, WR_d|RD_t, I3 },
{"dsll", "d,w,s", 0x00000014, 0xfc0007ff, WR_d|RD_t|RD_s, I3 }, /* dsllv */
@@ -901,11 +899,10 @@ const struct mips_opcode mips_builtin_op
{"rneu.qh", "X,Q", 0x78200022, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rol", "d,v,t", 0, (int) M_ROL, INSN_MACRO, I1 },
{"rol", "d,v,I", 0, (int) M_ROL_I, INSN_MACRO, I1 },
-{"rorv", "d,t,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, N5 },
-{"ror", "d,w,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, N5 }, /* rorv */
-{"ror", "d,w,<", 0x00200002, 0xffe0003f, WR_d|RD_t, N5 },
{"ror", "d,v,t", 0, (int) M_ROR, INSN_MACRO, I1 },
{"ror", "d,v,I", 0, (int) M_ROR_I, INSN_MACRO, I1 },
+{"ror", "d,w,<", 0x00200002, 0xffe0003f, WR_d|RD_t, N5 },
+{"rorv", "d,t,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, N5 },
{"round.l.d", "D,S", 0x46200008, 0xffff003f, WR_D|RD_S|FP_D, I3 },
{"round.l.s", "D,S", 0x46000008, 0xffff003f, WR_D|RD_S|FP_S, I3 },
{"round.w.d", "D,S", 0x4620000c, 0xffff003f, WR_D|RD_S|FP_D, I2 },
Index: gas/config/tc-mips.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-mips.c,v
retrieving revision 1.183
diff -u -p -r1.183 tc-mips.c
--- gas/config/tc-mips.c 17 Dec 2002 01:13:55 -0000 1.183
+++ gas/config/tc-mips.c 18 Dec 2002 21:47:49 -0000
@@ -6940,6 +6940,26 @@ macro2 (ip)
break;
case M_DROL:
+ if (CPU_HAS_DROR (mips_arch))
+ {
+ if (dreg == sreg)
+ {
+ tempreg = AT;
+ used_at = 1;
+ }
+ else
+ {
+ tempreg = dreg;
+ used_at = 0;
+ }
+ macro_build ((char *) NULL, &icnt, NULL, "dnegu",
+ "d,w", tempreg, treg);
+ macro_build ((char *) NULL, &icnt, NULL, "drorv",
+ "d,t,s", dreg, sreg, tempreg);
+ if (used_at)
+ break;
+ return;
+ }
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
"d,v,t", AT, 0, treg);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
@@ -6951,6 +6971,26 @@ macro2 (ip)
break;
case M_ROL:
+ if (CPU_HAS_ROR (mips_arch))
+ {
+ if (dreg == sreg)
+ {
+ tempreg = AT;
+ used_at = 1;
+ }
+ else
+ {
+ tempreg = dreg;
+ used_at = 0;
+ }
+ macro_build ((char *) NULL, &icnt, NULL, "negu",
+ "d,w", tempreg, treg);
+ macro_build ((char *) NULL, &icnt, NULL, "rorv",
+ "d,t,s", dreg, sreg, tempreg);
+ if (used_at)
+ break;
+ return;
+ }
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
"d,v,t", AT, 0, treg);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
@@ -6964,9 +7004,10 @@ macro2 (ip)
case M_DROL_I:
{
unsigned int rot;
+ char *l, *r;
if (imm_expr.X_op != O_constant)
- as_bad (_("rotate count too large"));
+ as_bad (_("Improper rotate count"));
rot = imm_expr.X_add_number & 0x3f;
if (CPU_HAS_DROR (mips_arch))
{
@@ -6977,25 +7018,23 @@ macro2 (ip)
else
macro_build ((char *) NULL, &icnt, NULL, "dror",
"d,w,<", dreg, sreg, rot);
- break;
+ return;
}
if (rot == 0)
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
- "d,w,<", dreg, sreg, 0);
- else
- {
- char *l, *r;
-
- l = (rot < 0x20) ? "dsll" : "dsll32";
- r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
- rot &= 0x1f;
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
- "d,w,<", AT, sreg, rot);
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
- "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
- "d,v,t", dreg, dreg, AT);
- }
+ {
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
+ "d,w,<", dreg, sreg, 0);
+ return;
+ }
+ l = (rot < 0x20) ? "dsll" : "dsll32";
+ r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
+ rot &= 0x1f;
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
+ "d,w,<", AT, sreg, rot);
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
+ "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
+ "d,v,t", dreg, dreg, AT);
}
break;
@@ -7004,30 +7043,36 @@ macro2 (ip)
unsigned int rot;
if (imm_expr.X_op != O_constant)
- as_bad (_("rotate count too large"));
+ as_bad (_("Improper rotate count"));
rot = imm_expr.X_add_number & 0x1f;
if (CPU_HAS_ROR (mips_arch))
{
macro_build ((char *) NULL, &icnt, NULL, "ror",
"d,w,<", dreg, sreg, (32 - rot) & 0x1f);
- break;
+ return;
}
if (rot == 0)
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
- "d,w,<", dreg, sreg, 0);
- else
{
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
- "d,w,<", AT, sreg, rot);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
- "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
- "d,v,t", dreg, dreg, AT);
+ "d,w,<", dreg, sreg, 0);
+ return;
}
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
+ "d,w,<", AT, sreg, rot);
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
+ "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
+ "d,v,t", dreg, dreg, AT);
}
break;
case M_DROR:
+ if (CPU_HAS_DROR (mips_arch))
+ {
+ macro_build ((char *) NULL, &icnt, NULL, "drorv",
+ "d,t,s", dreg, sreg, treg);
+ return;
+ }
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
"d,v,t", AT, 0, treg);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
@@ -7039,6 +7084,12 @@ macro2 (ip)
break;
case M_ROR:
+ if (CPU_HAS_ROR (mips_arch))
+ {
+ macro_build ((char *) NULL, &icnt, NULL, "rorv",
+ "d,t,s", dreg, sreg, treg);
+ return;
+ }
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
"d,v,t", AT, 0, treg);
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
@@ -7052,27 +7103,36 @@ macro2 (ip)
case M_DROR_I:
{
unsigned int rot;
+ char *l, *r;
if (imm_expr.X_op != O_constant)
- as_bad (_("rotate count too large"));
+ as_bad (_("Improper rotate count"));
rot = imm_expr.X_add_number & 0x3f;
- if (rot == 0)
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
- "d,w,<", dreg, sreg, 0);
- else
- {
- char *l, *r;
-
- r = (rot < 0x20) ? "dsrl" : "dsrl32";
- l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
- rot &= 0x1f;
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
- "d,w,<", AT, sreg, rot);
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
- "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
- "d,v,t", dreg, dreg, AT);
+ if (CPU_HAS_DROR (mips_arch))
+ {
+ if (rot >= 32)
+ macro_build ((char *) NULL, &icnt, NULL, "dror32",
+ "d,w,<", dreg, sreg, rot - 32);
+ else
+ macro_build ((char *) NULL, &icnt, NULL, "dror",
+ "d,w,<", dreg, sreg, rot);
+ return;
}
+ if (rot == 0)
+ {
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
+ "d,w,<", dreg, sreg, 0);
+ return;
+ }
+ r = (rot < 0x20) ? "dsrl" : "dsrl32";
+ l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
+ rot &= 0x1f;
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
+ "d,w,<", AT, sreg, rot);
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
+ "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
+ "d,v,t", dreg, dreg, AT);
}
break;
@@ -7081,20 +7141,26 @@ macro2 (ip)
unsigned int rot;
if (imm_expr.X_op != O_constant)
- as_bad (_("rotate count too large"));
+ as_bad (_("Improper rotate count"));
rot = imm_expr.X_add_number & 0x1f;
+ if (CPU_HAS_ROR (mips_arch))
+ {
+ macro_build ((char *) NULL, &icnt, NULL, "ror",
+ "d,w,<", dreg, sreg, rot);
+ return;
+ }
if (rot == 0)
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
- "d,w,<", dreg, sreg, 0);
- else
{
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
- "d,w,<", AT, sreg, rot);
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
- "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
- macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
- "d,v,t", dreg, dreg, AT);
+ "d,w,<", dreg, sreg, 0);
+ return;
}
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
+ "d,w,<", AT, sreg, rot);
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
+ "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
+ macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
+ "d,v,t", dreg, dreg, AT);
}
break;
Index: gas/testsuite/gas/mips/mips.exp
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/mips.exp,v
retrieving revision 1.51
diff -u -p -r1.51 mips.exp
--- gas/testsuite/gas/mips/mips.exp 12 Dec 2002 04:40:22 -0000 1.51
+++ gas/testsuite/gas/mips/mips.exp 18 Dec 2002 21:47:51 -0000
@@ -125,7 +125,9 @@ if { [istarget mips*-*-*] } then {
run_dump_test "mul"
}
run_dump_test "rol"
+ run_dump_test "rol-hw"
run_dump_test "rol64"
+ run_dump_test "rol64-hw"
if !$aout { run_dump_test "sb" }
run_dump_test "trunc"
if !$aout { run_dump_test "ulh" }
Index: gas/testsuite/gas/mips/rol-hw.d
===================================================================
RCS file: gas/testsuite/gas/mips/rol-hw.d
diff -N gas/testsuite/gas/mips/rol-hw.d
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/mips/rol-hw.d 18 Dec 2002 21:47:51 -0000
@@ -0,0 +1,30 @@
+#objdump: -dr --prefix-addresses -mmips:5400
+#as: -march=vr5400 -mtune=vr5400
+#name: MIPS hardware rol (vr5400)
+#source: rol.s
+#stderr: rol-hw.l
+
+# Test the rol and ror macros.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> negu at,a1
+0+0004 <[^>]*> rorv a0,a0,at
+0+0008 <[^>]*> negu a0,a2
+0+000c <[^>]*> rorv a0,a1,a0
+0+0010 <[^>]*> ror a0,a0,0x1f
+0+0014 <[^>]*> ror a0,a1,0x1f
+0+0018 <[^>]*> ror a0,a1,0x0
+0+001c <[^>]*> rorv a0,a0,a1
+0+0020 <[^>]*> rorv a0,a1,a2
+0+0024 <[^>]*> ror a0,a0,0x1
+0+0028 <[^>]*> ror a0,a1,0x1
+0+002c <[^>]*> ror a0,a1,0x0
+0+0030 <[^>]*> ror a0,a1,0x0
+0+0034 <[^>]*> ror a0,a1,0x1f
+0+0038 <[^>]*> ror a0,a1,0x1
+0+003c <[^>]*> ror a0,a1,0x0
+0+0040 <[^>]*> ror a0,a1,0x1
+0+0044 <[^>]*> ror a0,a1,0x1f
+ ...
Index: gas/testsuite/gas/mips/rol-hw.l
===================================================================
RCS file: gas/testsuite/gas/mips/rol-hw.l
diff -N gas/testsuite/gas/mips/rol-hw.l
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/mips/rol-hw.l 18 Dec 2002 21:47:51 -0000
@@ -0,0 +1,2 @@
+.*: Assembler messages:
+.*:7: Warning: Macro used \$at after "\.set noat"
Index: gas/testsuite/gas/mips/rol.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/rol.d,v
retrieving revision 1.4
diff -u -p -r1.4 rol.d
--- gas/testsuite/gas/mips/rol.d 20 Aug 2002 08:28:35 -0000 1.4
+++ gas/testsuite/gas/mips/rol.d 18 Dec 2002 21:47:51 -0000
@@ -1,6 +1,7 @@
#objdump: -dr --prefix-addresses -mmips:3000
#as: -march=r3000 -mtune=r3000
-#name: MIPS R3000 rol
+#name: MIPS macro rol (r3000)
+#stderr: rol.l
# Test the rol and ror macros.
@@ -37,4 +38,18 @@ Disassembly of section .text:
0+006c <[^>]*> sll a0,a1,0x1f
0+0070 <[^>]*> or a0,a0,at
0+0074 <[^>]*> srl a0,a1,0x0
+0+0078 <[^>]*> srl a0,a1,0x0
+0+007c <[^>]*> sll at,a1,0x1
+0+0080 <[^>]*> srl a0,a1,0x1f
+0+0084 <[^>]*> or a0,a0,at
+0+0088 <[^>]*> sll at,a1,0x1f
+0+008c <[^>]*> srl a0,a1,0x1
+0+0090 <[^>]*> or a0,a0,at
+0+0094 <[^>]*> srl a0,a1,0x0
+0+0098 <[^>]*> srl at,a1,0x1
+0+009c <[^>]*> sll a0,a1,0x1f
+0+00a0 <[^>]*> or a0,a0,at
+0+00a4 <[^>]*> srl at,a1,0x1f
+0+00a8 <[^>]*> sll a0,a1,0x1
+0+00ac <[^>]*> or a0,a0,at
...
Index: gas/testsuite/gas/mips/rol.l
===================================================================
RCS file: gas/testsuite/gas/mips/rol.l
diff -N gas/testsuite/gas/mips/rol.l
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/mips/rol.l 18 Dec 2002 21:47:51 -0000
@@ -0,0 +1,13 @@
+.*: Assembler messages:
+.*:7: Warning: Macro used \$at after "\.set noat"
+.*:8: Warning: Macro used \$at after "\.set noat"
+.*:9: Warning: Macro used \$at after "\.set noat"
+.*:10: Warning: Macro used \$at after "\.set noat"
+.*:13: Warning: Macro used \$at after "\.set noat"
+.*:14: Warning: Macro used \$at after "\.set noat"
+.*:15: Warning: Macro used \$at after "\.set noat"
+.*:16: Warning: Macro used \$at after "\.set noat"
+.*:20: Warning: Macro used \$at after "\.set noat"
+.*:21: Warning: Macro used \$at after "\.set noat"
+.*:24: Warning: Macro used \$at after "\.set noat"
+.*:25: Warning: Macro used \$at after "\.set noat"
Index: gas/testsuite/gas/mips/rol.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/rol.s,v
retrieving revision 1.2
diff -u -p -r1.2 rol.s
--- gas/testsuite/gas/mips/rol.s 20 Aug 2002 08:28:35 -0000 1.2
+++ gas/testsuite/gas/mips/rol.s 18 Dec 2002 21:47:51 -0000
@@ -1,5 +1,8 @@
# Source file used to test the rol and ror macros.
+ # generate warnings for all uses of AT.
+ .set noat
+
foo:
rol $4,$5
rol $4,$5,$6
@@ -12,4 +15,13 @@ foo:
ror $4,1
ror $4,$5,1
ror $4,$5,0
+
+ rol $4,$5,32
+ rol $4,$5,33
+ rol $4,$5,63
+
+ ror $4,$5,32
+ ror $4,$5,33
+ ror $4,$5,63
+
.space 8
Index: gas/testsuite/gas/mips/rol64-hw.d
===================================================================
RCS file: gas/testsuite/gas/mips/rol64-hw.d
diff -N gas/testsuite/gas/mips/rol64-hw.d
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/mips/rol64-hw.d 18 Dec 2002 21:47:51 -0000
@@ -0,0 +1,44 @@
+#objdump: -dr --prefix-addresses -mmips:5400
+#as: -march=vr5400 -mtune=vr5400
+#name: MIPS hardware drol (vr5400)
+#source: rol64.s
+#stderr: rol64-hw.l
+
+# Test the drol and dror macros.
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> dnegu at,a1
+0+0004 <[^>]*> drorv a0,a0,at
+0+0008 <[^>]*> dnegu a0,a2
+0+000c <[^>]*> drorv a0,a1,a0
+0+0010 <[^>]*> dror32 a0,a0,0x1f
+0+0014 <[^>]*> dror a0,a1,0x0
+0+0018 <[^>]*> dror32 a0,a1,0x1f
+0+001c <[^>]*> dror32 a0,a1,0x1
+0+0020 <[^>]*> dror32 a0,a1,0x0
+0+0024 <[^>]*> dror a0,a1,0x1f
+0+0028 <[^>]*> dror a0,a1,0x1
+0+002c <[^>]*> dror a0,a1,0x0
+0+0030 <[^>]*> drorv a0,a0,a1
+0+0034 <[^>]*> drorv a0,a1,a2
+0+0038 <[^>]*> dror a0,a0,0x1
+0+003c <[^>]*> dror a0,a1,0x0
+0+0040 <[^>]*> dror a0,a1,0x1
+0+0044 <[^>]*> dror a0,a1,0x1f
+0+0048 <[^>]*> dror32 a0,a1,0x0
+0+004c <[^>]*> dror32 a0,a1,0x1
+0+0050 <[^>]*> dror32 a0,a1,0x1f
+0+0054 <[^>]*> dror a0,a1,0x0
+0+0058 <[^>]*> dror32 a0,a1,0x1f
+0+005c <[^>]*> dror32 a0,a1,0x1
+0+0060 <[^>]*> dror32 a0,a1,0x0
+0+0064 <[^>]*> dror a0,a1,0x1f
+0+0068 <[^>]*> dror a0,a1,0x1
+0+006c <[^>]*> dror a0,a1,0x1
+0+0070 <[^>]*> dror a0,a1,0x1f
+0+0074 <[^>]*> dror32 a0,a1,0x0
+0+0078 <[^>]*> dror32 a0,a1,0x1
+0+007c <[^>]*> dror32 a0,a1,0x1f
+ ...
Index: gas/testsuite/gas/mips/rol64-hw.l
===================================================================
RCS file: gas/testsuite/gas/mips/rol64-hw.l
diff -N gas/testsuite/gas/mips/rol64-hw.l
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/mips/rol64-hw.l 18 Dec 2002 21:47:51 -0000
@@ -0,0 +1,2 @@
+.*: Assembler messages:
+.*:7: Warning: Macro used \$at after "\.set noat"
Index: gas/testsuite/gas/mips/rol64.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/rol64.d,v
retrieving revision 1.2
diff -u -p -r1.2 rol64.d
--- gas/testsuite/gas/mips/rol64.d 20 Aug 2002 08:28:35 -0000 1.2
+++ gas/testsuite/gas/mips/rol64.d 18 Dec 2002 21:47:51 -0000
@@ -1,6 +1,7 @@
#objdump: -dr --prefix-addresses -mmips:4000
#as: -march=r4000 -mtune=r4000
-#name: MIPS R4000 drol
+#name: MIPS macro drol (r4000)
+#stderr: rol64.l
# Test the drol and dror macros.
@@ -63,4 +64,34 @@ Disassembly of section .text:
0+00d4 <[^>]*> dsll a0,a1,0x1
0+00d8 <[^>]*> or a0,a0,at
0+00dc <[^>]*> dsrl a0,a1,0x0
+0+00e0 <[^>]*> dsll at,a1,0x1
+0+00e4 <[^>]*> dsrl32 a0,a1,0x1f
+0+00e8 <[^>]*> or a0,a0,at
+0+00ec <[^>]*> dsll at,a1,0x1f
+0+00f0 <[^>]*> dsrl32 a0,a1,0x1
+0+00f4 <[^>]*> or a0,a0,at
+0+00f8 <[^>]*> dsll32 at,a1,0x0
+0+00fc <[^>]*> dsrl32 a0,a1,0x0
+0+0100 <[^>]*> or a0,a0,at
+0+0104 <[^>]*> dsll32 at,a1,0x1
+0+0108 <[^>]*> dsrl a0,a1,0x1f
+0+010c <[^>]*> or a0,a0,at
+0+0110 <[^>]*> dsll32 at,a1,0x1f
+0+0114 <[^>]*> dsrl a0,a1,0x1
+0+0118 <[^>]*> or a0,a0,at
+0+011c <[^>]*> dsrl at,a1,0x1
+0+0120 <[^>]*> dsll32 a0,a1,0x1f
+0+0124 <[^>]*> or a0,a0,at
+0+0128 <[^>]*> dsrl at,a1,0x1f
+0+012c <[^>]*> dsll32 a0,a1,0x1
+0+0130 <[^>]*> or a0,a0,at
+0+0134 <[^>]*> dsrl32 at,a1,0x0
+0+0138 <[^>]*> dsll32 a0,a1,0x0
+0+013c <[^>]*> or a0,a0,at
+0+0140 <[^>]*> dsrl32 at,a1,0x1
+0+0144 <[^>]*> dsll a0,a1,0x1f
+0+0148 <[^>]*> or a0,a0,at
+0+014c <[^>]*> dsrl32 at,a1,0x1f
+0+0150 <[^>]*> dsll a0,a1,0x1
+0+0154 <[^>]*> or a0,a0,at
...
Index: gas/testsuite/gas/mips/rol64.l
===================================================================
RCS file: gas/testsuite/gas/mips/rol64.l
diff -N gas/testsuite/gas/mips/rol64.l
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/mips/rol64.l 18 Dec 2002 21:47:51 -0000
@@ -0,0 +1,27 @@
+.*: Assembler messages:
+.*:7: Warning: Macro used \$at after "\.set noat"
+.*:8: Warning: Macro used \$at after "\.set noat"
+.*:9: Warning: Macro used \$at after "\.set noat"
+.*:11: Warning: Macro used \$at after "\.set noat"
+.*:12: Warning: Macro used \$at after "\.set noat"
+.*:13: Warning: Macro used \$at after "\.set noat"
+.*:14: Warning: Macro used \$at after "\.set noat"
+.*:15: Warning: Macro used \$at after "\.set noat"
+.*:18: Warning: Macro used \$at after "\.set noat"
+.*:19: Warning: Macro used \$at after "\.set noat"
+.*:20: Warning: Macro used \$at after "\.set noat"
+.*:22: Warning: Macro used \$at after "\.set noat"
+.*:23: Warning: Macro used \$at after "\.set noat"
+.*:24: Warning: Macro used \$at after "\.set noat"
+.*:25: Warning: Macro used \$at after "\.set noat"
+.*:26: Warning: Macro used \$at after "\.set noat"
+.*:29: Warning: Macro used \$at after "\.set noat"
+.*:30: Warning: Macro used \$at after "\.set noat"
+.*:31: Warning: Macro used \$at after "\.set noat"
+.*:32: Warning: Macro used \$at after "\.set noat"
+.*:33: Warning: Macro used \$at after "\.set noat"
+.*:35: Warning: Macro used \$at after "\.set noat"
+.*:36: Warning: Macro used \$at after "\.set noat"
+.*:37: Warning: Macro used \$at after "\.set noat"
+.*:38: Warning: Macro used \$at after "\.set noat"
+.*:39: Warning: Macro used \$at after "\.set noat"
Index: gas/testsuite/gas/mips/rol64.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/rol64.s,v
retrieving revision 1.1
diff -u -p -r1.1 rol64.s
--- gas/testsuite/gas/mips/rol64.s 21 May 2002 23:54:45 -0000 1.1
+++ gas/testsuite/gas/mips/rol64.s 18 Dec 2002 21:47:51 -0000
@@ -1,5 +1,8 @@
# Source file used to test the drol and dror macros.
+ # generate warnings for all uses of AT.
+ .set noat
+
foo:
drol $4,$5
drol $4,$5,$6
@@ -22,6 +25,18 @@ foo:
dror $4,$5,33
dror $4,$5,63
dror $4,$5,64
+
+ drol $4,$5,65
+ drol $4,$5,95
+ drol $4,$5,96
+ drol $4,$5,97
+ drol $4,$5,127
+
+ dror $4,$5,65
+ dror $4,$5,95
+ dror $4,$5,96
+ dror $4,$5,97
+ dror $4,$5,127
# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
.space 8
More information about the Binutils
mailing list