/* { 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. */