Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc < %s -O0 -fast-isel-abort -mtriple=arm64-apple-darwin | FileCheck %s
      2 ; RUN: llc < %s -O0 -fast-isel-abort -mtriple=arm64_be-linux-gnu | FileCheck %s --check-prefix=CHECK-BE
      3 
      4 define void @call0() nounwind {
      5 entry:
      6   ret void
      7 }
      8 
      9 define void @foo0() nounwind {
     10 entry:
     11 ; CHECK: foo0
     12 ; CHECK: bl _call0
     13   call void @call0()
     14   ret void
     15 }
     16 
     17 define i32 @call1(i32 %a) nounwind {
     18 entry:
     19   %a.addr = alloca i32, align 4
     20   store i32 %a, i32* %a.addr, align 4
     21   %tmp = load i32* %a.addr, align 4
     22   ret i32 %tmp
     23 }
     24 
     25 define i32 @foo1(i32 %a) nounwind {
     26 entry:
     27 ; CHECK: foo1
     28 ; CHECK: stur w0, [x29, #-4]
     29 ; CHECK-NEXT: ldur w0, [x29, #-4]
     30 ; CHECK-NEXT: bl _call1
     31   %a.addr = alloca i32, align 4
     32   store i32 %a, i32* %a.addr, align 4
     33   %tmp = load i32* %a.addr, align 4
     34   %call = call i32 @call1(i32 %tmp)
     35   ret i32 %call
     36 }
     37 
     38 define i32 @sext_(i8 %a, i16 %b) nounwind {
     39 entry:
     40 ; CHECK: @sext_
     41 ; CHECK: sxtb w0, w0
     42 ; CHECK: sxth w1, w1
     43 ; CHECK: bl _foo_sext_
     44   call void @foo_sext_(i8 signext %a, i16 signext %b)
     45   ret i32 0
     46 }
     47 
     48 declare void @foo_sext_(i8 %a, i16 %b)
     49 
     50 define i32 @zext_(i8 %a, i16 %b) nounwind {
     51 entry:
     52 ; CHECK: @zext_
     53 ; CHECK: uxtb w0, w0
     54 ; CHECK: uxth w1, w1
     55   call void @foo_zext_(i8 zeroext %a, i16 zeroext %b)
     56   ret i32 0
     57 }
     58 
     59 declare void @foo_zext_(i8 %a, i16 %b)
     60 
     61 define i32 @t1(i32 %argc, i8** nocapture %argv) {
     62 entry:
     63 ; CHECK: @t1
     64 ; The last parameter will be passed on stack via i8.
     65 ; CHECK: strb w{{[0-9]+}}, [sp]
     66 ; CHECK-NEXT: bl _bar
     67   %call = call i32 @bar(i8 zeroext 0, i8 zeroext -8, i8 zeroext -69, i8 zeroext 28, i8 zeroext 40, i8 zeroext -70, i8 zeroext 28, i8 zeroext 39, i8 zeroext -41)
     68   ret i32 0
     69 }
     70 
     71 declare i32 @bar(i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext)
     72 
     73 ; Test materialization of integers.  Target-independent selector handles this.
     74 define i32 @t2() {
     75 entry:
     76 ; CHECK: @t2
     77 ; CHECK: movz x0, #0
     78 ; CHECK: orr w1, wzr, #0xfffffff8
     79 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x3ff
     80 ; CHECK: orr w[[REG2:[0-9]+]], wzr, #0x2
     81 ; CHECK: movz w[[REG3:[0-9]+]], #0
     82 ; CHECK: orr w[[REG4:[0-9]+]], wzr, #0x1
     83 ; CHECK: uxth w2, w[[REG]]
     84 ; CHECK: sxtb w3, w[[REG2]]
     85 ; CHECK: and w4, w[[REG3]], #0x1
     86 ; CHECK: and w5, w[[REG4]], #0x1
     87 ; CHECK: bl	_func2
     88   %call = call i32 @func2(i64 zeroext 0, i32 signext -8, i16 zeroext 1023, i8 signext -254, i1 zeroext 0, i1 zeroext 1)
     89   ret i32 0
     90 }
     91 
     92 declare i32 @func2(i64 zeroext, i32 signext, i16 zeroext, i8 signext, i1 zeroext, i1 zeroext)
     93 
     94 declare void @callee_b0f(i8 %bp10, i8 %bp11, i8 %bp12, i8 %bp13, i8 %bp14, i8 %bp15, i8 %bp17, i8 %bp18, i8 %bp19)
     95 define void @caller_b1f() {
     96 entry:
     97   ; CHECK-BE: strb w{{.*}}, [sp, #7]
     98   call void @callee_b0f(i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 42)
     99   ret void
    100 }
    101