opcodes/
authorDavid S. Miller <davem@redhat.com>
Thu, 8 Sep 2011 19:01:11 +0000 (19:01 +0000)
committerDavid S. Miller <davem@redhat.com>
Thu, 8 Sep 2011 19:01:11 +0000 (19:01 +0000)
The changes below bring 'mov' and 'ticc' instructions into line
with the V8 SPARC Architecture Manual.
* sparc-opc.c (sparc_opcodes): Add entry for 'ticc imm + regrs1'.
* sparc-opc.c (sparc_opcodes): Add alias entries for
'mov regrs2,%asrX'; 'mov regrs2,%y'; 'mov regrs2,%prs';
'mov regrs2,%wim' and 'mov regrs2,%tbr'.
* sparc-opc.c (sparc_opcodes): Move/Change entries for
'mov imm,%asrX'; 'mov imm,%y'; 'mov imm,%prs'; 'mov imm,%wim'
and 'mov imm,%tbr'.
* sparc-opc.c (sparc_opcodes): Add wr alias entries to match above
mov aliases.

gas/testsuite/

* gas/sparc/ticc-imm-reg.[sd]: New test.
* gas/sparc/v8-movwr-imm.[sd]: New test.
* gas/sparc/sparc.exp: Run new tests.

gas/testsuite/ChangeLog
gas/testsuite/gas/sparc/sparc.exp
gas/testsuite/gas/sparc/ticc-imm-reg.d [new file with mode: 0644]
gas/testsuite/gas/sparc/ticc-imm-reg.s [new file with mode: 0644]
gas/testsuite/gas/sparc/v8-movwr-imm.d [new file with mode: 0644]
gas/testsuite/gas/sparc/v8-movwr-imm.s [new file with mode: 0644]
opcodes/ChangeLog
opcodes/sparc-opc.c

index 2df1ce8ea9254b5f4f0b9b5030881f10c0b33e3a..90af146f28be7f80882dde316a985073836498af 100644 (file)
@@ -3,6 +3,10 @@
        * gas/sparc/imm-plus-rreg.[sd]: New test.
        * gas/sparc/sparc.exp: Run new test.
 
+       * gas/sparc/ticc-imm-reg.[sd]: New test.
+       * gas/sparc/v8-movwr-imm.[sd]: New test.
+       * gas/sparc/sparc.exp: Run new tests.
+
 2011-09-08  David S. Miller  <davem@davemloft.net>
 
        * gas/sparc/hpcvis3.s: Correct pdistn test.
index 335d4b4b746621fbb565d83e81f78f506d41db6a..f7f8f8f8e6a4b808fc866aa01f4ab52f38c00bc0 100644 (file)
@@ -51,6 +51,8 @@ if [istarget sparc*-*-*] {
        run_dump_test "gotop64"
     }
     run_dump_test "imm-plus-rreg"
+    run_dump_test "ticc-imm-reg"
+    run_dump_test "v8-movwr-imm"
     run_dump_test "v9branch1"
     run_dump_test "v9branch2"
     run_dump_test "v9branch3"
diff --git a/gas/testsuite/gas/sparc/ticc-imm-reg.d b/gas/testsuite/gas/sparc/ticc-imm-reg.d
new file mode 100644 (file)
index 0000000..ae2aca9
--- /dev/null
@@ -0,0 +1,18 @@
+#as: -Av8
+#objdump: -dr
+#name: software traps
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+00000000 <foo>:
+   0:  91 d2 00 00     ta  %o0
+   4:  91 d2 00 0a     ta  %o0 \+ %o2
+   8:  91 d4 20 0a     ta  %l0 \+ 0xa
+   c:  91 d4 3f f6     ta  %l0 \+ -10
+  10:  91 d4 3f f6     ta  %l0 \+ -10
+  14:  91 d4 20 0a     ta  %l0 \+ 0xa
+  18:  91 d0 20 7f     ta  0x7f
+  1c:  91 d6 20 0a     ta  %i0 \+ 0xa
+  20:  91 d6 3f f6     ta  %i0 \+ -10
diff --git a/gas/testsuite/gas/sparc/ticc-imm-reg.s b/gas/testsuite/gas/sparc/ticc-imm-reg.s
new file mode 100644 (file)
index 0000000..27dcd43
--- /dev/null
@@ -0,0 +1,12 @@
+! Make ticc aliases operate as per V8 SPARC Architecture Manual
+       .text
+foo:
+       ta      %o0
+       ta      %o0 + %o2
+       ta      %l0 +  10
+       ta      %l0 + -10
+       ta      %l0 -  10
+       ta      %l0 - -10
+       ta      127
+       ta       10 + %i0
+       ta      -10 + %i0
diff --git a/gas/testsuite/gas/sparc/v8-movwr-imm.d b/gas/testsuite/gas/sparc/v8-movwr-imm.d
new file mode 100644 (file)
index 0000000..961bb68
--- /dev/null
@@ -0,0 +1,49 @@
+#as: -Av8
+#objdump: -dr
+#name: V8 mov/wr aliases
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+00000000 <foo>:
+   0:  83 80 00 10     mov  %l0, %asr1
+   4:  81 80 00 10     mov  %l0, %y
+   8:  81 88 00 10     mov  %l0, %psr
+   c:  81 90 00 10     mov  %l0, %wim
+  10:  81 98 00 10     mov  %l0, %tbr
+  14:  83 80 00 00     mov  %g0, %asr1
+  18:  81 80 00 00     mov  %g0, %y
+  1c:  81 88 00 00     mov  %g0, %psr
+  20:  81 90 00 00     mov  %g0, %wim
+  24:  81 98 00 00     mov  %g0, %tbr
+  28:  83 80 20 00     mov  %g0, %asr1
+  2c:  81 80 20 00     mov  %g0, %y
+  30:  81 88 20 00     mov  %g0, %psr
+  34:  81 90 20 00     mov  %g0, %wim
+  38:  81 98 20 00     mov  %g0, %tbr
+  3c:  83 80 3f ff     mov  -1, %asr1
+  40:  81 80 3f ff     mov  -1, %y
+  44:  81 88 3f ff     mov  -1, %psr
+  48:  81 90 3f ff     mov  -1, %wim
+  4c:  81 98 3f ff     mov  -1, %tbr
+  50:  83 80 00 10     mov  %l0, %asr1
+  54:  81 80 00 10     mov  %l0, %y
+  58:  81 88 00 10     mov  %l0, %psr
+  5c:  81 90 00 10     mov  %l0, %wim
+  60:  81 98 00 10     mov  %l0, %tbr
+  64:  83 80 00 00     mov  %g0, %asr1
+  68:  81 80 00 00     mov  %g0, %y
+  6c:  81 88 00 00     mov  %g0, %psr
+  70:  81 90 00 00     mov  %g0, %wim
+  74:  81 98 00 00     mov  %g0, %tbr
+  78:  83 80 20 00     mov  %g0, %asr1
+  7c:  81 80 20 00     mov  %g0, %y
+  80:  81 88 20 00     mov  %g0, %psr
+  84:  81 90 20 00     mov  %g0, %wim
+  88:  81 98 20 00     mov  %g0, %tbr
+  8c:  83 80 3f ff     mov  -1, %asr1
+  90:  81 80 3f ff     mov  -1, %y
+  94:  81 88 3f ff     mov  -1, %psr
+  98:  81 90 3f ff     mov  -1, %wim
+  9c:  81 98 3f ff     mov  -1, %tbr
diff --git a/gas/testsuite/gas/sparc/v8-movwr-imm.s b/gas/testsuite/gas/sparc/v8-movwr-imm.s
new file mode 100644 (file)
index 0000000..26a46bb
--- /dev/null
@@ -0,0 +1,45 @@
+! Make 'mov' and 'wr' aliases operate as per V8 SPARC Architecture Manual
+       .text
+foo:
+       ! wr Aliases
+       wr      %l0,%asr1
+       wr      %l0,%y
+       wr      %l0,%psr
+       wr      %l0,%wim
+       wr      %l0,%tbr
+       wr      %g0,%asr1
+       wr      %g0,%y
+       wr      %g0,%psr
+       wr      %g0,%wim
+       wr      %g0,%tbr
+       wr      0,%asr1
+       wr      0,%y
+       wr      0,%psr
+       wr      0,%wim
+       wr      0,%tbr
+       wr      -1,%asr1
+       wr      -1,%y
+       wr      -1,%psr
+       wr      -1,%wim
+       wr      -1,%tbr
+       ! mov Aliases
+       mov     %l0,%asr1
+       mov     %l0,%y
+       mov     %l0,%psr
+       mov     %l0,%wim
+       mov     %l0,%tbr
+       mov     %g0,%asr1
+       mov     %g0,%y
+       mov     %g0,%psr
+       mov     %g0,%wim
+       mov     %g0,%tbr
+       mov     0,%asr1
+       mov     0,%y
+       mov     0,%psr
+       mov     0,%wim
+       mov     0,%tbr
+       mov     -1,%asr1
+       mov     -1,%y
+       mov     -1,%psr
+       mov     -1,%wim
+       mov     -1,%tbr
index b59d7c81b61d76eee52831f86f6e38d70cbfca37..85512d72331d4fe3824a9dfd53f5934b161b3288 100644 (file)
@@ -1,3 +1,17 @@
+2011-09-08  Mark Fortescue <mark@mtfhpc.demon.co.uk>
+
+       The changes below bring 'mov' and 'ticc' instructions into line
+       with the V8 SPARC Architecture Manual.
+       * sparc-opc.c (sparc_opcodes): Add entry for 'ticc imm + regrs1'.
+       * sparc-opc.c (sparc_opcodes): Add alias entries for
+       'mov regrs2,%asrX'; 'mov regrs2,%y'; 'mov regrs2,%prs';
+       'mov regrs2,%wim' and 'mov regrs2,%tbr'.
+       * sparc-opc.c (sparc_opcodes): Move/Change entries for
+       'mov imm,%asrX'; 'mov imm,%y'; 'mov imm,%prs'; 'mov imm,%wim'
+       and 'mov imm,%tbr'.
+       * sparc-opc.c (sparc_opcodes): Add wr alias entries to match above
+       mov aliases.
+
 2011-09-08  David S. Miller  <davem@davemloft.net>
 
        * sparc-opc.c (pdistn): Destination is integer not float register.
index c4a5f71f4a519f32745c234c699f14bd7031ee0a..267fc8cc771841972ec61ef3920be7c8580f3bbe 100644 (file)
@@ -820,18 +820,28 @@ const struct sparc_opcode sparc_opcodes[] = {
 
 { "wr",        F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|ASI(~0),              "1,2,m", 0, v8 }, /* wr r,r,%asrX */
 { "wr",        F3(2, 0x30, 1),         F3(~2, ~0x30, ~1),                      "1,i,m", 0, v8 }, /* wr r,i,%asrX */
+{ "wr",        F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|RS1_G0|ASI(~0),       "2,m", F_ALIAS, v8 }, /* wr %g0,rs2,%asrX */
+{ "wr",        F3(2, 0x30, 1),         F3(~2, ~0x30, ~1)|RS1_G0,               "i,m", F_ALIAS, v8 }, /* wr %g0,i,%asrX */
 { "wr",        F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|ASI_RS2(~0),          "1,m", F_ALIAS, v8 }, /* wr rs1,%g0,%asrX */
 { "wr",        F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),        "1,2,y", 0, v6 }, /* wr r,r,%y */
 { "wr",        F3(2, 0x30, 1),         F3(~2, ~0x30, ~1)|RD_G0,                "1,i,y", 0, v6 }, /* wr r,i,%y */
+{ "wr",        F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|RD_G0|RS1_G0|ASI(~0), "2,y", F_ALIAS, v6 }, /* wr %g0,rs2,%y */
+{ "wr",        F3(2, 0x30, 1),         F3(~2, ~0x30, ~1)|RD_G0|RS1_G0,         "i,y", F_ALIAS, v6 }, /* wr %g0,i,%y */
 { "wr",        F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|RD_G0|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
 { "wr",        F3(2, 0x31, 0),         F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),        "1,2,p", 0, v6notv9 }, /* wr r,r,%psr */
 { "wr",        F3(2, 0x31, 1),         F3(~2, ~0x31, ~1)|RD_G0,                "1,i,p", 0, v6notv9 }, /* wr r,i,%psr */
+{ "wr",        F3(2, 0x31, 0),         F3(~2, ~0x31, ~0)|RD_G0|RS1_G0|ASI(~0), "2,p", F_ALIAS, v6notv9 }, /* wr %g0,rs2,%psr */
+{ "wr",        F3(2, 0x31, 1),         F3(~2, ~0x31, ~1)|RD_G0|RS1_G0,         "i,p", F_ALIAS, v6notv9 }, /* wr %g0,i,%psr */
 { "wr",        F3(2, 0x31, 0),         F3(~2, ~0x31, ~0)|RD_G0|ASI_RS2(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%psr */
 { "wr",        F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),        "1,2,w", 0, v6notv9 }, /* wr r,r,%wim */
 { "wr",        F3(2, 0x32, 1),         F3(~2, ~0x32, ~1)|RD_G0,                "1,i,w", 0, v6notv9 }, /* wr r,i,%wim */
+{ "wr",        F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|RD_G0|RS1_G0|ASI(~0), "2,w", F_ALIAS, v6notv9 }, /* wr %g0,rs2,%wim */
+{ "wr",        F3(2, 0x32, 1),         F3(~2, ~0x32, ~1)|RD_G0|RS1_G0,         "i,w", F_ALIAS, v6notv9 }, /* wr %g0,i,%wim */
 { "wr",        F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|RD_G0|ASI_RS2(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%wim */
 { "wr",        F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),        "1,2,t", 0, v6notv9 }, /* wr r,r,%tbr */
 { "wr",        F3(2, 0x33, 1),         F3(~2, ~0x33, ~1)|RD_G0,                "1,i,t", 0, v6notv9 }, /* wr r,i,%tbr */
+{ "wr",        F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|RD_G0|RS1_G0|ASI(~0), "2,t", F_ALIAS, v6notv9 }, /* wr %g0,rs2,%tbr */
+{ "wr",        F3(2, 0x33, 1),         F3(~2, ~0x33, ~1)|RD_G0|RS1_G0,         "i,t", F_ALIAS, v6notv9 }, /* wr %g0,i,%tbr */
 { "wr",        F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|RD_G0|ASI_RS2(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%tbr */
 
 { "wr", F3(2, 0x30, 0)|RD(2),  F3(~2, ~0x30, ~0)|RD(~2)|ASI(~0),       "1,2,E", 0, v9 }, /* wr r,r,%ccr */
@@ -918,20 +928,25 @@ const struct sparc_opcode sparc_opcodes[] = {
 { "mov",       F3(2, 0x2a, 0), F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),    "w,d", F_ALIAS, v6notv9 }, /* rd %wim,r */
 { "mov",       F3(2, 0x2b, 0), F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),    "t,d", F_ALIAS, v6notv9 }, /* rd %tbr,r */
 
+{ "mov",       F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RS1_G0|ASI(~0),       "2,m", F_ALIAS, v8 }, /* wr %g0,rs2,%asrX */
+{ "mov",       F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RS1_G0,               "i,m", F_ALIAS, v8 }, /* wr %g0,i,%asrX */
 { "mov",       F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|ASI_RS2(~0),          "1,m", F_ALIAS, v8 }, /* wr rs1,%g0,%asrX */
-{ "mov",       F3(2, 0x30, 1), F3(~2, ~0x30, ~1),                      "i,m", F_ALIAS, v8 }, /* wr %g0,i,%asrX */
 { "mov",       F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|SIMM13(~0),           "1,m", F_ALIAS, v8 }, /* wr rs1,0,%asrX */
+{ "mov",       F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RD_G0|RS1_G0|ASI(~0), "2,y", F_ALIAS, v6 }, /* wr %g0,rs2,%y */
+{ "mov",       F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0|RS1_G0,         "i,y", F_ALIAS, v6 }, /* wr %g0,i,%y */
 { "mov",       F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RD_G0|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
-{ "mov",       F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0,                "i,y", F_ALIAS, v6 }, /* wr %g0,i,%y */
 { "mov",       F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0|SIMM13(~0),     "1,y", F_ALIAS, v6 }, /* wr rs1,0,%y */
+{ "mov",       F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|RD_G0|RS1_G0|ASI(~0), "2,p", F_ALIAS, v6notv9 }, /* wr %g0,rs2,%psr */
+{ "mov",       F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0|RS1_G0,         "i,p", F_ALIAS, v6notv9 }, /* wr %g0,i,%psr */
 { "mov",       F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|RD_G0|ASI_RS2(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%psr */
-{ "mov",       F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0,                "i,p", F_ALIAS, v6notv9 }, /* wr %g0,i,%psr */
 { "mov",       F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0|SIMM13(~0),     "1,p", F_ALIAS, v6notv9 }, /* wr rs1,0,%psr */
+{ "mov",       F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|RD_G0|RS1_G0|ASI(~0), "2,w", F_ALIAS, v6notv9 }, /* wr %g0,rs2,%wim */
+{ "mov",       F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0|RS1_G0,         "i,w", F_ALIAS, v6notv9 }, /* wr %g0,i,%wim */
 { "mov",       F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|RD_G0|ASI_RS2(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%wim */
-{ "mov",       F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0,                "i,w", F_ALIAS, v6notv9 }, /* wr %g0,i,%wim */
 { "mov",       F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0|SIMM13(~0),     "1,w", F_ALIAS, v6notv9 }, /* wr rs1,0,%wim */
+{ "mov",       F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|RD_G0|RS1_G0|ASI(~0), "2,t", F_ALIAS, v6notv9 }, /* wr %g0,rs2,%tbr */
+{ "mov",       F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0|RS1_G0,         "i,t", F_ALIAS, v6notv9 }, /* wr %g0,i,%tbr */
 { "mov",       F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|RD_G0|ASI_RS2(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%tbr */
-{ "mov",       F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0,                "i,t", F_ALIAS, v6notv9 }, /* wr %g0,i,%tbr */
 { "mov",       F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0|SIMM13(~0),     "1,t", F_ALIAS, v6notv9 }, /* wr rs1,0,%tbr */
 
 { "mov",       F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RS1_G0|ASI(~0),       "2,d", 0, v6 }, /* or %g0,rs2,d */
@@ -1107,6 +1122,7 @@ const struct sparc_opcode sparc_opcodes[] = {
  { opcode, (mask), IMMED|(lose)|RS2_G0,        "z,1",   (flags)|F_ALIAS, v9 }, /* rs1 + %g0 */ \
  { opcode, (mask)|IMMED, (lose)|RS1_G0,                "i",     (flags), v6 }, /* %g0 + imm */ \
  { opcode, (mask)|IMMED, (lose),               "1+i",   (flags), v6 }, /* rs1 + imm */ \
+ { opcode, (mask)|IMMED, (lose),               "i+1",   (flags), v6 }, /* imm + rs1 */ \
  { opcode, (mask), IMMED|(lose),               "1+2",   (flags), v6 }, /* rs1 + rs2 */ \
  { opcode, (mask), IMMED|(lose)|RS2_G0,                "1",     (flags), v6 } /* rs1 + %g0 */