+2013-05-02  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * config/tc-mips.c (mips_pseudo_table): Add stabd and stabs entries.
+       (s_mips_stab): Do not restrict to stabn only.
+
 2013-05-02  Nick Clifton  <nickc@redhat.com>
 
        * config/tc-msp430.c: Add support for the MSP430X architecture.
 
   {"section", s_change_section, 0},
   {"short", s_cons, 1},
   {"single", s_float_cons, 'f'},
+  {"stabd", s_mips_stab, 'd'},
   {"stabn", s_mips_stab, 'n'},
+  {"stabs", s_mips_stab, 's'},
   {"text", s_change_sec, 't'},
   {"word", s_cons, 2},
 
   demand_empty_rest_of_line ();
 }
 
-/* Handle a .stabn directive.  We need these in order to mark a label
-   as being a mips16 text label correctly.  Sometimes the compiler
-   will emit a label, followed by a .stabn, and then switch sections.
-   If the label and .stabn are in mips16 mode, then the label is
-   really a mips16 text label.  */
+/* Handle a .stab[snd] directive.  Ideally these directives would be
+   implemented in a transparent way, so that removing them would not
+   have any effect on the generated instructions.  However, s_stab
+   internally changes the section, so in practice we need to decide
+   now whether the preceding label marks compressed code.  We do not
+   support changing the compression mode of a label after a .stab*
+   directive, such as in:
+
+   foo:
+       .stabs ...
+       .set mips16
+
+   so the current mode wins.  */
 
 static void
 s_mips_stab (int type)
 {
-  if (type == 'n')
-    mips_mark_labels ();
-
+  mips_mark_labels ();
   s_stab (type);
 }
 
 
+2013-05-02  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gas/mips/mips16-stabs.s, gas/mips/mips16-stabs.d: New test.
+       * gas/mips/mips.exp: Run it.
+
 2013-05-02  Nick Clifton  <nickc@redhat.com>
 
        * gas/all/gas.exp: Skip the DIFF1 test for the MSP430.