FreeBSD/contrib/binutils/gas/config/tc-arm.c
/* Parse a directive saving VFP registers for ARMv6 and above.  */
Parse a directive saving VFP registers for ARMv6 and above.
Parse a directive saving VFP registers for ARMv6 and above .
static void
s_arm_unwind_save_vfp_armv6 (void)
{
  int count;
  unsigned int start;
  valueT op;
  int num_vfpv3_regs = 0;
  int num_regs_below_16;
  count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
  if (count == FAIL)
    {
      as_bad (_("expected register list"));
      ignore_rest_of_line ();
      return;
    }
  demand_empty_rest_of_line ();
  if (start >= 16)
    num_vfpv3_regs = count;
  else if (start + count > 16)
    num_vfpv3_regs = start + count - 16;
  if (num_vfpv3_regs > 0)
    {
      int start_offset = start > 16 ? start - 16 : 0;
      op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
      add_unwind_opcode (op, 2);
    }
  num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
  assert (num_regs_below_16 + num_vfpv3_regs == count);
  if (num_regs_below_16 > 0)
    {
      op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
      add_unwind_opcode (op, 2);
    }
  unwind.frame_size += count * 8;
}
static void s_arm_unwind_save_vfp_armv6 ( void ) { int count ; unsigned int start ; valueT op ; int num_vfpv3_regs = 0 ; int num_regs_below_16 ; count = parse_vfp_reg_list ( & input_line_pointer , & start , REGLIST_VFP_D ) ; if ( count == FAIL ) { as_bad ( _ ( " " ) ) ; ignore_rest_of_line ( ) ; return ; } demand_empty_rest_of_line ( ) ; if ( start >= 16 ) num_vfpv3_regs = count ; else if ( start + count > 16 ) num_vfpv3_regs = start + count - 16 ; if ( num_vfpv3_regs > 0 ) { int start_offset = start > 16 ? start - 16 : 0 ; op = 0xc800 | ( start_offset << 4 ) | ( num_vfpv3_regs - 1 ) ; add_unwind_opcode ( op , 2 ) ; } num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - ( int ) start : count ; assert ( num_regs_below_16 + num_vfpv3_regs == count ) ; if ( num_regs_below_16 > 0 ) { op = 0xc900 | ( start << 4 ) | ( num_regs_below_16 - 1 ) ; add_unwind_opcode ( op , 2 ) ; } unwind . frame_size += count * 8 ; }
Parse a directive saving VFP registers for ARMv6 and above.
Parse a directive saving VFP registers for ARMv6 and above .
/* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
     than FSTMX/FLDMX-style ones).  */ /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */ /* Generate opcode for registers numbered in the range 0 .. 15.  */