1 ; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon | FileCheck %s 2 3 define float @frecp0(float %x) #0 { 4 %div = fdiv fast float 1.0, %x 5 ret float %div 6 7 ; CHECK-LABEL: frecp0: 8 ; CHECK-NEXT: %bb.0 9 ; CHECK-NEXT: fmov 10 ; CHECK-NEXT: fdiv 11 } 12 13 define float @frecp1(float %x) #1 { 14 %div = fdiv fast float 1.0, %x 15 ret float %div 16 17 ; CHECK-LABEL: frecp1: 18 ; CHECK-NEXT: %bb.0 19 ; CHECK-NEXT: frecpe [[R:s[0-7]]] 20 ; CHECK-NEXT: frecps {{s[0-7](, s[0-7])?}}, [[R]] 21 ; CHECK: frecps {{s[0-7]}}, {{s[0-7]}}, {{s[0-7]}} 22 ; CHECK-NOT: frecps {{s[0-7]}}, {{s[0-7]}}, {{s[0-7]}} 23 } 24 25 define <2 x float> @f2recp0(<2 x float> %x) #0 { 26 %div = fdiv fast <2 x float> <float 1.0, float 1.0>, %x 27 ret <2 x float> %div 28 29 ; CHECK-LABEL: f2recp0: 30 ; CHECK-NEXT: %bb.0 31 ; CHECK-NEXT: fmov 32 ; CHECK-NEXT: fdiv 33 } 34 35 define <2 x float> @f2recp1(<2 x float> %x) #1 { 36 %div = fdiv fast <2 x float> <float 1.0, float 1.0>, %x 37 ret <2 x float> %div 38 39 ; CHECK-LABEL: f2recp1: 40 ; CHECK-NEXT: %bb.0 41 ; CHECK-NEXT: frecpe [[R:v[0-7]\.2s]] 42 ; CHECK-NEXT: frecps {{v[0-7]\.2s(, v[0-7].2s)?}}, [[R]] 43 ; CHECK: frecps {{v[0-7]\.2s}}, {{v[0-7]\.2s}}, {{v[0-7]\.2s}} 44 ; CHECK-NOT: frecps {{v[0-7]\.2s}}, {{v[0-7]\.2s}}, {{v[0-7]\.2s}} 45 } 46 47 define <4 x float> @f4recp0(<4 x float> %x) #0 { 48 %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x 49 ret <4 x float> %div 50 51 ; CHECK-LABEL: f4recp0: 52 ; CHECK-NEXT: %bb.0 53 ; CHECK-NEXT: fmov 54 ; CHECK-NEXT: fdiv 55 } 56 57 define <4 x float> @f4recp1(<4 x float> %x) #1 { 58 %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x 59 ret <4 x float> %div 60 61 ; CHECK-LABEL: f4recp1: 62 ; CHECK-NEXT: %bb.0 63 ; CHECK-NEXT: frecpe [[R:v[0-7]\.4s]] 64 ; CHECK-NEXT: frecps {{v[0-7]\.4s(, v[0-7].4s)?}}, [[R]] 65 ; CHECK: frecps {{v[0-7]\.4s}}, {{v[0-7]\.4s}}, {{v[0-7]\.4s}} 66 ; CHECK-NOT: frecps {{v[0-7]\.4s}}, {{v[0-7]\.4s}}, {{v[0-7]\.4s}} 67 } 68 69 define <8 x float> @f8recp0(<8 x float> %x) #0 { 70 %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x 71 ret <8 x float> %div 72 73 ; CHECK-LABEL: f8recp0: 74 ; CHECK-NEXT: %bb.0 75 ; CHECK-NEXT: fmov 76 ; CHECK-NEXT: fdiv 77 ; CHECK-NEXT: fdiv 78 } 79 80 define <8 x float> @f8recp1(<8 x float> %x) #1 { 81 %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x 82 ret <8 x float> %div 83 84 ; CHECK-LABEL: f8recp1: 85 ; CHECK-NEXT: %bb.0 86 ; CHECK-NEXT: frecpe [[R:v[0-7]\.4s]] 87 ; CHECK: frecps {{v[0-7]\.4s(, v[0-7].4s)?}}, [[R]] 88 ; CHECK: frecps {{v[0-7]\.4s(, v[0-7].4s)?}}, {{v[0-7]\.4s}} 89 ; CHECK: frecps {{v[0-7]\.4s}}, {{v[0-7]\.4s}}, {{v[0-7]\.4s}} 90 ; CHECK: frecps {{v[0-7]\.4s}}, {{v[0-7]\.4s}}, {{v[0-7]\.4s}} 91 ; CHECK-NOT: frecps {{v[0-7]\.4s}}, {{v[0-7]\.4s}}, {{v[0-7]\.4s}} 92 } 93 94 define double @drecp0(double %x) #0 { 95 %div = fdiv fast double 1.0, %x 96 ret double %div 97 98 ; CHECK-LABEL: drecp0: 99 ; CHECK-NEXT: %bb.0 100 ; CHECK-NEXT: fmov 101 ; CHECK-NEXT: fdiv 102 } 103 104 define double @drecp1(double %x) #1 { 105 %div = fdiv fast double 1.0, %x 106 ret double %div 107 108 ; CHECK-LABEL: drecp1: 109 ; CHECK-NEXT: %bb.0 110 ; CHECK-NEXT: frecpe [[R:d[0-7]]] 111 ; CHECK-NEXT: frecps {{d[0-7](, d[0-7])?}}, [[R]] 112 ; CHECK: frecps {{d[0-7]}}, {{d[0-7]}}, {{d[0-7]}} 113 ; CHECK: frecps {{d[0-7]}}, {{d[0-7]}}, {{d[0-7]}} 114 ; CHECK-NOT: frecps {{d[0-7]}}, {{d[0-7]}}, {{d[0-7]}} 115 } 116 117 define <2 x double> @d2recp0(<2 x double> %x) #0 { 118 %div = fdiv fast <2 x double> <double 1.0, double 1.0>, %x 119 ret <2 x double> %div 120 121 ; CHECK-LABEL: d2recp0: 122 ; CHECK-NEXT: %bb.0 123 ; CHECK-NEXT: fmov 124 ; CHECK-NEXT: fdiv 125 } 126 127 define <2 x double> @d2recp1(<2 x double> %x) #1 { 128 %div = fdiv fast <2 x double> <double 1.0, double 1.0>, %x 129 ret <2 x double> %div 130 131 ; CHECK-LABEL: d2recp1: 132 ; CHECK-NEXT: %bb.0 133 ; CHECK-NEXT: frecpe [[R:v[0-7]\.2d]] 134 ; CHECK-NEXT: frecps {{v[0-7]\.2d(, v[0-7].2d)?}}, [[R]] 135 ; CHECK: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 136 ; CHECK: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 137 ; CHECK-NOT: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 138 } 139 140 define <4 x double> @d4recp0(<4 x double> %x) #0 { 141 %div = fdiv fast <4 x double> <double 1.0, double 1.0, double 1.0, double 1.0>, %x 142 ret <4 x double> %div 143 144 ; CHECK-LABEL: d4recp0: 145 ; CHECK-NEXT: %bb.0 146 ; CHECK-NEXT: fmov 147 ; CHECK-NEXT: fdiv 148 ; CHECK-NEXT: fdiv 149 } 150 151 define <4 x double> @d4recp1(<4 x double> %x) #1 { 152 %div = fdiv fast <4 x double> <double 1.0, double 1.0, double 1.0, double 1.0>, %x 153 ret <4 x double> %div 154 155 ; CHECK-LABEL: d4recp1: 156 ; CHECK-NEXT: %bb.0 157 ; CHECK-NEXT: frecpe [[R:v[0-7]\.2d]] 158 ; CHECK: frecps {{v[0-7]\.2d(, v[0-7].2d)?}}, [[R]] 159 ; CHECK: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 160 ; CHECK: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 161 ; CHECK: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 162 ; CHECK: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 163 ; CHECK: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 164 ; CHECK-NOT: frecps {{v[0-7]\.2d}}, {{v[0-7]\.2d}}, {{v[0-7]\.2d}} 165 } 166 167 attributes #0 = { nounwind "unsafe-fp-math"="true" } 168 attributes #1 = { nounwind "unsafe-fp-math"="true" "reciprocal-estimates"="div,vec-div" } 169