| ; 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 |
| } |