1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
; Test v8i16 absolute.
;
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
; Test with slt.
define <8 x i16> @f1(<8 x i16> %val) {
; CHECK-LABEL: f1:
; CHECK: vlph %v24, %v24
; CHECK: br %r14
%cmp = icmp slt <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%ret = select <8 x i1> %cmp, <8 x i16> %neg, <8 x i16> %val
ret <8 x i16> %ret
}
; Test with sle.
define <8 x i16> @f2(<8 x i16> %val) {
; CHECK-LABEL: f2:
; CHECK: vlph %v24, %v24
; CHECK: br %r14
%cmp = icmp sle <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%ret = select <8 x i1> %cmp, <8 x i16> %neg, <8 x i16> %val
ret <8 x i16> %ret
}
; Test with sgt.
define <8 x i16> @f3(<8 x i16> %val) {
; CHECK-LABEL: f3:
; CHECK: vlph %v24, %v24
; CHECK: br %r14
%cmp = icmp sgt <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%ret = select <8 x i1> %cmp, <8 x i16> %val, <8 x i16> %neg
ret <8 x i16> %ret
}
; Test with sge.
define <8 x i16> @f4(<8 x i16> %val) {
; CHECK-LABEL: f4:
; CHECK: vlph %v24, %v24
; CHECK: br %r14
%cmp = icmp sge <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%ret = select <8 x i1> %cmp, <8 x i16> %val, <8 x i16> %neg
ret <8 x i16> %ret
}
; Test that negative absolute uses VLPH too. There is no vector equivalent
; of LOAD NEGATIVE.
define <8 x i16> @f5(<8 x i16> %val) {
; CHECK-LABEL: f5:
; CHECK: vlph [[REG:%v[0-9]+]], %v24
; CHECK: vlch %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp slt <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%abs = select <8 x i1> %cmp, <8 x i16> %neg, <8 x i16> %val
%ret = sub <8 x i16> zeroinitializer, %abs
ret <8 x i16> %ret
}
; Try another form of negative absolute (slt version).
define <8 x i16> @f6(<8 x i16> %val) {
; CHECK-LABEL: f6:
; CHECK: vlph [[REG:%v[0-9]+]], %v24
; CHECK: vlch %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp slt <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%ret = select <8 x i1> %cmp, <8 x i16> %val, <8 x i16> %neg
ret <8 x i16> %ret
}
; Test with sle.
define <8 x i16> @f7(<8 x i16> %val) {
; CHECK-LABEL: f7:
; CHECK: vlph [[REG:%v[0-9]+]], %v24
; CHECK: vlch %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp sle <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%ret = select <8 x i1> %cmp, <8 x i16> %val, <8 x i16> %neg
ret <8 x i16> %ret
}
; Test with sgt.
define <8 x i16> @f8(<8 x i16> %val) {
; CHECK-LABEL: f8:
; CHECK: vlph [[REG:%v[0-9]+]], %v24
; CHECK: vlch %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp sgt <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%ret = select <8 x i1> %cmp, <8 x i16> %neg, <8 x i16> %val
ret <8 x i16> %ret
}
; Test with sge.
define <8 x i16> @f9(<8 x i16> %val) {
; CHECK-LABEL: f9:
; CHECK: vlph [[REG:%v[0-9]+]], %v24
; CHECK: vlch %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp sge <8 x i16> %val, zeroinitializer
%neg = sub <8 x i16> zeroinitializer, %val
%ret = select <8 x i1> %cmp, <8 x i16> %neg, <8 x i16> %val
ret <8 x i16> %ret
}
; Test with an SRA-based boolean vector.
define <8 x i16> @f10(<8 x i16> %val) {
; CHECK-LABEL: f10:
; CHECK: vlph %v24, %v24
; CHECK: br %r14
%shr = ashr <8 x i16> %val,
<i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
%neg = sub <8 x i16> zeroinitializer, %val
%and1 = and <8 x i16> %shr, %neg
%not = xor <8 x i16> %shr,
<i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%and2 = and <8 x i16> %not, %val
%ret = or <8 x i16> %and1, %and2
ret <8 x i16> %ret
}
; ...and again in reverse
define <8 x i16> @f11(<8 x i16> %val) {
; CHECK-LABEL: f11:
; CHECK: vlph [[REG:%v[0-9]+]], %v24
; CHECK: vlch %v24, [[REG]]
; CHECK: br %r14
%shr = ashr <8 x i16> %val,
<i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
%and1 = and <8 x i16> %shr, %val
%not = xor <8 x i16> %shr,
<i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%neg = sub <8 x i16> zeroinitializer, %val
%and2 = and <8 x i16> %not, %neg
%ret = or <8 x i16> %and1, %and2
ret <8 x i16> %ret
}
|