Skip to content

Commit b8e135e

Browse files
committed
[X86] Support ATOMIC_LOAD_FP_BINOP_MI for other binops
Since we can bitcast and then do the same thing sub does in the table section above, I figured it was trivial to add fsub, fmul, and fdiv.
1 parent 863ac6d commit b8e135e

File tree

2 files changed

+45
-60
lines changed

2 files changed

+45
-60
lines changed

llvm/lib/Target/X86/X86InstrCompiler.td

+4-1
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,10 @@ multiclass ATOMIC_LOAD_FP_BINOP_MI<string Name, SDNode op> {
11251125
Requires<[HasAVX512]>;
11261126
}
11271127
defm : ATOMIC_LOAD_FP_BINOP_MI<"ADD", fadd>;
1128-
// FIXME: Add fsub, fmul, fdiv, ...
1128+
defm : ATOMIC_LOAD_FP_BINOP_MI<"SUB", fsub>;
1129+
defm : ATOMIC_LOAD_FP_BINOP_MI<"MUL", fmul>;
1130+
defm : ATOMIC_LOAD_FP_BINOP_MI<"DIV", fdiv>;
1131+
// FIXME: Add fcomi, fucomi, ...
11291132

11301133
multiclass RELEASE_UNOP<string Name, dag dag8, dag dag16, dag dag32,
11311134
dag dag64> {

llvm/test/CodeGen/X86/atomic-fp.ll

+41-59
Original file line numberDiff line numberDiff line change
@@ -1311,36 +1311,32 @@ define dso_local void @fsub_32stack() nounwind {
13111311
; X86-SSE2-LABEL: fsub_32stack:
13121312
; X86-SSE2: # %bb.0:
13131313
; X86-SSE2-NEXT: pushl %eax
1314-
; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1315-
; X86-SSE2-NEXT: movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
1316-
; X86-SSE2-NEXT: subss %xmm0, %xmm1
1317-
; X86-SSE2-NEXT: movss %xmm1, (%esp)
1314+
; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
1315+
; X86-SSE2-NEXT: subss (%esp), %xmm0
1316+
; X86-SSE2-NEXT: movss %xmm0, (%esp)
13181317
; X86-SSE2-NEXT: popl %eax
13191318
; X86-SSE2-NEXT: retl
13201319
;
13211320
; X86-AVX-LABEL: fsub_32stack:
13221321
; X86-AVX: # %bb.0:
13231322
; X86-AVX-NEXT: pushl %eax
1324-
; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1325-
; X86-AVX-NEXT: vmovss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
1326-
; X86-AVX-NEXT: vsubss %xmm0, %xmm1, %xmm0
1323+
; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
1324+
; X86-AVX-NEXT: vsubss (%esp), %xmm0, %xmm0
13271325
; X86-AVX-NEXT: vmovss %xmm0, (%esp)
13281326
; X86-AVX-NEXT: popl %eax
13291327
; X86-AVX-NEXT: retl
13301328
;
13311329
; X64-SSE-LABEL: fsub_32stack:
13321330
; X64-SSE: # %bb.0:
1333-
; X64-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1334-
; X64-SSE-NEXT: movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
1335-
; X64-SSE-NEXT: subss %xmm0, %xmm1
1336-
; X64-SSE-NEXT: movss %xmm1, -{{[0-9]+}}(%rsp)
1331+
; X64-SSE-NEXT: movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
1332+
; X64-SSE-NEXT: subss -{{[0-9]+}}(%rsp), %xmm0
1333+
; X64-SSE-NEXT: movss %xmm0, -{{[0-9]+}}(%rsp)
13371334
; X64-SSE-NEXT: retq
13381335
;
13391336
; X64-AVX-LABEL: fsub_32stack:
13401337
; X64-AVX: # %bb.0:
1341-
; X64-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1342-
; X64-AVX-NEXT: vmovss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
1343-
; X64-AVX-NEXT: vsubss %xmm0, %xmm1, %xmm0
1338+
; X64-AVX-NEXT: vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
1339+
; X64-AVX-NEXT: vsubss -{{[0-9]+}}(%rsp), %xmm0, %xmm0
13441340
; X64-AVX-NEXT: vmovss %xmm0, -{{[0-9]+}}(%rsp)
13451341
; X64-AVX-NEXT: retq
13461342
%ptr = alloca i32, align 4
@@ -1433,17 +1429,15 @@ define dso_local void @fsub_64stack() nounwind {
14331429
;
14341430
; X64-SSE-LABEL: fsub_64stack:
14351431
; X64-SSE: # %bb.0:
1436-
; X64-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
1437-
; X64-SSE-NEXT: movsd {{.*#+}} xmm1 = [1.0E+0,0.0E+0]
1438-
; X64-SSE-NEXT: subsd %xmm0, %xmm1
1439-
; X64-SSE-NEXT: movsd %xmm1, -{{[0-9]+}}(%rsp)
1432+
; X64-SSE-NEXT: movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]
1433+
; X64-SSE-NEXT: subsd -{{[0-9]+}}(%rsp), %xmm0
1434+
; X64-SSE-NEXT: movsd %xmm0, -{{[0-9]+}}(%rsp)
14401435
; X64-SSE-NEXT: retq
14411436
;
14421437
; X64-AVX-LABEL: fsub_64stack:
14431438
; X64-AVX: # %bb.0:
1444-
; X64-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
1445-
; X64-AVX-NEXT: vmovsd {{.*#+}} xmm1 = [1.0E+0,0.0E+0]
1446-
; X64-AVX-NEXT: vsubsd %xmm0, %xmm1, %xmm0
1439+
; X64-AVX-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]
1440+
; X64-AVX-NEXT: vsubsd -{{[0-9]+}}(%rsp), %xmm0, %xmm0
14471441
; X64-AVX-NEXT: vmovsd %xmm0, -{{[0-9]+}}(%rsp)
14481442
; X64-AVX-NEXT: retq
14491443
%ptr = alloca i64, align 8
@@ -1600,29 +1594,27 @@ define dso_local void @fmul_32r(ptr %loc, float %val) nounwind {
16001594
; X86-SSE2: # %bb.0:
16011595
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
16021596
; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1603-
; X86-SSE2-NEXT: mulss {{[0-9]+}}(%esp), %xmm0
1597+
; X86-SSE2-NEXT: mulss (%eax), %xmm0
16041598
; X86-SSE2-NEXT: movss %xmm0, (%eax)
16051599
; X86-SSE2-NEXT: retl
16061600
;
16071601
; X86-AVX-LABEL: fmul_32r:
16081602
; X86-AVX: # %bb.0:
16091603
; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax
16101604
; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1611-
; X86-AVX-NEXT: vmulss {{[0-9]+}}(%esp), %xmm0, %xmm0
1605+
; X86-AVX-NEXT: vmulss (%eax), %xmm0, %xmm0
16121606
; X86-AVX-NEXT: vmovss %xmm0, (%eax)
16131607
; X86-AVX-NEXT: retl
16141608
;
16151609
; X64-SSE-LABEL: fmul_32r:
16161610
; X64-SSE: # %bb.0:
1617-
; X64-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1618-
; X64-SSE-NEXT: mulss %xmm0, %xmm1
1619-
; X64-SSE-NEXT: movss %xmm1, (%rdi)
1611+
; X64-SSE-NEXT: mulss (%rdi), %xmm0
1612+
; X64-SSE-NEXT: movss %xmm0, (%rdi)
16201613
; X64-SSE-NEXT: retq
16211614
;
16221615
; X64-AVX-LABEL: fmul_32r:
16231616
; X64-AVX: # %bb.0:
1624-
; X64-AVX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1625-
; X64-AVX-NEXT: vmulss %xmm0, %xmm1, %xmm0
1617+
; X64-AVX-NEXT: vmulss (%rdi), %xmm0, %xmm0
16261618
; X64-AVX-NEXT: vmovss %xmm0, (%rdi)
16271619
; X64-AVX-NEXT: retq
16281620
%1 = load atomic i32, ptr %loc seq_cst, align 4
@@ -1716,15 +1708,13 @@ define dso_local void @fmul_64r(ptr %loc, double %val) nounwind {
17161708
;
17171709
; X64-SSE-LABEL: fmul_64r:
17181710
; X64-SSE: # %bb.0:
1719-
; X64-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
1720-
; X64-SSE-NEXT: mulsd %xmm0, %xmm1
1721-
; X64-SSE-NEXT: movsd %xmm1, (%rdi)
1711+
; X64-SSE-NEXT: mulsd (%rdi), %xmm0
1712+
; X64-SSE-NEXT: movsd %xmm0, (%rdi)
17221713
; X64-SSE-NEXT: retq
17231714
;
17241715
; X64-AVX-LABEL: fmul_64r:
17251716
; X64-AVX: # %bb.0:
1726-
; X64-AVX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
1727-
; X64-AVX-NEXT: vmulsd %xmm0, %xmm1, %xmm0
1717+
; X64-AVX-NEXT: vmulsd (%rdi), %xmm0, %xmm0
17281718
; X64-AVX-NEXT: vmovsd %xmm0, (%rdi)
17291719
; X64-AVX-NEXT: retq
17301720
%1 = load atomic i64, ptr %loc seq_cst, align 8
@@ -2162,15 +2152,13 @@ define dso_local void @fmul_array(ptr %arg, double %arg1, i64 %arg2) nounwind {
21622152
;
21632153
; X64-SSE-LABEL: fmul_array:
21642154
; X64-SSE: # %bb.0: # %bb
2165-
; X64-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
2166-
; X64-SSE-NEXT: mulsd %xmm0, %xmm1
2167-
; X64-SSE-NEXT: movsd %xmm1, (%rdi,%rsi,8)
2155+
; X64-SSE-NEXT: mulsd (%rdi,%rsi,8), %xmm0
2156+
; X64-SSE-NEXT: movsd %xmm0, (%rdi,%rsi,8)
21682157
; X64-SSE-NEXT: retq
21692158
;
21702159
; X64-AVX-LABEL: fmul_array:
21712160
; X64-AVX: # %bb.0: # %bb
2172-
; X64-AVX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
2173-
; X64-AVX-NEXT: vmulsd %xmm0, %xmm1, %xmm0
2161+
; X64-AVX-NEXT: vmulsd (%rdi,%rsi,8), %xmm0, %xmm0
21742162
; X64-AVX-NEXT: vmovsd %xmm0, (%rdi,%rsi,8)
21752163
; X64-AVX-NEXT: retq
21762164
bb:
@@ -2592,36 +2580,32 @@ define dso_local void @fdiv_32stack() nounwind {
25922580
; X86-SSE2-LABEL: fdiv_32stack:
25932581
; X86-SSE2: # %bb.0:
25942582
; X86-SSE2-NEXT: pushl %eax
2595-
; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2596-
; X86-SSE2-NEXT: movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
2597-
; X86-SSE2-NEXT: divss %xmm0, %xmm1
2598-
; X86-SSE2-NEXT: movss %xmm1, (%esp)
2583+
; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
2584+
; X86-SSE2-NEXT: divss (%esp), %xmm0
2585+
; X86-SSE2-NEXT: movss %xmm0, (%esp)
25992586
; X86-SSE2-NEXT: popl %eax
26002587
; X86-SSE2-NEXT: retl
26012588
;
26022589
; X86-AVX-LABEL: fdiv_32stack:
26032590
; X86-AVX: # %bb.0:
26042591
; X86-AVX-NEXT: pushl %eax
2605-
; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2606-
; X86-AVX-NEXT: vmovss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
2607-
; X86-AVX-NEXT: vdivss %xmm0, %xmm1, %xmm0
2592+
; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
2593+
; X86-AVX-NEXT: vdivss (%esp), %xmm0, %xmm0
26082594
; X86-AVX-NEXT: vmovss %xmm0, (%esp)
26092595
; X86-AVX-NEXT: popl %eax
26102596
; X86-AVX-NEXT: retl
26112597
;
26122598
; X64-SSE-LABEL: fdiv_32stack:
26132599
; X64-SSE: # %bb.0:
2614-
; X64-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2615-
; X64-SSE-NEXT: movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
2616-
; X64-SSE-NEXT: divss %xmm0, %xmm1
2617-
; X64-SSE-NEXT: movss %xmm1, -{{[0-9]+}}(%rsp)
2600+
; X64-SSE-NEXT: movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
2601+
; X64-SSE-NEXT: divss -{{[0-9]+}}(%rsp), %xmm0
2602+
; X64-SSE-NEXT: movss %xmm0, -{{[0-9]+}}(%rsp)
26182603
; X64-SSE-NEXT: retq
26192604
;
26202605
; X64-AVX-LABEL: fdiv_32stack:
26212606
; X64-AVX: # %bb.0:
2622-
; X64-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2623-
; X64-AVX-NEXT: vmovss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
2624-
; X64-AVX-NEXT: vdivss %xmm0, %xmm1, %xmm0
2607+
; X64-AVX-NEXT: vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
2608+
; X64-AVX-NEXT: vdivss -{{[0-9]+}}(%rsp), %xmm0, %xmm0
26252609
; X64-AVX-NEXT: vmovss %xmm0, -{{[0-9]+}}(%rsp)
26262610
; X64-AVX-NEXT: retq
26272611
%ptr = alloca i32, align 4
@@ -2714,17 +2698,15 @@ define dso_local void @fdiv_64stack() nounwind {
27142698
;
27152699
; X64-SSE-LABEL: fdiv_64stack:
27162700
; X64-SSE: # %bb.0:
2717-
; X64-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
2718-
; X64-SSE-NEXT: movsd {{.*#+}} xmm1 = [1.0E+0,0.0E+0]
2719-
; X64-SSE-NEXT: divsd %xmm0, %xmm1
2720-
; X64-SSE-NEXT: movsd %xmm1, -{{[0-9]+}}(%rsp)
2701+
; X64-SSE-NEXT: movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]
2702+
; X64-SSE-NEXT: divsd -{{[0-9]+}}(%rsp), %xmm0
2703+
; X64-SSE-NEXT: movsd %xmm0, -{{[0-9]+}}(%rsp)
27212704
; X64-SSE-NEXT: retq
27222705
;
27232706
; X64-AVX-LABEL: fdiv_64stack:
27242707
; X64-AVX: # %bb.0:
2725-
; X64-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
2726-
; X64-AVX-NEXT: vmovsd {{.*#+}} xmm1 = [1.0E+0,0.0E+0]
2727-
; X64-AVX-NEXT: vdivsd %xmm0, %xmm1, %xmm0
2708+
; X64-AVX-NEXT: vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]
2709+
; X64-AVX-NEXT: vdivsd -{{[0-9]+}}(%rsp), %xmm0, %xmm0
27282710
; X64-AVX-NEXT: vmovsd %xmm0, -{{[0-9]+}}(%rsp)
27292711
; X64-AVX-NEXT: retq
27302712
%ptr = alloca i64, align 8

0 commit comments

Comments
 (0)