| ; 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 |
| } |