1412 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=inject-tli-mappings,slp-vectorizer -vector-library=Accelerate -S %s | FileCheck %s3; RUN: opt -passes=inject-tli-mappings,slp-vectorizer -S %s | FileCheck --check-prefix NOACCELERATE %s4 5target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"6target triple = "arm64-apple-ios14.0.0"7 8declare float @llvm.sin.f32(float)9 10; Accelerate provides sin() for <4 x float>11define <4 x float> @int_sin_4x(ptr %a) {12; CHECK-LABEL: @int_sin_4x(13; CHECK-NEXT: entry:14; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 1615; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vsinf(<4 x float> [[TMP0]])16; CHECK-NEXT: ret <4 x float> [[TMP1]]17;18; NOACCELERATE-LABEL: @int_sin_4x(19; NOACCELERATE-NEXT: entry:20; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 1621; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 022; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT]])23; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 024; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 125; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_1]])26; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 127; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 228; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_2]])29; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 230; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 331; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_3]])32; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 333; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]34;35entry:36 %0 = load <4 x float>, ptr %a, align 1637 %vecext = extractelement <4 x float> %0, i32 038 %1 = tail call fast float @llvm.sin.f32(float %vecext)39 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 040 %vecext.1 = extractelement <4 x float> %0, i32 141 %2 = tail call fast float @llvm.sin.f32(float %vecext.1)42 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 143 %vecext.2 = extractelement <4 x float> %0, i32 244 %3 = tail call fast float @llvm.sin.f32(float %vecext.2)45 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 246 %vecext.3 = extractelement <4 x float> %0, i32 347 %4 = tail call fast float @llvm.sin.f32(float %vecext.3)48 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 349 ret <4 x float> %vecins.350}51 52declare float @ceilf(float) readonly nounwind willreturn53 54define <4 x float> @ceil_4x(ptr %a) {55; CHECK-LABEL: @ceil_4x(56; CHECK-NEXT: entry:57; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 1658; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.ceil.v4f32(<4 x float> [[TMP0]])59; CHECK-NEXT: ret <4 x float> [[TMP1]]60;61; NOACCELERATE-LABEL: @ceil_4x(62; NOACCELERATE-NEXT: entry:63; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 1664; NOACCELERATE-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.ceil.v4f32(<4 x float> [[TMP0]])65; NOACCELERATE-NEXT: ret <4 x float> [[TMP1]]66;67entry:68 %0 = load <4 x float>, ptr %a, align 1669 %vecext = extractelement <4 x float> %0, i32 070 %1 = tail call fast float @ceilf(float %vecext)71 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 072 %vecext.1 = extractelement <4 x float> %0, i32 173 %2 = tail call fast float @ceilf(float %vecext.1)74 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 175 %vecext.2 = extractelement <4 x float> %0, i32 276 %3 = tail call fast float @ceilf(float %vecext.2)77 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 278 %vecext.3 = extractelement <4 x float> %0, i32 379 %4 = tail call fast float @ceilf(float %vecext.3)80 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 381 ret <4 x float> %vecins.382}83 84declare float @fabsf(float) readonly nounwind willreturn85 86define <4 x float> @fabs_4x(ptr %a) {87; CHECK-LABEL: @fabs_4x(88; CHECK-NEXT: entry:89; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 1690; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP0]])91; CHECK-NEXT: ret <4 x float> [[TMP1]]92;93; NOACCELERATE-LABEL: @fabs_4x(94; NOACCELERATE-NEXT: entry:95; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 1696; NOACCELERATE-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP0]])97; NOACCELERATE-NEXT: ret <4 x float> [[TMP1]]98;99entry:100 %0 = load <4 x float>, ptr %a, align 16101 %vecext = extractelement <4 x float> %0, i32 0102 %1 = tail call fast float @fabsf(float %vecext)103 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0104 %vecext.1 = extractelement <4 x float> %0, i32 1105 %2 = tail call fast float @fabsf(float %vecext.1)106 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1107 %vecext.2 = extractelement <4 x float> %0, i32 2108 %3 = tail call fast float @fabsf(float %vecext.2)109 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2110 %vecext.3 = extractelement <4 x float> %0, i32 3111 %4 = tail call fast float @fabsf(float %vecext.3)112 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3113 ret <4 x float> %vecins.3114}115declare float @llvm.fabs.f32(float)116define <4 x float> @int_fabs_4x(ptr %a) {117; CHECK-LABEL: @int_fabs_4x(118; CHECK-NEXT: entry:119; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16120; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP0]])121; CHECK-NEXT: ret <4 x float> [[TMP1]]122;123; NOACCELERATE-LABEL: @int_fabs_4x(124; NOACCELERATE-NEXT: entry:125; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16126; NOACCELERATE-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP0]])127; NOACCELERATE-NEXT: ret <4 x float> [[TMP1]]128;129entry:130 %0 = load <4 x float>, ptr %a, align 16131 %vecext = extractelement <4 x float> %0, i32 0132 %1 = tail call fast float @llvm.fabs.f32(float %vecext)133 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0134 %vecext.1 = extractelement <4 x float> %0, i32 1135 %2 = tail call fast float @llvm.fabs.f32(float %vecext.1)136 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1137 %vecext.2 = extractelement <4 x float> %0, i32 2138 %3 = tail call fast float @llvm.fabs.f32(float %vecext.2)139 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2140 %vecext.3 = extractelement <4 x float> %0, i32 3141 %4 = tail call fast float @llvm.fabs.f32(float %vecext.3)142 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3143 ret <4 x float> %vecins.3144}145declare float @floorf(float) readonly nounwind willreturn146define <4 x float> @floor_4x(ptr %a) {147; CHECK-LABEL: @floor_4x(148; CHECK-NEXT: entry:149; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16150; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.floor.v4f32(<4 x float> [[TMP0]])151; CHECK-NEXT: ret <4 x float> [[TMP1]]152;153; NOACCELERATE-LABEL: @floor_4x(154; NOACCELERATE-NEXT: entry:155; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16156; NOACCELERATE-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.floor.v4f32(<4 x float> [[TMP0]])157; NOACCELERATE-NEXT: ret <4 x float> [[TMP1]]158;159entry:160 %0 = load <4 x float>, ptr %a, align 16161 %vecext = extractelement <4 x float> %0, i32 0162 %1 = tail call fast float @floorf(float %vecext)163 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0164 %vecext.1 = extractelement <4 x float> %0, i32 1165 %2 = tail call fast float @floorf(float %vecext.1)166 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1167 %vecext.2 = extractelement <4 x float> %0, i32 2168 %3 = tail call fast float @floorf(float %vecext.2)169 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2170 %vecext.3 = extractelement <4 x float> %0, i32 3171 %4 = tail call fast float @floorf(float %vecext.3)172 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3173 ret <4 x float> %vecins.3174}175declare float @sqrtf(float) readonly nounwind willreturn176define <4 x float> @sqrt_4x(ptr %a) {177; CHECK-LABEL: @sqrt_4x(178; CHECK-NEXT: entry:179; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16180; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> [[TMP0]])181; CHECK-NEXT: ret <4 x float> [[TMP1]]182;183; NOACCELERATE-LABEL: @sqrt_4x(184; NOACCELERATE-NEXT: entry:185; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16186; NOACCELERATE-NEXT: [[TMP1:%.*]] = call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> [[TMP0]])187; NOACCELERATE-NEXT: ret <4 x float> [[TMP1]]188;189entry:190 %0 = load <4 x float>, ptr %a, align 16191 %vecext = extractelement <4 x float> %0, i32 0192 %1 = tail call fast float @sqrtf(float %vecext)193 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0194 %vecext.1 = extractelement <4 x float> %0, i32 1195 %2 = tail call fast float @sqrtf(float %vecext.1)196 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1197 %vecext.2 = extractelement <4 x float> %0, i32 2198 %3 = tail call fast float @sqrtf(float %vecext.2)199 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2200 %vecext.3 = extractelement <4 x float> %0, i32 3201 %4 = tail call fast float @sqrtf(float %vecext.3)202 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3203 ret <4 x float> %vecins.3204}205declare float @expf(float) readonly nounwind willreturn206define <4 x float> @exp_4x(ptr %a) {207; CHECK-LABEL: @exp_4x(208; CHECK-NEXT: entry:209; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16210; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vexpf(<4 x float> [[TMP0]])211; CHECK-NEXT: ret <4 x float> [[TMP1]]212;213; NOACCELERATE-LABEL: @exp_4x(214; NOACCELERATE-NEXT: entry:215; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16216; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0217; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @expf(float [[VECEXT]])218; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0219; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1220; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @expf(float [[VECEXT_1]])221; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1222; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2223; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @expf(float [[VECEXT_2]])224; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2225; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3226; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @expf(float [[VECEXT_3]])227; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3228; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]229;230entry:231 %0 = load <4 x float>, ptr %a, align 16232 %vecext = extractelement <4 x float> %0, i32 0233 %1 = tail call fast float @expf(float %vecext)234 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0235 %vecext.1 = extractelement <4 x float> %0, i32 1236 %2 = tail call fast float @expf(float %vecext.1)237 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1238 %vecext.2 = extractelement <4 x float> %0, i32 2239 %3 = tail call fast float @expf(float %vecext.2)240 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2241 %vecext.3 = extractelement <4 x float> %0, i32 3242 %4 = tail call fast float @expf(float %vecext.3)243 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3244 ret <4 x float> %vecins.3245}246declare float @expm1f(float) readonly nounwind willreturn247define <4 x float> @expm1_4x(ptr %a) {248; CHECK-LABEL: @expm1_4x(249; CHECK-NEXT: entry:250; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16251; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vexpm1f(<4 x float> [[TMP0]])252; CHECK-NEXT: ret <4 x float> [[TMP1]]253;254; NOACCELERATE-LABEL: @expm1_4x(255; NOACCELERATE-NEXT: entry:256; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16257; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0258; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @expm1f(float [[VECEXT]])259; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0260; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1261; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @expm1f(float [[VECEXT_1]])262; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1263; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2264; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @expm1f(float [[VECEXT_2]])265; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2266; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3267; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @expm1f(float [[VECEXT_3]])268; NOACCELERATE-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3269; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_3]]270;271entry:272 %0 = load <4 x float>, ptr %a, align 16273 %vecext = extractelement <4 x float> %0, i32 0274 %1 = tail call fast float @expm1f(float %vecext)275 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0276 %vecext.1 = extractelement <4 x float> %0, i32 1277 %2 = tail call fast float @expm1f(float %vecext.1)278 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1279 %vecext.2 = extractelement <4 x float> %0, i32 2280 %3 = tail call fast float @expm1f(float %vecext.2)281 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2282 %vecext.3 = extractelement <4 x float> %0, i32 3283 %4 = tail call fast float @expm1f(float %vecext.3)284 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3285 ret <4 x float> %vecins.3286}287declare float @logf(float) readonly nounwind willreturn288define <4 x float> @log_4x(ptr %a) {289; CHECK-LABEL: @log_4x(290; CHECK-NEXT: entry:291; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16292; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vlogf(<4 x float> [[TMP0]])293; CHECK-NEXT: ret <4 x float> [[TMP1]]294;295; NOACCELERATE-LABEL: @log_4x(296; NOACCELERATE-NEXT: entry:297; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16298; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0299; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @logf(float [[VECEXT]])300; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0301; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1302; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @logf(float [[VECEXT_1]])303; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1304; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2305; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @logf(float [[VECEXT_2]])306; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2307; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3308; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @logf(float [[VECEXT_3]])309; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3310; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]311;312entry:313 %0 = load <4 x float>, ptr %a, align 16314 %vecext = extractelement <4 x float> %0, i32 0315 %1 = tail call fast float @logf(float %vecext)316 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0317 %vecext.1 = extractelement <4 x float> %0, i32 1318 %2 = tail call fast float @logf(float %vecext.1)319 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1320 %vecext.2 = extractelement <4 x float> %0, i32 2321 %3 = tail call fast float @logf(float %vecext.2)322 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2323 %vecext.3 = extractelement <4 x float> %0, i32 3324 %4 = tail call fast float @logf(float %vecext.3)325 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3326 ret <4 x float> %vecins.3327}328declare float @log1pf(float) readonly nounwind willreturn329define <4 x float> @log1p_4x(ptr %a) {330; CHECK-LABEL: @log1p_4x(331; CHECK-NEXT: entry:332; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16333; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vlog1pf(<4 x float> [[TMP0]])334; CHECK-NEXT: ret <4 x float> [[TMP1]]335;336; NOACCELERATE-LABEL: @log1p_4x(337; NOACCELERATE-NEXT: entry:338; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16339; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0340; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @log1pf(float [[VECEXT]])341; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0342; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1343; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @log1pf(float [[VECEXT_1]])344; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1345; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2346; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @log1pf(float [[VECEXT_2]])347; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2348; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3349; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @log1pf(float [[VECEXT_3]])350; NOACCELERATE-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3351; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_3]]352;353entry:354 %0 = load <4 x float>, ptr %a, align 16355 %vecext = extractelement <4 x float> %0, i32 0356 %1 = tail call fast float @log1pf(float %vecext)357 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0358 %vecext.1 = extractelement <4 x float> %0, i32 1359 %2 = tail call fast float @log1pf(float %vecext.1)360 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1361 %vecext.2 = extractelement <4 x float> %0, i32 2362 %3 = tail call fast float @log1pf(float %vecext.2)363 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2364 %vecext.3 = extractelement <4 x float> %0, i32 3365 %4 = tail call fast float @log1pf(float %vecext.3)366 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3367 ret <4 x float> %vecins.3368}369declare float @log10pf(float) readonly nounwind willreturn370define <4 x float> @log10p_4x(ptr %a) {371; CHECK-LABEL: @log10p_4x(372; CHECK-NEXT: entry:373; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16374; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0375; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @log10pf(float [[VECEXT]])376; CHECK-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0377; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1378; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @log10pf(float [[VECEXT_1]])379; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1380; CHECK-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2381; CHECK-NEXT: [[TMP3:%.*]] = tail call fast float @log10pf(float [[VECEXT_2]])382; CHECK-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2383; CHECK-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3384; CHECK-NEXT: [[TMP4:%.*]] = tail call fast float @log10pf(float [[VECEXT_3]])385; CHECK-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3386; CHECK-NEXT: ret <4 x float> [[VECINS_3]]387;388; NOACCELERATE-LABEL: @log10p_4x(389; NOACCELERATE-NEXT: entry:390; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16391; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0392; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @log10pf(float [[VECEXT]])393; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0394; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1395; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @log10pf(float [[VECEXT_1]])396; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1397; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2398; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @log10pf(float [[VECEXT_2]])399; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2400; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3401; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @log10pf(float [[VECEXT_3]])402; NOACCELERATE-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3403; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_3]]404;405entry:406 %0 = load <4 x float>, ptr %a, align 16407 %vecext = extractelement <4 x float> %0, i32 0408 %1 = tail call fast float @log10pf(float %vecext)409 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0410 %vecext.1 = extractelement <4 x float> %0, i32 1411 %2 = tail call fast float @log10pf(float %vecext.1)412 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1413 %vecext.2 = extractelement <4 x float> %0, i32 2414 %3 = tail call fast float @log10pf(float %vecext.2)415 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2416 %vecext.3 = extractelement <4 x float> %0, i32 3417 %4 = tail call fast float @log10pf(float %vecext.3)418 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3419 ret <4 x float> %vecins.3420}421declare float @logbf(float) readonly nounwind willreturn422define <4 x float> @logb_4x(ptr %a) {423; CHECK-LABEL: @logb_4x(424; CHECK-NEXT: entry:425; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16426; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vlogbf(<4 x float> [[TMP0]])427; CHECK-NEXT: ret <4 x float> [[TMP1]]428;429; NOACCELERATE-LABEL: @logb_4x(430; NOACCELERATE-NEXT: entry:431; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16432; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0433; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @logbf(float [[VECEXT]])434; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0435; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1436; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @logbf(float [[VECEXT_1]])437; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1438; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2439; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @logbf(float [[VECEXT_2]])440; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2441; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3442; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @logbf(float [[VECEXT_3]])443; NOACCELERATE-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3444; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_3]]445;446entry:447 %0 = load <4 x float>, ptr %a, align 16448 %vecext = extractelement <4 x float> %0, i32 0449 %1 = tail call fast float @logbf(float %vecext)450 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0451 %vecext.1 = extractelement <4 x float> %0, i32 1452 %2 = tail call fast float @logbf(float %vecext.1)453 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1454 %vecext.2 = extractelement <4 x float> %0, i32 2455 %3 = tail call fast float @logbf(float %vecext.2)456 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2457 %vecext.3 = extractelement <4 x float> %0, i32 3458 %4 = tail call fast float @logbf(float %vecext.3)459 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3460 ret <4 x float> %vecins.3461}462declare float @sinf(float) readonly nounwind willreturn463define <4 x float> @sin_4x(ptr %a) {464; CHECK-LABEL: @sin_4x(465; CHECK-NEXT: entry:466; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16467; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vsinf(<4 x float> [[TMP0]])468; CHECK-NEXT: ret <4 x float> [[TMP1]]469;470; NOACCELERATE-LABEL: @sin_4x(471; NOACCELERATE-NEXT: entry:472; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16473; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0474; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @sinf(float [[VECEXT]])475; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0476; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1477; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @sinf(float [[VECEXT_1]])478; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1479; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2480; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @sinf(float [[VECEXT_2]])481; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2482; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3483; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @sinf(float [[VECEXT_3]])484; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3485; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]486;487entry:488 %0 = load <4 x float>, ptr %a, align 16489 %vecext = extractelement <4 x float> %0, i32 0490 %1 = tail call fast float @sinf(float %vecext)491 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0492 %vecext.1 = extractelement <4 x float> %0, i32 1493 %2 = tail call fast float @sinf(float %vecext.1)494 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1495 %vecext.2 = extractelement <4 x float> %0, i32 2496 %3 = tail call fast float @sinf(float %vecext.2)497 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2498 %vecext.3 = extractelement <4 x float> %0, i32 3499 %4 = tail call fast float @sinf(float %vecext.3)500 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3501 ret <4 x float> %vecins.3502}503declare float @cosf(float) readonly nounwind willreturn504define <4 x float> @cos_4x(ptr %a) {505; CHECK-LABEL: @cos_4x(506; CHECK-NEXT: entry:507; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16508; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vcosf(<4 x float> [[TMP0]])509; CHECK-NEXT: ret <4 x float> [[TMP1]]510;511; NOACCELERATE-LABEL: @cos_4x(512; NOACCELERATE-NEXT: entry:513; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16514; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0515; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @cosf(float [[VECEXT]])516; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0517; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1518; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @cosf(float [[VECEXT_1]])519; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1520; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2521; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @cosf(float [[VECEXT_2]])522; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2523; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3524; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @cosf(float [[VECEXT_3]])525; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3526; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]527;528entry:529 %0 = load <4 x float>, ptr %a, align 16530 %vecext = extractelement <4 x float> %0, i32 0531 %1 = tail call fast float @cosf(float %vecext)532 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0533 %vecext.1 = extractelement <4 x float> %0, i32 1534 %2 = tail call fast float @cosf(float %vecext.1)535 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1536 %vecext.2 = extractelement <4 x float> %0, i32 2537 %3 = tail call fast float @cosf(float %vecext.2)538 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2539 %vecext.3 = extractelement <4 x float> %0, i32 3540 %4 = tail call fast float @cosf(float %vecext.3)541 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3542 ret <4 x float> %vecins.3543}544declare float @tanf(float) readonly nounwind willreturn545define <4 x float> @tan_4x(ptr %a) {546; CHECK-LABEL: @tan_4x(547; CHECK-NEXT: entry:548; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16549; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vtanf(<4 x float> [[TMP0]])550; CHECK-NEXT: ret <4 x float> [[TMP1]]551;552; NOACCELERATE-LABEL: @tan_4x(553; NOACCELERATE-NEXT: entry:554; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16555; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0556; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @tanf(float [[VECEXT]])557; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0558; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1559; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @tanf(float [[VECEXT_1]])560; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1561; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2562; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @tanf(float [[VECEXT_2]])563; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2564; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3565; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @tanf(float [[VECEXT_3]])566; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3567; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]568;569entry:570 %0 = load <4 x float>, ptr %a, align 16571 %vecext = extractelement <4 x float> %0, i32 0572 %1 = tail call fast float @tanf(float %vecext)573 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0574 %vecext.1 = extractelement <4 x float> %0, i32 1575 %2 = tail call fast float @tanf(float %vecext.1)576 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1577 %vecext.2 = extractelement <4 x float> %0, i32 2578 %3 = tail call fast float @tanf(float %vecext.2)579 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2580 %vecext.3 = extractelement <4 x float> %0, i32 3581 %4 = tail call fast float @tanf(float %vecext.3)582 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3583 ret <4 x float> %vecins.3584}585declare float @asinf(float) readonly nounwind willreturn586define <4 x float> @asin_4x(ptr %a) {587; CHECK-LABEL: @asin_4x(588; CHECK-NEXT: entry:589; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16590; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vasinf(<4 x float> [[TMP0]])591; CHECK-NEXT: ret <4 x float> [[TMP1]]592;593; NOACCELERATE-LABEL: @asin_4x(594; NOACCELERATE-NEXT: entry:595; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16596; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0597; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @asinf(float [[VECEXT]])598; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0599; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1600; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @asinf(float [[VECEXT_1]])601; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1602; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2603; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @asinf(float [[VECEXT_2]])604; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2605; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3606; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @asinf(float [[VECEXT_3]])607; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3608; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]609;610entry:611 %0 = load <4 x float>, ptr %a, align 16612 %vecext = extractelement <4 x float> %0, i32 0613 %1 = tail call fast float @asinf(float %vecext)614 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0615 %vecext.1 = extractelement <4 x float> %0, i32 1616 %2 = tail call fast float @asinf(float %vecext.1)617 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1618 %vecext.2 = extractelement <4 x float> %0, i32 2619 %3 = tail call fast float @asinf(float %vecext.2)620 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2621 %vecext.3 = extractelement <4 x float> %0, i32 3622 %4 = tail call fast float @asinf(float %vecext.3)623 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3624 ret <4 x float> %vecins.3625}626define <4 x float> @int_asin_4x(ptr %a) {627; CHECK-LABEL: @int_asin_4x(628; CHECK-NEXT: entry:629; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16630; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vasinf(<4 x float> [[TMP0]])631; CHECK-NEXT: ret <4 x float> [[TMP1]]632;633; NOACCELERATE-LABEL: @int_asin_4x(634; NOACCELERATE-NEXT: entry:635; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16636; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0637; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT]])638; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0639; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1640; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_1]])641; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1642; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2643; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_2]])644; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2645; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3646; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.asin.f32(float [[VECEXT_3]])647; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3648; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]649;650entry:651 %0 = load <4 x float>, ptr %a, align 16652 %vecext = extractelement <4 x float> %0, i32 0653 %1 = tail call fast float @llvm.asin.f32(float %vecext)654 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0655 %vecext.1 = extractelement <4 x float> %0, i32 1656 %2 = tail call fast float @llvm.asin.f32(float %vecext.1)657 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1658 %vecext.2 = extractelement <4 x float> %0, i32 2659 %3 = tail call fast float @llvm.asin.f32(float %vecext.2)660 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2661 %vecext.3 = extractelement <4 x float> %0, i32 3662 %4 = tail call fast float @llvm.asin.f32(float %vecext.3)663 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3664 ret <4 x float> %vecins.3665}666declare float @acosf(float) readonly nounwind willreturn667define <4 x float> @acos_4x(ptr %a) {668; CHECK-LABEL: @acos_4x(669; CHECK-NEXT: entry:670; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16671; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vacosf(<4 x float> [[TMP0]])672; CHECK-NEXT: ret <4 x float> [[TMP1]]673;674; NOACCELERATE-LABEL: @acos_4x(675; NOACCELERATE-NEXT: entry:676; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16677; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0678; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @acosf(float [[VECEXT]])679; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0680; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1681; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @acosf(float [[VECEXT_1]])682; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1683; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2684; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @acosf(float [[VECEXT_2]])685; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2686; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3687; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @acosf(float [[VECEXT_3]])688; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3689; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]690;691entry:692 %0 = load <4 x float>, ptr %a, align 16693 %vecext = extractelement <4 x float> %0, i32 0694 %1 = tail call fast float @acosf(float %vecext)695 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0696 %vecext.1 = extractelement <4 x float> %0, i32 1697 %2 = tail call fast float @acosf(float %vecext.1)698 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1699 %vecext.2 = extractelement <4 x float> %0, i32 2700 %3 = tail call fast float @acosf(float %vecext.2)701 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2702 %vecext.3 = extractelement <4 x float> %0, i32 3703 %4 = tail call fast float @acosf(float %vecext.3)704 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3705 ret <4 x float> %vecins.3706}707define <4 x float> @int_acos_4x(ptr %a) {708; CHECK-LABEL: @int_acos_4x(709; CHECK-NEXT: entry:710; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16711; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vacosf(<4 x float> [[TMP0]])712; CHECK-NEXT: ret <4 x float> [[TMP1]]713;714; NOACCELERATE-LABEL: @int_acos_4x(715; NOACCELERATE-NEXT: entry:716; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16717; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0718; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT]])719; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0720; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1721; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_1]])722; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1723; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2724; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_2]])725; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2726; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3727; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.acos.f32(float [[VECEXT_3]])728; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3729; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]730;731entry:732 %0 = load <4 x float>, ptr %a, align 16733 %vecext = extractelement <4 x float> %0, i32 0734 %1 = tail call fast float @llvm.acos.f32(float %vecext)735 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0736 %vecext.1 = extractelement <4 x float> %0, i32 1737 %2 = tail call fast float @llvm.acos.f32(float %vecext.1)738 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1739 %vecext.2 = extractelement <4 x float> %0, i32 2740 %3 = tail call fast float @llvm.acos.f32(float %vecext.2)741 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2742 %vecext.3 = extractelement <4 x float> %0, i32 3743 %4 = tail call fast float @llvm.acos.f32(float %vecext.3)744 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3745 ret <4 x float> %vecins.3746}747declare float @atanf(float) readonly nounwind willreturn748define <4 x float> @atan_4x(ptr %a) {749; CHECK-LABEL: @atan_4x(750; CHECK-NEXT: entry:751; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16752; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vatanf(<4 x float> [[TMP0]])753; CHECK-NEXT: ret <4 x float> [[TMP1]]754;755; NOACCELERATE-LABEL: @atan_4x(756; NOACCELERATE-NEXT: entry:757; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16758; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0759; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @atanf(float [[VECEXT]])760; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0761; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1762; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @atanf(float [[VECEXT_1]])763; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1764; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2765; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @atanf(float [[VECEXT_2]])766; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2767; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3768; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @atanf(float [[VECEXT_3]])769; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3770; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]771;772entry:773 %0 = load <4 x float>, ptr %a, align 16774 %vecext = extractelement <4 x float> %0, i32 0775 %1 = tail call fast float @atanf(float %vecext)776 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0777 %vecext.1 = extractelement <4 x float> %0, i32 1778 %2 = tail call fast float @atanf(float %vecext.1)779 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1780 %vecext.2 = extractelement <4 x float> %0, i32 2781 %3 = tail call fast float @atanf(float %vecext.2)782 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2783 %vecext.3 = extractelement <4 x float> %0, i32 3784 %4 = tail call fast float @atanf(float %vecext.3)785 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3786 ret <4 x float> %vecins.3787}788define <4 x float> @int_atan_4x(ptr %a) {789; CHECK-LABEL: @int_atan_4x(790; CHECK-NEXT: entry:791; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16792; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vatanf(<4 x float> [[TMP0]])793; CHECK-NEXT: ret <4 x float> [[TMP1]]794;795; NOACCELERATE-LABEL: @int_atan_4x(796; NOACCELERATE-NEXT: entry:797; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16798; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0799; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT]])800; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0801; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1802; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_1]])803; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1804; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2805; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_2]])806; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2807; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3808; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.atan.f32(float [[VECEXT_3]])809; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3810; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]811;812entry:813 %0 = load <4 x float>, ptr %a, align 16814 %vecext = extractelement <4 x float> %0, i32 0815 %1 = tail call fast float @llvm.atan.f32(float %vecext)816 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0817 %vecext.1 = extractelement <4 x float> %0, i32 1818 %2 = tail call fast float @llvm.atan.f32(float %vecext.1)819 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1820 %vecext.2 = extractelement <4 x float> %0, i32 2821 %3 = tail call fast float @llvm.atan.f32(float %vecext.2)822 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2823 %vecext.3 = extractelement <4 x float> %0, i32 3824 %4 = tail call fast float @llvm.atan.f32(float %vecext.3)825 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3826 ret <4 x float> %vecins.3827}828declare float @atan2f(float,float) readonly nounwind willreturn829define <4 x float> @atan2_4x(ptr %a, ptr %b) {830; CHECK-LABEL: @atan2_4x(831; CHECK-NEXT: entry:832; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16833; CHECK-NEXT: [[BB:%.*]] = load <4 x float>, ptr [[B:%.*]], align 16834; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vatan2f(<4 x float> [[TMP0]], <4 x float> [[BB]])835; CHECK-NEXT: ret <4 x float> [[TMP1]]836;837; NOACCELERATE-LABEL: @atan2_4x(838; NOACCELERATE-NEXT: entry:839; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16840; NOACCELERATE-NEXT: [[BB:%.*]] = load <4 x float>, ptr [[B:%.*]], align 16841; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0842; NOACCELERATE-NEXT: [[VECEXTB:%.*]] = extractelement <4 x float> [[BB]], i32 0843; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @atan2f(float [[VECEXT]], float [[VECEXTB]])844; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0845; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1846; NOACCELERATE-NEXT: [[VECEXTB_1:%.*]] = extractelement <4 x float> [[BB]], i32 1847; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @atan2f(float [[VECEXT_1]], float [[VECEXTB_1]])848; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1849; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2850; NOACCELERATE-NEXT: [[VECEXTB_2:%.*]] = extractelement <4 x float> [[BB]], i32 2851; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @atan2f(float [[VECEXT_2]], float [[VECEXTB_2]])852; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2853; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3854; NOACCELERATE-NEXT: [[VECEXTB_3:%.*]] = extractelement <4 x float> [[BB]], i32 3855; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @atan2f(float [[VECEXT_3]], float [[VECEXTB_3]])856; NOACCELERATE-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3857; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_3]]858;859entry:860 %0 = load <4 x float>, ptr %a, align 16861 %bb = load <4 x float>, ptr %b, align 16862 %vecext = extractelement <4 x float> %0, i32 0863 %vecextb = extractelement <4 x float> %bb, i32 0864 %1 = tail call fast float @atan2f(float %vecext, float %vecextb)865 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0866 %vecext.1 = extractelement <4 x float> %0, i32 1867 %vecextb.1 = extractelement <4 x float> %bb, i32 1868 %2 = tail call fast float @atan2f(float %vecext.1, float %vecextb.1)869 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1870 %vecext.2 = extractelement <4 x float> %0, i32 2871 %vecextb.2 = extractelement <4 x float> %bb, i32 2872 %3 = tail call fast float @atan2f(float %vecext.2, float %vecextb.2)873 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2874 %vecext.3 = extractelement <4 x float> %0, i32 3875 %vecextb.3 = extractelement <4 x float> %bb, i32 3876 %4 = tail call fast float @atan2f(float %vecext.3, float %vecextb.3)877 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3878 ret <4 x float> %vecins.3879}880define <4 x float> @int_atan2_4x(ptr %a, ptr %b) {881; CHECK-LABEL: @int_atan2_4x(882; CHECK-NEXT: entry:883; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16884; CHECK-NEXT: [[BB:%.*]] = load <4 x float>, ptr [[B:%.*]], align 16885; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vatan2f(<4 x float> [[TMP0]], <4 x float> [[BB]])886; CHECK-NEXT: ret <4 x float> [[TMP1]]887;888; NOACCELERATE-LABEL: @int_atan2_4x(889; NOACCELERATE-NEXT: entry:890; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16891; NOACCELERATE-NEXT: [[BB:%.*]] = load <4 x float>, ptr [[B:%.*]], align 16892; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0893; NOACCELERATE-NEXT: [[VECEXTB:%.*]] = extractelement <4 x float> [[BB]], i32 0894; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.atan2.f32(float [[VECEXT]], float [[VECEXTB]])895; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0896; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1897; NOACCELERATE-NEXT: [[VECEXTB_1:%.*]] = extractelement <4 x float> [[BB]], i32 1898; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.atan2.f32(float [[VECEXT_1]], float [[VECEXTB_1]])899; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1900; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2901; NOACCELERATE-NEXT: [[VECEXTB_2:%.*]] = extractelement <4 x float> [[BB]], i32 2902; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.atan2.f32(float [[VECEXT_2]], float [[VECEXTB_2]])903; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2904; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3905; NOACCELERATE-NEXT: [[VECEXTB_3:%.*]] = extractelement <4 x float> [[BB]], i32 3906; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.atan2.f32(float [[VECEXT_3]], float [[VECEXTB_3]])907; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3908; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]909;910entry:911 %0 = load <4 x float>, ptr %a, align 16912 %bb = load <4 x float>, ptr %b, align 16913 %vecext = extractelement <4 x float> %0, i32 0914 %vecextb = extractelement <4 x float> %bb, i32 0915 %1 = tail call fast float @llvm.atan2.f32(float %vecext, float %vecextb)916 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0917 %vecext.1 = extractelement <4 x float> %0, i32 1918 %vecextb.1 = extractelement <4 x float> %bb, i32 1919 %2 = tail call fast float @llvm.atan2.f32(float %vecext.1, float %vecextb.1)920 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1921 %vecext.2 = extractelement <4 x float> %0, i32 2922 %vecextb.2 = extractelement <4 x float> %bb, i32 2923 %3 = tail call fast float @llvm.atan2.f32(float %vecext.2, float %vecextb.2)924 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2925 %vecext.3 = extractelement <4 x float> %0, i32 3926 %vecextb.3 = extractelement <4 x float> %bb, i32 3927 %4 = tail call fast float @llvm.atan2.f32(float %vecext.3, float %vecextb.3)928 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3929 ret <4 x float> %vecins.3930}931declare float @sinhf(float) readonly nounwind willreturn932define <4 x float> @sinh_4x(ptr %a) {933; CHECK-LABEL: @sinh_4x(934; CHECK-NEXT: entry:935; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16936; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vsinhf(<4 x float> [[TMP0]])937; CHECK-NEXT: ret <4 x float> [[TMP1]]938;939; NOACCELERATE-LABEL: @sinh_4x(940; NOACCELERATE-NEXT: entry:941; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16942; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0943; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @sinhf(float [[VECEXT]])944; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0945; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1946; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @sinhf(float [[VECEXT_1]])947; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1948; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2949; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @sinhf(float [[VECEXT_2]])950; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2951; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3952; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @sinhf(float [[VECEXT_3]])953; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3954; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]955;956entry:957 %0 = load <4 x float>, ptr %a, align 16958 %vecext = extractelement <4 x float> %0, i32 0959 %1 = tail call fast float @sinhf(float %vecext)960 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 0961 %vecext.1 = extractelement <4 x float> %0, i32 1962 %2 = tail call fast float @sinhf(float %vecext.1)963 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 1964 %vecext.2 = extractelement <4 x float> %0, i32 2965 %3 = tail call fast float @sinhf(float %vecext.2)966 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 2967 %vecext.3 = extractelement <4 x float> %0, i32 3968 %4 = tail call fast float @sinhf(float %vecext.3)969 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 3970 ret <4 x float> %vecins.3971}972define <4 x float> @int_sinh_4x(ptr %a) {973; CHECK-LABEL: @int_sinh_4x(974; CHECK-NEXT: entry:975; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16976; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vsinhf(<4 x float> [[TMP0]])977; CHECK-NEXT: ret <4 x float> [[TMP1]]978;979; NOACCELERATE-LABEL: @int_sinh_4x(980; NOACCELERATE-NEXT: entry:981; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 16982; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 0983; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT]])984; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 0985; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 1986; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_1]])987; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 1988; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 2989; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_2]])990; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 2991; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 3992; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.sinh.f32(float [[VECEXT_3]])993; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 3994; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]995;996entry:997 %0 = load <4 x float>, ptr %a, align 16998 %vecext = extractelement <4 x float> %0, i32 0999 %1 = tail call fast float @llvm.sinh.f32(float %vecext)1000 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01001 %vecext.1 = extractelement <4 x float> %0, i32 11002 %2 = tail call fast float @llvm.sinh.f32(float %vecext.1)1003 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11004 %vecext.2 = extractelement <4 x float> %0, i32 21005 %3 = tail call fast float @llvm.sinh.f32(float %vecext.2)1006 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21007 %vecext.3 = extractelement <4 x float> %0, i32 31008 %4 = tail call fast float @llvm.sinh.f32(float %vecext.3)1009 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31010 ret <4 x float> %vecins.31011}1012declare float @coshf(float) readonly nounwind willreturn1013define <4 x float> @cosh_4x(ptr %a) {1014; CHECK-LABEL: @cosh_4x(1015; CHECK-NEXT: entry:1016; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161017; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vcoshf(<4 x float> [[TMP0]])1018; CHECK-NEXT: ret <4 x float> [[TMP1]]1019;1020; NOACCELERATE-LABEL: @cosh_4x(1021; NOACCELERATE-NEXT: entry:1022; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161023; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01024; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @coshf(float [[VECEXT]])1025; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 01026; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11027; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @coshf(float [[VECEXT_1]])1028; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11029; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21030; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @coshf(float [[VECEXT_2]])1031; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21032; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31033; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @coshf(float [[VECEXT_3]])1034; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31035; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]1036;1037entry:1038 %0 = load <4 x float>, ptr %a, align 161039 %vecext = extractelement <4 x float> %0, i32 01040 %1 = tail call fast float @coshf(float %vecext)1041 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01042 %vecext.1 = extractelement <4 x float> %0, i32 11043 %2 = tail call fast float @coshf(float %vecext.1)1044 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11045 %vecext.2 = extractelement <4 x float> %0, i32 21046 %3 = tail call fast float @coshf(float %vecext.2)1047 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21048 %vecext.3 = extractelement <4 x float> %0, i32 31049 %4 = tail call fast float @coshf(float %vecext.3)1050 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31051 ret <4 x float> %vecins.31052}1053define <4 x float> @int_cosh_4x(ptr %a) {1054; CHECK-LABEL: @int_cosh_4x(1055; CHECK-NEXT: entry:1056; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161057; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vcoshf(<4 x float> [[TMP0]])1058; CHECK-NEXT: ret <4 x float> [[TMP1]]1059;1060; NOACCELERATE-LABEL: @int_cosh_4x(1061; NOACCELERATE-NEXT: entry:1062; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161063; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01064; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT]])1065; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 01066; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11067; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_1]])1068; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11069; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21070; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_2]])1071; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21072; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31073; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.cosh.f32(float [[VECEXT_3]])1074; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31075; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]1076;1077entry:1078 %0 = load <4 x float>, ptr %a, align 161079 %vecext = extractelement <4 x float> %0, i32 01080 %1 = tail call fast float @llvm.cosh.f32(float %vecext)1081 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01082 %vecext.1 = extractelement <4 x float> %0, i32 11083 %2 = tail call fast float @llvm.cosh.f32(float %vecext.1)1084 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11085 %vecext.2 = extractelement <4 x float> %0, i32 21086 %3 = tail call fast float @llvm.cosh.f32(float %vecext.2)1087 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21088 %vecext.3 = extractelement <4 x float> %0, i32 31089 %4 = tail call fast float @llvm.cosh.f32(float %vecext.3)1090 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31091 ret <4 x float> %vecins.31092}1093declare float @tanhf(float) readonly nounwind willreturn1094define <4 x float> @tanh_4x(ptr %a) {1095; CHECK-LABEL: @tanh_4x(1096; CHECK-NEXT: entry:1097; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161098; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vtanhf(<4 x float> [[TMP0]])1099; CHECK-NEXT: ret <4 x float> [[TMP1]]1100;1101; NOACCELERATE-LABEL: @tanh_4x(1102; NOACCELERATE-NEXT: entry:1103; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161104; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01105; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @tanhf(float [[VECEXT]])1106; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 01107; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11108; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @tanhf(float [[VECEXT_1]])1109; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11110; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21111; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @tanhf(float [[VECEXT_2]])1112; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21113; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31114; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @tanhf(float [[VECEXT_3]])1115; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31116; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]1117;1118entry:1119 %0 = load <4 x float>, ptr %a, align 161120 %vecext = extractelement <4 x float> %0, i32 01121 %1 = tail call fast float @tanhf(float %vecext)1122 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01123 %vecext.1 = extractelement <4 x float> %0, i32 11124 %2 = tail call fast float @tanhf(float %vecext.1)1125 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11126 %vecext.2 = extractelement <4 x float> %0, i32 21127 %3 = tail call fast float @tanhf(float %vecext.2)1128 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21129 %vecext.3 = extractelement <4 x float> %0, i32 31130 %4 = tail call fast float @tanhf(float %vecext.3)1131 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31132 ret <4 x float> %vecins.31133}1134define <4 x float> @int_tanh_4x(ptr %a) {1135; CHECK-LABEL: @int_tanh_4x(1136; CHECK-NEXT: entry:1137; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161138; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vtanhf(<4 x float> [[TMP0]])1139; CHECK-NEXT: ret <4 x float> [[TMP1]]1140;1141; NOACCELERATE-LABEL: @int_tanh_4x(1142; NOACCELERATE-NEXT: entry:1143; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161144; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01145; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT]])1146; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 01147; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11148; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_1]])1149; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11150; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21151; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_2]])1152; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21153; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31154; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.tanh.f32(float [[VECEXT_3]])1155; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31156; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]1157;1158entry:1159 %0 = load <4 x float>, ptr %a, align 161160 %vecext = extractelement <4 x float> %0, i32 01161 %1 = tail call fast float @llvm.tanh.f32(float %vecext)1162 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01163 %vecext.1 = extractelement <4 x float> %0, i32 11164 %2 = tail call fast float @llvm.tanh.f32(float %vecext.1)1165 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11166 %vecext.2 = extractelement <4 x float> %0, i32 21167 %3 = tail call fast float @llvm.tanh.f32(float %vecext.2)1168 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21169 %vecext.3 = extractelement <4 x float> %0, i32 31170 %4 = tail call fast float @llvm.tanh.f32(float %vecext.3)1171 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31172 ret <4 x float> %vecins.31173}1174declare float @asinhf(float) readonly nounwind willreturn1175define <4 x float> @asinh_4x(ptr %a) {1176; CHECK-LABEL: @asinh_4x(1177; CHECK-NEXT: entry:1178; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161179; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vasinhf(<4 x float> [[TMP0]])1180; CHECK-NEXT: ret <4 x float> [[TMP1]]1181;1182; NOACCELERATE-LABEL: @asinh_4x(1183; NOACCELERATE-NEXT: entry:1184; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161185; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01186; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @asinhf(float [[VECEXT]])1187; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 01188; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11189; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @asinhf(float [[VECEXT_1]])1190; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11191; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21192; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @asinhf(float [[VECEXT_2]])1193; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21194; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31195; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @asinhf(float [[VECEXT_3]])1196; NOACCELERATE-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31197; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_3]]1198;1199entry:1200 %0 = load <4 x float>, ptr %a, align 161201 %vecext = extractelement <4 x float> %0, i32 01202 %1 = tail call fast float @asinhf(float %vecext)1203 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01204 %vecext.1 = extractelement <4 x float> %0, i32 11205 %2 = tail call fast float @asinhf(float %vecext.1)1206 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11207 %vecext.2 = extractelement <4 x float> %0, i32 21208 %3 = tail call fast float @asinhf(float %vecext.2)1209 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21210 %vecext.3 = extractelement <4 x float> %0, i32 31211 %4 = tail call fast float @asinhf(float %vecext.3)1212 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31213 ret <4 x float> %vecins.31214}1215declare float @acoshf(float) readonly nounwind willreturn1216define <4 x float> @acosh_4x(ptr %a) {1217; CHECK-LABEL: @acosh_4x(1218; CHECK-NEXT: entry:1219; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161220; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vacoshf(<4 x float> [[TMP0]])1221; CHECK-NEXT: ret <4 x float> [[TMP1]]1222;1223; NOACCELERATE-LABEL: @acosh_4x(1224; NOACCELERATE-NEXT: entry:1225; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161226; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01227; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @acoshf(float [[VECEXT]])1228; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 01229; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11230; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @acoshf(float [[VECEXT_1]])1231; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11232; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21233; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @acoshf(float [[VECEXT_2]])1234; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21235; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31236; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @acoshf(float [[VECEXT_3]])1237; NOACCELERATE-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31238; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_3]]1239;1240entry:1241 %0 = load <4 x float>, ptr %a, align 161242 %vecext = extractelement <4 x float> %0, i32 01243 %1 = tail call fast float @acoshf(float %vecext)1244 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01245 %vecext.1 = extractelement <4 x float> %0, i32 11246 %2 = tail call fast float @acoshf(float %vecext.1)1247 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11248 %vecext.2 = extractelement <4 x float> %0, i32 21249 %3 = tail call fast float @acoshf(float %vecext.2)1250 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21251 %vecext.3 = extractelement <4 x float> %0, i32 31252 %4 = tail call fast float @acoshf(float %vecext.3)1253 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31254 ret <4 x float> %vecins.31255}1256declare float @atanhf(float) readonly nounwind willreturn1257define <4 x float> @atanh_4x(ptr %a) {1258; CHECK-LABEL: @atanh_4x(1259; CHECK-NEXT: entry:1260; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161261; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vatanhf(<4 x float> [[TMP0]])1262; CHECK-NEXT: ret <4 x float> [[TMP1]]1263;1264; NOACCELERATE-LABEL: @atanh_4x(1265; NOACCELERATE-NEXT: entry:1266; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161267; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01268; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @atanhf(float [[VECEXT]])1269; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 01270; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11271; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @atanhf(float [[VECEXT_1]])1272; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11273; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21274; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @atanhf(float [[VECEXT_2]])1275; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21276; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31277; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @atanhf(float [[VECEXT_3]])1278; NOACCELERATE-NEXT: [[VECINS_3:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31279; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_3]]1280;1281entry:1282 %0 = load <4 x float>, ptr %a, align 161283 %vecext = extractelement <4 x float> %0, i32 01284 %1 = tail call fast float @atanhf(float %vecext)1285 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01286 %vecext.1 = extractelement <4 x float> %0, i32 11287 %2 = tail call fast float @atanhf(float %vecext.1)1288 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11289 %vecext.2 = extractelement <4 x float> %0, i32 21290 %3 = tail call fast float @atanhf(float %vecext.2)1291 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21292 %vecext.3 = extractelement <4 x float> %0, i32 31293 %4 = tail call fast float @atanhf(float %vecext.3)1294 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31295 ret <4 x float> %vecins.31296}1297 1298; Accelerate *does not* provide sin() for <2 x float>.1299define <2 x float> @sin_2x(ptr %a) {1300; CHECK-LABEL: @sin_2x(1301; CHECK-NEXT: entry:1302; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[A:%.*]], align 161303; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <2 x float> [[TMP0]], i32 01304; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT]]) #[[ATTR2:[0-9]+]]1305; CHECK-NEXT: [[VECINS:%.*]] = insertelement <2 x float> zeroinitializer, float [[TMP1]], i32 01306; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <2 x float> [[TMP0]], i32 11307; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_1]]) #[[ATTR2]]1308; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <2 x float> [[VECINS]], float [[TMP2]], i32 11309; CHECK-NEXT: ret <2 x float> [[VECINS_1]]1310;1311; NOACCELERATE-LABEL: @sin_2x(1312; NOACCELERATE-NEXT: entry:1313; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[A:%.*]], align 161314; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <2 x float> [[TMP0]], i32 01315; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT]])1316; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <2 x float> zeroinitializer, float [[TMP1]], i32 01317; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <2 x float> [[TMP0]], i32 11318; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.sin.f32(float [[VECEXT_1]])1319; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <2 x float> [[VECINS]], float [[TMP2]], i32 11320; NOACCELERATE-NEXT: ret <2 x float> [[VECINS_1]]1321;1322entry:1323 %0 = load <2 x float>, ptr %a, align 161324 %vecext = extractelement <2 x float> %0, i32 01325 %1 = tail call fast float @llvm.sin.f32(float %vecext)1326 %vecins = insertelement <2 x float> zeroinitializer, float %1, i32 01327 %vecext.1 = extractelement <2 x float> %0, i32 11328 %2 = tail call fast float @llvm.sin.f32(float %vecext.1)1329 %vecins.1 = insertelement <2 x float> %vecins, float %2, i32 11330 ret <2 x float> %vecins.11331}1332 1333 1334declare float @llvm.cos.f32(float)1335 1336; Accelerate provides cos() for <4 x float>1337define <4 x float> @int_cos_4x(ptr %a) {1338; CHECK-LABEL: @int_cos_4x(1339; CHECK-NEXT: entry:1340; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161341; CHECK-NEXT: [[TMP1:%.*]] = call fast <4 x float> @vcosf(<4 x float> [[TMP0]])1342; CHECK-NEXT: ret <4 x float> [[TMP1]]1343;1344; NOACCELERATE-LABEL: @int_cos_4x(1345; NOACCELERATE-NEXT: entry:1346; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[A:%.*]], align 161347; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <4 x float> [[TMP0]], i32 01348; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT]])1349; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <4 x float> zeroinitializer, float [[TMP1]], i32 01350; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <4 x float> [[TMP0]], i32 11351; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_1]])1352; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <4 x float> [[VECINS]], float [[TMP2]], i32 11353; NOACCELERATE-NEXT: [[VECEXT_2:%.*]] = extractelement <4 x float> [[TMP0]], i32 21354; NOACCELERATE-NEXT: [[TMP3:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_2]])1355; NOACCELERATE-NEXT: [[VECINS_2:%.*]] = insertelement <4 x float> [[VECINS_1]], float [[TMP3]], i32 21356; NOACCELERATE-NEXT: [[VECEXT_3:%.*]] = extractelement <4 x float> [[TMP0]], i32 31357; NOACCELERATE-NEXT: [[TMP4:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_3]])1358; NOACCELERATE-NEXT: [[VECINS_31:%.*]] = insertelement <4 x float> [[VECINS_2]], float [[TMP4]], i32 31359; NOACCELERATE-NEXT: ret <4 x float> [[VECINS_31]]1360;1361entry:1362 %0 = load <4 x float>, ptr %a, align 161363 %vecext = extractelement <4 x float> %0, i32 01364 %1 = tail call fast float @llvm.cos.f32(float %vecext)1365 %vecins = insertelement <4 x float> zeroinitializer, float %1, i32 01366 %vecext.1 = extractelement <4 x float> %0, i32 11367 %2 = tail call fast float @llvm.cos.f32(float %vecext.1)1368 %vecins.1 = insertelement <4 x float> %vecins, float %2, i32 11369 %vecext.2 = extractelement <4 x float> %0, i32 21370 %3 = tail call fast float @llvm.cos.f32(float %vecext.2)1371 %vecins.2 = insertelement <4 x float> %vecins.1, float %3, i32 21372 %vecext.3 = extractelement <4 x float> %0, i32 31373 %4 = tail call fast float @llvm.cos.f32(float %vecext.3)1374 %vecins.3 = insertelement <4 x float> %vecins.2, float %4, i32 31375 ret <4 x float> %vecins.31376}1377 1378; Accelerate *does not* provide cos() for <2 x float>.1379define <2 x float> @cos_2x(ptr %a) {1380; CHECK-LABEL: @cos_2x(1381; CHECK-NEXT: entry:1382; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[A:%.*]], align 161383; CHECK-NEXT: [[VECEXT:%.*]] = extractelement <2 x float> [[TMP0]], i32 01384; CHECK-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT]]) #[[ATTR3:[0-9]+]]1385; CHECK-NEXT: [[VECINS:%.*]] = insertelement <2 x float> zeroinitializer, float [[TMP1]], i32 01386; CHECK-NEXT: [[VECEXT_1:%.*]] = extractelement <2 x float> [[TMP0]], i32 11387; CHECK-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_1]]) #[[ATTR3]]1388; CHECK-NEXT: [[VECINS_1:%.*]] = insertelement <2 x float> [[VECINS]], float [[TMP2]], i32 11389; CHECK-NEXT: ret <2 x float> [[VECINS_1]]1390;1391; NOACCELERATE-LABEL: @cos_2x(1392; NOACCELERATE-NEXT: entry:1393; NOACCELERATE-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[A:%.*]], align 161394; NOACCELERATE-NEXT: [[VECEXT:%.*]] = extractelement <2 x float> [[TMP0]], i32 01395; NOACCELERATE-NEXT: [[TMP1:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT]])1396; NOACCELERATE-NEXT: [[VECINS:%.*]] = insertelement <2 x float> zeroinitializer, float [[TMP1]], i32 01397; NOACCELERATE-NEXT: [[VECEXT_1:%.*]] = extractelement <2 x float> [[TMP0]], i32 11398; NOACCELERATE-NEXT: [[TMP2:%.*]] = tail call fast float @llvm.cos.f32(float [[VECEXT_1]])1399; NOACCELERATE-NEXT: [[VECINS_1:%.*]] = insertelement <2 x float> [[VECINS]], float [[TMP2]], i32 11400; NOACCELERATE-NEXT: ret <2 x float> [[VECINS_1]]1401;1402entry:1403 %0 = load <2 x float>, ptr %a, align 161404 %vecext = extractelement <2 x float> %0, i32 01405 %1 = tail call fast float @llvm.cos.f32(float %vecext)1406 %vecins = insertelement <2 x float> zeroinitializer, float %1, i32 01407 %vecext.1 = extractelement <2 x float> %0, i32 11408 %2 = tail call fast float @llvm.cos.f32(float %vecext.1)1409 %vecins.1 = insertelement <2 x float> %vecins, float %2, i32 11410 ret <2 x float> %vecins.11411}1412