Compiler projects using llvm
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=csky -verify-machineinstrs -csky-no-aliases -no-integrated-as -mattr=+e2 < %s \
; RUN:   | FileCheck -check-prefix=CSKY %s

; These test that we can use both the architectural names (r*) and the ABI names
; (a*, l* etc) to refer to registers in inline asm constraint lists. In each
; case, the named register should be used for the source register of the `addi`.
;
; The inline assembly will, by default, contain the ABI names for the registers.
;
; Parenthesised registers in comments are the other aliases for this register.

; NOTE: This test uses `r0` (`a0`) as an input, so it should be saved.
define i32 @explicit_register_r0(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r0:
; CSKY:       # %bb.0:
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, a0, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r0}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r0` (`a0`) as an input, so it should be saved.
define i32 @explicit_register_a0(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_a0:
; CSKY:       # %bb.0:
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, a0, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{a0}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r1` (`a1`) as an input, so it should be saved.
define i32 @explicit_register_r1(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r1:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 a1, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, a1, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r1}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_a1(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_a1:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 a1, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, a1, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{a1}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r2` (`a2`) as an input, so it should be saved.
define i32 @explicit_register_r2(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r2:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 a2, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, a2, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r2}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_a2(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_a2:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 a2, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, a2, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{a2}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r3` (`a3`) as an input, so it should be saved.
define i32 @explicit_register_r3(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r3:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 a3, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, a3, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r3}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_a3(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_a3:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 a3, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, a3, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{a3}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r4` (`l0`) as an input, so it should be saved.
define i32 @explicit_register_r4(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r4:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st16.w l0, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l0, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l0, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld16.w l0, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r4}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l0(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l0:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st16.w l0, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l0, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l0, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld16.w l0, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l0}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r5` (`l1`) as an input, so it should be saved.
define i32 @explicit_register_r5(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r5:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st16.w l1, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l1, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l1, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld16.w l1, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r5}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l1(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l1:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st16.w l1, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l1, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l1, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld16.w l1, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l1}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r6` (`l2`) as an input, so it should be saved.
define i32 @explicit_register_r6(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r6:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st16.w l2, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l2, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l2, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld16.w l2, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r6}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l2(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l2:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st16.w l2, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l2, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l2, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld16.w l2, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l2}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r7` (`l3`) as an input, so it should be saved.
define i32 @explicit_register_r7(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r7:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st16.w l3, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l3, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l3, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld16.w l3, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r7}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l3(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l3:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st16.w l3, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l3, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l3, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld16.w l3, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l3}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r8` (`l4`) as an input, so it should be saved.
define i32 @explicit_register_r8(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r8:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l4, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l4, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l4, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l4, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r8}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l4(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l4:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l4, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l4, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l4, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l4, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l4}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r9` (`l5`) as an input, so it should be saved.
define i32 @explicit_register_r9(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r9:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l5, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l5, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l5, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l5, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r9}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l5(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l5:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l5, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l5, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l5, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l5, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l5}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r10` (`l6`) as an input, so it should be saved.
define i32 @explicit_register_r10(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r10:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l6, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l6, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l6, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l6, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r10}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l6(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l6:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l6, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l6, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l6, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l6, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l6}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r11` (`l7`) as an input, so it should be saved.
define i32 @explicit_register_r11(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r11:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l7, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l7, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l7, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l7, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r11}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l7(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l7:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l7, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 l7, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l7, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l7, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l7}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r12` (`t0`) as an input, so it should be saved.
define i32 @explicit_register_r12(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r12:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 t0, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t0, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r12}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t0(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t0:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 t0, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t0, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t0}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r13` (`t1`) as an input, so it should be saved.
define i32 @explicit_register_r13(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r13:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 t1, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t1, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r13}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t1(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t1:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 t1, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t1, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t1}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r14` (`sp`) as an input, so it should be saved.
define i32 @explicit_register_r14(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r14:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 sp, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, sp, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r14}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_sp(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_sp:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov16 sp, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, sp, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{sp}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r15` (`lr`) as an input, so it should be saved.
define i32 @explicit_register_r15(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r15:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 lr, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, lr, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r15}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_lr(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_lr:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov16 lr, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, lr, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{lr}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r16` (`l8`) as an input, so it should be saved.
define i32 @explicit_register_r16(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r16:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l8, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov32 l8, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l8, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l8, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r16}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l8(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l8:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l8, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov32 l8, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l8, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l8, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l8}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r17` (`l9`) as an input, so it should be saved.
define i32 @explicit_register_r17(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r17:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l9, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov32 l9, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l9, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l9, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r17}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_l9(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_l9:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w l9, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov32 l9, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, l9, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w l9, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{l9}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r18` (`t2`) as an input, so it should be saved.
define i32 @explicit_register_r18(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r18:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t2, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t2, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r18}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t2(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t2:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t2, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t2, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t2}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r19` (`t3`) as an input, so it should be saved.
define i32 @explicit_register_r19(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r19:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t3, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t3, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r19}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t3(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t3:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t3, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t3, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t3}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r20` (`t4`) as an input, so it should be saved.
define i32 @explicit_register_r20(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r20:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t4, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t4, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r20}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t4(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t4:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t4, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t4, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t4}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r21` (`t5`) as an input, so it should be saved.
define i32 @explicit_register_r21(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r21:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t5, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t5, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r21}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t5(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t5:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t5, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t5, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t5}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r22` (`t6`) as an input, so it should be saved.
define i32 @explicit_register_r22(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r22:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t6, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t6, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r22}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t6(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t6:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t6, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t6, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t6}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r23` (`t7`) as an input, so it should be saved.
define i32 @explicit_register_r23(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r23:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t7, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t7, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r23}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t7(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t7:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t7, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t7, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t7}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r24` (`t8`) as an input, so it should be saved.
define i32 @explicit_register_r24(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r24:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t8, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t8, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r24}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t8(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t8:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t8, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t8, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t8}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r25` (`t9`) as an input, so it should be saved.
define i32 @explicit_register_r25(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r25:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t9, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t9, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r25}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_t9(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_t9:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 t9, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, t9, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{t9}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r26` (`r26`) as an input, so it should be saved.
define i32 @explicit_register_r26(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r26:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 r26, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, r26, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r26}"(i32 %a)
  ret i32 %1
}


; NOTE: This test uses `r27` (`r27`) as an input, so it should be saved.
define i32 @explicit_register_r27(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r27:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 r27, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, r27, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r27}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r28` (`rgb`) as an input, so it should be saved.
define i32 @explicit_register_r28(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r28:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w rgb, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov32 rgb, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, rgb, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w rgb, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r28}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_rgb(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_rgb:
; CSKY:       # %bb.0:
; CSKY-NEXT:    subi16 sp, sp, 4
; CSKY-NEXT:    st32.w rgb, (sp, 0) # 4-byte Folded Spill
; CSKY-NEXT:    mov32 rgb, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, rgb, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    ld32.w rgb, (sp, 0) # 4-byte Folded Reload
; CSKY-NEXT:    addi16 sp, sp, 4
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{rgb}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r29` (`rtb`) as an input, so it should be saved.
define i32 @explicit_register_r29(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r29:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 rtb, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, rtb, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r29}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_rtb(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_rtb:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 rtb, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, rtb, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{rtb}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r30` (`svbr`) as an input, so it should be saved.
define i32 @explicit_register_r30(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r30:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 svbr, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, svbr, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r30}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_svbr(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_svbr:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 svbr, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, svbr, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{svbr}"(i32 %a)
  ret i32 %1
}

; NOTE: This test uses `r31` (`tls`) as an input, so it should be saved.
define i32 @explicit_register_r31(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_r31:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 tls, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, tls, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{r31}"(i32 %a)
  ret i32 %1
}

define i32 @explicit_register_tls(i32 %a) nounwind {
; CSKY-LABEL: explicit_register_tls:
; CSKY:       # %bb.0:
; CSKY-NEXT:    mov32 tls, a0
; CSKY-NEXT:    #APP
; CSKY-NEXT:    addi a0, tls, 1
; CSKY-NEXT:    #NO_APP
; CSKY-NEXT:    rts16
  %1 = tail call i32 asm "addi $0, $1, 1", "=r,{tls}"(i32 %a)
  ret i32 %1
}