The SelectionDAG scheduling preference now becomes source order
scheduling (machine scheduler generates better code -- even without
there being a machine model defined for LoongArch yet).
Most of the test changes are trivial instruction reorderings and
differing register allocations, without any obvious performance impact.
This is similar to commit: 3d0fbafd0b
135 lines
4.2 KiB
LLVM
135 lines
4.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
|
|
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
|
|
|
|
define void @sdiv_v32i8(ptr %res, ptr %a0, ptr %a1) nounwind {
|
|
; CHECK-LABEL: sdiv_v32i8:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xvld $xr0, $a1, 0
|
|
; CHECK-NEXT: xvld $xr1, $a2, 0
|
|
; CHECK-NEXT: xvdiv.b $xr0, $xr0, $xr1
|
|
; CHECK-NEXT: xvst $xr0, $a0, 0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%v0 = load <32 x i8>, ptr %a0
|
|
%v1 = load <32 x i8>, ptr %a1
|
|
%v2 = sdiv <32 x i8> %v0, %v1
|
|
store <32 x i8> %v2, ptr %res
|
|
ret void
|
|
}
|
|
|
|
define void @sdiv_v16i16(ptr %res, ptr %a0, ptr %a1) nounwind {
|
|
; CHECK-LABEL: sdiv_v16i16:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xvld $xr0, $a1, 0
|
|
; CHECK-NEXT: xvld $xr1, $a2, 0
|
|
; CHECK-NEXT: xvdiv.h $xr0, $xr0, $xr1
|
|
; CHECK-NEXT: xvst $xr0, $a0, 0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%v0 = load <16 x i16>, ptr %a0
|
|
%v1 = load <16 x i16>, ptr %a1
|
|
%v2 = sdiv <16 x i16> %v0, %v1
|
|
store <16 x i16> %v2, ptr %res
|
|
ret void
|
|
}
|
|
|
|
define void @sdiv_v8i32(ptr %res, ptr %a0, ptr %a1) nounwind {
|
|
; CHECK-LABEL: sdiv_v8i32:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xvld $xr0, $a1, 0
|
|
; CHECK-NEXT: xvld $xr1, $a2, 0
|
|
; CHECK-NEXT: xvdiv.w $xr0, $xr0, $xr1
|
|
; CHECK-NEXT: xvst $xr0, $a0, 0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%v0 = load <8 x i32>, ptr %a0
|
|
%v1 = load <8 x i32>, ptr %a1
|
|
%v2 = sdiv <8 x i32> %v0, %v1
|
|
store <8 x i32> %v2, ptr %res
|
|
ret void
|
|
}
|
|
|
|
define void @sdiv_v4i64(ptr %res, ptr %a0, ptr %a1) nounwind {
|
|
; CHECK-LABEL: sdiv_v4i64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xvld $xr0, $a1, 0
|
|
; CHECK-NEXT: xvld $xr1, $a2, 0
|
|
; CHECK-NEXT: xvdiv.d $xr0, $xr0, $xr1
|
|
; CHECK-NEXT: xvst $xr0, $a0, 0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%v0 = load <4 x i64>, ptr %a0
|
|
%v1 = load <4 x i64>, ptr %a1
|
|
%v2 = sdiv <4 x i64> %v0, %v1
|
|
store <4 x i64> %v2, ptr %res
|
|
ret void
|
|
}
|
|
|
|
define void @sdiv_v32i8_8(ptr %res, ptr %a0) nounwind {
|
|
; CHECK-LABEL: sdiv_v32i8_8:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xvld $xr0, $a1, 0
|
|
; CHECK-NEXT: xvsrai.b $xr1, $xr0, 7
|
|
; CHECK-NEXT: xvsrli.b $xr1, $xr1, 5
|
|
; CHECK-NEXT: xvadd.b $xr0, $xr0, $xr1
|
|
; CHECK-NEXT: xvsrai.b $xr0, $xr0, 3
|
|
; CHECK-NEXT: xvst $xr0, $a0, 0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%v0 = load <32 x i8>, ptr %a0
|
|
%v1 = sdiv <32 x i8> %v0, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>
|
|
store <32 x i8> %v1, ptr %res
|
|
ret void
|
|
}
|
|
|
|
define void @sdiv_v16i16_8(ptr %res, ptr %a0) nounwind {
|
|
; CHECK-LABEL: sdiv_v16i16_8:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xvld $xr0, $a1, 0
|
|
; CHECK-NEXT: xvsrai.h $xr1, $xr0, 15
|
|
; CHECK-NEXT: xvsrli.h $xr1, $xr1, 13
|
|
; CHECK-NEXT: xvadd.h $xr0, $xr0, $xr1
|
|
; CHECK-NEXT: xvsrai.h $xr0, $xr0, 3
|
|
; CHECK-NEXT: xvst $xr0, $a0, 0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%v0 = load <16 x i16>, ptr %a0
|
|
%v1 = sdiv <16 x i16> %v0, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
|
|
store <16 x i16> %v1, ptr %res
|
|
ret void
|
|
}
|
|
|
|
define void @sdiv_v8i32_8(ptr %res, ptr %a0) nounwind {
|
|
; CHECK-LABEL: sdiv_v8i32_8:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xvld $xr0, $a1, 0
|
|
; CHECK-NEXT: xvsrai.w $xr1, $xr0, 31
|
|
; CHECK-NEXT: xvsrli.w $xr1, $xr1, 29
|
|
; CHECK-NEXT: xvadd.w $xr0, $xr0, $xr1
|
|
; CHECK-NEXT: xvsrai.w $xr0, $xr0, 3
|
|
; CHECK-NEXT: xvst $xr0, $a0, 0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%v0 = load <8 x i32>, ptr %a0
|
|
%v1 = sdiv <8 x i32> %v0, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
|
|
store <8 x i32> %v1, ptr %res
|
|
ret void
|
|
}
|
|
|
|
define void @sdiv_v4i64_8(ptr %res, ptr %a0) nounwind {
|
|
; CHECK-LABEL: sdiv_v4i64_8:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xvld $xr0, $a1, 0
|
|
; CHECK-NEXT: xvsrai.d $xr1, $xr0, 63
|
|
; CHECK-NEXT: xvsrli.d $xr1, $xr1, 61
|
|
; CHECK-NEXT: xvadd.d $xr0, $xr0, $xr1
|
|
; CHECK-NEXT: xvsrai.d $xr0, $xr0, 3
|
|
; CHECK-NEXT: xvst $xr0, $a0, 0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%v0 = load <4 x i64>, ptr %a0
|
|
%v1 = sdiv <4 x i64> %v0, <i64 8, i64 8, i64 8, i64 8>
|
|
store <4 x i64> %v1, ptr %res
|
|
ret void
|
|
}
|