* dwarf2out.c (mem_loc_descriptor): Handle shifts.
authorPaul Brook <paul@codesourcery.com>
Wed, 28 Apr 2004 15:13:42 +0000 (15:13 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Wed, 28 Apr 2004 15:13:42 +0000 (15:13 +0000)
From-SVN: r81252

gcc/ChangeLog
gcc/dwarf2out.c

index e75088583cea32a89c30d5e6c6742bb2a39a4363..69cafbbc6a8906daf80c0a77e2c410b270c7d21b 100644 (file)
@@ -1,3 +1,7 @@
+2004-04-28  Paul Brook  <paul@codesourcery.com>
+
+       * dwarf2out.c (mem_loc_descriptor): Handle shifts.
+
 2004-04-28  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * gcse.c (find_moveable_store): Do not accept store insns with 
index 83c6821c4daa13c78903fd2ab5e4eaea81fefcad..7f234eebfd249f43f66ac048a16ff39204e11406 100644 (file)
@@ -8435,6 +8435,7 @@ static dw_loc_descr_ref
 mem_loc_descriptor (rtx rtl, enum machine_mode mode, bool can_use_fbreg)
 {
   dw_loc_descr_ref mem_loc_result = NULL;
+  enum dwarf_location_atom op;
 
   /* Note that for a dynamically sized array, the location we will generate a
      description of here will be the lowest numbered location which is
@@ -8576,10 +8577,26 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, bool can_use_fbreg)
        }
       break;
 
+    /* If a pseudo-reg is optimized away, it is possible for it to
+       be replaced with a MEM containing a multiply or shift.  */
     case MULT:
+      op = DW_OP_mul;
+      goto do_binop;
+
+    case ASHIFT:
+      op = DW_OP_shl;
+      goto do_binop;
+      
+    case ASHIFTRT:
+      op = DW_OP_shra;
+      goto do_binop;
+
+    case LSHIFTRT:
+      op = DW_OP_shr;
+      goto do_binop;
+
+    do_binop:
       {
-       /* If a pseudo-reg is optimized away, it is possible for it to
-          be replaced with a MEM containing a multiply.  */
        dw_loc_descr_ref op0 = mem_loc_descriptor (XEXP (rtl, 0), mode,
                                                   can_use_fbreg);
        dw_loc_descr_ref op1 = mem_loc_descriptor (XEXP (rtl, 1), mode,
@@ -8590,7 +8607,7 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, bool can_use_fbreg)
 
        mem_loc_result = op0;
        add_loc_descr (&mem_loc_result, op1);
-       add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_mul, 0, 0));
+       add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
        break;
       }