2383 lines
63 KiB
LLVM
2383 lines
63 KiB
LLVM
; 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_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: movih32 a1, 65535
|
|
; CHECK-NEXT: ori32 a1, a1, 65526
|
|
; CHECK-NEXT: addu16 a0, a1
|
|
; 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: movi16 a1, 255
|
|
; GENERIC-NEXT: lsli16 a2, a1, 24
|
|
; GENERIC-NEXT: lsli16 a3, a1, 16
|
|
; GENERIC-NEXT: or16 a3, a2
|
|
; GENERIC-NEXT: lsli16 a1, a1, 8
|
|
; GENERIC-NEXT: or16 a1, a3
|
|
; GENERIC-NEXT: movi16 a2, 246
|
|
; 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, 10
|
|
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: movih32 a1, 65535
|
|
; CHECK-NEXT: ori32 a1, a1, 65535
|
|
; CHECK-NEXT: addu16 a0, a1
|
|
; 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: movi16 a1, 255
|
|
; GENERIC-NEXT: lsli16 a2, a1, 24
|
|
; GENERIC-NEXT: lsli16 a3, a1, 16
|
|
; GENERIC-NEXT: or16 a3, a2
|
|
; GENERIC-NEXT: lsli16 a2, a1, 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 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: movih32 a1, 65535
|
|
; CHECK-NEXT: ori32 a1, a1, 65535
|
|
; CHECK-NEXT: addu16 a0, a1
|
|
; 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: movi16 a1, 255
|
|
; GENERIC-NEXT: lsli16 a2, a1, 24
|
|
; GENERIC-NEXT: lsli16 a3, a1, 16
|
|
; GENERIC-NEXT: or16 a3, a2
|
|
; GENERIC-NEXT: lsli16 a2, a1, 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 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: movi32 a1, 4097
|
|
; CHECK-NEXT: mult16 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: 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: mult16 a0, a1
|
|
; 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: movi16 a1, 3
|
|
; CHECK-NEXT: mult16 a0, a1
|
|
; 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: movi16 a1, 3
|
|
; GENERIC-NEXT: mult16 a0, a1
|
|
; 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: movih32 a1, 65535
|
|
; CHECK-NEXT: ori32 a1, a1, 65533
|
|
; CHECK-NEXT: mult16 a0, a1
|
|
; 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: movi16 a1, 255
|
|
; GENERIC-NEXT: lsli16 a2, a1, 24
|
|
; GENERIC-NEXT: lsli16 a3, a1, 16
|
|
; GENERIC-NEXT: or16 a3, a2
|
|
; GENERIC-NEXT: lsli16 a1, a1, 8
|
|
; GENERIC-NEXT: or16 a1, a3
|
|
; GENERIC-NEXT: movi16 a2, 253
|
|
; GENERIC-NEXT: or16 a2, a1
|
|
; GENERIC-NEXT: mult16 a0, a2
|
|
; 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, [.LCPI25_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
|
|
; GENERIC-NEXT: .LCPI25_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, [.LCPI26_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
|
|
; GENERIC-NEXT: .LCPI26_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, [.LCPI27_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
|
|
; GENERIC-NEXT: .LCPI27_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, [.LCPI28_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
|
|
; GENERIC-NEXT: .LCPI28_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, [.LCPI30_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
|
|
; GENERIC-NEXT: .LCPI30_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, [.LCPI32_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
|
|
; GENERIC-NEXT: .LCPI32_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, [.LCPI33_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
|
|
; GENERIC-NEXT: .LCPI33_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, [.LCPI34_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
|
|
; GENERIC-NEXT: .LCPI34_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, [.LCPI35_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
|
|
; GENERIC-NEXT: .LCPI35_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, [.LCPI37_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
|
|
; GENERIC-NEXT: .LCPI37_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
|
|
}
|