Files
TheRock/compiler/amd-llvm/llvm/test/CodeGen/AArch64/cmp-to-cmn.ll
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

846 lines
22 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD
; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "arm64"
define i1 @test_EQ_IllEbT(i64 %a, i64 %b) {
; CHECK-SD-LABEL: test_EQ_IllEbT:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: cmn x0, x1
; CHECK-SD-NEXT: cset w0, eq
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_EQ_IllEbT:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: cmn x1, x0
; CHECK-GI-NEXT: cset w0, eq
; CHECK-GI-NEXT: ret
entry:
%add = sub i64 0, %b
%cmp = icmp eq i64 %add, %a
ret i1 %cmp
}
define i1 @test_EQ_IliEbT(i64 %a, i32 %b) {
; CHECK-SD-LABEL: test_EQ_IliEbT:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: cmn x0, w1, sxtw
; CHECK-SD-NEXT: cset w0, eq
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_EQ_IliEbT:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: // kill: def $w1 killed $w1 def $x1
; CHECK-GI-NEXT: sxtw x8, w1
; CHECK-GI-NEXT: cmn x8, x0
; CHECK-GI-NEXT: cset w0, eq
; CHECK-GI-NEXT: ret
entry:
%conv = sext i32 %b to i64
%add = sub i64 0, %a
%cmp = icmp eq i64 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IlsEbT(i64 %a, i16 %b) {
; CHECK-LABEL: test_EQ_IlsEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn x0, w1, sxth
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = sext i16 %b to i64
%add = sub i64 0, %a
%cmp = icmp eq i64 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IlcEbT(i64 %a, i8 %b) {
; CHECK-LABEL: test_EQ_IlcEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn x0, w1, uxtb
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = zext i8 %b to i64
%add = sub i64 0, %a
%cmp = icmp eq i64 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IilEbT(i32 %a, i64 %b) {
; CHECK-SD-LABEL: test_EQ_IilEbT:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: cmn x1, w0, sxtw
; CHECK-SD-NEXT: cset w0, eq
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_EQ_IilEbT:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: // kill: def $w0 killed $w0 def $x0
; CHECK-GI-NEXT: sxtw x8, w0
; CHECK-GI-NEXT: cmn x8, x1
; CHECK-GI-NEXT: cset w0, eq
; CHECK-GI-NEXT: ret
entry:
%conv = sext i32 %a to i64
%add = sub i64 0, %b
%cmp = icmp eq i64 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IiiEbT(i32 %a, i32 %b) {
; CHECK-SD-LABEL: test_EQ_IiiEbT:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: cmn w0, w1
; CHECK-SD-NEXT: cset w0, eq
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_EQ_IiiEbT:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: cmn w1, w0
; CHECK-GI-NEXT: cset w0, eq
; CHECK-GI-NEXT: ret
entry:
%add = sub i32 0, %b
%cmp = icmp eq i32 %add, %a
ret i1 %cmp
}
define i1 @test_EQ_IisEbT(i32 %a, i16 %b) {
; CHECK-LABEL: test_EQ_IisEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn w0, w1, sxth
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = sext i16 %b to i32
%add = sub i32 0, %a
%cmp = icmp eq i32 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IicEbT(i32 %a, i8 %b) {
; CHECK-LABEL: test_EQ_IicEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn w0, w1, uxtb
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = zext i8 %b to i32
%add = sub i32 0, %a
%cmp = icmp eq i32 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IslEbT(i16 %a, i64 %b) {
; CHECK-LABEL: test_EQ_IslEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn x1, w0, sxth
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = sext i16 %a to i64
%add = sub i64 0, %b
%cmp = icmp eq i64 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IsiEbT(i16 %a, i32 %b) {
; CHECK-LABEL: test_EQ_IsiEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn w1, w0, sxth
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = sext i16 %a to i32
%add = sub i32 0, %b
%cmp = icmp eq i32 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IssEbT(i16 %a, i16 %b) {
; CHECK-LABEL: test_EQ_IssEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: sxth w8, w0
; CHECK-NEXT: cmn w8, w1, sxth
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = sext i16 %a to i32
%conv1 = sext i16 %b to i32
%add = sub nsw i32 0, %conv1
%cmp = icmp eq i32 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IscEbT(i16 %a, i8 %b) {
; CHECK-LABEL: test_EQ_IscEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: sxth w8, w0
; CHECK-NEXT: cmn w8, w1, uxtb
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = sext i16 %a to i32
%conv1 = zext i8 %b to i32
%add = sub nsw i32 0, %conv1
%cmp = icmp eq i32 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IclEbT(i8 %a, i64 %b) {
; CHECK-LABEL: test_EQ_IclEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn x1, w0, uxtb
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = zext i8 %a to i64
%add = sub i64 0, %b
%cmp = icmp eq i64 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IciEbT(i8 %a, i32 %b) {
; CHECK-LABEL: test_EQ_IciEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn w1, w0, uxtb
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = zext i8 %a to i32
%add = sub i32 0, %b
%cmp = icmp eq i32 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IcsEbT(i8 %a, i16 %b) {
; CHECK-LABEL: test_EQ_IcsEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: and w8, w0, #0xff
; CHECK-NEXT: cmn w8, w1, sxth
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = zext i8 %a to i32
%conv1 = sext i16 %b to i32
%add = sub nsw i32 0, %conv1
%cmp = icmp eq i32 %conv, %add
ret i1 %cmp
}
define i1 @test_EQ_IccEbT(i8 %a, i8 %b) {
; CHECK-LABEL: test_EQ_IccEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: and w8, w0, #0xff
; CHECK-NEXT: cmn w8, w1, uxtb
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
entry:
%conv = zext i8 %a to i32
%conv1 = zext i8 %b to i32
%add = sub nsw i32 0, %conv1
%cmp = icmp eq i32 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IllEbT(i64 %a, i64 %b) {
; CHECK-SD-LABEL: test_NE_IllEbT:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: cmn x0, x1
; CHECK-SD-NEXT: cset w0, ne
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_NE_IllEbT:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: cmn x1, x0
; CHECK-GI-NEXT: cset w0, ne
; CHECK-GI-NEXT: ret
entry:
%add = sub i64 0, %b
%cmp = icmp ne i64 %add, %a
ret i1 %cmp
}
define i1 @test_NE_IliEbT(i64 %a, i32 %b) {
; CHECK-SD-LABEL: test_NE_IliEbT:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: cmn x0, w1, sxtw
; CHECK-SD-NEXT: cset w0, ne
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_NE_IliEbT:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: // kill: def $w1 killed $w1 def $x1
; CHECK-GI-NEXT: sxtw x8, w1
; CHECK-GI-NEXT: cmn x8, x0
; CHECK-GI-NEXT: cset w0, ne
; CHECK-GI-NEXT: ret
entry:
%conv = sext i32 %b to i64
%add = sub i64 0, %a
%cmp = icmp ne i64 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IlsEbT(i64 %a, i16 %b) {
; CHECK-LABEL: test_NE_IlsEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn x0, w1, sxth
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = sext i16 %b to i64
%add = sub i64 0, %a
%cmp = icmp ne i64 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IlcEbT(i64 %a, i8 %b) {
; CHECK-LABEL: test_NE_IlcEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn x0, w1, uxtb
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = zext i8 %b to i64
%add = sub i64 0, %a
%cmp = icmp ne i64 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IilEbT(i32 %a, i64 %b) {
; CHECK-SD-LABEL: test_NE_IilEbT:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: cmn x1, w0, sxtw
; CHECK-SD-NEXT: cset w0, ne
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_NE_IilEbT:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: // kill: def $w0 killed $w0 def $x0
; CHECK-GI-NEXT: sxtw x8, w0
; CHECK-GI-NEXT: cmn x8, x1
; CHECK-GI-NEXT: cset w0, ne
; CHECK-GI-NEXT: ret
entry:
%conv = sext i32 %a to i64
%add = sub i64 0, %b
%cmp = icmp ne i64 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IiiEbT(i32 %a, i32 %b) {
; CHECK-SD-LABEL: test_NE_IiiEbT:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: cmn w0, w1
; CHECK-SD-NEXT: cset w0, ne
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_NE_IiiEbT:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: cmn w1, w0
; CHECK-GI-NEXT: cset w0, ne
; CHECK-GI-NEXT: ret
entry:
%add = sub i32 0, %b
%cmp = icmp ne i32 %add, %a
ret i1 %cmp
}
define i1 @test_NE_IisEbT(i32 %a, i16 %b) {
; CHECK-LABEL: test_NE_IisEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn w0, w1, sxth
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = sext i16 %b to i32
%add = sub i32 0, %a
%cmp = icmp ne i32 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IicEbT(i32 %a, i8 %b) {
; CHECK-LABEL: test_NE_IicEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn w0, w1, uxtb
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = zext i8 %b to i32
%add = sub i32 0, %a
%cmp = icmp ne i32 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IslEbT(i16 %a, i64 %b) {
; CHECK-LABEL: test_NE_IslEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn x1, w0, sxth
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = sext i16 %a to i64
%add = sub i64 0, %b
%cmp = icmp ne i64 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IsiEbT(i16 %a, i32 %b) {
; CHECK-LABEL: test_NE_IsiEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn w1, w0, sxth
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = sext i16 %a to i32
%add = sub i32 0, %b
%cmp = icmp ne i32 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IssEbT(i16 %a, i16 %b) {
; CHECK-LABEL: test_NE_IssEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: sxth w8, w0
; CHECK-NEXT: cmn w8, w1, sxth
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = sext i16 %a to i32
%conv1 = sext i16 %b to i32
%add = sub nsw i32 0, %conv1
%cmp = icmp ne i32 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IscEbT(i16 %a, i8 %b) {
; CHECK-LABEL: test_NE_IscEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: sxth w8, w0
; CHECK-NEXT: cmn w8, w1, uxtb
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = sext i16 %a to i32
%conv1 = zext i8 %b to i32
%add = sub nsw i32 0, %conv1
%cmp = icmp ne i32 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IclEbT(i8 %a, i64 %b) {
; CHECK-LABEL: test_NE_IclEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn x1, w0, uxtb
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = zext i8 %a to i64
%add = sub i64 0, %b
%cmp = icmp ne i64 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IciEbT(i8 %a, i32 %b) {
; CHECK-LABEL: test_NE_IciEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cmn w1, w0, uxtb
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = zext i8 %a to i32
%add = sub i32 0, %b
%cmp = icmp ne i32 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IcsEbT(i8 %a, i16 %b) {
; CHECK-LABEL: test_NE_IcsEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: and w8, w0, #0xff
; CHECK-NEXT: cmn w8, w1, sxth
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = zext i8 %a to i32
%conv1 = sext i16 %b to i32
%add = sub nsw i32 0, %conv1
%cmp = icmp ne i32 %conv, %add
ret i1 %cmp
}
define i1 @test_NE_IccEbT(i8 %a, i8 %b) {
; CHECK-LABEL: test_NE_IccEbT:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: and w8, w0, #0xff
; CHECK-NEXT: cmn w8, w1, uxtb
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
entry:
%conv = zext i8 %a to i32
%conv1 = zext i8 %b to i32
%add = sub nsw i32 0, %conv1
%cmp = icmp ne i32 %conv, %add
ret i1 %cmp
}
define i1 @cmn_large_imm(i32 %a) {
; CHECK-LABEL: cmn_large_imm:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w8, #64765 // =0xfcfd
; CHECK-NEXT: movk w8, #64764, lsl #16
; CHECK-NEXT: cmp w0, w8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
%cmp = icmp sgt i32 %a, -50529027
ret i1 %cmp
}
define i1 @almost_immediate_neg_slt(i32 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_slt:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, #4079, lsl #12 // =16707584
; CHECK-SD-NEXT: cset w0, le
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_slt:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #4097 // =0x1001
; CHECK-GI-NEXT: movk w8, #65281, lsl #16
; CHECK-GI-NEXT: cmp w0, w8
; CHECK-GI-NEXT: cset w0, lt
; CHECK-GI-NEXT: ret
%cmp = icmp slt i32 %x, -16707583
ret i1 %cmp
}
define i1 @almost_immediate_neg_slt_64(i64 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_slt_64:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn x0, #4079, lsl #12 // =16707584
; CHECK-SD-NEXT: cset w0, le
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_slt_64:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov x8, #-61439 // =0xffffffffffff1001
; CHECK-GI-NEXT: movk x8, #65281, lsl #16
; CHECK-GI-NEXT: cmp x0, x8
; CHECK-GI-NEXT: cset w0, lt
; CHECK-GI-NEXT: ret
%cmp = icmp slt i64 %x, -16707583
ret i1 %cmp
}
define i1 @almost_immediate_neg_sge(i32 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_sge:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, #4079, lsl #12 // =16707584
; CHECK-SD-NEXT: cset w0, gt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_sge:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #4097 // =0x1001
; CHECK-GI-NEXT: movk w8, #65281, lsl #16
; CHECK-GI-NEXT: cmp w0, w8
; CHECK-GI-NEXT: cset w0, ge
; CHECK-GI-NEXT: ret
%cmp = icmp sge i32 %x, -16707583
ret i1 %cmp
}
define i1 @almost_immediate_neg_sge_64(i64 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_sge_64:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn x0, #4079, lsl #12 // =16707584
; CHECK-SD-NEXT: cset w0, gt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_sge_64:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov x8, #-61439 // =0xffffffffffff1001
; CHECK-GI-NEXT: movk x8, #65281, lsl #16
; CHECK-GI-NEXT: cmp x0, x8
; CHECK-GI-NEXT: cset w0, ge
; CHECK-GI-NEXT: ret
%cmp = icmp sge i64 %x, -16707583
ret i1 %cmp
}
define i1 @almost_immediate_neg_uge(i32 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_uge:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, #4079, lsl #12 // =16707584
; CHECK-SD-NEXT: cset w0, hi
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_uge:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #4097 // =0x1001
; CHECK-GI-NEXT: movk w8, #65281, lsl #16
; CHECK-GI-NEXT: cmp w0, w8
; CHECK-GI-NEXT: cset w0, hs
; CHECK-GI-NEXT: ret
%cmp = icmp uge i32 %x, -16707583
ret i1 %cmp
}
define i1 @almost_immediate_neg_uge_64(i64 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_uge_64:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn x0, #4079, lsl #12 // =16707584
; CHECK-SD-NEXT: cset w0, hi
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_uge_64:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov x8, #-61439 // =0xffffffffffff1001
; CHECK-GI-NEXT: movk x8, #65281, lsl #16
; CHECK-GI-NEXT: cmp x0, x8
; CHECK-GI-NEXT: cset w0, hs
; CHECK-GI-NEXT: ret
%cmp = icmp uge i64 %x, -16707583
ret i1 %cmp
}
define i1 @almost_immediate_neg_ult(i32 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_ult:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, #4079, lsl #12 // =16707584
; CHECK-SD-NEXT: cset w0, ls
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_ult:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #4097 // =0x1001
; CHECK-GI-NEXT: movk w8, #65281, lsl #16
; CHECK-GI-NEXT: cmp w0, w8
; CHECK-GI-NEXT: cset w0, lo
; CHECK-GI-NEXT: ret
%cmp = icmp ult i32 %x, -16707583
ret i1 %cmp
}
define i1 @almost_immediate_neg_ult_64(i64 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_ult_64:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn x0, #4079, lsl #12 // =16707584
; CHECK-SD-NEXT: cset w0, ls
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_ult_64:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov x8, #-61439 // =0xffffffffffff1001
; CHECK-GI-NEXT: movk x8, #65281, lsl #16
; CHECK-GI-NEXT: cmp x0, x8
; CHECK-GI-NEXT: cset w0, lo
; CHECK-GI-NEXT: ret
%cmp = icmp ult i64 %x, -16707583
ret i1 %cmp
}
define i1 @almost_immediate_neg_sle(i32 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_sle:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, #4095, lsl #12 // =16773120
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_sle:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #-16773121 // =0xff000fff
; CHECK-GI-NEXT: cmp w0, w8
; CHECK-GI-NEXT: cset w0, le
; CHECK-GI-NEXT: ret
%cmp = icmp sle i32 %x, -16773121
ret i1 %cmp
}
define i1 @almost_immediate_neg_sle_64(i64 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_sle_64:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn x0, #4095, lsl #12 // =16773120
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_sle_64:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov x8, #-16773121 // =0xffffffffff000fff
; CHECK-GI-NEXT: cmp x0, x8
; CHECK-GI-NEXT: cset w0, le
; CHECK-GI-NEXT: ret
%cmp = icmp sle i64 %x, -16773121
ret i1 %cmp
}
define i1 @almost_immediate_neg_sgt(i32 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_sgt:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, #4095, lsl #12 // =16773120
; CHECK-SD-NEXT: cset w0, ge
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_sgt:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #-16773121 // =0xff000fff
; CHECK-GI-NEXT: cmp w0, w8
; CHECK-GI-NEXT: cset w0, gt
; CHECK-GI-NEXT: ret
%cmp = icmp sgt i32 %x, -16773121
ret i1 %cmp
}
define i1 @almost_immediate_neg_sgt_64(i64 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_sgt_64:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn x0, #4095, lsl #12 // =16773120
; CHECK-SD-NEXT: cset w0, ge
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_sgt_64:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov x8, #-16773121 // =0xffffffffff000fff
; CHECK-GI-NEXT: cmp x0, x8
; CHECK-GI-NEXT: cset w0, gt
; CHECK-GI-NEXT: ret
%cmp = icmp sgt i64 %x, -16773121
ret i1 %cmp
}
define i1 @almost_immediate_neg_ule(i32 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_ule:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, #4095, lsl #12 // =16773120
; CHECK-SD-NEXT: cset w0, lo
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_ule:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #-16773121 // =0xff000fff
; CHECK-GI-NEXT: cmp w0, w8
; CHECK-GI-NEXT: cset w0, ls
; CHECK-GI-NEXT: ret
%cmp = icmp ule i32 %x, -16773121
ret i1 %cmp
}
define i1 @almost_immediate_neg_ule_64(i64 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_ule_64:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn x0, #4095, lsl #12 // =16773120
; CHECK-SD-NEXT: cset w0, lo
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_ule_64:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov x8, #-16773121 // =0xffffffffff000fff
; CHECK-GI-NEXT: cmp x0, x8
; CHECK-GI-NEXT: cset w0, ls
; CHECK-GI-NEXT: ret
%cmp = icmp ule i64 %x, -16773121
ret i1 %cmp
}
define i1 @almost_immediate_neg_ugt(i32 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_ugt:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, #4095, lsl #12 // =16773120
; CHECK-SD-NEXT: cset w0, hs
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_ugt:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #-16773121 // =0xff000fff
; CHECK-GI-NEXT: cmp w0, w8
; CHECK-GI-NEXT: cset w0, hi
; CHECK-GI-NEXT: ret
%cmp = icmp ugt i32 %x, -16773121
ret i1 %cmp
}
define i1 @almost_immediate_neg_ugt_64(i64 %x) {
; CHECK-SD-LABEL: almost_immediate_neg_ugt_64:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn x0, #4095, lsl #12 // =16773120
; CHECK-SD-NEXT: cset w0, hs
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: almost_immediate_neg_ugt_64:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov x8, #-16773121 // =0xffffffffff000fff
; CHECK-GI-NEXT: cmp x0, x8
; CHECK-GI-NEXT: cset w0, hi
; CHECK-GI-NEXT: ret
%cmp = icmp ugt i64 %x, -16773121
ret i1 %cmp
}
define i1 @cmn_nsw(i32 %a, i32 %b) {
; CHECK-LABEL: cmn_nsw:
; CHECK: // %bb.0:
; CHECK-NEXT: cmn w0, w1
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
%sub = sub nsw i32 0, %b
%cmp = icmp sgt i32 %a, %sub
ret i1 %cmp
}
define i1 @cmn_nsw_64(i64 %a, i64 %b) {
; CHECK-LABEL: cmn_nsw_64:
; CHECK: // %bb.0:
; CHECK-NEXT: cmn x0, x1
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
%sub = sub nsw i64 0, %b
%cmp = icmp sgt i64 %a, %sub
ret i1 %cmp
}
define i1 @cmn_nsw_neg(i32 %a, i32 %b) {
; CHECK-LABEL: cmn_nsw_neg:
; CHECK: // %bb.0:
; CHECK-NEXT: neg w8, w1
; CHECK-NEXT: cmp w0, w8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
%sub = sub i32 0, %b
%cmp = icmp sgt i32 %a, %sub
ret i1 %cmp
}
define i1 @cmn_swap(i32 %a, i32 %b) {
; CHECK-SD-LABEL: cmn_swap:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: cmn w0, w1
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: cmn_swap:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: cmn w1, w0
; CHECK-GI-NEXT: cset w0, lt
; CHECK-GI-NEXT: ret
%sub = sub nsw i32 0, %b
%cmp = icmp sgt i32 %sub, %a
ret i1 %cmp
}
define i1 @cmn_nsw_neg_64(i64 %a, i64 %b) {
; CHECK-LABEL: cmn_nsw_neg_64:
; CHECK: // %bb.0:
; CHECK-NEXT: neg x8, x1
; CHECK-NEXT: cmp x0, x8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
%sub = sub i64 0, %b
%cmp = icmp sgt i64 %a, %sub
ret i1 %cmp
}