1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64-uknown-uknown -verify-machineinstrs -o - %s | FileCheck %s 3 4declare void @call() 5 6define i1 @cmp_i128_eq(i128 %a, i128 %b) { 7; CHECK-LABEL: cmp_i128_eq: 8; CHECK: // %bb.0: 9; CHECK-NEXT: cmp x0, x2 10; CHECK-NEXT: ccmp x1, x3, #0, eq 11; CHECK-NEXT: cset w0, eq 12; CHECK-NEXT: ret 13 %cmp = icmp eq i128 %a, %b 14 ret i1 %cmp 15} 16 17define i1 @cmp_i128_ne(i128 %a, i128 %b) { 18; CHECK-LABEL: cmp_i128_ne: 19; CHECK: // %bb.0: 20; CHECK-NEXT: cmp x0, x2 21; CHECK-NEXT: ccmp x1, x3, #0, eq 22; CHECK-NEXT: cset w0, ne 23; CHECK-NEXT: ret 24 %cmp = icmp ne i128 %a, %b 25 ret i1 %cmp 26} 27 28define i1 @cmp_i128_ugt(i128 %a, i128 %b) { 29; CHECK-LABEL: cmp_i128_ugt: 30; CHECK: // %bb.0: 31; CHECK-NEXT: cmp x2, x0 32; CHECK-NEXT: sbcs xzr, x3, x1 33; CHECK-NEXT: cset w0, lo 34; CHECK-NEXT: ret 35 %cmp = icmp ugt i128 %a, %b 36 ret i1 %cmp 37} 38 39define i1 @cmp_i128_uge(i128 %a, i128 %b) { 40; CHECK-LABEL: cmp_i128_uge: 41; CHECK: // %bb.0: 42; CHECK-NEXT: cmp x0, x2 43; CHECK-NEXT: sbcs xzr, x1, x3 44; CHECK-NEXT: cset w0, hs 45; CHECK-NEXT: ret 46 %cmp = icmp uge i128 %a, %b 47 ret i1 %cmp 48} 49 50define i1 @cmp_i128_ult(i128 %a, i128 %b) { 51; CHECK-LABEL: cmp_i128_ult: 52; CHECK: // %bb.0: 53; CHECK-NEXT: cmp x0, x2 54; CHECK-NEXT: sbcs xzr, x1, x3 55; CHECK-NEXT: cset w0, lo 56; CHECK-NEXT: ret 57 %cmp = icmp ult i128 %a, %b 58 ret i1 %cmp 59} 60 61define i1 @cmp_i128_ule(i128 %a, i128 %b) { 62; CHECK-LABEL: cmp_i128_ule: 63; CHECK: // %bb.0: 64; CHECK-NEXT: cmp x2, x0 65; CHECK-NEXT: sbcs xzr, x3, x1 66; CHECK-NEXT: cset w0, hs 67; CHECK-NEXT: ret 68 %cmp = icmp ule i128 %a, %b 69 ret i1 %cmp 70} 71 72define i1 @cmp_i128_sgt(i128 %a, i128 %b) { 73; CHECK-LABEL: cmp_i128_sgt: 74; CHECK: // %bb.0: 75; CHECK-NEXT: cmp x2, x0 76; CHECK-NEXT: sbcs xzr, x3, x1 77; CHECK-NEXT: cset w0, lt 78; CHECK-NEXT: ret 79 %cmp = icmp sgt i128 %a, %b 80 ret i1 %cmp 81} 82 83define i1 @cmp_i128_sge(i128 %a, i128 %b) { 84; CHECK-LABEL: cmp_i128_sge: 85; CHECK: // %bb.0: 86; CHECK-NEXT: cmp x0, x2 87; CHECK-NEXT: sbcs xzr, x1, x3 88; CHECK-NEXT: cset w0, ge 89; CHECK-NEXT: ret 90 %cmp = icmp sge i128 %a, %b 91 ret i1 %cmp 92} 93 94define i1 @cmp_i128_slt(i128 %a, i128 %b) { 95; CHECK-LABEL: cmp_i128_slt: 96; CHECK: // %bb.0: 97; CHECK-NEXT: cmp x0, x2 98; CHECK-NEXT: sbcs xzr, x1, x3 99; CHECK-NEXT: cset w0, lt 100; CHECK-NEXT: ret 101 %cmp = icmp slt i128 %a, %b 102 ret i1 %cmp 103} 104 105define i1 @cmp_i128_sle(i128 %a, i128 %b) { 106; CHECK-LABEL: cmp_i128_sle: 107; CHECK: // %bb.0: 108; CHECK-NEXT: cmp x2, x0 109; CHECK-NEXT: sbcs xzr, x3, x1 110; CHECK-NEXT: cset w0, ge 111; CHECK-NEXT: ret 112 %cmp = icmp sle i128 %a, %b 113 ret i1 %cmp 114} 115 116define void @br_on_cmp_i128_eq(i128 %a, i128 %b) nounwind { 117; CHECK-LABEL: br_on_cmp_i128_eq: 118; CHECK: // %bb.0: 119; CHECK-NEXT: cmp x1, x3 120; CHECK-NEXT: ccmp x0, x2, #0, eq 121; CHECK-NEXT: b.ne .LBB10_2 122; CHECK-NEXT: // %bb.1: // %call 123; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 124; CHECK-NEXT: bl call 125; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 126; CHECK-NEXT: .LBB10_2: // %exit 127; CHECK-NEXT: ret 128 %cmp = icmp eq i128 %a, %b 129 br i1 %cmp, label %call, label %exit 130call: 131 call void @call() 132 br label %exit 133exit: 134 ret void 135} 136 137define void @br_on_cmp_i128_ne(i128 %a, i128 %b) nounwind { 138; CHECK-LABEL: br_on_cmp_i128_ne: 139; CHECK: // %bb.0: 140; CHECK-NEXT: cmp x1, x3 141; CHECK-NEXT: ccmp x0, x2, #0, eq 142; CHECK-NEXT: b.eq .LBB11_2 143; CHECK-NEXT: // %bb.1: // %call 144; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 145; CHECK-NEXT: bl call 146; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 147; CHECK-NEXT: .LBB11_2: // %exit 148; CHECK-NEXT: ret 149 %cmp = icmp ne i128 %a, %b 150 br i1 %cmp, label %call, label %exit 151call: 152 call void @call() 153 br label %exit 154exit: 155 ret void 156} 157 158define void @br_on_cmp_i128_ugt(i128 %a, i128 %b) nounwind { 159; CHECK-LABEL: br_on_cmp_i128_ugt: 160; CHECK: // %bb.0: 161; CHECK-NEXT: cmp x2, x0 162; CHECK-NEXT: sbcs xzr, x3, x1 163; CHECK-NEXT: b.hs .LBB12_2 164; CHECK-NEXT: // %bb.1: // %call 165; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 166; CHECK-NEXT: bl call 167; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 168; CHECK-NEXT: .LBB12_2: // %exit 169; CHECK-NEXT: ret 170 %cmp = icmp ugt i128 %a, %b 171 br i1 %cmp, label %call, label %exit 172call: 173 call void @call() 174 br label %exit 175exit: 176 ret void 177} 178 179define void @br_on_cmp_i128_uge(i128 %a, i128 %b) nounwind { 180; CHECK-LABEL: br_on_cmp_i128_uge: 181; CHECK: // %bb.0: 182; CHECK-NEXT: cmp x0, x2 183; CHECK-NEXT: sbcs xzr, x1, x3 184; CHECK-NEXT: b.lo .LBB13_2 185; CHECK-NEXT: // %bb.1: // %call 186; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 187; CHECK-NEXT: bl call 188; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 189; CHECK-NEXT: .LBB13_2: // %exit 190; CHECK-NEXT: ret 191 %cmp = icmp uge i128 %a, %b 192 br i1 %cmp, label %call, label %exit 193call: 194 call void @call() 195 br label %exit 196exit: 197 ret void 198} 199 200define void @br_on_cmp_i128_ult(i128 %a, i128 %b) nounwind { 201; CHECK-LABEL: br_on_cmp_i128_ult: 202; CHECK: // %bb.0: 203; CHECK-NEXT: cmp x0, x2 204; CHECK-NEXT: sbcs xzr, x1, x3 205; CHECK-NEXT: b.hs .LBB14_2 206; CHECK-NEXT: // %bb.1: // %call 207; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 208; CHECK-NEXT: bl call 209; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 210; CHECK-NEXT: .LBB14_2: // %exit 211; CHECK-NEXT: ret 212 %cmp = icmp ult i128 %a, %b 213 br i1 %cmp, label %call, label %exit 214call: 215 call void @call() 216 br label %exit 217exit: 218 ret void 219} 220 221define void @br_on_cmp_i128_ule(i128 %a, i128 %b) nounwind { 222; CHECK-LABEL: br_on_cmp_i128_ule: 223; CHECK: // %bb.0: 224; CHECK-NEXT: cmp x2, x0 225; CHECK-NEXT: sbcs xzr, x3, x1 226; CHECK-NEXT: b.lo .LBB15_2 227; CHECK-NEXT: // %bb.1: // %call 228; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 229; CHECK-NEXT: bl call 230; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 231; CHECK-NEXT: .LBB15_2: // %exit 232; CHECK-NEXT: ret 233 %cmp = icmp ule i128 %a, %b 234 br i1 %cmp, label %call, label %exit 235call: 236 call void @call() 237 br label %exit 238exit: 239 ret void 240} 241 242define void @br_on_cmp_i128_sgt(i128 %a, i128 %b) nounwind { 243; CHECK-LABEL: br_on_cmp_i128_sgt: 244; CHECK: // %bb.0: 245; CHECK-NEXT: cmp x2, x0 246; CHECK-NEXT: sbcs xzr, x3, x1 247; CHECK-NEXT: b.ge .LBB16_2 248; CHECK-NEXT: // %bb.1: // %call 249; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 250; CHECK-NEXT: bl call 251; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 252; CHECK-NEXT: .LBB16_2: // %exit 253; CHECK-NEXT: ret 254 %cmp = icmp sgt i128 %a, %b 255 br i1 %cmp, label %call, label %exit 256call: 257 call void @call() 258 br label %exit 259exit: 260 ret void 261} 262 263define void @br_on_cmp_i128_sge(i128 %a, i128 %b) nounwind { 264; CHECK-LABEL: br_on_cmp_i128_sge: 265; CHECK: // %bb.0: 266; CHECK-NEXT: cmp x0, x2 267; CHECK-NEXT: sbcs xzr, x1, x3 268; CHECK-NEXT: b.lt .LBB17_2 269; CHECK-NEXT: // %bb.1: // %call 270; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 271; CHECK-NEXT: bl call 272; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 273; CHECK-NEXT: .LBB17_2: // %exit 274; CHECK-NEXT: ret 275 %cmp = icmp sge i128 %a, %b 276 br i1 %cmp, label %call, label %exit 277call: 278 call void @call() 279 br label %exit 280exit: 281 ret void 282} 283 284define void @br_on_cmp_i128_slt(i128 %a, i128 %b) nounwind { 285; CHECK-LABEL: br_on_cmp_i128_slt: 286; CHECK: // %bb.0: 287; CHECK-NEXT: cmp x0, x2 288; CHECK-NEXT: sbcs xzr, x1, x3 289; CHECK-NEXT: b.ge .LBB18_2 290; CHECK-NEXT: // %bb.1: // %call 291; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 292; CHECK-NEXT: bl call 293; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 294; CHECK-NEXT: .LBB18_2: // %exit 295; CHECK-NEXT: ret 296 %cmp = icmp slt i128 %a, %b 297 br i1 %cmp, label %call, label %exit 298call: 299 call void @call() 300 br label %exit 301exit: 302 ret void 303} 304 305define void @br_on_cmp_i128_sle(i128 %a, i128 %b) nounwind { 306; CHECK-LABEL: br_on_cmp_i128_sle: 307; CHECK: // %bb.0: 308; CHECK-NEXT: cmp x2, x0 309; CHECK-NEXT: sbcs xzr, x3, x1 310; CHECK-NEXT: b.lt .LBB19_2 311; CHECK-NEXT: // %bb.1: // %call 312; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 313; CHECK-NEXT: bl call 314; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 315; CHECK-NEXT: .LBB19_2: // %exit 316; CHECK-NEXT: ret 317 %cmp = icmp sle i128 %a, %b 318 br i1 %cmp, label %call, label %exit 319call: 320 call void @call() 321 br label %exit 322exit: 323 ret void 324} 325 326