blob: d61d32396e4b467507c08661fc9ad608befb1ef1 [file]
/* This test program is part of GDB, the GNU debugger.
Copyright 2024-2026 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/>. */
#include <stdalign.h>
#include <stdint.h>
#include <string.h>
#define INITIAL_STRING "This is just some string."
#define BUF_SIZE sizeof (INITIAL_STRING)
#define PREPARE_SRC_AND_PTR(OFFSET) \
strcpy (src, INITIAL_STRING); \
__asm__ volatile ("mov x21, %0" \
: \
: "r"((uint64_t *)((uint8_t *)src + (OFFSET))) \
: "x21")
#define PREPARE_GPR(OFFSET) \
__asm__ volatile ("mov x19, #0\n" ::: "x19"); \
__asm__ volatile ("mov x20, #0\n" ::: "x20"); \
PREPARE_SRC_AND_PTR (OFFSET)
#define PREPARE_VECTOR_REG(OFFSET) \
__asm__ volatile ("movi v22.2d, #0\n" ::: "v22"); \
PREPARE_SRC_AND_PTR (OFFSET)
int
main (void)
{
alignas (16) char src[BUF_SIZE];
PREPARE_GPR (0);
/* Before ldiapp-0. */
__asm__ volatile ("ldiapp x19, x20, [x21]\n" : : : "x19", "x20", "memory");
/* After ldiapp-0. */
PREPARE_GPR (0);
/* Before ldiapp-1. */
__asm__ volatile ("ldiapp w19, w20, [x21]\n" : : : "x19", "x20", "memory");
/* After ldiapp-1. */
PREPARE_GPR (0);
/* Before ldiapp-2. */
__asm__ volatile ("ldiapp x19, x20, [x21], #16\n"
:
:
: "x19", "x20", "x21", "memory");
/* After ldiapp-2. */
PREPARE_GPR (0);
/* Before ldiapp-3. */
__asm__ volatile ("ldiapp w19, w20, [x21], #8\n"
:
:
: "x19", "x20", "x21", "memory");
/* After ldiapp-3. */
/* Register overlap between source and destination registers. Since there is
no offset, writeback is disabled. */
PREPARE_GPR (0);
/* Before ldiapp-4. */
__asm__ volatile ("ldiapp x21, x20, [x21]\n" : : : "x20", "x21", "memory");
/* After ldiapp-4. */
PREPARE_GPR (0);
/* Before ldiapp-5. */
__asm__ volatile ("ldiapp w21, w20, [x21]\n" : : : "x20", "x21", "memory");
/* After ldiapp-5. */
PREPARE_GPR (0);
/* Before stilp-0. */
__asm__ volatile ("stilp x19, x20, [x21]\n" : : : "memory");
/* After stilp-0. */
PREPARE_GPR (0);
/* Before stilp-1. */
__asm__ volatile ("stilp w19, w20, [x21]\n" : : : "memory");
/* After stilp-1. */
PREPARE_GPR (16);
/* Before stilp-2. */
__asm__ volatile ("stilp x19, x20, [x21, #-16]!\n" : : : "x21", "memory");
/* After stilp-2. */
PREPARE_GPR (8);
/* Before stilp-3. */
__asm__ volatile ("stilp w19, w20, [x21, #-8]!\n" : : : "x21", "memory");
/* After stilp-3. */
/* Register overlap. Since there is no offset, writeback is disabled. */
PREPARE_GPR (0);
/* Before stilp-4. */
__asm__ volatile ("stilp x21, x20, [x21]\n" : : : "memory");
/* After stilp-4. */
PREPARE_GPR (0);
/* Before stilp-5. */
__asm__ volatile ("stilp w21, w20, [x21]\n" : : : "memory");
/* After stilp-5. */
PREPARE_GPR (0);
/* Before ldapr-0. */
__asm__ volatile ("ldapr x19, [x21], #8\n" : : : "x19", "x21", "memory");
/* After ldapr-0. */
PREPARE_GPR (0);
/* Before ldapr-1. */
__asm__ volatile ("ldapr w19, [x21], #4\n" : : : "x19", "x21", "memory");
/* After ldapr-1. */
PREPARE_GPR (8);
/* Before stlr-0. */
__asm__ volatile ("stlr x19, [x21, #-8]!\n" : : : "x21", "memory");
/* After stlr-0. */
PREPARE_GPR (4);
/* Before stlr-1. */
__asm__ volatile ("stlr w19, [x21, #-4]!\n" : : : "x21", "memory");
/* After stlr-1. */
PREPARE_VECTOR_REG (0);
/* Before ldap1-0. */
__asm__ volatile ("ldap1 {v22.d}[0], [x21]\n" : : : "v22", "memory");
/* After ldap1-0. */
PREPARE_VECTOR_REG (0);
/* Before stl1-0. */
__asm__ volatile ("stl1 {v22.d}[0], [x21]\n" : : : "memory");
/* After stl1-0. */
PREPARE_VECTOR_REG (0);
/* Before ldapur-0. */
__asm__ volatile ("ldapur d22, [x21]\n" : : : "v22", "memory");
/* After ldapur-0. */
PREPARE_VECTOR_REG (0);
/* Before stlur-0. */
__asm__ volatile ("stlur d22, [x21]\n" : : : "memory");
/* After stlur-0. */
PREPARE_VECTOR_REG (256);
/* Before ldapur-1. */
__asm__ volatile ("ldapur d22, [x21, #-256]\n" : : : "v22", "memory");
/* After ldapur-1. */
PREPARE_VECTOR_REG (256);
/* Before stlur-1. */
__asm__ volatile ("stlur d22, [x21, #-256]\n" : : : "memory");
/* After stlur-1. */
PREPARE_VECTOR_REG (-255);
/* Before ldapur-2. */
__asm__ volatile ("ldapur d22, [x21, #255]\n" : : : "v22", "memory");
/* After ldapur-2. */
PREPARE_VECTOR_REG (-255);
/* Before stlur-2. */
__asm__ volatile ("stlur d22, [x21, #255]\n" : : : "memory");
/* After stlur-2. */
PREPARE_VECTOR_REG (0);
/* Before ldapur-3. */
__asm__ volatile ("ldapur h22, [x21]\n" : : : "v22", "memory");
/* After ldapur-3. */
PREPARE_VECTOR_REG (0);
/* Before stlur-3. */
__asm__ volatile ("stlur h22, [x21]\n" : : : "memory");
/* After stlur-3. */
PREPARE_VECTOR_REG (0);
/* Before ldapur-4. */
__asm__ volatile ("ldapur s22, [x21]\n" : : : "v22", "memory");
/* After ldapur-4. */
PREPARE_VECTOR_REG (0);
/* Before stlur-4. */
__asm__ volatile ("stlur s22, [x21]\n" : : : "memory");
/* After stlur-4. */
PREPARE_VECTOR_REG (0);
/* Before ldapur-5. */
__asm__ volatile ("ldapur d22, [x21]\n" : : : "v22", "memory");
/* After ldapur-5. */
PREPARE_VECTOR_REG (0);
/* Before stlur-5. */
__asm__ volatile ("stlur d22, [x21]\n" : : : "memory");
/* After stlur-5. */
PREPARE_VECTOR_REG (0);
/* Before ldapur-6. */
__asm__ volatile ("ldapur q22, [x21]\n" : : : "v22", "memory");
/* After ldapur-6. */
PREPARE_VECTOR_REG (0);
/* Before stlur-6. */
__asm__ volatile ("stlur q22, [x21]\n" : : : "memory");
/* After stlur-6. */
return 0;
}