; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+e2 -mattr=+2e3 < %s -mtriple=csky | FileCheck %s
; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky | FileCheck %s --check-prefix=GENERIC
define i32 @addRR(i32 %x, i32 %y) {
; CHECK-LABEL: addRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addu16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: addRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i32 %y, %x
ret i32 %add
}
define i32 @addRI(i32 %x) {
; CHECK-LABEL: addRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addi16 a0, 10
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: addRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 a0, 10
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i32 %x, 10
ret i32 %add
}
define i32 @addRI_256(i32 %x) {
; CHECK-LABEL: addRI_256:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addi16 a0, 256
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: addRI_256:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 a0, 256
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i32 %x, 256
ret i32 %add
}
define i32 @addRI_4096(i32 %x) {
; CHECK-LABEL: addRI_4096:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addi32 a0, a0, 4096
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: addRI_4096:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a3, a1, 16
; GENERIC-NEXT: or16 a3, a2
; GENERIC-NEXT: movi16 a2, 16
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a3
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: addu16 a0, a0, a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i32 %x, 4096
ret i32 %add
}
define i32 @addRI_X(i32 %x) {
; CHECK-LABEL: addRI_X:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi32 a1, 4097
; CHECK-NEXT: addu16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: addRI_X:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 16
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: addu16 a0, a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i32 %x, 4097
ret i32 %add
}
define i64 @ADD_LONG(i64 %x, i64 %y) {
; CHECK-LABEL: ADD_LONG:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: clrc32
; CHECK-NEXT: addc32 a0, a2, a0
; CHECK-NEXT: addc32 a1, a3, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ADD_LONG:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: clrc16
; GENERIC-NEXT: addc16 a0, a2
; GENERIC-NEXT: addc16 a1, a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i64 %y, %x
ret i64 %add
}
define i64 @ADD_LONG_I(i64 %x) {
; CHECK-LABEL: ADD_LONG_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: clrc32
; CHECK-NEXT: movi16 a2, 1
; CHECK-NEXT: addc16 a0, a2
; CHECK-NEXT: movi16 a2, 0
; CHECK-NEXT: addc16 a1, a2
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ADD_LONG_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: clrc16
; GENERIC-NEXT: movi16 a2, 1
; GENERIC-NEXT: addc16 a0, a2
; GENERIC-NEXT: movi16 a2, 0
; GENERIC-NEXT: addc16 a1, a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i64 %x, 1
ret i64 %add
}
define i16 @ADD_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: ADD_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addu16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ADD_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i16 %y, %x
ret i16 %add
}
define i16 @ADD_SHORT_I(i16 %x) {
; CHECK-LABEL: ADD_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addi16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ADD_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 a0, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i16 %x, 1
ret i16 %add
}
define i8 @ADD_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: ADD_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addu16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ADD_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i8 %y, %x
ret i8 %add
}
define i8 @ADD_CHAR_I(i8 %x) {
; CHECK-LABEL: ADD_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addi16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ADD_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 a0, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%add = add nsw i8 %x, 1
ret i8 %add
}
define i32 @subRR(i32 %x, i32 %y) {
; CHECK-LABEL: subRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subu16 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: subRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: subu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i32 %y, %x
ret i32 %sub
}
define i32 @subRI(i32 %x) {
; CHECK-LABEL: subRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subi16 a0, 10
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: subRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: subi16 a0, 10
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i32 %x, 10
ret i32 %sub
}
define i32 @subRI_256(i32 %x) {
; CHECK-LABEL: subRI_256:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subi16 a0, 256
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: subRI_256:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: subi16 a0, 256
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i32 %x, 256
ret i32 %sub
}
define i32 @subRI_4096(i32 %x) {
; CHECK-LABEL: subRI_4096:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subi32 a0, a0, 4096
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: subRI_4096:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 255
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 240
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: addu16 a0, a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i32 %x, 4096
ret i32 %sub
}
define i32 @subRI_X(i32 %x) {
; CHECK-LABEL: subRI_X:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movih32 a1, 65535
; CHECK-NEXT: ori32 a1, a1, 61439
; CHECK-NEXT: addu16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: subRI_X:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 255
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a3, a1, 16
; GENERIC-NEXT: or16 a3, a2
; GENERIC-NEXT: movi16 a2, 239
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a3
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: addu16 a0, a0, a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i32 %x, 4097
ret i32 %sub
}
define i64 @SUB_LONG(i64 %x, i64 %y) {
; CHECK-LABEL: SUB_LONG:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: setc32
; CHECK-NEXT: subc32 a0, a2, a0
; CHECK-NEXT: mvcv16 a2
; CHECK-NEXT: btsti16 a2, 0
; CHECK-NEXT: mvcv16 a2
; CHECK-NEXT: btsti16 a2, 0
; CHECK-NEXT: subc32 a1, a3, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SUB_LONG:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: setc16
; GENERIC-NEXT: subc16 a2, a0
; GENERIC-NEXT: mvcv16 a0
; GENERIC-NEXT: btsti16 a0, 0
; GENERIC-NEXT: mvcv16 a0
; GENERIC-NEXT: btsti16 a0, 0
; GENERIC-NEXT: subc16 a3, a1
; GENERIC-NEXT: mov16 a0, a2
; GENERIC-NEXT: mov16 a1, a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i64 %y, %x
ret i64 %sub
}
define i64 @SUB_LONG_I(i64 %x) {
; CHECK-LABEL: SUB_LONG_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: clrc32
; CHECK-NEXT: movih32 a2, 65535
; CHECK-NEXT: ori32 a2, a2, 65535
; CHECK-NEXT: addc16 a0, a2
; CHECK-NEXT: addc16 a1, a2
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SUB_LONG_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset l0, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: clrc16
; GENERIC-NEXT: movi16 a2, 255
; GENERIC-NEXT: lsli16 a3, a2, 24
; GENERIC-NEXT: lsli16 l0, a2, 16
; GENERIC-NEXT: or16 l0, a3
; GENERIC-NEXT: lsli16 a3, a2, 8
; GENERIC-NEXT: or16 a3, l0
; GENERIC-NEXT: or16 a3, a2
; GENERIC-NEXT: addc16 a0, a3
; GENERIC-NEXT: addc16 a1, a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i64 %x, 1
ret i64 %sub
}
define i16 @SUB_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: SUB_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subu16 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SUB_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: subu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i16 %y, %x
ret i16 %sub
}
define i16 @SUB_SHORT_I(i16 %x) {
; CHECK-LABEL: SUB_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subi16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SUB_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: subi16 a0, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i16 %x, 1
ret i16 %sub
}
define i8 @SUB_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: SUB_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subu16 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SUB_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: subu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i8 %y, %x
ret i8 %sub
}
define i8 @SUB_CHAR_I(i8 %x) {
; CHECK-LABEL: SUB_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: subi16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SUB_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: subi16 a0, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sub = sub nsw i8 %x, 1
ret i8 %sub
}
define i32 @mulRR(i32 %x, i32 %y) {
; CHECK-LABEL: mulRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mult16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: mulRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: mult16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%mul = mul nsw i32 %y, %x
ret i32 %mul
}
define i32 @mulRI(i32 %x) {
; CHECK-LABEL: mulRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi16 a1, 10
; CHECK-NEXT: mult16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: mulRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 10
; GENERIC-NEXT: mult16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%mul = mul nsw i32 %x, 10
ret i32 %mul
}
define i32 @mulRI_X(i32 %x) {
; CHECK-LABEL: mulRI_X:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsli16 a1, a0, 12
; CHECK-NEXT: addu16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: mulRI_X:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsli16 a1, a0, 12
; GENERIC-NEXT: addu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%mul = mul nsw i32 %x, 4097
ret i32 %mul
}
define i16 @MUL_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: MUL_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mult16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: MUL_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: mult16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%mul = mul nsw i16 %y, %x
ret i16 %mul
}
define i16 @MUL_SHORT_I(i16 %x) {
; CHECK-LABEL: MUL_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ixh32 a0, a0, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: MUL_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsli16 a1, a0, 1
; GENERIC-NEXT: addu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%mul = mul nsw i16 %x, 3
ret i16 %mul
}
define i8 @MUL_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: MUL_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mult16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: MUL_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: mult16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%mul = mul nsw i8 %y, %x
ret i8 %mul
}
define i8 @MUL_CHAR_I(i8 %x) {
; CHECK-LABEL: MUL_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ixh32 a0, a0, a0
; CHECK-NEXT: movi16 a1, 0
; CHECK-NEXT: subu16 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: MUL_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsli16 a1, a0, 1
; GENERIC-NEXT: addu16 a0, a1, a0
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: subu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%mul = mul nsw i8 %x, -3
ret i8 %mul
}
define i32 @udivRR(i32 %x, i32 %y) {
; CHECK-LABEL: udivRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: divu32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: udivRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: mov16 a2, a0
; GENERIC-NEXT: lrw32 a3, [.LCPI29_0]
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: mov16 a1, a2
; GENERIC-NEXT: jsr16 a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI29_0:
; GENERIC-NEXT: .long __udivsi3
entry:
%udiv = udiv i32 %y, %x
ret i32 %udiv
}
define i32 @udivRI(i32 %x) {
; CHECK-LABEL: udivRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi16 a1, 10
; CHECK-NEXT: divu32 a0, a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: udivRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: lrw32 a2, [.LCPI30_0]
; GENERIC-NEXT: movi16 a1, 10
; GENERIC-NEXT: jsr16 a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI30_0:
; GENERIC-NEXT: .long __udivsi3
entry:
%udiv = udiv i32 %x, 10
ret i32 %udiv
}
define i32 @udivRI_X(i32 %x) {
; CHECK-LABEL: udivRI_X:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi32 a1, 4097
; CHECK-NEXT: divu32 a0, a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: udivRI_X:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 16
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: lrw32 a2, [.LCPI31_0]
; GENERIC-NEXT: jsr16 a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI31_0:
; GENERIC-NEXT: .long __udivsi3
entry:
%udiv = udiv i32 %x, 4097
ret i32 %udiv
}
define i16 @UDIV_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: UDIV_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: zexth16 a0, a0
; CHECK-NEXT: zexth16 a1, a1
; CHECK-NEXT: divu32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: UDIV_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 8
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset l0, -4
; GENERIC-NEXT: .cfi_offset lr, -8
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 12
; GENERIC-NEXT: mov16 a2, a1
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a3, a1, 24
; GENERIC-NEXT: lsli16 l0, a1, 16
; GENERIC-NEXT: or16 l0, a3
; GENERIC-NEXT: movi16 a3, 255
; GENERIC-NEXT: lsli16 a1, a3, 8
; GENERIC-NEXT: or16 a1, l0
; GENERIC-NEXT: or16 a1, a3
; GENERIC-NEXT: and16 a2, a1
; GENERIC-NEXT: and16 a1, a0
; GENERIC-NEXT: lrw32 a3, [.LCPI32_0]
; GENERIC-NEXT: mov16 a0, a2
; GENERIC-NEXT: jsr16 a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 8
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI32_0:
; GENERIC-NEXT: .long __udivsi3
entry:
%udiv = udiv i16 %y, %x
ret i16 %udiv
}
define i16 @UDIV_SHORT_I(i16 %x) {
; CHECK-LABEL: UDIV_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: zexth16 a0, a0
; CHECK-NEXT: movi32 a1, 43691
; CHECK-NEXT: mult16 a0, a1
; CHECK-NEXT: lsri16 a0, a0, 17
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: UDIV_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 255
; GENERIC-NEXT: lsli16 a3, a2, 8
; GENERIC-NEXT: or16 a3, a1
; GENERIC-NEXT: or16 a3, a2
; GENERIC-NEXT: and16 a3, a0
; GENERIC-NEXT: movi16 a0, 170
; GENERIC-NEXT: lsli16 a0, a0, 8
; GENERIC-NEXT: or16 a0, a1
; GENERIC-NEXT: movi16 a1, 171
; GENERIC-NEXT: or16 a1, a0
; GENERIC-NEXT: mult16 a1, a3
; GENERIC-NEXT: lsri16 a0, a1, 17
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%udiv = udiv i16 %x, 3
ret i16 %udiv
}
define i8 @UDIV_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: UDIV_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: zextb16 a0, a0
; CHECK-NEXT: zextb16 a1, a1
; CHECK-NEXT: divu32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: UDIV_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: mov16 a2, a1
; GENERIC-NEXT: movi16 a1, 255
; GENERIC-NEXT: and16 a2, a1
; GENERIC-NEXT: and16 a1, a0
; GENERIC-NEXT: lrw32 a3, [.LCPI34_0]
; GENERIC-NEXT: mov16 a0, a2
; GENERIC-NEXT: jsr16 a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI34_0:
; GENERIC-NEXT: .long __udivsi3
entry:
%udiv = udiv i8 %y, %x
ret i8 %udiv
}
define i8 @UDIV_CHAR_I(i8 %x) {
; CHECK-LABEL: UDIV_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: zextb16 a0, a0
; CHECK-NEXT: movi16 a1, 171
; CHECK-NEXT: mult16 a0, a1
; CHECK-NEXT: lsri16 a0, a0, 9
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: UDIV_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 255
; GENERIC-NEXT: and16 a1, a0
; GENERIC-NEXT: movi16 a0, 171
; GENERIC-NEXT: mult16 a0, a1
; GENERIC-NEXT: lsri16 a0, a0, 9
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%udiv = udiv i8 %x, 3
ret i8 %udiv
}
define i32 @sdivRR(i32 %x, i32 %y) {
; CHECK-LABEL: sdivRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: divs32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: sdivRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: mov16 a2, a0
; GENERIC-NEXT: lrw32 a3, [.LCPI36_0]
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: mov16 a1, a2
; GENERIC-NEXT: jsr16 a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI36_0:
; GENERIC-NEXT: .long __divsi3
entry:
%sdiv = sdiv i32 %y, %x
ret i32 %sdiv
}
define i32 @sdivRI(i32 %x) {
; CHECK-LABEL: sdivRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi16 a1, 10
; CHECK-NEXT: divs32 a0, a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: sdivRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: lrw32 a2, [.LCPI37_0]
; GENERIC-NEXT: movi16 a1, 10
; GENERIC-NEXT: jsr16 a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI37_0:
; GENERIC-NEXT: .long __divsi3
entry:
%sdiv = sdiv i32 %x, 10
ret i32 %sdiv
}
define i32 @sdivRI_X(i32 %x) {
; CHECK-LABEL: sdivRI_X:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi32 a1, 4097
; CHECK-NEXT: divs32 a0, a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: sdivRI_X:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 16
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: lrw32 a2, [.LCPI38_0]
; GENERIC-NEXT: jsr16 a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI38_0:
; GENERIC-NEXT: .long __divsi3
entry:
%sdiv = sdiv i32 %x, 4097
ret i32 %sdiv
}
define i16 @SDIV_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: SDIV_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sexth16 a0, a0
; CHECK-NEXT: sexth16 a1, a1
; CHECK-NEXT: divs32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SDIV_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: sexth16 a2, a1
; GENERIC-NEXT: sexth16 a1, a0
; GENERIC-NEXT: lrw32 a3, [.LCPI39_0]
; GENERIC-NEXT: mov16 a0, a2
; GENERIC-NEXT: jsr16 a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI39_0:
; GENERIC-NEXT: .long __divsi3
entry:
%sdiv = sdiv i16 %y, %x
ret i16 %sdiv
}
define i16 @SDIV_SHORT_I(i16 %x) {
; CHECK-LABEL: SDIV_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sexth16 a0, a0
; CHECK-NEXT: movi32 a1, 21846
; CHECK-NEXT: mult16 a0, a1
; CHECK-NEXT: lsri16 a1, a0, 31
; CHECK-NEXT: lsri16 a0, a0, 16
; CHECK-NEXT: addu16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SDIV_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: sexth16 a0, a0
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 85
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 86
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: mult16 a1, a0
; GENERIC-NEXT: lsri16 a0, a1, 31
; GENERIC-NEXT: lsri16 a1, a1, 16
; GENERIC-NEXT: addu16 a0, a1, a0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sdiv = sdiv i16 %x, 3
ret i16 %sdiv
}
define i8 @SDIV_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: SDIV_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sextb16 a0, a0
; CHECK-NEXT: sextb16 a1, a1
; CHECK-NEXT: divs32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SDIV_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset lr, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: sextb16 a2, a1
; GENERIC-NEXT: sextb16 a1, a0
; GENERIC-NEXT: lrw32 a3, [.LCPI41_0]
; GENERIC-NEXT: mov16 a0, a2
; GENERIC-NEXT: jsr16 a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
; GENERIC-NEXT: .p2align 1
; GENERIC-NEXT: # %bb.1:
; GENERIC-NEXT: .p2align 2, 0x0
; GENERIC-NEXT: .LCPI41_0:
; GENERIC-NEXT: .long __divsi3
entry:
%sdiv = sdiv i8 %y, %x
ret i8 %sdiv
}
define i8 @SDIV_CHAR_I(i8 %x) {
; CHECK-LABEL: SDIV_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sextb16 a1, a0
; CHECK-NEXT: movi16 a2, 85
; CHECK-NEXT: mult16 a1, a2
; CHECK-NEXT: lsri16 a1, a1, 8
; CHECK-NEXT: subu16 a0, a1, a0
; CHECK-NEXT: andi32 a1, a0, 128
; CHECK-NEXT: lsri16 a1, a1, 7
; CHECK-NEXT: sextb16 a0, a0
; CHECK-NEXT: asri16 a0, a0, 1
; CHECK-NEXT: addu16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SDIV_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: sextb16 a1, a0
; GENERIC-NEXT: movi16 a2, 85
; GENERIC-NEXT: mult16 a2, a1
; GENERIC-NEXT: lsri16 a1, a2, 8
; GENERIC-NEXT: subu16 a0, a1, a0
; GENERIC-NEXT: movi16 a1, 128
; GENERIC-NEXT: and16 a1, a0
; GENERIC-NEXT: lsri16 a1, a1, 7
; GENERIC-NEXT: sextb16 a0, a0
; GENERIC-NEXT: asri16 a0, a0, 1
; GENERIC-NEXT: addu16 a0, a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%sdiv = sdiv i8 %x, -3
ret i8 %sdiv
}
define i32 @shlRR(i32 %x, i32 %y) {
; CHECK-LABEL: shlRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsl32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: shlRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsl16 a1, a0
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%shl = shl nsw i32 %y, %x
ret i32 %shl
}
define i32 @shlRI(i32 %x) {
; CHECK-LABEL: shlRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsli16 a0, a0, 10
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: shlRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsli16 a0, a0, 10
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%shl = shl nsw i32 %x, 10
ret i32 %shl
}
define i64 @SHL_LONG_I(i64 %x) {
; CHECK-LABEL: SHL_LONG_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsri16 a2, a0, 25
; CHECK-NEXT: lsli16 a1, a1, 7
; CHECK-NEXT: or16 a1, a2
; CHECK-NEXT: lsli16 a0, a0, 7
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SHL_LONG_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsri16 a2, a0, 25
; GENERIC-NEXT: lsli16 a1, a1, 7
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: lsli16 a0, a0, 7
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%shl = shl nsw i64 %x, 7
ret i64 %shl
}
define i16 @SHL_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: SHL_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: zexth16 a0, a0
; CHECK-NEXT: lsl32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SHL_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset l0, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: movi16 a2, 0
; GENERIC-NEXT: lsli16 a3, a2, 24
; GENERIC-NEXT: lsli16 a2, a2, 16
; GENERIC-NEXT: or16 a2, a3
; GENERIC-NEXT: movi16 a3, 255
; GENERIC-NEXT: lsli16 l0, a3, 8
; GENERIC-NEXT: or16 l0, a2
; GENERIC-NEXT: or16 l0, a3
; GENERIC-NEXT: and16 l0, a0
; GENERIC-NEXT: lsl16 a1, l0
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%shl = shl nsw i16 %y, %x
ret i16 %shl
}
define i16 @SHL_SHORT_I(i16 %x) {
; CHECK-LABEL: SHL_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsli16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SHL_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsli16 a0, a0, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%shl = shl nsw i16 %x, 1
ret i16 %shl
}
define i8 @SHL_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: SHL_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: zextb16 a0, a0
; CHECK-NEXT: lsl32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SHL_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a2, 255
; GENERIC-NEXT: and16 a2, a0
; GENERIC-NEXT: lsl16 a1, a2
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%shl = shl nsw i8 %y, %x
ret i8 %shl
}
define i8 @SHL_CHAR_I(i8 %x) {
; CHECK-LABEL: SHL_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsli16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: SHL_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsli16 a0, a0, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%shl = shl nsw i8 %x, 1
ret i8 %shl
}
define i32 @andRR(i32 %x, i32 %y) {
; CHECK-LABEL: andRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: and16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: andRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: and16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i32 %y, %x
ret i32 %and
}
define i32 @andRI(i32 %x) {
; CHECK-LABEL: andRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi32 a0, a0, 10
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: andRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 10
; GENERIC-NEXT: and16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i32 %x, 10
ret i32 %and
}
define i32 @andRI_X(i32 %x) {
; CHECK-LABEL: andRI_X:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi32 a1, 4097
; CHECK-NEXT: and16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: andRI_X:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 16
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: and16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i32 %x, 4097
ret i32 %and
}
define i64 @AND_LONG(i64 %x, i64 %y) {
; CHECK-LABEL: AND_LONG:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: and16 a0, a2
; CHECK-NEXT: and16 a1, a3
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: AND_LONG:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: and16 a0, a2
; GENERIC-NEXT: and16 a1, a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i64 %y, %x
ret i64 %and
}
define i64 @AND_LONG_I(i64 %x) {
; CHECK-LABEL: AND_LONG_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi32 a0, a0, 1
; CHECK-NEXT: movi16 a1, 0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: AND_LONG_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: and16 a0, a1
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i64 %x, 1
ret i64 %and
}
define i16 @AND_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: AND_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: and16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: AND_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: and16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i16 %y, %x
ret i16 %and
}
define i16 @AND_SHORT_I(i16 %x) {
; CHECK-LABEL: AND_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi32 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: AND_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: and16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i16 %x, 1
ret i16 %and
}
define i8 @AND_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: AND_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: and16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: AND_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: and16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i8 %y, %x
ret i8 %and
}
define i8 @AND_CHAR_I(i8 %x) {
; CHECK-LABEL: AND_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi32 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: AND_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: and16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%and = and i8 %x, 1
ret i8 %and
}
define i32 @ashrRR(i32 %x, i32 %y) {
; CHECK-LABEL: ashrRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: asr32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ashrRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: asr16 a1, a0
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%ashr = ashr i32 %y, %x
ret i32 %ashr
}
define i32 @ashrRI(i32 %x) {
; CHECK-LABEL: ashrRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: asri16 a0, a0, 10
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ashrRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: asri16 a0, a0, 10
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%ashr = ashr i32 %x, 10
ret i32 %ashr
}
define i64 @ASHR_LONG_I(i64 %x) {
; CHECK-LABEL: ASHR_LONG_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsli16 a2, a1, 25
; CHECK-NEXT: lsri16 a0, a0, 7
; CHECK-NEXT: or16 a0, a2
; CHECK-NEXT: asri16 a1, a1, 7
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ASHR_LONG_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsli16 a2, a1, 25
; GENERIC-NEXT: lsri16 a0, a0, 7
; GENERIC-NEXT: or16 a0, a2
; GENERIC-NEXT: asri16 a1, a1, 7
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%ashr = ashr i64 %x, 7
ret i64 %ashr
}
define i16 @ASHR_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: ASHR_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sexth16 a1, a1
; CHECK-NEXT: zexth16 a0, a0
; CHECK-NEXT: asr32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ASHR_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset l0, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: sexth16 a1, a1
; GENERIC-NEXT: movi16 a2, 0
; GENERIC-NEXT: lsli16 a3, a2, 24
; GENERIC-NEXT: lsli16 a2, a2, 16
; GENERIC-NEXT: or16 a2, a3
; GENERIC-NEXT: movi16 a3, 255
; GENERIC-NEXT: lsli16 l0, a3, 8
; GENERIC-NEXT: or16 l0, a2
; GENERIC-NEXT: or16 l0, a3
; GENERIC-NEXT: and16 l0, a0
; GENERIC-NEXT: asr16 a1, l0
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%ashr = ashr i16 %y, %x
ret i16 %ashr
}
define i16 @ASHR_SHORT_I(i16 %x) {
; CHECK-LABEL: ASHR_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sexth16 a0, a0
; CHECK-NEXT: asri16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ASHR_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: sexth16 a0, a0
; GENERIC-NEXT: asri16 a0, a0, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%ashr = ashr i16 %x, 1
ret i16 %ashr
}
define i8 @ASHR_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: ASHR_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sextb16 a1, a1
; CHECK-NEXT: zextb16 a0, a0
; CHECK-NEXT: asr32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ASHR_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: sextb16 a1, a1
; GENERIC-NEXT: movi16 a2, 255
; GENERIC-NEXT: and16 a2, a0
; GENERIC-NEXT: asr16 a1, a2
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%ashr = ashr i8 %y, %x
ret i8 %ashr
}
define i8 @ASHR_CHAR_I(i8 %x) {
; CHECK-LABEL: ASHR_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: sextb16 a0, a0
; CHECK-NEXT: asri16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: ASHR_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: sextb16 a0, a0
; GENERIC-NEXT: asri16 a0, a0, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%ashr = ashr i8 %x, 1
ret i8 %ashr
}
define i32 @lshrRR(i32 %x, i32 %y) {
; CHECK-LABEL: lshrRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsr32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: lshrRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsr16 a1, a0
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i32 %y, %x
ret i32 %lshr
}
define i32 @lshrRI(i32 %x) {
; CHECK-LABEL: lshrRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsri16 a0, a0, 10
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: lshrRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsri16 a0, a0, 10
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i32 %x, 10
ret i32 %lshr
}
define i64 @LSHR_LONG_I(i64 %x) {
; CHECK-LABEL: LSHR_LONG_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lsli16 a2, a1, 25
; CHECK-NEXT: lsri16 a0, a0, 7
; CHECK-NEXT: or16 a0, a2
; CHECK-NEXT: lsri16 a1, a1, 7
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: LSHR_LONG_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: lsli16 a2, a1, 25
; GENERIC-NEXT: lsri16 a0, a0, 7
; GENERIC-NEXT: or16 a0, a2
; GENERIC-NEXT: lsri16 a1, a1, 7
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i64 %x, 7
ret i64 %lshr
}
define i16 @LSHR_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: LSHR_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: zexth16 a1, a1
; CHECK-NEXT: zexth16 a0, a0
; CHECK-NEXT: lsr32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: LSHR_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill
; GENERIC-NEXT: .cfi_offset l0, -4
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 8
; GENERIC-NEXT: movi16 a2, 0
; GENERIC-NEXT: lsli16 a3, a2, 24
; GENERIC-NEXT: lsli16 a2, a2, 16
; GENERIC-NEXT: or16 a2, a3
; GENERIC-NEXT: movi16 a3, 255
; GENERIC-NEXT: lsli16 l0, a3, 8
; GENERIC-NEXT: or16 l0, a2
; GENERIC-NEXT: or16 l0, a3
; GENERIC-NEXT: and16 a1, l0
; GENERIC-NEXT: and16 l0, a0
; GENERIC-NEXT: lsr16 a1, l0
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i16 %y, %x
ret i16 %lshr
}
define i16 @LSHR_SHORT_I(i16 %x) {
; CHECK-LABEL: LSHR_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi32 a1, 65534
; CHECK-NEXT: and16 a0, a1
; CHECK-NEXT: lsri16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: LSHR_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 255
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 254
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: and16 a1, a0
; GENERIC-NEXT: lsri16 a0, a1, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i16 %x, 1
ret i16 %lshr
}
define i8 @LSHR_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: LSHR_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: zextb16 a1, a1
; CHECK-NEXT: zextb16 a0, a0
; CHECK-NEXT: lsr32 a0, a1, a0
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: LSHR_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a2, 255
; GENERIC-NEXT: and16 a1, a2
; GENERIC-NEXT: and16 a0, a2
; GENERIC-NEXT: lsr16 a1, a0
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i8 %y, %x
ret i8 %lshr
}
define i8 @LSHR_CHAR_I(i8 %x) {
; CHECK-LABEL: LSHR_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi32 a0, a0, 254
; CHECK-NEXT: lsri16 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: LSHR_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 254
; GENERIC-NEXT: and16 a1, a0
; GENERIC-NEXT: lsri16 a0, a1, 1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i8 %x, 1
ret i8 %lshr
}
define i1 @LSHR_BIT(i1 %x, i1 %y) {
; CHECK-LABEL: LSHR_BIT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mov16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: LSHR_BIT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: mov16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i1 %y, %x
ret i1 %lshr
}
define i1 @LSHR_BIT_I(i1 %x) {
; CHECK-LABEL: LSHR_BIT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: LSHR_BIT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%lshr = lshr i1 %x, 1
ret i1 %lshr
}
define i32 @orRR(i32 %x, i32 %y) {
; CHECK-LABEL: orRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: orRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: or16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i32 %y, %x
ret i32 %or
}
define i32 @orRI(i32 %x) {
; CHECK-LABEL: orRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori32 a0, a0, 10
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: orRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 10
; GENERIC-NEXT: or16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i32 %x, 10
ret i32 %or
}
define i32 @orRI_X(i32 %x) {
; CHECK-LABEL: orRI_X:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori32 a0, a0, 4097
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: orRI_X:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 16
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: or16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i32 %x, 4097
ret i32 %or
}
define i64 @OR_LONG(i64 %x, i64 %y) {
; CHECK-LABEL: OR_LONG:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or16 a0, a2
; CHECK-NEXT: or16 a1, a3
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: OR_LONG:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: or16 a0, a2
; GENERIC-NEXT: or16 a1, a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i64 %y, %x
ret i64 %or
}
define i64 @OR_LONG_I(i64 %x) {
; CHECK-LABEL: OR_LONG_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori32 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: OR_LONG_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a2, 1
; GENERIC-NEXT: or16 a0, a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i64 %x, 1
ret i64 %or
}
define i16 @OR_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: OR_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: OR_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: or16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i16 %y, %x
ret i16 %or
}
define i16 @OR_SHORT_I(i16 %x) {
; CHECK-LABEL: OR_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori32 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: OR_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: or16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i16 %x, 1
ret i16 %or
}
define i8 @OR_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: OR_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: or16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: OR_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: or16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i8 %y, %x
ret i8 %or
}
define i8 @OR_CHAR_I(i8 %x) {
; CHECK-LABEL: OR_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ori32 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: OR_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: or16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%or = or i8 %x, 1
ret i8 %or
}
define i32 @xorRR(i32 %x, i32 %y) {
; CHECK-LABEL: xorRR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xor16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: xorRR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: xor16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i32 %y, %x
ret i32 %xor
}
define i32 @xorRI(i32 %x) {
; CHECK-LABEL: xorRI:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xori32 a0, a0, 10
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: xorRI:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 10
; GENERIC-NEXT: xor16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i32 %x, 10
ret i32 %xor
}
define i32 @xorRI_X(i32 %x) {
; CHECK-LABEL: xorRI_X:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movi32 a1, 4097
; CHECK-NEXT: xor16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: xorRI_X:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 0
; GENERIC-NEXT: lsli16 a2, a1, 24
; GENERIC-NEXT: lsli16 a1, a1, 16
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: movi16 a2, 16
; GENERIC-NEXT: lsli16 a2, a2, 8
; GENERIC-NEXT: or16 a2, a1
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: or16 a1, a2
; GENERIC-NEXT: xor16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i32 %x, 4097
ret i32 %xor
}
define i64 @XOR_LONG(i64 %x, i64 %y) {
; CHECK-LABEL: XOR_LONG:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xor16 a0, a2
; CHECK-NEXT: xor16 a1, a3
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: XOR_LONG:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: xor16 a0, a2
; GENERIC-NEXT: xor16 a1, a3
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i64 %y, %x
ret i64 %xor
}
define i64 @XOR_LONG_I(i64 %x) {
; CHECK-LABEL: XOR_LONG_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xori32 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: XOR_LONG_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a2, 1
; GENERIC-NEXT: xor16 a0, a2
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i64 %x, 1
ret i64 %xor
}
define i16 @XOR_SHORT(i16 %x, i16 %y) {
; CHECK-LABEL: XOR_SHORT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xor16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: XOR_SHORT:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: xor16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i16 %y, %x
ret i16 %xor
}
define i16 @XOR_SHORT_I(i16 %x) {
; CHECK-LABEL: XOR_SHORT_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xori32 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: XOR_SHORT_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: xor16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i16 %x, 1
ret i16 %xor
}
define i8 @XOR_CHAR(i8 %x, i8 %y) {
; CHECK-LABEL: XOR_CHAR:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xor16 a0, a1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: XOR_CHAR:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: xor16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i8 %y, %x
ret i8 %xor
}
define i8 @XOR_CHAR_I(i8 %x) {
; CHECK-LABEL: XOR_CHAR_I:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xori32 a0, a0, 1
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: XOR_CHAR_I:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: movi16 a1, 1
; GENERIC-NEXT: xor16 a0, a1
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%xor = xor i8 %x, 1
ret i8 %xor
}
; i64 --> i32/i16/i8/i1
define i32 @truncR_i64_0(i64 %x) {
; CHECK-LABEL: truncR_i64_0:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i64_0:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i64 %x to i32
ret i32 %trunc
}
define i16 @truncR_i64_1(i64 %x) {
; CHECK-LABEL: truncR_i64_1:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i64_1:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i64 %x to i16
ret i16 %trunc
}
define i8 @truncR_i64_2(i64 %x) {
; CHECK-LABEL: truncR_i64_2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i64_2:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i64 %x to i8
ret i8 %trunc
}
define i1 @truncR_i64_3(i64 %x) {
; CHECK-LABEL: truncR_i64_3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i64_3:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i64 %x to i1
ret i1 %trunc
}
; i32 --> i16/i8/i1
define i16 @truncR_i32_1(i32 %x) {
; CHECK-LABEL: truncR_i32_1:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i32_1:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i32 %x to i16
ret i16 %trunc
}
define i8 @truncR_i32_2(i32 %x) {
; CHECK-LABEL: truncR_i32_2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i32_2:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i32 %x to i8
ret i8 %trunc
}
define i1 @truncR_i32_3(i32 %x) {
; CHECK-LABEL: truncR_i32_3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i32_3:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i32 %x to i1
ret i1 %trunc
}
; i16 --> i8/i1
define i8 @truncR_i16_2(i16 %x) {
; CHECK-LABEL: truncR_i16_2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i16_2:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i16 %x to i8
ret i8 %trunc
}
define i1 @truncR_i16_3(i16 %x) {
; CHECK-LABEL: truncR_i16_3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i16_3:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i16 %x to i1
ret i1 %trunc
}
;i8 --> i1
define i1 @truncR_i8_3(i8 %x) {
; CHECK-LABEL: truncR_i8_3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rts16
;
; GENERIC-LABEL: truncR_i8_3:
; GENERIC: # %bb.0: # %entry
; GENERIC-NEXT: .cfi_def_cfa_offset 0
; GENERIC-NEXT: subi16 sp, sp, 4
; GENERIC-NEXT: .cfi_def_cfa_offset 4
; GENERIC-NEXT: addi16 sp, sp, 4
; GENERIC-NEXT: rts16
entry:
%trunc = trunc i8 %x to i1
ret i1 %trunc
}