diff options
author | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-08-16 11:21:54 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-08-16 11:21:54 +0000 |
commit | e1b2af731e2a45344a7c502232f66c55cd746da0 (patch) | |
tree | bb6a3377594da6a0b30e8179e071137324d5cf69 /test | |
parent | 6a079fef4fad3e6c2e07c9e1d0776e20a0b05b1e (diff) | |
download | external_llvm-e1b2af731e2a45344a7c502232f66c55cd746da0.zip external_llvm-e1b2af731e2a45344a7c502232f66c55cd746da0.tar.gz external_llvm-e1b2af731e2a45344a7c502232f66c55cd746da0.tar.bz2 |
[SystemZ] Use CLST to implement strcmp
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188544 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/SystemZ/strcmp-01.ll | 70 | ||||
-rw-r--r-- | test/CodeGen/SystemZ/strcmp-02.ll | 72 | ||||
-rw-r--r-- | test/MC/Disassembler/SystemZ/insns.txt | 12 | ||||
-rw-r--r-- | test/MC/SystemZ/insn-good.s | 10 |
4 files changed, 164 insertions, 0 deletions
diff --git a/test/CodeGen/SystemZ/strcmp-01.ll b/test/CodeGen/SystemZ/strcmp-01.ll new file mode 100644 index 0000000..122c160 --- /dev/null +++ b/test/CodeGen/SystemZ/strcmp-01.ll @@ -0,0 +1,70 @@ +; Test strcmp using CLST, i32 version. +; +; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s + +declare signext i32 @strcmp(i8 *%src1, i8 *%src2) + +; Check a case where the result is used as an integer. +define i32 @f1(i8 *%src1, i8 *%src2) { +; CHECK-LABEL: f1: +; CHECK: lhi %r0, 0 +; CHECK: [[LABEL:\.[^:]*]]: +; CHECK: clst %r2, %r3 +; CHECK-NEXT: jo [[LABEL]] +; CHECK-NEXT: BB#{{[0-9]+}} +; CHECK-NEXT: ipm [[REG:%r[0-5]]] +; CHECK: srl [[REG]], 28 +; CHECK: rll %r2, [[REG]], 31 +; CHECK: br %r14 + %res = call i32 @strcmp(i8 *%src1, i8 *%src2) + ret i32 %res +} + +; Check a case where the result is tested for equality. +define void @f2(i8 *%src1, i8 *%src2, i32 *%dest) { +; CHECK-LABEL: f2: +; CHECK: lhi %r0, 0 +; CHECK: [[LABEL:\.[^:]*]]: +; CHECK: clst %r2, %r3 +; CHECK-NEXT: jo [[LABEL]] +; CHECK-NEXT: BB#{{[0-9]+}} +; CHECK-NEXT: je {{\.L.*}} +; CHECK: br %r14 + %res = call i32 @strcmp(i8 *%src1, i8 *%src2) + %cmp = icmp eq i32 %res, 0 + br i1 %cmp, label %exit, label %store + +store: + store i32 0, i32 *%dest + br label %exit + +exit: + ret void +} + +; Test a case where the result is used both as an integer and for +; branching. +define i32 @f3(i8 *%src1, i8 *%src2, i32 *%dest) { +; CHECK-LABEL: f3: +; CHECK: lhi %r0, 0 +; CHECK: [[LABEL:\.[^:]*]]: +; CHECK: clst %r2, %r3 +; CHECK-NEXT: jo [[LABEL]] +; CHECK-NEXT: BB#{{[0-9]+}} +; CHECK-NEXT: ipm [[REG:%r[0-5]]] +; CHECK: srl [[REG]], 28 +; CHECK: rll %r2, [[REG]], 31 +; CHECK: jl {{\.L*}} +; CHECK: br %r14 +entry: + %res = call i32 @strcmp(i8 *%src1, i8 *%src2) + %cmp = icmp slt i32 %res, 0 + br i1 %cmp, label %exit, label %store + +store: + store i32 0, i32 *%dest + br label %exit + +exit: + ret i32 %res +} diff --git a/test/CodeGen/SystemZ/strcmp-02.ll b/test/CodeGen/SystemZ/strcmp-02.ll new file mode 100644 index 0000000..27bd00b --- /dev/null +++ b/test/CodeGen/SystemZ/strcmp-02.ll @@ -0,0 +1,72 @@ +; Test strcmp using CLST, i64 version. +; +; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s + +declare i64 @strcmp(i8 *%src1, i8 *%src2) + +; Check a case where the result is used as an integer. +define i64 @f1(i8 *%src1, i8 *%src2) { +; CHECK-LABEL: f1: +; CHECK: lhi %r0, 0 +; CHECK: [[LABEL:\.[^:]*]]: +; CHECK: clst %r2, %r3 +; CHECK-NEXT: jo [[LABEL]] +; CHECK-NEXT: BB#{{[0-9]+}} +; CHECK-NEXT: ipm [[REG:%r[0-5]]] +; CHECK: srl [[REG]], 28 +; CHECK: rll [[REG]], [[REG]], 31 +; CHECK: lgfr %r2, [[REG]] +; CHECK: br %r14 + %res = call i64 @strcmp(i8 *%src1, i8 *%src2) + ret i64 %res +} + +; Check a case where the result is tested for equality. +define void @f2(i8 *%src1, i8 *%src2, i64 *%dest) { +; CHECK-LABEL: f2: +; CHECK: lhi %r0, 0 +; CHECK: [[LABEL:\.[^:]*]]: +; CHECK: clst %r2, %r3 +; CHECK-NEXT: jo [[LABEL]] +; CHECK-NEXT: BB#{{[0-9]+}} +; CHECK-NEXT: je {{\.L.*}} +; CHECK: br %r14 + %res = call i64 @strcmp(i8 *%src1, i8 *%src2) + %cmp = icmp eq i64 %res, 0 + br i1 %cmp, label %exit, label %store + +store: + store i64 0, i64 *%dest + br label %exit + +exit: + ret void +} + +; Test a case where the result is used both as an integer and for +; branching. +define i64 @f3(i8 *%src1, i8 *%src2, i64 *%dest) { +; CHECK-LABEL: f3: +; CHECK: lhi %r0, 0 +; CHECK: [[LABEL:\.[^:]*]]: +; CHECK: clst %r2, %r3 +; CHECK-NEXT: jo [[LABEL]] +; CHECK-NEXT: BB#{{[0-9]+}} +; CHECK-NEXT: ipm [[REG:%r[0-5]]] +; CHECK: srl [[REG]], 28 +; CHECK: rll [[REG]], [[REG]], 31 +; CHECK: lgfr %r2, [[REG]] +; CHECK: jl {{\.L*}} +; CHECK: br %r14 +entry: + %res = call i64 @strcmp(i8 *%src1, i8 *%src2) + %cmp = icmp slt i64 %res, 0 + br i1 %cmp, label %exit, label %store + +store: + store i64 0, i64 *%dest + br label %exit + +exit: + ret i64 %res +} diff --git a/test/MC/Disassembler/SystemZ/insns.txt b/test/MC/Disassembler/SystemZ/insns.txt index f76c83a..5f2bc89 100644 --- a/test/MC/Disassembler/SystemZ/insns.txt +++ b/test/MC/Disassembler/SystemZ/insns.txt @@ -1597,6 +1597,18 @@ # CHECK: clr %r7, %r8 0x15 0x78 +# CHECK: clst %r0, %r0 +0xb2 0x5d 0x00 0x00 + +# CHECK: clst %r0, %r15 +0xb2 0x5d 0x00 0x0f + +# CHECK: clst %r15, %r0 +0xb2 0x5d 0x00 0xf0 + +# CHECK: clst %r7, %r8 +0xb2 0x5d 0x00 0x78 + # CHECK: cl %r0, 0 0x55 0x00 0x00 0x00 diff --git a/test/MC/SystemZ/insn-good.s b/test/MC/SystemZ/insn-good.s index 9fd0d0c..a452992 100644 --- a/test/MC/SystemZ/insn-good.s +++ b/test/MC/SystemZ/insn-good.s @@ -2841,6 +2841,16 @@ clrl %r7,frob@PLT clrl %r8,frob@PLT +#CHECK: clst %r0, %r0 # encoding: [0xb2,0x5d,0x00,0x00] +#CHECK: clst %r0, %r15 # encoding: [0xb2,0x5d,0x00,0x0f] +#CHECK: clst %r15, %r0 # encoding: [0xb2,0x5d,0x00,0xf0] +#CHECK: clst %r7, %r8 # encoding: [0xb2,0x5d,0x00,0x78] + + clst %r0,%r0 + clst %r0,%r15 + clst %r15,%r0 + clst %r7,%r8 + #CHECK: cly %r0, -524288 # encoding: [0xe3,0x00,0x00,0x00,0x80,0x55] #CHECK: cly %r0, -1 # encoding: [0xe3,0x00,0x0f,0xff,0xff,0x55] #CHECK: cly %r0, 0 # encoding: [0xe3,0x00,0x00,0x00,0x00,0x55] |