57 lines
986 B
C
57 lines
986 B
C
// Check that the 3.1 named operand syntax can be used in template functions.
|
|
|
|
struct arg1 {
|
|
int value;
|
|
static const int info = 99;
|
|
};
|
|
|
|
struct arg2 {
|
|
int value;
|
|
static const int info = 11;
|
|
};
|
|
|
|
template<int j>
|
|
int foo (void)
|
|
{
|
|
int i;
|
|
asm ("# foo on %[third] %[second] %[fourth] %[first]"
|
|
: [first] "=r" (i)
|
|
: [second] "i" (j),
|
|
[third] "i" (j + 2),
|
|
[fourth] "i" (100));
|
|
return i;
|
|
}
|
|
|
|
template<class TYPE>
|
|
TYPE bar (TYPE t)
|
|
{
|
|
asm ("# bar on %[first] %[second] %[third]"
|
|
: [first] "=r" (t.value)
|
|
: [second] "i[first]" (t.value),
|
|
[third] "i" (t.info));
|
|
return t;
|
|
}
|
|
|
|
template<class TYPE>
|
|
struct S {
|
|
static void frob (TYPE t)
|
|
{
|
|
asm ("# frob on %[arg]" :: [arg] "i" (t.info));
|
|
}
|
|
};
|
|
|
|
void test ()
|
|
{
|
|
arg1 x;
|
|
arg2 y;
|
|
|
|
foo<42> ();
|
|
bar (x);
|
|
bar (y);
|
|
S<arg1>::frob (x);
|
|
}
|
|
|
|
// { dg-final { scan-assembler "foo on" } }
|
|
// { dg-final { scan-assembler "bar on" } }
|
|
// { dg-final { scan-assembler "frob on" } }
|