Home | History | Annotate | Download | only in SystemZ
      1 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      2 
      3 declare float @llvm.fma.f32(float %f1, float %f2, float %f3)
      4 
      5 define float @f1(float %f1, float %f2, float %acc) {
      6 ; CHECK-LABEL: f1:
      7 ; CHECK: maebr %f4, %f0, %f2
      8 ; CHECK: ler %f0, %f4
      9 ; CHECK: br %r14
     10   %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
     11   ret float %res
     12 }
     13 
     14 define float @f2(float %f1, float *%ptr, float %acc) {
     15 ; CHECK-LABEL: f2:
     16 ; CHECK: maeb %f2, %f0, 0(%r2)
     17 ; CHECK: ler %f0, %f2
     18 ; CHECK: br %r14
     19   %f2 = load float *%ptr
     20   %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
     21   ret float %res
     22 }
     23 
     24 define float @f3(float %f1, float *%base, float %acc) {
     25 ; CHECK-LABEL: f3:
     26 ; CHECK: maeb %f2, %f0, 4092(%r2)
     27 ; CHECK: ler %f0, %f2
     28 ; CHECK: br %r14
     29   %ptr = getelementptr float *%base, i64 1023
     30   %f2 = load float *%ptr
     31   %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
     32   ret float %res
     33 }
     34 
     35 define float @f4(float %f1, float *%base, float %acc) {
     36 ; The important thing here is that we don't generate an out-of-range
     37 ; displacement.  Other sequences besides this one would be OK.
     38 ;
     39 ; CHECK-LABEL: f4:
     40 ; CHECK: aghi %r2, 4096
     41 ; CHECK: maeb %f2, %f0, 0(%r2)
     42 ; CHECK: ler %f0, %f2
     43 ; CHECK: br %r14
     44   %ptr = getelementptr float *%base, i64 1024
     45   %f2 = load float *%ptr
     46   %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
     47   ret float %res
     48 }
     49 
     50 define float @f5(float %f1, float *%base, float %acc) {
     51 ; Here too the important thing is that we don't generate an out-of-range
     52 ; displacement.  Other sequences besides this one would be OK.
     53 ;
     54 ; CHECK-LABEL: f5:
     55 ; CHECK: aghi %r2, -4
     56 ; CHECK: maeb %f2, %f0, 0(%r2)
     57 ; CHECK: ler %f0, %f2
     58 ; CHECK: br %r14
     59   %ptr = getelementptr float *%base, i64 -1
     60   %f2 = load float *%ptr
     61   %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
     62   ret float %res
     63 }
     64 
     65 define float @f6(float %f1, float *%base, i64 %index, float %acc) {
     66 ; CHECK-LABEL: f6:
     67 ; CHECK: sllg %r1, %r3, 2
     68 ; CHECK: maeb %f2, %f0, 0(%r1,%r2)
     69 ; CHECK: ler %f0, %f2
     70 ; CHECK: br %r14
     71   %ptr = getelementptr float *%base, i64 %index
     72   %f2 = load float *%ptr
     73   %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
     74   ret float %res
     75 }
     76 
     77 define float @f7(float %f1, float *%base, i64 %index, float %acc) {
     78 ; CHECK-LABEL: f7:
     79 ; CHECK: sllg %r1, %r3, 2
     80 ; CHECK: maeb %f2, %f0, 4092({{%r1,%r2|%r2,%r1}})
     81 ; CHECK: ler %f0, %f2
     82 ; CHECK: br %r14
     83   %index2 = add i64 %index, 1023
     84   %ptr = getelementptr float *%base, i64 %index2
     85   %f2 = load float *%ptr
     86   %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
     87   ret float %res
     88 }
     89 
     90 define float @f8(float %f1, float *%base, i64 %index, float %acc) {
     91 ; CHECK-LABEL: f8:
     92 ; CHECK: sllg %r1, %r3, 2
     93 ; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})
     94 ; CHECK: maeb %f2, %f0, 0(%r1)
     95 ; CHECK: ler %f0, %f2
     96 ; CHECK: br %r14
     97   %index2 = add i64 %index, 1024
     98   %ptr = getelementptr float *%base, i64 %index2
     99   %f2 = load float *%ptr
    100   %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)
    101   ret float %res
    102 }
    103