reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    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
}