xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/fma-phi-213-to-231.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-apple-darwin10  -mattr=+fma,-fma4  | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mattr=+fma,-fma4 | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=bdver2 -mattr=-fma4  | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Test FMA3 variant selection
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fma3_select231ssX:
8*9880d681SAndroid Build Coastguard Worker; CHECK: vfmadd231ss %xmm
9*9880d681SAndroid Build Coastguard Workerdefine float @fma3_select231ssX(float %x, float %y) {
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  br label %while.body
12*9880d681SAndroid Build Coastguard Workerwhile.body:
13*9880d681SAndroid Build Coastguard Worker  %acc.01 = phi float [ 0.000000e+00, %entry ], [ %acc, %while.body ]
14*9880d681SAndroid Build Coastguard Worker  %acc = call float @llvm.fma.f32(float %x, float %y, float %acc.01)
15*9880d681SAndroid Build Coastguard Worker  %b = fcmp ueq float %acc, 0.0
16*9880d681SAndroid Build Coastguard Worker  br i1 %b, label %while.body, label %while.end
17*9880d681SAndroid Build Coastguard Workerwhile.end:
18*9880d681SAndroid Build Coastguard Worker  ret float %acc
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fma3_select231pdY:
22*9880d681SAndroid Build Coastguard Worker; CHECK: vfmadd231pd %ymm
23*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @fma3_select231pdY(<4 x double> %x, <4 x double> %y) {
24*9880d681SAndroid Build Coastguard Workerentry:
25*9880d681SAndroid Build Coastguard Worker  br label %while.body
26*9880d681SAndroid Build Coastguard Workerwhile.body:
27*9880d681SAndroid Build Coastguard Worker  %acc.04 = phi <4 x double> [ zeroinitializer, %entry ], [ %add, %while.body ]
28*9880d681SAndroid Build Coastguard Worker  %add = call <4 x double> @llvm.fma.v4f64(<4 x double> %x, <4 x double> %y, <4 x double> %acc.04)
29*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <4 x double> %add, i32 0
30*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq double %vecext, 0.000000e+00
31*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %while.body, label %while.end
32*9880d681SAndroid Build Coastguard Workerwhile.end:
33*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %add
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float, float, float)
37*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.fma.v4f64(<4 x double>, <4 x double>, <4 x double>)
38