aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-08-19 12:56:58 +0000
committerRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-08-19 12:56:58 +0000
commitd4a37e61378949835d93df6b8e4a9feadb4edeef (patch)
treec96caffa4e74065897e1505b27a6f31613266cab /test
parentb0d40a22e5aa1a51913fa161c2ce5513d7bd9293 (diff)
downloadexternal_llvm-d4a37e61378949835d93df6b8e4a9feadb4edeef.zip
external_llvm-d4a37e61378949835d93df6b8e4a9feadb4edeef.tar.gz
external_llvm-d4a37e61378949835d93df6b8e4a9feadb4edeef.tar.bz2
[SystemZ] Add negative integer absolute (load negative)
For now this matches the equivalent of (neg (abs ...)), which did hit a few times in projects/test-suite. We should probably also match cases where absolute-like selects are used with reversed arguments. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188671 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/CodeGen/SystemZ/int-neg-02.ll91
-rw-r--r--test/MC/Disassembler/SystemZ/insns.txt36
-rw-r--r--test/MC/SystemZ/insn-good.s30
3 files changed, 157 insertions, 0 deletions
diff --git a/test/CodeGen/SystemZ/int-neg-02.ll b/test/CodeGen/SystemZ/int-neg-02.ll
new file mode 100644
index 0000000..e26194c
--- /dev/null
+++ b/test/CodeGen/SystemZ/int-neg-02.ll
@@ -0,0 +1,91 @@
+; Test negative integer absolute.
+;
+; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
+
+; Test i32->i32 negative absolute using slt.
+define i32 @f1(i32 %val) {
+; CHECK-LABEL: f1:
+; CHECK: lnr %r2, %r2
+; CHECK: br %r14
+ %cmp = icmp slt i32 %val, 0
+ %neg = sub i32 0, %val
+ %abs = select i1 %cmp, i32 %neg, i32 %val
+ %res = sub i32 0, %abs
+ ret i32 %res
+}
+
+; Test i32->i32 negative absolute using sle.
+define i32 @f2(i32 %val) {
+; CHECK-LABEL: f2:
+; CHECK: lnr %r2, %r2
+; CHECK: br %r14
+ %cmp = icmp sle i32 %val, 0
+ %neg = sub i32 0, %val
+ %abs = select i1 %cmp, i32 %neg, i32 %val
+ %res = sub i32 0, %abs
+ ret i32 %res
+}
+
+; Test i32->i32 negative absolute using sgt.
+define i32 @f3(i32 %val) {
+; CHECK-LABEL: f3:
+; CHECK: lnr %r2, %r2
+; CHECK: br %r14
+ %cmp = icmp sgt i32 %val, 0
+ %neg = sub i32 0, %val
+ %abs = select i1 %cmp, i32 %val, i32 %neg
+ %res = sub i32 0, %abs
+ ret i32 %res
+}
+
+; Test i32->i32 negative absolute using sge.
+define i32 @f4(i32 %val) {
+; CHECK-LABEL: f4:
+; CHECK: lnr %r2, %r2
+; CHECK: br %r14
+ %cmp = icmp sge i32 %val, 0
+ %neg = sub i32 0, %val
+ %abs = select i1 %cmp, i32 %val, i32 %neg
+ %res = sub i32 0, %abs
+ ret i32 %res
+}
+
+; Test i32->i64 negative absolute.
+define i64 @f5(i32 %val) {
+; CHECK-LABEL: f5:
+; CHECK: lngfr %r2, %r2
+; CHECK: br %r14
+ %ext = sext i32 %val to i64
+ %cmp = icmp slt i64 %ext, 0
+ %neg = sub i64 0, %ext
+ %abs = select i1 %cmp, i64 %neg, i64 %ext
+ %res = sub i64 0, %abs
+ ret i64 %res
+}
+
+; Test i32->i64 negative absolute that uses an "in-register" form of
+; sign extension.
+define i64 @f6(i64 %val) {
+; CHECK-LABEL: f6:
+; CHECK: lngfr %r2, %r2
+; CHECK: br %r14
+ %trunc = trunc i64 %val to i32
+ %ext = sext i32 %trunc to i64
+ %cmp = icmp slt i64 %ext, 0
+ %neg = sub i64 0, %ext
+ %abs = select i1 %cmp, i64 %neg, i64 %ext
+ %res = sub i64 0, %abs
+ ret i64 %res
+}
+
+; Test i64 negative absolute.
+define i64 @f7(i64 %val) {
+; CHECK-LABEL: f7:
+; CHECK: lngr %r2, %r2
+; CHECK: br %r14
+ %cmp = icmp slt i64 %val, 0
+ %neg = sub i64 0, %val
+ %abs = select i1 %cmp, i64 %neg, i64 %val
+ %res = sub i64 0, %abs
+ ret i64 %res
+}
diff --git a/test/MC/Disassembler/SystemZ/insns.txt b/test/MC/Disassembler/SystemZ/insns.txt
index 9b31fd4..15eaf7b 100644
--- a/test/MC/Disassembler/SystemZ/insns.txt
+++ b/test/MC/Disassembler/SystemZ/insns.txt
@@ -3307,6 +3307,42 @@
# CHECK: lnebr %f15, %f9
0xb3 0x01 0x00 0xf9
+# CHECK: lngfr %r0, %r0
+0xb9 0x11 0x00 0x00
+
+# CHECK: lngfr %r0, %r15
+0xb9 0x11 0x00 0x0f
+
+# CHECK: lngfr %r15, %r0
+0xb9 0x11 0x00 0xf0
+
+# CHECK: lngfr %r7, %r8
+0xb9 0x11 0x00 0x78
+
+# CHECK: lngr %r0, %r0
+0xb9 0x01 0x00 0x00
+
+# CHECK: lngr %r0, %r15
+0xb9 0x01 0x00 0x0f
+
+# CHECK: lngr %r15, %r0
+0xb9 0x01 0x00 0xf0
+
+# CHECK: lngr %r7, %r8
+0xb9 0x01 0x00 0x78
+
+# CHECK: lnr %r0, %r0
+0x11 0x00
+
+# CHECK: lnr %r0, %r15
+0x11 0x0f
+
+# CHECK: lnr %r15, %r0
+0x11 0xf0
+
+# CHECK: lnr %r7, %r8
+0x11 0x78
+
# CHECK: lnxbr %f0, %f8
0xb3 0x41 0x00 0x08
diff --git a/test/MC/SystemZ/insn-good.s b/test/MC/SystemZ/insn-good.s
index 47071f2..2c52d3a 100644
--- a/test/MC/SystemZ/insn-good.s
+++ b/test/MC/SystemZ/insn-good.s
@@ -4727,6 +4727,36 @@
lnebr %f15,%f0
lnebr %f15,%f9
+#CHECK: lngfr %r0, %r0 # encoding: [0xb9,0x11,0x00,0x00]
+#CHECK: lngfr %r0, %r15 # encoding: [0xb9,0x11,0x00,0x0f]
+#CHECK: lngfr %r15, %r0 # encoding: [0xb9,0x11,0x00,0xf0]
+#CHECK: lngfr %r7, %r8 # encoding: [0xb9,0x11,0x00,0x78]
+
+ lngfr %r0,%r0
+ lngfr %r0,%r15
+ lngfr %r15,%r0
+ lngfr %r7,%r8
+
+#CHECK: lngr %r0, %r0 # encoding: [0xb9,0x01,0x00,0x00]
+#CHECK: lngr %r0, %r15 # encoding: [0xb9,0x01,0x00,0x0f]
+#CHECK: lngr %r15, %r0 # encoding: [0xb9,0x01,0x00,0xf0]
+#CHECK: lngr %r7, %r8 # encoding: [0xb9,0x01,0x00,0x78]
+
+ lngr %r0,%r0
+ lngr %r0,%r15
+ lngr %r15,%r0
+ lngr %r7,%r8
+
+#CHECK: lnr %r0, %r0 # encoding: [0x11,0x00]
+#CHECK: lnr %r0, %r15 # encoding: [0x11,0x0f]
+#CHECK: lnr %r15, %r0 # encoding: [0x11,0xf0]
+#CHECK: lnr %r7, %r8 # encoding: [0x11,0x78]
+
+ lnr %r0,%r0
+ lnr %r0,%r15
+ lnr %r15,%r0
+ lnr %r7,%r8
+
#CHECK: lnxbr %f0, %f8 # encoding: [0xb3,0x41,0x00,0x08]
#CHECK: lnxbr %f0, %f13 # encoding: [0xb3,0x41,0x00,0x0d]
#CHECK: lnxbr %f13, %f0 # encoding: [0xb3,0x41,0x00,0xd0]