1; Test 32-bit comparisons in which the second operand is zero-extended 2; from a PC-relative i16. 3; 4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 5 6@g = global i16 1 7 8; Check unsigned comparison. 9define i32 @f1(i32 %src1) { 10; CHECK: f1: 11; CHECK: clhrl %r2, g 12; CHECK-NEXT: jl 13; CHECK: br %r14 14entry: 15 %val = load i16 *@g 16 %src2 = zext i16 %val to i32 17 %cond = icmp ult i32 %src1, %src2 18 br i1 %cond, label %exit, label %mulb 19mulb: 20 %mul = mul i32 %src1, %src1 21 br label %exit 22exit: 23 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ] 24 ret i32 %res 25} 26 27; Check signed comparison. 28define i32 @f2(i32 %src1) { 29; CHECK: f2: 30; CHECK-NOT: clhrl 31; CHECK: br %r14 32entry: 33 %val = load i16 *@g 34 %src2 = zext i16 %val to i32 35 %cond = icmp slt i32 %src1, %src2 36 br i1 %cond, label %exit, label %mulb 37mulb: 38 %mul = mul i32 %src1, %src1 39 br label %exit 40exit: 41 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ] 42 ret i32 %res 43} 44 45; Check equality. 46define i32 @f3(i32 %src1) { 47; CHECK: f3: 48; CHECK: clhrl %r2, g 49; CHECK-NEXT: je 50; CHECK: br %r14 51entry: 52 %val = load i16 *@g 53 %src2 = zext i16 %val to i32 54 %cond = icmp eq i32 %src1, %src2 55 br i1 %cond, label %exit, label %mulb 56mulb: 57 %mul = mul i32 %src1, %src1 58 br label %exit 59exit: 60 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ] 61 ret i32 %res 62} 63 64; Check inequality. 65define i32 @f4(i32 %src1) { 66; CHECK: f4: 67; CHECK: clhrl %r2, g 68; CHECK-NEXT: jlh 69; CHECK: br %r14 70entry: 71 %val = load i16 *@g 72 %src2 = zext i16 %val to i32 73 %cond = icmp ne i32 %src1, %src2 74 br i1 %cond, label %exit, label %mulb 75mulb: 76 %mul = mul i32 %src1, %src1 77 br label %exit 78exit: 79 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ] 80 ret i32 %res 81} 82