; This testcase is part of GDB, the GNU debugger.

; Copyright 2017-2021 Free Software Foundation, Inc.

; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program.  If not, see <http://www.gnu.org/licenses/>.

.section .text
.global main

#define TEST_J
#define TEST_JCC
#define TEST_JL
#define TEST_JLCC
#define TEST_B
#define TEST_BBIT
#define TEST_BCC
#define TEST_BI
#define TEST_BL
#define TEST_BRCC
#define TEST_JLI
#define TEST_LEAVE_S
#define TEST_LPCC

; JLI-specific stuff
#ifdef TEST_JLI
jli_table:
    .word 0xdeadbeea
    .word 0xdeadbeea
jli_target:
    .word 0xdeadbeea
    .word 0xdeadbeea

.set jli_offset, 3
#endif
main:

; Each test case requires several symbols to be set, that identify expected
; parameters of this instruction.  Required symbols:
;   ${test}_start: symbol points to start of the test
;   ${test}_end: symbol points to the instruction after the jump/branch
;      instruction.
;   ${test}_target: branch target address.
;   ${test}_has_delay_slot: whether instruction has delay slot.
;   ${test}_cc: condition code numeric value.

    .set r12_value, 0xdead0000
    .set blink_value, 0xdead0004
    .set limm_value, 0xdead0008
    ; Just an integer
    .set r4_value, 0xdead000c
    ; Just an integer
    .set r5_value, 0xdead0010
    ; offset index for BI [c]
    .set r7_value, 4
    .set u6_value, 0x20
    .set s12_target, 0x100

    mov r12, @r12_value
    mov r4, @r4_value
    mov r5, @r5_value
    mov r7, @r7_value
    mov blink, @blink_value
#ifdef TEST_JLI
    ; jli_base aux regnum = 0x290
    sr jli_table, [0x290]
#endif

start_branch_tests:

#ifdef TEST_J

#define TEST_NAME j_c
    ; j [c]
    .set j_c_target, @r4_value
    .set j_c_has_delay_slot,   0
    .set j_c_cc, 0
    j_c_start:
	j [r4]
    j_c_end:

    ; j [blink]
    .set j_blink_target, @blink_value
    .set j_blink_has_delay_slot,   0
    .set j_blink_cc, 0
    mov blink, @j_blink_target
    j_blink_start:
	j [blink]
    j_blink_end:

    ; j limm
    .set j_limm_target, @limm_value
    .set j_limm_has_delay_slot,   0
    .set j_limm_cc, 0
    j_limm_start:
	j @j_limm_target
    j_limm_end:

    ; j u6
    .set j_u6_target, @u6_value
    .set j_u6_has_delay_slot,   0
    .set j_u6_cc, 0
    j_u6_start:
	j @j_u6_target
    j_u6_end:

    ; j s12
    .set j_s12_target, @s12_target
    .set j_s12_has_delay_slot,   0
    .set j_s12_cc, 0
    j_s12_start:
	j @j_s12_target
    j_s12_end:

    ; j.d [c]
    .set j_d_c_target, @r4_value
    .set j_d_c_has_delay_slot,   1
    .set j_d_c_cc, 0
    j_d_c_start:
	j.d [r4]
    j_d_c_end:
	nop_s

    ; j.d [blink]
    .set j_d_blink_target, @blink_value
    .set j_d_blink_has_delay_slot,   1
    .set j_d_blink_cc, 0
    j_d_blink_start:
	j.d [blink]
    j_d_blink_end:
	nop_s

    ; j.d u6
    .set j_d_u6_target, @u6_value
    .set j_d_u6_has_delay_slot,   1
    .set j_d_u6_cc, 0
    j_d_u6_start:
	j.d @j_d_u6_target
    j_d_u6_end:
	nop_s

    ; j.d s12
    .set j_d_s12_target, @s12_target
    .set j_d_s12_has_delay_slot,   1
    .set j_d_s12_cc, 0
    j_d_s12_start:
	j.d @j_d_s12_target
    j_d_s12_end:
	nop_s

    ; j_s [b]
    .set j_s_b_target, @r12_value
    .set j_s_b_has_delay_slot,   0
    .set j_s_b_cc, 0
    j_s_b_start:
	j_s [r12]
    j_s_b_end:

    ; j_s.d [b]
    .set j_s_d_b_target, @r12_value
    .set j_s_d_b_has_delay_slot,   1
    .set j_s_d_b_cc, 0
    j_s_d_b_start:
	j_s.d [r12]
    j_s_d_b_end:
	nop_s

    ; j_s [blink]
    .set j_s_blink_target, @blink_value
    .set j_s_blink_has_delay_slot,   0
    .set j_s_blink_cc, 0
    j_s_blink_start:
	j_s [blink]
    j_s_blink_end:

    ; j_s.d [blink]
    .set j_s_d_blink_target, @blink_value
    .set j_s_d_blink_has_delay_slot,   1
    .set j_c_cc, 0
    j_s_d_blink_start:
	j_s.d [blink]
    j_s_d_blink_end:
	nop_s
#endif /* TEST_J */

#ifdef TEST_JCC
    ; jcc [c]
    .set jcc_c_target, @r4_value
    .set jcc_c_has_delay_slot,   0
    .set jcc_c_cc, 1
    jcc_c_start:
	jeq [r4]
    jcc_c_end:

    ; jcc [blink]
    .set jcc_blink_target, @blink_value
    .set jcc_blink_has_delay_slot,   0
    .set jcc_blink_cc, 2
    jcc_blink_start:
	jnz [blink]
    jcc_blink_end:

    ; jcc limm
    .set jcc_limm_target, @limm_value
    .set jcc_limm_has_delay_slot,   0
    .set jcc_limm_cc, 9
    jcc_limm_start:
	jgt @jcc_limm_target
    jcc_limm_end:

    ; jcc u6
    .set jcc_u6_target, @u6_value
    .set jcc_u6_has_delay_slot,   0
    .set jcc_u6_cc, 0xA
    jcc_u6_start:
	jge @jcc_u6_target
    jcc_u6_end:

    ; jcc.d [c]
    .set jcc_d_c_target, @r4_value
    .set jcc_d_c_has_delay_slot,   1
    .set jcc_d_c_cc, 0xB
    jcc_d_c_start:
	jlt.d [r4]
    jcc_d_c_end:
	nop_s

    ; jcc.d [blink]
    .set jcc_d_blink_target, @blink_value
    .set jcc_d_blink_has_delay_slot,   1
    .set jcc_d_blink_cc, 0xC
    jcc_d_blink_start:
	jle.d [blink]
    jcc_d_blink_end:
	nop_s

    ; jcc.d u6
    .set jcc_d_u6_target, @u6_value
    .set jcc_d_u6_has_delay_slot,   1
    .set jcc_d_u6_cc, 0xE
    jcc_d_u6_start:
	jls.d @jcc_d_u6_target
    jcc_d_u6_end:
	nop_s

    ; jeq_s [blink]
    .set jcc_eq_s_blink_target, @blink_value
    .set jcc_eq_s_blink_has_delay_slot,   0
    .set jcc_eq_s_blink_cc, 1
    jcc_eq_s_blink_start:
	jeq_s [blink]
    jcc_eq_s_blink_end:

    ; jne_s [blink]
    .set jcc_ne_s_blink_target, @blink_value
    .set jcc_ne_s_blink_has_delay_slot,   0
    .set jcc_ne_s_blink_cc, 2
    jcc_ne_s_blink_start:
	jne_s [blink]
    jcc_ne_s_blink_end:
#endif /* TEST_JCC */

#ifdef TEST_JL
    ; jl [c]
    .set jl_c_target, @r4_value
    .set jl_c_has_delay_slot,   0
    .set jl_c_cc, 0
    jl_c_start:
	jl [r4]
    jl_c_end:

    ; jl limm
    .set jl_limm_target, @limm_value
    .set jl_limm_has_delay_slot,   0
    .set jl_limm_cc, 0
    jl_limm_start:
	jl @jl_limm_target
    jl_limm_end:

    ; jl u6
    .set jl_u6_target, @u6_value
    .set jl_u6_has_delay_slot,   0
    .set jl_u6_cc, 0
    jl_u6_start:
	jl @jl_u6_target
    jl_u6_end:

    ; jl s12
    .set jl_s12_target, @s12_target
    .set jl_s12_has_delay_slot,   0
    .set jl_s12_cc, 0
    jl_s12_start:
	jl @jl_s12_target
    jl_s12_end:

    ; jl.d [c]
    .set jl_d_c_target, @r4_value
    .set jl_d_c_has_delay_slot,   1
    .set jl_d_c_cc, 0
    jl_d_c_start:
	jl.d [r4]
    jl_d_c_end:
	nop_s

    ; jl.d u6
    .set jl_d_u6_target, @u6_value
    .set jl_d_u6_has_delay_slot,   1
    .set jl_d_u6_cc, 0
    jl_d_u6_start:
	jl.d @jl_d_u6_target
    jl_d_u6_end:
	nop_s

    ; jl.d s12
    .set jl_d_s12_target, @s12_target
    .set jl_d_s12_has_delay_slot,   1
    .set jl_d_s12_cc, 0
    jl_d_s12_start:
	jl.d @jl_d_s12_target
    jl_d_s12_end:
	nop_s

    ; jl_s [b]
    .set jl_s_b_target, @r12_value
    .set jl_s_b_has_delay_slot,   0
    .set jl_s_b_cc, 0
    jl_s_b_start:
	jl_s [r12]
    jl_s_b_end:

    ; jl_s.d [b]
    .set jl_s_d_b_target, @r12_value
    .set jl_s_d_b_has_delay_slot,   1
    .set jl_s_d_b_cc, 0
    jl_s_d_b_start:
	jl_s.d [r12]
    jl_s_d_b_end:
	nop_s
#endif /* TEST_JL */

#ifdef TEST_JLCC
    ; jlcc [c]
    .set jlcc_c_target, @r4_value
    .set jlcc_c_has_delay_slot,   0
    .set jlcc_c_cc, 1
    jlcc_c_start:
	jleq [r4]
    jlcc_c_end:

    ; jlcc limm
    .set jlcc_limm_target, @limm_value
    .set jlcc_limm_has_delay_slot,   0
    .set jlcc_limm_cc, 0x9
    jlcc_limm_start:
	jlgt @jlcc_limm_target
    jlcc_limm_end:

    ; jlcc u6
    .set jlcc_u6_target, @u6_value
    .set jlcc_u6_has_delay_slot,   0
    .set jlcc_u6_cc, 0xA
    jlcc_u6_start:
	jlge @jlcc_u6_target
    jlcc_u6_end:

    ; jlcc.d [c]
    .set jlcc_d_c_target, @r4_value
    .set jlcc_d_c_has_delay_slot,   1
    .set jlcc_d_c_cc, 0xB
    jlcc_d_c_start:
	jllt.d [r4]
    jlcc_d_c_end:
	nop_s

    ; jlcc.d u6
    .set jlcc_d_u6_target, @u6_value
    .set jlcc_d_u6_has_delay_slot,   1
    .set jlcc_d_u6_cc, 0xE
    jlcc_d_u6_start:
	jlls.d @jlcc_d_u6_target
    jlcc_d_u6_end:
	nop_s
#endif /* TEST_JLCC */

#ifdef TEST_B
.Lb_target:
    ; Artifical nop, so that first b will not branch to itself.
    nop_s
    ; b s25
    .set b_s25_target, @.Lb_target
    .set b_s25_has_delay_slot,   0
    .set b_s25_cc, 0
    b_s25_start:
	b @b_s25_target
    b_s25_end:

    ; b.d s25
    .set b_d_s25_target, @.Lb_target
    .set b_d_s25_has_delay_slot,   1
    .set b_d_s25_cc, 0
    b_d_s25_start:
	b.d @b_d_s25_target
    b_d_s25_end:
	nop_s

    ; b_s s10
    .set b_s_s10_target, @.Lb_target
    .set b_s_s10_has_delay_slot,   0
    .set b_s_s10_cc, 0
    b_s_s10_start:
	b_s @b_s_s10_target
    b_s_s10_end:
#endif /* TEST_B */

#ifdef TEST_BBIT

; Due to specifics of bbit implementation in assembler, only local symbols can
; be used as a branch targets for bbit and brcc.
; bbits and brcc don't have condition code set to anything.
.Lbbit_target:
    nop_s

    ; bbit0.nt b,c,s9
    .set bbit0_nt_b_c_s9_target, @.Lbbit_target
    .set bbit0_nt_b_c_s9_has_delay_slot,   0
    .set bbit0_nt_b_c_s9_cc, 0
    bbit0_nt_b_c_s9_start:
	bbit0.nt r4,r5,@bbit0_nt_b_c_s9_target
    bbit0_nt_b_c_s9_end:

    ; bbit0.d.nt b,c,s9
    .set bbit0_d_nt_b_c_s9_target, @.Lbbit_target
    .set bbit0_d_nt_b_c_s9_has_delay_slot,   1
    .set bbit0_d_nt_b_c_s9_cc, 0
    bbit0_d_nt_b_c_s9_start:
	bbit0.d.nt r4,r5,@.Lbbit_target
    bbit0_d_nt_b_c_s9_end:
	nop_s

    ; bbit0.t b,c,s9
    .set bbit0_t_b_c_s9_target, @.Lbbit_target
    .set bbit0_t_b_c_s9_has_delay_slot,   0
    .set bbit0_t_b_c_s9_cc, 0
    bbit0_t_b_c_s9_start:
	bbit0.t r4,r5,@.Lbbit_target
    bbit0_t_b_c_s9_end:

    ; bbit0.d.t b,c,s9
    .set bbit0_d_t_b_c_s9_target, @.Lbbit_target
    .set bbit0_d_t_b_c_s9_has_delay_slot,   1
    .set bbit0_d_t_b_c_s9_cc, 0
    bbit0_d_t_b_c_s9_start:
	bbit0.d.t r4,r5,@.Lbbit_target
    bbit0_d_t_b_c_s9_end:
	nop_s

    ; bbit0.nt b,u6,s9
    .set bbit0_nt_b_u6_s9_target, @.Lbbit_target
    .set bbit0_nt_b_u6_s9_has_delay_slot,   0
    .set bbit0_nt_b_u6_s9_cc, 0
    bbit0_nt_b_u6_s9_start:
	bbit0.nt r4,u6_value,@.Lbbit_target
    bbit0_nt_b_u6_s9_end:

    ; bbit0.d.nt b,u6,s9
    .set bbit0_d_nt_b_u6_s9_target, @.Lbbit_target
    .set bbit0_d_nt_b_u6_s9_has_delay_slot,   1
    .set bbit0_d_nt_b_u6_s9_cc, 0
    bbit0_d_nt_b_u6_s9_start:
	bbit0.d.nt r4,u6_value,@.Lbbit_target
    bbit0_d_nt_b_u6_s9_end:
	nop_s

    ; bbit0.nt b,u6,s9
    .set bbit0_t_b_u6_s9_target, @.Lbbit_target
    .set bbit0_t_b_u6_s9_has_delay_slot,   0
    .set bbit0_t_b_u6_s9_cc, 0
    bbit0_t_b_u6_s9_start:
	bbit0.t r4,u6_value,@.Lbbit_target
    bbit0_t_b_u6_s9_end:

    ; bbit0.d.nt b,u6,s9
    .set bbit0_d_t_b_u6_s9_target, @.Lbbit_target
    .set bbit0_d_t_b_u6_s9_has_delay_slot,   1
    .set bbit0_d_t_b_u6_s9_cc, 0
    bbit0_d_t_b_u6_s9_start:
	bbit0.d.t r4,u6_value,@.Lbbit_target
    bbit0_d_t_b_u6_s9_end:
	nop_s

    ; bbit0.nt b,limm,s9
    .set bbit0_nt_b_limm_s9_target, @.Lbbit_target
    .set bbit0_nt_b_limm_s9_has_delay_slot,   0
    .set bbit0_nt_b_limm_s9_cc, 0
    bbit0_nt_b_limm_s9_start:
	bbit0.nt r4,limm_value,@.Lbbit_target
    bbit0_nt_b_limm_s9_end:

    ; bbit0.t b,limm,s9
    .set bbit0_t_b_limm_s9_target, @.Lbbit_target
    .set bbit0_t_b_limm_s9_has_delay_slot,   0
    .set bbit0_t_b_limm_s9_cc, 0
    bbit0_t_b_limm_s9_start:
	bbit0.t r4,limm_value,@.Lbbit_target
    bbit0_t_b_limm_s9_end:

    ; bbit0.nt limm,c,s9
    .set bbit0_nt_limm_c_s9_target, @.Lbbit_target
    .set bbit0_nt_limm_c_s9_has_delay_slot,   0
    .set bbit0_nt_limm_c_s9_cc, 0
    bbit0_nt_limm_c_s9_start:
	bbit0.nt limm_value,r4,@.Lbbit_target
    bbit0_nt_limm_c_s9_end:

    ; bbit0.t limm,c,s9
    .set bbit0_t_limm_c_s9_target, @.Lbbit_target
    .set bbit0_t_limm_c_s9_has_delay_slot,   0
    .set bbit0_t_limm_c_s9_cc, 0
    bbit0_t_limm_c_s9_start:
	bbit0.t limm_value,r4,@.Lbbit_target
    bbit0_t_limm_c_s9_end:

    ; bbit0.nt limm,u6,s9
    .set bbit0_nt_limm_u6_s9_target, @.Lbbit_target
    .set bbit0_nt_limm_u6_s9_has_delay_slot,   0
    .set bbit0_nt_limm_u6_s9_cc, 0
    bbit0_nt_limm_u6_s9_start:
	bbit0.nt limm_value,u6_value,@.Lbbit_target
    bbit0_nt_limm_u6_s9_end:

    ; bbit0.t limm,u6,s9
    .set bbit0_t_limm_u6_s9_target, @.Lbbit_target
    .set bbit0_t_limm_u6_s9_has_delay_slot,   0
    .set bbit0_t_limm_u6_s9_cc, 0
    bbit0_t_limm_u6_s9_start:
	bbit0.t limm_value,u6_value,@.Lbbit_target
    bbit0_t_limm_u6_s9_end:

    ; bbit1.nt b,c,s9
    .set bbit1_nt_b_c_s9_target, @.Lbbit_target
    .set bbit1_nt_b_c_s9_has_delay_slot,   0
    .set bbit1_nt_b_c_s9_cc, 0
    bbit1_nt_b_c_s9_start:
	bbit1.nt r4,r5,@.Lbbit_target
    bbit1_nt_b_c_s9_end:

    ; bbit1.d.nt b,c,s9
    .set bbit1_d_nt_b_c_s9_target, @.Lbbit_target
    .set bbit1_d_nt_b_c_s9_has_delay_slot,   1
    .set bbit1_d_nt_b_c_s9_cc, 0
    bbit1_d_nt_b_c_s9_start:
	bbit1.d.nt r4,r5,@.Lbbit_target
    bbit1_d_nt_b_c_s9_end:
	nop_s

    ; bbit1.t b,c,s9
    .set bbit1_t_b_c_s9_target, @.Lbbit_target
    .set bbit1_t_b_c_s9_has_delay_slot,   0
    .set bbit1_t_b_c_s9_cc, 0
    bbit1_t_b_c_s9_start:
	bbit1.t r4,r5,@.Lbbit_target
    bbit1_t_b_c_s9_end:

    ; bbit1.d.t b,c,s9
    .set bbit1_d_t_b_c_s9_target, @.Lbbit_target
    .set bbit1_d_t_b_c_s9_has_delay_slot,   1
    .set bbit1_d_t_b_c_s9_cc, 0
    bbit1_d_t_b_c_s9_start:
	bbit1.d.t r4,r5,@.Lbbit_target
    bbit1_d_t_b_c_s9_end:
	nop_s

    ; bbit1.nt b,u6,s9
    .set bbit1_nt_b_u6_s9_target, @.Lbbit_target
    .set bbit1_nt_b_u6_s9_has_delay_slot,   0
    .set bbit1_nt_b_u6_s9_cc, 0
    bbit1_nt_b_u6_s9_start:
	bbit1.nt r4,u6_value,@.Lbbit_target
    bbit1_nt_b_u6_s9_end:

    ; bbit1.d.nt b,u6,s9
    .set bbit1_d_nt_b_u6_s9_target, @.Lbbit_target
    .set bbit1_d_nt_b_u6_s9_has_delay_slot,   1
    .set bbit1_d_nt_b_u6_s9_cc, 0
    bbit1_d_nt_b_u6_s9_start:
	bbit1.d.nt r4,u6_value,@.Lbbit_target
    bbit1_d_nt_b_u6_s9_end:
	nop_s

    ; bbit1.nt b,u6,s9
    .set bbit1_t_b_u6_s9_target, @.Lbbit_target
    .set bbit1_t_b_u6_s9_has_delay_slot,   0
    .set bbit1_t_b_u6_s9_cc, 0
    bbit1_t_b_u6_s9_start:
	bbit1.t r4,u6_value,@.Lbbit_target
    bbit1_t_b_u6_s9_end:

    ; bbit1.d.nt b,u6,s9
    .set bbit1_d_t_b_u6_s9_target, @.Lbbit_target
    .set bbit1_d_t_b_u6_s9_has_delay_slot,   1
    .set bbit1_d_t_b_u6_s9_cc, 0
    bbit1_d_t_b_u6_s9_start:
	bbit1.d.t r4,u6_value,@.Lbbit_target
    bbit1_d_t_b_u6_s9_end:
	nop_s

    ; bbit1.nt b,limm,s9
    .set bbit1_nt_b_limm_s9_target, @.Lbbit_target
    .set bbit1_nt_b_limm_s9_has_delay_slot,   0
    .set bbit1_nt_b_limm_s9_cc, 0
    bbit1_nt_b_limm_s9_start:
	bbit1.nt r4,limm_value,@.Lbbit_target
    bbit1_nt_b_limm_s9_end:

    ; bbit1.t b,limm,s9
    .set bbit1_t_b_limm_s9_target, @.Lbbit_target
    .set bbit1_t_b_limm_s9_has_delay_slot,   0
    .set bbit1_t_b_limm_s9_cc, 0
    bbit1_t_b_limm_s9_start:
	bbit1.t r4,limm_value,@.Lbbit_target
    bbit1_t_b_limm_s9_end:

    ; bbit1.nt limm,c,s9
    .set bbit1_nt_limm_c_s9_target, @.Lbbit_target
    .set bbit1_nt_limm_c_s9_has_delay_slot,   0
    .set bbit1_nt_limm_c_s9_cc, 0
    bbit1_nt_limm_c_s9_start:
	bbit1.nt limm_value,r4,@.Lbbit_target
    bbit1_nt_limm_c_s9_end:

    ; bbit1.t limm,c,s9
    .set bbit1_t_limm_c_s9_target, @.Lbbit_target
    .set bbit1_t_limm_c_s9_has_delay_slot,   0
    .set bbit1_t_limm_c_s9_cc, 0
    bbit1_t_limm_c_s9_start:
	bbit1.t limm_value,r4,@.Lbbit_target
    bbit1_t_limm_c_s9_end:

    ; bbit1.nt limm,u6,s9
    .set bbit1_nt_limm_u6_s9_target, @.Lbbit_target
    .set bbit1_nt_limm_u6_s9_has_delay_slot,   0
    .set bbit1_nt_limm_u6_s9_cc, 0
    bbit1_nt_limm_u6_s9_start:
	bbit1.nt limm_value,u6_value,@.Lbbit_target
    bbit1_nt_limm_u6_s9_end:

    ; bbit1.t limm,u6,s9
    .set bbit1_t_limm_u6_s9_target, @.Lbbit_target
    .set bbit1_t_limm_u6_s9_has_delay_slot,   0
    .set bbit1_t_limm_u6_s9_cc, 0
    bbit1_t_limm_u6_s9_start:
	bbit1.t limm_value,u6_value,@.Lbbit_target
    bbit1_t_limm_u6_s9_end:
#endif /* TEST_BBIT */

#ifdef TEST_BCC
.Lbcc_target:
    ; bcc s21
    .set bcc_s21_target, @.Lbcc_target
    .set bcc_s21_has_delay_slot,   0
    .set bcc_s21_cc, 1
    bcc_s21_start:
	; beq @bcc_s21_target
	beq @.Lbcc_target
    bcc_s21_end:

    ; bcc.d s21
    .set bcc_d_s21_target, @.Lbcc_target
    .set bcc_d_s21_has_delay_slot,   1
    .set bcc_d_s21_cc, 1
    bcc_d_s21_start:
	beq.d @bcc_d_s21_target
    bcc_d_s21_end:
	nop_s

.Lbcc_s_target:
    ; beq_s s10
    .set beq_s_s10_target, @.Lbcc_s_target
    .set beq_s_s10_has_delay_slot,   0
    .set beq_s_s10_cc, 1
    beq_s_s10_start:
	# beq_s.d @beq_s_s10_target
	beq_s @.Lbcc_s_target
    beq_s_s10_end:

    ; bne_s s10
    .set bne_s_s10_target, @.Lbcc_s_target
    .set bne_s_s10_has_delay_slot,   0
    .set bne_s_s10_cc, 2
    bne_s_s10_start:
	bne_s @bne_s_s10_target
    bne_s_s10_end:

    ; bgt_s s7
    .set bgt_s_s7_target, @.Lbcc_s_target
    .set bgt_s_s7_has_delay_slot,   0
    .set bgt_s_s7_cc, 0x9
    bgt_s_s7_start:
	bgt_s @bgt_s_s7_target
    bgt_s_s7_end:

    ; bge_s s7
    .set bge_s_s7_target, @.Lbcc_s_target
    .set bge_s_s7_has_delay_slot,   0
    .set bge_s_s7_cc, 0xA
    bge_s_s7_start:
	bge_s @bge_s_s7_target
    bge_s_s7_end:

    ; blt_s s7
    .set blt_s_s7_target, @.Lbcc_s_target
    .set blt_s_s7_has_delay_slot,   0
    .set blt_s_s7_cc, 0xB
    blt_s_s7_start:
	blt_s @blt_s_s7_target
    blt_s_s7_end:

    ; ble_s s7
    .set ble_s_s7_target, @.Lbcc_s_target
    .set ble_s_s7_has_delay_slot,   0
    .set ble_s_s7_cc, 0xC
    ble_s_s7_start:
	ble_s @ble_s_s7_target
    ble_s_s7_end:

    ; bhi_s s7
    .set bhi_s_s7_target, @.Lbcc_s_target
    .set bhi_s_s7_has_delay_slot,   0
    .set bhi_s_s7_cc, 0xD
    bhi_s_s7_start:
	bhi_s @bhi_s_s7_target
    bhi_s_s7_end:

    ; bhs_s s7
    .set bhs_s_s7_target, @.Lbcc_s_target
    .set bhs_s_s7_has_delay_slot,   0
    .set bhs_s_s7_cc, 0x6
    bhs_s_s7_start:
	bhs_s @bhs_s_s7_target
    bhs_s_s7_end:

    ; blo_s s7
    .set blo_s_s7_target, @.Lbcc_s_target
    .set blo_s_s7_has_delay_slot,   0
    .set blo_s_s7_cc, 0x5
    blo_s_s7_start:
	blo_s @blo_s_s7_target
    blo_s_s7_end:

    ; bls_s s7
    .set bls_s_s7_target, @.Lbcc_s_target
    .set bls_s_s7_has_delay_slot,   0
    .set bls_s_s7_cc, 0xE
    bls_s_s7_start:
	bls_s @bls_s_s7_target
    bls_s_s7_end:
#endif /* TEST_BCC */

#ifdef TEST_BI
    ; bi [c]
    .set bi_c_target, @bi_c_end + (@r7_value << 2)
    .set bi_c_has_delay_slot,   0
    .set bi_c_cc, 0
    bi_c_start:
	bi [r7]
    bi_c_end:

    ; bih [c]
    .set bih_c_target, @bih_c_end + (@r7_value << 1)
    .set bih_c_has_delay_slot,   0
    .set bih_c_cc, 0
    bih_c_start:
	bih [r7]
    bih_c_end:
#endif /* TEST_BI */

#ifdef TEST_BL
.Lbl_target:
    ; bl s25
    .set bl_s25_target, @.Lbl_target
    .set bl_s25_has_delay_slot,   0
    .set bl_s25_cc, 0
    bl_s25_start:
	bl @bl_s25_target
    bl_s25_end:

    ; bl.d s25
    .set bl_d_s25_target, @.Lbl_target
    .set bl_d_s25_has_delay_slot,   1
    .set bl_d_s25_cc, 0
    bl_d_s25_start:
	bl.d @bl_d_s25_target
    bl_d_s25_end:
	nop_s

    ; bl_s s13
    .set bl_s_s13_target, @.Lbl_target
    .set bl_s_s13_has_delay_slot,   0
    .set bl_s_s13_cc, 0
    bl_s_s13_start:
	bl_s @bl_s_s13_target
    bl_s_s13_end:

    ; blcc s21
    .set blcc_s21_target, @.Lbl_target
    .set blcc_s21_has_delay_slot,   0
    .set blcc_s21_cc, 1
    blcc_s21_start:
	bleq @blcc_s21_target
    blcc_s21_end:

    ; blcc.d s21
    .set blcc_d_s21_target, @.Lbl_target
    .set blcc_d_s21_has_delay_slot,   1
    .set blcc_d_s21_cc, 2
    blcc_d_s21_start:
	blnz.d @blcc_d_s21_target
    blcc_d_s21_end:
	nop_s
#endif /* TEST_BL */

#ifdef TEST_BRCC
.Lbrcc_target:
    ; breq.nt b,c,s9
    .set breq_nt_b_c_s9_target, @.Lbrcc_target
    .set breq_nt_b_c_s9_has_delay_slot,   0
    .set breq_nt_b_c_s9_cc, 1
    breq_nt_b_c_s9_start:
	breq.nt r4,r5,@.Lbrcc_target
    breq_nt_b_c_s9_end:

    ; breq.d.nt b,c,s9
    .set breq_d_nt_b_c_s9_target, @.Lbrcc_target
    .set breq_d_nt_b_c_s9_has_delay_slot,   1
    .set breq_d_nt_b_c_s9_cc, 1
    breq_d_nt_b_c_s9_start:
	breq.d.nt r4,r5,@.Lbrcc_target
    breq_d_nt_b_c_s9_end:
	nop_s

    ; breq.t b,c,s9
    .set breq_t_b_c_s9_target, @.Lbrcc_target
    .set breq_t_b_c_s9_has_delay_slot,   0
    .set breq_t_b_c_s9_cc, 1
    breq_t_b_c_s9_start:
	breq.t r4,r5,@.Lbrcc_target
    breq_t_b_c_s9_end:

    ; breq.d.t b,c,s9
    .set breq_d_t_b_c_s9_target, @.Lbrcc_target
    .set breq_d_t_b_c_s9_has_delay_slot,   1
    .set breq_d_t_b_c_s9_cc, 1
    breq_d_t_b_c_s9_start:
	breq.d.t r4,r5,@.Lbrcc_target
    breq_d_t_b_c_s9_end:
	nop_s

    ; breq.nt b,u6,s9
    .set breq_nt_b_u6_s9_target, @.Lbrcc_target
    .set breq_nt_b_u6_s9_has_delay_slot,   0
    .set breq_nt_b_u6_s9_cc, 1
    breq_nt_b_u6_s9_start:
	breq.nt r4,u6_value,@.Lbrcc_target
    breq_nt_b_u6_s9_end:

    ; breq.d.nt b,u6,s9
    .set breq_d_nt_b_u6_s9_target, @.Lbrcc_target
    .set breq_d_nt_b_u6_s9_has_delay_slot,   1
    .set breq_d_nt_b_u6_s9_cc, 1
    breq_d_nt_b_u6_s9_start:
	breq.d.nt r4,u6_value,@.Lbrcc_target
    breq_d_nt_b_u6_s9_end:
	nop_s

    ; breq.nt b,u6,s9
    .set breq_t_b_u6_s9_target, @.Lbrcc_target
    .set breq_t_b_u6_s9_has_delay_slot,   0
    .set breq_t_b_u6_s9_cc, 1
    breq_t_b_u6_s9_start:
	breq.t r4,u6_value,@.Lbrcc_target
    breq_t_b_u6_s9_end:

    ; breq.d.nt b,u6,s9
    .set breq_d_t_b_u6_s9_target, @.Lbrcc_target
    .set breq_d_t_b_u6_s9_has_delay_slot,   1
    .set breq_d_t_b_u6_s9_cc, 1
    breq_d_t_b_u6_s9_start:
	breq.d.t r4,u6_value,@.Lbrcc_target
    breq_d_t_b_u6_s9_end:
	nop_s

    ; breq.nt b,limm,s9
    .set breq_nt_b_limm_s9_target, @.Lbrcc_target
    .set breq_nt_b_limm_s9_has_delay_slot,   0
    .set breq_nt_b_limm_s9_cc, 1
    breq_nt_b_limm_s9_start:
	breq.nt r4,limm_value,@.Lbrcc_target
    breq_nt_b_limm_s9_end:

    ; breq.t b,limm,s9
    .set breq_t_b_limm_s9_target, @.Lbrcc_target
    .set breq_t_b_limm_s9_has_delay_slot,   0
    .set breq_t_b_limm_s9_cc, 1
    breq_t_b_limm_s9_start:
	breq.t r4,limm_value,@.Lbrcc_target
    breq_t_b_limm_s9_end:

    ; breq.nt limm,c,s9
    .set breq_nt_limm_c_s9_target, @.Lbrcc_target
    .set breq_nt_limm_c_s9_has_delay_slot,   0
    .set breq_nt_limm_c_s9_cc, 1
    breq_nt_limm_c_s9_start:
	breq.nt limm_value,r4,@.Lbrcc_target
    breq_nt_limm_c_s9_end:

    ; breq.t limm,c,s9
    .set breq_t_limm_c_s9_target, @.Lbrcc_target
    .set breq_t_limm_c_s9_has_delay_slot,   0
    .set breq_t_limm_c_s9_cc, 1
    breq_t_limm_c_s9_start:
	breq.t limm_value,r4,@.Lbrcc_target
    breq_t_limm_c_s9_end:

    ; breq.nt limm,u6,s9
    .set breq_nt_limm_u6_s9_target, @.Lbrcc_target
    .set breq_nt_limm_u6_s9_has_delay_slot,   0
    .set breq_nt_limm_u6_s9_cc, 1
    breq_nt_limm_u6_s9_start:
	breq.nt limm_value,u6_value,@.Lbrcc_target
    breq_nt_limm_u6_s9_end:

    ; breq.t limm,u6,s9
    .set breq_t_limm_u6_s9_target, @.Lbrcc_target
    .set breq_t_limm_u6_s9_has_delay_slot,   0
    .set breq_t_limm_u6_s9_cc, 1
    breq_t_limm_u6_s9_start:
	breq.t limm_value,u6_value,@.Lbrcc_target
    breq_t_limm_u6_s9_end:

    ; brne_s b,0,s8
    .set brne_s_b_0_s8_target, @.Lbrcc_target
    .set brne_s_b_0_s8_has_delay_slot,   0
    .set brne_s_b_0_s8_cc, 1
    brne_s_b_0_s8_start:
	brne r12,0,@.Lbrcc_target
    brne_s_b_0_s8_end:

    ; breq_s b,0,s8
    .set breq_s_b_0_s8_target, @.Lbrcc_target
    .set breq_s_b_0_s8_has_delay_slot,   0
    .set breq_s_b_0_s8_cc, 1
    breq_s_b_0_s8_start:
	breq r12,0,@.Lbrcc_target
    breq_s_b_0_s8_end:
#endif /* TEST_BRCC */

#ifdef TEST_JLI
    ; jli_s u10
    .set jli_s_u10_target, @jli_target
    .set jli_s_u10_has_delay_slot,   0
    .set jli_s_u10_cc, 0
    jli_s_u10_start:
	jli_s jli_offset
    jli_s_u10_end:
#endif

#ifdef TEST_LEAVE_S
    ; leave_s
    .set leave_s_target, @blink_value
    .set leave_s_has_delay_slot,   0
    .set leave_s_cc, 0
    leave_s_start:
	; leave_s [r13-gp,fp,blink,pcl]
	leave_s (14 + 16 + 32 + 64)
    leave_s_end:
#endif

#ifdef TEST_LPCC
    ; lpcc
    .set lpcc_u7_target, @.Llpcc_end
    .set lpcc_u7_has_delay_slot,   0
    .set lpcc_u7_cc, 1
    lpcc_u7_start:
	lpeq @lpcc_u7_target
    lpcc_u7_end:
	nop
	nop
.Llpcc_end:
#endif

.Lend:

