llvm-project/llvm/test/CodeGen/PowerPC/GlobalISel/ppc-isel-logical-vec.ll
Amy Kwan 3508f12335 [PowerPC][GISel] Add initial GlobalISel support for vector functions.
This patch adds the initial support for vector functions and register banks
within GlobalISel. With this patch, we are able to support simple functions that
return vectors, and also functions that perform simple operations.

This patch also:
- Legalizes vector types for G_AND, G_OR, G_XOR, G_ADD, G_SUB, G_BITCAST, G_FADD, G_FSUB
- Introduce initial support for bitcasting (that will need to be extended upon)
- Add various different test cases to for test vector support within GlobalISel

Differential Revision: https://reviews.llvm.org/D137785
2023-03-27 08:23:05 -05:00

175 lines
4.4 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -ppc-vsr-nums-as-vr \
; RUN: -ppc-asm-full-reg-names -global-isel -o - < %s | FileCheck %s
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -ppc-vsr-nums-as-vr \
; RUN: -ppc-asm-full-reg-names -mattr=-vsx -global-isel -o - < %s | \
; RUN: FileCheck %s --check-prefix=NO-VSX
define <16 x i8> @test_and_v16i8(<16 x i8> %a, <16 x i8> %b) {
; CHECK-LABEL: test_and_v16i8:
; CHECK: # %bb.0:
; CHECK-NEXT: xxland v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_and_v16i8:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vand v2, v2, v3
; NO-VSX-NEXT: blr
%res = and <16 x i8> %a, %b
ret <16 x i8> %res
}
define <16 x i8> @test_or_v16i8(<16 x i8> %a, <16 x i8> %b) {
; CHECK-LABEL: test_or_v16i8:
; CHECK: # %bb.0:
; CHECK-NEXT: xxlor v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_or_v16i8:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vor v2, v2, v3
; NO-VSX-NEXT: blr
%res = or <16 x i8> %a, %b
ret <16 x i8> %res
}
define <16 x i8> @test_xor_v16i8(<16 x i8> %a, <16 x i8> %b) {
; CHECK-LABEL: test_xor_v16i8:
; CHECK: # %bb.0:
; CHECK-NEXT: xxlxor v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_xor_v16i8:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vxor v2, v2, v3
; NO-VSX-NEXT: blr
%res = xor <16 x i8> %a, %b
ret <16 x i8> %res
}
define <8 x i16> @test_and_v8i16(<8 x i16> %a, <8 x i16> %b) {
; CHECK-LABEL: test_and_v8i16:
; CHECK: # %bb.0:
; CHECK-NEXT: xxland v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_and_v8i16:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vand v2, v2, v3
; NO-VSX-NEXT: blr
%res = and <8 x i16> %a, %b
ret <8 x i16> %res
}
define <8 x i16> @test_or_v8i16(<8 x i16> %a, <8 x i16> %b) {
; CHECK-LABEL: test_or_v8i16:
; CHECK: # %bb.0:
; CHECK-NEXT: xxlor v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_or_v8i16:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vor v2, v2, v3
; NO-VSX-NEXT: blr
%res = or <8 x i16> %a, %b
ret <8 x i16> %res
}
define <8 x i16> @test_xor_v8i16(<8 x i16> %a, <8 x i16> %b) {
; CHECK-LABEL: test_xor_v8i16:
; CHECK: # %bb.0:
; CHECK-NEXT: xxlxor v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_xor_v8i16:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vxor v2, v2, v3
; NO-VSX-NEXT: blr
%res = xor <8 x i16> %a, %b
ret <8 x i16> %res
}
define <4 x i32> @test_and_v4i32(<4 x i32> %a, <4 x i32> %b) {
; CHECK-LABEL: test_and_v4i32:
; CHECK: # %bb.0:
; CHECK-NEXT: xxland v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_and_v4i32:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vand v2, v2, v3
; NO-VSX-NEXT: blr
%res = and <4 x i32> %a, %b
ret <4 x i32> %res
}
define <4 x i32> @test_or_v4i32(<4 x i32> %a, <4 x i32> %b) {
; CHECK-LABEL: test_or_v4i32:
; CHECK: # %bb.0:
; CHECK-NEXT: xxlor v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_or_v4i32:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vor v2, v2, v3
; NO-VSX-NEXT: blr
%res = or <4 x i32> %a, %b
ret <4 x i32> %res
}
define <4 x i32> @test_xor_v4i32(<4 x i32> %a, <4 x i32> %b) {
; CHECK-LABEL: test_xor_v4i32:
; CHECK: # %bb.0:
; CHECK-NEXT: xxlxor v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_xor_v4i32:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vxor v2, v2, v3
; NO-VSX-NEXT: blr
%res = xor <4 x i32> %a, %b
ret <4 x i32> %res
}
define <2 x i64> @test_and_v2i64(<2 x i64> %a, <2 x i64> %b) {
; CHECK-LABEL: test_and_v2i64:
; CHECK: # %bb.0:
; CHECK-NEXT: xxland v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_and_v2i64:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vand v2, v2, v3
; NO-VSX-NEXT: blr
%res = and <2 x i64> %a, %b
ret <2 x i64> %res
}
define <2 x i64> @test_or_v2i64(<2 x i64> %a, <2 x i64> %b) {
; CHECK-LABEL: test_or_v2i64:
; CHECK: # %bb.0:
; CHECK-NEXT: xxlor v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_or_v2i64:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vor v2, v2, v3
; NO-VSX-NEXT: blr
%res = or <2 x i64> %a, %b
ret <2 x i64> %res
}
define <2 x i64> @test_xor_v2i64(<2 x i64> %a, <2 x i64> %b) {
; CHECK-LABEL: test_xor_v2i64:
; CHECK: # %bb.0:
; CHECK-NEXT: xxlxor v2, v2, v3
; CHECK-NEXT: blr
;
; NO-VSX-LABEL: test_xor_v2i64:
; NO-VSX: # %bb.0:
; NO-VSX-NEXT: vxor v2, v2, v3
; NO-VSX-NEXT: blr
%res = xor <2 x i64> %a, %b
ret <2 x i64> %res
}