blob: 5a556b08ed15679b25676a11fe9c7a64641ee671 [file] [log] [blame]
/* { dg-do compile } */
/* -Os to create jump table. */
/* { dg-options "-Os" } */
/* { dg-require-effective-target lp64 } */
/* If configured with --enable-standard-branch-protection, don't use
command line option. */
/* { dg-additional-options "-mbranch-protection=standard" { target { ! default_branch_protection } } } */
extern int f1 (void);
extern int f2 (void);
extern int f3 (void);
extern int f4 (void);
extern int f5 (void);
extern int f6 (void);
extern int f7 (void);
extern int f8 (void);
extern int f9 (void);
extern int f10 (void);
int (*ptr) (void);
int
f_jump_table (int y, int n)
{
int i;
for (i = 0; i < n ;i ++)
{
switch (y)
{
case 0 : ptr = f1; break;
case 1 : ptr = f2; break;
case 2 : ptr = f3; break;
case 3 : ptr = f4; break;
case 4 : ptr = f5; break;
case 5 : ptr = f6; break;
case 6 : ptr = f7; break;
case 7 : ptr = f8; break;
case 8 : ptr = f9; break;
case 9 : ptr = f10; break;
default: break;
}
y += ptr ();
}
return (y == 0)? y+1:4;
}
/* f_jump_table should have PACIASP and AUTIASP. */
/* { dg-final { scan-assembler-times "hint\t25" 1 } } */
/* { dg-final { scan-assembler-times "hint\t29" 1 } } */
int
f_label_address ()
{
static void * addr = &&lab1;
goto *addr;
lab1:
addr = &&lab2;
return 1;
lab2:
addr = &&lab1;
return 2;
}
/* { dg-final { scan-assembler-times "hint\t34" 1 } } */
/* { dg-final { scan-assembler-times "hint\t36" 12 } } */
/* { dg-final { scan-assembler ".note.gnu.property" { target *-*-linux* } } } */