| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=aarch64-uknown-uknown -verify-machineinstrs -o - %s | FileCheck %s |
| |
| declare void @call() |
| |
| define i1 @cmp_i128_eq(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_eq: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: ccmp x1, x3, #0, eq |
| ; CHECK-NEXT: cset w0, eq |
| ; CHECK-NEXT: ret |
| %cmp = icmp eq i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_ne(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_ne: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: ccmp x1, x3, #0, eq |
| ; CHECK-NEXT: cset w0, ne |
| ; CHECK-NEXT: ret |
| %cmp = icmp ne i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_ugt(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_ugt: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x2, x0 |
| ; CHECK-NEXT: sbcs xzr, x3, x1 |
| ; CHECK-NEXT: cset w0, lo |
| ; CHECK-NEXT: ret |
| %cmp = icmp ugt i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_uge(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_uge: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: sbcs xzr, x1, x3 |
| ; CHECK-NEXT: cset w0, hs |
| ; CHECK-NEXT: ret |
| %cmp = icmp uge i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_ult(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_ult: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: sbcs xzr, x1, x3 |
| ; CHECK-NEXT: cset w0, lo |
| ; CHECK-NEXT: ret |
| %cmp = icmp ult i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_ule(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_ule: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x2, x0 |
| ; CHECK-NEXT: sbcs xzr, x3, x1 |
| ; CHECK-NEXT: cset w0, hs |
| ; CHECK-NEXT: ret |
| %cmp = icmp ule i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_sgt(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_sgt: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x2, x0 |
| ; CHECK-NEXT: sbcs xzr, x3, x1 |
| ; CHECK-NEXT: cset w0, lt |
| ; CHECK-NEXT: ret |
| %cmp = icmp sgt i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_sge(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_sge: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: sbcs xzr, x1, x3 |
| ; CHECK-NEXT: cset w0, ge |
| ; CHECK-NEXT: ret |
| %cmp = icmp sge i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_slt(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_slt: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: sbcs xzr, x1, x3 |
| ; CHECK-NEXT: cset w0, lt |
| ; CHECK-NEXT: ret |
| %cmp = icmp slt i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define i1 @cmp_i128_sle(i128 %a, i128 %b) { |
| ; CHECK-LABEL: cmp_i128_sle: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x2, x0 |
| ; CHECK-NEXT: sbcs xzr, x3, x1 |
| ; CHECK-NEXT: cset w0, ge |
| ; CHECK-NEXT: ret |
| %cmp = icmp sle i128 %a, %b |
| ret i1 %cmp |
| } |
| |
| define void @br_on_cmp_i128_eq(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_eq: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x1, x3 |
| ; CHECK-NEXT: ccmp x0, x2, #0, eq |
| ; CHECK-NEXT: b.ne .LBB10_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB10_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp eq i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_ne(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_ne: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x1, x3 |
| ; CHECK-NEXT: ccmp x0, x2, #0, eq |
| ; CHECK-NEXT: b.eq .LBB11_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB11_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp ne i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_ugt(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_ugt: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x2, x0 |
| ; CHECK-NEXT: sbcs xzr, x3, x1 |
| ; CHECK-NEXT: b.hs .LBB12_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB12_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp ugt i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_uge(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_uge: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: sbcs xzr, x1, x3 |
| ; CHECK-NEXT: b.lo .LBB13_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB13_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp uge i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_ult(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_ult: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: sbcs xzr, x1, x3 |
| ; CHECK-NEXT: b.hs .LBB14_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB14_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp ult i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_ule(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_ule: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x2, x0 |
| ; CHECK-NEXT: sbcs xzr, x3, x1 |
| ; CHECK-NEXT: b.lo .LBB15_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB15_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp ule i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_sgt(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_sgt: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x2, x0 |
| ; CHECK-NEXT: sbcs xzr, x3, x1 |
| ; CHECK-NEXT: b.ge .LBB16_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB16_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp sgt i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_sge(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_sge: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: sbcs xzr, x1, x3 |
| ; CHECK-NEXT: b.lt .LBB17_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB17_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp sge i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_slt(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_slt: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x0, x2 |
| ; CHECK-NEXT: sbcs xzr, x1, x3 |
| ; CHECK-NEXT: b.ge .LBB18_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB18_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp slt i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |
| define void @br_on_cmp_i128_sle(i128 %a, i128 %b) nounwind { |
| ; CHECK-LABEL: br_on_cmp_i128_sle: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: cmp x2, x0 |
| ; CHECK-NEXT: sbcs xzr, x3, x1 |
| ; CHECK-NEXT: b.lt .LBB19_2 |
| ; CHECK-NEXT: // %bb.1: // %call |
| ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill |
| ; CHECK-NEXT: bl call |
| ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload |
| ; CHECK-NEXT: .LBB19_2: // %exit |
| ; CHECK-NEXT: ret |
| %cmp = icmp sle i128 %a, %b |
| br i1 %cmp, label %call, label %exit |
| call: |
| call void @call() |
| br label %exit |
| exit: |
| ret void |
| } |
| |