338 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			338 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | |
| ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -O3 \
 | |
| ; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
 | |
| ; RUN:   < %s | FileCheck %s
 | |
| ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -O3 \
 | |
| ; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr -mattr=-mma \
 | |
| ; RUN:   < %s | FileCheck %s --check-prefix=CHECK-NOMMA
 | |
| ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -O3 \
 | |
| ; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
 | |
| ; RUN:   < %s | FileCheck %s --check-prefix=CHECK-BE
 | |
| ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -O3 \
 | |
| ; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr -mattr=-mma \
 | |
| ; RUN:   < %s | FileCheck %s --check-prefix=CHECK-BE-NOMMA
 | |
| 
 | |
| ; This test also checks that the paired vector intrinsics are available even
 | |
| ; when MMA is disabled.
 | |
| 
 | |
| ; assemble_pair
 | |
| declare <256 x i1> @llvm.ppc.vsx.assemble.pair(<16 x i8>, <16 x i8>)
 | |
| define void @ass_pair(<256 x i1>* %ptr, <16 x i8> %vc) {
 | |
| ; CHECK-LABEL: ass_pair:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    vmr v3, v2
 | |
| ; CHECK-NEXT:    stxv v2, 16(r3)
 | |
| ; CHECK-NEXT:    stxv v3, 0(r3)
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: ass_pair:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    vmr v3, v2
 | |
| ; CHECK-NOMMA-NEXT:    stxv v2, 16(r3)
 | |
| ; CHECK-NOMMA-NEXT:    stxv v3, 0(r3)
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: ass_pair:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    vmr v3, v2
 | |
| ; CHECK-BE-NEXT:    stxv v2, 16(r3)
 | |
| ; CHECK-BE-NEXT:    stxv v2, 0(r3)
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: ass_pair:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    vmr v3, v2
 | |
| ; CHECK-BE-NOMMA-NEXT:    stxv v2, 16(r3)
 | |
| ; CHECK-BE-NOMMA-NEXT:    stxv v2, 0(r3)
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = tail call <256 x i1> @llvm.ppc.vsx.assemble.pair(<16 x i8> %vc, <16 x i8> %vc)
 | |
|   store <256 x i1> %0, <256 x i1>* %ptr, align 32
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| ; disassemble_pair
 | |
| declare { <16 x i8>, <16 x i8> } @llvm.ppc.vsx.disassemble.pair(<256 x i1>)
 | |
| define void @disass_pair(<256 x i1>* %ptr1, <16 x i8>* %ptr2, <16 x i8>* %ptr3) {
 | |
| ; CHECK-LABEL: disass_pair:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    lxv v3, 0(r3)
 | |
| ; CHECK-NEXT:    lxv v2, 16(r3)
 | |
| ; CHECK-NEXT:    stxv v3, 0(r4)
 | |
| ; CHECK-NEXT:    stxv v2, 0(r5)
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: disass_pair:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    lxv v3, 0(r3)
 | |
| ; CHECK-NOMMA-NEXT:    lxv v2, 16(r3)
 | |
| ; CHECK-NOMMA-NEXT:    stxv v3, 0(r4)
 | |
| ; CHECK-NOMMA-NEXT:    stxv v2, 0(r5)
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: disass_pair:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    lxv v3, 16(r3)
 | |
| ; CHECK-BE-NEXT:    lxv v2, 0(r3)
 | |
| ; CHECK-BE-NEXT:    stxv v2, 0(r4)
 | |
| ; CHECK-BE-NEXT:    stxv v3, 0(r5)
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: disass_pair:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    lxv v3, 16(r3)
 | |
| ; CHECK-BE-NOMMA-NEXT:    lxv v2, 0(r3)
 | |
| ; CHECK-BE-NOMMA-NEXT:    stxv v2, 0(r4)
 | |
| ; CHECK-BE-NOMMA-NEXT:    stxv v3, 0(r5)
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = load <256 x i1>, <256 x i1>* %ptr1, align 32
 | |
|   %1 = tail call { <16 x i8>, <16 x i8> } @llvm.ppc.vsx.disassemble.pair(<256 x i1> %0)
 | |
|   %2 = extractvalue { <16 x i8>, <16 x i8> } %1, 0
 | |
|   %3 = extractvalue { <16 x i8>, <16 x i8> } %1, 1
 | |
|   store <16 x i8> %2, <16 x i8>* %ptr2, align 16
 | |
|   store <16 x i8> %3, <16 x i8>* %ptr3, align 16
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @test_ldst_1(<256 x i1>* %vpp, <256 x i1>* %vp2) {
 | |
| ; CHECK-LABEL: test_ldst_1:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    lxvp vsp34, 0(r3)
 | |
| ; CHECK-NEXT:    stxvp vsp34, 0(r4)
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: test_ldst_1:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    lxvp vsp34, 0(r3)
 | |
| ; CHECK-NOMMA-NEXT:    stxvp vsp34, 0(r4)
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: test_ldst_1:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    lxvp vsp34, 0(r3)
 | |
| ; CHECK-BE-NEXT:    stxvp vsp34, 0(r4)
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: test_ldst_1:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    lxvp vsp34, 0(r3)
 | |
| ; CHECK-BE-NOMMA-NEXT:    stxvp vsp34, 0(r4)
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = bitcast <256 x i1>* %vpp to i8*
 | |
|   %1 = tail call <256 x i1> @llvm.ppc.vsx.lxvp(i8* %0)
 | |
|   %2 = bitcast <256 x i1>* %vp2 to i8*
 | |
|   tail call void @llvm.ppc.vsx.stxvp(<256 x i1> %1, i8* %2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| declare <256 x i1> @llvm.ppc.vsx.lxvp(i8*)
 | |
| declare void @llvm.ppc.vsx.stxvp(<256 x i1>, i8*)
 | |
| 
 | |
| define void @test_ldst_2(<256 x i1>* %vpp, i64 %offset, <256 x i1>* %vp2)  {
 | |
| ; CHECK-LABEL: test_ldst_2:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    lxvpx vsp34, r3, r4
 | |
| ; CHECK-NEXT:    stxvpx vsp34, r5, r4
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: test_ldst_2:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    lxvpx vsp34, r3, r4
 | |
| ; CHECK-NOMMA-NEXT:    stxvpx vsp34, r5, r4
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: test_ldst_2:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    lxvpx vsp34, r3, r4
 | |
| ; CHECK-BE-NEXT:    stxvpx vsp34, r5, r4
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: test_ldst_2:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    lxvpx vsp34, r3, r4
 | |
| ; CHECK-BE-NOMMA-NEXT:    stxvpx vsp34, r5, r4
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = bitcast <256 x i1>* %vpp to i8*
 | |
|   %1 = getelementptr i8, i8* %0, i64 %offset
 | |
|   %2 = tail call <256 x i1> @llvm.ppc.vsx.lxvp(i8* %1)
 | |
|   %3 = bitcast <256 x i1>* %vp2 to i8*
 | |
|   %4 = getelementptr i8, i8* %3, i64 %offset
 | |
|   tail call void @llvm.ppc.vsx.stxvp(<256 x i1> %2, i8* %4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @test_ldst_3(<256 x i1>* %vpp, <256 x i1>* %vp2)  {
 | |
| ; CHECK-LABEL: test_ldst_3:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    plxvp vsp34, 18(r3), 0
 | |
| ; CHECK-NEXT:    pstxvp vsp34, 18(r4), 0
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: test_ldst_3:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    plxvp vsp34, 18(r3), 0
 | |
| ; CHECK-NOMMA-NEXT:    pstxvp vsp34, 18(r4), 0
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: test_ldst_3:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    plxvp vsp34, 18(r3), 0
 | |
| ; CHECK-BE-NEXT:    pstxvp vsp34, 18(r4), 0
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: test_ldst_3:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    plxvp vsp34, 18(r3), 0
 | |
| ; CHECK-BE-NOMMA-NEXT:    pstxvp vsp34, 18(r4), 0
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = bitcast <256 x i1>* %vpp to i8*
 | |
|   %1 = getelementptr i8, i8* %0, i64 18
 | |
|   %2 = tail call <256 x i1> @llvm.ppc.vsx.lxvp(i8* %1)
 | |
|   %3 = bitcast <256 x i1>* %vp2 to i8*
 | |
|   %4 = getelementptr i8, i8* %3, i64 18
 | |
|   tail call void @llvm.ppc.vsx.stxvp(<256 x i1> %2, i8* %4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @test_ldst_4(<256 x i1>* %vpp, <256 x i1>* %vp2)  {
 | |
| ; CHECK-LABEL: test_ldst_4:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    plxvp vsp34, 1(r3), 0
 | |
| ; CHECK-NEXT:    pstxvp vsp34, 1(r4), 0
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: test_ldst_4:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    plxvp vsp34, 1(r3), 0
 | |
| ; CHECK-NOMMA-NEXT:    pstxvp vsp34, 1(r4), 0
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: test_ldst_4:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    plxvp vsp34, 1(r3), 0
 | |
| ; CHECK-BE-NEXT:    pstxvp vsp34, 1(r4), 0
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: test_ldst_4:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    plxvp vsp34, 1(r3), 0
 | |
| ; CHECK-BE-NOMMA-NEXT:    pstxvp vsp34, 1(r4), 0
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = bitcast <256 x i1>* %vpp to i8*
 | |
|   %1 = getelementptr i8, i8* %0, i64 1
 | |
|   %2 = tail call <256 x i1> @llvm.ppc.vsx.lxvp(i8* %1)
 | |
|   %3 = bitcast <256 x i1>* %vp2 to i8*
 | |
|   %4 = getelementptr i8, i8* %3, i64 1
 | |
|   tail call void @llvm.ppc.vsx.stxvp(<256 x i1> %2, i8* %4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @test_ldst_5(<256 x i1>* %vpp, <256 x i1>* %vp2)  {
 | |
| ; CHECK-LABEL: test_ldst_5:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    plxvp vsp34, 42(r3), 0
 | |
| ; CHECK-NEXT:    pstxvp vsp34, 42(r4), 0
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: test_ldst_5:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    plxvp vsp34, 42(r3), 0
 | |
| ; CHECK-NOMMA-NEXT:    pstxvp vsp34, 42(r4), 0
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: test_ldst_5:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    plxvp vsp34, 42(r3), 0
 | |
| ; CHECK-BE-NEXT:    pstxvp vsp34, 42(r4), 0
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: test_ldst_5:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    plxvp vsp34, 42(r3), 0
 | |
| ; CHECK-BE-NOMMA-NEXT:    pstxvp vsp34, 42(r4), 0
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = bitcast <256 x i1>* %vpp to i8*
 | |
|   %1 = getelementptr i8, i8* %0, i64 42
 | |
|   %2 = tail call <256 x i1> @llvm.ppc.vsx.lxvp(i8* %1)
 | |
|   %3 = bitcast <256 x i1>* %vp2 to i8*
 | |
|   %4 = getelementptr i8, i8* %3, i64 42
 | |
|   tail call void @llvm.ppc.vsx.stxvp(<256 x i1> %2, i8* %4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @test_ldst_6(<256 x i1>* %vpp, <256 x i1>* %vp2)  {
 | |
| ; CHECK-LABEL: test_ldst_6:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    lxvp vsp34, 4096(r3)
 | |
| ; CHECK-NEXT:    stxvp vsp34, 4096(r4)
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: test_ldst_6:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    lxvp vsp34, 4096(r3)
 | |
| ; CHECK-NOMMA-NEXT:    stxvp vsp34, 4096(r4)
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: test_ldst_6:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    lxvp vsp34, 4096(r3)
 | |
| ; CHECK-BE-NEXT:    stxvp vsp34, 4096(r4)
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: test_ldst_6:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    lxvp vsp34, 4096(r3)
 | |
| ; CHECK-BE-NOMMA-NEXT:    stxvp vsp34, 4096(r4)
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = getelementptr <256 x i1>, <256 x i1>* %vpp, i64 128
 | |
|   %1 = bitcast <256 x i1>* %0 to i8*
 | |
|   %2 = tail call <256 x i1> @llvm.ppc.vsx.lxvp(i8* %1)
 | |
|   %3 = getelementptr <256 x i1>, <256 x i1>* %vp2, i64 128
 | |
|   %4 = bitcast <256 x i1>* %3 to i8*
 | |
|   tail call void @llvm.ppc.vsx.stxvp(<256 x i1> %2, i8* %4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @test_ldst_7(<256 x i1>* %vpp, <256 x i1>* %vp2)  {
 | |
| ; FIXME: A prefixed load (plxvp) is expected here as the offset in this
 | |
| ; test case is a constant that fits within 34-bits.
 | |
| ; CHECK-LABEL: test_ldst_7:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    plxvp vsp34, 32799(r3), 0
 | |
| ; CHECK-NEXT:    pstxvp vsp34, 32799(r4), 0
 | |
| ; CHECK-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-NOMMA-LABEL: test_ldst_7:
 | |
| ; CHECK-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-NOMMA-NEXT:    plxvp vsp34, 32799(r3), 0
 | |
| ; CHECK-NOMMA-NEXT:    pstxvp vsp34, 32799(r4), 0
 | |
| ; CHECK-NOMMA-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-LABEL: test_ldst_7:
 | |
| ; CHECK-BE:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NEXT:    plxvp vsp34, 32799(r3), 0
 | |
| ; CHECK-BE-NEXT:    pstxvp vsp34, 32799(r4), 0
 | |
| ; CHECK-BE-NEXT:    blr
 | |
| ;
 | |
| ; CHECK-BE-NOMMA-LABEL: test_ldst_7:
 | |
| ; CHECK-BE-NOMMA:       # %bb.0: # %entry
 | |
| ; CHECK-BE-NOMMA-NEXT:    plxvp vsp34, 32799(r3), 0
 | |
| ; CHECK-BE-NOMMA-NEXT:    pstxvp vsp34, 32799(r4), 0
 | |
| ; CHECK-BE-NOMMA-NEXT:    blr
 | |
| entry:
 | |
|   %0 = bitcast <256 x i1>* %vpp to i8*
 | |
|   %1 = getelementptr i8, i8* %0, i64 32799
 | |
|   %2 = tail call <256 x i1> @llvm.ppc.vsx.lxvp(i8* %1)
 | |
|   %3 = bitcast <256 x i1>* %vp2 to i8*
 | |
|   %4 = getelementptr i8, i8* %3, i64 32799
 | |
|   tail call void @llvm.ppc.vsx.stxvp(<256 x i1> %2, i8* %4)
 | |
|   ret void
 | |
| }
 |