* config/bfin-parse.y (asm_1): Add LOOP_BEGIN and LOOP_END.
authorJie Zhang <jie.zhang@analog.com>
Thu, 3 Sep 2009 15:36:02 +0000 (15:36 +0000)
committerJie Zhang <jie.zhang@analog.com>
Thu, 3 Sep 2009 15:36:02 +0000 (15:36 +0000)
* config/tc-bfin.c (bfin_start_line_hook): Remove.
(bfin_loop_beginend): New.
* config/tc-bfin.h (bfin_start_line_hook): Don't declare.
(md_start_line_hook): Don't define.
* config/bfin-aux.h (bfin_loop_beginend): Declare.

testsuite/
* gas/bfin/loop.s, gas/bfin/loop.d: New test.
* gas/bfin/loop2.s, gas/bfin/loop2.d: New test.
* gas/bfin/loop3.s, gas/bfin/loop3.d: New test.
* gas/bfin/bfin.exp: Add the new tests.

13 files changed:
gas/ChangeLog
gas/config/bfin-aux.h
gas/config/bfin-parse.y
gas/config/tc-bfin.c
gas/config/tc-bfin.h
gas/testsuite/ChangeLog
gas/testsuite/gas/bfin/bfin.exp
gas/testsuite/gas/bfin/loop.d [new file with mode: 0644]
gas/testsuite/gas/bfin/loop.s [new file with mode: 0644]
gas/testsuite/gas/bfin/loop2.d [new file with mode: 0644]
gas/testsuite/gas/bfin/loop2.s [new file with mode: 0644]
gas/testsuite/gas/bfin/loop3.d [new file with mode: 0644]
gas/testsuite/gas/bfin/loop3.s [new file with mode: 0644]

index b5460ae885149c10cdfac8b1cda1c63141dfd3e9..30d4c6277fb8ec96a0d4ee7fafd7b009cab7af3c 100644 (file)
@@ -1,3 +1,12 @@
+2009-09-03  Jie Zhang  <jie.zhang@analog.com>
+
+       * config/bfin-parse.y (asm_1): Add LOOP_BEGIN and LOOP_END.
+       * config/tc-bfin.c (bfin_start_line_hook): Remove.
+       (bfin_loop_beginend): New.
+       * config/tc-bfin.h (bfin_start_line_hook): Don't declare.
+       (md_start_line_hook): Don't define.
+       * config/bfin-aux.h (bfin_loop_beginend): Declare.
+
 2009-09-03  Tristan Gingold  <gingold@adacore.com>
 
        * config/tc-ia64.c (ia64_vms_note): Use lbasename instead of basename.
index d470797657e135b4d830f7af2d04acfc2125d0ad..9c71939f8e7347f5da4fd3439c1c300b308b3fcf 100755 (executable)
@@ -126,6 +126,9 @@ bfin_gen_loopsetup (Expr_Node *soffset, REG_T c, int rop,
 INSTR_T
 bfin_gen_loop (Expr_Node *expr, REG_T reg, int rop, REG_T preg);
 
+void
+bfin_loop_beginend (Expr_Node *expr, int begin);
+
 INSTR_T
 bfin_gen_pushpopmultiple (int dr, int pr, int d, int p, int w);
 
index 72db6d91825b6dc18a817a088ac51adb14ef3a56..719edafd5d4b278cd200587e8a3859c34705ec77 100644 (file)
@@ -3525,6 +3525,27 @@ asm_1:
          else
            return yyerror ("Bad register or values for LOOP");
        }
+
+/* LOOP_BEGIN.  */
+       | LOOP_BEGIN expr
+       {
+         if (!IS_RELOC ($2))
+           return yyerror ("Invalid expression in LOOP_BEGIN statement");
+
+         bfin_loop_beginend ($2, 1);
+         $$ = 0;
+       }
+
+/* LOOP_END.  */
+       | LOOP_END expr
+       {
+         if (!IS_RELOC ($2))
+           return yyerror ("Invalid expression in LOOP_END statement");
+
+         bfin_loop_beginend ($2, 0);
+         $$ = 0;
+       }
+
 /* pseudoDEBUG.  */
 
        | DBG
index 58b7ed124f650cbfa39fc25ef059f7b240af7c5b..958f63da25f1d7a2f2743f26c495251b490d0b76 100644 (file)
@@ -1016,123 +1016,6 @@ bfin_fix_adjustable (fixS *fixP)
     }     
 }
 
-
-/* Handle the LOOP_BEGIN and LOOP_END statements.
-   Parse the Loop_Begin/Loop_End and create a label.  */
-void
-bfin_start_line_hook ()
-{
-  bfd_boolean maybe_begin = FALSE;
-  bfd_boolean maybe_end = FALSE;
-
-  char *c1, *label_name;
-  symbolS *line_label;
-  char *c = input_line_pointer;
-  int cr_num = 0;
-
-  while (ISSPACE (*c))
-    {
-      if (*c == '\n')
-       cr_num++;
-      c++;
-    }
-
-  /* Look for Loop_Begin or Loop_End statements.  */
-
-  if (*c != 'L' && *c != 'l')
-    return;
-
-  c++;
-  if (*c != 'O' && *c != 'o')
-    return;
-
-  c++;
-  if (*c != 'O' && *c != 'o')
-    return;
-  c++;
-  if (*c != 'P' && *c != 'p')
-    return;
-
-  c++;
-  if (*c != '_')
-    return;
-
-  c++;
-  if (*c == 'E' || *c == 'e')
-    maybe_end = TRUE;
-  else if (*c == 'B' || *c == 'b')
-    maybe_begin = TRUE;
-  else
-    return;
-
-  if (maybe_end)
-    {
-      c++;
-      if (*c != 'N' && *c != 'n')
-       return;
-
-      c++;
-      if (*c != 'D' && *c != 'd')
-        return;
-    }
-
-  if (maybe_begin)
-    {
-      c++;
-      if (*c != 'E' && *c != 'e')
-       return;
-
-      c++;
-      if (*c != 'G' && *c != 'g')
-        return;
-
-      c++;
-      if (*c != 'I' && *c != 'i')
-       return;
-
-      c++;
-      if (*c != 'N' && *c != 'n')
-        return;
-    }
-
-  c++;
-  while (ISSPACE (*c)) c++;
-  c1 = c;
-  while (ISALPHA (*c) || ISDIGIT (*c) || *c == '_') c++;
-
-  if (input_line_pointer[-1] == '\n')
-    bump_line_counters ();
-
-  while (cr_num--)
-    bump_line_counters ();
-
-  input_line_pointer = c;
-  if (maybe_end)
-    {
-      label_name = (char *) xmalloc ((c - c1) + strlen ("__END") + 5);
-      label_name[0] = 0;
-      strcat (label_name, "L$L$");
-      strncat (label_name, c1, c-c1);
-      strcat (label_name, "__END");
-    }
-  else /* maybe_begin.  */
-    {
-      label_name = (char *) xmalloc ((c - c1) + strlen ("__BEGIN") + 5);
-      label_name[0] = 0;
-      strcat (label_name, "L$L$");
-      strncat (label_name, c1, c-c1);
-      strcat (label_name, "__BEGIN");
-    }
-
-  line_label = colon (label_name);
-
-  /* Loop_End follows the last instruction in the loop.
-     Adjust label address.  */
-  if (maybe_end)
-    ((struct local_symbol *) line_label)->lsy_value -= last_insn_size;
-}
-
 /* Special extra functions that help bfin-parse.y perform its job.  */
 
 struct obstack mempool;
@@ -2145,6 +2028,31 @@ bfin_gen_loop (Expr_Node *expr, REG_T reg, int rop, REG_T preg)
   return bfin_gen_loopsetup(lbegin, reg, rop, lend, preg);
 }
 
+void
+bfin_loop_beginend (Expr_Node *expr, int begin)
+{
+  const char *loopsym;
+  char *label_name;
+  symbolS *line_label;
+  const char *suffix = begin ? "__BEGIN" : "__END";
+
+  loopsym = expr->value.s_value;
+  label_name = (char *) xmalloc (strlen (loopsym) + strlen (suffix) + 5);
+
+  label_name[0] = 0;
+
+  strcat (label_name, "L$L$");
+  strcat (label_name, loopsym);
+  strcat (label_name, suffix);
+
+  line_label = colon (label_name);
+
+  /* LOOP_END follows the last instruction in the loop.
+     Adjust label address.  */
+  if (!begin)
+    ((struct local_symbol *) line_label)->lsy_value -= last_insn_size;
+}
+
 bfd_boolean
 bfin_eol_in_insn (char *line)
 {
index f949b4e46582bfa8954d9a31372f77c771c92b69..c5819fcbac0c422c3f62a6e40d474839165fdb73 100644 (file)
 
 #define WORKING_DOT_WORD
 
-extern void bfin_start_line_hook (void);
 extern bfd_boolean bfin_start_label (char *, char *);
 
-#define md_start_line_hook()    bfin_start_line_hook()
 #define md_number_to_chars     number_to_chars_littleendian
 #define md_convert_frag(b,s,f) as_fatal ("bfin convert_frag\n");
 
index d639cee1e21fe25abb749ae935ce2ce9703e1cd9..f75cb127420de3816c4a07692d7e8a38ebdb4179 100644 (file)
@@ -1,3 +1,10 @@
+2009-09-03  Jie Zhang  <jie.zhang@analog.com>
+
+       * gas/bfin/loop.s, gas/bfin/loop.d: New test.
+       * gas/bfin/loop2.s, gas/bfin/loop2.d: New test.
+       * gas/bfin/loop3.s, gas/bfin/loop3.d: New test.
+       * gas/bfin/bfin.exp: Add the new tests.
+
 2009-09-02  Jie Zhang  <jie.zhang@analog.com>
 
        From  Bernd Schmidt  <bernd.schmidt@analog.com>
index 58d33b5ec1a32d4ed6943b4ad4c81a0efff216d7..59eed655ea922b9a0f803476b6badde4e349f319 100644 (file)
@@ -20,6 +20,9 @@ if [istarget bfin*-*-*] {
        run_dump_test "load"
        run_dump_test "logical"
        run_dump_test "logical2"
+       run_dump_test "loop"
+       run_dump_test "loop2"
+       run_dump_test "loop3"
        run_dump_test "misc"
        run_dump_test "move"
        run_dump_test "move2"
diff --git a/gas/testsuite/gas/bfin/loop.d b/gas/testsuite/gas/bfin/loop.d
new file mode 100644 (file)
index 0000000..2ecd459
--- /dev/null
@@ -0,0 +1,7 @@
+#readelf: --relocs
+#name: loop
+
+Relocation section '\.rela\.text' .*:
+.*
+.* R_BFIN_GOT17M4    0+00   _foo \+ 0
+.* R_BFIN_PCREL24    0+00   _bar \+ 0
diff --git a/gas/testsuite/gas/bfin/loop.s b/gas/testsuite/gas/bfin/loop.s
new file mode 100644 (file)
index 0000000..43a7ed2
--- /dev/null
@@ -0,0 +1,5 @@
+        LOOP bug LC0 = P0>>1;
+        LOOP_BEGIN bug;             
+                R0 = [P3+_foo@GOT17M4];
+        LOOP_END bug;
+        call  _bar;
diff --git a/gas/testsuite/gas/bfin/loop2.d b/gas/testsuite/gas/bfin/loop2.d
new file mode 100644 (file)
index 0000000..79c167b
--- /dev/null
@@ -0,0 +1,7 @@
+#readelf: --relocs
+#name: loop2
+
+Relocation section '\.rela\.text' .*:
+.*
+.* R_BFIN_GOT17M4    0+00   _foo \+ 0
+.* R_BFIN_PCREL24    0+00   _bar \+ 0
diff --git a/gas/testsuite/gas/bfin/loop2.s b/gas/testsuite/gas/bfin/loop2.s
new file mode 100644 (file)
index 0000000..e8c7600
--- /dev/null
@@ -0,0 +1,5 @@
+        LOOP .bug LC0 = P0>>1;
+        LOOP_BEGIN .bug;             
+                R0 = [P3+_foo@GOT17M4];
+        LOOP_END .bug;
+        call  _bar;
diff --git a/gas/testsuite/gas/bfin/loop3.d b/gas/testsuite/gas/bfin/loop3.d
new file mode 100644 (file)
index 0000000..0097d78
--- /dev/null
@@ -0,0 +1,7 @@
+#readelf: --relocs
+#name: loop3
+
+Relocation section '\.rela\.text' .*:
+.*
+.* R_BFIN_GOT17M4    0+00   _foo \+ 0
+.* R_BFIN_PCREL24    0+00   _bar \+ 0
diff --git a/gas/testsuite/gas/bfin/loop3.s b/gas/testsuite/gas/bfin/loop3.s
new file mode 100644 (file)
index 0000000..ef1a882
--- /dev/null
@@ -0,0 +1,5 @@
+        LOOP $bug LC0 = P0>>1;
+        LOOP_BEGIN $bug;             
+                R0 = [P3+_foo@GOT17M4];
+        LOOP_END $bug;
+        call  _bar;