blob: 2b4c9f21986fab07ae9524b5e51c8a4ccbc1d092 [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-mips16 -mcode-readable=yes" } */
int __attribute__ ((noinline))
frob (int i)
{
switch (i)
{
case -5:
return -2;
case -3:
return -1;
case 0:
return 0;
case 3:
return 1;
case 5:
break;
default:
__builtin_unreachable ();
}
return i;
}
int
main (int argc, char **argv)
{
asm ("" : "+r" (argc));
argc = frob ((argc & 10) - 5);
asm ("" : "+r" (argc));
return !argc;
}
/* This will result in assembly like:
.text
.align 2
.globl frob
.set mips16
.set nomicromips
.ent frob
.type frob, @function
frob:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
addiu $2,$4,5
sltu $2,11
bteqz $L2
sll $3,$2,1
la $2,$L4
addu $3,$2,$3
lh $3,0($3)
addu $2,$2,$3
j $2
.align 1
.align 2
$L4:
.half $L3-$L4
.half $L2-$L4
.half $L9-$L4
.half $L2-$L4
.half $L2-$L4
.half $L8-$L4
.half $L2-$L4
.half $L2-$L4
.half $L7-$L4
.half $L2-$L4
.half $L8-$L4
$L8:
.set noreorder
.set nomacro
jr $31
move $2,$4
.set macro
.set reorder
$L9:
li $2,1
.set noreorder
.set nomacro
jr $31
neg $2,$2
.set macro
.set reorder
$L3:
li $2,2
.set noreorder
.set nomacro
jr $31
neg $2,$2
.set macro
.set reorder
$L7:
.set noreorder
.set nomacro
jr $31
li $2,1
.set macro
.set reorder
$L2:
.insn
.end frob
.size frob, .-frob
for `frob' and we want to make sure it links correctly owing to the
`.insn' pseudo-op which needs to be there at `$L2' as there's no
code following and the label is a MIPS16 branch target (even though
the branch is never taken. See also insn-tablejump.c. */