315 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: llc < %s -mtriple=ve -mattr=+vpu | FileCheck %s
 | 
						|
 | 
						|
;;; Test vector floating subtract intrinsic instructions
 | 
						|
;;;
 | 
						|
;;; Note:
 | 
						|
;;;   We test VFSUB*vvl, VFSUB*vvl_v, VFSUB*rvl, VFSUB*rvl_v, VFSUB*vvml_v,
 | 
						|
;;;   VFSUB*rvml_v, PVFSUB*vvl, PVFSUB*vvl_v, PVFSUB*rvl, PVFSUB*rvl_v,
 | 
						|
;;;   PVFSUB*vvml_v, and PVFSUB*rvml_v instructions.
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubd_vvvl(<256 x double> %0, <256 x double> %1) {
 | 
						|
; CHECK-LABEL: vfsubd_vvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 256
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    vfsub.d %v0, %v0, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %3 = tail call fast <256 x double> @llvm.ve.vl.vfsubd.vvvl(<256 x double> %0, <256 x double> %1, i32 256)
 | 
						|
  ret <256 x double> %3
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubd.vvvl(<256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubd_vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2) {
 | 
						|
; CHECK-LABEL: vfsubd_vvvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 128
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    vfsub.d %v2, %v0, %v1
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v2
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %4 = tail call fast <256 x double> @llvm.ve.vl.vfsubd.vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2, i32 128)
 | 
						|
  ret <256 x double> %4
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubd.vvvvl(<256 x double>, <256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubd_vsvl(double %0, <256 x double> %1) {
 | 
						|
; CHECK-LABEL: vfsubd_vsvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 256
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    vfsub.d %v0, %s0, %v0
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %3 = tail call fast <256 x double> @llvm.ve.vl.vfsubd.vsvl(double %0, <256 x double> %1, i32 256)
 | 
						|
  ret <256 x double> %3
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubd.vsvl(double, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubd_vsvvl(double %0, <256 x double> %1, <256 x double> %2) {
 | 
						|
; CHECK-LABEL: vfsubd_vsvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 128
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    vfsub.d %v1, %s0, %v0
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %4 = tail call fast <256 x double> @llvm.ve.vl.vfsubd.vsvvl(double %0, <256 x double> %1, <256 x double> %2, i32 128)
 | 
						|
  ret <256 x double> %4
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubd.vsvvl(double, <256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubd_vvvmvl(<256 x double> %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3) {
 | 
						|
; CHECK-LABEL: vfsubd_vvvmvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 128
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    vfsub.d %v2, %v0, %v1, %vm1
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v2
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %5 = tail call fast <256 x double> @llvm.ve.vl.vfsubd.vvvmvl(<256 x double> %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3, i32 128)
 | 
						|
  ret <256 x double> %5
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubd.vvvmvl(<256 x double>, <256 x double>, <256 x i1>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubd_vsvmvl(double %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3) {
 | 
						|
; CHECK-LABEL: vfsubd_vsvmvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 128
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    vfsub.d %v1, %s0, %v0, %vm1
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %5 = tail call fast <256 x double> @llvm.ve.vl.vfsubd.vsvmvl(double %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3, i32 128)
 | 
						|
  ret <256 x double> %5
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubd.vsvmvl(double, <256 x double>, <256 x i1>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubs_vvvl(<256 x double> %0, <256 x double> %1) {
 | 
						|
; CHECK-LABEL: vfsubs_vvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 256
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    vfsub.s %v0, %v0, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %3 = tail call fast <256 x double> @llvm.ve.vl.vfsubs.vvvl(<256 x double> %0, <256 x double> %1, i32 256)
 | 
						|
  ret <256 x double> %3
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubs.vvvl(<256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubs_vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2) {
 | 
						|
; CHECK-LABEL: vfsubs_vvvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 128
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    vfsub.s %v2, %v0, %v1
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v2
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %4 = tail call fast <256 x double> @llvm.ve.vl.vfsubs.vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2, i32 128)
 | 
						|
  ret <256 x double> %4
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubs.vvvvl(<256 x double>, <256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubs_vsvl(float %0, <256 x double> %1) {
 | 
						|
; CHECK-LABEL: vfsubs_vsvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 256
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    vfsub.s %v0, %s0, %v0
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %3 = tail call fast <256 x double> @llvm.ve.vl.vfsubs.vsvl(float %0, <256 x double> %1, i32 256)
 | 
						|
  ret <256 x double> %3
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubs.vsvl(float, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubs_vsvvl(float %0, <256 x double> %1, <256 x double> %2) {
 | 
						|
; CHECK-LABEL: vfsubs_vsvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 128
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    vfsub.s %v1, %s0, %v0
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %4 = tail call fast <256 x double> @llvm.ve.vl.vfsubs.vsvvl(float %0, <256 x double> %1, <256 x double> %2, i32 128)
 | 
						|
  ret <256 x double> %4
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubs.vsvvl(float, <256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubs_vvvmvl(<256 x double> %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3) {
 | 
						|
; CHECK-LABEL: vfsubs_vvvmvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 128
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    vfsub.s %v2, %v0, %v1, %vm1
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v2
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %5 = tail call fast <256 x double> @llvm.ve.vl.vfsubs.vvvmvl(<256 x double> %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3, i32 128)
 | 
						|
  ret <256 x double> %5
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubs.vvvmvl(<256 x double>, <256 x double>, <256 x i1>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @vfsubs_vsvmvl(float %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3) {
 | 
						|
; CHECK-LABEL: vfsubs_vsvmvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 128
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    vfsub.s %v1, %s0, %v0, %vm1
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %5 = tail call fast <256 x double> @llvm.ve.vl.vfsubs.vsvmvl(float %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3, i32 128)
 | 
						|
  ret <256 x double> %5
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.vfsubs.vsvmvl(float, <256 x double>, <256 x i1>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @pvfsub_vvvl(<256 x double> %0, <256 x double> %1) {
 | 
						|
; CHECK-LABEL: pvfsub_vvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 256
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    pvfsub %v0, %v0, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %3 = tail call fast <256 x double> @llvm.ve.vl.pvfsub.vvvl(<256 x double> %0, <256 x double> %1, i32 256)
 | 
						|
  ret <256 x double> %3
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.pvfsub.vvvl(<256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @pvfsub_vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2) {
 | 
						|
; CHECK-LABEL: pvfsub_vvvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 128
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    pvfsub %v2, %v0, %v1
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v2
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %4 = tail call fast <256 x double> @llvm.ve.vl.pvfsub.vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2, i32 128)
 | 
						|
  ret <256 x double> %4
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.pvfsub.vvvvl(<256 x double>, <256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @pvfsub_vsvl(i64 %0, <256 x double> %1) {
 | 
						|
; CHECK-LABEL: pvfsub_vsvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 256
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    pvfsub %v0, %s0, %v0
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %3 = tail call fast <256 x double> @llvm.ve.vl.pvfsub.vsvl(i64 %0, <256 x double> %1, i32 256)
 | 
						|
  ret <256 x double> %3
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.pvfsub.vsvl(i64, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @pvfsub_vsvvl(i64 %0, <256 x double> %1, <256 x double> %2) {
 | 
						|
; CHECK-LABEL: pvfsub_vsvvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 128
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    pvfsub %v1, %s0, %v0
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %4 = tail call fast <256 x double> @llvm.ve.vl.pvfsub.vsvvl(i64 %0, <256 x double> %1, <256 x double> %2, i32 128)
 | 
						|
  ret <256 x double> %4
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.pvfsub.vsvvl(i64, <256 x double>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @pvfsub_vvvMvl(<256 x double> %0, <256 x double> %1, <512 x i1> %2, <256 x double> %3) {
 | 
						|
; CHECK-LABEL: pvfsub_vvvMvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s0, 128
 | 
						|
; CHECK-NEXT:    lvl %s0
 | 
						|
; CHECK-NEXT:    pvfsub %v2, %v0, %v1, %vm2
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v2
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %5 = tail call fast <256 x double> @llvm.ve.vl.pvfsub.vvvMvl(<256 x double> %0, <256 x double> %1, <512 x i1> %2, <256 x double> %3, i32 128)
 | 
						|
  ret <256 x double> %5
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.pvfsub.vvvMvl(<256 x double>, <256 x double>, <512 x i1>, <256 x double>, i32)
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
define fastcc <256 x double> @pvfsub_vsvMvl(i64 %0, <256 x double> %1, <512 x i1> %2, <256 x double> %3) {
 | 
						|
; CHECK-LABEL: pvfsub_vsvMvl:
 | 
						|
; CHECK:       # %bb.0:
 | 
						|
; CHECK-NEXT:    lea %s1, 128
 | 
						|
; CHECK-NEXT:    lvl %s1
 | 
						|
; CHECK-NEXT:    pvfsub %v1, %s0, %v0, %vm2
 | 
						|
; CHECK-NEXT:    lea %s16, 256
 | 
						|
; CHECK-NEXT:    lvl %s16
 | 
						|
; CHECK-NEXT:    vor %v0, (0)1, %v1
 | 
						|
; CHECK-NEXT:    b.l.t (, %s10)
 | 
						|
  %5 = tail call fast <256 x double> @llvm.ve.vl.pvfsub.vsvMvl(i64 %0, <256 x double> %1, <512 x i1> %2, <256 x double> %3, i32 128)
 | 
						|
  ret <256 x double> %5
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind readnone
 | 
						|
declare <256 x double> @llvm.ve.vl.pvfsub.vsvMvl(i64, <256 x double>, <512 x i1>, <256 x double>, i32)
 |