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/CodeGen/SystemZ/strcmp-01.ll | |
parent | 6a079fef4fad3e6c2e07c9e1d0776e20a0b05b1e (diff) |
[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/CodeGen/SystemZ/strcmp-01.ll')
-rw-r--r-- | test/CodeGen/SystemZ/strcmp-01.ll | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/test/CodeGen/SystemZ/strcmp-01.ll b/test/CodeGen/SystemZ/strcmp-01.ll new file mode 100644 index 00000000000..122c160baba --- /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 +} |