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
|
; Test v2i64 absolute.
;
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
; Test with slt.
define <2 x i64> @f1(<2 x i64> %val) {
; CHECK-LABEL: f1:
; CHECK: vlpg %v24, %v24
; CHECK: br %r14
%cmp = icmp slt <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%ret = select <2 x i1> %cmp, <2 x i64> %neg, <2 x i64> %val
ret <2 x i64> %ret
}
; Test with sle.
define <2 x i64> @f2(<2 x i64> %val) {
; CHECK-LABEL: f2:
; CHECK: vlpg %v24, %v24
; CHECK: br %r14
%cmp = icmp sle <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%ret = select <2 x i1> %cmp, <2 x i64> %neg, <2 x i64> %val
ret <2 x i64> %ret
}
; Test with sgt.
define <2 x i64> @f3(<2 x i64> %val) {
; CHECK-LABEL: f3:
; CHECK: vlpg %v24, %v24
; CHECK: br %r14
%cmp = icmp sgt <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%ret = select <2 x i1> %cmp, <2 x i64> %val, <2 x i64> %neg
ret <2 x i64> %ret
}
; Test with sge.
define <2 x i64> @f4(<2 x i64> %val) {
; CHECK-LABEL: f4:
; CHECK: vlpg %v24, %v24
; CHECK: br %r14
%cmp = icmp sge <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%ret = select <2 x i1> %cmp, <2 x i64> %val, <2 x i64> %neg
ret <2 x i64> %ret
}
; Test that negative absolute uses VLPG too. There is no vector equivalent
; of LOAD NEGATIVE.
define <2 x i64> @f5(<2 x i64> %val) {
; CHECK-LABEL: f5:
; CHECK: vlpg [[REG:%v[0-9]+]], %v24
; CHECK: vlcg %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp slt <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%abs = select <2 x i1> %cmp, <2 x i64> %neg, <2 x i64> %val
%ret = sub <2 x i64> zeroinitializer, %abs
ret <2 x i64> %ret
}
; Try another form of negative absolute (slt version).
define <2 x i64> @f6(<2 x i64> %val) {
; CHECK-LABEL: f6:
; CHECK: vlpg [[REG:%v[0-9]+]], %v24
; CHECK: vlcg %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp slt <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%ret = select <2 x i1> %cmp, <2 x i64> %val, <2 x i64> %neg
ret <2 x i64> %ret
}
; Test with sle.
define <2 x i64> @f7(<2 x i64> %val) {
; CHECK-LABEL: f7:
; CHECK: vlpg [[REG:%v[0-9]+]], %v24
; CHECK: vlcg %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp sle <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%ret = select <2 x i1> %cmp, <2 x i64> %val, <2 x i64> %neg
ret <2 x i64> %ret
}
; Test with sgt.
define <2 x i64> @f8(<2 x i64> %val) {
; CHECK-LABEL: f8:
; CHECK: vlpg [[REG:%v[0-9]+]], %v24
; CHECK: vlcg %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp sgt <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%ret = select <2 x i1> %cmp, <2 x i64> %neg, <2 x i64> %val
ret <2 x i64> %ret
}
; Test with sge.
define <2 x i64> @f9(<2 x i64> %val) {
; CHECK-LABEL: f9:
; CHECK: vlpg [[REG:%v[0-9]+]], %v24
; CHECK: vlcg %v24, [[REG]]
; CHECK: br %r14
%cmp = icmp sge <2 x i64> %val, zeroinitializer
%neg = sub <2 x i64> zeroinitializer, %val
%ret = select <2 x i1> %cmp, <2 x i64> %neg, <2 x i64> %val
ret <2 x i64> %ret
}
; Test with an SRA-based boolean vector.
define <2 x i64> @f10(<2 x i64> %val) {
; CHECK-LABEL: f10:
; CHECK: vlpg %v24, %v24
; CHECK: br %r14
%shr = ashr <2 x i64> %val, <i64 63, i64 63>
%neg = sub <2 x i64> zeroinitializer, %val
%and1 = and <2 x i64> %shr, %neg
%not = xor <2 x i64> %shr, <i64 -1, i64 -1>
%and2 = and <2 x i64> %not, %val
%ret = or <2 x i64> %and1, %and2
ret <2 x i64> %ret
}
; ...and again in reverse
define <2 x i64> @f11(<2 x i64> %val) {
; CHECK-LABEL: f11:
; CHECK: vlpg [[REG:%v[0-9]+]], %v24
; CHECK: vlcg %v24, [[REG]]
; CHECK: br %r14
%shr = ashr <2 x i64> %val, <i64 63, i64 63>
%and1 = and <2 x i64> %shr, %val
%not = xor <2 x i64> %shr, <i64 -1, i64 -1>
%neg = sub <2 x i64> zeroinitializer, %val
%and2 = and <2 x i64> %not, %neg
%ret = or <2 x i64> %and1, %and2
ret <2 x i64> %ret
}
|