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