447 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=sparc -verify-machineinstrs | FileCheck %s --check-prefixes=SPARC323; RUN: llc < %s -mtriple=sparc -mcpu=leon4 -verify-machineinstrs | FileCheck %s --check-prefixes=SPARC32-LEON44; RUN: llc < %s -mtriple=sparc -mcpu=v9 -verify-machineinstrs | FileCheck %s --check-prefixes=SPARC32-V95; RUN: llc < %s -mtriple=sparcv9 -verify-machineinstrs | FileCheck %s --check-prefixes=SPARC646 7define i32 @load_acq(ptr %0) nounwind {8; SPARC32-LABEL: load_acq:9; SPARC32: ! %bb.0:10; SPARC32-NEXT: save %sp, -96, %sp11; SPARC32-NEXT: mov %i0, %o012; SPARC32-NEXT: call __atomic_load_413; SPARC32-NEXT: mov 2, %o114; SPARC32-NEXT: ret15; SPARC32-NEXT: restore %g0, %o0, %o016;17; SPARC32-LEON4-LABEL: load_acq:18; SPARC32-LEON4: ! %bb.0:19; SPARC32-LEON4-NEXT: retl20; SPARC32-LEON4-NEXT: ld [%o0], %o021;22; SPARC32-V9-LABEL: load_acq:23; SPARC32-V9: ! %bb.0:24; SPARC32-V9-NEXT: ld [%o0], %o025; SPARC32-V9-NEXT: membar #LoadLoad | #LoadStore26; SPARC32-V9-NEXT: retl27; SPARC32-V9-NEXT: nop28;29; SPARC64-LABEL: load_acq:30; SPARC64: ! %bb.0:31; SPARC64-NEXT: ld [%o0], %o032; SPARC64-NEXT: membar #LoadLoad | #LoadStore33; SPARC64-NEXT: retl34; SPARC64-NEXT: nop35 %2 = load atomic i32, ptr %0 acquire, align 436 ret i32 %237}38 39define i32 @load_sc(ptr %0) nounwind {40; SPARC32-LABEL: load_sc:41; SPARC32: ! %bb.0:42; SPARC32-NEXT: save %sp, -96, %sp43; SPARC32-NEXT: mov %i0, %o044; SPARC32-NEXT: call __atomic_load_445; SPARC32-NEXT: mov 5, %o146; SPARC32-NEXT: ret47; SPARC32-NEXT: restore %g0, %o0, %o048;49; SPARC32-LEON4-LABEL: load_sc:50; SPARC32-LEON4: ! %bb.0:51; SPARC32-LEON4-NEXT: retl52; SPARC32-LEON4-NEXT: ld [%o0], %o053;54; SPARC32-V9-LABEL: load_sc:55; SPARC32-V9: ! %bb.0:56; SPARC32-V9-NEXT: ld [%o0], %o057; SPARC32-V9-NEXT: membar #LoadLoad | #LoadStore58; SPARC32-V9-NEXT: retl59; SPARC32-V9-NEXT: nop60;61; SPARC64-LABEL: load_sc:62; SPARC64: ! %bb.0:63; SPARC64-NEXT: ld [%o0], %o064; SPARC64-NEXT: membar #LoadLoad | #LoadStore65; SPARC64-NEXT: retl66; SPARC64-NEXT: nop67 %2 = load atomic i32, ptr %0 seq_cst, align 468 ret i32 %269}70 71define void @store_rel(ptr %0, i32 %1) nounwind {72; SPARC32-LABEL: store_rel:73; SPARC32: ! %bb.0:74; SPARC32-NEXT: save %sp, -96, %sp75; SPARC32-NEXT: mov %i1, %o176; SPARC32-NEXT: mov %i0, %o077; SPARC32-NEXT: call __atomic_store_478; SPARC32-NEXT: mov 3, %o279; SPARC32-NEXT: ret80; SPARC32-NEXT: restore81;82; SPARC32-LEON4-LABEL: store_rel:83; SPARC32-LEON4: ! %bb.0:84; SPARC32-LEON4-NEXT: stbar85; SPARC32-LEON4-NEXT: retl86; SPARC32-LEON4-NEXT: st %o1, [%o0]87;88; SPARC32-V9-LABEL: store_rel:89; SPARC32-V9: ! %bb.0:90; SPARC32-V9-NEXT: membar #LoadStore | #StoreStore91; SPARC32-V9-NEXT: retl92; SPARC32-V9-NEXT: st %o1, [%o0]93;94; SPARC64-LABEL: store_rel:95; SPARC64: ! %bb.0:96; SPARC64-NEXT: membar #LoadStore | #StoreStore97; SPARC64-NEXT: retl98; SPARC64-NEXT: st %o1, [%o0]99 store atomic i32 %1, ptr %0 release, align 4100 ret void101}102 103define void @store_sc(ptr %0, i32 %1) nounwind {104; SPARC32-LABEL: store_sc:105; SPARC32: ! %bb.0:106; SPARC32-NEXT: save %sp, -96, %sp107; SPARC32-NEXT: mov %i1, %o1108; SPARC32-NEXT: mov %i0, %o0109; SPARC32-NEXT: call __atomic_store_4110; SPARC32-NEXT: mov 5, %o2111; SPARC32-NEXT: ret112; SPARC32-NEXT: restore113;114; SPARC32-LEON4-LABEL: store_sc:115; SPARC32-LEON4: ! %bb.0:116; SPARC32-LEON4-NEXT: stbar117; SPARC32-LEON4-NEXT: st %o1, [%o0]118; SPARC32-LEON4-NEXT: stbar119; SPARC32-LEON4-NEXT: ldstub [%sp+-1], %g0120; SPARC32-LEON4-NEXT: retl121; SPARC32-LEON4-NEXT: nop122;123; SPARC32-V9-LABEL: store_sc:124; SPARC32-V9: ! %bb.0:125; SPARC32-V9-NEXT: membar #LoadStore | #StoreStore126; SPARC32-V9-NEXT: st %o1, [%o0]127; SPARC32-V9-NEXT: membar #LoadLoad | #StoreLoad | #LoadStore | #StoreStore128; SPARC32-V9-NEXT: retl129; SPARC32-V9-NEXT: nop130;131; SPARC64-LABEL: store_sc:132; SPARC64: ! %bb.0:133; SPARC64-NEXT: membar #LoadStore | #StoreStore134; SPARC64-NEXT: st %o1, [%o0]135; SPARC64-NEXT: membar #LoadLoad | #StoreLoad | #LoadStore | #StoreStore136; SPARC64-NEXT: retl137; SPARC64-NEXT: nop138 store atomic i32 %1, ptr %0 seq_cst, align 4139 ret void140}141 142define i32 @rmw_acq(ptr %0, i32 %1) nounwind {143; SPARC32-LABEL: rmw_acq:144; SPARC32: ! %bb.0:145; SPARC32-NEXT: save %sp, -96, %sp146; SPARC32-NEXT: mov %i1, %o1147; SPARC32-NEXT: mov %i0, %o0148; SPARC32-NEXT: call __atomic_exchange_4149; SPARC32-NEXT: mov 2, %o2150; SPARC32-NEXT: ret151; SPARC32-NEXT: restore %g0, %o0, %o0152;153; SPARC32-LEON4-LABEL: rmw_acq:154; SPARC32-LEON4: ! %bb.0:155; SPARC32-LEON4-NEXT: swap [%o0], %o1156; SPARC32-LEON4-NEXT: retl157; SPARC32-LEON4-NEXT: mov %o1, %o0158;159; SPARC32-V9-LABEL: rmw_acq:160; SPARC32-V9: ! %bb.0:161; SPARC32-V9-NEXT: swap [%o0], %o1162; SPARC32-V9-NEXT: membar #LoadLoad | #LoadStore163; SPARC32-V9-NEXT: retl164; SPARC32-V9-NEXT: mov %o1, %o0165;166; SPARC64-LABEL: rmw_acq:167; SPARC64: ! %bb.0:168; SPARC64-NEXT: swap [%o0], %o1169; SPARC64-NEXT: membar #LoadLoad | #LoadStore170; SPARC64-NEXT: retl171; SPARC64-NEXT: mov %o1, %o0172 %3 = atomicrmw xchg ptr %0, i32 %1 acquire, align 4173 ret i32 %3174}175 176define i32 @rmw_rel(ptr %0, i32 %1) nounwind {177; SPARC32-LABEL: rmw_rel:178; SPARC32: ! %bb.0:179; SPARC32-NEXT: save %sp, -96, %sp180; SPARC32-NEXT: mov %i1, %o1181; SPARC32-NEXT: mov %i0, %o0182; SPARC32-NEXT: call __atomic_exchange_4183; SPARC32-NEXT: mov 3, %o2184; SPARC32-NEXT: ret185; SPARC32-NEXT: restore %g0, %o0, %o0186;187; SPARC32-LEON4-LABEL: rmw_rel:188; SPARC32-LEON4: ! %bb.0:189; SPARC32-LEON4-NEXT: stbar190; SPARC32-LEON4-NEXT: swap [%o0], %o1191; SPARC32-LEON4-NEXT: retl192; SPARC32-LEON4-NEXT: mov %o1, %o0193;194; SPARC32-V9-LABEL: rmw_rel:195; SPARC32-V9: ! %bb.0:196; SPARC32-V9-NEXT: membar #LoadStore | #StoreStore197; SPARC32-V9-NEXT: swap [%o0], %o1198; SPARC32-V9-NEXT: retl199; SPARC32-V9-NEXT: mov %o1, %o0200;201; SPARC64-LABEL: rmw_rel:202; SPARC64: ! %bb.0:203; SPARC64-NEXT: membar #LoadStore | #StoreStore204; SPARC64-NEXT: swap [%o0], %o1205; SPARC64-NEXT: retl206; SPARC64-NEXT: mov %o1, %o0207 %3 = atomicrmw xchg ptr %0, i32 %1 release, align 4208 ret i32 %3209}210 211define i32 @rmw_acq_rel(ptr %0, i32 %1) nounwind {212; SPARC32-LABEL: rmw_acq_rel:213; SPARC32: ! %bb.0:214; SPARC32-NEXT: save %sp, -96, %sp215; SPARC32-NEXT: mov %i1, %o1216; SPARC32-NEXT: mov %i0, %o0217; SPARC32-NEXT: call __atomic_exchange_4218; SPARC32-NEXT: mov 4, %o2219; SPARC32-NEXT: ret220; SPARC32-NEXT: restore %g0, %o0, %o0221;222; SPARC32-LEON4-LABEL: rmw_acq_rel:223; SPARC32-LEON4: ! %bb.0:224; SPARC32-LEON4-NEXT: stbar225; SPARC32-LEON4-NEXT: swap [%o0], %o1226; SPARC32-LEON4-NEXT: retl227; SPARC32-LEON4-NEXT: mov %o1, %o0228;229; SPARC32-V9-LABEL: rmw_acq_rel:230; SPARC32-V9: ! %bb.0:231; SPARC32-V9-NEXT: membar #LoadStore | #StoreStore232; SPARC32-V9-NEXT: swap [%o0], %o1233; SPARC32-V9-NEXT: membar #LoadLoad | #LoadStore234; SPARC32-V9-NEXT: retl235; SPARC32-V9-NEXT: mov %o1, %o0236;237; SPARC64-LABEL: rmw_acq_rel:238; SPARC64: ! %bb.0:239; SPARC64-NEXT: membar #LoadStore | #StoreStore240; SPARC64-NEXT: swap [%o0], %o1241; SPARC64-NEXT: membar #LoadLoad | #LoadStore242; SPARC64-NEXT: retl243; SPARC64-NEXT: mov %o1, %o0244 %3 = atomicrmw xchg ptr %0, i32 %1 acq_rel, align 4245 ret i32 %3246}247 248define i32 @rmw_sc(ptr %0, i32 %1) nounwind {249; SPARC32-LABEL: rmw_sc:250; SPARC32: ! %bb.0:251; SPARC32-NEXT: save %sp, -96, %sp252; SPARC32-NEXT: mov %i1, %o1253; SPARC32-NEXT: mov %i0, %o0254; SPARC32-NEXT: call __atomic_exchange_4255; SPARC32-NEXT: mov 5, %o2256; SPARC32-NEXT: ret257; SPARC32-NEXT: restore %g0, %o0, %o0258;259; SPARC32-LEON4-LABEL: rmw_sc:260; SPARC32-LEON4: ! %bb.0:261; SPARC32-LEON4-NEXT: stbar262; SPARC32-LEON4-NEXT: swap [%o0], %o1263; SPARC32-LEON4-NEXT: retl264; SPARC32-LEON4-NEXT: mov %o1, %o0265;266; SPARC32-V9-LABEL: rmw_sc:267; SPARC32-V9: ! %bb.0:268; SPARC32-V9-NEXT: membar #LoadStore | #StoreStore269; SPARC32-V9-NEXT: swap [%o0], %o1270; SPARC32-V9-NEXT: membar #LoadLoad | #LoadStore271; SPARC32-V9-NEXT: retl272; SPARC32-V9-NEXT: mov %o1, %o0273;274; SPARC64-LABEL: rmw_sc:275; SPARC64: ! %bb.0:276; SPARC64-NEXT: membar #LoadStore | #StoreStore277; SPARC64-NEXT: swap [%o0], %o1278; SPARC64-NEXT: membar #LoadLoad | #LoadStore279; SPARC64-NEXT: retl280; SPARC64-NEXT: mov %o1, %o0281 %3 = atomicrmw xchg ptr %0, i32 %1 seq_cst, align 4282 ret i32 %3283}284 285define i32 @cas_acq(ptr %0, i32 %1, i32 %2) nounwind {286; SPARC32-LABEL: cas_acq:287; SPARC32: ! %bb.0:288; SPARC32-NEXT: save %sp, -96, %sp289; SPARC32-NEXT: mov %i2, %o2290; SPARC32-NEXT: mov %i0, %o0291; SPARC32-NEXT: st %i1, [%fp+-4]292; SPARC32-NEXT: add %fp, -4, %o1293; SPARC32-NEXT: mov 2, %o3294; SPARC32-NEXT: call __atomic_compare_exchange_4295; SPARC32-NEXT: mov %o3, %o4296; SPARC32-NEXT: ld [%fp+-4], %i0297; SPARC32-NEXT: ret298; SPARC32-NEXT: restore299;300; SPARC32-LEON4-LABEL: cas_acq:301; SPARC32-LEON4: ! %bb.0:302; SPARC32-LEON4-NEXT: casa [%o0] 10, %o1, %o2303; SPARC32-LEON4-NEXT: retl304; SPARC32-LEON4-NEXT: mov %o2, %o0305;306; SPARC32-V9-LABEL: cas_acq:307; SPARC32-V9: ! %bb.0:308; SPARC32-V9-NEXT: cas [%o0], %o1, %o2309; SPARC32-V9-NEXT: membar #LoadLoad | #LoadStore310; SPARC32-V9-NEXT: retl311; SPARC32-V9-NEXT: mov %o2, %o0312;313; SPARC64-LABEL: cas_acq:314; SPARC64: ! %bb.0:315; SPARC64-NEXT: cas [%o0], %o1, %o2316; SPARC64-NEXT: membar #LoadLoad | #LoadStore317; SPARC64-NEXT: retl318; SPARC64-NEXT: mov %o2, %o0319 %4 = cmpxchg ptr %0, i32 %1, i32 %2 acquire acquire, align 4320 %5 = extractvalue { i32, i1 } %4, 0321 ret i32 %5322}323 324define i32 @cas_rel(ptr %0, i32 %1, i32 %2) nounwind {325; SPARC32-LABEL: cas_rel:326; SPARC32: ! %bb.0:327; SPARC32-NEXT: save %sp, -96, %sp328; SPARC32-NEXT: mov %i2, %o2329; SPARC32-NEXT: mov %i0, %o0330; SPARC32-NEXT: st %i1, [%fp+-4]331; SPARC32-NEXT: add %fp, -4, %o1332; SPARC32-NEXT: mov 3, %o3333; SPARC32-NEXT: call __atomic_compare_exchange_4334; SPARC32-NEXT: mov %g0, %o4335; SPARC32-NEXT: ld [%fp+-4], %i0336; SPARC32-NEXT: ret337; SPARC32-NEXT: restore338;339; SPARC32-LEON4-LABEL: cas_rel:340; SPARC32-LEON4: ! %bb.0:341; SPARC32-LEON4-NEXT: stbar342; SPARC32-LEON4-NEXT: casa [%o0] 10, %o1, %o2343; SPARC32-LEON4-NEXT: retl344; SPARC32-LEON4-NEXT: mov %o2, %o0345;346; SPARC32-V9-LABEL: cas_rel:347; SPARC32-V9: ! %bb.0:348; SPARC32-V9-NEXT: membar #LoadStore | #StoreStore349; SPARC32-V9-NEXT: cas [%o0], %o1, %o2350; SPARC32-V9-NEXT: retl351; SPARC32-V9-NEXT: mov %o2, %o0352;353; SPARC64-LABEL: cas_rel:354; SPARC64: ! %bb.0:355; SPARC64-NEXT: membar #LoadStore | #StoreStore356; SPARC64-NEXT: cas [%o0], %o1, %o2357; SPARC64-NEXT: retl358; SPARC64-NEXT: mov %o2, %o0359 %4 = cmpxchg ptr %0, i32 %1, i32 %2 release monotonic, align 4360 %5 = extractvalue { i32, i1 } %4, 0361 ret i32 %5362}363 364define i32 @cas_acq_rel(ptr %0, i32 %1, i32 %2) nounwind {365; SPARC32-LABEL: cas_acq_rel:366; SPARC32: ! %bb.0:367; SPARC32-NEXT: save %sp, -96, %sp368; SPARC32-NEXT: mov %i2, %o2369; SPARC32-NEXT: mov %i0, %o0370; SPARC32-NEXT: st %i1, [%fp+-4]371; SPARC32-NEXT: add %fp, -4, %o1372; SPARC32-NEXT: mov 4, %o3373; SPARC32-NEXT: call __atomic_compare_exchange_4374; SPARC32-NEXT: mov 2, %o4375; SPARC32-NEXT: ld [%fp+-4], %i0376; SPARC32-NEXT: ret377; SPARC32-NEXT: restore378;379; SPARC32-LEON4-LABEL: cas_acq_rel:380; SPARC32-LEON4: ! %bb.0:381; SPARC32-LEON4-NEXT: stbar382; SPARC32-LEON4-NEXT: casa [%o0] 10, %o1, %o2383; SPARC32-LEON4-NEXT: retl384; SPARC32-LEON4-NEXT: mov %o2, %o0385;386; SPARC32-V9-LABEL: cas_acq_rel:387; SPARC32-V9: ! %bb.0:388; SPARC32-V9-NEXT: membar #LoadStore | #StoreStore389; SPARC32-V9-NEXT: cas [%o0], %o1, %o2390; SPARC32-V9-NEXT: membar #LoadLoad | #LoadStore391; SPARC32-V9-NEXT: retl392; SPARC32-V9-NEXT: mov %o2, %o0393;394; SPARC64-LABEL: cas_acq_rel:395; SPARC64: ! %bb.0:396; SPARC64-NEXT: membar #LoadStore | #StoreStore397; SPARC64-NEXT: cas [%o0], %o1, %o2398; SPARC64-NEXT: membar #LoadLoad | #LoadStore399; SPARC64-NEXT: retl400; SPARC64-NEXT: mov %o2, %o0401 %4 = cmpxchg ptr %0, i32 %1, i32 %2 acq_rel acquire, align 4402 %5 = extractvalue { i32, i1 } %4, 0403 ret i32 %5404}405 406define i32 @cas_sc(ptr %0, i32 %1, i32 %2) nounwind {407; SPARC32-LABEL: cas_sc:408; SPARC32: ! %bb.0:409; SPARC32-NEXT: save %sp, -96, %sp410; SPARC32-NEXT: mov %i2, %o2411; SPARC32-NEXT: mov %i0, %o0412; SPARC32-NEXT: st %i1, [%fp+-4]413; SPARC32-NEXT: add %fp, -4, %o1414; SPARC32-NEXT: mov 5, %o3415; SPARC32-NEXT: call __atomic_compare_exchange_4416; SPARC32-NEXT: mov %o3, %o4417; SPARC32-NEXT: ld [%fp+-4], %i0418; SPARC32-NEXT: ret419; SPARC32-NEXT: restore420;421; SPARC32-LEON4-LABEL: cas_sc:422; SPARC32-LEON4: ! %bb.0:423; SPARC32-LEON4-NEXT: stbar424; SPARC32-LEON4-NEXT: casa [%o0] 10, %o1, %o2425; SPARC32-LEON4-NEXT: retl426; SPARC32-LEON4-NEXT: mov %o2, %o0427;428; SPARC32-V9-LABEL: cas_sc:429; SPARC32-V9: ! %bb.0:430; SPARC32-V9-NEXT: membar #LoadStore | #StoreStore431; SPARC32-V9-NEXT: cas [%o0], %o1, %o2432; SPARC32-V9-NEXT: membar #LoadLoad | #LoadStore433; SPARC32-V9-NEXT: retl434; SPARC32-V9-NEXT: mov %o2, %o0435;436; SPARC64-LABEL: cas_sc:437; SPARC64: ! %bb.0:438; SPARC64-NEXT: membar #LoadStore | #StoreStore439; SPARC64-NEXT: cas [%o0], %o1, %o2440; SPARC64-NEXT: membar #LoadLoad | #LoadStore441; SPARC64-NEXT: retl442; SPARC64-NEXT: mov %o2, %o0443 %4 = cmpxchg ptr %0, i32 %1, i32 %2 seq_cst seq_cst, align 4444 %5 = extractvalue { i32, i1 } %4, 0445 ret i32 %5446}447