Take unadjusted offset for loongson3a specific instructions.
authorMingjie Xing <mingjie.xing@gmail.com>
Tue, 11 Jan 2011 07:22:09 +0000 (07:22 +0000)
committerMingjie Xing <mingjie.xing@gmail.com>
Tue, 11 Jan 2011 07:22:09 +0000 (07:22 +0000)
gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/loongson-3a-2.d
gas/testsuite/gas/mips/loongson-3a-2.s
opcodes/ChangeLog
opcodes/mips-dis.c

index 2318483..449aa73 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-11  Mingjie Xing  <mingjie.xing@gmail.com>
+
+       * config/tc-mips.c (mips_ip): Update error messages.  Take an
+       unadjusted offset for "+c" argument.
+
 2011-01-10  Nick Clifton  <nickc@redhat.com>
 
        * config/tc-i386.c (x86_elf_abi): Only define for targets that use
index ee9b276..ae37e02 100644 (file)
@@ -9321,7 +9321,7 @@ mips_ip (char *str, struct mips_cl_insn *ip)
                  if (imm_expr.X_add_number < min_range
                      || imm_expr.X_add_number > max_range)
                    {
-                     as_bad (_("immediate not in range %ld..%ld (%ld)"),
+                     as_bad (_("Offset not in range %ld..%ld (%ld)"),
                              (long) min_range, (long) max_range,
                              (long) imm_expr.X_add_number);
                    }
@@ -9338,7 +9338,7 @@ mips_ip (char *str, struct mips_cl_insn *ip)
                  if (imm_expr.X_add_number < min_range
                      || imm_expr.X_add_number > max_range)
                    {
-                     as_bad (_("immediate not in range %ld..%ld (%ld)"),
+                     as_bad (_("Offset not in range %ld..%ld (%ld)"),
                              (long) min_range, (long) max_range,
                              (long) imm_expr.X_add_number);
                    }
@@ -9352,14 +9352,23 @@ mips_ip (char *str, struct mips_cl_insn *ip)
                  check_absolute_expr (ip, &imm_expr);
                  min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
                  max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
+                 /* We check the offset range before adjusted.  */
+                 min_range <<= 4;
+                 max_range <<= 4;
                  if (imm_expr.X_add_number < min_range
                      || imm_expr.X_add_number > max_range)
                    {
-                     as_bad (_("immediate not in range %ld..%ld (%ld)"),
+                     as_bad (_("Offset not in range %ld..%ld (%ld)"),
                              (long) min_range, (long) max_range,
                              (long) imm_expr.X_add_number);
                    }
-                 INSERT_OPERAND (OFFSET_C, *ip, imm_expr.X_add_number);
+                 if (imm_expr.X_add_number & 0xf)
+                   {
+                     as_bad (_("Offset not 16 bytes alignment (%ld)"),
+                             (long) imm_expr.X_add_number);
+                   }
+                 /* Right shift 4 bits to adjust the offset operand.  */
+                 INSERT_OPERAND (OFFSET_C, *ip, imm_expr.X_add_number >> 4);
                  imm_expr.X_op = O_absent;
                  s = expr_end;
                  continue;
index d28da8d..e63bd65 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-11  Mingjie Xing  <mingjie.xing@gmail.com>
+
+       * mips/loongson-3a-2.s, mips/loongson-3a-2.d: Use the real offset
+       value in assembly.
+
 2011-01-10  Nathan Sidwell  <nathan@codesourcery.com>
            Glauber de Oliveira Costa  <glommer@gmail.com>
 
index 4029a60..32fea2e 100644 (file)
@@ -57,9 +57,9 @@ Disassembly of section .text:
 .*:    d8912c07        gsldxc1 \$f17,-128\(\$4,\$5\)
 .*:    f8d23bfe        gsswxc1 \$f18,127\(\$6,\$7\)
 .*:    f9134c07        gssdxc1 \$f19,-128\(\$8,\$9\)
-.*:    c98b3fea        gslq    \$10,\$11,255\(\$12\)
-.*:    e9ee402d        gssq    \$13,\$14,-256\(\$15\)
-.*:    ca15bff4        gslqc1  \$f20,\$f21,255\(\$16\)
-.*:    ea37c036        gssqc1  \$f22,\$f23,-256\(\$17\)
+.*:    c98b3fea        gslq    \$10,\$11,4080\(\$12\)
+.*:    e9ee402d        gssq    \$13,\$14,-4096\(\$15\)
+.*:    ca15bff4        gslqc1  \$f20,\$f21,4080\(\$16\)
+.*:    ea37c036        gssqc1  \$f22,\$f23,-4096\(\$17\)
 #pass
 
index 16a38c9..c296b06 100644 (file)
@@ -58,8 +58,8 @@
        gsswxc1         $f18,127($6,$7)\r
        gssdxc1         $f19,-128($8,$9)\r
 \r
-       gslq            $10,$11,255($12) \r
-       gssq            $13,$14,-256($15)\r
-       gslqc1          $f20,$f21,255($16)\r
-       gssqc1          $f22,$f23,-256($17)\r
+       gslq            $10,$11,4080($12)\r
+       gssq            $13,$14,-4096($15)\r
+       gslqc1          $f20,$f21,4080($16)\r
+       gssqc1          $f22,$f23,-4096($17)\r
 \r
index f7b2fa9..a863510 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-11  Mingjie Xing  <mingjie.xing@gmail.com>
+
+       * mips-dis.c (print_insn_args): Adjust the value to print the real
+       offset for "+c" argument.
+
 2011-01-10  Nick Clifton  <nickc@redhat.com>
 
        * po/da.po: Updated Danish translation.
index ca65d71..c38a7e1 100644 (file)
@@ -991,7 +991,8 @@ print_insn_args (const char *d,
              delta = (l >> OP_SH_OFFSET_C) & OP_MASK_OFFSET_C;
              if (delta & 0x100)
                delta |= ~OP_MASK_OFFSET_C;
-             (*info->fprintf_func) (info->stream, "%d", delta);
+             /* Left shift 4 bits to print the real offset.  */
+             (*info->fprintf_func) (info->stream, "%d", delta << 4);
              break;
 
            case 'z':