mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
aab0c45488
When lowering a load or store for TypeWidenVector, the type legalizer would use a single load or store if the associated integer type was legal. E.g. it would load a v4i8 as an i32 if i32 was legal. This patch extends that behavior to promoted integers as well as legal ones. If the integer type for the full vector width is TypePromoteInteger, the element type is going to be TypePromoteInteger too, and it's still better to use a single promoting load or truncating store rather than N individual promoting loads or truncating stores. E.g. if you have a v2i8 on a target where i16 is promoted to i32, it's better to load the v2i8 as an i16 rather than load both i8s individually. Original patch by Richard Sandiford. llvm-svn: 236528
106 lines
2.8 KiB
LLVM
106 lines
2.8 KiB
LLVM
; Test vector zero-extending loads.
|
|
;
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
|
|
|
|
; Test a v16i1->v16i8 extension.
|
|
define <16 x i8> @f1(<16 x i1> *%ptr) {
|
|
; No expected output, but must compile.
|
|
%val = load <16 x i1>, <16 x i1> *%ptr
|
|
%ret = zext <16 x i1> %val to <16 x i8>
|
|
ret <16 x i8> %ret
|
|
}
|
|
|
|
; Test a v8i1->v8i16 extension.
|
|
define <8 x i16> @f2(<8 x i1> *%ptr) {
|
|
; No expected output, but must compile.
|
|
%val = load <8 x i1>, <8 x i1> *%ptr
|
|
%ret = zext <8 x i1> %val to <8 x i16>
|
|
ret <8 x i16> %ret
|
|
}
|
|
|
|
; Test a v8i8->v8i16 extension.
|
|
define <8 x i16> @f3(<8 x i8> *%ptr) {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: vlrepg [[REG1:%v[0-9]+]], 0(%r2)
|
|
; CHECK: vuplhb %v24, [[REG1]]
|
|
; CHECK: br %r14
|
|
%val = load <8 x i8>, <8 x i8> *%ptr
|
|
%ret = zext <8 x i8> %val to <8 x i16>
|
|
ret <8 x i16> %ret
|
|
}
|
|
|
|
; Test a v4i1->v4i32 extension.
|
|
define <4 x i32> @f4(<4 x i1> *%ptr) {
|
|
; No expected output, but must compile.
|
|
%val = load <4 x i1>, <4 x i1> *%ptr
|
|
%ret = zext <4 x i1> %val to <4 x i32>
|
|
ret <4 x i32> %ret
|
|
}
|
|
|
|
; Test a v4i8->v4i32 extension.
|
|
define <4 x i32> @f5(<4 x i8> *%ptr) {
|
|
; CHECK-LABEL: f5:
|
|
; CHECK: vlrepf [[REG1:%v[0-9]+]], 0(%r2)
|
|
; CHECK: vuplhb [[REG2:%v[0-9]+]], [[REG1]]
|
|
; CHECK: vuplhh %v24, [[REG2]]
|
|
; CHECK: br %r14
|
|
%val = load <4 x i8>, <4 x i8> *%ptr
|
|
%ret = zext <4 x i8> %val to <4 x i32>
|
|
ret <4 x i32> %ret
|
|
}
|
|
|
|
; Test a v4i16->v4i32 extension.
|
|
define <4 x i32> @f6(<4 x i16> *%ptr) {
|
|
; CHECK-LABEL: f6:
|
|
; CHECK: vlrepg [[REG1:%v[0-9]+]], 0(%r2)
|
|
; CHECK: vuplhh %v24, [[REG1]]
|
|
; CHECK: br %r14
|
|
%val = load <4 x i16>, <4 x i16> *%ptr
|
|
%ret = zext <4 x i16> %val to <4 x i32>
|
|
ret <4 x i32> %ret
|
|
}
|
|
|
|
; Test a v2i1->v2i64 extension.
|
|
define <2 x i64> @f7(<2 x i1> *%ptr) {
|
|
; No expected output, but must compile.
|
|
%val = load <2 x i1>, <2 x i1> *%ptr
|
|
%ret = zext <2 x i1> %val to <2 x i64>
|
|
ret <2 x i64> %ret
|
|
}
|
|
|
|
; Test a v2i8->v2i64 extension.
|
|
define <2 x i64> @f8(<2 x i8> *%ptr) {
|
|
; CHECK-LABEL: f8:
|
|
; CHECK: vlreph [[REG1:%v[0-9]+]], 0(%r2)
|
|
; CHECK: vuplhb [[REG2:%v[0-9]+]], [[REG1]]
|
|
; CHECK: vuplhh [[REG3:%v[0-9]+]], [[REG2]]
|
|
; CHECK: vuplhf %v24, [[REG3]]
|
|
; CHECK: br %r14
|
|
%val = load <2 x i8>, <2 x i8> *%ptr
|
|
%ret = zext <2 x i8> %val to <2 x i64>
|
|
ret <2 x i64> %ret
|
|
}
|
|
|
|
; Test a v2i16->v2i64 extension.
|
|
define <2 x i64> @f9(<2 x i16> *%ptr) {
|
|
; CHECK-LABEL: f9:
|
|
; CHECK: vlrepf [[REG1:%v[0-9]+]], 0(%r2)
|
|
; CHECK: vuplhh [[REG2:%v[0-9]+]], [[REG1]]
|
|
; CHECK: vuplhf %v24, [[REG2]]
|
|
; CHECK: br %r14
|
|
%val = load <2 x i16>, <2 x i16> *%ptr
|
|
%ret = zext <2 x i16> %val to <2 x i64>
|
|
ret <2 x i64> %ret
|
|
}
|
|
|
|
; Test a v2i32->v2i64 extension.
|
|
define <2 x i64> @f10(<2 x i32> *%ptr) {
|
|
; CHECK-LABEL: f10:
|
|
; CHECK: vlrepg [[REG1:%v[0-9]+]], 0(%r2)
|
|
; CHECK: vuplhf %v24, [[REG1]]
|
|
; CHECK: br %r14
|
|
%val = load <2 x i32>, <2 x i32> *%ptr
|
|
%ret = zext <2 x i32> %val to <2 x i64>
|
|
ret <2 x i64> %ret
|
|
}
|