/* This testcase is part of GDB, the GNU debugger.

   Copyright 2015-2021 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

static void
ext_reg_load (void)
{
  char in[8];

  asm ("vldr d0, [%0]" : : "r" (in));
  asm ("vldr s3, [%0]" : : "r" (in));

  asm ("vldm %0, {d3-d4}" : : "r" (in));
  asm ("vldm %0, {s9-s11}" : : "r" (in));
}

static void
ext_reg_mov (void)
{
  int i, j;
  double d;

  i = 1;
  j = 2;

  asm ("vmov s4, s5, %0, %1" : "=r" (i), "=r" (j): );
  asm ("vmov s7, s8, %0, %1" : "=r" (i), "=r" (j): );
  asm ("vmov %0, %1, s10, s11" : : "r" (i), "r" (j));
  asm ("vmov %0, %1, s1, s2" : : "r" (i), "r" (j));

  asm ("vmov %P2, %0, %1" : "=r" (i), "=r" (j): "w" (d));
  asm ("vmov %1, %2, %P0" : "=w" (d) : "r" (i), "r" (j));
}

static void
ext_reg_push_pop (void)
{
  double d;

  asm ("vpush {%P0}" : : "w" (d));
  asm ("vpop {%P0}" : : "w" (d));
}

/* Initialize arch-specific bits.  */

static void initialize (void)
{
  /* ARM doesn't currently use this function.  */
}

/* Functions testing instruction decodings.  GDB will test all of these.  */
static testcase_ftype testcases[] =
{
  ext_reg_load,
  ext_reg_mov,
  ext_reg_push_pop,
};
