171 lines · c
1// REQUIRES: x86-registered-target2// UNSUPPORTED: target={{.*}}-zos{{.*}}3// RUN: %clang -S -emit-llvm -fenable-matrix -ffp-model=fast %s -o - \4// RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-FAST5 6// RUN: %clang -S -emit-llvm -fenable-matrix -ffp-model=aggressive %s -o - \7// RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-AGGRESSIVE8 9// RUN: %clang -S -emit-llvm -fenable-matrix -ffp-model=precise %s -o - \10// RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-PRECISE11 12// RUN: %clang -S -emit-llvm -fenable-matrix -ffp-model=strict %s -o - \13// RUN: -target x86_64 | FileCheck %s --check-prefixes=CHECK,CHECK-STRICT14 15// RUN: %clang -S -emit-llvm -fenable-matrix -ffp-model=strict -ffast-math \16// RUN: -target x86_64 %s -o - | FileCheck %s \17// RUN: --check-prefixes CHECK,CHECK-STRICT-FAST18 19// RUN: %clang -S -emit-llvm -fenable-matrix -ffp-model=precise -ffast-math \20// RUN: %s -o - | FileCheck %s --check-prefixes CHECK,CHECK-FAST121 22float mymuladd(float x, float y, float z) {23 // CHECK: define{{.*}} float @mymuladd24 return x * y + z;25 26 // CHECK-AGGRESSIVE: fmul fast float27 // CHECK-AGGRESSIVE: load float, ptr28 // CHECK-AGGRESSIVE: fadd fast float29 30 // CHECK-FAST: fmul reassoc nsz arcp contract afn float31 // CHECK-FAST: load float, ptr32 // CHECK-FAST: fadd reassoc nsz arcp contract afn float33 34 // CHECK-PRECISE: load float, ptr35 // CHECK-PRECISE: load float, ptr36 // CHECK-PRECISE: load float, ptr37 // CHECK-PRECISE: call float @llvm.fmuladd.f32(float {{.*}}, float {{.*}}, float {{.*}})38 39 // CHECK-STRICT: load float, ptr40 // CHECK-STRICT: load float, ptr41 // CHECK-STRICT: call float @llvm.experimental.constrained.fmul.f32(float {{.*}}, float {{.*}}, {{.*}})42 // CHECK-STRICT: load float, ptr43 // CHECK-STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, {{.*}})44 45 // CHECK-STRICT-FAST: load float, ptr46 // CHECK-STRICT-FAST: load float, ptr47 // CHECK-STRICT-FAST: fmul fast float {{.*}}, {{.*}}48 // CHECK-STRICT-FAST: load float, ptr49 // CHECK-STRICT-FAST: fadd fast float {{.*}}, {{.*}}50 51 // CHECK-FAST1: load float, ptr52 // CHECK-FAST1: load float, ptr53 // CHECK-FAST1: fmul fast float {{.*}}, {{.*}}54 // CHECK-FAST1: load float, ptr {{.*}}55 // CHECK-FAST1: fadd fast float {{.*}}, {{.*}}56}57 58typedef float __attribute__((ext_vector_type(2))) v2f;59 60void my_vec_muladd(v2f x, float y, v2f z, v2f *res) {61 // CHECK: define{{.*}}@my_vec_muladd62 *res = x * y + z;63 64 // CHECK-AGGRESSIVE: fmul fast <2 x float>65 // CHECK-AGGRESSIVE: load <2 x float>, ptr66 // CHECK-AGGRESSIVE: fadd fast <2 x float>67 68 // CHECK-FAST: fmul reassoc nsz arcp contract afn <2 x float>69 // CHECK-FAST: load <2 x float>, ptr70 // CHECK-FAST: fadd reassoc nsz arcp contract afn <2 x float>71 72 // CHECK-PRECISE: load <2 x float>, ptr73 // CHECK-PRECISE: load float, ptr74 // CHECK-PRECISE: load <2 x float>, ptr75 // CHECK-PRECISE: call <2 x float> @llvm.fmuladd.v2f32(<2 x float> {{.*}}, <2 x float> {{.*}}, <2 x float> {{.*}})76 77 // CHECK-STRICT: load <2 x float>, ptr78 // CHECK-STRICT: load float, ptr79 // CHECK-STRICT: call <2 x float> @llvm.experimental.constrained.fmul.v2f32(<2 x float> {{.*}}, <2 x float> {{.*}}, {{.*}})80 // CHECK-STRICT: load <2 x float>, ptr81 // CHECK-STRICT: call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> {{.*}}, <2 x float> {{.*}}, {{.*}})82 83 // CHECK-STRICT-FAST: load <2 x float>, ptr84 // CHECK-STRICT-FAST: load float, ptr85 // CHECK-STRICT-FAST: fmul fast <2 x float> {{.*}}, {{.*}}86 // CHECK-STRICT-FAST: load <2 x float>, ptr87 // CHECK-STRICT-FAST: fadd fast <2 x float> {{.*}}, {{.*}}88 89 // CHECK-FAST1: load <2 x float>, ptr90 // CHECK-FAST1: load float, ptr91 // CHECK-FAST1: fmul fast <2 x float> {{.*}}, {{.*}}92 // CHECK-FAST1: load <2 x float>, ptr {{.*}}93 // CHECK-FAST1: fadd fast <2 x float> {{.*}}, {{.*}}94}95 96typedef float __attribute__((matrix_type(2, 1))) m21f;97 98void my_m21_muladd(m21f x, float y, m21f z, m21f *res) {99 // CHECK: define{{.*}}@my_m21_muladd100 *res = x * y + z;101 102 // CHECK-AGGRESSIVE: fmul fast <2 x float>103 // CHECK-AGGRESSIVE: load <2 x float>, ptr104 // CHECK-AGGRESSIVE: fadd fast <2 x float>105 106 // CHECK-FAST: fmul reassoc nsz arcp contract afn <2 x float>107 // CHECK-FAST: load <2 x float>, ptr108 // CHECK-FAST: fadd reassoc nsz arcp contract afn <2 x float>109 110 // CHECK-PRECISE: load <2 x float>, ptr111 // CHECK-PRECISE: load float, ptr112 // CHECK-PRECISE: load <2 x float>, ptr113 // CHECK-PRECISE: call <2 x float> @llvm.fmuladd.v2f32(<2 x float> {{.*}}, <2 x float> {{.*}}, <2 x float> {{.*}})114 115 // CHECK-STRICT: load <2 x float>, ptr116 // CHECK-STRICT: load float, ptr117 // CHECK-STRICT: call <2 x float> @llvm.experimental.constrained.fmul.v2f32(<2 x float> {{.*}}, <2 x float> {{.*}}, {{.*}})118 // CHECK-STRICT: load <2 x float>, ptr119 // CHECK-STRICT: call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> {{.*}}, <2 x float> {{.*}}, {{.*}})120 121 // CHECK-STRICT-FAST: load <2 x float>, ptr122 // CHECK-STRICT-FAST: load float, ptr123 // CHECK-STRICT-FAST: fmul fast <2 x float> {{.*}}, {{.*}}124 // CHECK-STRICT-FAST: load <2 x float>, ptr125 // CHECK-STRICT-FAST: fadd fast <2 x float> {{.*}}, {{.*}}126 127 // CHECK-FAST1: load <2 x float>, ptr128 // CHECK-FAST1: load float, ptr129 // CHECK-FAST1: fmul fast <2 x float> {{.*}}, {{.*}}130 // CHECK-FAST1: load <2 x float>, ptr {{.*}}131 // CHECK-FAST1: fadd fast <2 x float> {{.*}}, {{.*}}132}133 134typedef float __attribute__((matrix_type(2, 2))) m22f;135 136void my_m22_muladd(m22f x, float y, m22f z, m22f *res) {137 // CHECK: define{{.*}}@my_m22_muladd138 *res = x * y + z;139 140 // CHECK-AGGRESSIVE: fmul fast <4 x float>141 // CHECK-AGGRESSIVE: load <4 x float>, ptr142 // CHECK-AGGRESSIVE: fadd fast <4 x float>143 144 // CHECK-FAST: fmul reassoc nsz arcp contract afn <4 x float>145 // CHECK-FAST: load <4 x float>, ptr146 // CHECK-FAST: fadd reassoc nsz arcp contract afn <4 x float>147 148 // CHECK-PRECISE: load <4 x float>, ptr149 // CHECK-PRECISE: load float, ptr150 // CHECK-PRECISE: load <4 x float>, ptr151 // CHECK-PRECISE: call <4 x float> @llvm.fmuladd.v4f32(<4 x float> {{.*}}, <4 x float> {{.*}}, <4 x float> {{.*}})152 153 // CHECK-STRICT: load <4 x float>, ptr154 // CHECK-STRICT: load float, ptr155 // CHECK-STRICT: call <4 x float> @llvm.experimental.constrained.fmul.v4f32(<4 x float> {{.*}}, <4 x float> {{.*}}, {{.*}})156 // CHECK-STRICT: load <4 x float>, ptr157 // CHECK-STRICT: call <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float> {{.*}}, <4 x float> {{.*}}, {{.*}})158 159 // CHECK-STRICT-FAST: load <4 x float>, ptr160 // CHECK-STRICT-FAST: load float, ptr161 // CHECK-STRICT-FAST: fmul fast <4 x float> {{.*}}, {{.*}}162 // CHECK-STRICT-FAST: load <4 x float>, ptr163 // CHECK-STRICT-FAST: fadd fast <4 x float> {{.*}}, {{.*}}164 165 // CHECK-FAST1: load <4 x float>, ptr166 // CHECK-FAST1: load float, ptr167 // CHECK-FAST1: fmul fast <4 x float> {{.*}}, {{.*}}168 // CHECK-FAST1: load <4 x float>, ptr {{.*}}169 // CHECK-FAST1: fadd fast <4 x float> {{.*}}, {{.*}}170}171