blob: 40d402d424e60575da443457ae4051c0cd9f6c73 [file] [log] [blame]
; 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: srwi 4, 4, 2
; PPC64LE-NEXT: rlwimi 4, 4, 2, 28, 29
; 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
}