Test cases for rem-seteq fold with illegal types

This also briefly tests a larger set of architectures than the more
exhaustive functionality tests for AArch64 and x86.

As requested in D88785

Reviewed By: RKSimon

Differential Revision: https://reviews.llvm.org/D98339
This commit is contained in:
Simonas Kazlauskas 2021-03-10 15:05:36 +02:00
parent 6b76d82853
commit a2eca31da2
18 changed files with 5838 additions and 0 deletions

View File

@ -0,0 +1,111 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
define i1 @test_srem_odd(i29 %X) nounwind {
; CHECK-LABEL: test_srem_odd:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w9, #33099
; CHECK-NEXT: mov w10, #64874
; CHECK-NEXT: sbfx w8, w0, #0, #29
; CHECK-NEXT: movk w9, #48986, lsl #16
; CHECK-NEXT: movk w10, #330, lsl #16
; CHECK-NEXT: madd w8, w8, w9, w10
; CHECK-NEXT: mov w9, #64213
; CHECK-NEXT: movk w9, #661, lsl #16
; CHECK-NEXT: cmp w8, w9
; CHECK-NEXT: cset w0, lo
; CHECK-NEXT: ret
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; CHECK-LABEL: test_srem_even:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w9, #43691
; CHECK-NEXT: sbfx w8, w0, #0, #4
; CHECK-NEXT: movk w9, #10922, lsl #16
; CHECK-NEXT: smull x9, w8, w9
; CHECK-NEXT: lsr x10, x9, #63
; CHECK-NEXT: lsr x9, x9, #32
; CHECK-NEXT: add w9, w9, w10
; CHECK-NEXT: mov w10, #6
; CHECK-NEXT: msub w8, w9, w10, w8
; CHECK-NEXT: cmp w8, #1 // =1
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; CHECK-LABEL: test_srem_pow2_setne:
; CHECK: // %bb.0:
; CHECK-NEXT: sbfx w8, w0, #0, #6
; CHECK-NEXT: ubfx w8, w8, #9, #2
; CHECK-NEXT: add w8, w0, w8
; CHECK-NEXT: and w8, w8, #0x3c
; CHECK-NEXT: sub w8, w0, w8
; CHECK-NEXT: tst w8, #0x3f
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
; CHECK-LABEL: test_srem_vec:
; CHECK: // %bb.0:
; CHECK-NEXT: mov x10, #7281
; CHECK-NEXT: movk x10, #29127, lsl #16
; CHECK-NEXT: movk x10, #50972, lsl #32
; CHECK-NEXT: sbfx x9, x2, #0, #33
; CHECK-NEXT: movk x10, #7281, lsl #48
; CHECK-NEXT: mov x11, #8589934591
; CHECK-NEXT: mov x12, #7282
; CHECK-NEXT: movk x12, #29127, lsl #16
; CHECK-NEXT: dup v0.2d, x11
; CHECK-NEXT: adrp x11, .LCPI3_0
; CHECK-NEXT: smulh x10, x9, x10
; CHECK-NEXT: movk x12, #50972, lsl #32
; CHECK-NEXT: ldr q1, [x11, :lo12:.LCPI3_0]
; CHECK-NEXT: adrp x11, .LCPI3_1
; CHECK-NEXT: sub x10, x10, x9
; CHECK-NEXT: sbfx x8, x1, #0, #33
; CHECK-NEXT: movk x12, #7281, lsl #48
; CHECK-NEXT: ldr q2, [x11, :lo12:.LCPI3_1]
; CHECK-NEXT: asr x11, x10, #3
; CHECK-NEXT: add x10, x11, x10, lsr #63
; CHECK-NEXT: smulh x11, x8, x12
; CHECK-NEXT: add x11, x11, x11, lsr #63
; CHECK-NEXT: add x11, x11, x11, lsl #3
; CHECK-NEXT: sub x8, x8, x11
; CHECK-NEXT: sbfx x11, x0, #0, #33
; CHECK-NEXT: smulh x12, x11, x12
; CHECK-NEXT: add x12, x12, x12, lsr #63
; CHECK-NEXT: add x12, x12, x12, lsl #3
; CHECK-NEXT: sub x11, x11, x12
; CHECK-NEXT: add x10, x10, x10, lsl #3
; CHECK-NEXT: fmov d3, x11
; CHECK-NEXT: add x9, x9, x10
; CHECK-NEXT: mov v3.d[1], x8
; CHECK-NEXT: fmov d4, x9
; CHECK-NEXT: and v4.16b, v4.16b, v0.16b
; CHECK-NEXT: and v0.16b, v3.16b, v0.16b
; CHECK-NEXT: cmeq v0.2d, v0.2d, v1.2d
; CHECK-NEXT: cmeq v1.2d, v4.2d, v2.2d
; CHECK-NEXT: mvn v0.16b, v0.16b
; CHECK-NEXT: mvn v1.16b, v1.16b
; CHECK-NEXT: xtn v0.2s, v0.2d
; CHECK-NEXT: xtn v1.2s, v1.2d
; CHECK-NEXT: mov w1, v0.s[1]
; CHECK-NEXT: fmov w0, s0
; CHECK-NEXT: fmov w2, s1
; CHECK-NEXT: ret
%srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
%cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,117 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
define i1 @test_urem_odd(i13 %X) nounwind {
; CHECK-LABEL: test_urem_odd:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w9, #52429
; CHECK-NEXT: and w8, w0, #0x1fff
; CHECK-NEXT: movk w9, #52428, lsl #16
; CHECK-NEXT: mul w8, w8, w9
; CHECK-NEXT: mov w9, #13108
; CHECK-NEXT: movk w9, #13107, lsl #16
; CHECK-NEXT: cmp w8, w9
; CHECK-NEXT: cset w0, lo
; CHECK-NEXT: ret
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; CHECK-LABEL: test_urem_even:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w9, #28087
; CHECK-NEXT: and w8, w0, #0x7ffffff
; CHECK-NEXT: movk w9, #46811, lsl #16
; CHECK-NEXT: mul w8, w8, w9
; CHECK-NEXT: mov w9, #9363
; CHECK-NEXT: ror w8, w8, #1
; CHECK-NEXT: movk w9, #4681, lsl #16
; CHECK-NEXT: cmp w8, w9
; CHECK-NEXT: cset w0, lo
; CHECK-NEXT: ret
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; CHECK-LABEL: test_urem_odd_setne:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w9, #52429
; CHECK-NEXT: and w8, w0, #0xf
; CHECK-NEXT: movk w9, #52428, lsl #16
; CHECK-NEXT: mul w8, w8, w9
; CHECK-NEXT: mov w9, #858993459
; CHECK-NEXT: cmp w8, w9
; CHECK-NEXT: cset w0, hi
; CHECK-NEXT: ret
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; CHECK-LABEL: test_urem_negative_odd:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w9, #57651
; CHECK-NEXT: and w8, w0, #0x1ff
; CHECK-NEXT: movk w9, #43302, lsl #16
; CHECK-NEXT: mul w8, w8, w9
; CHECK-NEXT: mov w9, #17191
; CHECK-NEXT: movk w9, #129, lsl #16
; CHECK-NEXT: cmp w8, w9
; CHECK-NEXT: cset w0, hi
; CHECK-NEXT: ret
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; CHECK-LABEL: test_urem_vec:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w12, #43691
; CHECK-NEXT: and w8, w0, #0x7ff
; CHECK-NEXT: movk w12, #43690, lsl #16
; CHECK-NEXT: umull x12, w8, w12
; CHECK-NEXT: mov w11, #25663
; CHECK-NEXT: mov w13, #6
; CHECK-NEXT: lsr x12, x12, #34
; CHECK-NEXT: and w10, w2, #0x7ff
; CHECK-NEXT: movk w11, #160, lsl #16
; CHECK-NEXT: msub w8, w12, w13, w8
; CHECK-NEXT: mov w12, #18725
; CHECK-NEXT: and w9, w1, #0x7ff
; CHECK-NEXT: movk w12, #9362, lsl #16
; CHECK-NEXT: umull x11, w10, w11
; CHECK-NEXT: adrp x13, .LCPI4_0
; CHECK-NEXT: umull x12, w9, w12
; CHECK-NEXT: lsr x11, x11, #32
; CHECK-NEXT: ldr d0, [x13, :lo12:.LCPI4_0]
; CHECK-NEXT: lsr x12, x12, #32
; CHECK-NEXT: sub w13, w10, w11
; CHECK-NEXT: add w11, w11, w13, lsr #1
; CHECK-NEXT: sub w13, w9, w12
; CHECK-NEXT: add w12, w12, w13, lsr #1
; CHECK-NEXT: fmov s1, w8
; CHECK-NEXT: mov w8, #2043
; CHECK-NEXT: lsr w11, w11, #10
; CHECK-NEXT: lsr w12, w12, #2
; CHECK-NEXT: msub w8, w11, w8, w10
; CHECK-NEXT: sub w10, w12, w12, lsl #3
; CHECK-NEXT: add w9, w9, w10
; CHECK-NEXT: mov v1.h[1], w9
; CHECK-NEXT: mov v1.h[2], w8
; CHECK-NEXT: bic v1.4h, #248, lsl #8
; CHECK-NEXT: cmeq v0.4h, v1.4h, v0.4h
; CHECK-NEXT: mvn v0.8b, v0.8b
; CHECK-NEXT: umov w0, v0.h[0]
; CHECK-NEXT: umov w1, v0.h[1]
; CHECK-NEXT: umov w2, v0.h[2]
; CHECK-NEXT: ret
%urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,105 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=amdgcn-amd-mesa3d < %s | FileCheck %s
define i1 @test_srem_odd(i29 %X) nounwind {
; CHECK-LABEL: test_srem_odd:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: v_bfe_i32 v0, v0, 0, 29
; CHECK-NEXT: s_mov_b32 s5, 0xa57eb503
; CHECK-NEXT: s_movk_i32 s4, 0x63
; CHECK-NEXT: v_mul_hi_i32 v1, v0, s5
; CHECK-NEXT: v_add_i32_e32 v1, vcc, v1, v0
; CHECK-NEXT: v_lshrrev_b32_e32 v2, 31, v1
; CHECK-NEXT: v_ashrrev_i32_e32 v1, 6, v1
; CHECK-NEXT: v_add_i32_e32 v1, vcc, v1, v2
; CHECK-NEXT: v_mul_lo_u32 v1, v1, s4
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; CHECK-LABEL: test_srem_even:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: v_bfe_i32 v0, v0, 0, 4
; CHECK-NEXT: s_mov_b32 s4, 0x2aaaaaab
; CHECK-NEXT: v_mul_hi_i32 v1, v0, s4
; CHECK-NEXT: v_lshrrev_b32_e32 v2, 31, v1
; CHECK-NEXT: v_add_i32_e32 v1, vcc, v1, v2
; CHECK-NEXT: v_mul_lo_u32 v1, v1, 6
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; CHECK-LABEL: test_srem_pow2_setne:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: v_bfe_i32 v1, v0, 0, 6
; CHECK-NEXT: v_bfe_u32 v1, v1, 9, 2
; CHECK-NEXT: v_add_i32_e32 v1, vcc, v0, v1
; CHECK-NEXT: v_and_b32_e32 v1, 60, v1
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
; CHECK-NEXT: v_and_b32_e32 v0, 63, v0
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
define <3 x i1> @test_srem_vec(<3 x i31> %X) nounwind {
; CHECK-LABEL: test_srem_vec:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: v_bfe_i32 v3, v2, 0, 31
; CHECK-NEXT: v_bfe_i32 v4, v1, 0, 31
; CHECK-NEXT: v_bfe_i32 v5, v0, 0, 31
; CHECK-NEXT: s_mov_b32 s6, 0x38e38e39
; CHECK-NEXT: s_mov_b32 s7, 0xc71c71c7
; CHECK-NEXT: s_brev_b32 s4, -2
; CHECK-NEXT: s_mov_b32 s5, 0x7ffffffd
; CHECK-NEXT: v_mul_hi_i32 v5, v5, s6
; CHECK-NEXT: v_mul_hi_i32 v4, v4, s6
; CHECK-NEXT: v_mul_hi_i32 v3, v3, s7
; CHECK-NEXT: v_lshrrev_b32_e32 v6, 31, v5
; CHECK-NEXT: v_lshrrev_b32_e32 v5, 1, v5
; CHECK-NEXT: v_lshrrev_b32_e32 v7, 31, v4
; CHECK-NEXT: v_lshrrev_b32_e32 v4, 1, v4
; CHECK-NEXT: v_lshrrev_b32_e32 v8, 31, v3
; CHECK-NEXT: v_lshrrev_b32_e32 v3, 1, v3
; CHECK-NEXT: v_add_i32_e32 v5, vcc, v5, v6
; CHECK-NEXT: v_add_i32_e32 v4, vcc, v4, v7
; CHECK-NEXT: v_add_i32_e32 v3, vcc, v3, v8
; CHECK-NEXT: v_mul_lo_u32 v5, v5, 9
; CHECK-NEXT: v_mul_lo_u32 v4, v4, 9
; CHECK-NEXT: v_mul_lo_u32 v3, v3, -9
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v5
; CHECK-NEXT: v_sub_i32_e32 v1, vcc, v1, v4
; CHECK-NEXT: v_sub_i32_e32 v2, vcc, v2, v3
; CHECK-NEXT: v_and_b32_e32 v2, s4, v2
; CHECK-NEXT: v_and_b32_e32 v1, s4, v1
; CHECK-NEXT: v_and_b32_e32 v0, s4, v0
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 3, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v1
; CHECK-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 3, v2
; CHECK-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%srem = srem <3 x i31> %X, <i31 9, i31 9, i31 -9>
%cmp = icmp ne <3 x i31> %srem, <i31 3, i31 -3, i31 3>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,109 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=amdgcn-amd-mesa3d < %s | FileCheck %s
define i1 @test_urem_odd(i13 %X) nounwind {
; CHECK-LABEL: test_urem_odd:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: v_and_b32_e32 v0, 0x1fff, v0
; CHECK-NEXT: s_mov_b32 s4, 0xcccccccd
; CHECK-NEXT: v_mul_hi_u32 v1, v0, s4
; CHECK-NEXT: v_lshrrev_b32_e32 v1, 2, v1
; CHECK-NEXT: v_mul_lo_u32 v1, v1, 5
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; CHECK-LABEL: test_urem_even:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: v_and_b32_e32 v1, 0x7ffffff, v0
; CHECK-NEXT: v_bfe_u32 v0, v0, 1, 26
; CHECK-NEXT: s_mov_b32 s4, 0x92492493
; CHECK-NEXT: v_mul_hi_u32 v0, v0, s4
; CHECK-NEXT: v_lshrrev_b32_e32 v0, 2, v0
; CHECK-NEXT: v_mul_lo_u32 v0, v0, 14
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v1, v0
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; CHECK-LABEL: test_urem_odd_setne:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: v_and_b32_e32 v0, 15, v0
; CHECK-NEXT: s_mov_b32 s4, 0xcccccccd
; CHECK-NEXT: v_mul_hi_u32 v1, v0, s4
; CHECK-NEXT: v_lshrrev_b32_e32 v1, 2, v1
; CHECK-NEXT: v_mul_lo_u32 v1, v1, 5
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; CHECK-LABEL: test_urem_negative_odd:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: v_and_b32_e32 v0, 0x1ff, v0
; CHECK-NEXT: s_mov_b32 s4, 0x2050c9f9
; CHECK-NEXT: s_movk_i32 s5, 0x1fb
; CHECK-NEXT: v_mul_hi_u32 v1, v0, s4
; CHECK-NEXT: v_lshrrev_b32_e32 v1, 6, v1
; CHECK-NEXT: v_mul_lo_u32 v1, v1, s5
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; CHECK-LABEL: test_urem_vec:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; CHECK-NEXT: s_movk_i32 s4, 0x7ff
; CHECK-NEXT: s_mov_b32 s5, 0x8311eb33
; CHECK-NEXT: s_mov_b32 s6, 0x20140c
; CHECK-NEXT: s_mov_b32 s7, 0xb6db6db7
; CHECK-NEXT: s_mov_b32 s11, 0x49249249
; CHECK-NEXT: s_mov_b32 s8, 0x24924924
; CHECK-NEXT: s_mov_b32 s9, 0xaaaaaaab
; CHECK-NEXT: s_mov_b32 s10, 0x2aaaaaaa
; CHECK-NEXT: v_and_b32_e32 v0, s4, v0
; CHECK-NEXT: v_and_b32_e32 v1, s4, v1
; CHECK-NEXT: v_and_b32_e32 v2, s4, v2
; CHECK-NEXT: v_mul_lo_u32 v2, v2, s5
; CHECK-NEXT: v_mul_lo_u32 v1, v1, s7
; CHECK-NEXT: v_mul_lo_u32 v0, v0, s9
; CHECK-NEXT: v_add_i32_e32 v2, vcc, 0xf9dc299a, v2
; CHECK-NEXT: v_add_i32_e32 v1, vcc, s11, v1
; CHECK-NEXT: v_alignbit_b32 v0, v0, v0, 1
; CHECK-NEXT: v_cmp_lt_u32_e32 vcc, s10, v0
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
; CHECK-NEXT: v_cmp_lt_u32_e32 vcc, s8, v1
; CHECK-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc
; CHECK-NEXT: v_cmp_lt_u32_e32 vcc, s6, v2
; CHECK-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc
; CHECK-NEXT: s_setpc_b64 s[30:31]
%urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,677 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=armv5-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=ARM5
; RUN: llc -mtriple=armv6-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=ARM6
; RUN: llc -mtriple=armv7-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=ARM7
; RUN: llc -mtriple=armv8-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=ARM8
; RUN: llc -mtriple=armv7-unknown-linux-gnu -mattr=+neon < %s | FileCheck %s --check-prefixes=NEON7
; RUN: llc -mtriple=armv8-unknown-linux-gnu -mattr=+neon < %s | FileCheck %s --check-prefixes=NEON8
define i1 @test_srem_odd(i29 %X) nounwind {
; ARM5-LABEL: test_srem_odd:
; ARM5: @ %bb.0:
; ARM5-NEXT: ldr r2, .LCPI0_1
; ARM5-NEXT: lsl r0, r0, #3
; ARM5-NEXT: asr r0, r0, #3
; ARM5-NEXT: ldr r1, .LCPI0_0
; ARM5-NEXT: mla r3, r0, r2, r1
; ARM5-NEXT: ldr r1, .LCPI0_2
; ARM5-NEXT: mov r0, #0
; ARM5-NEXT: cmp r3, r1
; ARM5-NEXT: movlo r0, #1
; ARM5-NEXT: bx lr
; ARM5-NEXT: .p2align 2
; ARM5-NEXT: @ %bb.1:
; ARM5-NEXT: .LCPI0_0:
; ARM5-NEXT: .long 21691754 @ 0x14afd6a
; ARM5-NEXT: .LCPI0_1:
; ARM5-NEXT: .long 3210379595 @ 0xbf5a814b
; ARM5-NEXT: .LCPI0_2:
; ARM5-NEXT: .long 43383509 @ 0x295fad5
;
; ARM6-LABEL: test_srem_odd:
; ARM6: @ %bb.0:
; ARM6-NEXT: ldr r2, .LCPI0_1
; ARM6-NEXT: lsl r0, r0, #3
; ARM6-NEXT: asr r0, r0, #3
; ARM6-NEXT: ldr r1, .LCPI0_0
; ARM6-NEXT: mla r1, r0, r2, r1
; ARM6-NEXT: ldr r2, .LCPI0_2
; ARM6-NEXT: mov r0, #0
; ARM6-NEXT: cmp r1, r2
; ARM6-NEXT: movlo r0, #1
; ARM6-NEXT: bx lr
; ARM6-NEXT: .p2align 2
; ARM6-NEXT: @ %bb.1:
; ARM6-NEXT: .LCPI0_0:
; ARM6-NEXT: .long 21691754 @ 0x14afd6a
; ARM6-NEXT: .LCPI0_1:
; ARM6-NEXT: .long 3210379595 @ 0xbf5a814b
; ARM6-NEXT: .LCPI0_2:
; ARM6-NEXT: .long 43383509 @ 0x295fad5
;
; ARM7-LABEL: test_srem_odd:
; ARM7: @ %bb.0:
; ARM7-NEXT: movw r1, #64874
; ARM7-NEXT: movw r2, #33099
; ARM7-NEXT: sbfx r0, r0, #0, #29
; ARM7-NEXT: movt r1, #330
; ARM7-NEXT: movt r2, #48986
; ARM7-NEXT: mla r1, r0, r2, r1
; ARM7-NEXT: movw r2, #64213
; ARM7-NEXT: movt r2, #661
; ARM7-NEXT: mov r0, #0
; ARM7-NEXT: cmp r1, r2
; ARM7-NEXT: movwlo r0, #1
; ARM7-NEXT: bx lr
;
; ARM8-LABEL: test_srem_odd:
; ARM8: @ %bb.0:
; ARM8-NEXT: movw r1, #64874
; ARM8-NEXT: movw r2, #33099
; ARM8-NEXT: sbfx r0, r0, #0, #29
; ARM8-NEXT: movt r1, #330
; ARM8-NEXT: movt r2, #48986
; ARM8-NEXT: mla r1, r0, r2, r1
; ARM8-NEXT: movw r2, #64213
; ARM8-NEXT: movt r2, #661
; ARM8-NEXT: mov r0, #0
; ARM8-NEXT: cmp r1, r2
; ARM8-NEXT: movwlo r0, #1
; ARM8-NEXT: bx lr
;
; NEON7-LABEL: test_srem_odd:
; NEON7: @ %bb.0:
; NEON7-NEXT: movw r1, #64874
; NEON7-NEXT: movw r2, #33099
; NEON7-NEXT: sbfx r0, r0, #0, #29
; NEON7-NEXT: movt r1, #330
; NEON7-NEXT: movt r2, #48986
; NEON7-NEXT: mla r1, r0, r2, r1
; NEON7-NEXT: movw r2, #64213
; NEON7-NEXT: movt r2, #661
; NEON7-NEXT: mov r0, #0
; NEON7-NEXT: cmp r1, r2
; NEON7-NEXT: movwlo r0, #1
; NEON7-NEXT: bx lr
;
; NEON8-LABEL: test_srem_odd:
; NEON8: @ %bb.0:
; NEON8-NEXT: movw r1, #64874
; NEON8-NEXT: movw r2, #33099
; NEON8-NEXT: sbfx r0, r0, #0, #29
; NEON8-NEXT: movt r1, #330
; NEON8-NEXT: movt r2, #48986
; NEON8-NEXT: mla r1, r0, r2, r1
; NEON8-NEXT: movw r2, #64213
; NEON8-NEXT: movt r2, #661
; NEON8-NEXT: mov r0, #0
; NEON8-NEXT: cmp r1, r2
; NEON8-NEXT: movwlo r0, #1
; NEON8-NEXT: bx lr
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; ARM5-LABEL: test_srem_even:
; ARM5: @ %bb.0:
; ARM5-NEXT: ldr r2, .LCPI1_0
; ARM5-NEXT: lsl r0, r0, #28
; ARM5-NEXT: asr r12, r0, #28
; ARM5-NEXT: smull r3, r1, r12, r2
; ARM5-NEXT: add r1, r1, r1, lsr #31
; ARM5-NEXT: add r1, r1, r1, lsl #1
; ARM5-NEXT: mvn r1, r1, lsl #1
; ARM5-NEXT: add r0, r1, r0, asr #28
; ARM5-NEXT: clz r0, r0
; ARM5-NEXT: lsr r0, r0, #5
; ARM5-NEXT: bx lr
; ARM5-NEXT: .p2align 2
; ARM5-NEXT: @ %bb.1:
; ARM5-NEXT: .LCPI1_0:
; ARM5-NEXT: .long 715827883 @ 0x2aaaaaab
;
; ARM6-LABEL: test_srem_even:
; ARM6: @ %bb.0:
; ARM6-NEXT: ldr r2, .LCPI1_0
; ARM6-NEXT: lsl r0, r0, #28
; ARM6-NEXT: asr r1, r0, #28
; ARM6-NEXT: smmul r1, r1, r2
; ARM6-NEXT: add r1, r1, r1, lsr #31
; ARM6-NEXT: add r1, r1, r1, lsl #1
; ARM6-NEXT: mvn r1, r1, lsl #1
; ARM6-NEXT: add r0, r1, r0, asr #28
; ARM6-NEXT: clz r0, r0
; ARM6-NEXT: lsr r0, r0, #5
; ARM6-NEXT: bx lr
; ARM6-NEXT: .p2align 2
; ARM6-NEXT: @ %bb.1:
; ARM6-NEXT: .LCPI1_0:
; ARM6-NEXT: .long 715827883 @ 0x2aaaaaab
;
; ARM7-LABEL: test_srem_even:
; ARM7: @ %bb.0:
; ARM7-NEXT: movw r2, #43691
; ARM7-NEXT: sbfx r1, r0, #0, #4
; ARM7-NEXT: movt r2, #10922
; ARM7-NEXT: lsl r0, r0, #28
; ARM7-NEXT: smmul r1, r1, r2
; ARM7-NEXT: add r1, r1, r1, lsr #31
; ARM7-NEXT: add r1, r1, r1, lsl #1
; ARM7-NEXT: mvn r1, r1, lsl #1
; ARM7-NEXT: add r0, r1, r0, asr #28
; ARM7-NEXT: clz r0, r0
; ARM7-NEXT: lsr r0, r0, #5
; ARM7-NEXT: bx lr
;
; ARM8-LABEL: test_srem_even:
; ARM8: @ %bb.0:
; ARM8-NEXT: movw r2, #43691
; ARM8-NEXT: sbfx r1, r0, #0, #4
; ARM8-NEXT: movt r2, #10922
; ARM8-NEXT: lsl r0, r0, #28
; ARM8-NEXT: smmul r1, r1, r2
; ARM8-NEXT: add r1, r1, r1, lsr #31
; ARM8-NEXT: add r1, r1, r1, lsl #1
; ARM8-NEXT: mvn r1, r1, lsl #1
; ARM8-NEXT: add r0, r1, r0, asr #28
; ARM8-NEXT: clz r0, r0
; ARM8-NEXT: lsr r0, r0, #5
; ARM8-NEXT: bx lr
;
; NEON7-LABEL: test_srem_even:
; NEON7: @ %bb.0:
; NEON7-NEXT: movw r2, #43691
; NEON7-NEXT: sbfx r1, r0, #0, #4
; NEON7-NEXT: movt r2, #10922
; NEON7-NEXT: lsl r0, r0, #28
; NEON7-NEXT: smmul r1, r1, r2
; NEON7-NEXT: add r1, r1, r1, lsr #31
; NEON7-NEXT: add r1, r1, r1, lsl #1
; NEON7-NEXT: mvn r1, r1, lsl #1
; NEON7-NEXT: add r0, r1, r0, asr #28
; NEON7-NEXT: clz r0, r0
; NEON7-NEXT: lsr r0, r0, #5
; NEON7-NEXT: bx lr
;
; NEON8-LABEL: test_srem_even:
; NEON8: @ %bb.0:
; NEON8-NEXT: movw r2, #43691
; NEON8-NEXT: sbfx r1, r0, #0, #4
; NEON8-NEXT: movt r2, #10922
; NEON8-NEXT: lsl r0, r0, #28
; NEON8-NEXT: smmul r1, r1, r2
; NEON8-NEXT: add r1, r1, r1, lsr #31
; NEON8-NEXT: add r1, r1, r1, lsl #1
; NEON8-NEXT: mvn r1, r1, lsl #1
; NEON8-NEXT: add r0, r1, r0, asr #28
; NEON8-NEXT: clz r0, r0
; NEON8-NEXT: lsr r0, r0, #5
; NEON8-NEXT: bx lr
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; ARM5-LABEL: test_srem_pow2_setne:
; ARM5: @ %bb.0:
; ARM5-NEXT: lsl r1, r0, #26
; ARM5-NEXT: mov r2, #3
; ARM5-NEXT: asr r1, r1, #26
; ARM5-NEXT: and r1, r2, r1, lsr #9
; ARM5-NEXT: add r1, r0, r1
; ARM5-NEXT: and r1, r1, #60
; ARM5-NEXT: sub r0, r0, r1
; ARM5-NEXT: ands r0, r0, #63
; ARM5-NEXT: movne r0, #1
; ARM5-NEXT: bx lr
;
; ARM6-LABEL: test_srem_pow2_setne:
; ARM6: @ %bb.0:
; ARM6-NEXT: lsl r1, r0, #26
; ARM6-NEXT: mov r2, #3
; ARM6-NEXT: asr r1, r1, #26
; ARM6-NEXT: and r1, r2, r1, lsr #9
; ARM6-NEXT: add r1, r0, r1
; ARM6-NEXT: and r1, r1, #60
; ARM6-NEXT: sub r0, r0, r1
; ARM6-NEXT: ands r0, r0, #63
; ARM6-NEXT: movne r0, #1
; ARM6-NEXT: bx lr
;
; ARM7-LABEL: test_srem_pow2_setne:
; ARM7: @ %bb.0:
; ARM7-NEXT: sbfx r1, r0, #0, #6
; ARM7-NEXT: ubfx r1, r1, #9, #2
; ARM7-NEXT: add r1, r0, r1
; ARM7-NEXT: and r1, r1, #60
; ARM7-NEXT: sub r0, r0, r1
; ARM7-NEXT: ands r0, r0, #63
; ARM7-NEXT: movwne r0, #1
; ARM7-NEXT: bx lr
;
; ARM8-LABEL: test_srem_pow2_setne:
; ARM8: @ %bb.0:
; ARM8-NEXT: sbfx r1, r0, #0, #6
; ARM8-NEXT: ubfx r1, r1, #9, #2
; ARM8-NEXT: add r1, r0, r1
; ARM8-NEXT: and r1, r1, #60
; ARM8-NEXT: sub r0, r0, r1
; ARM8-NEXT: ands r0, r0, #63
; ARM8-NEXT: movwne r0, #1
; ARM8-NEXT: bx lr
;
; NEON7-LABEL: test_srem_pow2_setne:
; NEON7: @ %bb.0:
; NEON7-NEXT: sbfx r1, r0, #0, #6
; NEON7-NEXT: ubfx r1, r1, #9, #2
; NEON7-NEXT: add r1, r0, r1
; NEON7-NEXT: and r1, r1, #60
; NEON7-NEXT: sub r0, r0, r1
; NEON7-NEXT: ands r0, r0, #63
; NEON7-NEXT: movwne r0, #1
; NEON7-NEXT: bx lr
;
; NEON8-LABEL: test_srem_pow2_setne:
; NEON8: @ %bb.0:
; NEON8-NEXT: sbfx r1, r0, #0, #6
; NEON8-NEXT: ubfx r1, r1, #9, #2
; NEON8-NEXT: add r1, r0, r1
; NEON8-NEXT: and r1, r1, #60
; NEON8-NEXT: sub r0, r0, r1
; NEON8-NEXT: ands r0, r0, #63
; NEON8-NEXT: movwne r0, #1
; NEON8-NEXT: bx lr
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
; ARM5-LABEL: test_srem_vec:
; ARM5: @ %bb.0:
; ARM5-NEXT: push {r4, r5, r6, lr}
; ARM5-NEXT: and r1, r1, #1
; ARM5-NEXT: mov r5, r3
; ARM5-NEXT: rsb r1, r1, #0
; ARM5-NEXT: mov r6, r2
; ARM5-NEXT: mov r2, #9
; ARM5-NEXT: mov r3, #0
; ARM5-NEXT: bl __moddi3
; ARM5-NEXT: eor r0, r0, #3
; ARM5-NEXT: mov r2, #9
; ARM5-NEXT: orrs r4, r0, r1
; ARM5-NEXT: and r0, r5, #1
; ARM5-NEXT: rsb r1, r0, #0
; ARM5-NEXT: mov r0, r6
; ARM5-NEXT: mov r3, #0
; ARM5-NEXT: movne r4, #1
; ARM5-NEXT: bl __moddi3
; ARM5-NEXT: mov r2, #1
; ARM5-NEXT: bic r1, r2, r1
; ARM5-NEXT: mvn r2, #2
; ARM5-NEXT: eor r0, r0, r2
; ARM5-NEXT: orrs r5, r0, r1
; ARM5-NEXT: ldr r0, [sp, #20]
; ARM5-NEXT: mvn r2, #8
; ARM5-NEXT: mvn r3, #0
; ARM5-NEXT: and r0, r0, #1
; ARM5-NEXT: movne r5, #1
; ARM5-NEXT: rsb r1, r0, #0
; ARM5-NEXT: ldr r0, [sp, #16]
; ARM5-NEXT: bl __moddi3
; ARM5-NEXT: eor r0, r0, #3
; ARM5-NEXT: orrs r2, r0, r1
; ARM5-NEXT: mov r0, r4
; ARM5-NEXT: movne r2, #1
; ARM5-NEXT: mov r1, r5
; ARM5-NEXT: pop {r4, r5, r6, pc}
;
; ARM6-LABEL: test_srem_vec:
; ARM6: @ %bb.0:
; ARM6-NEXT: push {r4, r5, r6, lr}
; ARM6-NEXT: and r1, r1, #1
; ARM6-NEXT: mov r5, r3
; ARM6-NEXT: rsb r1, r1, #0
; ARM6-NEXT: mov r6, r2
; ARM6-NEXT: mov r2, #9
; ARM6-NEXT: mov r3, #0
; ARM6-NEXT: bl __moddi3
; ARM6-NEXT: eor r0, r0, #3
; ARM6-NEXT: mov r2, #9
; ARM6-NEXT: orrs r4, r0, r1
; ARM6-NEXT: and r0, r5, #1
; ARM6-NEXT: rsb r1, r0, #0
; ARM6-NEXT: mov r0, r6
; ARM6-NEXT: mov r3, #0
; ARM6-NEXT: movne r4, #1
; ARM6-NEXT: bl __moddi3
; ARM6-NEXT: mov r2, #1
; ARM6-NEXT: bic r1, r2, r1
; ARM6-NEXT: mvn r2, #2
; ARM6-NEXT: eor r0, r0, r2
; ARM6-NEXT: orrs r5, r0, r1
; ARM6-NEXT: ldr r0, [sp, #20]
; ARM6-NEXT: mvn r2, #8
; ARM6-NEXT: mvn r3, #0
; ARM6-NEXT: and r0, r0, #1
; ARM6-NEXT: movne r5, #1
; ARM6-NEXT: rsb r1, r0, #0
; ARM6-NEXT: ldr r0, [sp, #16]
; ARM6-NEXT: bl __moddi3
; ARM6-NEXT: eor r0, r0, #3
; ARM6-NEXT: orrs r2, r0, r1
; ARM6-NEXT: mov r0, r4
; ARM6-NEXT: movne r2, #1
; ARM6-NEXT: mov r1, r5
; ARM6-NEXT: pop {r4, r5, r6, pc}
;
; ARM7-LABEL: test_srem_vec:
; ARM7: @ %bb.0:
; ARM7-NEXT: push {r4, r5, r6, r7, r11, lr}
; ARM7-NEXT: vpush {d8, d9}
; ARM7-NEXT: mov r5, r0
; ARM7-NEXT: and r0, r3, #1
; ARM7-NEXT: mov r4, r1
; ARM7-NEXT: rsb r1, r0, #0
; ARM7-NEXT: mov r0, r2
; ARM7-NEXT: mov r2, #9
; ARM7-NEXT: mov r3, #0
; ARM7-NEXT: bl __moddi3
; ARM7-NEXT: mov r6, r0
; ARM7-NEXT: and r0, r4, #1
; ARM7-NEXT: mov r7, r1
; ARM7-NEXT: rsb r1, r0, #0
; ARM7-NEXT: mov r0, r5
; ARM7-NEXT: mov r2, #9
; ARM7-NEXT: mov r3, #0
; ARM7-NEXT: bl __moddi3
; ARM7-NEXT: vmov.32 d8[0], r0
; ARM7-NEXT: ldr r0, [sp, #44]
; ARM7-NEXT: ldr r2, [sp, #40]
; ARM7-NEXT: mov r4, r1
; ARM7-NEXT: and r0, r0, #1
; ARM7-NEXT: mvn r3, #0
; ARM7-NEXT: rsb r1, r0, #0
; ARM7-NEXT: vmov.32 d9[0], r6
; ARM7-NEXT: mov r0, r2
; ARM7-NEXT: mvn r2, #8
; ARM7-NEXT: bl __moddi3
; ARM7-NEXT: vmov.32 d16[0], r0
; ARM7-NEXT: adr r0, .LCPI3_0
; ARM7-NEXT: vmov.32 d9[1], r7
; ARM7-NEXT: vld1.64 {d18, d19}, [r0:128]
; ARM7-NEXT: adr r0, .LCPI3_1
; ARM7-NEXT: vmov.32 d16[1], r1
; ARM7-NEXT: vmov.32 d8[1], r4
; ARM7-NEXT: vand q8, q8, q9
; ARM7-NEXT: vld1.64 {d20, d21}, [r0:128]
; ARM7-NEXT: adr r0, .LCPI3_2
; ARM7-NEXT: vand q11, q4, q9
; ARM7-NEXT: vld1.64 {d18, d19}, [r0:128]
; ARM7-NEXT: vceq.i32 q10, q11, q10
; ARM7-NEXT: vceq.i32 q8, q8, q9
; ARM7-NEXT: vrev64.32 q9, q10
; ARM7-NEXT: vrev64.32 q11, q8
; ARM7-NEXT: vand q9, q10, q9
; ARM7-NEXT: vand q8, q8, q11
; ARM7-NEXT: vmvn q9, q9
; ARM7-NEXT: vmvn q8, q8
; ARM7-NEXT: vmovn.i64 d18, q9
; ARM7-NEXT: vmovn.i64 d16, q8
; ARM7-NEXT: vmov.32 r0, d18[0]
; ARM7-NEXT: vmov.32 r1, d18[1]
; ARM7-NEXT: vmov.32 r2, d16[0]
; ARM7-NEXT: vpop {d8, d9}
; ARM7-NEXT: pop {r4, r5, r6, r7, r11, pc}
; ARM7-NEXT: .p2align 4
; ARM7-NEXT: @ %bb.1:
; ARM7-NEXT: .LCPI3_0:
; ARM7-NEXT: .long 4294967295 @ 0xffffffff
; ARM7-NEXT: .long 1 @ 0x1
; ARM7-NEXT: .long 4294967295 @ 0xffffffff
; ARM7-NEXT: .long 1 @ 0x1
; ARM7-NEXT: .LCPI3_1:
; ARM7-NEXT: .long 3 @ 0x3
; ARM7-NEXT: .long 0 @ 0x0
; ARM7-NEXT: .long 4294967293 @ 0xfffffffd
; ARM7-NEXT: .long 1 @ 0x1
; ARM7-NEXT: .LCPI3_2:
; ARM7-NEXT: .long 3 @ 0x3
; ARM7-NEXT: .long 0 @ 0x0
; ARM7-NEXT: .zero 4
; ARM7-NEXT: .long 0 @ 0x0
;
; ARM8-LABEL: test_srem_vec:
; ARM8: @ %bb.0:
; ARM8-NEXT: push {r4, r5, r6, r7, r11, lr}
; ARM8-NEXT: vpush {d8, d9}
; ARM8-NEXT: mov r5, r0
; ARM8-NEXT: and r0, r3, #1
; ARM8-NEXT: mov r4, r1
; ARM8-NEXT: rsb r1, r0, #0
; ARM8-NEXT: mov r0, r2
; ARM8-NEXT: mov r2, #9
; ARM8-NEXT: mov r3, #0
; ARM8-NEXT: bl __moddi3
; ARM8-NEXT: mov r6, r0
; ARM8-NEXT: and r0, r4, #1
; ARM8-NEXT: mov r7, r1
; ARM8-NEXT: rsb r1, r0, #0
; ARM8-NEXT: mov r0, r5
; ARM8-NEXT: mov r2, #9
; ARM8-NEXT: mov r3, #0
; ARM8-NEXT: bl __moddi3
; ARM8-NEXT: vmov.32 d8[0], r0
; ARM8-NEXT: ldr r0, [sp, #44]
; ARM8-NEXT: ldr r2, [sp, #40]
; ARM8-NEXT: mov r4, r1
; ARM8-NEXT: and r0, r0, #1
; ARM8-NEXT: mvn r3, #0
; ARM8-NEXT: rsb r1, r0, #0
; ARM8-NEXT: vmov.32 d9[0], r6
; ARM8-NEXT: mov r0, r2
; ARM8-NEXT: mvn r2, #8
; ARM8-NEXT: bl __moddi3
; ARM8-NEXT: vmov.32 d16[0], r0
; ARM8-NEXT: adr r0, .LCPI3_0
; ARM8-NEXT: vmov.32 d9[1], r7
; ARM8-NEXT: vld1.64 {d18, d19}, [r0:128]
; ARM8-NEXT: adr r0, .LCPI3_1
; ARM8-NEXT: vmov.32 d16[1], r1
; ARM8-NEXT: vmov.32 d8[1], r4
; ARM8-NEXT: vand q8, q8, q9
; ARM8-NEXT: vld1.64 {d20, d21}, [r0:128]
; ARM8-NEXT: adr r0, .LCPI3_2
; ARM8-NEXT: vand q11, q4, q9
; ARM8-NEXT: vld1.64 {d18, d19}, [r0:128]
; ARM8-NEXT: vceq.i32 q10, q11, q10
; ARM8-NEXT: vceq.i32 q8, q8, q9
; ARM8-NEXT: vrev64.32 q9, q10
; ARM8-NEXT: vrev64.32 q11, q8
; ARM8-NEXT: vand q9, q10, q9
; ARM8-NEXT: vand q8, q8, q11
; ARM8-NEXT: vmvn q9, q9
; ARM8-NEXT: vmvn q8, q8
; ARM8-NEXT: vmovn.i64 d18, q9
; ARM8-NEXT: vmovn.i64 d16, q8
; ARM8-NEXT: vmov.32 r0, d18[0]
; ARM8-NEXT: vmov.32 r1, d18[1]
; ARM8-NEXT: vmov.32 r2, d16[0]
; ARM8-NEXT: vpop {d8, d9}
; ARM8-NEXT: pop {r4, r5, r6, r7, r11, pc}
; ARM8-NEXT: .p2align 4
; ARM8-NEXT: @ %bb.1:
; ARM8-NEXT: .LCPI3_0:
; ARM8-NEXT: .long 4294967295 @ 0xffffffff
; ARM8-NEXT: .long 1 @ 0x1
; ARM8-NEXT: .long 4294967295 @ 0xffffffff
; ARM8-NEXT: .long 1 @ 0x1
; ARM8-NEXT: .LCPI3_1:
; ARM8-NEXT: .long 3 @ 0x3
; ARM8-NEXT: .long 0 @ 0x0
; ARM8-NEXT: .long 4294967293 @ 0xfffffffd
; ARM8-NEXT: .long 1 @ 0x1
; ARM8-NEXT: .LCPI3_2:
; ARM8-NEXT: .long 3 @ 0x3
; ARM8-NEXT: .long 0 @ 0x0
; ARM8-NEXT: .zero 4
; ARM8-NEXT: .long 0 @ 0x0
;
; NEON7-LABEL: test_srem_vec:
; NEON7: @ %bb.0:
; NEON7-NEXT: push {r4, r5, r6, r7, r11, lr}
; NEON7-NEXT: vpush {d8, d9}
; NEON7-NEXT: mov r5, r0
; NEON7-NEXT: and r0, r3, #1
; NEON7-NEXT: mov r4, r1
; NEON7-NEXT: rsb r1, r0, #0
; NEON7-NEXT: mov r0, r2
; NEON7-NEXT: mov r2, #9
; NEON7-NEXT: mov r3, #0
; NEON7-NEXT: bl __moddi3
; NEON7-NEXT: mov r6, r0
; NEON7-NEXT: and r0, r4, #1
; NEON7-NEXT: mov r7, r1
; NEON7-NEXT: rsb r1, r0, #0
; NEON7-NEXT: mov r0, r5
; NEON7-NEXT: mov r2, #9
; NEON7-NEXT: mov r3, #0
; NEON7-NEXT: bl __moddi3
; NEON7-NEXT: vmov.32 d8[0], r0
; NEON7-NEXT: ldr r0, [sp, #44]
; NEON7-NEXT: ldr r2, [sp, #40]
; NEON7-NEXT: mov r4, r1
; NEON7-NEXT: and r0, r0, #1
; NEON7-NEXT: mvn r3, #0
; NEON7-NEXT: rsb r1, r0, #0
; NEON7-NEXT: vmov.32 d9[0], r6
; NEON7-NEXT: mov r0, r2
; NEON7-NEXT: mvn r2, #8
; NEON7-NEXT: bl __moddi3
; NEON7-NEXT: vmov.32 d16[0], r0
; NEON7-NEXT: adr r0, .LCPI3_0
; NEON7-NEXT: vmov.32 d9[1], r7
; NEON7-NEXT: vld1.64 {d18, d19}, [r0:128]
; NEON7-NEXT: adr r0, .LCPI3_1
; NEON7-NEXT: vmov.32 d16[1], r1
; NEON7-NEXT: vmov.32 d8[1], r4
; NEON7-NEXT: vand q8, q8, q9
; NEON7-NEXT: vld1.64 {d20, d21}, [r0:128]
; NEON7-NEXT: adr r0, .LCPI3_2
; NEON7-NEXT: vand q11, q4, q9
; NEON7-NEXT: vld1.64 {d18, d19}, [r0:128]
; NEON7-NEXT: vceq.i32 q10, q11, q10
; NEON7-NEXT: vceq.i32 q8, q8, q9
; NEON7-NEXT: vrev64.32 q9, q10
; NEON7-NEXT: vrev64.32 q11, q8
; NEON7-NEXT: vand q9, q10, q9
; NEON7-NEXT: vand q8, q8, q11
; NEON7-NEXT: vmvn q9, q9
; NEON7-NEXT: vmvn q8, q8
; NEON7-NEXT: vmovn.i64 d18, q9
; NEON7-NEXT: vmovn.i64 d16, q8
; NEON7-NEXT: vmov.32 r0, d18[0]
; NEON7-NEXT: vmov.32 r1, d18[1]
; NEON7-NEXT: vmov.32 r2, d16[0]
; NEON7-NEXT: vpop {d8, d9}
; NEON7-NEXT: pop {r4, r5, r6, r7, r11, pc}
; NEON7-NEXT: .p2align 4
; NEON7-NEXT: @ %bb.1:
; NEON7-NEXT: .LCPI3_0:
; NEON7-NEXT: .long 4294967295 @ 0xffffffff
; NEON7-NEXT: .long 1 @ 0x1
; NEON7-NEXT: .long 4294967295 @ 0xffffffff
; NEON7-NEXT: .long 1 @ 0x1
; NEON7-NEXT: .LCPI3_1:
; NEON7-NEXT: .long 3 @ 0x3
; NEON7-NEXT: .long 0 @ 0x0
; NEON7-NEXT: .long 4294967293 @ 0xfffffffd
; NEON7-NEXT: .long 1 @ 0x1
; NEON7-NEXT: .LCPI3_2:
; NEON7-NEXT: .long 3 @ 0x3
; NEON7-NEXT: .long 0 @ 0x0
; NEON7-NEXT: .zero 4
; NEON7-NEXT: .long 0 @ 0x0
;
; NEON8-LABEL: test_srem_vec:
; NEON8: @ %bb.0:
; NEON8-NEXT: push {r4, r5, r6, r7, r11, lr}
; NEON8-NEXT: vpush {d8, d9}
; NEON8-NEXT: mov r5, r0
; NEON8-NEXT: and r0, r3, #1
; NEON8-NEXT: mov r4, r1
; NEON8-NEXT: rsb r1, r0, #0
; NEON8-NEXT: mov r0, r2
; NEON8-NEXT: mov r2, #9
; NEON8-NEXT: mov r3, #0
; NEON8-NEXT: bl __moddi3
; NEON8-NEXT: mov r6, r0
; NEON8-NEXT: and r0, r4, #1
; NEON8-NEXT: mov r7, r1
; NEON8-NEXT: rsb r1, r0, #0
; NEON8-NEXT: mov r0, r5
; NEON8-NEXT: mov r2, #9
; NEON8-NEXT: mov r3, #0
; NEON8-NEXT: bl __moddi3
; NEON8-NEXT: vmov.32 d8[0], r0
; NEON8-NEXT: ldr r0, [sp, #44]
; NEON8-NEXT: ldr r2, [sp, #40]
; NEON8-NEXT: mov r4, r1
; NEON8-NEXT: and r0, r0, #1
; NEON8-NEXT: mvn r3, #0
; NEON8-NEXT: rsb r1, r0, #0
; NEON8-NEXT: vmov.32 d9[0], r6
; NEON8-NEXT: mov r0, r2
; NEON8-NEXT: mvn r2, #8
; NEON8-NEXT: bl __moddi3
; NEON8-NEXT: vmov.32 d16[0], r0
; NEON8-NEXT: adr r0, .LCPI3_0
; NEON8-NEXT: vmov.32 d9[1], r7
; NEON8-NEXT: vld1.64 {d18, d19}, [r0:128]
; NEON8-NEXT: adr r0, .LCPI3_1
; NEON8-NEXT: vmov.32 d16[1], r1
; NEON8-NEXT: vmov.32 d8[1], r4
; NEON8-NEXT: vand q8, q8, q9
; NEON8-NEXT: vld1.64 {d20, d21}, [r0:128]
; NEON8-NEXT: adr r0, .LCPI3_2
; NEON8-NEXT: vand q11, q4, q9
; NEON8-NEXT: vld1.64 {d18, d19}, [r0:128]
; NEON8-NEXT: vceq.i32 q10, q11, q10
; NEON8-NEXT: vceq.i32 q8, q8, q9
; NEON8-NEXT: vrev64.32 q9, q10
; NEON8-NEXT: vrev64.32 q11, q8
; NEON8-NEXT: vand q9, q10, q9
; NEON8-NEXT: vand q8, q8, q11
; NEON8-NEXT: vmvn q9, q9
; NEON8-NEXT: vmvn q8, q8
; NEON8-NEXT: vmovn.i64 d18, q9
; NEON8-NEXT: vmovn.i64 d16, q8
; NEON8-NEXT: vmov.32 r0, d18[0]
; NEON8-NEXT: vmov.32 r1, d18[1]
; NEON8-NEXT: vmov.32 r2, d16[0]
; NEON8-NEXT: vpop {d8, d9}
; NEON8-NEXT: pop {r4, r5, r6, r7, r11, pc}
; NEON8-NEXT: .p2align 4
; NEON8-NEXT: @ %bb.1:
; NEON8-NEXT: .LCPI3_0:
; NEON8-NEXT: .long 4294967295 @ 0xffffffff
; NEON8-NEXT: .long 1 @ 0x1
; NEON8-NEXT: .long 4294967295 @ 0xffffffff
; NEON8-NEXT: .long 1 @ 0x1
; NEON8-NEXT: .LCPI3_1:
; NEON8-NEXT: .long 3 @ 0x3
; NEON8-NEXT: .long 0 @ 0x0
; NEON8-NEXT: .long 4294967293 @ 0xfffffffd
; NEON8-NEXT: .long 1 @ 0x1
; NEON8-NEXT: .LCPI3_2:
; NEON8-NEXT: .long 3 @ 0x3
; NEON8-NEXT: .long 0 @ 0x0
; NEON8-NEXT: .zero 4
; NEON8-NEXT: .long 0 @ 0x0
%srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
%cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,767 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=armv5-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=ARM5
; RUN: llc -mtriple=armv6-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=ARM6
; RUN: llc -mtriple=armv7-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=ARM7
; RUN: llc -mtriple=armv8-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=ARM8
; RUN: llc -mtriple=armv7-unknown-linux-gnu -mattr=+neon < %s | FileCheck %s --check-prefixes=NEON7
; RUN: llc -mtriple=armv8-unknown-linux-gnu -mattr=+neon < %s | FileCheck %s --check-prefixes=NEON8
define i1 @test_urem_odd(i13 %X) nounwind {
; ARM5-LABEL: test_urem_odd:
; ARM5: @ %bb.0:
; ARM5-NEXT: mov r1, #255
; ARM5-NEXT: orr r1, r1, #7936
; ARM5-NEXT: and r0, r0, r1
; ARM5-NEXT: ldr r1, .LCPI0_0
; ARM5-NEXT: mul r2, r0, r1
; ARM5-NEXT: ldr r1, .LCPI0_1
; ARM5-NEXT: mov r0, #0
; ARM5-NEXT: cmp r2, r1
; ARM5-NEXT: movlo r0, #1
; ARM5-NEXT: bx lr
; ARM5-NEXT: .p2align 2
; ARM5-NEXT: @ %bb.1:
; ARM5-NEXT: .LCPI0_0:
; ARM5-NEXT: .long 3435973837 @ 0xcccccccd
; ARM5-NEXT: .LCPI0_1:
; ARM5-NEXT: .long 858993460 @ 0x33333334
;
; ARM6-LABEL: test_urem_odd:
; ARM6: @ %bb.0:
; ARM6-NEXT: mov r1, #255
; ARM6-NEXT: ldr r2, .LCPI0_1
; ARM6-NEXT: orr r1, r1, #7936
; ARM6-NEXT: and r0, r0, r1
; ARM6-NEXT: ldr r1, .LCPI0_0
; ARM6-NEXT: mul r1, r0, r1
; ARM6-NEXT: mov r0, #0
; ARM6-NEXT: cmp r1, r2
; ARM6-NEXT: movlo r0, #1
; ARM6-NEXT: bx lr
; ARM6-NEXT: .p2align 2
; ARM6-NEXT: @ %bb.1:
; ARM6-NEXT: .LCPI0_0:
; ARM6-NEXT: .long 3435973837 @ 0xcccccccd
; ARM6-NEXT: .LCPI0_1:
; ARM6-NEXT: .long 858993460 @ 0x33333334
;
; ARM7-LABEL: test_urem_odd:
; ARM7: @ %bb.0:
; ARM7-NEXT: movw r1, #52429
; ARM7-NEXT: bfc r0, #13, #19
; ARM7-NEXT: movt r1, #52428
; ARM7-NEXT: movw r2, #13108
; ARM7-NEXT: mul r1, r0, r1
; ARM7-NEXT: movt r2, #13107
; ARM7-NEXT: mov r0, #0
; ARM7-NEXT: cmp r1, r2
; ARM7-NEXT: movwlo r0, #1
; ARM7-NEXT: bx lr
;
; ARM8-LABEL: test_urem_odd:
; ARM8: @ %bb.0:
; ARM8-NEXT: movw r1, #52429
; ARM8-NEXT: bfc r0, #13, #19
; ARM8-NEXT: movt r1, #52428
; ARM8-NEXT: movw r2, #13108
; ARM8-NEXT: mul r1, r0, r1
; ARM8-NEXT: movt r2, #13107
; ARM8-NEXT: mov r0, #0
; ARM8-NEXT: cmp r1, r2
; ARM8-NEXT: movwlo r0, #1
; ARM8-NEXT: bx lr
;
; NEON7-LABEL: test_urem_odd:
; NEON7: @ %bb.0:
; NEON7-NEXT: movw r1, #52429
; NEON7-NEXT: bfc r0, #13, #19
; NEON7-NEXT: movt r1, #52428
; NEON7-NEXT: movw r2, #13108
; NEON7-NEXT: mul r1, r0, r1
; NEON7-NEXT: movt r2, #13107
; NEON7-NEXT: mov r0, #0
; NEON7-NEXT: cmp r1, r2
; NEON7-NEXT: movwlo r0, #1
; NEON7-NEXT: bx lr
;
; NEON8-LABEL: test_urem_odd:
; NEON8: @ %bb.0:
; NEON8-NEXT: movw r1, #52429
; NEON8-NEXT: bfc r0, #13, #19
; NEON8-NEXT: movt r1, #52428
; NEON8-NEXT: movw r2, #13108
; NEON8-NEXT: mul r1, r0, r1
; NEON8-NEXT: movt r2, #13107
; NEON8-NEXT: mov r0, #0
; NEON8-NEXT: cmp r1, r2
; NEON8-NEXT: movwlo r0, #1
; NEON8-NEXT: bx lr
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; ARM5-LABEL: test_urem_even:
; ARM5: @ %bb.0:
; ARM5-NEXT: ldr r1, .LCPI1_0
; ARM5-NEXT: bic r0, r0, #-134217728
; ARM5-NEXT: mul r2, r0, r1
; ARM5-NEXT: mov r0, #0
; ARM5-NEXT: ror r1, r2, #1
; ARM5-NEXT: ldr r2, .LCPI1_1
; ARM5-NEXT: cmp r1, r2
; ARM5-NEXT: movlo r0, #1
; ARM5-NEXT: bx lr
; ARM5-NEXT: .p2align 2
; ARM5-NEXT: @ %bb.1:
; ARM5-NEXT: .LCPI1_0:
; ARM5-NEXT: .long 3067833783 @ 0xb6db6db7
; ARM5-NEXT: .LCPI1_1:
; ARM5-NEXT: .long 306783379 @ 0x12492493
;
; ARM6-LABEL: test_urem_even:
; ARM6: @ %bb.0:
; ARM6-NEXT: ldr r1, .LCPI1_0
; ARM6-NEXT: bic r0, r0, #-134217728
; ARM6-NEXT: ldr r2, .LCPI1_1
; ARM6-NEXT: mul r0, r0, r1
; ARM6-NEXT: ror r1, r0, #1
; ARM6-NEXT: mov r0, #0
; ARM6-NEXT: cmp r1, r2
; ARM6-NEXT: movlo r0, #1
; ARM6-NEXT: bx lr
; ARM6-NEXT: .p2align 2
; ARM6-NEXT: @ %bb.1:
; ARM6-NEXT: .LCPI1_0:
; ARM6-NEXT: .long 3067833783 @ 0xb6db6db7
; ARM6-NEXT: .LCPI1_1:
; ARM6-NEXT: .long 306783379 @ 0x12492493
;
; ARM7-LABEL: test_urem_even:
; ARM7: @ %bb.0:
; ARM7-NEXT: movw r1, #28087
; ARM7-NEXT: bic r0, r0, #-134217728
; ARM7-NEXT: movt r1, #46811
; ARM7-NEXT: movw r2, #9363
; ARM7-NEXT: mul r0, r0, r1
; ARM7-NEXT: movt r2, #4681
; ARM7-NEXT: ror r1, r0, #1
; ARM7-NEXT: mov r0, #0
; ARM7-NEXT: cmp r1, r2
; ARM7-NEXT: movwlo r0, #1
; ARM7-NEXT: bx lr
;
; ARM8-LABEL: test_urem_even:
; ARM8: @ %bb.0:
; ARM8-NEXT: movw r1, #28087
; ARM8-NEXT: bic r0, r0, #-134217728
; ARM8-NEXT: movt r1, #46811
; ARM8-NEXT: movw r2, #9363
; ARM8-NEXT: mul r0, r0, r1
; ARM8-NEXT: movt r2, #4681
; ARM8-NEXT: ror r1, r0, #1
; ARM8-NEXT: mov r0, #0
; ARM8-NEXT: cmp r1, r2
; ARM8-NEXT: movwlo r0, #1
; ARM8-NEXT: bx lr
;
; NEON7-LABEL: test_urem_even:
; NEON7: @ %bb.0:
; NEON7-NEXT: movw r1, #28087
; NEON7-NEXT: bic r0, r0, #-134217728
; NEON7-NEXT: movt r1, #46811
; NEON7-NEXT: movw r2, #9363
; NEON7-NEXT: mul r0, r0, r1
; NEON7-NEXT: movt r2, #4681
; NEON7-NEXT: ror r1, r0, #1
; NEON7-NEXT: mov r0, #0
; NEON7-NEXT: cmp r1, r2
; NEON7-NEXT: movwlo r0, #1
; NEON7-NEXT: bx lr
;
; NEON8-LABEL: test_urem_even:
; NEON8: @ %bb.0:
; NEON8-NEXT: movw r1, #28087
; NEON8-NEXT: bic r0, r0, #-134217728
; NEON8-NEXT: movt r1, #46811
; NEON8-NEXT: movw r2, #9363
; NEON8-NEXT: mul r0, r0, r1
; NEON8-NEXT: movt r2, #4681
; NEON8-NEXT: ror r1, r0, #1
; NEON8-NEXT: mov r0, #0
; NEON8-NEXT: cmp r1, r2
; NEON8-NEXT: movwlo r0, #1
; NEON8-NEXT: bx lr
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; ARM5-LABEL: test_urem_odd_setne:
; ARM5: @ %bb.0:
; ARM5-NEXT: ldr r1, .LCPI2_0
; ARM5-NEXT: and r0, r0, #15
; ARM5-NEXT: mul r2, r0, r1
; ARM5-NEXT: ldr r1, .LCPI2_1
; ARM5-NEXT: mov r0, #0
; ARM5-NEXT: cmp r2, r1
; ARM5-NEXT: movhi r0, #1
; ARM5-NEXT: bx lr
; ARM5-NEXT: .p2align 2
; ARM5-NEXT: @ %bb.1:
; ARM5-NEXT: .LCPI2_0:
; ARM5-NEXT: .long 3435973837 @ 0xcccccccd
; ARM5-NEXT: .LCPI2_1:
; ARM5-NEXT: .long 858993459 @ 0x33333333
;
; ARM6-LABEL: test_urem_odd_setne:
; ARM6: @ %bb.0:
; ARM6-NEXT: ldr r1, .LCPI2_0
; ARM6-NEXT: and r0, r0, #15
; ARM6-NEXT: ldr r2, .LCPI2_1
; ARM6-NEXT: mul r1, r0, r1
; ARM6-NEXT: mov r0, #0
; ARM6-NEXT: cmp r1, r2
; ARM6-NEXT: movhi r0, #1
; ARM6-NEXT: bx lr
; ARM6-NEXT: .p2align 2
; ARM6-NEXT: @ %bb.1:
; ARM6-NEXT: .LCPI2_0:
; ARM6-NEXT: .long 3435973837 @ 0xcccccccd
; ARM6-NEXT: .LCPI2_1:
; ARM6-NEXT: .long 858993459 @ 0x33333333
;
; ARM7-LABEL: test_urem_odd_setne:
; ARM7: @ %bb.0:
; ARM7-NEXT: movw r1, #52429
; ARM7-NEXT: and r0, r0, #15
; ARM7-NEXT: movt r1, #52428
; ARM7-NEXT: movw r2, #13107
; ARM7-NEXT: mul r1, r0, r1
; ARM7-NEXT: movt r2, #13107
; ARM7-NEXT: mov r0, #0
; ARM7-NEXT: cmp r1, r2
; ARM7-NEXT: movwhi r0, #1
; ARM7-NEXT: bx lr
;
; ARM8-LABEL: test_urem_odd_setne:
; ARM8: @ %bb.0:
; ARM8-NEXT: movw r1, #52429
; ARM8-NEXT: and r0, r0, #15
; ARM8-NEXT: movt r1, #52428
; ARM8-NEXT: movw r2, #13107
; ARM8-NEXT: mul r1, r0, r1
; ARM8-NEXT: movt r2, #13107
; ARM8-NEXT: mov r0, #0
; ARM8-NEXT: cmp r1, r2
; ARM8-NEXT: movwhi r0, #1
; ARM8-NEXT: bx lr
;
; NEON7-LABEL: test_urem_odd_setne:
; NEON7: @ %bb.0:
; NEON7-NEXT: movw r1, #52429
; NEON7-NEXT: and r0, r0, #15
; NEON7-NEXT: movt r1, #52428
; NEON7-NEXT: movw r2, #13107
; NEON7-NEXT: mul r1, r0, r1
; NEON7-NEXT: movt r2, #13107
; NEON7-NEXT: mov r0, #0
; NEON7-NEXT: cmp r1, r2
; NEON7-NEXT: movwhi r0, #1
; NEON7-NEXT: bx lr
;
; NEON8-LABEL: test_urem_odd_setne:
; NEON8: @ %bb.0:
; NEON8-NEXT: movw r1, #52429
; NEON8-NEXT: and r0, r0, #15
; NEON8-NEXT: movt r1, #52428
; NEON8-NEXT: movw r2, #13107
; NEON8-NEXT: mul r1, r0, r1
; NEON8-NEXT: movt r2, #13107
; NEON8-NEXT: mov r0, #0
; NEON8-NEXT: cmp r1, r2
; NEON8-NEXT: movwhi r0, #1
; NEON8-NEXT: bx lr
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; ARM5-LABEL: test_urem_negative_odd:
; ARM5: @ %bb.0:
; ARM5-NEXT: mov r1, #255
; ARM5-NEXT: orr r1, r1, #256
; ARM5-NEXT: and r0, r0, r1
; ARM5-NEXT: ldr r1, .LCPI3_0
; ARM5-NEXT: mul r2, r0, r1
; ARM5-NEXT: ldr r1, .LCPI3_1
; ARM5-NEXT: mov r0, #0
; ARM5-NEXT: cmp r2, r1
; ARM5-NEXT: movhi r0, #1
; ARM5-NEXT: bx lr
; ARM5-NEXT: .p2align 2
; ARM5-NEXT: @ %bb.1:
; ARM5-NEXT: .LCPI3_0:
; ARM5-NEXT: .long 2837897523 @ 0xa926e133
; ARM5-NEXT: .LCPI3_1:
; ARM5-NEXT: .long 8471335 @ 0x814327
;
; ARM6-LABEL: test_urem_negative_odd:
; ARM6: @ %bb.0:
; ARM6-NEXT: mov r1, #255
; ARM6-NEXT: ldr r2, .LCPI3_1
; ARM6-NEXT: orr r1, r1, #256
; ARM6-NEXT: and r0, r0, r1
; ARM6-NEXT: ldr r1, .LCPI3_0
; ARM6-NEXT: mul r1, r0, r1
; ARM6-NEXT: mov r0, #0
; ARM6-NEXT: cmp r1, r2
; ARM6-NEXT: movhi r0, #1
; ARM6-NEXT: bx lr
; ARM6-NEXT: .p2align 2
; ARM6-NEXT: @ %bb.1:
; ARM6-NEXT: .LCPI3_0:
; ARM6-NEXT: .long 2837897523 @ 0xa926e133
; ARM6-NEXT: .LCPI3_1:
; ARM6-NEXT: .long 8471335 @ 0x814327
;
; ARM7-LABEL: test_urem_negative_odd:
; ARM7: @ %bb.0:
; ARM7-NEXT: movw r1, #57651
; ARM7-NEXT: bfc r0, #9, #23
; ARM7-NEXT: movt r1, #43302
; ARM7-NEXT: movw r2, #17191
; ARM7-NEXT: mul r1, r0, r1
; ARM7-NEXT: movt r2, #129
; ARM7-NEXT: mov r0, #0
; ARM7-NEXT: cmp r1, r2
; ARM7-NEXT: movwhi r0, #1
; ARM7-NEXT: bx lr
;
; ARM8-LABEL: test_urem_negative_odd:
; ARM8: @ %bb.0:
; ARM8-NEXT: movw r1, #57651
; ARM8-NEXT: bfc r0, #9, #23
; ARM8-NEXT: movt r1, #43302
; ARM8-NEXT: movw r2, #17191
; ARM8-NEXT: mul r1, r0, r1
; ARM8-NEXT: movt r2, #129
; ARM8-NEXT: mov r0, #0
; ARM8-NEXT: cmp r1, r2
; ARM8-NEXT: movwhi r0, #1
; ARM8-NEXT: bx lr
;
; NEON7-LABEL: test_urem_negative_odd:
; NEON7: @ %bb.0:
; NEON7-NEXT: movw r1, #57651
; NEON7-NEXT: bfc r0, #9, #23
; NEON7-NEXT: movt r1, #43302
; NEON7-NEXT: movw r2, #17191
; NEON7-NEXT: mul r1, r0, r1
; NEON7-NEXT: movt r2, #129
; NEON7-NEXT: mov r0, #0
; NEON7-NEXT: cmp r1, r2
; NEON7-NEXT: movwhi r0, #1
; NEON7-NEXT: bx lr
;
; NEON8-LABEL: test_urem_negative_odd:
; NEON8: @ %bb.0:
; NEON8-NEXT: movw r1, #57651
; NEON8-NEXT: bfc r0, #9, #23
; NEON8-NEXT: movt r1, #43302
; NEON8-NEXT: movw r2, #17191
; NEON8-NEXT: mul r1, r0, r1
; NEON8-NEXT: movt r2, #129
; NEON8-NEXT: mov r0, #0
; NEON8-NEXT: cmp r1, r2
; NEON8-NEXT: movwhi r0, #1
; NEON8-NEXT: bx lr
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; ARM5-LABEL: test_urem_vec:
; ARM5: @ %bb.0:
; ARM5-NEXT: push {r4, r5, r11, lr}
; ARM5-NEXT: mov r12, #255
; ARM5-NEXT: ldr r3, .LCPI4_1
; ARM5-NEXT: orr r12, r12, #1792
; ARM5-NEXT: ldr lr, .LCPI4_0
; ARM5-NEXT: and r1, r1, r12
; ARM5-NEXT: and r2, r2, r12
; ARM5-NEXT: and r0, r0, r12
; ARM5-NEXT: mla r4, r1, r3, lr
; ARM5-NEXT: ldr r1, .LCPI4_2
; ARM5-NEXT: ldr lr, .LCPI4_3
; ARM5-NEXT: mov r3, #0
; ARM5-NEXT: cmp r4, r1
; ARM5-NEXT: ldr r4, .LCPI4_4
; ARM5-NEXT: mov r1, #0
; ARM5-NEXT: movhi r1, #1
; ARM5-NEXT: mla r5, r2, r4, lr
; ARM5-NEXT: ldr r2, .LCPI4_5
; ARM5-NEXT: cmp r5, r2
; ARM5-NEXT: ldr r5, .LCPI4_6
; ARM5-NEXT: mov r2, #0
; ARM5-NEXT: movhi r2, #1
; ARM5-NEXT: mul r4, r0, r5
; ARM5-NEXT: ldr r5, .LCPI4_7
; ARM5-NEXT: ror r0, r4, #1
; ARM5-NEXT: cmp r0, r5
; ARM5-NEXT: movhi r3, #1
; ARM5-NEXT: mov r0, r3
; ARM5-NEXT: pop {r4, r5, r11, pc}
; ARM5-NEXT: .p2align 2
; ARM5-NEXT: @ %bb.1:
; ARM5-NEXT: .LCPI4_0:
; ARM5-NEXT: .long 1227133513 @ 0x49249249
; ARM5-NEXT: .LCPI4_1:
; ARM5-NEXT: .long 3067833783 @ 0xb6db6db7
; ARM5-NEXT: .LCPI4_2:
; ARM5-NEXT: .long 613566756 @ 0x24924924
; ARM5-NEXT: .LCPI4_3:
; ARM5-NEXT: .long 4191955354 @ 0xf9dc299a
; ARM5-NEXT: .LCPI4_4:
; ARM5-NEXT: .long 2198989619 @ 0x8311eb33
; ARM5-NEXT: .LCPI4_5:
; ARM5-NEXT: .long 2102284 @ 0x20140c
; ARM5-NEXT: .LCPI4_6:
; ARM5-NEXT: .long 2863311531 @ 0xaaaaaaab
; ARM5-NEXT: .LCPI4_7:
; ARM5-NEXT: .long 715827882 @ 0x2aaaaaaa
;
; ARM6-LABEL: test_urem_vec:
; ARM6: @ %bb.0:
; ARM6-NEXT: push {r4, lr}
; ARM6-NEXT: mov r12, #255
; ARM6-NEXT: ldr r3, .LCPI4_1
; ARM6-NEXT: orr r12, r12, #1792
; ARM6-NEXT: ldr lr, .LCPI4_0
; ARM6-NEXT: and r1, r1, r12
; ARM6-NEXT: ldr r4, .LCPI4_4
; ARM6-NEXT: and r2, r2, r12
; ARM6-NEXT: and r0, r0, r12
; ARM6-NEXT: mla r1, r1, r3, lr
; ARM6-NEXT: ldr lr, .LCPI4_2
; ARM6-NEXT: mov r3, #0
; ARM6-NEXT: cmp r1, lr
; ARM6-NEXT: ldr lr, .LCPI4_3
; ARM6-NEXT: mla r2, r2, r4, lr
; ARM6-NEXT: ldr r4, .LCPI4_5
; ARM6-NEXT: mov r1, #0
; ARM6-NEXT: movhi r1, #1
; ARM6-NEXT: cmp r2, r4
; ARM6-NEXT: ldr r4, .LCPI4_6
; ARM6-NEXT: mov r2, #0
; ARM6-NEXT: movhi r2, #1
; ARM6-NEXT: mul r0, r0, r4
; ARM6-NEXT: ldr r4, .LCPI4_7
; ARM6-NEXT: ror r0, r0, #1
; ARM6-NEXT: cmp r0, r4
; ARM6-NEXT: movhi r3, #1
; ARM6-NEXT: mov r0, r3
; ARM6-NEXT: pop {r4, pc}
; ARM6-NEXT: .p2align 2
; ARM6-NEXT: @ %bb.1:
; ARM6-NEXT: .LCPI4_0:
; ARM6-NEXT: .long 1227133513 @ 0x49249249
; ARM6-NEXT: .LCPI4_1:
; ARM6-NEXT: .long 3067833783 @ 0xb6db6db7
; ARM6-NEXT: .LCPI4_2:
; ARM6-NEXT: .long 613566756 @ 0x24924924
; ARM6-NEXT: .LCPI4_3:
; ARM6-NEXT: .long 4191955354 @ 0xf9dc299a
; ARM6-NEXT: .LCPI4_4:
; ARM6-NEXT: .long 2198989619 @ 0x8311eb33
; ARM6-NEXT: .LCPI4_5:
; ARM6-NEXT: .long 2102284 @ 0x20140c
; ARM6-NEXT: .LCPI4_6:
; ARM6-NEXT: .long 2863311531 @ 0xaaaaaaab
; ARM6-NEXT: .LCPI4_7:
; ARM6-NEXT: .long 715827882 @ 0x2aaaaaaa
;
; ARM7-LABEL: test_urem_vec:
; ARM7: @ %bb.0:
; ARM7-NEXT: push {r4, lr}
; ARM7-NEXT: movw r3, #18725
; ARM7-NEXT: bfc r1, #11, #21
; ARM7-NEXT: movt r3, #9362
; ARM7-NEXT: bfc r2, #11, #21
; ARM7-NEXT: umull r3, r12, r1, r3
; ARM7-NEXT: bfc r0, #11, #21
; ARM7-NEXT: movw r3, #25663
; ARM7-NEXT: movt r3, #160
; ARM7-NEXT: umull r3, lr, r2, r3
; ARM7-NEXT: vldr d17, .LCPI4_0
; ARM7-NEXT: movw r3, #43691
; ARM7-NEXT: movt r3, #43690
; ARM7-NEXT: umull r3, r4, r0, r3
; ARM7-NEXT: sub r3, r1, r12
; ARM7-NEXT: add r3, r12, r3, lsr #1
; ARM7-NEXT: lsr r12, r3, #2
; ARM7-NEXT: sub r3, r2, lr
; ARM7-NEXT: lsr r4, r4, #2
; ARM7-NEXT: add r4, r4, r4, lsl #1
; ARM7-NEXT: add r3, lr, r3, lsr #1
; ARM7-NEXT: sub r0, r0, r4, lsl #1
; ARM7-NEXT: lsr lr, r3, #10
; ARM7-NEXT: movw r3, #2043
; ARM7-NEXT: vmov.16 d16[0], r0
; ARM7-NEXT: sub r0, r12, r12, lsl #3
; ARM7-NEXT: mls r2, lr, r3, r2
; ARM7-NEXT: add r0, r1, r0
; ARM7-NEXT: vmov.16 d16[1], r0
; ARM7-NEXT: vmov.16 d16[2], r2
; ARM7-NEXT: vbic.i16 d16, #0xf800
; ARM7-NEXT: vceq.i16 d16, d16, d17
; ARM7-NEXT: vmvn d16, d16
; ARM7-NEXT: vmov.u16 r0, d16[0]
; ARM7-NEXT: vmov.u16 r1, d16[1]
; ARM7-NEXT: vmov.u16 r2, d16[2]
; ARM7-NEXT: pop {r4, pc}
; ARM7-NEXT: .p2align 3
; ARM7-NEXT: @ %bb.1:
; ARM7-NEXT: .LCPI4_0:
; ARM7-NEXT: .short 0 @ 0x0
; ARM7-NEXT: .short 1 @ 0x1
; ARM7-NEXT: .short 2 @ 0x2
; ARM7-NEXT: .short 0 @ 0x0
;
; ARM8-LABEL: test_urem_vec:
; ARM8: @ %bb.0:
; ARM8-NEXT: push {r4, lr}
; ARM8-NEXT: movw r3, #18725
; ARM8-NEXT: bfc r1, #11, #21
; ARM8-NEXT: movt r3, #9362
; ARM8-NEXT: bfc r2, #11, #21
; ARM8-NEXT: umull r3, r12, r1, r3
; ARM8-NEXT: bfc r0, #11, #21
; ARM8-NEXT: movw r3, #25663
; ARM8-NEXT: movt r3, #160
; ARM8-NEXT: umull r3, lr, r2, r3
; ARM8-NEXT: vldr d17, .LCPI4_0
; ARM8-NEXT: movw r3, #43691
; ARM8-NEXT: movt r3, #43690
; ARM8-NEXT: umull r3, r4, r0, r3
; ARM8-NEXT: sub r3, r1, r12
; ARM8-NEXT: add r3, r12, r3, lsr #1
; ARM8-NEXT: lsr r12, r3, #2
; ARM8-NEXT: sub r3, r2, lr
; ARM8-NEXT: lsr r4, r4, #2
; ARM8-NEXT: add r4, r4, r4, lsl #1
; ARM8-NEXT: add r3, lr, r3, lsr #1
; ARM8-NEXT: sub r0, r0, r4, lsl #1
; ARM8-NEXT: lsr lr, r3, #10
; ARM8-NEXT: movw r3, #2043
; ARM8-NEXT: vmov.16 d16[0], r0
; ARM8-NEXT: sub r0, r12, r12, lsl #3
; ARM8-NEXT: mls r2, lr, r3, r2
; ARM8-NEXT: add r0, r1, r0
; ARM8-NEXT: vmov.16 d16[1], r0
; ARM8-NEXT: vmov.16 d16[2], r2
; ARM8-NEXT: vbic.i16 d16, #0xf800
; ARM8-NEXT: vceq.i16 d16, d16, d17
; ARM8-NEXT: vmvn d16, d16
; ARM8-NEXT: vmov.u16 r0, d16[0]
; ARM8-NEXT: vmov.u16 r1, d16[1]
; ARM8-NEXT: vmov.u16 r2, d16[2]
; ARM8-NEXT: pop {r4, pc}
; ARM8-NEXT: .p2align 3
; ARM8-NEXT: @ %bb.1:
; ARM8-NEXT: .LCPI4_0:
; ARM8-NEXT: .short 0 @ 0x0
; ARM8-NEXT: .short 1 @ 0x1
; ARM8-NEXT: .short 2 @ 0x2
; ARM8-NEXT: .short 0 @ 0x0
;
; NEON7-LABEL: test_urem_vec:
; NEON7: @ %bb.0:
; NEON7-NEXT: push {r4, lr}
; NEON7-NEXT: movw r3, #18725
; NEON7-NEXT: bfc r1, #11, #21
; NEON7-NEXT: movt r3, #9362
; NEON7-NEXT: bfc r2, #11, #21
; NEON7-NEXT: umull r3, r12, r1, r3
; NEON7-NEXT: bfc r0, #11, #21
; NEON7-NEXT: movw r3, #25663
; NEON7-NEXT: movt r3, #160
; NEON7-NEXT: umull r3, lr, r2, r3
; NEON7-NEXT: vldr d17, .LCPI4_0
; NEON7-NEXT: movw r3, #43691
; NEON7-NEXT: movt r3, #43690
; NEON7-NEXT: umull r3, r4, r0, r3
; NEON7-NEXT: sub r3, r1, r12
; NEON7-NEXT: add r3, r12, r3, lsr #1
; NEON7-NEXT: lsr r12, r3, #2
; NEON7-NEXT: sub r3, r2, lr
; NEON7-NEXT: lsr r4, r4, #2
; NEON7-NEXT: add r4, r4, r4, lsl #1
; NEON7-NEXT: add r3, lr, r3, lsr #1
; NEON7-NEXT: sub r0, r0, r4, lsl #1
; NEON7-NEXT: lsr lr, r3, #10
; NEON7-NEXT: movw r3, #2043
; NEON7-NEXT: vmov.16 d16[0], r0
; NEON7-NEXT: sub r0, r12, r12, lsl #3
; NEON7-NEXT: mls r2, lr, r3, r2
; NEON7-NEXT: add r0, r1, r0
; NEON7-NEXT: vmov.16 d16[1], r0
; NEON7-NEXT: vmov.16 d16[2], r2
; NEON7-NEXT: vbic.i16 d16, #0xf800
; NEON7-NEXT: vceq.i16 d16, d16, d17
; NEON7-NEXT: vmvn d16, d16
; NEON7-NEXT: vmov.u16 r0, d16[0]
; NEON7-NEXT: vmov.u16 r1, d16[1]
; NEON7-NEXT: vmov.u16 r2, d16[2]
; NEON7-NEXT: pop {r4, pc}
; NEON7-NEXT: .p2align 3
; NEON7-NEXT: @ %bb.1:
; NEON7-NEXT: .LCPI4_0:
; NEON7-NEXT: .short 0 @ 0x0
; NEON7-NEXT: .short 1 @ 0x1
; NEON7-NEXT: .short 2 @ 0x2
; NEON7-NEXT: .short 0 @ 0x0
;
; NEON8-LABEL: test_urem_vec:
; NEON8: @ %bb.0:
; NEON8-NEXT: push {r4, lr}
; NEON8-NEXT: movw r3, #18725
; NEON8-NEXT: bfc r1, #11, #21
; NEON8-NEXT: movt r3, #9362
; NEON8-NEXT: bfc r2, #11, #21
; NEON8-NEXT: umull r3, r12, r1, r3
; NEON8-NEXT: bfc r0, #11, #21
; NEON8-NEXT: movw r3, #25663
; NEON8-NEXT: movt r3, #160
; NEON8-NEXT: umull r3, lr, r2, r3
; NEON8-NEXT: vldr d17, .LCPI4_0
; NEON8-NEXT: movw r3, #43691
; NEON8-NEXT: movt r3, #43690
; NEON8-NEXT: umull r3, r4, r0, r3
; NEON8-NEXT: sub r3, r1, r12
; NEON8-NEXT: add r3, r12, r3, lsr #1
; NEON8-NEXT: lsr r12, r3, #2
; NEON8-NEXT: sub r3, r2, lr
; NEON8-NEXT: lsr r4, r4, #2
; NEON8-NEXT: add r4, r4, r4, lsl #1
; NEON8-NEXT: add r3, lr, r3, lsr #1
; NEON8-NEXT: sub r0, r0, r4, lsl #1
; NEON8-NEXT: lsr lr, r3, #10
; NEON8-NEXT: movw r3, #2043
; NEON8-NEXT: vmov.16 d16[0], r0
; NEON8-NEXT: sub r0, r12, r12, lsl #3
; NEON8-NEXT: mls r2, lr, r3, r2
; NEON8-NEXT: add r0, r1, r0
; NEON8-NEXT: vmov.16 d16[1], r0
; NEON8-NEXT: vmov.16 d16[2], r2
; NEON8-NEXT: vbic.i16 d16, #0xf800
; NEON8-NEXT: vceq.i16 d16, d16, d17
; NEON8-NEXT: vmvn d16, d16
; NEON8-NEXT: vmov.u16 r0, d16[0]
; NEON8-NEXT: vmov.u16 r1, d16[1]
; NEON8-NEXT: vmov.u16 r2, d16[2]
; NEON8-NEXT: pop {r4, pc}
; NEON8-NEXT: .p2align 3
; NEON8-NEXT: @ %bb.1:
; NEON8-NEXT: .LCPI4_0:
; NEON8-NEXT: .short 0 @ 0x0
; NEON8-NEXT: .short 1 @ 0x1
; NEON8-NEXT: .short 2 @ 0x2
; NEON8-NEXT: .short 0 @ 0x0
%urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
ret <3 x i1> %cmp
}
define i1 @test_urem_larger(i63 %X) nounwind {
; ARM5-LABEL: test_urem_larger:
; ARM5: @ %bb.0:
; ARM5-NEXT: push {r11, lr}
; ARM5-NEXT: ldr r2, .LCPI5_0
; ARM5-NEXT: bic r1, r1, #-2147483648
; ARM5-NEXT: mov r3, #0
; ARM5-NEXT: bl __umoddi3
; ARM5-NEXT: orr r0, r0, r1
; ARM5-NEXT: clz r0, r0
; ARM5-NEXT: lsr r0, r0, #5
; ARM5-NEXT: pop {r11, pc}
; ARM5-NEXT: .p2align 2
; ARM5-NEXT: @ %bb.1:
; ARM5-NEXT: .LCPI5_0:
; ARM5-NEXT: .long 1234567890 @ 0x499602d2
;
; ARM6-LABEL: test_urem_larger:
; ARM6: @ %bb.0:
; ARM6-NEXT: push {r11, lr}
; ARM6-NEXT: ldr r2, .LCPI5_0
; ARM6-NEXT: bic r1, r1, #-2147483648
; ARM6-NEXT: mov r3, #0
; ARM6-NEXT: bl __umoddi3
; ARM6-NEXT: orr r0, r0, r1
; ARM6-NEXT: clz r0, r0
; ARM6-NEXT: lsr r0, r0, #5
; ARM6-NEXT: pop {r11, pc}
; ARM6-NEXT: .p2align 2
; ARM6-NEXT: @ %bb.1:
; ARM6-NEXT: .LCPI5_0:
; ARM6-NEXT: .long 1234567890 @ 0x499602d2
;
; ARM7-LABEL: test_urem_larger:
; ARM7: @ %bb.0:
; ARM7-NEXT: push {r11, lr}
; ARM7-NEXT: movw r2, #722
; ARM7-NEXT: bic r1, r1, #-2147483648
; ARM7-NEXT: movt r2, #18838
; ARM7-NEXT: mov r3, #0
; ARM7-NEXT: bl __umoddi3
; ARM7-NEXT: orr r0, r0, r1
; ARM7-NEXT: clz r0, r0
; ARM7-NEXT: lsr r0, r0, #5
; ARM7-NEXT: pop {r11, pc}
;
; ARM8-LABEL: test_urem_larger:
; ARM8: @ %bb.0:
; ARM8-NEXT: push {r11, lr}
; ARM8-NEXT: movw r2, #722
; ARM8-NEXT: bic r1, r1, #-2147483648
; ARM8-NEXT: movt r2, #18838
; ARM8-NEXT: mov r3, #0
; ARM8-NEXT: bl __umoddi3
; ARM8-NEXT: orr r0, r0, r1
; ARM8-NEXT: clz r0, r0
; ARM8-NEXT: lsr r0, r0, #5
; ARM8-NEXT: pop {r11, pc}
;
; NEON7-LABEL: test_urem_larger:
; NEON7: @ %bb.0:
; NEON7-NEXT: push {r11, lr}
; NEON7-NEXT: movw r2, #722
; NEON7-NEXT: bic r1, r1, #-2147483648
; NEON7-NEXT: movt r2, #18838
; NEON7-NEXT: mov r3, #0
; NEON7-NEXT: bl __umoddi3
; NEON7-NEXT: orr r0, r0, r1
; NEON7-NEXT: clz r0, r0
; NEON7-NEXT: lsr r0, r0, #5
; NEON7-NEXT: pop {r11, pc}
;
; NEON8-LABEL: test_urem_larger:
; NEON8: @ %bb.0:
; NEON8-NEXT: push {r11, lr}
; NEON8-NEXT: movw r2, #722
; NEON8-NEXT: bic r1, r1, #-2147483648
; NEON8-NEXT: movt r2, #18838
; NEON8-NEXT: mov r3, #0
; NEON8-NEXT: bl __umoddi3
; NEON8-NEXT: orr r0, r0, r1
; NEON8-NEXT: clz r0, r0
; NEON8-NEXT: lsr r0, r0, #5
; NEON8-NEXT: pop {r11, pc}
%urem = urem i63 %X, 1234567890
%cmp = icmp eq i63 %urem, 0
ret i1 %cmp
}

View File

@ -0,0 +1,124 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=mips-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=MIPSEL
; RUN: llc -mtriple=mips64el-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=MIPS64EL
define i1 @test_srem_odd(i29 %X) nounwind {
; MIPSEL-LABEL: test_srem_odd:
; MIPSEL: # %bb.0:
; MIPSEL-NEXT: lui $1, 48986
; MIPSEL-NEXT: ori $1, $1, 33099
; MIPSEL-NEXT: sll $2, $4, 3
; MIPSEL-NEXT: sra $2, $2, 3
; MIPSEL-NEXT: mul $1, $2, $1
; MIPSEL-NEXT: lui $2, 330
; MIPSEL-NEXT: ori $2, $2, 64874
; MIPSEL-NEXT: addu $1, $1, $2
; MIPSEL-NEXT: lui $2, 661
; MIPSEL-NEXT: ori $2, $2, 64213
; MIPSEL-NEXT: jr $ra
; MIPSEL-NEXT: sltu $2, $1, $2
;
; MIPS64EL-LABEL: test_srem_odd:
; MIPS64EL: # %bb.0:
; MIPS64EL-NEXT: lui $1, 48986
; MIPS64EL-NEXT: ori $1, $1, 33099
; MIPS64EL-NEXT: sll $2, $4, 0
; MIPS64EL-NEXT: sll $2, $2, 3
; MIPS64EL-NEXT: sra $2, $2, 3
; MIPS64EL-NEXT: mul $1, $2, $1
; MIPS64EL-NEXT: lui $2, 330
; MIPS64EL-NEXT: ori $2, $2, 64874
; MIPS64EL-NEXT: addu $1, $1, $2
; MIPS64EL-NEXT: lui $2, 661
; MIPS64EL-NEXT: ori $2, $2, 64213
; MIPS64EL-NEXT: jr $ra
; MIPS64EL-NEXT: sltu $2, $1, $2
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; MIPSEL-LABEL: test_srem_even:
; MIPSEL: # %bb.0:
; MIPSEL-NEXT: lui $1, 10922
; MIPSEL-NEXT: ori $1, $1, 43691
; MIPSEL-NEXT: sll $2, $4, 28
; MIPSEL-NEXT: sra $2, $2, 28
; MIPSEL-NEXT: mult $2, $1
; MIPSEL-NEXT: mfhi $1
; MIPSEL-NEXT: srl $3, $1, 31
; MIPSEL-NEXT: addu $1, $1, $3
; MIPSEL-NEXT: addiu $3, $zero, 1
; MIPSEL-NEXT: sll $4, $1, 1
; MIPSEL-NEXT: sll $1, $1, 2
; MIPSEL-NEXT: addu $1, $1, $4
; MIPSEL-NEXT: subu $1, $2, $1
; MIPSEL-NEXT: xor $1, $1, $3
; MIPSEL-NEXT: jr $ra
; MIPSEL-NEXT: sltiu $2, $1, 1
;
; MIPS64EL-LABEL: test_srem_even:
; MIPS64EL: # %bb.0:
; MIPS64EL-NEXT: lui $1, 10922
; MIPS64EL-NEXT: ori $1, $1, 43691
; MIPS64EL-NEXT: sll $2, $4, 0
; MIPS64EL-NEXT: sll $2, $2, 28
; MIPS64EL-NEXT: sra $2, $2, 28
; MIPS64EL-NEXT: mult $2, $1
; MIPS64EL-NEXT: mfhi $1
; MIPS64EL-NEXT: addiu $3, $zero, 1
; MIPS64EL-NEXT: srl $4, $1, 31
; MIPS64EL-NEXT: addu $1, $1, $4
; MIPS64EL-NEXT: sll $4, $1, 1
; MIPS64EL-NEXT: sll $1, $1, 2
; MIPS64EL-NEXT: addu $1, $1, $4
; MIPS64EL-NEXT: subu $1, $2, $1
; MIPS64EL-NEXT: xor $1, $1, $3
; MIPS64EL-NEXT: jr $ra
; MIPS64EL-NEXT: sltiu $2, $1, 1
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; MIPSEL-LABEL: test_srem_pow2_setne:
; MIPSEL: # %bb.0:
; MIPSEL-NEXT: sll $1, $4, 26
; MIPSEL-NEXT: sra $1, $1, 26
; MIPSEL-NEXT: srl $1, $1, 9
; MIPSEL-NEXT: andi $1, $1, 3
; MIPSEL-NEXT: addu $1, $4, $1
; MIPSEL-NEXT: andi $1, $1, 60
; MIPSEL-NEXT: subu $1, $4, $1
; MIPSEL-NEXT: andi $1, $1, 63
; MIPSEL-NEXT: jr $ra
; MIPSEL-NEXT: sltu $2, $zero, $1
;
; MIPS64EL-LABEL: test_srem_pow2_setne:
; MIPS64EL: # %bb.0:
; MIPS64EL-NEXT: sll $1, $4, 0
; MIPS64EL-NEXT: sll $2, $1, 26
; MIPS64EL-NEXT: sra $2, $2, 26
; MIPS64EL-NEXT: srl $2, $2, 9
; MIPS64EL-NEXT: andi $2, $2, 3
; MIPS64EL-NEXT: addu $2, $1, $2
; MIPS64EL-NEXT: andi $2, $2, 60
; MIPS64EL-NEXT: subu $1, $1, $2
; MIPS64EL-NEXT: andi $1, $1, 63
; MIPS64EL-NEXT: jr $ra
; MIPS64EL-NEXT: sltu $2, $zero, $1
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
; Asserts today
; See https://bugs.llvm.org/show_bug.cgi?id=49551
; and https://bugs.llvm.org/show_bug.cgi?id=49550
; define <4 x i1> @test_srem_vec(<4 x i31> %X) nounwind {
; %srem = srem <4 x i31> %X, <i31 9, i31 9, i31 -9, i31 -9>
; %cmp = icmp ne <4 x i31> %srem, <i31 4, i31 -4, i31 4, i31 -4>
; ret <4 x i1> %cmp
; }

View File

@ -0,0 +1,179 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=mips-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=MIPSEL
; RUN: llc -mtriple=mips64el-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=MIPS64EL
define i1 @test_urem_odd(i13 %X) nounwind {
; MIPSEL-LABEL: test_urem_odd:
; MIPSEL: # %bb.0:
; MIPSEL-NEXT: lui $1, 52428
; MIPSEL-NEXT: ori $1, $1, 52429
; MIPSEL-NEXT: andi $2, $4, 8191
; MIPSEL-NEXT: mul $1, $2, $1
; MIPSEL-NEXT: lui $2, 13107
; MIPSEL-NEXT: ori $2, $2, 13108
; MIPSEL-NEXT: jr $ra
; MIPSEL-NEXT: sltu $2, $1, $2
;
; MIPS64EL-LABEL: test_urem_odd:
; MIPS64EL: # %bb.0:
; MIPS64EL-NEXT: lui $1, 52428
; MIPS64EL-NEXT: ori $1, $1, 52429
; MIPS64EL-NEXT: sll $2, $4, 0
; MIPS64EL-NEXT: andi $2, $2, 8191
; MIPS64EL-NEXT: mul $1, $2, $1
; MIPS64EL-NEXT: lui $2, 13107
; MIPS64EL-NEXT: ori $2, $2, 13108
; MIPS64EL-NEXT: jr $ra
; MIPS64EL-NEXT: sltu $2, $1, $2
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; MIPSEL-LABEL: test_urem_even:
; MIPSEL: # %bb.0:
; MIPSEL-NEXT: lui $1, 2047
; MIPSEL-NEXT: ori $1, $1, 65535
; MIPSEL-NEXT: and $1, $4, $1
; MIPSEL-NEXT: srl $2, $1, 1
; MIPSEL-NEXT: lui $3, 37449
; MIPSEL-NEXT: ori $3, $3, 9363
; MIPSEL-NEXT: multu $2, $3
; MIPSEL-NEXT: mfhi $2
; MIPSEL-NEXT: srl $2, $2, 2
; MIPSEL-NEXT: sll $3, $2, 4
; MIPSEL-NEXT: sll $2, $2, 1
; MIPSEL-NEXT: subu $2, $2, $3
; MIPSEL-NEXT: addu $1, $1, $2
; MIPSEL-NEXT: jr $ra
; MIPSEL-NEXT: sltiu $2, $1, 1
;
; MIPS64EL-LABEL: test_urem_even:
; MIPS64EL: # %bb.0:
; MIPS64EL-NEXT: lui $1, 2047
; MIPS64EL-NEXT: ori $1, $1, 65535
; MIPS64EL-NEXT: sll $2, $4, 0
; MIPS64EL-NEXT: and $1, $2, $1
; MIPS64EL-NEXT: srl $2, $1, 1
; MIPS64EL-NEXT: lui $3, 37449
; MIPS64EL-NEXT: ori $3, $3, 9363
; MIPS64EL-NEXT: multu $2, $3
; MIPS64EL-NEXT: mfhi $2
; MIPS64EL-NEXT: srl $2, $2, 2
; MIPS64EL-NEXT: sll $3, $2, 4
; MIPS64EL-NEXT: sll $2, $2, 1
; MIPS64EL-NEXT: subu $2, $2, $3
; MIPS64EL-NEXT: addu $1, $1, $2
; MIPS64EL-NEXT: jr $ra
; MIPS64EL-NEXT: sltiu $2, $1, 1
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; MIPSEL-LABEL: test_urem_odd_setne:
; MIPSEL: # %bb.0:
; MIPSEL-NEXT: lui $1, 52428
; MIPSEL-NEXT: ori $1, $1, 52429
; MIPSEL-NEXT: andi $2, $4, 15
; MIPSEL-NEXT: mul $1, $2, $1
; MIPSEL-NEXT: lui $2, 13107
; MIPSEL-NEXT: ori $2, $2, 13107
; MIPSEL-NEXT: jr $ra
; MIPSEL-NEXT: sltu $2, $2, $1
;
; MIPS64EL-LABEL: test_urem_odd_setne:
; MIPS64EL: # %bb.0:
; MIPS64EL-NEXT: lui $1, 52428
; MIPS64EL-NEXT: ori $1, $1, 52429
; MIPS64EL-NEXT: sll $2, $4, 0
; MIPS64EL-NEXT: andi $2, $2, 15
; MIPS64EL-NEXT: mul $1, $2, $1
; MIPS64EL-NEXT: lui $2, 13107
; MIPS64EL-NEXT: ori $2, $2, 13107
; MIPS64EL-NEXT: jr $ra
; MIPS64EL-NEXT: sltu $2, $2, $1
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; MIPSEL-LABEL: test_urem_negative_odd:
; MIPSEL: # %bb.0:
; MIPSEL-NEXT: lui $1, 43302
; MIPSEL-NEXT: ori $1, $1, 57651
; MIPSEL-NEXT: andi $2, $4, 511
; MIPSEL-NEXT: mul $1, $2, $1
; MIPSEL-NEXT: lui $2, 129
; MIPSEL-NEXT: ori $2, $2, 17191
; MIPSEL-NEXT: jr $ra
; MIPSEL-NEXT: sltu $2, $2, $1
;
; MIPS64EL-LABEL: test_urem_negative_odd:
; MIPS64EL: # %bb.0:
; MIPS64EL-NEXT: lui $1, 43302
; MIPS64EL-NEXT: ori $1, $1, 57651
; MIPS64EL-NEXT: sll $2, $4, 0
; MIPS64EL-NEXT: andi $2, $2, 511
; MIPS64EL-NEXT: mul $1, $2, $1
; MIPS64EL-NEXT: lui $2, 129
; MIPS64EL-NEXT: ori $2, $2, 17191
; MIPS64EL-NEXT: jr $ra
; MIPS64EL-NEXT: sltu $2, $2, $1
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
; Asserts today
; define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; %urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
; %cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
; ret <3 x i1> %cmp
; }
define i1 @test_urem_oversized(i66 %X) nounwind {
; MIPSEL-LABEL: test_urem_oversized:
; MIPSEL: # %bb.0:
; MIPSEL-NEXT: addiu $sp, $sp, -40
; MIPSEL-NEXT: sw $ra, 36($sp) # 4-byte Folded Spill
; MIPSEL-NEXT: move $7, $6
; MIPSEL-NEXT: move $6, $5
; MIPSEL-NEXT: lui $1, 18838
; MIPSEL-NEXT: ori $1, $1, 722
; MIPSEL-NEXT: sw $1, 28($sp)
; MIPSEL-NEXT: sw $zero, 24($sp)
; MIPSEL-NEXT: sw $zero, 20($sp)
; MIPSEL-NEXT: sw $zero, 16($sp)
; MIPSEL-NEXT: andi $5, $4, 3
; MIPSEL-NEXT: jal __umodti3
; MIPSEL-NEXT: addiu $4, $zero, 0
; MIPSEL-NEXT: or $1, $4, $2
; MIPSEL-NEXT: or $2, $5, $3
; MIPSEL-NEXT: or $1, $2, $1
; MIPSEL-NEXT: sltiu $2, $1, 1
; MIPSEL-NEXT: lw $ra, 36($sp) # 4-byte Folded Reload
; MIPSEL-NEXT: jr $ra
; MIPSEL-NEXT: addiu $sp, $sp, 40
;
; MIPS64EL-LABEL: test_urem_oversized:
; MIPS64EL: # %bb.0:
; MIPS64EL-NEXT: daddiu $sp, $sp, -16
; MIPS64EL-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; MIPS64EL-NEXT: andi $5, $5, 3
; MIPS64EL-NEXT: lui $1, 18838
; MIPS64EL-NEXT: ori $6, $1, 722
; MIPS64EL-NEXT: jal __umodti3
; MIPS64EL-NEXT: daddiu $7, $zero, 0
; MIPS64EL-NEXT: or $1, $2, $3
; MIPS64EL-NEXT: sltiu $2, $1, 1
; MIPS64EL-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; MIPS64EL-NEXT: jr $ra
; MIPS64EL-NEXT: daddiu $sp, $sp, 16
%urem = urem i66 %X, 1234567890
%cmp = icmp eq i66 %urem, 0
ret i1 %cmp
}

View File

@ -0,0 +1,250 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=PPC
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=PPC64LE
define i1 @test_srem_odd(i29 %X) nounwind {
; PPC-LABEL: test_srem_odd:
; PPC: # %bb.0:
; PPC-NEXT: lis 4, -23170
; PPC-NEXT: slwi 3, 3, 3
; PPC-NEXT: ori 4, 4, 46339
; PPC-NEXT: srawi 3, 3, 3
; PPC-NEXT: mulhw 4, 3, 4
; PPC-NEXT: add 4, 4, 3
; PPC-NEXT: srwi 5, 4, 31
; PPC-NEXT: srawi 4, 4, 6
; PPC-NEXT: add 4, 4, 5
; PPC-NEXT: mulli 4, 4, 99
; PPC-NEXT: sub 3, 3, 4
; PPC-NEXT: cntlzw 3, 3
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_srem_odd:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: lis 4, -23170
; PPC64LE-NEXT: slwi 3, 3, 3
; PPC64LE-NEXT: srawi 3, 3, 3
; PPC64LE-NEXT: ori 4, 4, 46339
; PPC64LE-NEXT: mulhw 4, 3, 4
; PPC64LE-NEXT: add 4, 4, 3
; PPC64LE-NEXT: srwi 5, 4, 31
; PPC64LE-NEXT: srawi 4, 4, 6
; PPC64LE-NEXT: add 4, 4, 5
; PPC64LE-NEXT: mulli 4, 4, 99
; PPC64LE-NEXT: sub 3, 3, 4
; PPC64LE-NEXT: cntlzw 3, 3
; PPC64LE-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC64LE-NEXT: blr
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; PPC-LABEL: test_srem_even:
; PPC: # %bb.0:
; PPC-NEXT: lis 4, 10922
; PPC-NEXT: slwi 3, 3, 28
; PPC-NEXT: ori 4, 4, 43691
; PPC-NEXT: srawi 3, 3, 28
; PPC-NEXT: mulhw 4, 3, 4
; PPC-NEXT: srwi 5, 4, 31
; PPC-NEXT: add 4, 4, 5
; PPC-NEXT: li 5, 0
; PPC-NEXT: mulli 4, 4, 6
; PPC-NEXT: sub 3, 3, 4
; PPC-NEXT: cmpwi 3, 1
; PPC-NEXT: li 3, 1
; PPC-NEXT: bclr 12, 2, 0
; PPC-NEXT: # %bb.1:
; PPC-NEXT: ori 3, 5, 0
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_srem_even:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: lis 4, 10922
; PPC64LE-NEXT: slwi 3, 3, 28
; PPC64LE-NEXT: ori 4, 4, 43691
; PPC64LE-NEXT: srawi 3, 3, 28
; PPC64LE-NEXT: mulhw 4, 3, 4
; PPC64LE-NEXT: srwi 5, 4, 31
; PPC64LE-NEXT: add 4, 4, 5
; PPC64LE-NEXT: mulli 4, 4, 6
; PPC64LE-NEXT: sub 3, 3, 4
; PPC64LE-NEXT: li 4, 1
; PPC64LE-NEXT: cmpwi 3, 1
; PPC64LE-NEXT: li 3, 0
; PPC64LE-NEXT: iseleq 3, 4, 3
; PPC64LE-NEXT: blr
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; PPC-LABEL: test_srem_pow2_setne:
; PPC: # %bb.0:
; PPC-NEXT: slwi 4, 3, 26
; PPC-NEXT: srawi 4, 4, 26
; PPC-NEXT: rlwinm 4, 4, 23, 30, 31
; PPC-NEXT: add 4, 3, 4
; PPC-NEXT: rlwinm 4, 4, 0, 26, 29
; PPC-NEXT: sub 3, 3, 4
; PPC-NEXT: clrlwi 3, 3, 26
; PPC-NEXT: cntlzw 3, 3
; PPC-NEXT: not 3, 3
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_srem_pow2_setne:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: slwi 4, 3, 26
; PPC64LE-NEXT: srawi 4, 4, 26
; PPC64LE-NEXT: rlwinm 4, 4, 23, 30, 31
; PPC64LE-NEXT: add 4, 3, 4
; PPC64LE-NEXT: rlwinm 4, 4, 0, 26, 29
; PPC64LE-NEXT: sub 3, 3, 4
; PPC64LE-NEXT: clrlwi 3, 3, 26
; PPC64LE-NEXT: cntlzw 3, 3
; PPC64LE-NEXT: not 3, 3
; PPC64LE-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC64LE-NEXT: blr
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
; PPC-LABEL: test_srem_vec:
; PPC: # %bb.0:
; PPC-NEXT: mflr 0
; PPC-NEXT: stw 0, 4(1)
; PPC-NEXT: stwu 1, -48(1)
; PPC-NEXT: stw 29, 36(1) # 4-byte Folded Spill
; PPC-NEXT: mr 29, 6
; PPC-NEXT: clrlwi 5, 5, 31
; PPC-NEXT: clrlwi 6, 7, 31
; PPC-NEXT: clrlwi 3, 3, 31
; PPC-NEXT: stw 27, 28(1) # 4-byte Folded Spill
; PPC-NEXT: neg 27, 6
; PPC-NEXT: stw 28, 32(1) # 4-byte Folded Spill
; PPC-NEXT: neg 28, 5
; PPC-NEXT: neg 3, 3
; PPC-NEXT: li 5, 0
; PPC-NEXT: li 6, 9
; PPC-NEXT: stw 25, 20(1) # 4-byte Folded Spill
; PPC-NEXT: stw 26, 24(1) # 4-byte Folded Spill
; PPC-NEXT: stw 30, 40(1) # 4-byte Folded Spill
; PPC-NEXT: mr 30, 8
; PPC-NEXT: bl __moddi3
; PPC-NEXT: mr 26, 3
; PPC-NEXT: mr 25, 4
; PPC-NEXT: mr 3, 27
; PPC-NEXT: mr 4, 30
; PPC-NEXT: li 5, -1
; PPC-NEXT: li 6, -9
; PPC-NEXT: bl __moddi3
; PPC-NEXT: mr 30, 3
; PPC-NEXT: mr 27, 4
; PPC-NEXT: mr 3, 28
; PPC-NEXT: mr 4, 29
; PPC-NEXT: li 5, 0
; PPC-NEXT: li 6, 9
; PPC-NEXT: bl __moddi3
; PPC-NEXT: not 3, 3
; PPC-NEXT: xori 4, 4, 65533
; PPC-NEXT: xori 5, 27, 3
; PPC-NEXT: xori 6, 25, 3
; PPC-NEXT: clrlwi 3, 3, 31
; PPC-NEXT: xoris 4, 4, 65535
; PPC-NEXT: or 5, 5, 30
; PPC-NEXT: or 6, 6, 26
; PPC-NEXT: or 4, 4, 3
; PPC-NEXT: cntlzw 6, 6
; PPC-NEXT: cntlzw 5, 5
; PPC-NEXT: cntlzw 4, 4
; PPC-NEXT: not 3, 6
; PPC-NEXT: not 5, 5
; PPC-NEXT: not 4, 4
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: rlwinm 5, 5, 27, 31, 31
; PPC-NEXT: rlwinm 4, 4, 27, 31, 31
; PPC-NEXT: lwz 30, 40(1) # 4-byte Folded Reload
; PPC-NEXT: lwz 29, 36(1) # 4-byte Folded Reload
; PPC-NEXT: lwz 28, 32(1) # 4-byte Folded Reload
; PPC-NEXT: lwz 27, 28(1) # 4-byte Folded Reload
; PPC-NEXT: lwz 26, 24(1) # 4-byte Folded Reload
; PPC-NEXT: lwz 25, 20(1) # 4-byte Folded Reload
; PPC-NEXT: lwz 0, 52(1)
; PPC-NEXT: addi 1, 1, 48
; PPC-NEXT: mtlr 0
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_srem_vec:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: lis 6, 1820
; PPC64LE-NEXT: sldi 3, 3, 31
; PPC64LE-NEXT: ori 6, 6, 29127
; PPC64LE-NEXT: sldi 5, 5, 31
; PPC64LE-NEXT: rldic 6, 6, 34, 3
; PPC64LE-NEXT: sldi 4, 4, 31
; PPC64LE-NEXT: oris 6, 6, 29127
; PPC64LE-NEXT: sradi 3, 3, 31
; PPC64LE-NEXT: ori 7, 6, 7282
; PPC64LE-NEXT: sradi 5, 5, 31
; PPC64LE-NEXT: ori 6, 6, 7281
; PPC64LE-NEXT: sradi 4, 4, 31
; PPC64LE-NEXT: mulhd 8, 3, 7
; PPC64LE-NEXT: mulhd 7, 4, 7
; PPC64LE-NEXT: mulhd 6, 5, 6
; PPC64LE-NEXT: rldicl 9, 8, 1, 63
; PPC64LE-NEXT: rldicl 10, 7, 1, 63
; PPC64LE-NEXT: sub 6, 6, 5
; PPC64LE-NEXT: add 8, 8, 9
; PPC64LE-NEXT: rldicl 9, 6, 1, 63
; PPC64LE-NEXT: add 7, 7, 10
; PPC64LE-NEXT: sradi 6, 6, 3
; PPC64LE-NEXT: sldi 10, 8, 3
; PPC64LE-NEXT: add 6, 6, 9
; PPC64LE-NEXT: add 8, 8, 10
; PPC64LE-NEXT: addis 9, 2, .LCPI3_0@toc@ha
; PPC64LE-NEXT: sldi 10, 7, 3
; PPC64LE-NEXT: sub 3, 3, 8
; PPC64LE-NEXT: addi 9, 9, .LCPI3_0@toc@l
; PPC64LE-NEXT: add 7, 7, 10
; PPC64LE-NEXT: sldi 8, 6, 3
; PPC64LE-NEXT: lxvd2x 0, 0, 9
; PPC64LE-NEXT: mtfprd 1, 3
; PPC64LE-NEXT: sub 4, 4, 7
; PPC64LE-NEXT: add 6, 6, 8
; PPC64LE-NEXT: addis 7, 2, .LCPI3_1@toc@ha
; PPC64LE-NEXT: mtfprd 2, 4
; PPC64LE-NEXT: add 4, 5, 6
; PPC64LE-NEXT: addi 3, 7, .LCPI3_1@toc@l
; PPC64LE-NEXT: addis 5, 2, .LCPI3_2@toc@ha
; PPC64LE-NEXT: mtfprd 4, 4
; PPC64LE-NEXT: lxvd2x 3, 0, 3
; PPC64LE-NEXT: addi 3, 5, .LCPI3_2@toc@l
; PPC64LE-NEXT: xxswapd 34, 0
; PPC64LE-NEXT: xxmrghd 35, 2, 1
; PPC64LE-NEXT: lxvd2x 0, 0, 3
; PPC64LE-NEXT: xxswapd 36, 4
; PPC64LE-NEXT: xxswapd 37, 3
; PPC64LE-NEXT: xxland 35, 35, 34
; PPC64LE-NEXT: xxland 34, 36, 34
; PPC64LE-NEXT: xxswapd 36, 0
; PPC64LE-NEXT: vcmpequd 3, 3, 5
; PPC64LE-NEXT: vcmpequd 2, 2, 4
; PPC64LE-NEXT: xxlnor 0, 35, 35
; PPC64LE-NEXT: xxlnor 34, 34, 34
; PPC64LE-NEXT: xxswapd 1, 0
; PPC64LE-NEXT: mffprwz 4, 0
; PPC64LE-NEXT: xxswapd 2, 34
; PPC64LE-NEXT: mffprwz 3, 1
; PPC64LE-NEXT: mffprwz 5, 2
; PPC64LE-NEXT: blr
%srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
%cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,290 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=PPC
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=PPC64LE
define i1 @test_urem_odd(i13 %X) nounwind {
; PPC-LABEL: test_urem_odd:
; PPC: # %bb.0:
; PPC-NEXT: lis 4, -13108
; PPC-NEXT: clrlwi 3, 3, 19
; PPC-NEXT: ori 4, 4, 52429
; PPC-NEXT: mulhwu 4, 3, 4
; PPC-NEXT: srwi 4, 4, 2
; PPC-NEXT: mulli 4, 4, 5
; PPC-NEXT: sub 3, 3, 4
; PPC-NEXT: cntlzw 3, 3
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_urem_odd:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: lis 4, -13108
; PPC64LE-NEXT: clrlwi 3, 3, 19
; PPC64LE-NEXT: ori 4, 4, 52429
; PPC64LE-NEXT: mulhwu 4, 3, 4
; PPC64LE-NEXT: rlwinm 5, 4, 0, 0, 29
; PPC64LE-NEXT: srwi 4, 4, 2
; PPC64LE-NEXT: add 4, 4, 5
; PPC64LE-NEXT: sub 3, 3, 4
; PPC64LE-NEXT: cntlzw 3, 3
; PPC64LE-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC64LE-NEXT: blr
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; PPC-LABEL: test_urem_even:
; PPC: # %bb.0:
; PPC-NEXT: lis 4, -28087
; PPC-NEXT: rlwinm 5, 3, 31, 6, 31
; PPC-NEXT: ori 4, 4, 9363
; PPC-NEXT: mulhwu 4, 5, 4
; PPC-NEXT: srwi 4, 4, 2
; PPC-NEXT: clrlwi 3, 3, 5
; PPC-NEXT: mulli 4, 4, 14
; PPC-NEXT: sub 3, 3, 4
; PPC-NEXT: cntlzw 3, 3
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_urem_even:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: lis 4, -28087
; PPC64LE-NEXT: rlwinm 5, 3, 31, 6, 31
; PPC64LE-NEXT: clrlwi 3, 3, 5
; PPC64LE-NEXT: ori 4, 4, 9363
; PPC64LE-NEXT: mulhwu 4, 5, 4
; PPC64LE-NEXT: srwi 4, 4, 2
; PPC64LE-NEXT: mulli 4, 4, 14
; PPC64LE-NEXT: sub 3, 3, 4
; PPC64LE-NEXT: cntlzw 3, 3
; PPC64LE-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC64LE-NEXT: blr
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; PPC-LABEL: test_urem_odd_setne:
; PPC: # %bb.0:
; PPC-NEXT: lis 4, -13108
; PPC-NEXT: clrlwi 3, 3, 28
; PPC-NEXT: ori 4, 4, 52429
; PPC-NEXT: mulhwu 4, 3, 4
; PPC-NEXT: srwi 4, 4, 2
; PPC-NEXT: mulli 4, 4, 5
; PPC-NEXT: sub 3, 3, 4
; PPC-NEXT: cntlzw 3, 3
; PPC-NEXT: not 3, 3
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_urem_odd_setne:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: lis 4, -13108
; PPC64LE-NEXT: clrlwi 3, 3, 28
; PPC64LE-NEXT: ori 4, 4, 52429
; PPC64LE-NEXT: mulhwu 4, 3, 4
; PPC64LE-NEXT: rlwinm 5, 4, 0, 0, 29
; PPC64LE-NEXT: srwi 4, 4, 2
; PPC64LE-NEXT: add 4, 4, 5
; PPC64LE-NEXT: sub 3, 3, 4
; PPC64LE-NEXT: cntlzw 3, 3
; PPC64LE-NEXT: not 3, 3
; PPC64LE-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC64LE-NEXT: blr
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; PPC-LABEL: test_urem_negative_odd:
; PPC: # %bb.0:
; PPC-NEXT: lis 4, 8272
; PPC-NEXT: clrlwi 3, 3, 23
; PPC-NEXT: ori 4, 4, 51705
; PPC-NEXT: mulhwu 4, 3, 4
; PPC-NEXT: srwi 4, 4, 6
; PPC-NEXT: mulli 4, 4, 507
; PPC-NEXT: sub 3, 3, 4
; PPC-NEXT: cntlzw 3, 3
; PPC-NEXT: not 3, 3
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_urem_negative_odd:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: lis 4, 8272
; PPC64LE-NEXT: clrlwi 3, 3, 23
; PPC64LE-NEXT: ori 4, 4, 51705
; PPC64LE-NEXT: mulhwu 4, 3, 4
; PPC64LE-NEXT: srwi 4, 4, 6
; PPC64LE-NEXT: mulli 4, 4, 507
; PPC64LE-NEXT: sub 3, 3, 4
; PPC64LE-NEXT: cntlzw 3, 3
; PPC64LE-NEXT: not 3, 3
; PPC64LE-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC64LE-NEXT: blr
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; PPC-LABEL: test_urem_vec:
; PPC: # %bb.0:
; PPC-NEXT: lis 6, -31983
; PPC-NEXT: clrlwi 5, 5, 21
; PPC-NEXT: ori 6, 6, 60211
; PPC-NEXT: mullw 5, 5, 6
; PPC-NEXT: lis 6, 32
; PPC-NEXT: addi 5, 5, 10650
; PPC-NEXT: ori 6, 6, 5132
; PPC-NEXT: addis 5, 5, -1572
; PPC-NEXT: cmplw 5, 6
; PPC-NEXT: lis 6, -18725
; PPC-NEXT: clrlwi 4, 4, 21
; PPC-NEXT: ori 6, 6, 28087
; PPC-NEXT: lis 5, -21846
; PPC-NEXT: mullw 4, 4, 6
; PPC-NEXT: lis 6, 9362
; PPC-NEXT: clrlwi 3, 3, 21
; PPC-NEXT: ori 5, 5, 43691
; PPC-NEXT: addi 4, 4, -28087
; PPC-NEXT: ori 6, 6, 18724
; PPC-NEXT: mulhwu 5, 3, 5
; PPC-NEXT: addis 4, 4, 18725
; PPC-NEXT: cmplw 1, 4, 6
; PPC-NEXT: srwi 4, 5, 2
; PPC-NEXT: li 6, 0
; PPC-NEXT: li 7, 1
; PPC-NEXT: mulli 4, 4, 6
; PPC-NEXT: sub 3, 3, 4
; PPC-NEXT: cntlzw 3, 3
; PPC-NEXT: not 3, 3
; PPC-NEXT: bc 12, 5, .LBB4_2
; PPC-NEXT: # %bb.1:
; PPC-NEXT: ori 4, 6, 0
; PPC-NEXT: b .LBB4_3
; PPC-NEXT: .LBB4_2:
; PPC-NEXT: addi 4, 7, 0
; PPC-NEXT: .LBB4_3:
; PPC-NEXT: bc 12, 1, .LBB4_5
; PPC-NEXT: # %bb.4:
; PPC-NEXT: ori 5, 6, 0
; PPC-NEXT: b .LBB4_6
; PPC-NEXT: .LBB4_5:
; PPC-NEXT: addi 5, 7, 0
; PPC-NEXT: .LBB4_6:
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_urem_vec:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: lis 6, 9362
; PPC64LE-NEXT: lis 7, -21846
; PPC64LE-NEXT: clrlwi 4, 4, 21
; PPC64LE-NEXT: clrlwi 3, 3, 21
; PPC64LE-NEXT: lis 8, 160
; PPC64LE-NEXT: clrlwi 5, 5, 21
; PPC64LE-NEXT: ori 6, 6, 18725
; PPC64LE-NEXT: ori 7, 7, 43691
; PPC64LE-NEXT: ori 8, 8, 25663
; PPC64LE-NEXT: vspltisw 4, -11
; PPC64LE-NEXT: mulhwu 6, 4, 6
; PPC64LE-NEXT: mulhwu 7, 3, 7
; PPC64LE-NEXT: mulhwu 8, 5, 8
; PPC64LE-NEXT: sub 9, 4, 6
; PPC64LE-NEXT: srwi 7, 7, 2
; PPC64LE-NEXT: srwi 9, 9, 1
; PPC64LE-NEXT: mulli 7, 7, 6
; PPC64LE-NEXT: add 6, 9, 6
; PPC64LE-NEXT: srwi 9, 6, 2
; PPC64LE-NEXT: rlwinm 6, 6, 1, 0, 28
; PPC64LE-NEXT: sub 6, 9, 6
; PPC64LE-NEXT: sub 9, 5, 8
; PPC64LE-NEXT: add 4, 4, 6
; PPC64LE-NEXT: srwi 6, 9, 1
; PPC64LE-NEXT: sub 3, 3, 7
; PPC64LE-NEXT: add 6, 6, 8
; PPC64LE-NEXT: mtvsrwz 34, 4
; PPC64LE-NEXT: srwi 4, 6, 10
; PPC64LE-NEXT: mtvsrwz 35, 3
; PPC64LE-NEXT: mulli 3, 4, 2043
; PPC64LE-NEXT: addis 4, 2, .LCPI4_0@toc@ha
; PPC64LE-NEXT: vmrghw 2, 2, 3
; PPC64LE-NEXT: addi 4, 4, .LCPI4_0@toc@l
; PPC64LE-NEXT: lvx 3, 0, 4
; PPC64LE-NEXT: sub 3, 5, 3
; PPC64LE-NEXT: mtvsrwz 37, 3
; PPC64LE-NEXT: addis 3, 2, .LCPI4_1@toc@ha
; PPC64LE-NEXT: addi 3, 3, .LCPI4_1@toc@l
; PPC64LE-NEXT: vperm 2, 5, 2, 3
; PPC64LE-NEXT: vsrw 3, 4, 4
; PPC64LE-NEXT: lvx 4, 0, 3
; PPC64LE-NEXT: xxland 34, 34, 35
; PPC64LE-NEXT: vcmpequw 2, 2, 4
; PPC64LE-NEXT: xxlnor 0, 34, 34
; PPC64LE-NEXT: xxswapd 1, 0
; PPC64LE-NEXT: xxsldwi 2, 0, 0, 1
; PPC64LE-NEXT: mffprwz 5, 0
; PPC64LE-NEXT: mffprwz 3, 1
; PPC64LE-NEXT: mffprwz 4, 2
; PPC64LE-NEXT: blr
%urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
ret <3 x i1> %cmp
}
define i1 @test_urem_oversized(i66 %X) nounwind {
; PPC-LABEL: test_urem_oversized:
; PPC: # %bb.0:
; PPC-NEXT: mflr 0
; PPC-NEXT: stw 0, 4(1)
; PPC-NEXT: stwu 1, -16(1)
; PPC-NEXT: mr 6, 5
; PPC-NEXT: mr 5, 4
; PPC-NEXT: clrlwi 4, 3, 30
; PPC-NEXT: lis 3, 18838
; PPC-NEXT: ori 10, 3, 722
; PPC-NEXT: li 3, 0
; PPC-NEXT: li 7, 0
; PPC-NEXT: li 8, 0
; PPC-NEXT: li 9, 0
; PPC-NEXT: bl __umodti3
; PPC-NEXT: or 3, 5, 3
; PPC-NEXT: or 4, 6, 4
; PPC-NEXT: or 3, 4, 3
; PPC-NEXT: cntlzw 3, 3
; PPC-NEXT: rlwinm 3, 3, 27, 31, 31
; PPC-NEXT: lwz 0, 20(1)
; PPC-NEXT: addi 1, 1, 16
; PPC-NEXT: mtlr 0
; PPC-NEXT: blr
;
; PPC64LE-LABEL: test_urem_oversized:
; PPC64LE: # %bb.0:
; PPC64LE-NEXT: mflr 0
; PPC64LE-NEXT: std 0, 16(1)
; PPC64LE-NEXT: stdu 1, -32(1)
; PPC64LE-NEXT: lis 5, 18838
; PPC64LE-NEXT: clrldi 4, 4, 62
; PPC64LE-NEXT: li 6, 0
; PPC64LE-NEXT: ori 5, 5, 722
; PPC64LE-NEXT: bl __umodti3
; PPC64LE-NEXT: nop
; PPC64LE-NEXT: or 3, 3, 4
; PPC64LE-NEXT: cntlzd 3, 3
; PPC64LE-NEXT: rldicl 3, 3, 58, 63
; PPC64LE-NEXT: addi 1, 1, 32
; PPC64LE-NEXT: ld 0, 16(1)
; PPC64LE-NEXT: mtlr 0
; PPC64LE-NEXT: blr
%urem = urem i66 %X, 1234567890
%cmp = icmp eq i66 %urem, 0
ret i1 %cmp
}

View File

@ -0,0 +1,867 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 < %s | FileCheck %s --check-prefixes=RV32
; RUN: llc -mtriple=riscv64 < %s | FileCheck %s --check-prefixes=RV64
; RUN: llc -mtriple=riscv32 -mattr=+m < %s | FileCheck %s --check-prefixes=RV32M
; RUN: llc -mtriple=riscv64 -mattr=+m < %s | FileCheck %s --check-prefixes=RV64M
; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 < %s | FileCheck %s --check-prefixes=RV32MV
; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 < %s | FileCheck %s --check-prefixes=RV64MV
define i1 @test_srem_odd(i29 %X) nounwind {
; RV32-LABEL: test_srem_odd:
; RV32: # %bb.0:
; RV32-NEXT: addi sp, sp, -16
; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: slli a0, a0, 3
; RV32-NEXT: srai a0, a0, 3
; RV32-NEXT: addi a1, zero, 99
; RV32-NEXT: call __modsi3@plt
; RV32-NEXT: seqz a0, a0
; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 16
; RV32-NEXT: ret
;
; RV64-LABEL: test_srem_odd:
; RV64: # %bb.0:
; RV64-NEXT: addi sp, sp, -16
; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: slli a0, a0, 35
; RV64-NEXT: srai a0, a0, 35
; RV64-NEXT: addi a1, zero, 99
; RV64-NEXT: call __moddi3@plt
; RV64-NEXT: seqz a0, a0
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 16
; RV64-NEXT: ret
;
; RV32M-LABEL: test_srem_odd:
; RV32M: # %bb.0:
; RV32M-NEXT: slli a0, a0, 3
; RV32M-NEXT: srai a0, a0, 3
; RV32M-NEXT: lui a1, 783784
; RV32M-NEXT: addi a1, a1, 331
; RV32M-NEXT: mul a0, a0, a1
; RV32M-NEXT: lui a1, 5296
; RV32M-NEXT: addi a1, a1, -662
; RV32M-NEXT: add a0, a0, a1
; RV32M-NEXT: lui a1, 10592
; RV32M-NEXT: addi a1, a1, -1323
; RV32M-NEXT: sltu a0, a0, a1
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_srem_odd:
; RV64M: # %bb.0:
; RV64M-NEXT: slli a0, a0, 35
; RV64M-NEXT: srai a0, a0, 35
; RV64M-NEXT: lui a1, 1048536
; RV64M-NEXT: addiw a1, a1, -331
; RV64M-NEXT: slli a1, a1, 15
; RV64M-NEXT: addi a1, a1, 331
; RV64M-NEXT: slli a1, a1, 15
; RV64M-NEXT: addi a1, a1, -331
; RV64M-NEXT: slli a1, a1, 15
; RV64M-NEXT: addi a1, a1, 331
; RV64M-NEXT: mul a0, a0, a1
; RV64M-NEXT: lui a1, 331
; RV64M-NEXT: addiw a1, a1, -41
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -1531
; RV64M-NEXT: slli a2, a1, 12
; RV64M-NEXT: addi a2, a2, 703
; RV64M-NEXT: slli a2, a2, 12
; RV64M-NEXT: addi a2, a2, 1448
; RV64M-NEXT: add a0, a0, a2
; RV64M-NEXT: slli a1, a1, 13
; RV64M-NEXT: addi a1, a1, 1407
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -1199
; RV64M-NEXT: sltu a0, a0, a1
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_srem_odd:
; RV32MV: # %bb.0:
; RV32MV-NEXT: slli a0, a0, 3
; RV32MV-NEXT: srai a0, a0, 3
; RV32MV-NEXT: lui a1, 783784
; RV32MV-NEXT: addi a1, a1, 331
; RV32MV-NEXT: mul a0, a0, a1
; RV32MV-NEXT: lui a1, 5296
; RV32MV-NEXT: addi a1, a1, -662
; RV32MV-NEXT: add a0, a0, a1
; RV32MV-NEXT: lui a1, 10592
; RV32MV-NEXT: addi a1, a1, -1323
; RV32MV-NEXT: sltu a0, a0, a1
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_srem_odd:
; RV64MV: # %bb.0:
; RV64MV-NEXT: slli a0, a0, 35
; RV64MV-NEXT: srai a0, a0, 35
; RV64MV-NEXT: lui a1, 1048536
; RV64MV-NEXT: addiw a1, a1, -331
; RV64MV-NEXT: slli a1, a1, 15
; RV64MV-NEXT: addi a1, a1, 331
; RV64MV-NEXT: slli a1, a1, 15
; RV64MV-NEXT: addi a1, a1, -331
; RV64MV-NEXT: slli a1, a1, 15
; RV64MV-NEXT: addi a1, a1, 331
; RV64MV-NEXT: mul a0, a0, a1
; RV64MV-NEXT: lui a1, 331
; RV64MV-NEXT: addiw a1, a1, -41
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1531
; RV64MV-NEXT: slli a2, a1, 12
; RV64MV-NEXT: addi a2, a2, 703
; RV64MV-NEXT: slli a2, a2, 12
; RV64MV-NEXT: addi a2, a2, 1448
; RV64MV-NEXT: add a0, a0, a2
; RV64MV-NEXT: slli a1, a1, 13
; RV64MV-NEXT: addi a1, a1, 1407
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1199
; RV64MV-NEXT: sltu a0, a0, a1
; RV64MV-NEXT: ret
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; RV32-LABEL: test_srem_even:
; RV32: # %bb.0:
; RV32-NEXT: addi sp, sp, -16
; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: slli a0, a0, 28
; RV32-NEXT: srai a0, a0, 28
; RV32-NEXT: addi a1, zero, 6
; RV32-NEXT: call __modsi3@plt
; RV32-NEXT: addi a0, a0, -1
; RV32-NEXT: seqz a0, a0
; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 16
; RV32-NEXT: ret
;
; RV64-LABEL: test_srem_even:
; RV64: # %bb.0:
; RV64-NEXT: addi sp, sp, -16
; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: slli a0, a0, 60
; RV64-NEXT: srai a0, a0, 60
; RV64-NEXT: addi a1, zero, 6
; RV64-NEXT: call __moddi3@plt
; RV64-NEXT: addi a0, a0, -1
; RV64-NEXT: seqz a0, a0
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 16
; RV64-NEXT: ret
;
; RV32M-LABEL: test_srem_even:
; RV32M: # %bb.0:
; RV32M-NEXT: slli a0, a0, 28
; RV32M-NEXT: srai a0, a0, 28
; RV32M-NEXT: lui a1, 174763
; RV32M-NEXT: addi a1, a1, -1365
; RV32M-NEXT: mulh a1, a0, a1
; RV32M-NEXT: srli a2, a1, 31
; RV32M-NEXT: add a1, a1, a2
; RV32M-NEXT: addi a2, zero, 6
; RV32M-NEXT: mul a1, a1, a2
; RV32M-NEXT: sub a0, a0, a1
; RV32M-NEXT: addi a0, a0, -1
; RV32M-NEXT: seqz a0, a0
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_srem_even:
; RV64M: # %bb.0:
; RV64M-NEXT: slli a0, a0, 60
; RV64M-NEXT: srai a0, a0, 60
; RV64M-NEXT: lui a1, 10923
; RV64M-NEXT: addiw a1, a1, -1365
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -1365
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -1365
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -1365
; RV64M-NEXT: mulh a1, a0, a1
; RV64M-NEXT: srli a2, a1, 63
; RV64M-NEXT: add a1, a1, a2
; RV64M-NEXT: addi a2, zero, 6
; RV64M-NEXT: mul a1, a1, a2
; RV64M-NEXT: sub a0, a0, a1
; RV64M-NEXT: addi a0, a0, -1
; RV64M-NEXT: seqz a0, a0
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_srem_even:
; RV32MV: # %bb.0:
; RV32MV-NEXT: slli a0, a0, 28
; RV32MV-NEXT: srai a0, a0, 28
; RV32MV-NEXT: lui a1, 174763
; RV32MV-NEXT: addi a1, a1, -1365
; RV32MV-NEXT: mulh a1, a0, a1
; RV32MV-NEXT: srli a2, a1, 31
; RV32MV-NEXT: add a1, a1, a2
; RV32MV-NEXT: addi a2, zero, 6
; RV32MV-NEXT: mul a1, a1, a2
; RV32MV-NEXT: sub a0, a0, a1
; RV32MV-NEXT: addi a0, a0, -1
; RV32MV-NEXT: seqz a0, a0
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_srem_even:
; RV64MV: # %bb.0:
; RV64MV-NEXT: slli a0, a0, 60
; RV64MV-NEXT: srai a0, a0, 60
; RV64MV-NEXT: lui a1, 10923
; RV64MV-NEXT: addiw a1, a1, -1365
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1365
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1365
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1365
; RV64MV-NEXT: mulh a1, a0, a1
; RV64MV-NEXT: srli a2, a1, 63
; RV64MV-NEXT: add a1, a1, a2
; RV64MV-NEXT: addi a2, zero, 6
; RV64MV-NEXT: mul a1, a1, a2
; RV64MV-NEXT: sub a0, a0, a1
; RV64MV-NEXT: addi a0, a0, -1
; RV64MV-NEXT: seqz a0, a0
; RV64MV-NEXT: ret
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; RV32-LABEL: test_srem_pow2_setne:
; RV32: # %bb.0:
; RV32-NEXT: slli a1, a0, 26
; RV32-NEXT: srai a1, a1, 26
; RV32-NEXT: srli a1, a1, 9
; RV32-NEXT: andi a1, a1, 3
; RV32-NEXT: add a1, a0, a1
; RV32-NEXT: andi a1, a1, 60
; RV32-NEXT: sub a0, a0, a1
; RV32-NEXT: andi a0, a0, 63
; RV32-NEXT: snez a0, a0
; RV32-NEXT: ret
;
; RV64-LABEL: test_srem_pow2_setne:
; RV64: # %bb.0:
; RV64-NEXT: slli a1, a0, 58
; RV64-NEXT: srai a1, a1, 58
; RV64-NEXT: srli a1, a1, 9
; RV64-NEXT: andi a1, a1, 3
; RV64-NEXT: add a1, a0, a1
; RV64-NEXT: andi a1, a1, 60
; RV64-NEXT: sub a0, a0, a1
; RV64-NEXT: andi a0, a0, 63
; RV64-NEXT: snez a0, a0
; RV64-NEXT: ret
;
; RV32M-LABEL: test_srem_pow2_setne:
; RV32M: # %bb.0:
; RV32M-NEXT: slli a1, a0, 26
; RV32M-NEXT: srai a1, a1, 26
; RV32M-NEXT: srli a1, a1, 9
; RV32M-NEXT: andi a1, a1, 3
; RV32M-NEXT: add a1, a0, a1
; RV32M-NEXT: andi a1, a1, 60
; RV32M-NEXT: sub a0, a0, a1
; RV32M-NEXT: andi a0, a0, 63
; RV32M-NEXT: snez a0, a0
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_srem_pow2_setne:
; RV64M: # %bb.0:
; RV64M-NEXT: slli a1, a0, 58
; RV64M-NEXT: srai a1, a1, 58
; RV64M-NEXT: srli a1, a1, 9
; RV64M-NEXT: andi a1, a1, 3
; RV64M-NEXT: add a1, a0, a1
; RV64M-NEXT: andi a1, a1, 60
; RV64M-NEXT: sub a0, a0, a1
; RV64M-NEXT: andi a0, a0, 63
; RV64M-NEXT: snez a0, a0
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_srem_pow2_setne:
; RV32MV: # %bb.0:
; RV32MV-NEXT: slli a1, a0, 26
; RV32MV-NEXT: srai a1, a1, 26
; RV32MV-NEXT: srli a1, a1, 9
; RV32MV-NEXT: andi a1, a1, 3
; RV32MV-NEXT: add a1, a0, a1
; RV32MV-NEXT: andi a1, a1, 60
; RV32MV-NEXT: sub a0, a0, a1
; RV32MV-NEXT: andi a0, a0, 63
; RV32MV-NEXT: snez a0, a0
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_srem_pow2_setne:
; RV64MV: # %bb.0:
; RV64MV-NEXT: slli a1, a0, 58
; RV64MV-NEXT: srai a1, a1, 58
; RV64MV-NEXT: srli a1, a1, 9
; RV64MV-NEXT: andi a1, a1, 3
; RV64MV-NEXT: add a1, a0, a1
; RV64MV-NEXT: andi a1, a1, 60
; RV64MV-NEXT: sub a0, a0, a1
; RV64MV-NEXT: andi a0, a0, 63
; RV64MV-NEXT: snez a0, a0
; RV64MV-NEXT: ret
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
define void @test_srem_vec(<3 x i33>* %X) nounwind {
; RV32-LABEL: test_srem_vec:
; RV32: # %bb.0:
; RV32-NEXT: addi sp, sp, -32
; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s6, 0(sp) # 4-byte Folded Spill
; RV32-NEXT: mv s0, a0
; RV32-NEXT: lw a0, 4(a0)
; RV32-NEXT: lbu a1, 12(s0)
; RV32-NEXT: lw a2, 8(s0)
; RV32-NEXT: andi a3, a0, 1
; RV32-NEXT: neg s2, a3
; RV32-NEXT: slli a3, a1, 30
; RV32-NEXT: srli a4, a2, 2
; RV32-NEXT: or s3, a4, a3
; RV32-NEXT: srli a1, a1, 2
; RV32-NEXT: andi a1, a1, 1
; RV32-NEXT: neg s1, a1
; RV32-NEXT: slli a1, a2, 31
; RV32-NEXT: srli a0, a0, 1
; RV32-NEXT: or a0, a0, a1
; RV32-NEXT: lw s4, 0(s0)
; RV32-NEXT: srli a1, a2, 1
; RV32-NEXT: andi a1, a1, 1
; RV32-NEXT: neg a1, a1
; RV32-NEXT: addi a2, zero, 7
; RV32-NEXT: mv a3, zero
; RV32-NEXT: call __moddi3@plt
; RV32-NEXT: mv s5, a0
; RV32-NEXT: mv s6, a1
; RV32-NEXT: addi a2, zero, -5
; RV32-NEXT: addi a3, zero, -1
; RV32-NEXT: mv a0, s3
; RV32-NEXT: mv a1, s1
; RV32-NEXT: call __moddi3@plt
; RV32-NEXT: mv s1, a0
; RV32-NEXT: mv s3, a1
; RV32-NEXT: addi a2, zero, 6
; RV32-NEXT: mv a0, s4
; RV32-NEXT: mv a1, s2
; RV32-NEXT: mv a3, zero
; RV32-NEXT: call __moddi3@plt
; RV32-NEXT: xori a2, s1, 2
; RV32-NEXT: or a2, a2, s3
; RV32-NEXT: snez a2, a2
; RV32-NEXT: xori a3, s5, 1
; RV32-NEXT: or a3, a3, s6
; RV32-NEXT: snez a3, a3
; RV32-NEXT: or a0, a0, a1
; RV32-NEXT: snez a0, a0
; RV32-NEXT: neg a1, a3
; RV32-NEXT: neg a4, a2
; RV32-NEXT: neg a5, a0
; RV32-NEXT: sw a5, 0(s0)
; RV32-NEXT: slli a3, a3, 1
; RV32-NEXT: sub a0, a0, a3
; RV32-NEXT: sw a0, 4(s0)
; RV32-NEXT: slli a0, a2, 2
; RV32-NEXT: srli a2, a4, 30
; RV32-NEXT: sub a2, a2, a0
; RV32-NEXT: andi a2, a2, 7
; RV32-NEXT: sb a2, 12(s0)
; RV32-NEXT: srli a2, a1, 31
; RV32-NEXT: andi a1, a1, 1
; RV32-NEXT: slli a1, a1, 1
; RV32-NEXT: or a1, a2, a1
; RV32-NEXT: sub a0, a1, a0
; RV32-NEXT: sw a0, 8(s0)
; RV32-NEXT: lw s6, 0(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s5, 4(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 32
; RV32-NEXT: ret
;
; RV64-LABEL: test_srem_vec:
; RV64: # %bb.0:
; RV64-NEXT: addi sp, sp, -64
; RV64-NEXT: sd ra, 56(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s0, 48(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s1, 40(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s2, 32(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s3, 24(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s4, 16(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s5, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: mv s0, a0
; RV64-NEXT: lb a0, 12(a0)
; RV64-NEXT: lwu a1, 8(s0)
; RV64-NEXT: slli a0, a0, 32
; RV64-NEXT: or a0, a1, a0
; RV64-NEXT: addi s4, zero, 1
; RV64-NEXT: slli a1, s4, 40
; RV64-NEXT: addi a1, a1, -1
; RV64-NEXT: and a0, a0, a1
; RV64-NEXT: ld a1, 0(s0)
; RV64-NEXT: slli a2, a0, 29
; RV64-NEXT: srai s2, a2, 31
; RV64-NEXT: slli a0, a0, 31
; RV64-NEXT: srli a2, a1, 33
; RV64-NEXT: or a0, a2, a0
; RV64-NEXT: slli a0, a0, 31
; RV64-NEXT: srai s1, a0, 31
; RV64-NEXT: slli a0, a1, 31
; RV64-NEXT: srai a0, a0, 31
; RV64-NEXT: addi a1, zero, 6
; RV64-NEXT: call __moddi3@plt
; RV64-NEXT: mv s3, a0
; RV64-NEXT: addi a1, zero, 7
; RV64-NEXT: addi s5, zero, 7
; RV64-NEXT: mv a0, s1
; RV64-NEXT: call __moddi3@plt
; RV64-NEXT: mv s1, a0
; RV64-NEXT: addi a1, zero, -5
; RV64-NEXT: mv a0, s2
; RV64-NEXT: call __moddi3@plt
; RV64-NEXT: addi a0, a0, -2
; RV64-NEXT: snez a0, a0
; RV64-NEXT: addi a1, s1, -1
; RV64-NEXT: snez a1, a1
; RV64-NEXT: snez a2, s3
; RV64-NEXT: neg a2, a2
; RV64-NEXT: neg a1, a1
; RV64-NEXT: neg a3, a0
; RV64-NEXT: slli a4, s5, 32
; RV64-NEXT: and a3, a3, a4
; RV64-NEXT: srli a3, a3, 32
; RV64-NEXT: sb a3, 12(s0)
; RV64-NEXT: slli a0, a0, 2
; RV64-NEXT: slli a3, s4, 33
; RV64-NEXT: addi a3, a3, -1
; RV64-NEXT: and a1, a1, a3
; RV64-NEXT: srli a4, a1, 31
; RV64-NEXT: sub a0, a4, a0
; RV64-NEXT: sw a0, 8(s0)
; RV64-NEXT: and a0, a2, a3
; RV64-NEXT: slli a1, a1, 33
; RV64-NEXT: or a0, a0, a1
; RV64-NEXT: sd a0, 0(s0)
; RV64-NEXT: ld s5, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s4, 16(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s3, 24(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s2, 32(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s1, 40(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s0, 48(sp) # 8-byte Folded Reload
; RV64-NEXT: ld ra, 56(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 64
; RV64-NEXT: ret
;
; RV32M-LABEL: test_srem_vec:
; RV32M: # %bb.0:
; RV32M-NEXT: addi sp, sp, -32
; RV32M-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32M-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32M-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32M-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32M-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32M-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
; RV32M-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
; RV32M-NEXT: sw s6, 0(sp) # 4-byte Folded Spill
; RV32M-NEXT: mv s0, a0
; RV32M-NEXT: lw a0, 4(a0)
; RV32M-NEXT: lbu a1, 12(s0)
; RV32M-NEXT: lw a2, 8(s0)
; RV32M-NEXT: andi a3, a0, 1
; RV32M-NEXT: neg s2, a3
; RV32M-NEXT: slli a3, a1, 30
; RV32M-NEXT: srli a4, a2, 2
; RV32M-NEXT: or s3, a4, a3
; RV32M-NEXT: srli a1, a1, 2
; RV32M-NEXT: andi a1, a1, 1
; RV32M-NEXT: neg s1, a1
; RV32M-NEXT: slli a1, a2, 31
; RV32M-NEXT: srli a0, a0, 1
; RV32M-NEXT: or a0, a0, a1
; RV32M-NEXT: lw s4, 0(s0)
; RV32M-NEXT: srli a1, a2, 1
; RV32M-NEXT: andi a1, a1, 1
; RV32M-NEXT: neg a1, a1
; RV32M-NEXT: addi a2, zero, 7
; RV32M-NEXT: mv a3, zero
; RV32M-NEXT: call __moddi3@plt
; RV32M-NEXT: mv s5, a0
; RV32M-NEXT: mv s6, a1
; RV32M-NEXT: addi a2, zero, -5
; RV32M-NEXT: addi a3, zero, -1
; RV32M-NEXT: mv a0, s3
; RV32M-NEXT: mv a1, s1
; RV32M-NEXT: call __moddi3@plt
; RV32M-NEXT: mv s1, a0
; RV32M-NEXT: mv s3, a1
; RV32M-NEXT: addi a2, zero, 6
; RV32M-NEXT: mv a0, s4
; RV32M-NEXT: mv a1, s2
; RV32M-NEXT: mv a3, zero
; RV32M-NEXT: call __moddi3@plt
; RV32M-NEXT: xori a2, s1, 2
; RV32M-NEXT: or a2, a2, s3
; RV32M-NEXT: snez a2, a2
; RV32M-NEXT: xori a3, s5, 1
; RV32M-NEXT: or a3, a3, s6
; RV32M-NEXT: snez a3, a3
; RV32M-NEXT: or a0, a0, a1
; RV32M-NEXT: snez a0, a0
; RV32M-NEXT: neg a1, a3
; RV32M-NEXT: neg a4, a2
; RV32M-NEXT: neg a5, a0
; RV32M-NEXT: sw a5, 0(s0)
; RV32M-NEXT: slli a3, a3, 1
; RV32M-NEXT: sub a0, a0, a3
; RV32M-NEXT: sw a0, 4(s0)
; RV32M-NEXT: slli a0, a2, 2
; RV32M-NEXT: srli a2, a4, 30
; RV32M-NEXT: sub a2, a2, a0
; RV32M-NEXT: andi a2, a2, 7
; RV32M-NEXT: sb a2, 12(s0)
; RV32M-NEXT: srli a2, a1, 31
; RV32M-NEXT: andi a1, a1, 1
; RV32M-NEXT: slli a1, a1, 1
; RV32M-NEXT: or a1, a2, a1
; RV32M-NEXT: sub a0, a1, a0
; RV32M-NEXT: sw a0, 8(s0)
; RV32M-NEXT: lw s6, 0(sp) # 4-byte Folded Reload
; RV32M-NEXT: lw s5, 4(sp) # 4-byte Folded Reload
; RV32M-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
; RV32M-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32M-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32M-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32M-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32M-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32M-NEXT: addi sp, sp, 32
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_srem_vec:
; RV64M: # %bb.0:
; RV64M-NEXT: lb a1, 12(a0)
; RV64M-NEXT: lwu a2, 8(a0)
; RV64M-NEXT: slli a1, a1, 32
; RV64M-NEXT: or a2, a2, a1
; RV64M-NEXT: addi a6, zero, 1
; RV64M-NEXT: slli a3, a6, 40
; RV64M-NEXT: addi a3, a3, -1
; RV64M-NEXT: and a2, a2, a3
; RV64M-NEXT: ld a3, 0(a0)
; RV64M-NEXT: slli a4, a2, 29
; RV64M-NEXT: srai a4, a4, 31
; RV64M-NEXT: slli a2, a2, 31
; RV64M-NEXT: srli a5, a3, 33
; RV64M-NEXT: or a2, a5, a2
; RV64M-NEXT: slli a2, a2, 31
; RV64M-NEXT: srai a2, a2, 31
; RV64M-NEXT: slli a3, a3, 31
; RV64M-NEXT: srai a3, a3, 31
; RV64M-NEXT: lui a5, 18725
; RV64M-NEXT: addiw a5, a5, -1755
; RV64M-NEXT: slli a5, a5, 12
; RV64M-NEXT: addi a5, a5, -1755
; RV64M-NEXT: slli a5, a5, 12
; RV64M-NEXT: addi a5, a5, -1755
; RV64M-NEXT: slli a5, a5, 12
; RV64M-NEXT: addi a5, a5, -1755
; RV64M-NEXT: mulh a5, a2, a5
; RV64M-NEXT: srli a1, a5, 63
; RV64M-NEXT: srai a5, a5, 1
; RV64M-NEXT: add a1, a5, a1
; RV64M-NEXT: slli a5, a1, 3
; RV64M-NEXT: sub a1, a1, a5
; RV64M-NEXT: add a1, a2, a1
; RV64M-NEXT: lui a2, 1035469
; RV64M-NEXT: addiw a2, a2, -819
; RV64M-NEXT: slli a2, a2, 12
; RV64M-NEXT: addi a2, a2, -819
; RV64M-NEXT: slli a2, a2, 12
; RV64M-NEXT: addi a2, a2, -819
; RV64M-NEXT: slli a2, a2, 13
; RV64M-NEXT: addi a2, a2, -1639
; RV64M-NEXT: mulh a2, a4, a2
; RV64M-NEXT: srli a5, a2, 63
; RV64M-NEXT: srai a2, a2, 1
; RV64M-NEXT: add a2, a2, a5
; RV64M-NEXT: slli a5, a2, 2
; RV64M-NEXT: add a2, a5, a2
; RV64M-NEXT: add a2, a4, a2
; RV64M-NEXT: lui a4, 10923
; RV64M-NEXT: addiw a4, a4, -1365
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -1365
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -1365
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -1365
; RV64M-NEXT: mulh a4, a3, a4
; RV64M-NEXT: srli a5, a4, 63
; RV64M-NEXT: add a4, a4, a5
; RV64M-NEXT: addi a5, zero, 6
; RV64M-NEXT: mul a4, a4, a5
; RV64M-NEXT: sub a3, a3, a4
; RV64M-NEXT: addi a2, a2, -2
; RV64M-NEXT: snez a2, a2
; RV64M-NEXT: addi a1, a1, -1
; RV64M-NEXT: snez a1, a1
; RV64M-NEXT: snez a3, a3
; RV64M-NEXT: neg a1, a1
; RV64M-NEXT: neg a4, a2
; RV64M-NEXT: neg a3, a3
; RV64M-NEXT: addi a5, zero, 7
; RV64M-NEXT: slli a5, a5, 32
; RV64M-NEXT: and a4, a4, a5
; RV64M-NEXT: srli a4, a4, 32
; RV64M-NEXT: sb a4, 12(a0)
; RV64M-NEXT: slli a2, a2, 2
; RV64M-NEXT: slli a4, a6, 33
; RV64M-NEXT: addi a4, a4, -1
; RV64M-NEXT: and a1, a1, a4
; RV64M-NEXT: srli a5, a1, 31
; RV64M-NEXT: sub a2, a5, a2
; RV64M-NEXT: sw a2, 8(a0)
; RV64M-NEXT: slli a1, a1, 33
; RV64M-NEXT: and a2, a3, a4
; RV64M-NEXT: or a1, a2, a1
; RV64M-NEXT: sd a1, 0(a0)
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_srem_vec:
; RV32MV: # %bb.0:
; RV32MV-NEXT: addi sp, sp, -64
; RV32MV-NEXT: sw ra, 60(sp) # 4-byte Folded Spill
; RV32MV-NEXT: sw s0, 56(sp) # 4-byte Folded Spill
; RV32MV-NEXT: sw s1, 52(sp) # 4-byte Folded Spill
; RV32MV-NEXT: sw s2, 48(sp) # 4-byte Folded Spill
; RV32MV-NEXT: sw s3, 44(sp) # 4-byte Folded Spill
; RV32MV-NEXT: sw s4, 40(sp) # 4-byte Folded Spill
; RV32MV-NEXT: sw s5, 36(sp) # 4-byte Folded Spill
; RV32MV-NEXT: addi s0, sp, 64
; RV32MV-NEXT: andi sp, sp, -32
; RV32MV-NEXT: mv s1, a0
; RV32MV-NEXT: lw a0, 8(a0)
; RV32MV-NEXT: lw a1, 4(s1)
; RV32MV-NEXT: slli a2, a0, 31
; RV32MV-NEXT: srli a3, a1, 1
; RV32MV-NEXT: or s2, a3, a2
; RV32MV-NEXT: lbu a2, 12(s1)
; RV32MV-NEXT: srli a3, a0, 1
; RV32MV-NEXT: andi a3, a3, 1
; RV32MV-NEXT: neg s3, a3
; RV32MV-NEXT: slli a3, a2, 30
; RV32MV-NEXT: srli a0, a0, 2
; RV32MV-NEXT: or s4, a0, a3
; RV32MV-NEXT: srli a0, a2, 2
; RV32MV-NEXT: andi a2, a0, 1
; RV32MV-NEXT: lw a0, 0(s1)
; RV32MV-NEXT: neg s5, a2
; RV32MV-NEXT: andi a1, a1, 1
; RV32MV-NEXT: neg a1, a1
; RV32MV-NEXT: addi a2, zero, 6
; RV32MV-NEXT: mv a3, zero
; RV32MV-NEXT: call __moddi3@plt
; RV32MV-NEXT: sw a1, 4(sp)
; RV32MV-NEXT: sw a0, 0(sp)
; RV32MV-NEXT: addi a2, zero, -5
; RV32MV-NEXT: addi a3, zero, -1
; RV32MV-NEXT: mv a0, s4
; RV32MV-NEXT: mv a1, s5
; RV32MV-NEXT: call __moddi3@plt
; RV32MV-NEXT: sw a1, 20(sp)
; RV32MV-NEXT: sw a0, 16(sp)
; RV32MV-NEXT: addi a2, zero, 7
; RV32MV-NEXT: mv a0, s2
; RV32MV-NEXT: mv a1, s3
; RV32MV-NEXT: mv a3, zero
; RV32MV-NEXT: call __moddi3@plt
; RV32MV-NEXT: sw a1, 12(sp)
; RV32MV-NEXT: sw a0, 8(sp)
; RV32MV-NEXT: lui a0, %hi(.LCPI3_0)
; RV32MV-NEXT: addi a0, a0, %lo(.LCPI3_0)
; RV32MV-NEXT: vsetivli a1, 8, e32,m2,ta,mu
; RV32MV-NEXT: vle32.v v26, (a0)
; RV32MV-NEXT: vle32.v v28, (sp)
; RV32MV-NEXT: lui a0, %hi(.LCPI3_1)
; RV32MV-NEXT: addi a0, a0, %lo(.LCPI3_1)
; RV32MV-NEXT: vle32.v v30, (a0)
; RV32MV-NEXT: vand.vv v26, v28, v26
; RV32MV-NEXT: vsetivli a0, 4, e64,m2,ta,mu
; RV32MV-NEXT: vmsne.vv v0, v26, v30
; RV32MV-NEXT: vmv.v.i v26, 0
; RV32MV-NEXT: vmerge.vim v26, v26, -1, v0
; RV32MV-NEXT: vsetvli zero, zero, e32,m2,ta,mu
; RV32MV-NEXT: vmv.x.s a0, v26
; RV32MV-NEXT: sw a0, 0(s1)
; RV32MV-NEXT: vsetivli a0, 1, e32,m2,ta,mu
; RV32MV-NEXT: vslidedown.vi v28, v26, 1
; RV32MV-NEXT: vmv.x.s a0, v28
; RV32MV-NEXT: vslidedown.vi v28, v26, 2
; RV32MV-NEXT: vmv.x.s a1, v28
; RV32MV-NEXT: slli a2, a1, 1
; RV32MV-NEXT: sub a0, a2, a0
; RV32MV-NEXT: sw a0, 4(s1)
; RV32MV-NEXT: vslidedown.vi v28, v26, 4
; RV32MV-NEXT: vmv.x.s a0, v28
; RV32MV-NEXT: srli a2, a0, 30
; RV32MV-NEXT: vslidedown.vi v28, v26, 5
; RV32MV-NEXT: vmv.x.s a3, v28
; RV32MV-NEXT: slli a3, a3, 2
; RV32MV-NEXT: or a2, a3, a2
; RV32MV-NEXT: andi a2, a2, 7
; RV32MV-NEXT: sb a2, 12(s1)
; RV32MV-NEXT: srli a1, a1, 31
; RV32MV-NEXT: vslidedown.vi v26, v26, 3
; RV32MV-NEXT: vmv.x.s a2, v26
; RV32MV-NEXT: andi a2, a2, 1
; RV32MV-NEXT: slli a2, a2, 1
; RV32MV-NEXT: or a1, a1, a2
; RV32MV-NEXT: slli a0, a0, 2
; RV32MV-NEXT: or a0, a1, a0
; RV32MV-NEXT: sw a0, 8(s1)
; RV32MV-NEXT: addi sp, s0, -64
; RV32MV-NEXT: lw s5, 36(sp) # 4-byte Folded Reload
; RV32MV-NEXT: lw s4, 40(sp) # 4-byte Folded Reload
; RV32MV-NEXT: lw s3, 44(sp) # 4-byte Folded Reload
; RV32MV-NEXT: lw s2, 48(sp) # 4-byte Folded Reload
; RV32MV-NEXT: lw s1, 52(sp) # 4-byte Folded Reload
; RV32MV-NEXT: lw s0, 56(sp) # 4-byte Folded Reload
; RV32MV-NEXT: lw ra, 60(sp) # 4-byte Folded Reload
; RV32MV-NEXT: addi sp, sp, 64
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_srem_vec:
; RV64MV: # %bb.0:
; RV64MV-NEXT: addi sp, sp, -64
; RV64MV-NEXT: sd ra, 56(sp) # 8-byte Folded Spill
; RV64MV-NEXT: sd s0, 48(sp) # 8-byte Folded Spill
; RV64MV-NEXT: addi s0, sp, 64
; RV64MV-NEXT: andi sp, sp, -32
; RV64MV-NEXT: lb a1, 12(a0)
; RV64MV-NEXT: lwu a2, 8(a0)
; RV64MV-NEXT: slli a1, a1, 32
; RV64MV-NEXT: or a2, a2, a1
; RV64MV-NEXT: addi a6, zero, 1
; RV64MV-NEXT: slli a3, a6, 40
; RV64MV-NEXT: ld a4, 0(a0)
; RV64MV-NEXT: addi a3, a3, -1
; RV64MV-NEXT: and a2, a2, a3
; RV64MV-NEXT: slli a3, a2, 31
; RV64MV-NEXT: srli a5, a4, 33
; RV64MV-NEXT: or a3, a5, a3
; RV64MV-NEXT: slli a3, a3, 31
; RV64MV-NEXT: srai a3, a3, 31
; RV64MV-NEXT: slli a2, a2, 29
; RV64MV-NEXT: srai a2, a2, 31
; RV64MV-NEXT: slli a4, a4, 31
; RV64MV-NEXT: srai a4, a4, 31
; RV64MV-NEXT: lui a5, 10923
; RV64MV-NEXT: addiw a5, a5, -1365
; RV64MV-NEXT: slli a5, a5, 12
; RV64MV-NEXT: addi a5, a5, -1365
; RV64MV-NEXT: slli a5, a5, 12
; RV64MV-NEXT: addi a5, a5, -1365
; RV64MV-NEXT: slli a5, a5, 12
; RV64MV-NEXT: addi a5, a5, -1365
; RV64MV-NEXT: mulh a5, a4, a5
; RV64MV-NEXT: srli a1, a5, 63
; RV64MV-NEXT: add a1, a5, a1
; RV64MV-NEXT: addi a5, zero, 6
; RV64MV-NEXT: mul a1, a1, a5
; RV64MV-NEXT: sub a1, a4, a1
; RV64MV-NEXT: sd a1, 0(sp)
; RV64MV-NEXT: lui a1, 1035469
; RV64MV-NEXT: addiw a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 13
; RV64MV-NEXT: addi a1, a1, -1639
; RV64MV-NEXT: mulh a1, a2, a1
; RV64MV-NEXT: srli a4, a1, 63
; RV64MV-NEXT: srai a1, a1, 1
; RV64MV-NEXT: add a1, a1, a4
; RV64MV-NEXT: slli a4, a1, 2
; RV64MV-NEXT: add a1, a4, a1
; RV64MV-NEXT: add a1, a2, a1
; RV64MV-NEXT: sd a1, 16(sp)
; RV64MV-NEXT: lui a1, 18725
; RV64MV-NEXT: addiw a1, a1, -1755
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1755
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1755
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1755
; RV64MV-NEXT: mulh a1, a3, a1
; RV64MV-NEXT: srli a2, a1, 63
; RV64MV-NEXT: srai a1, a1, 1
; RV64MV-NEXT: add a1, a1, a2
; RV64MV-NEXT: slli a2, a1, 3
; RV64MV-NEXT: sub a1, a1, a2
; RV64MV-NEXT: add a1, a3, a1
; RV64MV-NEXT: sd a1, 8(sp)
; RV64MV-NEXT: vsetivli a1, 4, e64,m2,ta,mu
; RV64MV-NEXT: vle64.v v26, (sp)
; RV64MV-NEXT: lui a1, %hi(.LCPI3_0)
; RV64MV-NEXT: addi a1, a1, %lo(.LCPI3_0)
; RV64MV-NEXT: vle64.v v28, (a1)
; RV64MV-NEXT: slli a1, a6, 33
; RV64MV-NEXT: addi a1, a1, -1
; RV64MV-NEXT: vand.vx v26, v26, a1
; RV64MV-NEXT: vmsne.vv v0, v26, v28
; RV64MV-NEXT: vmv.v.i v26, 0
; RV64MV-NEXT: vmerge.vim v26, v26, -1, v0
; RV64MV-NEXT: vsetivli a2, 1, e64,m2,ta,mu
; RV64MV-NEXT: vslidedown.vi v28, v26, 2
; RV64MV-NEXT: vmv.x.s a2, v28
; RV64MV-NEXT: srli a3, a2, 30
; RV64MV-NEXT: andi a3, a3, 7
; RV64MV-NEXT: sb a3, 12(a0)
; RV64MV-NEXT: slli a2, a2, 2
; RV64MV-NEXT: vslidedown.vi v28, v26, 1
; RV64MV-NEXT: vmv.x.s a3, v28
; RV64MV-NEXT: and a3, a3, a1
; RV64MV-NEXT: srli a4, a3, 31
; RV64MV-NEXT: or a2, a4, a2
; RV64MV-NEXT: sw a2, 8(a0)
; RV64MV-NEXT: vmv.x.s a2, v26
; RV64MV-NEXT: and a1, a2, a1
; RV64MV-NEXT: slli a2, a3, 33
; RV64MV-NEXT: or a1, a1, a2
; RV64MV-NEXT: sd a1, 0(a0)
; RV64MV-NEXT: addi sp, s0, -64
; RV64MV-NEXT: ld s0, 48(sp) # 8-byte Folded Reload
; RV64MV-NEXT: ld ra, 56(sp) # 8-byte Folded Reload
; RV64MV-NEXT: addi sp, sp, 64
; RV64MV-NEXT: ret
%ld = load <3 x i33>, <3 x i33>* %X
%srem = srem <3 x i33> %ld, <i33 6, i33 7, i33 -5>
%cmp = icmp ne <3 x i33> %srem, <i33 0, i33 1, i33 2>
%ext = sext <3 x i1> %cmp to <3 x i33>
store <3 x i33> %ext, <3 x i33>* %X
ret void
}

View File

@ -0,0 +1,838 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 < %s | FileCheck %s --check-prefixes=RV32
; RUN: llc -mtriple=riscv64 < %s | FileCheck %s --check-prefixes=RV64
; RUN: llc -mtriple=riscv32 -mattr=+m < %s | FileCheck %s --check-prefixes=RV32M
; RUN: llc -mtriple=riscv64 -mattr=+m < %s | FileCheck %s --check-prefixes=RV64M
; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 < %s | FileCheck %s --check-prefixes=RV32MV
; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 < %s | FileCheck %s --check-prefixes=RV64MV
define i1 @test_urem_odd(i13 %X) nounwind {
; RV32-LABEL: test_urem_odd:
; RV32: # %bb.0:
; RV32-NEXT: addi sp, sp, -16
; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: lui a1, 2
; RV32-NEXT: addi a1, a1, -1
; RV32-NEXT: and a0, a0, a1
; RV32-NEXT: addi a1, zero, 5
; RV32-NEXT: call __umodsi3@plt
; RV32-NEXT: seqz a0, a0
; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 16
; RV32-NEXT: ret
;
; RV64-LABEL: test_urem_odd:
; RV64: # %bb.0:
; RV64-NEXT: addi sp, sp, -16
; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: lui a1, 2
; RV64-NEXT: addiw a1, a1, -1
; RV64-NEXT: and a0, a0, a1
; RV64-NEXT: addi a1, zero, 5
; RV64-NEXT: call __umoddi3@plt
; RV64-NEXT: seqz a0, a0
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 16
; RV64-NEXT: ret
;
; RV32M-LABEL: test_urem_odd:
; RV32M: # %bb.0:
; RV32M-NEXT: lui a1, 2
; RV32M-NEXT: addi a1, a1, -1
; RV32M-NEXT: and a0, a0, a1
; RV32M-NEXT: lui a1, 838861
; RV32M-NEXT: addi a1, a1, -819
; RV32M-NEXT: mul a0, a0, a1
; RV32M-NEXT: lui a1, 209715
; RV32M-NEXT: addi a1, a1, 820
; RV32M-NEXT: sltu a0, a0, a1
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_urem_odd:
; RV64M: # %bb.0:
; RV64M-NEXT: lui a1, 2
; RV64M-NEXT: addiw a1, a1, -1
; RV64M-NEXT: and a0, a0, a1
; RV64M-NEXT: lui a1, 1035469
; RV64M-NEXT: addiw a1, a1, -819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -819
; RV64M-NEXT: mul a0, a0, a1
; RV64M-NEXT: lui a1, 13107
; RV64M-NEXT: addiw a1, a1, 819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, 819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, 819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, 820
; RV64M-NEXT: sltu a0, a0, a1
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_urem_odd:
; RV32MV: # %bb.0:
; RV32MV-NEXT: lui a1, 2
; RV32MV-NEXT: addi a1, a1, -1
; RV32MV-NEXT: and a0, a0, a1
; RV32MV-NEXT: lui a1, 838861
; RV32MV-NEXT: addi a1, a1, -819
; RV32MV-NEXT: mul a0, a0, a1
; RV32MV-NEXT: lui a1, 209715
; RV32MV-NEXT: addi a1, a1, 820
; RV32MV-NEXT: sltu a0, a0, a1
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_urem_odd:
; RV64MV: # %bb.0:
; RV64MV-NEXT: lui a1, 2
; RV64MV-NEXT: addiw a1, a1, -1
; RV64MV-NEXT: and a0, a0, a1
; RV64MV-NEXT: lui a1, 1035469
; RV64MV-NEXT: addiw a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -819
; RV64MV-NEXT: mul a0, a0, a1
; RV64MV-NEXT: lui a1, 13107
; RV64MV-NEXT: addiw a1, a1, 819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, 819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, 819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, 820
; RV64MV-NEXT: sltu a0, a0, a1
; RV64MV-NEXT: ret
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; RV32-LABEL: test_urem_even:
; RV32: # %bb.0:
; RV32-NEXT: addi sp, sp, -16
; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: lui a1, 32768
; RV32-NEXT: addi a1, a1, -1
; RV32-NEXT: and a0, a0, a1
; RV32-NEXT: addi a1, zero, 14
; RV32-NEXT: call __umodsi3@plt
; RV32-NEXT: seqz a0, a0
; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 16
; RV32-NEXT: ret
;
; RV64-LABEL: test_urem_even:
; RV64: # %bb.0:
; RV64-NEXT: addi sp, sp, -16
; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: lui a1, 32768
; RV64-NEXT: addiw a1, a1, -1
; RV64-NEXT: and a0, a0, a1
; RV64-NEXT: addi a1, zero, 14
; RV64-NEXT: call __umoddi3@plt
; RV64-NEXT: seqz a0, a0
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 16
; RV64-NEXT: ret
;
; RV32M-LABEL: test_urem_even:
; RV32M: # %bb.0:
; RV32M-NEXT: lui a1, 32768
; RV32M-NEXT: addi a1, a1, -1
; RV32M-NEXT: and a0, a0, a1
; RV32M-NEXT: srli a1, a0, 1
; RV32M-NEXT: lui a2, 599186
; RV32M-NEXT: addi a2, a2, 1171
; RV32M-NEXT: mulhu a1, a1, a2
; RV32M-NEXT: srli a1, a1, 2
; RV32M-NEXT: addi a2, zero, 14
; RV32M-NEXT: mul a1, a1, a2
; RV32M-NEXT: sub a0, a0, a1
; RV32M-NEXT: seqz a0, a0
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_urem_even:
; RV64M: # %bb.0:
; RV64M-NEXT: lui a1, 32768
; RV64M-NEXT: addiw a1, a1, -1
; RV64M-NEXT: and a0, a0, a1
; RV64M-NEXT: srli a1, a0, 1
; RV64M-NEXT: lui a2, 18725
; RV64M-NEXT: addiw a2, a2, -1755
; RV64M-NEXT: slli a2, a2, 12
; RV64M-NEXT: addi a2, a2, -1755
; RV64M-NEXT: slli a2, a2, 12
; RV64M-NEXT: addi a2, a2, -1755
; RV64M-NEXT: slli a2, a2, 12
; RV64M-NEXT: addi a2, a2, -1755
; RV64M-NEXT: mulhu a1, a1, a2
; RV64M-NEXT: srli a1, a1, 1
; RV64M-NEXT: addi a2, zero, 14
; RV64M-NEXT: mul a1, a1, a2
; RV64M-NEXT: sub a0, a0, a1
; RV64M-NEXT: seqz a0, a0
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_urem_even:
; RV32MV: # %bb.0:
; RV32MV-NEXT: lui a1, 32768
; RV32MV-NEXT: addi a1, a1, -1
; RV32MV-NEXT: and a0, a0, a1
; RV32MV-NEXT: srli a1, a0, 1
; RV32MV-NEXT: lui a2, 599186
; RV32MV-NEXT: addi a2, a2, 1171
; RV32MV-NEXT: mulhu a1, a1, a2
; RV32MV-NEXT: srli a1, a1, 2
; RV32MV-NEXT: addi a2, zero, 14
; RV32MV-NEXT: mul a1, a1, a2
; RV32MV-NEXT: sub a0, a0, a1
; RV32MV-NEXT: seqz a0, a0
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_urem_even:
; RV64MV: # %bb.0:
; RV64MV-NEXT: lui a1, 32768
; RV64MV-NEXT: addiw a1, a1, -1
; RV64MV-NEXT: and a0, a0, a1
; RV64MV-NEXT: srli a1, a0, 1
; RV64MV-NEXT: lui a2, 18725
; RV64MV-NEXT: addiw a2, a2, -1755
; RV64MV-NEXT: slli a2, a2, 12
; RV64MV-NEXT: addi a2, a2, -1755
; RV64MV-NEXT: slli a2, a2, 12
; RV64MV-NEXT: addi a2, a2, -1755
; RV64MV-NEXT: slli a2, a2, 12
; RV64MV-NEXT: addi a2, a2, -1755
; RV64MV-NEXT: mulhu a1, a1, a2
; RV64MV-NEXT: srli a1, a1, 1
; RV64MV-NEXT: addi a2, zero, 14
; RV64MV-NEXT: mul a1, a1, a2
; RV64MV-NEXT: sub a0, a0, a1
; RV64MV-NEXT: seqz a0, a0
; RV64MV-NEXT: ret
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; RV32-LABEL: test_urem_odd_setne:
; RV32: # %bb.0:
; RV32-NEXT: addi sp, sp, -16
; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: andi a0, a0, 15
; RV32-NEXT: addi a1, zero, 5
; RV32-NEXT: call __umodsi3@plt
; RV32-NEXT: snez a0, a0
; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 16
; RV32-NEXT: ret
;
; RV64-LABEL: test_urem_odd_setne:
; RV64: # %bb.0:
; RV64-NEXT: addi sp, sp, -16
; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: andi a0, a0, 15
; RV64-NEXT: addi a1, zero, 5
; RV64-NEXT: call __umoddi3@plt
; RV64-NEXT: snez a0, a0
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 16
; RV64-NEXT: ret
;
; RV32M-LABEL: test_urem_odd_setne:
; RV32M: # %bb.0:
; RV32M-NEXT: andi a0, a0, 15
; RV32M-NEXT: lui a1, 838861
; RV32M-NEXT: addi a1, a1, -819
; RV32M-NEXT: mul a0, a0, a1
; RV32M-NEXT: lui a1, 209715
; RV32M-NEXT: addi a1, a1, 819
; RV32M-NEXT: sltu a0, a1, a0
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_urem_odd_setne:
; RV64M: # %bb.0:
; RV64M-NEXT: andi a0, a0, 15
; RV64M-NEXT: lui a1, 1035469
; RV64M-NEXT: addiw a1, a1, -819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -819
; RV64M-NEXT: mul a0, a0, a1
; RV64M-NEXT: lui a1, 13107
; RV64M-NEXT: addiw a1, a1, 819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, 819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, 819
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, 819
; RV64M-NEXT: sltu a0, a1, a0
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_urem_odd_setne:
; RV32MV: # %bb.0:
; RV32MV-NEXT: andi a0, a0, 15
; RV32MV-NEXT: lui a1, 838861
; RV32MV-NEXT: addi a1, a1, -819
; RV32MV-NEXT: mul a0, a0, a1
; RV32MV-NEXT: lui a1, 209715
; RV32MV-NEXT: addi a1, a1, 819
; RV32MV-NEXT: sltu a0, a1, a0
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_urem_odd_setne:
; RV64MV: # %bb.0:
; RV64MV-NEXT: andi a0, a0, 15
; RV64MV-NEXT: lui a1, 1035469
; RV64MV-NEXT: addiw a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -819
; RV64MV-NEXT: mul a0, a0, a1
; RV64MV-NEXT: lui a1, 13107
; RV64MV-NEXT: addiw a1, a1, 819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, 819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, 819
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, 819
; RV64MV-NEXT: sltu a0, a1, a0
; RV64MV-NEXT: ret
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; RV32-LABEL: test_urem_negative_odd:
; RV32: # %bb.0:
; RV32-NEXT: addi sp, sp, -16
; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: andi a0, a0, 511
; RV32-NEXT: addi a1, zero, 507
; RV32-NEXT: call __umodsi3@plt
; RV32-NEXT: snez a0, a0
; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 16
; RV32-NEXT: ret
;
; RV64-LABEL: test_urem_negative_odd:
; RV64: # %bb.0:
; RV64-NEXT: addi sp, sp, -16
; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: andi a0, a0, 511
; RV64-NEXT: addi a1, zero, 507
; RV64-NEXT: call __umoddi3@plt
; RV64-NEXT: snez a0, a0
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 16
; RV64-NEXT: ret
;
; RV32M-LABEL: test_urem_negative_odd:
; RV32M: # %bb.0:
; RV32M-NEXT: andi a0, a0, 511
; RV32M-NEXT: lui a1, 692846
; RV32M-NEXT: addi a1, a1, 307
; RV32M-NEXT: mul a0, a0, a1
; RV32M-NEXT: lui a1, 2068
; RV32M-NEXT: addi a1, a1, 807
; RV32M-NEXT: sltu a0, a1, a0
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_urem_negative_odd:
; RV64M: # %bb.0:
; RV64M-NEXT: andi a0, a0, 511
; RV64M-NEXT: lui a1, 1042824
; RV64M-NEXT: addiw a1, a1, -711
; RV64M-NEXT: slli a1, a1, 13
; RV64M-NEXT: addi a1, a1, 469
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -1737
; RV64M-NEXT: slli a1, a1, 13
; RV64M-NEXT: addi a1, a1, 307
; RV64M-NEXT: mul a0, a0, a1
; RV64M-NEXT: lui a1, 132365
; RV64M-NEXT: addiw a1, a1, -1543
; RV64M-NEXT: slli a1, a1, 14
; RV64M-NEXT: addi a1, a1, -1131
; RV64M-NEXT: slli a1, a1, 12
; RV64M-NEXT: addi a1, a1, -186
; RV64M-NEXT: sltu a0, a1, a0
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_urem_negative_odd:
; RV32MV: # %bb.0:
; RV32MV-NEXT: andi a0, a0, 511
; RV32MV-NEXT: lui a1, 692846
; RV32MV-NEXT: addi a1, a1, 307
; RV32MV-NEXT: mul a0, a0, a1
; RV32MV-NEXT: lui a1, 2068
; RV32MV-NEXT: addi a1, a1, 807
; RV32MV-NEXT: sltu a0, a1, a0
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_urem_negative_odd:
; RV64MV: # %bb.0:
; RV64MV-NEXT: andi a0, a0, 511
; RV64MV-NEXT: lui a1, 1042824
; RV64MV-NEXT: addiw a1, a1, -711
; RV64MV-NEXT: slli a1, a1, 13
; RV64MV-NEXT: addi a1, a1, 469
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1737
; RV64MV-NEXT: slli a1, a1, 13
; RV64MV-NEXT: addi a1, a1, 307
; RV64MV-NEXT: mul a0, a0, a1
; RV64MV-NEXT: lui a1, 132365
; RV64MV-NEXT: addiw a1, a1, -1543
; RV64MV-NEXT: slli a1, a1, 14
; RV64MV-NEXT: addi a1, a1, -1131
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -186
; RV64MV-NEXT: sltu a0, a1, a0
; RV64MV-NEXT: ret
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
define void @test_urem_vec(<3 x i11>* %X) nounwind {
; RV32-LABEL: test_urem_vec:
; RV32: # %bb.0:
; RV32-NEXT: addi sp, sp, -32
; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: mv s0, a0
; RV32-NEXT: lb a0, 4(a0)
; RV32-NEXT: lw a1, 0(s0)
; RV32-NEXT: slli a0, a0, 10
; RV32-NEXT: srli a2, a1, 22
; RV32-NEXT: or a0, a2, a0
; RV32-NEXT: andi s2, a0, 2047
; RV32-NEXT: andi s1, a1, 2047
; RV32-NEXT: srli a0, a1, 11
; RV32-NEXT: andi a0, a0, 2047
; RV32-NEXT: addi a1, zero, 7
; RV32-NEXT: call __umodsi3@plt
; RV32-NEXT: mv s3, a0
; RV32-NEXT: addi a1, zero, 6
; RV32-NEXT: mv a0, s1
; RV32-NEXT: call __umodsi3@plt
; RV32-NEXT: mv s1, a0
; RV32-NEXT: addi a1, zero, 2043
; RV32-NEXT: mv a0, s2
; RV32-NEXT: call __umodsi3@plt
; RV32-NEXT: addi a0, a0, -2
; RV32-NEXT: snez a0, a0
; RV32-NEXT: snez a1, s1
; RV32-NEXT: addi a2, s3, -1
; RV32-NEXT: snez a2, a2
; RV32-NEXT: neg a2, a2
; RV32-NEXT: neg a1, a1
; RV32-NEXT: neg a3, a0
; RV32-NEXT: srli a3, a3, 10
; RV32-NEXT: andi a3, a3, 1
; RV32-NEXT: sb a3, 4(s0)
; RV32-NEXT: andi a1, a1, 2047
; RV32-NEXT: andi a2, a2, 2047
; RV32-NEXT: slli a2, a2, 11
; RV32-NEXT: or a1, a1, a2
; RV32-NEXT: slli a0, a0, 22
; RV32-NEXT: sub a0, a1, a0
; RV32-NEXT: sw a0, 0(s0)
; RV32-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 32
; RV32-NEXT: ret
;
; RV64-LABEL: test_urem_vec:
; RV64: # %bb.0:
; RV64-NEXT: addi sp, sp, -48
; RV64-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: mv s0, a0
; RV64-NEXT: lbu a0, 4(a0)
; RV64-NEXT: lwu a1, 0(s0)
; RV64-NEXT: slli a0, a0, 32
; RV64-NEXT: or a0, a1, a0
; RV64-NEXT: srli s2, a0, 22
; RV64-NEXT: andi s1, a0, 2047
; RV64-NEXT: srli a0, a0, 11
; RV64-NEXT: andi a0, a0, 2047
; RV64-NEXT: addi a1, zero, 7
; RV64-NEXT: call __umoddi3@plt
; RV64-NEXT: mv s3, a0
; RV64-NEXT: addi a1, zero, 6
; RV64-NEXT: mv a0, s1
; RV64-NEXT: call __umoddi3@plt
; RV64-NEXT: mv s1, a0
; RV64-NEXT: addi a1, zero, 2043
; RV64-NEXT: mv a0, s2
; RV64-NEXT: call __umoddi3@plt
; RV64-NEXT: addi a0, a0, -2
; RV64-NEXT: snez a0, a0
; RV64-NEXT: snez a1, s1
; RV64-NEXT: addi a2, s3, -1
; RV64-NEXT: snez a2, a2
; RV64-NEXT: neg a2, a2
; RV64-NEXT: neg a1, a1
; RV64-NEXT: andi a1, a1, 2047
; RV64-NEXT: andi a2, a2, 2047
; RV64-NEXT: slli a2, a2, 11
; RV64-NEXT: or a1, a1, a2
; RV64-NEXT: slli a0, a0, 22
; RV64-NEXT: sub a0, a1, a0
; RV64-NEXT: sw a0, 0(s0)
; RV64-NEXT: addi a1, zero, 1
; RV64-NEXT: slli a1, a1, 33
; RV64-NEXT: addi a1, a1, -1
; RV64-NEXT: and a0, a0, a1
; RV64-NEXT: srli a0, a0, 32
; RV64-NEXT: sb a0, 4(s0)
; RV64-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 48
; RV64-NEXT: ret
;
; RV32M-LABEL: test_urem_vec:
; RV32M: # %bb.0:
; RV32M-NEXT: lb a1, 4(a0)
; RV32M-NEXT: lw a2, 0(a0)
; RV32M-NEXT: slli a1, a1, 10
; RV32M-NEXT: srli a3, a2, 22
; RV32M-NEXT: or a1, a3, a1
; RV32M-NEXT: andi a1, a1, 2047
; RV32M-NEXT: srli a3, a2, 11
; RV32M-NEXT: andi a3, a3, 2047
; RV32M-NEXT: andi a2, a2, 2047
; RV32M-NEXT: lui a4, 699051
; RV32M-NEXT: addi a4, a4, -1365
; RV32M-NEXT: mulhu a4, a2, a4
; RV32M-NEXT: srli a4, a4, 2
; RV32M-NEXT: addi a5, zero, 6
; RV32M-NEXT: mul a4, a4, a5
; RV32M-NEXT: sub a2, a2, a4
; RV32M-NEXT: lui a4, 536863
; RV32M-NEXT: addi a4, a4, -1229
; RV32M-NEXT: mul a1, a1, a4
; RV32M-NEXT: lui a4, 1023427
; RV32M-NEXT: addi a4, a4, -1638
; RV32M-NEXT: add a1, a1, a4
; RV32M-NEXT: lui a4, 513
; RV32M-NEXT: addi a4, a4, 1036
; RV32M-NEXT: sltu a1, a4, a1
; RV32M-NEXT: lui a4, 748983
; RV32M-NEXT: addi a4, a4, -585
; RV32M-NEXT: mul a3, a3, a4
; RV32M-NEXT: lui a4, 299593
; RV32M-NEXT: addi a4, a4, 585
; RV32M-NEXT: add a3, a3, a4
; RV32M-NEXT: lui a4, 149797
; RV32M-NEXT: addi a4, a4, -1756
; RV32M-NEXT: sltu a3, a4, a3
; RV32M-NEXT: snez a2, a2
; RV32M-NEXT: neg a2, a2
; RV32M-NEXT: neg a3, a3
; RV32M-NEXT: neg a4, a1
; RV32M-NEXT: srli a4, a4, 10
; RV32M-NEXT: andi a4, a4, 1
; RV32M-NEXT: sb a4, 4(a0)
; RV32M-NEXT: andi a3, a3, 2047
; RV32M-NEXT: slli a3, a3, 11
; RV32M-NEXT: andi a2, a2, 2047
; RV32M-NEXT: or a2, a2, a3
; RV32M-NEXT: slli a1, a1, 22
; RV32M-NEXT: sub a1, a2, a1
; RV32M-NEXT: sw a1, 0(a0)
; RV32M-NEXT: ret
;
; RV64M-LABEL: test_urem_vec:
; RV64M: # %bb.0:
; RV64M-NEXT: lbu a1, 4(a0)
; RV64M-NEXT: lwu a2, 0(a0)
; RV64M-NEXT: slli a1, a1, 32
; RV64M-NEXT: or a1, a2, a1
; RV64M-NEXT: srli a2, a1, 11
; RV64M-NEXT: andi a2, a2, 2047
; RV64M-NEXT: srli a3, a1, 22
; RV64M-NEXT: andi a1, a1, 2047
; RV64M-NEXT: lui a4, 1026731
; RV64M-NEXT: addiw a4, a4, -1365
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -1365
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -1365
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -1365
; RV64M-NEXT: mulhu a4, a1, a4
; RV64M-NEXT: srli a4, a4, 2
; RV64M-NEXT: addi a5, zero, 6
; RV64M-NEXT: mul a4, a4, a5
; RV64M-NEXT: sub a1, a1, a4
; RV64M-NEXT: snez a1, a1
; RV64M-NEXT: lui a4, 14948
; RV64M-NEXT: addiw a4, a4, 2029
; RV64M-NEXT: slli a4, a4, 13
; RV64M-NEXT: addi a4, a4, -381
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, 287
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -1229
; RV64M-NEXT: mul a3, a3, a4
; RV64M-NEXT: lui a4, 1436
; RV64M-NEXT: addiw a4, a4, -2029
; RV64M-NEXT: slli a4, a4, 13
; RV64M-NEXT: addi a4, a4, 381
; RV64M-NEXT: slli a4, a4, 13
; RV64M-NEXT: addi a4, a4, -573
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -1638
; RV64M-NEXT: add a3, a3, a4
; RV64M-NEXT: lui a4, 16424
; RV64M-NEXT: addiw a4, a4, 401
; RV64M-NEXT: slli a4, a4, 14
; RV64M-NEXT: addi a4, a4, -345
; RV64M-NEXT: slli a4, a4, 13
; RV64M-NEXT: addi a4, a4, 1295
; RV64M-NEXT: sltu a3, a4, a3
; RV64M-NEXT: lui a4, 28087
; RV64M-NEXT: addiw a4, a4, -585
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -585
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -585
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, -585
; RV64M-NEXT: mul a2, a2, a4
; RV64M-NEXT: lui a4, 1020489
; RV64M-NEXT: addiw a4, a4, 585
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, 585
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, 585
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, 585
; RV64M-NEXT: add a2, a2, a4
; RV64M-NEXT: lui a4, 4681
; RV64M-NEXT: addiw a4, a4, 585
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, 585
; RV64M-NEXT: slli a4, a4, 12
; RV64M-NEXT: addi a4, a4, 585
; RV64M-NEXT: slli a4, a4, 13
; RV64M-NEXT: addi a4, a4, 1170
; RV64M-NEXT: sltu a2, a4, a2
; RV64M-NEXT: neg a1, a1
; RV64M-NEXT: neg a2, a2
; RV64M-NEXT: andi a1, a1, 2047
; RV64M-NEXT: andi a2, a2, 2047
; RV64M-NEXT: slli a2, a2, 11
; RV64M-NEXT: or a1, a1, a2
; RV64M-NEXT: slli a2, a3, 22
; RV64M-NEXT: sub a1, a1, a2
; RV64M-NEXT: sw a1, 0(a0)
; RV64M-NEXT: addi a2, zero, 1
; RV64M-NEXT: slli a2, a2, 33
; RV64M-NEXT: addi a2, a2, -1
; RV64M-NEXT: and a1, a1, a2
; RV64M-NEXT: srli a1, a1, 32
; RV64M-NEXT: sb a1, 4(a0)
; RV64M-NEXT: ret
;
; RV32MV-LABEL: test_urem_vec:
; RV32MV: # %bb.0:
; RV32MV-NEXT: addi sp, sp, -16
; RV32MV-NEXT: lb a1, 4(a0)
; RV32MV-NEXT: lw a2, 0(a0)
; RV32MV-NEXT: slli a1, a1, 10
; RV32MV-NEXT: srli a3, a2, 22
; RV32MV-NEXT: or a1, a3, a1
; RV32MV-NEXT: andi a1, a1, 2047
; RV32MV-NEXT: srli a3, a2, 11
; RV32MV-NEXT: andi a3, a3, 2047
; RV32MV-NEXT: andi a2, a2, 2047
; RV32MV-NEXT: lui a4, 699051
; RV32MV-NEXT: addi a4, a4, -1365
; RV32MV-NEXT: mulhu a4, a2, a4
; RV32MV-NEXT: srli a4, a4, 2
; RV32MV-NEXT: addi a5, zero, 6
; RV32MV-NEXT: mul a4, a4, a5
; RV32MV-NEXT: sub a2, a2, a4
; RV32MV-NEXT: sh a2, 8(sp)
; RV32MV-NEXT: lui a2, 2566
; RV32MV-NEXT: addi a2, a2, 1087
; RV32MV-NEXT: mulhu a2, a1, a2
; RV32MV-NEXT: sub a4, a1, a2
; RV32MV-NEXT: srli a4, a4, 1
; RV32MV-NEXT: add a2, a4, a2
; RV32MV-NEXT: srli a2, a2, 10
; RV32MV-NEXT: addi a4, zero, 2043
; RV32MV-NEXT: mul a2, a2, a4
; RV32MV-NEXT: sub a1, a1, a2
; RV32MV-NEXT: sh a1, 12(sp)
; RV32MV-NEXT: lui a1, 149797
; RV32MV-NEXT: addi a1, a1, -1755
; RV32MV-NEXT: mulhu a1, a3, a1
; RV32MV-NEXT: sub a2, a3, a1
; RV32MV-NEXT: srli a2, a2, 1
; RV32MV-NEXT: add a1, a2, a1
; RV32MV-NEXT: srli a1, a1, 2
; RV32MV-NEXT: slli a2, a1, 3
; RV32MV-NEXT: sub a1, a1, a2
; RV32MV-NEXT: add a1, a3, a1
; RV32MV-NEXT: sh a1, 10(sp)
; RV32MV-NEXT: vsetivli a1, 4, e16,m1,ta,mu
; RV32MV-NEXT: addi a1, sp, 8
; RV32MV-NEXT: vle16.v v25, (a1)
; RV32MV-NEXT: lui a1, %hi(.LCPI4_0)
; RV32MV-NEXT: addi a1, a1, %lo(.LCPI4_0)
; RV32MV-NEXT: vle16.v v26, (a1)
; RV32MV-NEXT: addi a1, zero, 2047
; RV32MV-NEXT: vand.vx v25, v25, a1
; RV32MV-NEXT: vmsne.vv v0, v25, v26
; RV32MV-NEXT: vmv.v.i v25, 0
; RV32MV-NEXT: vmerge.vim v25, v25, -1, v0
; RV32MV-NEXT: vsetivli a1, 1, e16,m1,ta,mu
; RV32MV-NEXT: vslidedown.vi v26, v25, 2
; RV32MV-NEXT: vmv.x.s a1, v26
; RV32MV-NEXT: srli a2, a1, 10
; RV32MV-NEXT: andi a2, a2, 1
; RV32MV-NEXT: sb a2, 4(a0)
; RV32MV-NEXT: vmv.x.s a2, v25
; RV32MV-NEXT: andi a2, a2, 2047
; RV32MV-NEXT: vslidedown.vi v25, v25, 1
; RV32MV-NEXT: vmv.x.s a3, v25
; RV32MV-NEXT: andi a3, a3, 2047
; RV32MV-NEXT: slli a3, a3, 11
; RV32MV-NEXT: or a2, a2, a3
; RV32MV-NEXT: slli a1, a1, 22
; RV32MV-NEXT: or a1, a2, a1
; RV32MV-NEXT: sw a1, 0(a0)
; RV32MV-NEXT: addi sp, sp, 16
; RV32MV-NEXT: ret
;
; RV64MV-LABEL: test_urem_vec:
; RV64MV: # %bb.0:
; RV64MV-NEXT: addi sp, sp, -16
; RV64MV-NEXT: lbu a1, 4(a0)
; RV64MV-NEXT: lwu a2, 0(a0)
; RV64MV-NEXT: slli a1, a1, 32
; RV64MV-NEXT: or a1, a2, a1
; RV64MV-NEXT: srli a2, a1, 11
; RV64MV-NEXT: andi a2, a2, 2047
; RV64MV-NEXT: andi a3, a1, 2047
; RV64MV-NEXT: srli a1, a1, 22
; RV64MV-NEXT: lui a4, 1027
; RV64MV-NEXT: addiw a4, a4, -2023
; RV64MV-NEXT: slli a4, a4, 15
; RV64MV-NEXT: addi a4, a4, 2005
; RV64MV-NEXT: slli a4, a4, 12
; RV64MV-NEXT: addi a4, a4, -431
; RV64MV-NEXT: slli a4, a4, 13
; RV64MV-NEXT: addi a4, a4, -429
; RV64MV-NEXT: mulhu a4, a1, a4
; RV64MV-NEXT: srli a4, a4, 9
; RV64MV-NEXT: addi a5, zero, 2043
; RV64MV-NEXT: mul a4, a4, a5
; RV64MV-NEXT: sub a1, a1, a4
; RV64MV-NEXT: sh a1, 12(sp)
; RV64MV-NEXT: lui a1, 1026731
; RV64MV-NEXT: addiw a1, a1, -1365
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1365
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1365
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, -1365
; RV64MV-NEXT: mulhu a1, a3, a1
; RV64MV-NEXT: srli a1, a1, 2
; RV64MV-NEXT: addi a4, zero, 6
; RV64MV-NEXT: mul a1, a1, a4
; RV64MV-NEXT: sub a1, a3, a1
; RV64MV-NEXT: sh a1, 8(sp)
; RV64MV-NEXT: lui a1, 4681
; RV64MV-NEXT: addiw a1, a1, 585
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, 585
; RV64MV-NEXT: slli a1, a1, 12
; RV64MV-NEXT: addi a1, a1, 585
; RV64MV-NEXT: slli a1, a1, 13
; RV64MV-NEXT: addi a1, a1, 1171
; RV64MV-NEXT: mulhu a1, a2, a1
; RV64MV-NEXT: sub a3, a2, a1
; RV64MV-NEXT: srli a3, a3, 1
; RV64MV-NEXT: add a1, a3, a1
; RV64MV-NEXT: srli a1, a1, 2
; RV64MV-NEXT: slli a3, a1, 3
; RV64MV-NEXT: sub a1, a1, a3
; RV64MV-NEXT: add a1, a2, a1
; RV64MV-NEXT: sh a1, 10(sp)
; RV64MV-NEXT: vsetivli a1, 4, e16,m1,ta,mu
; RV64MV-NEXT: addi a1, sp, 8
; RV64MV-NEXT: vle16.v v25, (a1)
; RV64MV-NEXT: lui a1, %hi(.LCPI4_0)
; RV64MV-NEXT: addi a1, a1, %lo(.LCPI4_0)
; RV64MV-NEXT: vle16.v v26, (a1)
; RV64MV-NEXT: addi a1, zero, 2047
; RV64MV-NEXT: vand.vx v25, v25, a1
; RV64MV-NEXT: vmsne.vv v0, v25, v26
; RV64MV-NEXT: vmv.v.i v25, 0
; RV64MV-NEXT: vmerge.vim v25, v25, -1, v0
; RV64MV-NEXT: vmv.x.s a1, v25
; RV64MV-NEXT: andi a1, a1, 2047
; RV64MV-NEXT: addi a2, zero, 1
; RV64MV-NEXT: vsetivli a3, 1, e16,m1,ta,mu
; RV64MV-NEXT: vslidedown.vi v26, v25, 1
; RV64MV-NEXT: vmv.x.s a3, v26
; RV64MV-NEXT: andi a3, a3, 2047
; RV64MV-NEXT: slli a3, a3, 11
; RV64MV-NEXT: or a1, a1, a3
; RV64MV-NEXT: vslidedown.vi v25, v25, 2
; RV64MV-NEXT: vmv.x.s a3, v25
; RV64MV-NEXT: slli a3, a3, 22
; RV64MV-NEXT: or a1, a1, a3
; RV64MV-NEXT: sw a1, 0(a0)
; RV64MV-NEXT: slli a2, a2, 33
; RV64MV-NEXT: addi a2, a2, -1
; RV64MV-NEXT: and a1, a1, a2
; RV64MV-NEXT: srli a1, a1, 32
; RV64MV-NEXT: sb a1, 4(a0)
; RV64MV-NEXT: addi sp, sp, 16
; RV64MV-NEXT: ret
%ld = load <3 x i11>, <3 x i11>* %X
%urem = urem <3 x i11> %ld, <i11 6, i11 7, i11 -5>
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
%ext = sext <3 x i1> %cmp to <3 x i11>
store <3 x i11> %ext, <3 x i11>* %X
ret void
}

View File

@ -0,0 +1,137 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=thumb-eabi < %s | FileCheck %s
define i1 @test_srem_odd(i29 %X) nounwind {
; CHECK-LABEL: test_srem_odd:
; CHECK: @ %bb.0:
; CHECK-NEXT: lsls r0, r0, #3
; CHECK-NEXT: asrs r0, r0, #3
; CHECK-NEXT: ldr r1, .LCPI0_0
; CHECK-NEXT: muls r1, r0, r1
; CHECK-NEXT: ldr r0, .LCPI0_1
; CHECK-NEXT: adds r0, r1, r0
; CHECK-NEXT: ldr r1, .LCPI0_2
; CHECK-NEXT: cmp r0, r1
; CHECK-NEXT: blo .LBB0_2
; CHECK-NEXT: @ %bb.1:
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: bx lr
; CHECK-NEXT: .LBB0_2:
; CHECK-NEXT: movs r0, #1
; CHECK-NEXT: bx lr
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: @ %bb.3:
; CHECK-NEXT: .LCPI0_0:
; CHECK-NEXT: .long 3210379595 @ 0xbf5a814b
; CHECK-NEXT: .LCPI0_1:
; CHECK-NEXT: .long 21691754 @ 0x14afd6a
; CHECK-NEXT: .LCPI0_2:
; CHECK-NEXT: .long 43383509 @ 0x295fad5
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; CHECK-LABEL: test_srem_even:
; CHECK: @ %bb.0:
; CHECK-NEXT: .save {r7, lr}
; CHECK-NEXT: push {r7, lr}
; CHECK-NEXT: lsls r0, r0, #28
; CHECK-NEXT: asrs r0, r0, #28
; CHECK-NEXT: movs r1, #6
; CHECK-NEXT: bl __aeabi_idivmod
; CHECK-NEXT: subs r1, r1, #1
; CHECK-NEXT: rsbs r0, r1, #0
; CHECK-NEXT: adcs r0, r1
; CHECK-NEXT: pop {r7}
; CHECK-NEXT: pop {r1}
; CHECK-NEXT: bx r1
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; CHECK-LABEL: test_srem_pow2_setne:
; CHECK: @ %bb.0:
; CHECK-NEXT: lsls r1, r0, #26
; CHECK-NEXT: asrs r1, r1, #26
; CHECK-NEXT: lsrs r1, r1, #30
; CHECK-NEXT: adds r1, r0, r1
; CHECK-NEXT: movs r2, #60
; CHECK-NEXT: ands r2, r1
; CHECK-NEXT: subs r1, r0, r2
; CHECK-NEXT: movs r0, #63
; CHECK-NEXT: ands r0, r1
; CHECK-NEXT: subs r1, r0, #1
; CHECK-NEXT: sbcs r0, r1
; CHECK-NEXT: bx lr
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
; CHECK-LABEL: test_srem_vec:
; CHECK: @ %bb.0:
; CHECK-NEXT: .save {r4, r5, r6, r7, lr}
; CHECK-NEXT: push {r4, r5, r6, r7, lr}
; CHECK-NEXT: .pad #12
; CHECK-NEXT: sub sp, #12
; CHECK-NEXT: movs r7, r3
; CHECK-NEXT: str r2, [sp, #4] @ 4-byte Spill
; CHECK-NEXT: movs r5, #1
; CHECK-NEXT: ands r1, r5
; CHECK-NEXT: rsbs r1, r1, #0
; CHECK-NEXT: movs r6, #9
; CHECK-NEXT: movs r3, #0
; CHECK-NEXT: str r3, [sp] @ 4-byte Spill
; CHECK-NEXT: movs r2, r6
; CHECK-NEXT: bl __aeabi_ldivmod
; CHECK-NEXT: movs r4, r2
; CHECK-NEXT: movs r0, #3
; CHECK-NEXT: str r0, [sp, #8] @ 4-byte Spill
; CHECK-NEXT: eors r4, r0
; CHECK-NEXT: orrs r4, r3
; CHECK-NEXT: subs r0, r4, #1
; CHECK-NEXT: sbcs r4, r0
; CHECK-NEXT: ands r7, r5
; CHECK-NEXT: rsbs r1, r7, #0
; CHECK-NEXT: ldr r0, [sp, #4] @ 4-byte Reload
; CHECK-NEXT: movs r2, r6
; CHECK-NEXT: ldr r7, [sp] @ 4-byte Reload
; CHECK-NEXT: movs r3, r7
; CHECK-NEXT: bl __aeabi_ldivmod
; CHECK-NEXT: movs r0, r5
; CHECK-NEXT: bics r0, r3
; CHECK-NEXT: movs r1, #2
; CHECK-NEXT: mvns r6, r1
; CHECK-NEXT: eors r6, r2
; CHECK-NEXT: orrs r6, r0
; CHECK-NEXT: subs r0, r6, #1
; CHECK-NEXT: sbcs r6, r0
; CHECK-NEXT: ldr r0, [sp, #36]
; CHECK-NEXT: ands r0, r5
; CHECK-NEXT: rsbs r1, r0, #0
; CHECK-NEXT: movs r0, #8
; CHECK-NEXT: mvns r2, r0
; CHECK-NEXT: mvns r3, r7
; CHECK-NEXT: ldr r0, [sp, #32]
; CHECK-NEXT: bl __aeabi_ldivmod
; CHECK-NEXT: ands r3, r5
; CHECK-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
; CHECK-NEXT: eors r2, r0
; CHECK-NEXT: orrs r2, r3
; CHECK-NEXT: subs r0, r2, #1
; CHECK-NEXT: sbcs r2, r0
; CHECK-NEXT: movs r0, r4
; CHECK-NEXT: movs r1, r6
; CHECK-NEXT: add sp, #12
; CHECK-NEXT: pop {r4, r5, r6, r7}
; CHECK-NEXT: pop {r3}
; CHECK-NEXT: bx r3
%srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
%cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,188 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=thumb-eabi < %s | FileCheck %s
define i1 @test_urem_odd(i13 %X) nounwind {
; CHECK-LABEL: test_urem_odd:
; CHECK: @ %bb.0:
; CHECK-NEXT: ldr r1, .LCPI0_0
; CHECK-NEXT: ands r1, r0
; CHECK-NEXT: ldr r0, .LCPI0_1
; CHECK-NEXT: muls r0, r1, r0
; CHECK-NEXT: ldr r1, .LCPI0_2
; CHECK-NEXT: cmp r0, r1
; CHECK-NEXT: blo .LBB0_2
; CHECK-NEXT: @ %bb.1:
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: bx lr
; CHECK-NEXT: .LBB0_2:
; CHECK-NEXT: movs r0, #1
; CHECK-NEXT: bx lr
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: @ %bb.3:
; CHECK-NEXT: .LCPI0_0:
; CHECK-NEXT: .long 8191 @ 0x1fff
; CHECK-NEXT: .LCPI0_1:
; CHECK-NEXT: .long 3435973837 @ 0xcccccccd
; CHECK-NEXT: .LCPI0_2:
; CHECK-NEXT: .long 858993460 @ 0x33333334
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; CHECK-LABEL: test_urem_even:
; CHECK: @ %bb.0:
; CHECK-NEXT: movs r1, #31
; CHECK-NEXT: lsls r1, r1, #27
; CHECK-NEXT: bics r0, r1
; CHECK-NEXT: ldr r1, .LCPI1_0
; CHECK-NEXT: muls r1, r0, r1
; CHECK-NEXT: movs r0, #1
; CHECK-NEXT: rors r1, r0
; CHECK-NEXT: ldr r2, .LCPI1_1
; CHECK-NEXT: cmp r1, r2
; CHECK-NEXT: blo .LBB1_2
; CHECK-NEXT: @ %bb.1:
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: .LBB1_2:
; CHECK-NEXT: bx lr
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: @ %bb.3:
; CHECK-NEXT: .LCPI1_0:
; CHECK-NEXT: .long 3067833783 @ 0xb6db6db7
; CHECK-NEXT: .LCPI1_1:
; CHECK-NEXT: .long 306783379 @ 0x12492493
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; CHECK-LABEL: test_urem_odd_setne:
; CHECK: @ %bb.0:
; CHECK-NEXT: movs r1, #15
; CHECK-NEXT: ands r1, r0
; CHECK-NEXT: ldr r0, .LCPI2_0
; CHECK-NEXT: muls r0, r1, r0
; CHECK-NEXT: ldr r1, .LCPI2_1
; CHECK-NEXT: cmp r0, r1
; CHECK-NEXT: bhi .LBB2_2
; CHECK-NEXT: @ %bb.1:
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: bx lr
; CHECK-NEXT: .LBB2_2:
; CHECK-NEXT: movs r0, #1
; CHECK-NEXT: bx lr
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: @ %bb.3:
; CHECK-NEXT: .LCPI2_0:
; CHECK-NEXT: .long 3435973837 @ 0xcccccccd
; CHECK-NEXT: .LCPI2_1:
; CHECK-NEXT: .long 858993459 @ 0x33333333
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; CHECK-LABEL: test_urem_negative_odd:
; CHECK: @ %bb.0:
; CHECK-NEXT: ldr r1, .LCPI3_0
; CHECK-NEXT: ands r1, r0
; CHECK-NEXT: ldr r0, .LCPI3_1
; CHECK-NEXT: muls r0, r1, r0
; CHECK-NEXT: ldr r1, .LCPI3_2
; CHECK-NEXT: cmp r0, r1
; CHECK-NEXT: bhi .LBB3_2
; CHECK-NEXT: @ %bb.1:
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: bx lr
; CHECK-NEXT: .LBB3_2:
; CHECK-NEXT: movs r0, #1
; CHECK-NEXT: bx lr
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: @ %bb.3:
; CHECK-NEXT: .LCPI3_0:
; CHECK-NEXT: .long 511 @ 0x1ff
; CHECK-NEXT: .LCPI3_1:
; CHECK-NEXT: .long 2837897523 @ 0xa926e133
; CHECK-NEXT: .LCPI3_2:
; CHECK-NEXT: .long 8471335 @ 0x814327
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; CHECK-LABEL: test_urem_vec:
; CHECK: @ %bb.0:
; CHECK-NEXT: .save {r4, r5, r6, lr}
; CHECK-NEXT: push {r4, r5, r6, lr}
; CHECK-NEXT: movs r3, r2
; CHECK-NEXT: ldr r5, .LCPI4_0
; CHECK-NEXT: ands r0, r5
; CHECK-NEXT: ldr r6, .LCPI4_1
; CHECK-NEXT: muls r6, r0, r6
; CHECK-NEXT: movs r2, #1
; CHECK-NEXT: rors r6, r2
; CHECK-NEXT: ldr r0, .LCPI4_2
; CHECK-NEXT: movs r4, #0
; CHECK-NEXT: cmp r6, r0
; CHECK-NEXT: push {r2}
; CHECK-NEXT: pop {r0}
; CHECK-NEXT: bhi .LBB4_2
; CHECK-NEXT: @ %bb.1:
; CHECK-NEXT: movs r0, r4
; CHECK-NEXT: .LBB4_2:
; CHECK-NEXT: ands r1, r5
; CHECK-NEXT: ldr r6, .LCPI4_3
; CHECK-NEXT: muls r6, r1, r6
; CHECK-NEXT: ldr r1, .LCPI4_4
; CHECK-NEXT: adds r1, r6, r1
; CHECK-NEXT: ldr r6, .LCPI4_5
; CHECK-NEXT: cmp r1, r6
; CHECK-NEXT: push {r2}
; CHECK-NEXT: pop {r1}
; CHECK-NEXT: bhi .LBB4_4
; CHECK-NEXT: @ %bb.3:
; CHECK-NEXT: movs r1, r4
; CHECK-NEXT: .LBB4_4:
; CHECK-NEXT: ands r3, r5
; CHECK-NEXT: ldr r5, .LCPI4_6
; CHECK-NEXT: muls r5, r3, r5
; CHECK-NEXT: ldr r3, .LCPI4_7
; CHECK-NEXT: adds r3, r5, r3
; CHECK-NEXT: ldr r5, .LCPI4_8
; CHECK-NEXT: cmp r3, r5
; CHECK-NEXT: bhi .LBB4_6
; CHECK-NEXT: @ %bb.5:
; CHECK-NEXT: movs r2, r4
; CHECK-NEXT: .LBB4_6:
; CHECK-NEXT: pop {r4, r5, r6}
; CHECK-NEXT: pop {r3}
; CHECK-NEXT: bx r3
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: @ %bb.7:
; CHECK-NEXT: .LCPI4_0:
; CHECK-NEXT: .long 2047 @ 0x7ff
; CHECK-NEXT: .LCPI4_1:
; CHECK-NEXT: .long 2863311531 @ 0xaaaaaaab
; CHECK-NEXT: .LCPI4_2:
; CHECK-NEXT: .long 715827882 @ 0x2aaaaaaa
; CHECK-NEXT: .LCPI4_3:
; CHECK-NEXT: .long 3067833783 @ 0xb6db6db7
; CHECK-NEXT: .LCPI4_4:
; CHECK-NEXT: .long 1227133513 @ 0x49249249
; CHECK-NEXT: .LCPI4_5:
; CHECK-NEXT: .long 613566756 @ 0x24924924
; CHECK-NEXT: .LCPI4_6:
; CHECK-NEXT: .long 2198989619 @ 0x8311eb33
; CHECK-NEXT: .LCPI4_7:
; CHECK-NEXT: .long 4191955354 @ 0xf9dc299a
; CHECK-NEXT: .LCPI4_8:
; CHECK-NEXT: .long 2102284 @ 0x20140c
%urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,145 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=thumbv7-none-eabi < %s | FileCheck %s
define i1 @test_srem_odd(i29 %X) nounwind {
; CHECK-LABEL: test_srem_odd:
; CHECK: @ %bb.0:
; CHECK-NEXT: movw r1, #64874
; CHECK-NEXT: movw r2, #33099
; CHECK-NEXT: sbfx r0, r0, #0, #29
; CHECK-NEXT: movt r1, #330
; CHECK-NEXT: movt r2, #48986
; CHECK-NEXT: mla r1, r0, r2, r1
; CHECK-NEXT: movw r2, #64213
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: movt r2, #661
; CHECK-NEXT: cmp r1, r2
; CHECK-NEXT: it lo
; CHECK-NEXT: movlo r0, #1
; CHECK-NEXT: bx lr
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; CHECK-LABEL: test_srem_even:
; CHECK: @ %bb.0:
; CHECK-NEXT: movw r2, #43691
; CHECK-NEXT: sbfx r1, r0, #0, #4
; CHECK-NEXT: movt r2, #10922
; CHECK-NEXT: lsls r0, r0, #28
; CHECK-NEXT: smmul r1, r1, r2
; CHECK-NEXT: add.w r1, r1, r1, lsr #31
; CHECK-NEXT: add.w r1, r1, r1, lsl #1
; CHECK-NEXT: mvn.w r1, r1, lsl #1
; CHECK-NEXT: add.w r0, r1, r0, asr #28
; CHECK-NEXT: clz r0, r0
; CHECK-NEXT: lsrs r0, r0, #5
; CHECK-NEXT: bx lr
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; CHECK-LABEL: test_srem_pow2_setne:
; CHECK: @ %bb.0:
; CHECK-NEXT: sbfx r1, r0, #0, #6
; CHECK-NEXT: ubfx r1, r1, #9, #2
; CHECK-NEXT: add r1, r0
; CHECK-NEXT: and r1, r1, #60
; CHECK-NEXT: subs r0, r0, r1
; CHECK-NEXT: ands r0, r0, #63
; CHECK-NEXT: it ne
; CHECK-NEXT: movne r0, #1
; CHECK-NEXT: bx lr
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
; CHECK-LABEL: test_srem_vec:
; CHECK: @ %bb.0:
; CHECK-NEXT: .save {r4, r5, r6, r7, lr}
; CHECK-NEXT: push {r4, r5, r6, r7, lr}
; CHECK-NEXT: .pad #4
; CHECK-NEXT: sub sp, #4
; CHECK-NEXT: .vsave {d8, d9}
; CHECK-NEXT: vpush {d8, d9}
; CHECK-NEXT: mov r5, r0
; CHECK-NEXT: and r0, r3, #1
; CHECK-NEXT: mov r4, r1
; CHECK-NEXT: rsbs r1, r0, #0
; CHECK-NEXT: mov r0, r2
; CHECK-NEXT: movs r2, #9
; CHECK-NEXT: movs r3, #0
; CHECK-NEXT: bl __aeabi_ldivmod
; CHECK-NEXT: and r0, r4, #1
; CHECK-NEXT: mov r6, r2
; CHECK-NEXT: rsbs r1, r0, #0
; CHECK-NEXT: mov r7, r3
; CHECK-NEXT: mov r0, r5
; CHECK-NEXT: movs r2, #9
; CHECK-NEXT: movs r3, #0
; CHECK-NEXT: bl __aeabi_ldivmod
; CHECK-NEXT: ldr r1, [sp, #44]
; CHECK-NEXT: vmov.32 d8[0], r2
; CHECK-NEXT: ldr r0, [sp, #40]
; CHECK-NEXT: mov r4, r3
; CHECK-NEXT: and r1, r1, #1
; CHECK-NEXT: mvn r2, #8
; CHECK-NEXT: rsbs r1, r1, #0
; CHECK-NEXT: mov.w r3, #-1
; CHECK-NEXT: vmov.32 d9[0], r6
; CHECK-NEXT: bl __aeabi_ldivmod
; CHECK-NEXT: vmov.32 d16[0], r2
; CHECK-NEXT: adr r0, .LCPI3_0
; CHECK-NEXT: vmov.32 d9[1], r7
; CHECK-NEXT: vld1.64 {d18, d19}, [r0:128]
; CHECK-NEXT: adr r0, .LCPI3_1
; CHECK-NEXT: vmov.32 d16[1], r3
; CHECK-NEXT: vmov.32 d8[1], r4
; CHECK-NEXT: vand q8, q8, q9
; CHECK-NEXT: vld1.64 {d20, d21}, [r0:128]
; CHECK-NEXT: adr r0, .LCPI3_2
; CHECK-NEXT: vand q11, q4, q9
; CHECK-NEXT: vld1.64 {d18, d19}, [r0:128]
; CHECK-NEXT: vceq.i32 q10, q11, q10
; CHECK-NEXT: vceq.i32 q8, q8, q9
; CHECK-NEXT: vrev64.32 q9, q10
; CHECK-NEXT: vrev64.32 q11, q8
; CHECK-NEXT: vand q9, q10, q9
; CHECK-NEXT: vand q8, q8, q11
; CHECK-NEXT: vmvn q9, q9
; CHECK-NEXT: vmvn q8, q8
; CHECK-NEXT: vmovn.i64 d18, q9
; CHECK-NEXT: vmovn.i64 d16, q8
; CHECK-NEXT: vmov.32 r0, d18[0]
; CHECK-NEXT: vmov.32 r1, d18[1]
; CHECK-NEXT: vmov.32 r2, d16[0]
; CHECK-NEXT: vpop {d8, d9}
; CHECK-NEXT: add sp, #4
; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
; CHECK-NEXT: .p2align 4
; CHECK-NEXT: @ %bb.1:
; CHECK-NEXT: .LCPI3_0:
; CHECK-NEXT: .long 4294967295 @ 0xffffffff
; CHECK-NEXT: .long 1 @ 0x1
; CHECK-NEXT: .long 4294967295 @ 0xffffffff
; CHECK-NEXT: .long 1 @ 0x1
; CHECK-NEXT: .LCPI3_1:
; CHECK-NEXT: .long 3 @ 0x3
; CHECK-NEXT: .long 0 @ 0x0
; CHECK-NEXT: .long 4294967293 @ 0xfffffffd
; CHECK-NEXT: .long 1 @ 0x1
; CHECK-NEXT: .LCPI3_2:
; CHECK-NEXT: .long 3 @ 0x3
; CHECK-NEXT: .long 0 @ 0x0
; CHECK-NEXT: .zero 4
; CHECK-NEXT: .long 0 @ 0x0
%srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
%cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,128 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=thumbv7-none-eabi < %s | FileCheck %s
define i1 @test_urem_odd(i13 %X) nounwind {
; CHECK-LABEL: test_urem_odd:
; CHECK: @ %bb.0:
; CHECK-NEXT: movw r1, #52429
; CHECK-NEXT: bfc r0, #13, #19
; CHECK-NEXT: movt r1, #52428
; CHECK-NEXT: muls r1, r0, r1
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: cmn.w r1, #-858993460
; CHECK-NEXT: it lo
; CHECK-NEXT: movlo r0, #1
; CHECK-NEXT: bx lr
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; CHECK-LABEL: test_urem_even:
; CHECK: @ %bb.0:
; CHECK-NEXT: movw r1, #28087
; CHECK-NEXT: bic r0, r0, #-134217728
; CHECK-NEXT: movt r1, #46811
; CHECK-NEXT: movw r2, #9363
; CHECK-NEXT: muls r0, r1, r0
; CHECK-NEXT: movt r2, #4681
; CHECK-NEXT: ror.w r1, r0, #1
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: cmp r1, r2
; CHECK-NEXT: it lo
; CHECK-NEXT: movlo r0, #1
; CHECK-NEXT: bx lr
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; CHECK-LABEL: test_urem_odd_setne:
; CHECK: @ %bb.0:
; CHECK-NEXT: movw r1, #52429
; CHECK-NEXT: and r0, r0, #15
; CHECK-NEXT: movt r1, #52428
; CHECK-NEXT: muls r1, r0, r1
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: cmp.w r1, #858993459
; CHECK-NEXT: it hi
; CHECK-NEXT: movhi r0, #1
; CHECK-NEXT: bx lr
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; CHECK-LABEL: test_urem_negative_odd:
; CHECK: @ %bb.0:
; CHECK-NEXT: movw r1, #57651
; CHECK-NEXT: bfc r0, #9, #23
; CHECK-NEXT: movt r1, #43302
; CHECK-NEXT: movw r2, #17191
; CHECK-NEXT: muls r1, r0, r1
; CHECK-NEXT: movs r0, #0
; CHECK-NEXT: movt r2, #129
; CHECK-NEXT: cmp r1, r2
; CHECK-NEXT: it hi
; CHECK-NEXT: movhi r0, #1
; CHECK-NEXT: bx lr
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; CHECK-LABEL: test_urem_vec:
; CHECK: @ %bb.0:
; CHECK-NEXT: .save {r4, lr}
; CHECK-NEXT: push {r4, lr}
; CHECK-NEXT: movw r3, #18725
; CHECK-NEXT: bfc r1, #11, #21
; CHECK-NEXT: movt r3, #9362
; CHECK-NEXT: bfc r2, #11, #21
; CHECK-NEXT: umull r3, r12, r1, r3
; CHECK-NEXT: bfc r0, #11, #21
; CHECK-NEXT: movw r3, #25663
; CHECK-NEXT: movt r3, #160
; CHECK-NEXT: umull r3, lr, r2, r3
; CHECK-NEXT: vldr d17, .LCPI4_0
; CHECK-NEXT: movw r3, #43691
; CHECK-NEXT: movt r3, #43690
; CHECK-NEXT: umull r3, r4, r0, r3
; CHECK-NEXT: sub.w r3, r1, r12
; CHECK-NEXT: add.w r3, r12, r3, lsr #1
; CHECK-NEXT: lsr.w r12, r3, #2
; CHECK-NEXT: sub.w r3, r2, lr
; CHECK-NEXT: lsrs r4, r4, #2
; CHECK-NEXT: add.w r4, r4, r4, lsl #1
; CHECK-NEXT: add.w r3, lr, r3, lsr #1
; CHECK-NEXT: sub.w r0, r0, r4, lsl #1
; CHECK-NEXT: lsr.w lr, r3, #10
; CHECK-NEXT: movw r3, #2043
; CHECK-NEXT: vmov.16 d16[0], r0
; CHECK-NEXT: sub.w r0, r12, r12, lsl #3
; CHECK-NEXT: mls r2, lr, r3, r2
; CHECK-NEXT: add r0, r1
; CHECK-NEXT: vmov.16 d16[1], r0
; CHECK-NEXT: vmov.16 d16[2], r2
; CHECK-NEXT: vbic.i16 d16, #0xf800
; CHECK-NEXT: vceq.i16 d16, d16, d17
; CHECK-NEXT: vmvn d16, d16
; CHECK-NEXT: vmov.u16 r0, d16[0]
; CHECK-NEXT: vmov.u16 r1, d16[1]
; CHECK-NEXT: vmov.u16 r2, d16[2]
; CHECK-NEXT: pop {r4, pc}
; CHECK-NEXT: .p2align 3
; CHECK-NEXT: @ %bb.1:
; CHECK-NEXT: .LCPI4_0:
; CHECK-NEXT: .short 0 @ 0x0
; CHECK-NEXT: .short 1 @ 0x1
; CHECK-NEXT: .short 2 @ 0x2
; CHECK-NEXT: .short 0 @ 0x0
%urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,444 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=i686-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X86
; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X64
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 < %s | FileCheck %s --check-prefixes=X64,SSE2
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.1 < %s | FileCheck %s --check-prefixes=X64,SSE41
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefixes=X64,AVX1
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefixes=X64,AVX2
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=X64,AVX512VL
define i1 @test_srem_odd(i29 %X) nounwind {
; X86-LABEL: test_srem_odd:
; X86: # %bb.0:
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: shll $3, %eax
; X86-NEXT: sarl $3, %eax
; X86-NEXT: imull $-1084587701, %eax, %eax # imm = 0xBF5A814B
; X86-NEXT: addl $21691754, %eax # imm = 0x14AFD6A
; X86-NEXT: cmpl $43383509, %eax # imm = 0x295FAD5
; X86-NEXT: setb %al
; X86-NEXT: retl
;
; X64-LABEL: test_srem_odd:
; X64: # %bb.0:
; X64-NEXT: shll $3, %edi
; X64-NEXT: sarl $3, %edi
; X64-NEXT: imull $-1084587701, %edi, %eax # imm = 0xBF5A814B
; X64-NEXT: addl $21691754, %eax # imm = 0x14AFD6A
; X64-NEXT: cmpl $43383509, %eax # imm = 0x295FAD5
; X64-NEXT: setb %al
; X64-NEXT: retq
%srem = srem i29 %X, 99
%cmp = icmp eq i29 %srem, 0
ret i1 %cmp
}
define i1 @test_srem_even(i4 %X) nounwind {
; X86-LABEL: test_srem_even:
; X86: # %bb.0:
; X86-NEXT: movb {{[0-9]+}}(%esp), %al
; X86-NEXT: shlb $4, %al
; X86-NEXT: sarb $4, %al
; X86-NEXT: movsbl %al, %ecx
; X86-NEXT: imull $43, %ecx, %ecx
; X86-NEXT: movzwl %cx, %ecx
; X86-NEXT: movl %ecx, %edx
; X86-NEXT: shrl $15, %edx
; X86-NEXT: addb %ch, %dl
; X86-NEXT: movzbl %dl, %ecx
; X86-NEXT: addl %ecx, %ecx
; X86-NEXT: leal (%ecx,%ecx,2), %ecx
; X86-NEXT: subb %cl, %al
; X86-NEXT: cmpb $1, %al
; X86-NEXT: sete %al
; X86-NEXT: retl
;
; X64-LABEL: test_srem_even:
; X64: # %bb.0:
; X64-NEXT: shlb $4, %dil
; X64-NEXT: sarb $4, %dil
; X64-NEXT: movsbl %dil, %eax
; X64-NEXT: imull $43, %eax, %ecx
; X64-NEXT: movzwl %cx, %ecx
; X64-NEXT: movl %ecx, %edx
; X64-NEXT: shrl $15, %edx
; X64-NEXT: shrl $8, %ecx
; X64-NEXT: addb %dl, %cl
; X64-NEXT: movzbl %cl, %ecx
; X64-NEXT: addl %ecx, %ecx
; X64-NEXT: leal (%rcx,%rcx,2), %ecx
; X64-NEXT: subb %cl, %al
; X64-NEXT: cmpb $1, %al
; X64-NEXT: sete %al
; X64-NEXT: retq
%srem = srem i4 %X, 6
%cmp = icmp eq i4 %srem, 1
ret i1 %cmp
}
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
; X86-LABEL: test_srem_pow2_setne:
; X86: # %bb.0:
; X86-NEXT: movb {{[0-9]+}}(%esp), %al
; X86-NEXT: movl %eax, %ecx
; X86-NEXT: shlb $2, %cl
; X86-NEXT: sarb $5, %cl
; X86-NEXT: shrb $4, %cl
; X86-NEXT: andb $3, %cl
; X86-NEXT: addb %al, %cl
; X86-NEXT: andb $60, %cl
; X86-NEXT: subb %cl, %al
; X86-NEXT: testb $63, %al
; X86-NEXT: setne %al
; X86-NEXT: retl
;
; X64-LABEL: test_srem_pow2_setne:
; X64: # %bb.0:
; X64-NEXT: # kill: def $edi killed $edi def $rdi
; X64-NEXT: leal (,%rdi,4), %eax
; X64-NEXT: sarb $5, %al
; X64-NEXT: shrb $4, %al
; X64-NEXT: andb $3, %al
; X64-NEXT: addb %dil, %al
; X64-NEXT: andb $60, %al
; X64-NEXT: subb %al, %dil
; X64-NEXT: testb $63, %dil
; X64-NEXT: setne %al
; X64-NEXT: retq
%srem = srem i6 %X, 4
%cmp = icmp ne i6 %srem, 0
ret i1 %cmp
}
define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
; X86-LABEL: test_srem_vec:
; X86: # %bb.0:
; X86-NEXT: pushl %ebp
; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
; X86-NEXT: subl $12, %esp
; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
; X86-NEXT: andl $1, %edi
; X86-NEXT: negl %edi
; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
; X86-NEXT: andl $1, %ebp
; X86-NEXT: negl %ebp
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: andl $1, %eax
; X86-NEXT: negl %eax
; X86-NEXT: pushl $-1
; X86-NEXT: pushl $-9
; X86-NEXT: pushl %eax
; X86-NEXT: pushl {{[0-9]+}}(%esp)
; X86-NEXT: calll __moddi3
; X86-NEXT: addl $16, %esp
; X86-NEXT: movl %eax, %esi
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: pushl $0
; X86-NEXT: pushl $9
; X86-NEXT: pushl %ebp
; X86-NEXT: pushl %ebx
; X86-NEXT: calll __moddi3
; X86-NEXT: addl $16, %esp
; X86-NEXT: movl %eax, %ebx
; X86-NEXT: movl %edx, %ebp
; X86-NEXT: notl %ebp
; X86-NEXT: pushl $0
; X86-NEXT: pushl $9
; X86-NEXT: pushl %edi
; X86-NEXT: pushl {{[0-9]+}}(%esp)
; X86-NEXT: calll __moddi3
; X86-NEXT: addl $16, %esp
; X86-NEXT: xorl $3, %eax
; X86-NEXT: orl %edx, %eax
; X86-NEXT: setne %al
; X86-NEXT: xorl $3, %esi
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
; X86-NEXT: setne %cl
; X86-NEXT: xorl $-3, %ebx
; X86-NEXT: andl $1, %ebp
; X86-NEXT: orl %ebx, %ebp
; X86-NEXT: setne %dl
; X86-NEXT: addl $12, %esp
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
; X86-NEXT: popl %ebx
; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
; SSE2-LABEL: test_srem_vec:
; SSE2: # %bb.0:
; SSE2-NEXT: movq %rdx, %rcx
; SSE2-NEXT: shlq $31, %rcx
; SSE2-NEXT: sarq $31, %rcx
; SSE2-NEXT: shlq $31, %rdi
; SSE2-NEXT: sarq $31, %rdi
; SSE2-NEXT: shlq $31, %rsi
; SSE2-NEXT: sarq $31, %rsi
; SSE2-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
; SSE2-NEXT: movq %rsi, %rax
; SSE2-NEXT: imulq %r8
; SSE2-NEXT: movq %rdx, %rax
; SSE2-NEXT: shrq $63, %rax
; SSE2-NEXT: addq %rdx, %rax
; SSE2-NEXT: leaq (%rax,%rax,8), %rax
; SSE2-NEXT: subq %rax, %rsi
; SSE2-NEXT: movq %rsi, %xmm0
; SSE2-NEXT: movq %rdi, %rax
; SSE2-NEXT: imulq %r8
; SSE2-NEXT: movq %rdx, %rax
; SSE2-NEXT: shrq $63, %rax
; SSE2-NEXT: addq %rdx, %rax
; SSE2-NEXT: leaq (%rax,%rax,8), %rax
; SSE2-NEXT: subq %rax, %rdi
; SSE2-NEXT: movq %rdi, %xmm1
; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [8589934591,8589934591]
; SSE2-NEXT: pand %xmm0, %xmm1
; SSE2-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
; SSE2-NEXT: movq %rcx, %rax
; SSE2-NEXT: imulq %rdx
; SSE2-NEXT: subq %rcx, %rdx
; SSE2-NEXT: movq %rdx, %rax
; SSE2-NEXT: shrq $63, %rax
; SSE2-NEXT: sarq $3, %rdx
; SSE2-NEXT: addq %rax, %rdx
; SSE2-NEXT: leaq (%rdx,%rdx,8), %rax
; SSE2-NEXT: addq %rcx, %rax
; SSE2-NEXT: movq %rax, %xmm2
; SSE2-NEXT: pand %xmm0, %xmm2
; SSE2-NEXT: pcmpeqd {{.*}}(%rip), %xmm1
; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
; SSE2-NEXT: pand %xmm1, %xmm0
; SSE2-NEXT: pcmpeqd {{.*}}(%rip), %xmm2
; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
; SSE2-NEXT: pand %xmm2, %xmm1
; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,3]
; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
; SSE2-NEXT: pxor %xmm0, %xmm1
; SSE2-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp)
; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %dl
; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %cl
; SSE2-NEXT: retq
;
; SSE41-LABEL: test_srem_vec:
; SSE41: # %bb.0:
; SSE41-NEXT: movq %rdx, %rcx
; SSE41-NEXT: shlq $31, %rcx
; SSE41-NEXT: sarq $31, %rcx
; SSE41-NEXT: shlq $31, %rdi
; SSE41-NEXT: sarq $31, %rdi
; SSE41-NEXT: shlq $31, %rsi
; SSE41-NEXT: sarq $31, %rsi
; SSE41-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
; SSE41-NEXT: movq %rsi, %rax
; SSE41-NEXT: imulq %r8
; SSE41-NEXT: movq %rdx, %rax
; SSE41-NEXT: shrq $63, %rax
; SSE41-NEXT: addq %rdx, %rax
; SSE41-NEXT: leaq (%rax,%rax,8), %rax
; SSE41-NEXT: subq %rax, %rsi
; SSE41-NEXT: movq %rsi, %xmm1
; SSE41-NEXT: movq %rdi, %rax
; SSE41-NEXT: imulq %r8
; SSE41-NEXT: movq %rdx, %rax
; SSE41-NEXT: shrq $63, %rax
; SSE41-NEXT: addq %rdx, %rax
; SSE41-NEXT: leaq (%rax,%rax,8), %rax
; SSE41-NEXT: subq %rax, %rdi
; SSE41-NEXT: movq %rdi, %xmm0
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [8589934591,8589934591]
; SSE41-NEXT: pand %xmm1, %xmm0
; SSE41-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
; SSE41-NEXT: movq %rcx, %rax
; SSE41-NEXT: imulq %rdx
; SSE41-NEXT: subq %rcx, %rdx
; SSE41-NEXT: movq %rdx, %rax
; SSE41-NEXT: shrq $63, %rax
; SSE41-NEXT: sarq $3, %rdx
; SSE41-NEXT: addq %rax, %rdx
; SSE41-NEXT: leaq (%rdx,%rdx,8), %rax
; SSE41-NEXT: addq %rcx, %rax
; SSE41-NEXT: movq %rax, %xmm2
; SSE41-NEXT: pand %xmm1, %xmm2
; SSE41-NEXT: pcmpeqq {{.*}}(%rip), %xmm0
; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
; SSE41-NEXT: pxor %xmm1, %xmm0
; SSE41-NEXT: pcmpeqq {{.*}}(%rip), %xmm2
; SSE41-NEXT: pxor %xmm1, %xmm2
; SSE41-NEXT: pextrb $0, %xmm0, %eax
; SSE41-NEXT: pextrb $8, %xmm0, %edx
; SSE41-NEXT: pextrb $0, %xmm2, %ecx
; SSE41-NEXT: # kill: def $al killed $al killed $eax
; SSE41-NEXT: # kill: def $dl killed $dl killed $edx
; SSE41-NEXT: # kill: def $cl killed $cl killed $ecx
; SSE41-NEXT: retq
;
; AVX1-LABEL: test_srem_vec:
; AVX1: # %bb.0:
; AVX1-NEXT: movq %rdx, %rcx
; AVX1-NEXT: shlq $31, %rcx
; AVX1-NEXT: sarq $31, %rcx
; AVX1-NEXT: shlq $31, %rdi
; AVX1-NEXT: sarq $31, %rdi
; AVX1-NEXT: shlq $31, %rsi
; AVX1-NEXT: sarq $31, %rsi
; AVX1-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
; AVX1-NEXT: movq %rsi, %rax
; AVX1-NEXT: imulq %r8
; AVX1-NEXT: movq %rdx, %rax
; AVX1-NEXT: shrq $63, %rax
; AVX1-NEXT: addq %rdx, %rax
; AVX1-NEXT: leaq (%rax,%rax,8), %rax
; AVX1-NEXT: subq %rax, %rsi
; AVX1-NEXT: vmovq %rsi, %xmm0
; AVX1-NEXT: movq %rdi, %rax
; AVX1-NEXT: imulq %r8
; AVX1-NEXT: movq %rdx, %rax
; AVX1-NEXT: shrq $63, %rax
; AVX1-NEXT: addq %rdx, %rax
; AVX1-NEXT: leaq (%rax,%rax,8), %rax
; AVX1-NEXT: subq %rax, %rdi
; AVX1-NEXT: vmovq %rdi, %xmm1
; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
; AVX1-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
; AVX1-NEXT: movq %rcx, %rax
; AVX1-NEXT: imulq %rdx
; AVX1-NEXT: subq %rcx, %rdx
; AVX1-NEXT: movq %rdx, %rax
; AVX1-NEXT: shrq $63, %rax
; AVX1-NEXT: sarq $3, %rdx
; AVX1-NEXT: addq %rax, %rdx
; AVX1-NEXT: leaq (%rdx,%rdx,8), %rax
; AVX1-NEXT: addq %rcx, %rax
; AVX1-NEXT: vmovq %rax, %xmm1
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
; AVX1-NEXT: vpcmpeqq {{.*}}(%rip), %xmm1, %xmm1
; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
; AVX1-NEXT: vpcmpeqq {{.*}}(%rip), %xmm0, %xmm0
; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
; AVX1-NEXT: vpextrb $0, %xmm0, %eax
; AVX1-NEXT: vpextrb $8, %xmm0, %edx
; AVX1-NEXT: vpextrb $0, %xmm1, %ecx
; AVX1-NEXT: # kill: def $al killed $al killed $eax
; AVX1-NEXT: # kill: def $dl killed $dl killed $edx
; AVX1-NEXT: # kill: def $cl killed $cl killed $ecx
; AVX1-NEXT: vzeroupper
; AVX1-NEXT: retq
;
; AVX2-LABEL: test_srem_vec:
; AVX2: # %bb.0:
; AVX2-NEXT: movq %rdx, %rcx
; AVX2-NEXT: shlq $31, %rcx
; AVX2-NEXT: sarq $31, %rcx
; AVX2-NEXT: shlq $31, %rdi
; AVX2-NEXT: sarq $31, %rdi
; AVX2-NEXT: shlq $31, %rsi
; AVX2-NEXT: sarq $31, %rsi
; AVX2-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
; AVX2-NEXT: movq %rsi, %rax
; AVX2-NEXT: imulq %r8
; AVX2-NEXT: movq %rdx, %rax
; AVX2-NEXT: shrq $63, %rax
; AVX2-NEXT: addq %rdx, %rax
; AVX2-NEXT: leaq (%rax,%rax,8), %rax
; AVX2-NEXT: subq %rax, %rsi
; AVX2-NEXT: vmovq %rsi, %xmm0
; AVX2-NEXT: movq %rdi, %rax
; AVX2-NEXT: imulq %r8
; AVX2-NEXT: movq %rdx, %rax
; AVX2-NEXT: shrq $63, %rax
; AVX2-NEXT: addq %rdx, %rax
; AVX2-NEXT: leaq (%rax,%rax,8), %rax
; AVX2-NEXT: subq %rax, %rdi
; AVX2-NEXT: vmovq %rdi, %xmm1
; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
; AVX2-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
; AVX2-NEXT: movq %rcx, %rax
; AVX2-NEXT: imulq %rdx
; AVX2-NEXT: subq %rcx, %rdx
; AVX2-NEXT: movq %rdx, %rax
; AVX2-NEXT: shrq $63, %rax
; AVX2-NEXT: sarq $3, %rdx
; AVX2-NEXT: addq %rax, %rdx
; AVX2-NEXT: leaq (%rdx,%rdx,8), %rax
; AVX2-NEXT: addq %rcx, %rax
; AVX2-NEXT: vmovq %rax, %xmm1
; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [8589934591,8589934591,8589934591,8589934591]
; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vpcmpeqq {{.*}}(%rip), %ymm0, %ymm0
; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
; AVX2-NEXT: vpextrb $0, %xmm0, %eax
; AVX2-NEXT: vpextrb $8, %xmm0, %edx
; AVX2-NEXT: vpextrb $0, %xmm1, %ecx
; AVX2-NEXT: # kill: def $al killed $al killed $eax
; AVX2-NEXT: # kill: def $dl killed $dl killed $edx
; AVX2-NEXT: # kill: def $cl killed $cl killed $ecx
; AVX2-NEXT: vzeroupper
; AVX2-NEXT: retq
;
; AVX512VL-LABEL: test_srem_vec:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: movq %rdx, %rcx
; AVX512VL-NEXT: shlq $31, %rcx
; AVX512VL-NEXT: sarq $31, %rcx
; AVX512VL-NEXT: shlq $31, %rdi
; AVX512VL-NEXT: sarq $31, %rdi
; AVX512VL-NEXT: shlq $31, %rsi
; AVX512VL-NEXT: sarq $31, %rsi
; AVX512VL-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
; AVX512VL-NEXT: movq %rsi, %rax
; AVX512VL-NEXT: imulq %r8
; AVX512VL-NEXT: movq %rdx, %rax
; AVX512VL-NEXT: shrq $63, %rax
; AVX512VL-NEXT: addq %rdx, %rax
; AVX512VL-NEXT: leaq (%rax,%rax,8), %rax
; AVX512VL-NEXT: subq %rax, %rsi
; AVX512VL-NEXT: vmovq %rsi, %xmm0
; AVX512VL-NEXT: movq %rdi, %rax
; AVX512VL-NEXT: imulq %r8
; AVX512VL-NEXT: movq %rdx, %rax
; AVX512VL-NEXT: shrq $63, %rax
; AVX512VL-NEXT: addq %rdx, %rax
; AVX512VL-NEXT: leaq (%rax,%rax,8), %rax
; AVX512VL-NEXT: subq %rax, %rdi
; AVX512VL-NEXT: vmovq %rdi, %xmm1
; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
; AVX512VL-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
; AVX512VL-NEXT: movq %rcx, %rax
; AVX512VL-NEXT: imulq %rdx
; AVX512VL-NEXT: subq %rcx, %rdx
; AVX512VL-NEXT: movq %rdx, %rax
; AVX512VL-NEXT: shrq $63, %rax
; AVX512VL-NEXT: sarq $3, %rdx
; AVX512VL-NEXT: addq %rax, %rdx
; AVX512VL-NEXT: leaq (%rdx,%rdx,8), %rax
; AVX512VL-NEXT: addq %rcx, %rax
; AVX512VL-NEXT: vmovq %rax, %xmm1
; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
; AVX512VL-NEXT: vpandq {{.*}}(%rip){1to4}, %ymm0, %ymm0
; AVX512VL-NEXT: vpcmpneqq {{.*}}(%rip), %ymm0, %k0
; AVX512VL-NEXT: kshiftrw $1, %k0, %k1
; AVX512VL-NEXT: kmovw %k1, %edx
; AVX512VL-NEXT: kshiftrw $2, %k0, %k1
; AVX512VL-NEXT: kmovw %k1, %ecx
; AVX512VL-NEXT: kmovw %k0, %eax
; AVX512VL-NEXT: # kill: def $al killed $al killed $eax
; AVX512VL-NEXT: # kill: def $dl killed $dl killed $edx
; AVX512VL-NEXT: # kill: def $cl killed $cl killed $ecx
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
%srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
%cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>
ret <3 x i1> %cmp
}

View File

@ -0,0 +1,362 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=i686-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X86
; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X64
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 < %s | FileCheck %s --check-prefixes=X64,SSE2
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.1 < %s | FileCheck %s --check-prefixes=X64,SSE41
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefixes=X64,AVX1
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefixes=X64,AVX2
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=X64,AVX512VL
define i1 @test_urem_odd(i13 %X) nounwind {
; X86-LABEL: test_urem_odd:
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: andl $8191, %eax # imm = 0x1FFF
; X86-NEXT: imull $-13107, %eax, %eax # imm = 0xCCCD
; X86-NEXT: movzwl %ax, %eax
; X86-NEXT: cmpl $13108, %eax # imm = 0x3334
; X86-NEXT: setb %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_odd:
; X64: # %bb.0:
; X64-NEXT: andl $8191, %edi # imm = 0x1FFF
; X64-NEXT: imull $-13107, %edi, %eax # imm = 0xCCCD
; X64-NEXT: movzwl %ax, %eax
; X64-NEXT: cmpl $13108, %eax # imm = 0x3334
; X64-NEXT: setb %al
; X64-NEXT: retq
%urem = urem i13 %X, 5
%cmp = icmp eq i13 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_even(i27 %X) nounwind {
; X86-LABEL: test_urem_even:
; X86: # %bb.0:
; X86-NEXT: movl $134217727, %eax # imm = 0x7FFFFFF
; X86-NEXT: andl {{[0-9]+}}(%esp), %eax
; X86-NEXT: imull $-1227133513, %eax, %eax # imm = 0xB6DB6DB7
; X86-NEXT: rorl %eax
; X86-NEXT: cmpl $306783379, %eax # imm = 0x12492493
; X86-NEXT: setb %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_even:
; X64: # %bb.0:
; X64-NEXT: andl $134217727, %edi # imm = 0x7FFFFFF
; X64-NEXT: imull $-1227133513, %edi, %eax # imm = 0xB6DB6DB7
; X64-NEXT: rorl %eax
; X64-NEXT: cmpl $306783379, %eax # imm = 0x12492493
; X64-NEXT: setb %al
; X64-NEXT: retq
%urem = urem i27 %X, 14
%cmp = icmp eq i27 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_odd_setne(i4 %X) nounwind {
; X86-LABEL: test_urem_odd_setne:
; X86: # %bb.0:
; X86-NEXT: movb {{[0-9]+}}(%esp), %al
; X86-NEXT: andb $15, %al
; X86-NEXT: movzbl %al, %eax
; X86-NEXT: imull $-51, %eax, %eax
; X86-NEXT: cmpb $51, %al
; X86-NEXT: seta %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_odd_setne:
; X64: # %bb.0:
; X64-NEXT: andb $15, %dil
; X64-NEXT: movzbl %dil, %eax
; X64-NEXT: imull $-51, %eax, %eax
; X64-NEXT: cmpb $51, %al
; X64-NEXT: seta %al
; X64-NEXT: retq
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
ret i1 %cmp
}
define i1 @test_urem_negative_odd(i9 %X) nounwind {
; X86-LABEL: test_urem_negative_odd:
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: andl $511, %eax # imm = 0x1FF
; X86-NEXT: imull $-7885, %eax, %eax # imm = 0xE133
; X86-NEXT: movzwl %ax, %eax
; X86-NEXT: cmpl $129, %eax
; X86-NEXT: seta %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_negative_odd:
; X64: # %bb.0:
; X64-NEXT: andl $511, %edi # imm = 0x1FF
; X64-NEXT: imull $-7885, %edi, %eax # imm = 0xE133
; X64-NEXT: movzwl %ax, %eax
; X64-NEXT: cmpl $129, %eax
; X64-NEXT: seta %al
; X64-NEXT: retq
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
ret i1 %cmp
}
define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; X86-LABEL: test_urem_vec:
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edx
; X86-NEXT: andl $2047, %edx # imm = 0x7FF
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: andl $2047, %eax # imm = 0x7FF
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
; X86-NEXT: andl $2047, %ecx # imm = 0x7FF
; X86-NEXT: imull $-5325, %ecx, %ecx # imm = 0xEB33
; X86-NEXT: addl $10650, %ecx # imm = 0x299A
; X86-NEXT: cmpw $32, %cx
; X86-NEXT: seta %cl
; X86-NEXT: imull $-21845, %eax, %eax # imm = 0xAAAB
; X86-NEXT: rorw %ax
; X86-NEXT: movzwl %ax, %eax
; X86-NEXT: cmpl $10922, %eax # imm = 0x2AAA
; X86-NEXT: seta %al
; X86-NEXT: imull $28087, %edx, %edx # imm = 0x6DB7
; X86-NEXT: addl $-28087, %edx # imm = 0x9249
; X86-NEXT: movzwl %dx, %edx
; X86-NEXT: cmpl $9362, %edx # imm = 0x2492
; X86-NEXT: seta %dl
; X86-NEXT: retl
;
; SSE2-LABEL: test_urem_vec:
; SSE2: # %bb.0:
; SSE2-NEXT: movl %esi, %eax
; SSE2-NEXT: andl $2047, %eax # imm = 0x7FF
; SSE2-NEXT: imull $9363, %eax, %ecx # imm = 0x2493
; SSE2-NEXT: shrl $16, %ecx
; SSE2-NEXT: subl %ecx, %eax
; SSE2-NEXT: movzwl %ax, %eax
; SSE2-NEXT: shrl %eax
; SSE2-NEXT: addl %ecx, %eax
; SSE2-NEXT: shrl $2, %eax
; SSE2-NEXT: leal (,%rax,8), %ecx
; SSE2-NEXT: subl %ecx, %eax
; SSE2-NEXT: addl %esi, %eax
; SSE2-NEXT: andl $2047, %edi # imm = 0x7FF
; SSE2-NEXT: imull $43691, %edi, %ecx # imm = 0xAAAB
; SSE2-NEXT: shrl $17, %ecx
; SSE2-NEXT: andl $-2, %ecx
; SSE2-NEXT: leal (%rcx,%rcx,2), %ecx
; SSE2-NEXT: subl %ecx, %edi
; SSE2-NEXT: movd %edi, %xmm0
; SSE2-NEXT: pinsrw $2, %eax, %xmm0
; SSE2-NEXT: movl %edx, %eax
; SSE2-NEXT: andl $2047, %eax # imm = 0x7FF
; SSE2-NEXT: imull $161, %eax, %ecx
; SSE2-NEXT: shrl $16, %ecx
; SSE2-NEXT: subl %ecx, %eax
; SSE2-NEXT: movzwl %ax, %eax
; SSE2-NEXT: shrl %eax
; SSE2-NEXT: addl %ecx, %eax
; SSE2-NEXT: shrl $10, %eax
; SSE2-NEXT: imull $2043, %eax, %eax # imm = 0x7FB
; SSE2-NEXT: subl %eax, %edx
; SSE2-NEXT: pinsrw $4, %edx, %xmm0
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
; SSE2-NEXT: pcmpeqd {{.*}}(%rip), %xmm0
; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
; SSE2-NEXT: pxor %xmm0, %xmm1
; SSE2-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp)
; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %dl
; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %cl
; SSE2-NEXT: retq
;
; SSE41-LABEL: test_urem_vec:
; SSE41: # %bb.0:
; SSE41-NEXT: movl %esi, %eax
; SSE41-NEXT: andl $2047, %eax # imm = 0x7FF
; SSE41-NEXT: imull $9363, %eax, %ecx # imm = 0x2493
; SSE41-NEXT: shrl $16, %ecx
; SSE41-NEXT: subl %ecx, %eax
; SSE41-NEXT: movzwl %ax, %eax
; SSE41-NEXT: shrl %eax
; SSE41-NEXT: addl %ecx, %eax
; SSE41-NEXT: shrl $2, %eax
; SSE41-NEXT: leal (,%rax,8), %ecx
; SSE41-NEXT: subl %ecx, %eax
; SSE41-NEXT: addl %esi, %eax
; SSE41-NEXT: andl $2047, %edi # imm = 0x7FF
; SSE41-NEXT: imull $43691, %edi, %ecx # imm = 0xAAAB
; SSE41-NEXT: shrl $17, %ecx
; SSE41-NEXT: andl $-2, %ecx
; SSE41-NEXT: leal (%rcx,%rcx,2), %ecx
; SSE41-NEXT: subl %ecx, %edi
; SSE41-NEXT: movd %edi, %xmm0
; SSE41-NEXT: pinsrw $2, %eax, %xmm0
; SSE41-NEXT: movl %edx, %eax
; SSE41-NEXT: andl $2047, %eax # imm = 0x7FF
; SSE41-NEXT: imull $161, %eax, %ecx
; SSE41-NEXT: shrl $16, %ecx
; SSE41-NEXT: subl %ecx, %eax
; SSE41-NEXT: movzwl %ax, %eax
; SSE41-NEXT: shrl %eax
; SSE41-NEXT: addl %ecx, %eax
; SSE41-NEXT: shrl $10, %eax
; SSE41-NEXT: imull $2043, %eax, %eax # imm = 0x7FB
; SSE41-NEXT: subl %eax, %edx
; SSE41-NEXT: pinsrw $4, %edx, %xmm0
; SSE41-NEXT: pand {{.*}}(%rip), %xmm0
; SSE41-NEXT: pcmpeqd {{.*}}(%rip), %xmm0
; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
; SSE41-NEXT: pxor %xmm0, %xmm1
; SSE41-NEXT: movd %xmm1, %eax
; SSE41-NEXT: pextrb $4, %xmm1, %edx
; SSE41-NEXT: pextrb $8, %xmm1, %ecx
; SSE41-NEXT: # kill: def $al killed $al killed $eax
; SSE41-NEXT: # kill: def $dl killed $dl killed $edx
; SSE41-NEXT: # kill: def $cl killed $cl killed $ecx
; SSE41-NEXT: retq
;
; AVX1-LABEL: test_urem_vec:
; AVX1: # %bb.0:
; AVX1-NEXT: movl %esi, %eax
; AVX1-NEXT: andl $2047, %eax # imm = 0x7FF
; AVX1-NEXT: imull $9363, %eax, %ecx # imm = 0x2493
; AVX1-NEXT: shrl $16, %ecx
; AVX1-NEXT: subl %ecx, %eax
; AVX1-NEXT: movzwl %ax, %eax
; AVX1-NEXT: shrl %eax
; AVX1-NEXT: addl %ecx, %eax
; AVX1-NEXT: shrl $2, %eax
; AVX1-NEXT: leal (,%rax,8), %ecx
; AVX1-NEXT: subl %ecx, %eax
; AVX1-NEXT: addl %esi, %eax
; AVX1-NEXT: andl $2047, %edi # imm = 0x7FF
; AVX1-NEXT: imull $43691, %edi, %ecx # imm = 0xAAAB
; AVX1-NEXT: shrl $17, %ecx
; AVX1-NEXT: andl $-2, %ecx
; AVX1-NEXT: leal (%rcx,%rcx,2), %ecx
; AVX1-NEXT: subl %ecx, %edi
; AVX1-NEXT: vmovd %edi, %xmm0
; AVX1-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0
; AVX1-NEXT: movl %edx, %eax
; AVX1-NEXT: andl $2047, %eax # imm = 0x7FF
; AVX1-NEXT: imull $161, %eax, %ecx
; AVX1-NEXT: shrl $16, %ecx
; AVX1-NEXT: subl %ecx, %eax
; AVX1-NEXT: movzwl %ax, %eax
; AVX1-NEXT: shrl %eax
; AVX1-NEXT: addl %ecx, %eax
; AVX1-NEXT: shrl $10, %eax
; AVX1-NEXT: imull $2043, %eax, %eax # imm = 0x7FB
; AVX1-NEXT: subl %eax, %edx
; AVX1-NEXT: vpinsrw $4, %edx, %xmm0, %xmm0
; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
; AVX1-NEXT: vpcmpeqd {{.*}}(%rip), %xmm0, %xmm0
; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: vpextrb $4, %xmm0, %edx
; AVX1-NEXT: vpextrb $8, %xmm0, %ecx
; AVX1-NEXT: # kill: def $al killed $al killed $eax
; AVX1-NEXT: # kill: def $dl killed $dl killed $edx
; AVX1-NEXT: # kill: def $cl killed $cl killed $ecx
; AVX1-NEXT: retq
;
; AVX2-LABEL: test_urem_vec:
; AVX2: # %bb.0:
; AVX2-NEXT: andl $2047, %esi # imm = 0x7FF
; AVX2-NEXT: imull $9363, %esi, %eax # imm = 0x2493
; AVX2-NEXT: shrl $16, %eax
; AVX2-NEXT: movl %esi, %ecx
; AVX2-NEXT: subl %eax, %ecx
; AVX2-NEXT: movzwl %cx, %ecx
; AVX2-NEXT: shrl %ecx
; AVX2-NEXT: addl %eax, %ecx
; AVX2-NEXT: shrl $2, %ecx
; AVX2-NEXT: leal (,%rcx,8), %eax
; AVX2-NEXT: subl %eax, %ecx
; AVX2-NEXT: addl %esi, %ecx
; AVX2-NEXT: andl $2047, %edi # imm = 0x7FF
; AVX2-NEXT: imull $43691, %edi, %eax # imm = 0xAAAB
; AVX2-NEXT: shrl $17, %eax
; AVX2-NEXT: andl $-2, %eax
; AVX2-NEXT: leal (%rax,%rax,2), %eax
; AVX2-NEXT: subl %eax, %edi
; AVX2-NEXT: vmovd %edi, %xmm0
; AVX2-NEXT: vpinsrw $2, %ecx, %xmm0, %xmm0
; AVX2-NEXT: andl $2047, %edx # imm = 0x7FF
; AVX2-NEXT: imull $161, %edx, %eax
; AVX2-NEXT: shrl $16, %eax
; AVX2-NEXT: movl %edx, %ecx
; AVX2-NEXT: subl %eax, %ecx
; AVX2-NEXT: movzwl %cx, %ecx
; AVX2-NEXT: shrl %ecx
; AVX2-NEXT: addl %eax, %ecx
; AVX2-NEXT: shrl $10, %ecx
; AVX2-NEXT: imull $2043, %ecx, %eax # imm = 0x7FB
; AVX2-NEXT: subl %eax, %edx
; AVX2-NEXT: vpinsrw $4, %edx, %xmm0, %xmm0
; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2047,2047,2047,2047]
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpcmpeqd {{.*}}(%rip), %xmm0, %xmm0
; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: vpextrb $4, %xmm0, %edx
; AVX2-NEXT: vpextrb $8, %xmm0, %ecx
; AVX2-NEXT: # kill: def $al killed $al killed $eax
; AVX2-NEXT: # kill: def $dl killed $dl killed $edx
; AVX2-NEXT: # kill: def $cl killed $cl killed $ecx
; AVX2-NEXT: retq
;
; AVX512VL-LABEL: test_urem_vec:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: andl $2047, %esi # imm = 0x7FF
; AVX512VL-NEXT: imull $9363, %esi, %eax # imm = 0x2493
; AVX512VL-NEXT: shrl $16, %eax
; AVX512VL-NEXT: movl %esi, %ecx
; AVX512VL-NEXT: subl %eax, %ecx
; AVX512VL-NEXT: movzwl %cx, %ecx
; AVX512VL-NEXT: shrl %ecx
; AVX512VL-NEXT: addl %eax, %ecx
; AVX512VL-NEXT: shrl $2, %ecx
; AVX512VL-NEXT: leal (,%rcx,8), %eax
; AVX512VL-NEXT: subl %eax, %ecx
; AVX512VL-NEXT: addl %esi, %ecx
; AVX512VL-NEXT: andl $2047, %edi # imm = 0x7FF
; AVX512VL-NEXT: imull $43691, %edi, %eax # imm = 0xAAAB
; AVX512VL-NEXT: shrl $17, %eax
; AVX512VL-NEXT: andl $-2, %eax
; AVX512VL-NEXT: leal (%rax,%rax,2), %eax
; AVX512VL-NEXT: subl %eax, %edi
; AVX512VL-NEXT: vmovd %edi, %xmm0
; AVX512VL-NEXT: vpinsrw $2, %ecx, %xmm0, %xmm0
; AVX512VL-NEXT: andl $2047, %edx # imm = 0x7FF
; AVX512VL-NEXT: imull $161, %edx, %eax
; AVX512VL-NEXT: shrl $16, %eax
; AVX512VL-NEXT: movl %edx, %ecx
; AVX512VL-NEXT: subl %eax, %ecx
; AVX512VL-NEXT: movzwl %cx, %ecx
; AVX512VL-NEXT: shrl %ecx
; AVX512VL-NEXT: addl %eax, %ecx
; AVX512VL-NEXT: shrl $10, %ecx
; AVX512VL-NEXT: imull $2043, %ecx, %eax # imm = 0x7FB
; AVX512VL-NEXT: subl %eax, %edx
; AVX512VL-NEXT: vpinsrw $4, %edx, %xmm0, %xmm0
; AVX512VL-NEXT: vpandd {{.*}}(%rip){1to4}, %xmm0, %xmm0
; AVX512VL-NEXT: vpcmpneqd {{.*}}(%rip), %xmm0, %k0
; AVX512VL-NEXT: kshiftrw $1, %k0, %k1
; AVX512VL-NEXT: kmovw %k1, %edx
; AVX512VL-NEXT: kshiftrw $2, %k0, %k1
; AVX512VL-NEXT: kmovw %k1, %ecx
; AVX512VL-NEXT: kmovw %k0, %eax
; AVX512VL-NEXT: # kill: def $al killed $al killed $eax
; AVX512VL-NEXT: # kill: def $dl killed $dl killed $edx
; AVX512VL-NEXT: # kill: def $cl killed $cl killed $ecx
; AVX512VL-NEXT: retq
%urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
ret <3 x i1> %cmp
}