Home | History | Annotate | Download | only in SystemZ
      1 ; Like frame-02.ll, but with doubles rather than floats.  Internally this
      2 ; uses a different register class, but the set of saved and restored
      3 ; registers should be the same.
      4 ;
      5 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      6 
      7 ; This function should require all FPRs, but no other spill slots.
      8 ; We need to save and restore 8 of the 16 FPRs, so the frame size
      9 ; should be exactly 160 + 8 * 8 = 224.  The CFA offset is 160
     10 ; (the caller-allocated part of the frame) + 224.
     11 define void @f1(double *%ptr) {
     12 ; CHECK-LABEL: f1:
     13 ; CHECK: aghi %r15, -224
     14 ; CHECK: .cfi_def_cfa_offset 384
     15 ; CHECK: std %f8, 216(%r15)
     16 ; CHECK: std %f9, 208(%r15)
     17 ; CHECK: std %f10, 200(%r15)
     18 ; CHECK: std %f11, 192(%r15)
     19 ; CHECK: std %f12, 184(%r15)
     20 ; CHECK: std %f13, 176(%r15)
     21 ; CHECK: std %f14, 168(%r15)
     22 ; CHECK: std %f15, 160(%r15)
     23 ; CHECK: .cfi_offset %f8, -168
     24 ; CHECK: .cfi_offset %f9, -176
     25 ; CHECK: .cfi_offset %f10, -184
     26 ; CHECK: .cfi_offset %f11, -192
     27 ; CHECK: .cfi_offset %f12, -200
     28 ; CHECK: .cfi_offset %f13, -208
     29 ; CHECK: .cfi_offset %f14, -216
     30 ; CHECK: .cfi_offset %f15, -224
     31 ; ...main function body...
     32 ; CHECK: ld %f8, 216(%r15)
     33 ; CHECK: ld %f9, 208(%r15)
     34 ; CHECK: ld %f10, 200(%r15)
     35 ; CHECK: ld %f11, 192(%r15)
     36 ; CHECK: ld %f12, 184(%r15)
     37 ; CHECK: ld %f13, 176(%r15)
     38 ; CHECK: ld %f14, 168(%r15)
     39 ; CHECK: ld %f15, 160(%r15)
     40 ; CHECK: aghi %r15, 224
     41 ; CHECK: br %r14
     42   %l0 = load volatile double *%ptr
     43   %l1 = load volatile double *%ptr
     44   %l2 = load volatile double *%ptr
     45   %l3 = load volatile double *%ptr
     46   %l4 = load volatile double *%ptr
     47   %l5 = load volatile double *%ptr
     48   %l6 = load volatile double *%ptr
     49   %l7 = load volatile double *%ptr
     50   %l8 = load volatile double *%ptr
     51   %l9 = load volatile double *%ptr
     52   %l10 = load volatile double *%ptr
     53   %l11 = load volatile double *%ptr
     54   %l12 = load volatile double *%ptr
     55   %l13 = load volatile double *%ptr
     56   %l14 = load volatile double *%ptr
     57   %l15 = load volatile double *%ptr
     58   %add0 = fadd double %l0, %l0
     59   %add1 = fadd double %l1, %add0
     60   %add2 = fadd double %l2, %add1
     61   %add3 = fadd double %l3, %add2
     62   %add4 = fadd double %l4, %add3
     63   %add5 = fadd double %l5, %add4
     64   %add6 = fadd double %l6, %add5
     65   %add7 = fadd double %l7, %add6
     66   %add8 = fadd double %l8, %add7
     67   %add9 = fadd double %l9, %add8
     68   %add10 = fadd double %l10, %add9
     69   %add11 = fadd double %l11, %add10
     70   %add12 = fadd double %l12, %add11
     71   %add13 = fadd double %l13, %add12
     72   %add14 = fadd double %l14, %add13
     73   %add15 = fadd double %l15, %add14
     74   store volatile double %add0, double *%ptr
     75   store volatile double %add1, double *%ptr
     76   store volatile double %add2, double *%ptr
     77   store volatile double %add3, double *%ptr
     78   store volatile double %add4, double *%ptr
     79   store volatile double %add5, double *%ptr
     80   store volatile double %add6, double *%ptr
     81   store volatile double %add7, double *%ptr
     82   store volatile double %add8, double *%ptr
     83   store volatile double %add9, double *%ptr
     84   store volatile double %add10, double *%ptr
     85   store volatile double %add11, double *%ptr
     86   store volatile double %add12, double *%ptr
     87   store volatile double %add13, double *%ptr
     88   store volatile double %add14, double *%ptr
     89   store volatile double %add15, double *%ptr
     90   ret void
     91 }
     92 
     93 ; Like f1, but requires one fewer FPR.  We allocate in numerical order,
     94 ; so %f15 is the one that gets dropped.
     95 define void @f2(double *%ptr) {
     96 ; CHECK-LABEL: f2:
     97 ; CHECK: aghi %r15, -216
     98 ; CHECK: .cfi_def_cfa_offset 376
     99 ; CHECK: std %f8, 208(%r15)
    100 ; CHECK: std %f9, 200(%r15)
    101 ; CHECK: std %f10, 192(%r15)
    102 ; CHECK: std %f11, 184(%r15)
    103 ; CHECK: std %f12, 176(%r15)
    104 ; CHECK: std %f13, 168(%r15)
    105 ; CHECK: std %f14, 160(%r15)
    106 ; CHECK: .cfi_offset %f8, -168
    107 ; CHECK: .cfi_offset %f9, -176
    108 ; CHECK: .cfi_offset %f10, -184
    109 ; CHECK: .cfi_offset %f11, -192
    110 ; CHECK: .cfi_offset %f12, -200
    111 ; CHECK: .cfi_offset %f13, -208
    112 ; CHECK: .cfi_offset %f14, -216
    113 ; CHECK-NOT: %f15
    114 ; ...main function body...
    115 ; CHECK: ld %f8, 208(%r15)
    116 ; CHECK: ld %f9, 200(%r15)
    117 ; CHECK: ld %f10, 192(%r15)
    118 ; CHECK: ld %f11, 184(%r15)
    119 ; CHECK: ld %f12, 176(%r15)
    120 ; CHECK: ld %f13, 168(%r15)
    121 ; CHECK: ld %f14, 160(%r15)
    122 ; CHECK: aghi %r15, 216
    123 ; CHECK: br %r14
    124   %l0 = load volatile double *%ptr
    125   %l1 = load volatile double *%ptr
    126   %l2 = load volatile double *%ptr
    127   %l3 = load volatile double *%ptr
    128   %l4 = load volatile double *%ptr
    129   %l5 = load volatile double *%ptr
    130   %l6 = load volatile double *%ptr
    131   %l7 = load volatile double *%ptr
    132   %l8 = load volatile double *%ptr
    133   %l9 = load volatile double *%ptr
    134   %l10 = load volatile double *%ptr
    135   %l11 = load volatile double *%ptr
    136   %l12 = load volatile double *%ptr
    137   %l13 = load volatile double *%ptr
    138   %l14 = load volatile double *%ptr
    139   %add0 = fadd double %l0, %l0
    140   %add1 = fadd double %l1, %add0
    141   %add2 = fadd double %l2, %add1
    142   %add3 = fadd double %l3, %add2
    143   %add4 = fadd double %l4, %add3
    144   %add5 = fadd double %l5, %add4
    145   %add6 = fadd double %l6, %add5
    146   %add7 = fadd double %l7, %add6
    147   %add8 = fadd double %l8, %add7
    148   %add9 = fadd double %l9, %add8
    149   %add10 = fadd double %l10, %add9
    150   %add11 = fadd double %l11, %add10
    151   %add12 = fadd double %l12, %add11
    152   %add13 = fadd double %l13, %add12
    153   %add14 = fadd double %l14, %add13
    154   store volatile double %add0, double *%ptr
    155   store volatile double %add1, double *%ptr
    156   store volatile double %add2, double *%ptr
    157   store volatile double %add3, double *%ptr
    158   store volatile double %add4, double *%ptr
    159   store volatile double %add5, double *%ptr
    160   store volatile double %add6, double *%ptr
    161   store volatile double %add7, double *%ptr
    162   store volatile double %add8, double *%ptr
    163   store volatile double %add9, double *%ptr
    164   store volatile double %add10, double *%ptr
    165   store volatile double %add11, double *%ptr
    166   store volatile double %add12, double *%ptr
    167   store volatile double %add13, double *%ptr
    168   store volatile double %add14, double *%ptr
    169   ret void
    170 }
    171 
    172 ; Like f1, but should require only one call-saved FPR.
    173 define void @f3(double *%ptr) {
    174 ; CHECK-LABEL: f3:
    175 ; CHECK: aghi %r15, -168
    176 ; CHECK: .cfi_def_cfa_offset 328
    177 ; CHECK: std %f8, 160(%r15)
    178 ; CHECK: .cfi_offset %f8, -168
    179 ; CHECK-NOT: %f9
    180 ; CHECK-NOT: %f10
    181 ; CHECK-NOT: %f11
    182 ; CHECK-NOT: %f12
    183 ; CHECK-NOT: %f13
    184 ; CHECK-NOT: %f14
    185 ; CHECK-NOT: %f15
    186 ; ...main function body...
    187 ; CHECK: ld %f8, 160(%r15)
    188 ; CHECK: aghi %r15, 168
    189 ; CHECK: br %r14
    190   %l0 = load volatile double *%ptr
    191   %l1 = load volatile double *%ptr
    192   %l2 = load volatile double *%ptr
    193   %l3 = load volatile double *%ptr
    194   %l4 = load volatile double *%ptr
    195   %l5 = load volatile double *%ptr
    196   %l6 = load volatile double *%ptr
    197   %l7 = load volatile double *%ptr
    198   %l8 = load volatile double *%ptr
    199   %add0 = fadd double %l0, %l0
    200   %add1 = fadd double %l1, %add0
    201   %add2 = fadd double %l2, %add1
    202   %add3 = fadd double %l3, %add2
    203   %add4 = fadd double %l4, %add3
    204   %add5 = fadd double %l5, %add4
    205   %add6 = fadd double %l6, %add5
    206   %add7 = fadd double %l7, %add6
    207   %add8 = fadd double %l8, %add7
    208   store volatile double %add0, double *%ptr
    209   store volatile double %add1, double *%ptr
    210   store volatile double %add2, double *%ptr
    211   store volatile double %add3, double *%ptr
    212   store volatile double %add4, double *%ptr
    213   store volatile double %add5, double *%ptr
    214   store volatile double %add6, double *%ptr
    215   store volatile double %add7, double *%ptr
    216   store volatile double %add8, double *%ptr
    217   ret void
    218 }
    219 
    220 ; This function should use all call-clobbered FPRs but no call-saved ones.
    221 ; It shouldn't need to create a frame.
    222 define void @f4(double *%ptr) {
    223 ; CHECK-LABEL: f4:
    224 ; CHECK-NOT: %r15
    225 ; CHECK-NOT: %f8
    226 ; CHECK-NOT: %f9
    227 ; CHECK-NOT: %f10
    228 ; CHECK-NOT: %f11
    229 ; CHECK-NOT: %f12
    230 ; CHECK-NOT: %f13
    231 ; CHECK-NOT: %f14
    232 ; CHECK-NOT: %f15
    233 ; CHECK: br %r14
    234   %l0 = load volatile double *%ptr
    235   %l1 = load volatile double *%ptr
    236   %l2 = load volatile double *%ptr
    237   %l3 = load volatile double *%ptr
    238   %l4 = load volatile double *%ptr
    239   %l5 = load volatile double *%ptr
    240   %l6 = load volatile double *%ptr
    241   %l7 = load volatile double *%ptr
    242   %add0 = fadd double %l0, %l0
    243   %add1 = fadd double %l1, %add0
    244   %add2 = fadd double %l2, %add1
    245   %add3 = fadd double %l3, %add2
    246   %add4 = fadd double %l4, %add3
    247   %add5 = fadd double %l5, %add4
    248   %add6 = fadd double %l6, %add5
    249   %add7 = fadd double %l7, %add6
    250   store volatile double %add0, double *%ptr
    251   store volatile double %add1, double *%ptr
    252   store volatile double %add2, double *%ptr
    253   store volatile double %add3, double *%ptr
    254   store volatile double %add4, double *%ptr
    255   store volatile double %add5, double *%ptr
    256   store volatile double %add6, double *%ptr
    257   store volatile double %add7, double *%ptr
    258   ret void
    259 }
    260