diff --git gcc/dwarf2out.c gcc/dwarf2out.c
index f0256ae..53a4e56 100644
--- gcc/dwarf2out.c
+++ gcc/dwarf2out.c
@@ -10875,11 +10875,25 @@ based_loc_descr (rtx reg, HOST_WIDE_INT offset,
       return new_loc_descr (DW_OP_fbreg, offset, 0);
     }
 
-  if (regno <= 31)
-    result = new_loc_descr ((enum dwarf_location_atom) (DW_OP_breg0 + regno),
-			    offset, 0);
+  rtx regs = targetm.dwarf_register_span (reg);
+
+  if (hard_regno_nregs[REGNO (reg)][GET_MODE (reg)] > 1 || regs)
+    {
+      result = multiple_reg_loc_descriptor (reg, regs, initialized);
+      add_loc_descr (&result, new_loc_descr (DW_OP_consts, offset, 0));
+      add_loc_descr (&result, new_loc_descr (DW_OP_plus, 0, 0));
+      add_loc_descr (&result, new_loc_descr (DW_OP_deref_size, 
+                  GET_MODE_SIZE (GET_MODE (reg)),
+                  0));
+    }
   else
-    result = new_loc_descr (DW_OP_bregx, regno, offset);
+    {
+      if (regno <= 31)
+          result = new_loc_descr ((enum dwarf_location_atom) (DW_OP_breg0 + regno),
+			    offset, 0);
+      else
+          result = new_loc_descr (DW_OP_bregx, regno, offset);
+    }
 
   if (initialized == VAR_INIT_STATUS_UNINITIALIZED)
     add_loc_descr (&result, new_loc_descr (DW_OP_GNU_uninit, 0, 0));
