130 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=-neon -fp-contract=fast | FileCheck %s --check-prefix=Aarch643; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s --check-prefix=Aarch64-Neon4 5define float @f1(float %a, float %b, float %c) {6; Aarch64-LABEL: f1:7; Aarch64: // %bb.0:8; Aarch64-NEXT: fmadd s0, s1, s0, s29; Aarch64-NEXT: ret10;11; Aarch64-Neon-LABEL: f1:12; Aarch64-Neon: // %bb.0:13; Aarch64-Neon-NEXT: fmadd s0, s1, s0, s214; Aarch64-Neon-NEXT: ret15 %mul = fmul fast float %b, %a16 %add = fadd fast float %mul, %c17 ret float %add18}19 20define float @f2(float %a, float %b, float %c) {21; Aarch64-LABEL: f2:22; Aarch64: // %bb.0:23; Aarch64-NEXT: fmul s0, s1, s024; Aarch64-NEXT: //ARITH_FENCE25; Aarch64-NEXT: fadd s0, s0, s226; Aarch64-NEXT: ret27;28; Aarch64-Neon-LABEL: f2:29; Aarch64-Neon: // %bb.0:30; Aarch64-Neon-NEXT: fmul s0, s1, s031; Aarch64-Neon-NEXT: //ARITH_FENCE32; Aarch64-Neon-NEXT: fadd s0, s0, s233; Aarch64-Neon-NEXT: ret34 %mul = fmul fast float %b, %a35 %tmp = call float @llvm.arithmetic.fence.f32(float %mul)36 %add = fadd fast float %tmp, %c37 ret float %add38}39 40define double @f3(double %a) {41; Aarch64-LABEL: f3:42; Aarch64: // %bb.0:43; Aarch64-NEXT: fmov d1, #4.0000000044; Aarch64-NEXT: fmul d0, d0, d145; Aarch64-NEXT: ret46;47; Aarch64-Neon-LABEL: f3:48; Aarch64-Neon: // %bb.0:49; Aarch64-Neon-NEXT: fmov d1, #4.0000000050; Aarch64-Neon-NEXT: fmul d0, d0, d151; Aarch64-Neon-NEXT: ret52 %1 = fadd fast double %a, %a53 %2 = fadd fast double %a, %a54 %3 = fadd fast double %1, %255 ret double %356}57 58define double @f4(double %a) {59; Aarch64-LABEL: f4:60; Aarch64: // %bb.0:61; Aarch64-NEXT: fadd d0, d0, d062; Aarch64-NEXT: fmov d1, d063; Aarch64-NEXT: //ARITH_FENCE64; Aarch64-NEXT: fadd d0, d1, d065; Aarch64-NEXT: ret66;67; Aarch64-Neon-LABEL: f4:68; Aarch64-Neon: // %bb.0:69; Aarch64-Neon-NEXT: fadd d0, d0, d070; Aarch64-Neon-NEXT: fmov d1, d071; Aarch64-Neon-NEXT: //ARITH_FENCE72; Aarch64-Neon-NEXT: fadd d0, d1, d073; Aarch64-Neon-NEXT: ret74 %1 = fadd fast double %a, %a75 %t = call double @llvm.arithmetic.fence.f64(double %1)76 %2 = fadd fast double %a, %a77 %3 = fadd fast double %t, %278 ret double %379}80 81define <2 x float> @f5(<2 x float> %a) {82; Aarch64-LABEL: f5:83; Aarch64: // %bb.0:84; Aarch64-NEXT: fmov s2, #4.0000000085; Aarch64-NEXT: fmul s0, s0, s286; Aarch64-NEXT: fmul s1, s1, s287; Aarch64-NEXT: ret88;89; Aarch64-Neon-LABEL: f5:90; Aarch64-Neon: // %bb.0:91; Aarch64-Neon-NEXT: fmov v1.2s, #4.0000000092; Aarch64-Neon-NEXT: fmul v0.2s, v0.2s, v1.2s93; Aarch64-Neon-NEXT: ret94 %1 = fadd fast <2 x float> %a, %a95 %2 = fadd fast <2 x float> %a, %a96 %3 = fadd fast <2 x float> %1, %297 ret <2 x float> %398}99 100define <2 x float> @f6(<2 x float> %a) {101; Aarch64-LABEL: f6:102; Aarch64: // %bb.0:103; Aarch64-NEXT: fadd s0, s0, s0104; Aarch64-NEXT: fadd s1, s1, s1105; Aarch64-NEXT: fmov s2, s1106; Aarch64-NEXT: fmov s3, s0107; Aarch64-NEXT: //ARITH_FENCE108; Aarch64-NEXT: //ARITH_FENCE109; Aarch64-NEXT: fadd s0, s3, s0110; Aarch64-NEXT: fadd s1, s2, s1111; Aarch64-NEXT: ret112;113; Aarch64-Neon-LABEL: f6:114; Aarch64-Neon: // %bb.0:115; Aarch64-Neon-NEXT: fadd v0.2s, v0.2s, v0.2s116; Aarch64-Neon-NEXT: fmov d1, d0117; Aarch64-Neon-NEXT: //ARITH_FENCE118; Aarch64-Neon-NEXT: fadd v0.2s, v1.2s, v0.2s119; Aarch64-Neon-NEXT: ret120 %1 = fadd fast <2 x float> %a, %a121 %t = call <2 x float> @llvm.arithmetic.fence.v2f32(<2 x float> %1)122 %2 = fadd fast <2 x float> %a, %a123 %3 = fadd fast <2 x float> %t, %2124 ret <2 x float> %3125}126 127declare float @llvm.arithmetic.fence.f32(float)128declare double @llvm.arithmetic.fence.f64(double)129declare <2 x float> @llvm.arithmetic.fence.v2f32(<2 x float>)130