def FeatureCMOV : SubtargetFeature<"cmov","HasCMov", "true",
"Enable conditional move instructions">;
+def FeatureCMPXCHG8B : SubtargetFeature<"cx8", "HasCmpxchg8b", "true",
+ "Support CMPXCHG8B instructions">;
+
def FeaturePOPCNT : SubtargetFeature<"popcnt", "HasPOPCNT", "true",
"Support POPCNT instruction">;
def ProcessorFeatures {
// Nehalem
list<SubtargetFeature> NHMInheritableFeatures = [FeatureX87,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureMMX,
FeatureSSE42,
// Atom
list<SubtargetFeature> AtomInheritableFeatures = [FeatureX87,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureMMX,
FeatureSSSE3,
// Knights Landing
list<SubtargetFeature> KNLFeatures = [FeatureX87,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureMMX,
FeatureFXSR,
// Bobcat
list<SubtargetFeature> BtVer1InheritableFeatures = [FeatureX87,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureMMX,
FeatureSSSE3,
// Bulldozer
list<SubtargetFeature> BdVer1InheritableFeatures = [FeatureX87,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureXOP,
Feature64Bit,
class Proc<string Name, list<SubtargetFeature> Features>
: ProcessorModel<Name, GenericModel, Features>;
-def : Proc<"generic", [FeatureX87, FeatureSlowUAMem16]>;
+// NOTE: CMPXCHG8B is here for legacy compatbility so that it is only disabled
+// if i386/i486 is specifically requested.
+def : Proc<"generic", [FeatureX87, FeatureSlowUAMem16,
+ FeatureCMPXCHG8B]>;
def : Proc<"i386", [FeatureX87, FeatureSlowUAMem16]>;
def : Proc<"i486", [FeatureX87, FeatureSlowUAMem16]>;
-def : Proc<"i586", [FeatureX87, FeatureSlowUAMem16]>;
-def : Proc<"pentium", [FeatureX87, FeatureSlowUAMem16]>;
-def : Proc<"pentium-mmx", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
-
-def : Proc<"i686", [FeatureX87, FeatureSlowUAMem16, FeatureCMOV]>;
-def : Proc<"pentiumpro", [FeatureX87, FeatureSlowUAMem16, FeatureCMOV,
- FeatureNOPL]>;
-
-def : Proc<"pentium2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
- FeatureCMOV, FeatureFXSR, FeatureNOPL]>;
+def : Proc<"i586", [FeatureX87, FeatureSlowUAMem16,
+ FeatureCMPXCHG8B]>;
+def : Proc<"pentium", [FeatureX87, FeatureSlowUAMem16,
+ FeatureCMPXCHG8B]>;
+def : Proc<"pentium-mmx", [FeatureX87, FeatureSlowUAMem16,
+ FeatureCMPXCHG8B, FeatureMMX]>;
+
+def : Proc<"i686", [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureCMOV]>;
+def : Proc<"pentiumpro", [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureCMOV, FeatureNOPL]>;
+
+def : Proc<"pentium2", [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureMMX, FeatureCMOV, FeatureFXSR,
+ FeatureNOPL]>;
foreach P = ["pentium3", "pentium3m"] in {
- def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE1,
- FeatureFXSR, FeatureNOPL, FeatureCMOV]>;
+ def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,FeatureMMX,
+ FeatureSSE1, FeatureFXSR, FeatureNOPL, FeatureCMOV]>;
}
// Enable the PostRAScheduler for SSE2 and SSE3 class cpus.
// changes slightly.
def : ProcessorModel<"pentium-m", GenericPostRAModel,
- [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
- FeatureSSE2, FeatureFXSR, FeatureNOPL, FeatureCMOV]>;
+ [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureMMX, FeatureSSE2, FeatureFXSR, FeatureNOPL,
+ FeatureCMOV]>;
foreach P = ["pentium4", "pentium4m"] in {
def : ProcessorModel<P, GenericPostRAModel,
- [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
- FeatureSSE2, FeatureFXSR, FeatureNOPL, FeatureCMOV]>;
+ [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureMMX, FeatureSSE2, FeatureFXSR, FeatureNOPL,
+ FeatureCMOV]>;
}
// Intel Quark.
// Intel Core Duo.
def : ProcessorModel<"yonah", SandyBridgeModel,
- [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
- FeatureFXSR, FeatureNOPL, FeatureCMOV]>;
+ [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureMMX, FeatureSSE3, FeatureFXSR, FeatureNOPL,
+ FeatureCMOV]>;
// NetBurst.
def : ProcessorModel<"prescott", GenericPostRAModel,
- [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
- FeatureFXSR, FeatureNOPL, FeatureCMOV]>;
+ [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureMMX, FeatureSSE3, FeatureFXSR, FeatureNOPL,
+ FeatureCMOV]>;
def : ProcessorModel<"nocona", GenericPostRAModel, [
FeatureX87,
FeatureSlowUAMem16,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureMMX,
FeatureSSE3,
def : ProcessorModel<"core2", SandyBridgeModel, [
FeatureX87,
FeatureSlowUAMem16,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureMMX,
FeatureSSSE3,
def : ProcessorModel<"penryn", SandyBridgeModel, [
FeatureX87,
FeatureSlowUAMem16,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureMMX,
FeatureSSE41,
// AMD CPUs.
-def : Proc<"k6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
-def : Proc<"k6-2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
-def : Proc<"k6-3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
+def : Proc<"k6", [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureMMX]>;
+def : Proc<"k6-2", [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ Feature3DNow]>;
+def : Proc<"k6-3", [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ Feature3DNow]>;
foreach P = ["athlon", "athlon-tbird"] in {
- def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureCMOV, Feature3DNowA,
- FeatureNOPL, FeatureSlowSHLD]>;
+ def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B, FeatureCMOV,
+ Feature3DNowA, FeatureNOPL, FeatureSlowSHLD]>;
}
foreach P = ["athlon-4", "athlon-xp", "athlon-mp"] in {
- def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureCMOV, FeatureSSE1,
- Feature3DNowA, FeatureFXSR, FeatureNOPL, FeatureSlowSHLD]>;
+ def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B, FeatureCMOV,
+ FeatureSSE1, Feature3DNowA, FeatureFXSR, FeatureNOPL,
+ FeatureSlowSHLD]>;
}
foreach P = ["k8", "opteron", "athlon64", "athlon-fx"] in {
- def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureSSE2, Feature3DNowA,
- FeatureFXSR, FeatureNOPL, Feature64Bit, FeatureSlowSHLD,
- FeatureCMOV]>;
+ def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureSSE2, Feature3DNowA, FeatureFXSR, FeatureNOPL,
+ Feature64Bit, FeatureSlowSHLD, FeatureCMOV]>;
}
foreach P = ["k8-sse3", "opteron-sse3", "athlon64-sse3"] in {
- def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureSSE3, Feature3DNowA,
- FeatureFXSR, FeatureNOPL, FeatureCMPXCHG16B, FeatureSlowSHLD,
- FeatureCMOV, Feature64Bit]>;
+ def : Proc<P, [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B, FeatureSSE3,
+ Feature3DNowA, FeatureFXSR, FeatureNOPL, FeatureCMPXCHG16B,
+ FeatureSlowSHLD, FeatureCMOV, Feature64Bit]>;
}
foreach P = ["amdfam10", "barcelona"] in {
- def : Proc<P, [FeatureX87, FeatureSSE4A, Feature3DNowA, FeatureFXSR,
- FeatureNOPL, FeatureCMPXCHG16B, FeatureLZCNT, FeaturePOPCNT,
- FeatureSlowSHLD, FeatureLAHFSAHF, FeatureCMOV, Feature64Bit]>;
+ def : Proc<P, [FeatureX87, FeatureCMPXCHG8B, FeatureSSE4A, Feature3DNowA,
+ FeatureFXSR, FeatureNOPL, FeatureCMPXCHG16B, FeatureLZCNT,
+ FeaturePOPCNT, FeatureSlowSHLD, FeatureLAHFSAHF, FeatureCMOV,
+ Feature64Bit]>;
}
// Bobcat
def : ProcessorModel<"znver1", Znver1Model, ProcessorFeatures.ZNFeatures>;
def : ProcessorModel<"znver2", Znver1Model, ProcessorFeatures.ZN2Features>;
-def : Proc<"geode", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA]>;
+def : Proc<"geode", [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ Feature3DNowA]>;
def : Proc<"winchip-c6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
def : Proc<"winchip2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
def : Proc<"c3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
-def : Proc<"c3-2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
- FeatureSSE1, FeatureFXSR, FeatureCMOV]>;
+def : Proc<"c3-2", [FeatureX87, FeatureSlowUAMem16, FeatureCMPXCHG8B,
+ FeatureMMX, FeatureSSE1, FeatureFXSR,
+ FeatureCMOV]>;
// We also provide a generic 64-bit specific x86 processor model which tries to
// be good for modern chips without enabling instruction set encodings past the
// forming a common base for them.
def : ProcessorModel<"x86-64", SandyBridgeModel, [
FeatureX87,
+ FeatureCMPXCHG8B,
FeatureCMOV,
FeatureMMX,
FeatureSSE2,
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -O0 -mtriple=x86_64-- -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64
+; RUN: llc < %s -O0 -mtriple=i386-- -mcpu=i486 -verify-machineinstrs | FileCheck %s --check-prefix I486
@sc64 = external global i64
@fsc64 = external global double
; X64-NEXT: lock xaddq %rax, {{.*}}(%rip)
; X64-NEXT: lock addq %rax, {{.*}}(%rip)
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_add64:
+; I486: # %bb.0: # %entry
+; I486-NEXT: pushl %esi
+; I486-NEXT: subl $56, %esp
+; I486-NEXT: leal sc64, %eax
+; I486-NEXT: movl %esp, %ecx
+; I486-NEXT: movl $2, 12(%ecx)
+; I486-NEXT: movl $0, 8(%ecx)
+; I486-NEXT: movl $1, 4(%ecx)
+; I486-NEXT: movl $sc64, (%ecx)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_add_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $0, 8(%esi)
+; I486-NEXT: movl $3, 4(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_add_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $0, 8(%esi)
+; I486-NEXT: movl $5, 4(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_add_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %edx, 8(%esi)
+; I486-NEXT: movl %eax, 4(%esi)
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_add_8
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: addl $56, %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: retl
entry:
%t1 = atomicrmw add i64* @sc64, i64 1 acquire
%t2 = atomicrmw add i64* @sc64, i64 3 acquire
; X64-NEXT: lock xaddq %rax, {{.*}}(%rip)
; X64-NEXT: lock subq %rax, {{.*}}(%rip)
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_sub64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %esi
+; I486-NEXT: subl $56, %esp
+; I486-NEXT: leal sc64, %eax
+; I486-NEXT: movl %esp, %ecx
+; I486-NEXT: movl $2, 12(%ecx)
+; I486-NEXT: movl $0, 8(%ecx)
+; I486-NEXT: movl $1, 4(%ecx)
+; I486-NEXT: movl $sc64, (%ecx)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_sub_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $0, 8(%esi)
+; I486-NEXT: movl $3, 4(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_sub_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $0, 8(%esi)
+; I486-NEXT: movl $5, 4(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_sub_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %edx, 8(%esi)
+; I486-NEXT: movl %eax, 4(%esi)
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_sub_8
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: addl $56, %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: retl
%t1 = atomicrmw sub i64* @sc64, i64 1 acquire
%t2 = atomicrmw sub i64* @sc64, i64 3 acquire
%t3 = atomicrmw sub i64* @sc64, i64 5 acquire
; X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
; X64-NEXT: lock andq %rax, {{.*}}(%rip)
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_and64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %esi
+; I486-NEXT: subl $44, %esp
+; I486-NEXT: leal sc64, %eax
+; I486-NEXT: movl %esp, %ecx
+; I486-NEXT: movl $2, 12(%ecx)
+; I486-NEXT: movl $0, 8(%ecx)
+; I486-NEXT: movl $3, 4(%ecx)
+; I486-NEXT: movl $sc64, (%ecx)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_and_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $0, 8(%esi)
+; I486-NEXT: movl $5, 4(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_and_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %edx, 8(%esi)
+; I486-NEXT: movl %eax, 4(%esi)
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_and_8
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: addl $44, %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: retl
%t1 = atomicrmw and i64* @sc64, i64 3 acquire
%t2 = atomicrmw and i64* @sc64, i64 5 acquire
%t3 = atomicrmw and i64* @sc64, i64 %t2 acquire
; X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
; X64-NEXT: lock orq %rax, {{.*}}(%rip)
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_or64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %esi
+; I486-NEXT: subl $44, %esp
+; I486-NEXT: leal sc64, %eax
+; I486-NEXT: movl %esp, %ecx
+; I486-NEXT: movl $2, 12(%ecx)
+; I486-NEXT: movl $0, 8(%ecx)
+; I486-NEXT: movl $3, 4(%ecx)
+; I486-NEXT: movl $sc64, (%ecx)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_or_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $0, 8(%esi)
+; I486-NEXT: movl $5, 4(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_or_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %edx, 8(%esi)
+; I486-NEXT: movl %eax, 4(%esi)
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_or_8
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: addl $44, %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: retl
%t1 = atomicrmw or i64* @sc64, i64 3 acquire
%t2 = atomicrmw or i64* @sc64, i64 5 acquire
%t3 = atomicrmw or i64* @sc64, i64 %t2 acquire
; X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
; X64-NEXT: lock xorq %rax, {{.*}}(%rip)
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_xor64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %esi
+; I486-NEXT: subl $44, %esp
+; I486-NEXT: leal sc64, %eax
+; I486-NEXT: movl %esp, %ecx
+; I486-NEXT: movl $2, 12(%ecx)
+; I486-NEXT: movl $0, 8(%ecx)
+; I486-NEXT: movl $3, 4(%ecx)
+; I486-NEXT: movl $sc64, (%ecx)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_xor_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $0, 8(%esi)
+; I486-NEXT: movl $5, 4(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_xor_8
+; I486-NEXT: leal sc64, %ecx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %edx, 8(%esi)
+; I486-NEXT: movl %eax, 4(%esi)
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_xor_8
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: addl $44, %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: retl
%t1 = atomicrmw xor i64* @sc64, i64 3 acquire
%t2 = atomicrmw xor i64* @sc64, i64 5 acquire
%t3 = atomicrmw xor i64* @sc64, i64 %t2 acquire
; X64-NEXT: jmp .LBB5_1
; X64-NEXT: .LBB5_2: # %atomicrmw.end
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_nand64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %esi
+; I486-NEXT: subl $28, %esp
+; I486-NEXT: movl {{[0-9]+}}(%esp), %eax
+; I486-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: leal sc64, %edx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %eax, 8(%esi)
+; I486-NEXT: movl %ecx, 4(%esi)
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_fetch_nand_8
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: addl $28, %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: retl
%t1 = atomicrmw nand i64* @sc64, i64 %x acquire
ret void
}
; X64-NEXT: jmp .LBB6_1
; X64-NEXT: .LBB6_2: # %atomicrmw.end
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_max64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %ebp
+; I486-NEXT: movl %esp, %ebp
+; I486-NEXT: pushl %ebx
+; I486-NEXT: pushl %edi
+; I486-NEXT: pushl %esi
+; I486-NEXT: andl $-8, %esp
+; I486-NEXT: subl $80, %esp
+; I486-NEXT: movl 12(%ebp), %eax
+; I486-NEXT: movl 8(%ebp), %ecx
+; I486-NEXT: movl sc64+4, %edx
+; I486-NEXT: movl sc64, %esi
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: jmp .LBB6_1
+; I486-NEXT: .LBB6_1: # %atomicrmw.start
+; I486-NEXT: # =>This Inner Loop Header: Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl %ecx, %edx
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; I486-NEXT: subl %esi, %edx
+; I486-NEXT: movl %eax, %edi
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; I486-NEXT: sbbl %ebx, %edi
+; I486-NEXT: movl %ecx, %esi
+; I486-NEXT: movl %eax, %ebx
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: jge .LBB6_4
+; I486-NEXT: # %bb.3: # %atomicrmw.start
+; I486-NEXT: # in Loop: Header=BB6_1 Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: .LBB6_4: # %atomicrmw.start
+; I486-NEXT: # in Loop: Header=BB6_1 Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; I486-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; I486-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; I486-NEXT: movl %esp, %edi
+; I486-NEXT: movl %eax, 12(%edi)
+; I486-NEXT: movl %ecx, 8(%edi)
+; I486-NEXT: leal {{[0-9]+}}(%esp), %eax
+; I486-NEXT: movl %eax, 4(%edi)
+; I486-NEXT: movl $2, 20(%edi)
+; I486-NEXT: movl $2, 16(%edi)
+; I486-NEXT: movl $sc64, (%edi)
+; I486-NEXT: calll __atomic_compare_exchange_8
+; I486-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: movl {{[0-9]+}}(%esp), %edx
+; I486-NEXT: testb %al, %al
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: je .LBB6_1
+; I486-NEXT: jmp .LBB6_2
+; I486-NEXT: .LBB6_2: # %atomicrmw.end
+; I486-NEXT: leal -12(%ebp), %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: popl %edi
+; I486-NEXT: popl %ebx
+; I486-NEXT: popl %ebp
+; I486-NEXT: retl
%t1 = atomicrmw max i64* @sc64, i64 %x acquire
ret void
; X64-NEXT: jmp .LBB7_1
; X64-NEXT: .LBB7_2: # %atomicrmw.end
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_min64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %ebp
+; I486-NEXT: movl %esp, %ebp
+; I486-NEXT: pushl %ebx
+; I486-NEXT: pushl %edi
+; I486-NEXT: pushl %esi
+; I486-NEXT: andl $-8, %esp
+; I486-NEXT: subl $80, %esp
+; I486-NEXT: movl 12(%ebp), %eax
+; I486-NEXT: movl 8(%ebp), %ecx
+; I486-NEXT: movl sc64+4, %edx
+; I486-NEXT: movl sc64, %esi
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: jmp .LBB7_1
+; I486-NEXT: .LBB7_1: # %atomicrmw.start
+; I486-NEXT: # =>This Inner Loop Header: Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; I486-NEXT: subl %ecx, %edx
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; I486-NEXT: sbbl %eax, %esi
+; I486-NEXT: movl %ecx, %edi
+; I486-NEXT: movl %eax, %ebx
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: jge .LBB7_4
+; I486-NEXT: # %bb.3: # %atomicrmw.start
+; I486-NEXT: # in Loop: Header=BB7_1 Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: .LBB7_4: # %atomicrmw.start
+; I486-NEXT: # in Loop: Header=BB7_1 Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; I486-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; I486-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; I486-NEXT: movl %esp, %edi
+; I486-NEXT: movl %eax, 12(%edi)
+; I486-NEXT: movl %ecx, 8(%edi)
+; I486-NEXT: leal {{[0-9]+}}(%esp), %eax
+; I486-NEXT: movl %eax, 4(%edi)
+; I486-NEXT: movl $2, 20(%edi)
+; I486-NEXT: movl $2, 16(%edi)
+; I486-NEXT: movl $sc64, (%edi)
+; I486-NEXT: calll __atomic_compare_exchange_8
+; I486-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: movl {{[0-9]+}}(%esp), %edx
+; I486-NEXT: testb %al, %al
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: je .LBB7_1
+; I486-NEXT: jmp .LBB7_2
+; I486-NEXT: .LBB7_2: # %atomicrmw.end
+; I486-NEXT: leal -12(%ebp), %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: popl %edi
+; I486-NEXT: popl %ebx
+; I486-NEXT: popl %ebp
+; I486-NEXT: retl
%t1 = atomicrmw min i64* @sc64, i64 %x acquire
ret void
; X64-NEXT: jmp .LBB8_1
; X64-NEXT: .LBB8_2: # %atomicrmw.end
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_umax64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %ebp
+; I486-NEXT: movl %esp, %ebp
+; I486-NEXT: pushl %ebx
+; I486-NEXT: pushl %edi
+; I486-NEXT: pushl %esi
+; I486-NEXT: andl $-8, %esp
+; I486-NEXT: subl $80, %esp
+; I486-NEXT: movl 12(%ebp), %eax
+; I486-NEXT: movl 8(%ebp), %ecx
+; I486-NEXT: movl sc64+4, %edx
+; I486-NEXT: movl sc64, %esi
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: jmp .LBB8_1
+; I486-NEXT: .LBB8_1: # %atomicrmw.start
+; I486-NEXT: # =>This Inner Loop Header: Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; I486-NEXT: subl %ecx, %edx
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; I486-NEXT: sbbl %eax, %esi
+; I486-NEXT: movl %ecx, %edi
+; I486-NEXT: movl %eax, %ebx
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: jb .LBB8_4
+; I486-NEXT: # %bb.3: # %atomicrmw.start
+; I486-NEXT: # in Loop: Header=BB8_1 Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: .LBB8_4: # %atomicrmw.start
+; I486-NEXT: # in Loop: Header=BB8_1 Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; I486-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; I486-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; I486-NEXT: movl %esp, %edi
+; I486-NEXT: movl %eax, 12(%edi)
+; I486-NEXT: movl %ecx, 8(%edi)
+; I486-NEXT: leal {{[0-9]+}}(%esp), %eax
+; I486-NEXT: movl %eax, 4(%edi)
+; I486-NEXT: movl $2, 20(%edi)
+; I486-NEXT: movl $2, 16(%edi)
+; I486-NEXT: movl $sc64, (%edi)
+; I486-NEXT: calll __atomic_compare_exchange_8
+; I486-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: movl {{[0-9]+}}(%esp), %edx
+; I486-NEXT: testb %al, %al
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: je .LBB8_1
+; I486-NEXT: jmp .LBB8_2
+; I486-NEXT: .LBB8_2: # %atomicrmw.end
+; I486-NEXT: leal -12(%ebp), %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: popl %edi
+; I486-NEXT: popl %ebx
+; I486-NEXT: popl %ebp
+; I486-NEXT: retl
%t1 = atomicrmw umax i64* @sc64, i64 %x acquire
ret void
; X64-NEXT: jmp .LBB9_1
; X64-NEXT: .LBB9_2: # %atomicrmw.end
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_umin64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %ebp
+; I486-NEXT: movl %esp, %ebp
+; I486-NEXT: pushl %ebx
+; I486-NEXT: pushl %edi
+; I486-NEXT: pushl %esi
+; I486-NEXT: andl $-8, %esp
+; I486-NEXT: subl $80, %esp
+; I486-NEXT: movl 12(%ebp), %eax
+; I486-NEXT: movl 8(%ebp), %ecx
+; I486-NEXT: movl sc64+4, %edx
+; I486-NEXT: movl sc64, %esi
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: jmp .LBB9_1
+; I486-NEXT: .LBB9_1: # %atomicrmw.start
+; I486-NEXT: # =>This Inner Loop Header: Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; I486-NEXT: subl %ecx, %edx
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; I486-NEXT: sbbl %eax, %esi
+; I486-NEXT: movl %ecx, %edi
+; I486-NEXT: movl %eax, %ebx
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: jae .LBB9_4
+; I486-NEXT: # %bb.3: # %atomicrmw.start
+; I486-NEXT: # in Loop: Header=BB9_1 Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: .LBB9_4: # %atomicrmw.start
+; I486-NEXT: # in Loop: Header=BB9_1 Depth=1
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; I486-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; I486-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; I486-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; I486-NEXT: movl %esp, %edi
+; I486-NEXT: movl %eax, 12(%edi)
+; I486-NEXT: movl %ecx, 8(%edi)
+; I486-NEXT: leal {{[0-9]+}}(%esp), %eax
+; I486-NEXT: movl %eax, 4(%edi)
+; I486-NEXT: movl $2, 20(%edi)
+; I486-NEXT: movl $2, 16(%edi)
+; I486-NEXT: movl $sc64, (%edi)
+; I486-NEXT: calll __atomic_compare_exchange_8
+; I486-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: movl {{[0-9]+}}(%esp), %edx
+; I486-NEXT: testb %al, %al
+; I486-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: je .LBB9_1
+; I486-NEXT: jmp .LBB9_2
+; I486-NEXT: .LBB9_2: # %atomicrmw.end
+; I486-NEXT: leal -12(%ebp), %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: popl %edi
+; I486-NEXT: popl %ebx
+; I486-NEXT: popl %ebp
+; I486-NEXT: retl
%t1 = atomicrmw umin i64* @sc64, i64 %x acquire
ret void
; X64-NEXT: lock cmpxchgq %rcx, {{.*}}(%rip)
; X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_cmpxchg64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %ebp
+; I486-NEXT: movl %esp, %ebp
+; I486-NEXT: andl $-8, %esp
+; I486-NEXT: subl $40, %esp
+; I486-NEXT: leal sc64, %eax
+; I486-NEXT: leal {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: movl $0, {{[0-9]+}}(%esp)
+; I486-NEXT: movl $0, {{[0-9]+}}(%esp)
+; I486-NEXT: movl %esp, %edx
+; I486-NEXT: movl %ecx, 4(%edx)
+; I486-NEXT: movl $2, 20(%edx)
+; I486-NEXT: movl $2, 16(%edx)
+; I486-NEXT: movl $0, 12(%edx)
+; I486-NEXT: movl $1, 8(%edx)
+; I486-NEXT: movl $sc64, (%edx)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_compare_exchange_8
+; I486-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
+; I486-NEXT: movl %ebp, %esp
+; I486-NEXT: popl %ebp
+; I486-NEXT: retl
%t1 = cmpxchg i64* @sc64, i64 0, i64 1 acquire acquire
ret void
}
; X64: # %bb.0:
; X64-NEXT: movq %rdi, {{.*}}(%rip)
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_store64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %esi
+; I486-NEXT: subl $20, %esp
+; I486-NEXT: movl {{[0-9]+}}(%esp), %eax
+; I486-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: leal sc64, %edx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %eax, 8(%esi)
+; I486-NEXT: movl %ecx, 4(%esi)
+; I486-NEXT: movl $3, 12(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_store_8
+; I486-NEXT: addl $20, %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: retl
store atomic i64 %x, i64* @sc64 release, align 8
ret void
}
; X64-NEXT: xchgq %rdi, {{.*}}(%rip)
; X64-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_swap64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %esi
+; I486-NEXT: subl $28, %esp
+; I486-NEXT: movl {{[0-9]+}}(%esp), %eax
+; I486-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: leal sc64, %edx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %eax, 8(%esi)
+; I486-NEXT: movl %ecx, 4(%esi)
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $sc64, (%esi)
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_exchange_8
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: addl $28, %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: retl
%t1 = atomicrmw xchg i64* @sc64, i64 %x acquire
ret void
}
; X64-NEXT: xchgq %rax, {{.*}}(%rip)
; X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; X64-NEXT: retq
+;
+; I486-LABEL: atomic_fetch_swapf64:
+; I486: # %bb.0:
+; I486-NEXT: pushl %ebp
+; I486-NEXT: movl %esp, %ebp
+; I486-NEXT: pushl %esi
+; I486-NEXT: andl $-8, %esp
+; I486-NEXT: subl $48, %esp
+; I486-NEXT: fldl 8(%ebp)
+; I486-NEXT: leal fsc64, %eax
+; I486-NEXT: fstpl {{[0-9]+}}(%esp)
+; I486-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; I486-NEXT: movl {{[0-9]+}}(%esp), %edx
+; I486-NEXT: movl %esp, %esi
+; I486-NEXT: movl %edx, 8(%esi)
+; I486-NEXT: movl %ecx, 4(%esi)
+; I486-NEXT: movl $2, 12(%esi)
+; I486-NEXT: movl $fsc64, (%esi)
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: calll __atomic_exchange_8
+; I486-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; I486-NEXT: leal -4(%ebp), %esp
+; I486-NEXT: popl %esi
+; I486-NEXT: popl %ebp
+; I486-NEXT: retl
%t1 = atomicrmw xchg double* @fsc64, double %x acquire
ret void
}