71 lines · plain
1; Test strcmp using CLST, i32 version.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5declare signext i32 @strcmp(ptr %src1, ptr %src2)6 7; Check a case where the result is used as an integer.8define i32 @f1(ptr %src1, ptr %src2) {9; CHECK-LABEL: f1:10; CHECK: lhi %r0, 011; CHECK: [[LABEL:\.[^:]*]]:12; CHECK: clst %r3, %r213; CHECK-NEXT: jo [[LABEL]]14; CHECK-NEXT: %bb.{{[0-9]+}}15; CHECK-NEXT: ipm %r216; CHECK: sll %r2, 217; CHECK: sra %r2, 3018; CHECK: br %r1419 %res = call i32 @strcmp(ptr %src1, ptr %src2)20 ret i32 %res21}22 23; Check a case where the result is tested for equality.24define void @f2(ptr %src1, ptr %src2, ptr %dest) {25; CHECK-LABEL: f2:26; CHECK: lhi %r0, 027; CHECK: [[LABEL:\.[^:]*]]:28; CHECK: clst %r3, %r229; CHECK-NEXT: jo [[LABEL]]30; CHECK-NEXT: %bb.{{[0-9]+}}31; CHECK-NEXT: ber %r1432; CHECK: br %r1433 %res = call i32 @strcmp(ptr %src1, ptr %src2)34 %cmp = icmp eq i32 %res, 035 br i1 %cmp, label %exit, label %store36 37store:38 store i32 0, ptr %dest39 br label %exit40 41exit:42 ret void43}44 45; Test a case where the result is used both as an integer and for46; branching.47define i32 @f3(ptr %src1, ptr %src2, ptr %dest) {48; CHECK-LABEL: f3:49; CHECK: lhi %r0, 050; CHECK: [[LABEL:\.[^:]*]]:51; CHECK: clst %r3, %r252; CHECK-NEXT: jo [[LABEL]]53; CHECK-NEXT: %bb.{{[0-9]+}}54; CHECK-NEXT: ipm %r255; CHECK: sll %r2, 256; CHECK: sra %r2, 3057; CHECK: blr %r1458; CHECK: br %r1459entry:60 %res = call i32 @strcmp(ptr %src1, ptr %src2)61 %cmp = icmp slt i32 %res, 062 br i1 %cmp, label %exit, label %store63 64store:65 store i32 0, ptr %dest66 br label %exit67 68exit:69 ret i32 %res70}71