197 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+fp16,+simd128,+relaxed-simd | FileCheck %s --check-prefix=RELAXED3; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+fp16,+simd128, | FileCheck %s --check-prefix=STRICT4 5target triple = "wasm32"6 7define double @fsub_fmul_contract_f64(double %a, double %b, double %c) {8; RELAXED-LABEL: fsub_fmul_contract_f64:9; RELAXED: .functype fsub_fmul_contract_f64 (f64, f64, f64) -> (f64)10; RELAXED-NEXT: # %bb.0:11; RELAXED-NEXT: f64.mul $push0=, $1, $012; RELAXED-NEXT: f64.sub $push1=, $2, $pop013; RELAXED-NEXT: return $pop114;15; STRICT-LABEL: fsub_fmul_contract_f64:16; STRICT: .functype fsub_fmul_contract_f64 (f64, f64, f64) -> (f64)17; STRICT-NEXT: # %bb.0:18; STRICT-NEXT: f64.mul $push0=, $1, $019; STRICT-NEXT: f64.sub $push1=, $2, $pop020; STRICT-NEXT: return $pop121 %mul = fmul contract double %b, %a22 %sub = fsub contract double %c, %mul23 ret double %sub24}25 26define <4 x float> @fsub_fmul_contract_4xf32(<4 x float> %a, <4 x float> %b, <4 x float> %c) {27; RELAXED-LABEL: fsub_fmul_contract_4xf32:28; RELAXED: .functype fsub_fmul_contract_4xf32 (v128, v128, v128) -> (v128)29; RELAXED-NEXT: # %bb.0:30; RELAXED-NEXT: f32x4.relaxed_nmadd $push0=, $1, $0, $231; RELAXED-NEXT: return $pop032;33; STRICT-LABEL: fsub_fmul_contract_4xf32:34; STRICT: .functype fsub_fmul_contract_4xf32 (v128, v128, v128) -> (v128)35; STRICT-NEXT: # %bb.0:36; STRICT-NEXT: f32x4.mul $push0=, $1, $037; STRICT-NEXT: f32x4.sub $push1=, $2, $pop038; STRICT-NEXT: return $pop139 %mul = fmul contract <4 x float> %b, %a40 %sub = fsub contract <4 x float> %c, %mul41 ret <4 x float> %sub42}43 44 45define <8 x half> @fsub_fmul_contract_8xf16(<8 x half> %a, <8 x half> %b, <8 x half> %c) {46; RELAXED-LABEL: fsub_fmul_contract_8xf16:47; RELAXED: .functype fsub_fmul_contract_8xf16 (v128, v128, v128) -> (v128)48; RELAXED-NEXT: # %bb.0:49; RELAXED-NEXT: f16x8.nmadd $push0=, $1, $0, $250; RELAXED-NEXT: return $pop051;52; STRICT-LABEL: fsub_fmul_contract_8xf16:53; STRICT: .functype fsub_fmul_contract_8xf16 (v128, v128, v128) -> (v128)54; STRICT-NEXT: # %bb.0:55; STRICT-NEXT: f16x8.nmadd $push0=, $1, $0, $256; STRICT-NEXT: return $pop057 %mul = fmul contract <8 x half> %b, %a58 %sub = fsub contract <8 x half> %c, %mul59 ret <8 x half> %sub60}61 62 63define <4 x float> @fsub_fmul_4xf32(<4 x float> %a, <4 x float> %b, <4 x float> %c) {64; RELAXED-LABEL: fsub_fmul_4xf32:65; RELAXED: .functype fsub_fmul_4xf32 (v128, v128, v128) -> (v128)66; RELAXED-NEXT: # %bb.0:67; RELAXED-NEXT: f32x4.mul $push0=, $1, $068; RELAXED-NEXT: f32x4.sub $push1=, $2, $pop069; RELAXED-NEXT: return $pop170;71; STRICT-LABEL: fsub_fmul_4xf32:72; STRICT: .functype fsub_fmul_4xf32 (v128, v128, v128) -> (v128)73; STRICT-NEXT: # %bb.0:74; STRICT-NEXT: f32x4.mul $push0=, $1, $075; STRICT-NEXT: f32x4.sub $push1=, $2, $pop076; STRICT-NEXT: return $pop177 %mul = fmul <4 x float> %b, %a78 %sub = fsub contract <4 x float> %c, %mul79 ret <4 x float> %sub80}81 82define <8 x float> @fsub_fmul_contract_8xf32(<8 x float> %a, <8 x float> %b, <8 x float> %c) {83; RELAXED-LABEL: fsub_fmul_contract_8xf32:84; RELAXED: .functype fsub_fmul_contract_8xf32 (i32, v128, v128, v128, v128, v128, v128) -> ()85; RELAXED-NEXT: # %bb.0:86; RELAXED-NEXT: f32x4.relaxed_nmadd $push0=, $4, $2, $687; RELAXED-NEXT: v128.store 16($0), $pop088; RELAXED-NEXT: f32x4.relaxed_nmadd $push1=, $3, $1, $589; RELAXED-NEXT: v128.store 0($0), $pop190; RELAXED-NEXT: return91;92; STRICT-LABEL: fsub_fmul_contract_8xf32:93; STRICT: .functype fsub_fmul_contract_8xf32 (i32, v128, v128, v128, v128, v128, v128) -> ()94; STRICT-NEXT: # %bb.0:95; STRICT-NEXT: f32x4.mul $push0=, $4, $296; STRICT-NEXT: f32x4.sub $push1=, $6, $pop097; STRICT-NEXT: v128.store 16($0), $pop198; STRICT-NEXT: f32x4.mul $push2=, $3, $199; STRICT-NEXT: f32x4.sub $push3=, $5, $pop2100; STRICT-NEXT: v128.store 0($0), $pop3101; STRICT-NEXT: return102 %mul = fmul contract <8 x float> %b, %a103 %sub = fsub contract <8 x float> %c, %mul104 ret <8 x float> %sub105}106 107 108define <2 x double> @fsub_fmul_contract_2xf64(<2 x double> %a, <2 x double> %b, <2 x double> %c) {109; RELAXED-LABEL: fsub_fmul_contract_2xf64:110; RELAXED: .functype fsub_fmul_contract_2xf64 (v128, v128, v128) -> (v128)111; RELAXED-NEXT: # %bb.0:112; RELAXED-NEXT: f64x2.relaxed_nmadd $push0=, $1, $0, $2113; RELAXED-NEXT: return $pop0114;115; STRICT-LABEL: fsub_fmul_contract_2xf64:116; STRICT: .functype fsub_fmul_contract_2xf64 (v128, v128, v128) -> (v128)117; STRICT-NEXT: # %bb.0:118; STRICT-NEXT: f64x2.mul $push0=, $1, $0119; STRICT-NEXT: f64x2.sub $push1=, $2, $pop0120; STRICT-NEXT: return $pop1121 %mul = fmul contract <2 x double> %b, %a122 %sub = fsub contract <2 x double> %c, %mul123 ret <2 x double> %sub124}125 126define float @fsub_fmul_contract_f32(float %a, float %b, float %c) {127; RELAXED-LABEL: fsub_fmul_contract_f32:128; RELAXED: .functype fsub_fmul_contract_f32 (f32, f32, f32) -> (f32)129; RELAXED-NEXT: # %bb.0:130; RELAXED-NEXT: f32.mul $push0=, $1, $0131; RELAXED-NEXT: f32.sub $push1=, $2, $pop0132; RELAXED-NEXT: return $pop1133;134; STRICT-LABEL: fsub_fmul_contract_f32:135; STRICT: .functype fsub_fmul_contract_f32 (f32, f32, f32) -> (f32)136; STRICT-NEXT: # %bb.0:137; STRICT-NEXT: f32.mul $push0=, $1, $0138; STRICT-NEXT: f32.sub $push1=, $2, $pop0139; STRICT-NEXT: return $pop1140 %mul = fmul contract float %b, %a141 %sub = fsub contract float %c, %mul142 ret float %sub143}144 145define <8 x half> @fmuladd_8xf16(<8 x half> %a, <8 x half> %b, <8 x half> %c) {146; RELAXED-LABEL: fmuladd_8xf16:147; RELAXED: .functype fmuladd_8xf16 (v128, v128, v128) -> (v128)148; RELAXED-NEXT: # %bb.0:149; RELAXED-NEXT: f16x8.nmadd $push0=, $0, $1, $2150; RELAXED-NEXT: return $pop0151;152; STRICT-LABEL: fmuladd_8xf16:153; STRICT: .functype fmuladd_8xf16 (v128, v128, v128) -> (v128)154; STRICT-NEXT: # %bb.0:155; STRICT-NEXT: f16x8.nmadd $push0=, $0, $1, $2156; STRICT-NEXT: return $pop0157 %fneg = fneg <8 x half> %a158 %fma = call <8 x half> @llvm.fmuladd(<8 x half> %fneg, <8 x half> %b, <8 x half> %c)159 ret <8 x half> %fma160}161 162define <4 x float> @fmuladd_4xf32(<4 x float> %a, <4 x float> %b, <4 x float> %c) {163; RELAXED-LABEL: fmuladd_4xf32:164; RELAXED: .functype fmuladd_4xf32 (v128, v128, v128) -> (v128)165; RELAXED-NEXT: # %bb.0:166; RELAXED-NEXT: f32x4.relaxed_nmadd $push0=, $0, $1, $2167; RELAXED-NEXT: return $pop0168;169; STRICT-LABEL: fmuladd_4xf32:170; STRICT: .functype fmuladd_4xf32 (v128, v128, v128) -> (v128)171; STRICT-NEXT: # %bb.0:172; STRICT-NEXT: f32x4.mul $push0=, $0, $1173; STRICT-NEXT: f32x4.sub $push1=, $2, $pop0174; STRICT-NEXT: return $pop1175 %fneg = fneg <4 x float> %a176 %fma = call <4 x float> @llvm.fmuladd(<4 x float> %fneg, <4 x float> %b, <4 x float> %c)177 ret <4 x float> %fma178}179 180define <2 x double> @fmuladd_2xf64(<2 x double> %a, <2 x double> %b, <2 x double> %c) {181; RELAXED-LABEL: fmuladd_2xf64:182; RELAXED: .functype fmuladd_2xf64 (v128, v128, v128) -> (v128)183; RELAXED-NEXT: # %bb.0:184; RELAXED-NEXT: f64x2.relaxed_nmadd $push0=, $0, $1, $2185; RELAXED-NEXT: return $pop0186;187; STRICT-LABEL: fmuladd_2xf64:188; STRICT: .functype fmuladd_2xf64 (v128, v128, v128) -> (v128)189; STRICT-NEXT: # %bb.0:190; STRICT-NEXT: f64x2.mul $push0=, $0, $1191; STRICT-NEXT: f64x2.sub $push1=, $2, $pop0192; STRICT-NEXT: return $pop1193 %fneg = fneg <2 x double> %a194 %fma = call <2 x double> @llvm.fmuladd(<2 x double> %fneg, <2 x double> %b, <2 x double> %c)195 ret <2 x double> %fma196}197