Home | History | Annotate | Download | only in PowerPC
      1 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -mattr=+vsx | FileCheck %s
      2 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -mattr=+vsx -fast-isel -O0 | FileCheck -check-prefix=CHECK-FISL %s
      3 define void @test1sp(float %a, float %b, float %c, float %e, float* nocapture %d) #0 {
      4 entry:
      5   %0 = tail call float @llvm.fma.f32(float %b, float %c, float %a)
      6   store float %0, float* %d, align 4
      7   %1 = tail call float @llvm.fma.f32(float %b, float %e, float %a)
      8   %arrayidx1 = getelementptr inbounds float, float* %d, i64 1
      9   store float %1, float* %arrayidx1, align 4
     10   ret void
     11 
     12 ; CHECK-LABEL: @test1sp
     13 ; CHECK-DAG: li [[C1:[0-9]+]], 4
     14 ; CHECK-DAG: xsmaddmsp 3, 2, 1
     15 ; CHECK-DAG: xsmaddasp 1, 2, 4
     16 ; CHECK-DAG: stxsspx 3, 0, 7
     17 ; CHECK-DAG: stxsspx 1, 7, [[C1]]
     18 ; CHECK: blr
     19 
     20 ; CHECK-FISL-LABEL: @test1sp
     21 ; CHECK-FISL-DAG: fmr 0, 1
     22 ; CHECK-FISL-DAG: xsmaddasp 0, 2, 3
     23 ; CHECK-FISL-DAG: stxsspx 0, 0, 7
     24 ; CHECK-FISL-DAG: xsmaddasp 1, 2, 4
     25 ; CHECK-FISL-DAG: li [[C1:[0-9]+]], 4
     26 ; CHECK-FISL-DAG: stxsspx 1, 7, [[C1]]
     27 ; CHECK-FISL: blr
     28 }
     29 
     30 define void @test2sp(float %a, float %b, float %c, float %e, float %f, float* nocapture %d) #0 {
     31 entry:
     32   %0 = tail call float @llvm.fma.f32(float %b, float %c, float %a)
     33   store float %0, float* %d, align 4
     34   %1 = tail call float @llvm.fma.f32(float %b, float %e, float %a)
     35   %arrayidx1 = getelementptr inbounds float, float* %d, i64 1
     36   store float %1, float* %arrayidx1, align 4
     37   %2 = tail call float @llvm.fma.f32(float %b, float %f, float %a)
     38   %arrayidx2 = getelementptr inbounds float, float* %d, i64 2
     39   store float %2, float* %arrayidx2, align 4
     40   ret void
     41 
     42 ; CHECK-LABEL: @test2sp
     43 ; CHECK-DAG: li [[C1:[0-9]+]], 4
     44 ; CHECK-DAG: li [[C2:[0-9]+]], 8
     45 ; FIXME: We now miss this because of copy ordering at the MI level.
     46 ; CHECX-DAG: xsmaddmsp 3, 2, 1
     47 ; CHECX-DAG: xsmaddmsp 4, 2, 1
     48 ; CHECX-DAG: xsmaddasp 1, 2, 5
     49 ; CHECX-DAG: stxsspx 3, 0, 8
     50 ; CHECX-DAG: stxsspx 4, 8, [[C1]]
     51 ; CHECX-DAG: stxsspx 1, 8, [[C2]]
     52 ; CHECK: blr
     53 
     54 ; CHECK-FISL-LABEL: @test2sp
     55 ; CHECK-FISL-DAG: fmr 0, 1
     56 ; CHECK-FISL-DAG: xsmaddasp 0, 2, 3
     57 ; CHECK-FISL-DAG: stxsspx 0, 0, 8
     58 ; CHECK-FISL-DAG: fmr 0, 1
     59 ; CHECK-FISL-DAG: xsmaddasp 0, 2, 4
     60 ; CHECK-FISL-DAG: li [[C1:[0-9]+]], 4
     61 ; CHECK-FISL-DAG: stxsspx 0, 8, [[C1]]
     62 ; CHECK-FISL-DAG: xsmaddasp 1, 2, 5
     63 ; CHECK-FISL-DAG: li [[C2:[0-9]+]], 8
     64 ; CHECK-FISL-DAG: stxsspx 1, 8, [[C2]]
     65 ; CHECK-FISL: blr
     66 }
     67 
     68 define void @test3sp(float %a, float %b, float %c, float %e, float %f, float* nocapture %d) #0 {
     69 entry:
     70   %0 = tail call float @llvm.fma.f32(float %b, float %c, float %a)
     71   store float %0, float* %d, align 4
     72   %1 = tail call float @llvm.fma.f32(float %b, float %e, float %a)
     73   %2 = tail call float @llvm.fma.f32(float %b, float %c, float %1)
     74   %arrayidx1 = getelementptr inbounds float, float* %d, i64 3
     75   store float %2, float* %arrayidx1, align 4
     76   %3 = tail call float @llvm.fma.f32(float %b, float %f, float %a)
     77   %arrayidx2 = getelementptr inbounds float, float* %d, i64 2
     78   store float %3, float* %arrayidx2, align 4
     79   %arrayidx3 = getelementptr inbounds float, float* %d, i64 1
     80   store float %1, float* %arrayidx3, align 4
     81   ret void
     82 
     83 ; CHECK-LABEL: @test3sp
     84 ; CHECK-DAG: fmr [[F1:[0-9]+]], 1
     85 ; CHECK-DAG: li [[C1:[0-9]+]], 12
     86 ; CHECK-DAG: li [[C2:[0-9]+]], 8
     87 ; CHECK-DAG: li [[C3:[0-9]+]], 4
     88 ; CHECK-DAG: xsmaddmsp 4, 2, 1
     89 ; CHECK-DAG: xsmaddasp 1, 2, 5
     90 
     91 ; Note: We could convert this next FMA to M-type as well, but it would require
     92 ; re-ordering the instructions.
     93 ; CHECK-DAG: xsmaddasp [[F1]], 2, 3
     94 
     95 ; CHECK-DAG: xsmaddmsp 3, 2, 4
     96 ; CHECK-DAG: stxsspx [[F1]], 0, 8
     97 ; CHECK-DAG: stxsspx 3, 8, [[C1]]
     98 ; CHECK-DAG: stxsspx 1, 8, [[C2]]
     99 ; CHECK-DAG: stxsspx 4, 8, [[C3]]
    100 ; CHECK: blr
    101 
    102 ; CHECK-FISL-LABEL: @test3sp
    103 ; CHECK-FISL-DAG: fmr [[F1:[0-9]+]], 1
    104 ; CHECK-FISL-DAG: xsmaddasp [[F1]], 2, 4
    105 ; CHECK-FISL-DAG: fmr 4, [[F1]]
    106 ; CHECK-FISL-DAG: xsmaddasp 4, 2, 3
    107 ; CHECK-FISL-DAG: li [[C1:[0-9]+]], 12
    108 ; CHECK-FISL-DAG: stxsspx 4, 8, [[C1]]
    109 ; CHECK-FISL-DAG: xsmaddasp 1, 2, 5
    110 ; CHECK-FISL-DAG: li [[C2:[0-9]+]], 8
    111 ; CHECK-FISL-DAG: stxsspx 1, 8, [[C2]]
    112 ; CHECK-FISL-DAG: li [[C3:[0-9]+]], 4
    113 ; CHECK-FISL-DAG: stxsspx 0, 8, [[C3]]
    114 ; CHECK-FISL: blr
    115 }
    116 
    117 define void @test4sp(float %a, float %b, float %c, float %e, float %f, float* nocapture %d) #0 {
    118 entry:
    119   %0 = tail call float @llvm.fma.f32(float %b, float %c, float %a)
    120   store float %0, float* %d, align 4
    121   %1 = tail call float @llvm.fma.f32(float %b, float %e, float %a)
    122   %arrayidx1 = getelementptr inbounds float, float* %d, i64 1
    123   store float %1, float* %arrayidx1, align 4
    124   %2 = tail call float @llvm.fma.f32(float %b, float %c, float %1)
    125   %arrayidx3 = getelementptr inbounds float, float* %d, i64 3
    126   store float %2, float* %arrayidx3, align 4
    127   %3 = tail call float @llvm.fma.f32(float %b, float %f, float %a)
    128   %arrayidx4 = getelementptr inbounds float, float* %d, i64 2
    129   store float %3, float* %arrayidx4, align 4
    130   ret void
    131 
    132 ; CHECK-LABEL: @test4sp
    133 ; CHECK-DAG: fmr [[F1:[0-9]+]], 1
    134 ; CHECK-DAG: li [[C1:[0-9]+]], 4
    135 ; CHECK-DAG: li [[C2:[0-9]+]], 8
    136 ; CHECK-DAG: xsmaddmsp 4, 2, 1
    137 
    138 ; Note: We could convert this next FMA to M-type as well, but it would require
    139 ; re-ordering the instructions.
    140 ; CHECK-DAG: xsmaddasp 1, 2, 5
    141 
    142 ; CHECK-DAG: xsmaddasp [[F1]], 2, 3
    143 ; CHECK-DAG: stxsspx [[F1]], 0, 8
    144 ; CHECK-DAG: stxsspx 4, 8, [[C1]]
    145 ; CHECK-DAG: li [[C3:[0-9]+]], 12
    146 ; CHECK-DAG: xsmaddasp 4, 2, 3
    147 ; CHECK-DAG: stxsspx 4, 8, [[C3]]
    148 ; CHECK-DAG: stxsspx 1, 8, [[C2]]
    149 ; CHECK: blr
    150 
    151 ; CHECK-FISL-LABEL: @test4sp
    152 ; CHECK-FISL-DAG: fmr [[F1:[0-9]+]], 1
    153 ; CHECK-FISL-DAG: xsmaddasp [[F1]], 2, 3
    154 ; CHECK-FISL-DAG: stxsspx 0, 0, 8
    155 ; CHECK-FISL-DAG: fmr [[F1]], 1
    156 ; CHECK-FISL-DAG: xsmaddasp [[F1]], 2, 4
    157 ; CHECK-FISL-DAG: li [[C3:[0-9]+]], 4
    158 ; CHECK-FISL-DAG: stxsspx 0, 8, [[C3]]
    159 ; CHECK-FISL-DAG: xsmaddasp 0, 2, 3
    160 ; CHECK-FISL-DAG: li [[C1:[0-9]+]], 12
    161 ; CHECK-FISL-DAG: stxsspx 0, 8, [[C1]]
    162 ; CHECK-FISL-DAG: xsmaddasp 1, 2, 5
    163 ; CHECK-FISL-DAG: li [[C2:[0-9]+]], 8
    164 ; CHECK-FISL-DAG: stxsspx 1, 8, [[C2]]
    165 ; CHECK-FISL: blr
    166 }
    167 
    168 declare float @llvm.fma.f32(float, float, float) #0
    169