blob: ecba154b9e0441ad59875c2096c860e1d099af0f [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-mmicromips" } */
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 nomips16
.set micromips
.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
.set noreorder
.set nomacro
addiu $3,$4,5
sltu $2,$3,11
beqzc $2,$L2
lui $2,%hi($L4)
addiu $2,$2,%lo($L4)
lwxs $3,$3($2)
jrc $3
.rdata
.align 2
.align 2
$L4:
.word $L3
.word $L2
.word $L9
.word $L2
.word $L2
.word $L8
.word $L2
.word $L2
.word $L7
.word $L2
.word $L8
.text
$L8:
jr $31
move $2,$4
$L9:
jr $31
li $2,-1 # 0xffffffffffffffff
$L3:
jr $31
li $2,-2 # 0xfffffffffffffffe
$L7:
jr $31
li $2,1 # 0x1
$L2:
.insn
.set macro
.set reorder
.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 microMIPS branch target (even though
the branch is never taken. See also insn-casesi.c. */