mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
For some reason I never got around to adding these at the same time as the signed versions. No idea why. I'm not sure whether this SystemZII::BranchC* stuff is useful, or whether it should just be replaced with an "is normal" flag. I'll leave that for later though. There are some boundary conditions that can be tweaked, such as preferring unsigned comparisons for equality with [128, 256), and "<= 255" over "< 256", but again I'll leave those for a separate patch. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190930 91177308-0d34-0410-b5e6-96231b3b80d8
122 lines
2.6 KiB
LLVM
122 lines
2.6 KiB
LLVM
; Test 64-bit comparisons in which the second operand is zero-extended
|
|
; from a PC-relative i16.
|
|
;
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
|
|
|
@g = global i16 1
|
|
@h = global i16 1, align 1, section "foo"
|
|
|
|
; Check unsigned comparison.
|
|
define i64 @f1(i64 %src1) {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: clghrl %r2, g
|
|
; CHECK-NEXT: jl
|
|
; CHECK: br %r14
|
|
entry:
|
|
%val = load i16 *@g
|
|
%src2 = zext i16 %val to i64
|
|
%cond = icmp ult i64 %src1, %src2
|
|
br i1 %cond, label %exit, label %mulb
|
|
mulb:
|
|
%mul = mul i64 %src1, %src1
|
|
br label %exit
|
|
exit:
|
|
%res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
|
|
ret i64 %res
|
|
}
|
|
|
|
; Check signed comparison.
|
|
define i64 @f2(i64 %src1) {
|
|
; CHECK-LABEL: f2:
|
|
; CHECK-NOT: clghrl
|
|
; CHECK: br %r14
|
|
entry:
|
|
%val = load i16 *@g
|
|
%src2 = zext i16 %val to i64
|
|
%cond = icmp slt i64 %src1, %src2
|
|
br i1 %cond, label %exit, label %mulb
|
|
mulb:
|
|
%mul = mul i64 %src1, %src1
|
|
br label %exit
|
|
exit:
|
|
%res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
|
|
ret i64 %res
|
|
}
|
|
|
|
; Check equality.
|
|
define i64 @f3(i64 %src1) {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: clghrl %r2, g
|
|
; CHECK-NEXT: je
|
|
; CHECK: br %r14
|
|
entry:
|
|
%val = load i16 *@g
|
|
%src2 = zext i16 %val to i64
|
|
%cond = icmp eq i64 %src1, %src2
|
|
br i1 %cond, label %exit, label %mulb
|
|
mulb:
|
|
%mul = mul i64 %src1, %src1
|
|
br label %exit
|
|
exit:
|
|
%res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
|
|
ret i64 %res
|
|
}
|
|
|
|
; Check inequality.
|
|
define i64 @f4(i64 %src1) {
|
|
; CHECK-LABEL: f4:
|
|
; CHECK: clghrl %r2, g
|
|
; CHECK-NEXT: jlh
|
|
; CHECK: br %r14
|
|
entry:
|
|
%val = load i16 *@g
|
|
%src2 = zext i16 %val to i64
|
|
%cond = icmp ne i64 %src1, %src2
|
|
br i1 %cond, label %exit, label %mulb
|
|
mulb:
|
|
%mul = mul i64 %src1, %src1
|
|
br label %exit
|
|
exit:
|
|
%res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
|
|
ret i64 %res
|
|
}
|
|
|
|
; Repeat f1 with an unaligned address.
|
|
define i64 @f5(i64 %src1) {
|
|
; CHECK-LABEL: f5:
|
|
; CHECK: lgrl [[REG:%r[0-5]]], h@GOT
|
|
; CHECK: llgh [[VAL:%r[0-5]]], 0([[REG]])
|
|
; CHECK: clgrjl %r2, [[VAL]],
|
|
; CHECK: br %r14
|
|
entry:
|
|
%val = load i16 *@h, align 1
|
|
%src2 = zext i16 %val to i64
|
|
%cond = icmp ult i64 %src1, %src2
|
|
br i1 %cond, label %exit, label %mulb
|
|
mulb:
|
|
%mul = mul i64 %src1, %src1
|
|
br label %exit
|
|
exit:
|
|
%res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
|
|
ret i64 %res
|
|
}
|
|
|
|
; Check the comparison can be reversed if that allows CLGHRL to be used.
|
|
define i64 @f6(i64 %src2) {
|
|
; CHECK-LABEL: f6:
|
|
; CHECK: clghrl %r2, g
|
|
; CHECK-NEXT: jh {{\.L.*}}
|
|
; CHECK: br %r14
|
|
entry:
|
|
%val = load i16 *@g
|
|
%src1 = zext i16 %val to i64
|
|
%cond = icmp ult i64 %src1, %src2
|
|
br i1 %cond, label %exit, label %mulb
|
|
mulb:
|
|
%mul = mul i64 %src2, %src2
|
|
br label %exit
|
|
exit:
|
|
%res = phi i64 [ %src2, %entry ], [ %mul, %mulb ]
|
|
ret i64 %res
|
|
}
|