blob: 76e453df2c93aeb5de4ff195b4987e491e3eb13e [file] [log] [blame]
/* { dg-do run } */
#include <stdio.h>
/* Test A/L, B/H, C, D, d, e, f, g operand modifiers on 32-bit, 64-bit and,
where appropriate, 16-bit values. */
#define MEM16_VAL 0x2345
#define MEM32_VAL 0x89abcdef
#define MEM64_VAL 0xfedcba9876543210
#define CONST16_VAL 0xbcde
#define CONST32_VAL 0x99aabbcc
#define CONST64_VAL 0x8899aabbccddeeff
#define REG32_VAL 0x12345678
#define REG64_VAL 0x123456789abcdef
volatile unsigned long mem16 = MEM16_VAL;
volatile unsigned long mem32 = MEM32_VAL;
volatile unsigned long long mem64 = MEM64_VAL;
unsigned int word0, word1, word2, word3;
unsigned char byte0, byte1, byte2, byte3, byte4, byte5, byte6, byte7;
#define CHECK_BYTES_IN_16BIT_VAL(VAL) \
if (byte0 != ((unsigned char)VAL) \
|| byte1 != ((unsigned char)(VAL >> 8))) \
return 1;
#define CHECK_WORDS_IN_32BIT_VAL(VAL) \
if (word0 != ((unsigned)VAL) \
|| word1 != ((unsigned)(VAL >> 16))) \
return 1;
#define CHECK_WORDS_IN_64BIT_VAL(VAL) \
if (word0 != ((unsigned)VAL) \
|| word1 != ((unsigned)(VAL >> 16)) \
|| word2 != ((unsigned)(VAL >> 32)) \
|| word3 != ((unsigned)(VAL >> 48))) \
return 1;
#define CHECK_BYTES_IN_32BIT_VAL(VAL) \
if (byte0 != ((unsigned char)VAL) \
|| byte1 != ((unsigned char)(VAL >> 8)) \
|| byte2 != ((unsigned char)(VAL >> 16)) \
|| byte3 != ((unsigned char)(VAL >> 24))) \
return 1;
#define CHECK_BYTES_IN_64BIT_VAL(VAL) \
if (byte0 != ((unsigned char)VAL) \
|| byte1 != ((unsigned char)(VAL >> 8)) \
|| byte2 != ((unsigned char)(VAL >> 16)) \
|| byte3 != ((unsigned char)(VAL >> 24)) \
|| byte4 != ((unsigned char)(VAL >> 32)) \
|| byte5 != ((unsigned char)(VAL >> 40)) \
|| byte6 != ((unsigned char)(VAL >> 48)) \
|| byte7 != ((unsigned char)(VAL >> 56))) \
return 1;
int
main (void)
{
unsigned long register reg32 = REG32_VAL;
unsigned long long register reg64 = REG64_VAL;
/* *** MEMORY OPERAND TESTS *** */
/* Test byte extraction of a 16-bit value. */
__asm__("mov.b %A1, %0\n" : "=m" (byte0) : "m" (mem16));
__asm__("mov.b %d1, %0\n" : "=m" (byte1) : "m" (mem16));
CHECK_BYTES_IN_16BIT_VAL (MEM16_VAL);
/* Test extraction of high and low words from 32-bit value. */
__asm__("mov %A1, %0\n" : "=m" (word0) : "m" (mem32));
__asm__("mov %B1, %0\n" : "=m" (word1) : "m" (mem32));
CHECK_WORDS_IN_32BIT_VAL (MEM32_VAL);
/* Test extraction of each word of a 64-bit value. */
__asm__("mov %A1, %0\n" : "=m" (word0) : "m" (mem64));
__asm__("mov %B1, %0\n" : "=m" (word1) : "m" (mem64));
__asm__("mov %C1, %0\n" : "=m" (word2) : "m" (mem64));
__asm__("mov %D1, %0\n" : "=m" (word3) : "m" (mem64));
CHECK_WORDS_IN_64BIT_VAL (MEM64_VAL);
/* Test extraction of each byte of a 32-bit value. */
__asm__("mov.b %A1, %0\n" : "=m" (byte0) : "m" (mem32));
__asm__("mov.b %d1, %0\n" : "=m" (byte1) : "m" (mem32));
__asm__("mov.b %B1, %0\n" : "=m" (byte2) : "m" (mem32));
__asm__("mov.b %e1, %0\n" : "=m" (byte3) : "m" (mem32));
CHECK_BYTES_IN_32BIT_VAL (MEM32_VAL);
/* Test extraction of each byte of a 64-bit value. */
__asm__("mov.b %A1, %0\n" : "=m" (byte0) : "m" (mem64));
__asm__("mov.b %d1, %0\n" : "=m" (byte1) : "m" (mem64));
__asm__("mov.b %B1, %0\n" : "=m" (byte2) : "m" (mem64));
__asm__("mov.b %e1, %0\n" : "=m" (byte3) : "m" (mem64));
__asm__("mov.b %C1, %0\n" : "=m" (byte4) : "m" (mem64));
__asm__("mov.b %f1, %0\n" : "=m" (byte5) : "m" (mem64));
__asm__("mov.b %D1, %0\n" : "=m" (byte6) : "m" (mem64));
__asm__("mov.b %g1, %0\n" : "=m" (byte7) : "m" (mem64));
CHECK_BYTES_IN_64BIT_VAL (MEM64_VAL);
/* *** IMMEDIATE OPERAND TESTS *** */
/* Test byte extraction of a 16-bit value. */
__asm__("mov.b %A1, %0\n" : "=m" (byte0) : "i" (CONST16_VAL));
__asm__("mov.b %d1, %0\n" : "=m" (byte1) : "i" (CONST16_VAL));
CHECK_BYTES_IN_16BIT_VAL (CONST16_VAL);
/* Test extraction of high and low words from 32-bit value. */
__asm__("mov %A1, %0\n" : "=m" (word0) : "i" (CONST32_VAL));
__asm__("mov %B1, %0\n" : "=m" (word1) : "i" (CONST32_VAL));
CHECK_WORDS_IN_32BIT_VAL (CONST32_VAL);
/* Test extraction of each word of a 64-bit value. */
__asm__("mov %A1, %0\n" : "=m" (word0) : "i" (CONST64_VAL));
__asm__("mov %B1, %0\n" : "=m" (word1) : "i" (CONST64_VAL));
__asm__("mov %C1, %0\n" : "=m" (word2) : "i" (CONST64_VAL));
__asm__("mov %D1, %0\n" : "=m" (word3) : "i" (CONST64_VAL));
CHECK_WORDS_IN_64BIT_VAL (CONST64_VAL);
/* Test extraction of each byte of a 32-bit value. */
__asm__("mov.b %A1, %0\n" : "=m" (byte0) : "i" (CONST32_VAL));
__asm__("mov.b %d1, %0\n" : "=m" (byte1) : "i" (CONST32_VAL));
__asm__("mov.b %B1, %0\n" : "=m" (byte2) : "i" (CONST32_VAL));
__asm__("mov.b %e1, %0\n" : "=m" (byte3) : "i" (CONST32_VAL));
CHECK_BYTES_IN_32BIT_VAL (CONST32_VAL);
/* Test extraction of each byte of a 64-bit value. */
__asm__("mov.b %A1, %0\n" : "=m" (byte0) : "i" (CONST64_VAL));
__asm__("mov.b %d1, %0\n" : "=m" (byte1) : "i" (CONST64_VAL));
__asm__("mov.b %B1, %0\n" : "=m" (byte2) : "i" (CONST64_VAL));
__asm__("mov.b %e1, %0\n" : "=m" (byte3) : "i" (CONST64_VAL));
__asm__("mov.b %C1, %0\n" : "=m" (byte4) : "i" (CONST64_VAL));
__asm__("mov.b %f1, %0\n" : "=m" (byte5) : "i" (CONST64_VAL));
__asm__("mov.b %D1, %0\n" : "=m" (byte6) : "i" (CONST64_VAL));
__asm__("mov.b %g1, %0\n" : "=m" (byte7) : "i" (CONST64_VAL));
CHECK_BYTES_IN_64BIT_VAL (CONST64_VAL);
/* *** REGISTER OPERAND TESTS *** */
/* No extraction of bytes from a single register. */
/* Test extraction of high and low words from 32-bit value. */
__asm__("mov %A1, %0\n" : "=m" (word0) : "r" (reg32));
__asm__("mov %B1, %0\n" : "=m" (word1) : "r" (reg32));
CHECK_WORDS_IN_32BIT_VAL (REG32_VAL);
/* Test extraction of each word of a 64-bit value. */
__asm__("mov %A1, %0\n" : "=m" (word0) : "r" (reg64));
__asm__("mov %B1, %0\n" : "=m" (word1) : "r" (reg64));
__asm__("mov %C1, %0\n" : "=m" (word2) : "r" (reg64));
__asm__("mov %D1, %0\n" : "=m" (word3) : "r" (reg64));
CHECK_WORDS_IN_64BIT_VAL (REG64_VAL);
return 0;
}