blob: f5ab6e719f412619d9ee51d4dd5359ed48a74f54 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O -mfp16-format=ieee" } */
/* { dg-require-effective-target arm_v8_1m_mve_ok } */
/* { dg-add-options arm_v8_1m_mve } */
/* { dg-additional-options "-mfloat-abi=hard" } *
/* { dg-final { check-function-bodies "**" "" } } */
/*
** r_w:
** vmov.f16 r0, s0 @ __fp16
** bx lr
*/
void
r_w (_Float16 s0)
{
register _Float16 r0 asm ("r0");
r0 = s0;
asm volatile ("" :: "r" (r0));
}
/*
** w_r:
** vmov.f16 s0, r0 @ __fp16
** bx lr
*/
_Float16
w_r ()
{
register _Float16 r0 asm ("r0");
asm volatile ("" : "=r" (r0));
return r0;
}
/*
** w_w:
** vmov s1, s0 @ __fp16
** bx lr
*/
void
w_w (_Float16 s0)
{
register _Float16 s1 asm ("s1");
s1 = s0;
asm volatile ("" :: "w" (s1));
}
/*
** r_m_m128:
** sub (r[0-9]+), r0, #256
** ldrh r1, \[\1\] @ __fp16
** bx lr
*/
void
r_m_m128 (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
r1 = r0[-128];
asm volatile ("" :: "r" (r1));
}
/*
** r_m_m127:
** ldrh r1, \[r0, #-254\] @ __fp16
** bx lr
*/
void
r_m_m127 (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
r1 = r0[-127];
asm volatile ("" :: "r" (r1));
}
/*
** r_m_m1:
** ldrh r1, \[r0, #-2\] @ __fp16
** bx lr
*/
void
r_m_m1 (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
r1 = r0[-1];
asm volatile ("" :: "r" (r1));
}
/*
** r_m_0:
** ldrh r1, \[r0\] @ __fp16
** bx lr
*/
void
r_m_0 (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
r1 = r0[0];
asm volatile ("" :: "r" (r1));
}
/*
** r_m_1:
** ldrh r1, \[r0, #2\] @ __fp16
** bx lr
*/
void
r_m_1 (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
r1 = r0[1];
asm volatile ("" :: "r" (r1));
}
/*
** r_m_255:
** ldrh r1, \[r0, #510\] @ __fp16
** bx lr
*/
void
r_m_255 (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
r1 = r0[255];
asm volatile ("" :: "r" (r1));
}
/*
** r_m_256:
** ldrh r1, \[r0, #512\] @ __fp16
** bx lr
*/
void
r_m_256 (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
r1 = r0[256];
asm volatile ("" :: "r" (r1));
}
/* ??? This could be done in one instruction, but without mve.fp,
it makes more sense for memory_operand to enforce the GPR range. */
/*
** w_m_m128:
** sub (r[0-9]+), r0, #256
** vldr.16 s0, \[\1\]
** bx lr
*/
void
w_m_m128 (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
s0 = r0[-128];
asm volatile ("" :: "w" (s0));
}
/*
** w_m_m127:
** vldr.16 s0, \[r0, #-254\]
** bx lr
*/
void
w_m_m127 (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
s0 = r0[-127];
asm volatile ("" :: "w" (s0));
}
/*
** w_m_m1:
** vldr.16 s0, \[r0, #-2\]
** bx lr
*/
void
w_m_m1 (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
s0 = r0[-1];
asm volatile ("" :: "w" (s0));
}
/*
** w_m_0:
** vldr.16 s0, \[r0\]
** bx lr
*/
void
w_m_0 (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
s0 = r0[0];
asm volatile ("" :: "w" (s0));
}
/*
** w_m_1:
** vldr.16 s0, \[r0, #2\]
** bx lr
*/
void
w_m_1 (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
s0 = r0[1];
asm volatile ("" :: "w" (s0));
}
/*
** w_m_255:
** vldr.16 s0, \[r0, #510\]
** bx lr
*/
void
w_m_255 (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
s0 = r0[255];
asm volatile ("" :: "w" (s0));
}
/*
** w_m_256:
** add (r[0-9]+), r0, #512
** vldr.16 s0, \[\1\]
** bx lr
*/
void
w_m_256 (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
s0 = r0[256];
asm volatile ("" :: "w" (s0));
}
/*
** m_m128_r:
** sub (r[0-9]+), r0, #256
** strh r1, \[\1\] @ __fp16
** bx lr
*/
void
m_m128_r (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
asm volatile ("" : "=r" (r1));
r0[-128] = r1;
}
/*
** m_m127_r:
** strh r1, \[r0, #-254\] @ __fp16
** bx lr
*/
void
m_m127_r (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
asm volatile ("" : "=r" (r1));
r0[-127] = r1;
}
/*
** m_m1_r:
** strh r1, \[r0, #-2\] @ __fp16
** bx lr
*/
void
m_m1_r (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
asm volatile ("" : "=r" (r1));
r0[-1] = r1;
}
/*
** m_0_r:
** strh r1, \[r0\] @ __fp16
** bx lr
*/
void
m_0_r (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
asm volatile ("" : "=r" (r1));
r0[0] = r1;
}
/*
** m_1_r:
** strh r1, \[r0, #2\] @ __fp16
** bx lr
*/
void
m_1_r (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
asm volatile ("" : "=r" (r1));
r0[1] = r1;
}
/*
** m_255_r:
** strh r1, \[r0, #510\] @ __fp16
** bx lr
*/
void
m_255_r (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
asm volatile ("" : "=r" (r1));
r0[255] = r1;
}
/*
** m_256_r:
** strh r1, \[r0, #512\] @ __fp16
** bx lr
*/
void
m_256_r (_Float16 *r0)
{
register _Float16 r1 asm ("r1");
asm volatile ("" : "=r" (r1));
r0[256] = r1;
}
/* ??? This could be done in one instruction, but without mve.fp,
it makes more sense for memory_operand to enforce the GPR range. */
/*
** m_m128_w:
** sub (r[0-9]+), r0, #256
** vstr.16 s0, \[\1\]
** bx lr
*/
void
m_m128_w (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
asm volatile ("" : "=w" (s0));
r0[-128] = s0;
}
/*
** m_m127_w:
** vstr.16 s0, \[r0, #-254\]
** bx lr
*/
void
m_m127_w (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
asm volatile ("" : "=w" (s0));
r0[-127] = s0;
}
/*
** m_m1_w:
** vstr.16 s0, \[r0, #-2\]
** bx lr
*/
void
m_m1_w (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
asm volatile ("" : "=w" (s0));
r0[-1] = s0;
}
/*
** m_0_w:
** vstr.16 s0, \[r0\]
** bx lr
*/
void
m_0_w (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
asm volatile ("" : "=w" (s0));
r0[0] = s0;
}
/*
** m_1_w:
** vstr.16 s0, \[r0, #2\]
** bx lr
*/
void
m_1_w (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
asm volatile ("" : "=w" (s0));
r0[1] = s0;
}
/*
** m_255_w:
** vstr.16 s0, \[r0, #510\]
** bx lr
*/
void
m_255_w (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
asm volatile ("" : "=w" (s0));
r0[255] = s0;
}
/*
** m_256_w:
** add (r[0-9]+), r0, #512
** vstr.16 s0, \[\1\]
** bx lr
*/
void
m_256_w (_Float16 *r0)
{
register _Float16 s0 asm ("s0");
asm volatile ("" : "=w" (s0));
r0[256] = s0;
}