275 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+fma4,-fma -show-mc-encoding | FileCheck %s --check-prefix=CHECK3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+fma4,+fma -show-mc-encoding | FileCheck %s --check-prefix=CHECK4 5define <4 x float> @test_x86_fma_vfmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) #0 {6; CHECK-LABEL: test_x86_fma_vfmadd_ps:7; CHECK: # %bb.0:8; CHECK-NEXT: vfmaddps %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x68,0xc2,0x10]9; CHECK-NEXT: # xmm0 = (xmm0 * xmm1) + xmm210; CHECK-NEXT: retq # encoding: [0xc3]11 %res = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)12 ret <4 x float> %res13}14declare <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float>, <4 x float>, <4 x float>)15 16define <2 x double> @test_x86_fma_vfmadd_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) #0 {17; CHECK-LABEL: test_x86_fma_vfmadd_pd:18; CHECK: # %bb.0:19; CHECK-NEXT: vfmaddpd %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x69,0xc2,0x10]20; CHECK-NEXT: # xmm0 = (xmm0 * xmm1) + xmm221; CHECK-NEXT: retq # encoding: [0xc3]22 %res = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)23 ret <2 x double> %res24}25declare <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double>, <2 x double>, <2 x double>)26 27define <8 x float> @test_x86_fma_vfmadd_ps_256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) #0 {28; CHECK-LABEL: test_x86_fma_vfmadd_ps_256:29; CHECK: # %bb.0:30; CHECK-NEXT: vfmaddps %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x68,0xc2,0x10]31; CHECK-NEXT: # ymm0 = (ymm0 * ymm1) + ymm232; CHECK-NEXT: retq # encoding: [0xc3]33 %res = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2)34 ret <8 x float> %res35}36declare <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float>, <8 x float>, <8 x float>)37 38define <4 x double> @test_x86_fma_vfmadd_pd_256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) #0 {39; CHECK-LABEL: test_x86_fma_vfmadd_pd_256:40; CHECK: # %bb.0:41; CHECK-NEXT: vfmaddpd %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x69,0xc2,0x10]42; CHECK-NEXT: # ymm0 = (ymm0 * ymm1) + ymm243; CHECK-NEXT: retq # encoding: [0xc3]44 %res = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2)45 ret <4 x double> %res46}47declare <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double>, <4 x double>, <4 x double>)48 49; VFMSUB50define <4 x float> @test_x86_fma_vfmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) #0 {51; CHECK-LABEL: test_x86_fma_vfmsub_ps:52; CHECK: # %bb.0:53; CHECK-NEXT: vfmsubps %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x6c,0xc2,0x10]54; CHECK-NEXT: # xmm0 = (xmm0 * xmm1) - xmm255; CHECK-NEXT: retq # encoding: [0xc3]56 %res = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)57 ret <4 x float> %res58}59declare <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float>, <4 x float>, <4 x float>)60 61define <2 x double> @test_x86_fma_vfmsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) #0 {62; CHECK-LABEL: test_x86_fma_vfmsub_pd:63; CHECK: # %bb.0:64; CHECK-NEXT: vfmsubpd %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x6d,0xc2,0x10]65; CHECK-NEXT: # xmm0 = (xmm0 * xmm1) - xmm266; CHECK-NEXT: retq # encoding: [0xc3]67 %res = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)68 ret <2 x double> %res69}70declare <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double>, <2 x double>, <2 x double>)71 72define <8 x float> @test_x86_fma_vfmsub_ps_256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) #0 {73; CHECK-LABEL: test_x86_fma_vfmsub_ps_256:74; CHECK: # %bb.0:75; CHECK-NEXT: vfmsubps %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x6c,0xc2,0x10]76; CHECK-NEXT: # ymm0 = (ymm0 * ymm1) - ymm277; CHECK-NEXT: retq # encoding: [0xc3]78 %res = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2)79 ret <8 x float> %res80}81declare <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float>, <8 x float>, <8 x float>)82 83define <4 x double> @test_x86_fma_vfmsub_pd_256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) #0 {84; CHECK-LABEL: test_x86_fma_vfmsub_pd_256:85; CHECK: # %bb.0:86; CHECK-NEXT: vfmsubpd %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x6d,0xc2,0x10]87; CHECK-NEXT: # ymm0 = (ymm0 * ymm1) - ymm288; CHECK-NEXT: retq # encoding: [0xc3]89 %res = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2)90 ret <4 x double> %res91}92declare <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double>, <4 x double>, <4 x double>)93 94; VFNMADD95define <4 x float> @test_x86_fma_vfnmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) #0 {96; CHECK-LABEL: test_x86_fma_vfnmadd_ps:97; CHECK: # %bb.0:98; CHECK-NEXT: vfnmaddps %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x78,0xc2,0x10]99; CHECK-NEXT: # xmm0 = -(xmm0 * xmm1) + xmm2100; CHECK-NEXT: retq # encoding: [0xc3]101 %res = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)102 ret <4 x float> %res103}104declare <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float>, <4 x float>, <4 x float>)105 106define <2 x double> @test_x86_fma_vfnmadd_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) #0 {107; CHECK-LABEL: test_x86_fma_vfnmadd_pd:108; CHECK: # %bb.0:109; CHECK-NEXT: vfnmaddpd %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x79,0xc2,0x10]110; CHECK-NEXT: # xmm0 = -(xmm0 * xmm1) + xmm2111; CHECK-NEXT: retq # encoding: [0xc3]112 %res = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)113 ret <2 x double> %res114}115declare <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double>, <2 x double>, <2 x double>)116 117define <8 x float> @test_x86_fma_vfnmadd_ps_256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) #0 {118; CHECK-LABEL: test_x86_fma_vfnmadd_ps_256:119; CHECK: # %bb.0:120; CHECK-NEXT: vfnmaddps %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x78,0xc2,0x10]121; CHECK-NEXT: # ymm0 = -(ymm0 * ymm1) + ymm2122; CHECK-NEXT: retq # encoding: [0xc3]123 %res = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2)124 ret <8 x float> %res125}126declare <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float>, <8 x float>, <8 x float>)127 128define <4 x double> @test_x86_fma_vfnmadd_pd_256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) #0 {129; CHECK-LABEL: test_x86_fma_vfnmadd_pd_256:130; CHECK: # %bb.0:131; CHECK-NEXT: vfnmaddpd %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x79,0xc2,0x10]132; CHECK-NEXT: # ymm0 = -(ymm0 * ymm1) + ymm2133; CHECK-NEXT: retq # encoding: [0xc3]134 %res = call <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2)135 ret <4 x double> %res136}137declare <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double>, <4 x double>, <4 x double>)138 139; VFNMSUB140define <4 x float> @test_x86_fma_vfnmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) #0 {141; CHECK-LABEL: test_x86_fma_vfnmsub_ps:142; CHECK: # %bb.0:143; CHECK-NEXT: vfnmsubps %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x7c,0xc2,0x10]144; CHECK-NEXT: # xmm0 = -(xmm0 * xmm1) - xmm2145; CHECK-NEXT: retq # encoding: [0xc3]146 %res = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)147 ret <4 x float> %res148}149declare <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float>, <4 x float>, <4 x float>)150 151define <2 x double> @test_x86_fma_vfnmsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) #0 {152; CHECK-LABEL: test_x86_fma_vfnmsub_pd:153; CHECK: # %bb.0:154; CHECK-NEXT: vfnmsubpd %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x7d,0xc2,0x10]155; CHECK-NEXT: # xmm0 = -(xmm0 * xmm1) - xmm2156; CHECK-NEXT: retq # encoding: [0xc3]157 %res = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)158 ret <2 x double> %res159}160declare <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double>, <2 x double>, <2 x double>)161 162define <8 x float> @test_x86_fma_vfnmsub_ps_256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) #0 {163; CHECK-LABEL: test_x86_fma_vfnmsub_ps_256:164; CHECK: # %bb.0:165; CHECK-NEXT: vfnmsubps %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x7c,0xc2,0x10]166; CHECK-NEXT: # ymm0 = -(ymm0 * ymm1) - ymm2167; CHECK-NEXT: retq # encoding: [0xc3]168 %res = call <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2)169 ret <8 x float> %res170}171declare <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float>, <8 x float>, <8 x float>)172 173define <4 x double> @test_x86_fma_vfnmsub_pd_256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) #0 {174; CHECK-LABEL: test_x86_fma_vfnmsub_pd_256:175; CHECK: # %bb.0:176; CHECK-NEXT: vfnmsubpd %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x7d,0xc2,0x10]177; CHECK-NEXT: # ymm0 = -(ymm0 * ymm1) - ymm2178; CHECK-NEXT: retq # encoding: [0xc3]179 %res = call <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2)180 ret <4 x double> %res181}182declare <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double>, <4 x double>, <4 x double>)183 184; VFMADDSUB185define <4 x float> @test_x86_fma_vfmaddsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) #0 {186; CHECK-LABEL: test_x86_fma_vfmaddsub_ps:187; CHECK: # %bb.0:188; CHECK-NEXT: vfmaddsubps %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x5c,0xc2,0x10]189; CHECK-NEXT: # xmm0 = (xmm0 * xmm1) +/- xmm2190; CHECK-NEXT: retq # encoding: [0xc3]191 %res = call <4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)192 ret <4 x float> %res193}194declare <4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float>, <4 x float>, <4 x float>)195 196define <2 x double> @test_x86_fma_vfmaddsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) #0 {197; CHECK-LABEL: test_x86_fma_vfmaddsub_pd:198; CHECK: # %bb.0:199; CHECK-NEXT: vfmaddsubpd %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x5d,0xc2,0x10]200; CHECK-NEXT: # xmm0 = (xmm0 * xmm1) +/- xmm2201; CHECK-NEXT: retq # encoding: [0xc3]202 %res = call <2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)203 ret <2 x double> %res204}205declare <2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double>, <2 x double>, <2 x double>)206 207define <8 x float> @test_x86_fma_vfmaddsub_ps_256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) #0 {208; CHECK-LABEL: test_x86_fma_vfmaddsub_ps_256:209; CHECK: # %bb.0:210; CHECK-NEXT: vfmaddsubps %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x5c,0xc2,0x10]211; CHECK-NEXT: # ymm0 = (ymm0 * ymm1) +/- ymm2212; CHECK-NEXT: retq # encoding: [0xc3]213 %res = call <8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2)214 ret <8 x float> %res215}216declare <8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float>, <8 x float>, <8 x float>)217 218define <4 x double> @test_x86_fma_vfmaddsub_pd_256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) #0 {219; CHECK-LABEL: test_x86_fma_vfmaddsub_pd_256:220; CHECK: # %bb.0:221; CHECK-NEXT: vfmaddsubpd %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x5d,0xc2,0x10]222; CHECK-NEXT: # ymm0 = (ymm0 * ymm1) +/- ymm2223; CHECK-NEXT: retq # encoding: [0xc3]224 %res = call <4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2)225 ret <4 x double> %res226}227declare <4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double>, <4 x double>, <4 x double>)228 229; VFMSUBADD230define <4 x float> @test_x86_fma_vfmsubadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) #0 {231; CHECK-LABEL: test_x86_fma_vfmsubadd_ps:232; CHECK: # %bb.0:233; CHECK-NEXT: vfmsubaddps %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x5e,0xc2,0x10]234; CHECK-NEXT: # xmm0 = (xmm0 * xmm1) -/+ xmm2235; CHECK-NEXT: retq # encoding: [0xc3]236 %res = call <4 x float> @llvm.x86.fma.vfmsubadd.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)237 ret <4 x float> %res238}239declare <4 x float> @llvm.x86.fma.vfmsubadd.ps(<4 x float>, <4 x float>, <4 x float>)240 241define <2 x double> @test_x86_fma_vfmsubadd_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) #0 {242; CHECK-LABEL: test_x86_fma_vfmsubadd_pd:243; CHECK: # %bb.0:244; CHECK-NEXT: vfmsubaddpd %xmm2, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0xf9,0x5f,0xc2,0x10]245; CHECK-NEXT: # xmm0 = (xmm0 * xmm1) -/+ xmm2246; CHECK-NEXT: retq # encoding: [0xc3]247 %res = call <2 x double> @llvm.x86.fma.vfmsubadd.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)248 ret <2 x double> %res249}250declare <2 x double> @llvm.x86.fma.vfmsubadd.pd(<2 x double>, <2 x double>, <2 x double>)251 252define <8 x float> @test_x86_fma_vfmsubadd_ps_256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) #0 {253; CHECK-LABEL: test_x86_fma_vfmsubadd_ps_256:254; CHECK: # %bb.0:255; CHECK-NEXT: vfmsubaddps %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x5e,0xc2,0x10]256; CHECK-NEXT: # ymm0 = (ymm0 * ymm1) -/+ ymm2257; CHECK-NEXT: retq # encoding: [0xc3]258 %res = call <8 x float> @llvm.x86.fma.vfmsubadd.ps.256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2)259 ret <8 x float> %res260}261declare <8 x float> @llvm.x86.fma.vfmsubadd.ps.256(<8 x float>, <8 x float>, <8 x float>)262 263define <4 x double> @test_x86_fma_vfmsubadd_pd_256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) #0 {264; CHECK-LABEL: test_x86_fma_vfmsubadd_pd_256:265; CHECK: # %bb.0:266; CHECK-NEXT: vfmsubaddpd %ymm2, %ymm1, %ymm0, %ymm0 # encoding: [0xc4,0xe3,0xfd,0x5f,0xc2,0x10]267; CHECK-NEXT: # ymm0 = (ymm0 * ymm1) -/+ ymm2268; CHECK-NEXT: retq # encoding: [0xc3]269 %res = call <4 x double> @llvm.x86.fma.vfmsubadd.pd.256(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2)270 ret <4 x double> %res271}272declare <4 x double> @llvm.x86.fma.vfmsubadd.pd.256(<4 x double>, <4 x double>, <4 x double>)273 274attributes #0 = { nounwind }275