322 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=sparc -mcpu=v9 < %s | FileCheck %s3 4define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {5; CHECK-LABEL: atomicrmw_uinc_wrap_i8:6; CHECK: .cfi_startproc7; CHECK-NEXT: ! %bb.0:8; CHECK-NEXT: membar #LoadStore | #StoreStore9; CHECK-NEXT: and %o0, -4, %o210; CHECK-NEXT: mov 3, %o311; CHECK-NEXT: andn %o3, %o0, %o012; CHECK-NEXT: sll %o0, 3, %o013; CHECK-NEXT: mov 255, %o314; CHECK-NEXT: ld [%o2], %o415; CHECK-NEXT: sll %o3, %o0, %o316; CHECK-NEXT: xor %o3, -1, %o317; CHECK-NEXT: and %o1, 255, %o118; CHECK-NEXT: .LBB0_1: ! %atomicrmw.start19; CHECK-NEXT: ! =>This Inner Loop Header: Depth=120; CHECK-NEXT: mov %o4, %o521; CHECK-NEXT: srl %o4, %o0, %o422; CHECK-NEXT: and %o4, 255, %g223; CHECK-NEXT: add %o4, 1, %o424; CHECK-NEXT: cmp %g2, %o125; CHECK-NEXT: movcc %icc, 0, %o426; CHECK-NEXT: and %o4, 255, %o427; CHECK-NEXT: sll %o4, %o0, %o428; CHECK-NEXT: and %o5, %o3, %g229; CHECK-NEXT: or %g2, %o4, %o430; CHECK-NEXT: cas [%o2], %o5, %o431; CHECK-NEXT: mov %g0, %g232; CHECK-NEXT: cmp %o4, %o533; CHECK-NEXT: move %icc, 1, %g234; CHECK-NEXT: cmp %g2, 135; CHECK-NEXT: bne %icc, .LBB0_136; CHECK-NEXT: nop37; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end38; CHECK-NEXT: srl %o4, %o0, %o039; CHECK-NEXT: membar #LoadLoad | #LoadStore40; CHECK-NEXT: retl41; CHECK-NEXT: nop42 %result = atomicrmw uinc_wrap ptr %ptr, i8 %val seq_cst43 ret i8 %result44}45 46define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {47; CHECK-LABEL: atomicrmw_uinc_wrap_i16:48; CHECK: .cfi_startproc49; CHECK-NEXT: ! %bb.0:50; CHECK-NEXT: membar #LoadStore | #StoreStore51; CHECK-NEXT: and %o0, -4, %o252; CHECK-NEXT: and %o0, 3, %o053; CHECK-NEXT: xor %o0, 2, %o054; CHECK-NEXT: sll %o0, 3, %o055; CHECK-NEXT: sethi 63, %o356; CHECK-NEXT: or %o3, 1023, %o357; CHECK-NEXT: ld [%o2], %o558; CHECK-NEXT: sll %o3, %o0, %o459; CHECK-NEXT: xor %o4, -1, %o460; CHECK-NEXT: and %o1, %o3, %o161; CHECK-NEXT: .LBB1_1: ! %atomicrmw.start62; CHECK-NEXT: ! =>This Inner Loop Header: Depth=163; CHECK-NEXT: mov %o5, %g264; CHECK-NEXT: srl %o5, %o0, %o565; CHECK-NEXT: and %o5, %o3, %g366; CHECK-NEXT: add %o5, 1, %o567; CHECK-NEXT: cmp %g3, %o168; CHECK-NEXT: movcc %icc, 0, %o569; CHECK-NEXT: and %o5, %o3, %o570; CHECK-NEXT: sll %o5, %o0, %o571; CHECK-NEXT: and %g2, %o4, %g372; CHECK-NEXT: or %g3, %o5, %o573; CHECK-NEXT: cas [%o2], %g2, %o574; CHECK-NEXT: mov %g0, %g375; CHECK-NEXT: cmp %o5, %g276; CHECK-NEXT: move %icc, 1, %g377; CHECK-NEXT: cmp %g3, 178; CHECK-NEXT: bne %icc, .LBB1_179; CHECK-NEXT: nop80; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end81; CHECK-NEXT: srl %o5, %o0, %o082; CHECK-NEXT: membar #LoadLoad | #LoadStore83; CHECK-NEXT: retl84; CHECK-NEXT: nop85 %result = atomicrmw uinc_wrap ptr %ptr, i16 %val seq_cst86 ret i16 %result87}88 89define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) {90; CHECK-LABEL: atomicrmw_uinc_wrap_i32:91; CHECK: .cfi_startproc92; CHECK-NEXT: ! %bb.0:93; CHECK-NEXT: membar #LoadStore | #StoreStore94; CHECK-NEXT: ld [%o0], %o295; CHECK-NEXT: .LBB2_1: ! %atomicrmw.start96; CHECK-NEXT: ! =>This Inner Loop Header: Depth=197; CHECK-NEXT: mov %o2, %o398; CHECK-NEXT: add %o2, 1, %o299; CHECK-NEXT: cmp %o3, %o1100; CHECK-NEXT: movcc %icc, 0, %o2101; CHECK-NEXT: cas [%o0], %o3, %o2102; CHECK-NEXT: mov %g0, %o4103; CHECK-NEXT: cmp %o2, %o3104; CHECK-NEXT: move %icc, 1, %o4105; CHECK-NEXT: cmp %o4, 1106; CHECK-NEXT: bne %icc, .LBB2_1107; CHECK-NEXT: nop108; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end109; CHECK-NEXT: membar #LoadLoad | #LoadStore110; CHECK-NEXT: retl111; CHECK-NEXT: mov %o2, %o0112 %result = atomicrmw uinc_wrap ptr %ptr, i32 %val seq_cst113 ret i32 %result114}115 116define i64 @atomicrmw_uinc_wrap_i64(ptr %ptr, i64 %val) {117; CHECK-LABEL: atomicrmw_uinc_wrap_i64:118; CHECK: .cfi_startproc119; CHECK-NEXT: ! %bb.0:120; CHECK-NEXT: save %sp, -104, %sp121; CHECK-NEXT: .cfi_def_cfa_register %fp122; CHECK-NEXT: .cfi_window_save123; CHECK-NEXT: .cfi_register %o7, %i7124; CHECK-NEXT: ldd [%i0], %g2125; CHECK-NEXT: add %fp, -8, %i3126; CHECK-NEXT: mov 5, %i4127; CHECK-NEXT: .LBB3_1: ! %atomicrmw.start128; CHECK-NEXT: ! =>This Inner Loop Header: Depth=1129; CHECK-NEXT: mov %g0, %i5130; CHECK-NEXT: mov %g0, %g4131; CHECK-NEXT: addcc %g3, 1, %o3132; CHECK-NEXT: addxcc %g2, 0, %o2133; CHECK-NEXT: cmp %g2, %i1134; CHECK-NEXT: movcc %icc, 1, %i5135; CHECK-NEXT: cmp %g3, %i2136; CHECK-NEXT: movcc %icc, 1, %g4137; CHECK-NEXT: cmp %g2, %i1138; CHECK-NEXT: move %icc, %g4, %i5139; CHECK-NEXT: cmp %i5, 0140; CHECK-NEXT: movne %icc, 0, %o2141; CHECK-NEXT: movne %icc, 0, %o3142; CHECK-NEXT: std %g2, [%fp+-8]143; CHECK-NEXT: mov %i0, %o0144; CHECK-NEXT: mov %i3, %o1145; CHECK-NEXT: mov %i4, %o4146; CHECK-NEXT: call __atomic_compare_exchange_8147; CHECK-NEXT: mov %i4, %o5148; CHECK-NEXT: cmp %o0, 0149; CHECK-NEXT: be %icc, .LBB3_1150; CHECK-NEXT: ldd [%fp+-8], %g2151; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end152; CHECK-NEXT: mov %g2, %i0153; CHECK-NEXT: ret154; CHECK-NEXT: restore %g0, %g3, %o1155 %result = atomicrmw uinc_wrap ptr %ptr, i64 %val seq_cst156 ret i64 %result157}158 159define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {160; CHECK-LABEL: atomicrmw_udec_wrap_i8:161; CHECK: .cfi_startproc162; CHECK-NEXT: ! %bb.0:163; CHECK-NEXT: membar #LoadStore | #StoreStore164; CHECK-NEXT: and %o0, -4, %o2165; CHECK-NEXT: mov 3, %o3166; CHECK-NEXT: andn %o3, %o0, %o0167; CHECK-NEXT: sll %o0, 3, %o0168; CHECK-NEXT: mov 255, %o3169; CHECK-NEXT: ld [%o2], %o5170; CHECK-NEXT: sll %o3, %o0, %o3171; CHECK-NEXT: xor %o3, -1, %o3172; CHECK-NEXT: and %o1, 255, %o4173; CHECK-NEXT: .LBB4_1: ! %atomicrmw.start174; CHECK-NEXT: ! =>This Inner Loop Header: Depth=1175; CHECK-NEXT: mov %o5, %g2176; CHECK-NEXT: srl %o5, %o0, %o5177; CHECK-NEXT: and %o5, 255, %g3178; CHECK-NEXT: add %o5, -1, %o5179; CHECK-NEXT: cmp %g3, %o4180; CHECK-NEXT: movgu %icc, %o1, %o5181; CHECK-NEXT: cmp %g3, 0182; CHECK-NEXT: move %icc, %o1, %o5183; CHECK-NEXT: and %o5, 255, %o5184; CHECK-NEXT: sll %o5, %o0, %o5185; CHECK-NEXT: and %g2, %o3, %g3186; CHECK-NEXT: or %g3, %o5, %o5187; CHECK-NEXT: cas [%o2], %g2, %o5188; CHECK-NEXT: mov %g0, %g3189; CHECK-NEXT: cmp %o5, %g2190; CHECK-NEXT: move %icc, 1, %g3191; CHECK-NEXT: cmp %g3, 1192; CHECK-NEXT: bne %icc, .LBB4_1193; CHECK-NEXT: nop194; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end195; CHECK-NEXT: srl %o5, %o0, %o0196; CHECK-NEXT: membar #LoadLoad | #LoadStore197; CHECK-NEXT: retl198; CHECK-NEXT: nop199 %result = atomicrmw udec_wrap ptr %ptr, i8 %val seq_cst200 ret i8 %result201}202 203define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {204; CHECK-LABEL: atomicrmw_udec_wrap_i16:205; CHECK: .cfi_startproc206; CHECK-NEXT: ! %bb.0:207; CHECK-NEXT: membar #LoadStore | #StoreStore208; CHECK-NEXT: and %o0, -4, %o2209; CHECK-NEXT: and %o0, 3, %o0210; CHECK-NEXT: xor %o0, 2, %o0211; CHECK-NEXT: sll %o0, 3, %o0212; CHECK-NEXT: sethi 63, %o3213; CHECK-NEXT: or %o3, 1023, %o3214; CHECK-NEXT: ld [%o2], %g2215; CHECK-NEXT: sll %o3, %o0, %o4216; CHECK-NEXT: xor %o4, -1, %o4217; CHECK-NEXT: and %o1, %o3, %o5218; CHECK-NEXT: .LBB5_1: ! %atomicrmw.start219; CHECK-NEXT: ! =>This Inner Loop Header: Depth=1220; CHECK-NEXT: mov %g2, %g3221; CHECK-NEXT: srl %g2, %o0, %g2222; CHECK-NEXT: and %g2, %o3, %g4223; CHECK-NEXT: add %g2, -1, %g2224; CHECK-NEXT: cmp %g4, %o5225; CHECK-NEXT: movgu %icc, %o1, %g2226; CHECK-NEXT: cmp %g4, 0227; CHECK-NEXT: move %icc, %o1, %g2228; CHECK-NEXT: and %g2, %o3, %g2229; CHECK-NEXT: sll %g2, %o0, %g2230; CHECK-NEXT: and %g3, %o4, %g4231; CHECK-NEXT: or %g4, %g2, %g2232; CHECK-NEXT: cas [%o2], %g3, %g2233; CHECK-NEXT: mov %g0, %g4234; CHECK-NEXT: cmp %g2, %g3235; CHECK-NEXT: move %icc, 1, %g4236; CHECK-NEXT: cmp %g4, 1237; CHECK-NEXT: bne %icc, .LBB5_1238; CHECK-NEXT: nop239; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end240; CHECK-NEXT: srl %g2, %o0, %o0241; CHECK-NEXT: membar #LoadLoad | #LoadStore242; CHECK-NEXT: retl243; CHECK-NEXT: nop244 %result = atomicrmw udec_wrap ptr %ptr, i16 %val seq_cst245 ret i16 %result246}247 248define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) {249; CHECK-LABEL: atomicrmw_udec_wrap_i32:250; CHECK: .cfi_startproc251; CHECK-NEXT: ! %bb.0:252; CHECK-NEXT: membar #LoadStore | #StoreStore253; CHECK-NEXT: ld [%o0], %o2254; CHECK-NEXT: .LBB6_1: ! %atomicrmw.start255; CHECK-NEXT: ! =>This Inner Loop Header: Depth=1256; CHECK-NEXT: mov %o2, %o3257; CHECK-NEXT: add %o2, -1, %o2258; CHECK-NEXT: cmp %o3, %o1259; CHECK-NEXT: movgu %icc, %o1, %o2260; CHECK-NEXT: cmp %o3, 0261; CHECK-NEXT: move %icc, %o1, %o2262; CHECK-NEXT: cas [%o0], %o3, %o2263; CHECK-NEXT: mov %g0, %o4264; CHECK-NEXT: cmp %o2, %o3265; CHECK-NEXT: move %icc, 1, %o4266; CHECK-NEXT: cmp %o4, 1267; CHECK-NEXT: bne %icc, .LBB6_1268; CHECK-NEXT: nop269; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end270; CHECK-NEXT: membar #LoadLoad | #LoadStore271; CHECK-NEXT: retl272; CHECK-NEXT: mov %o2, %o0273 %result = atomicrmw udec_wrap ptr %ptr, i32 %val seq_cst274 ret i32 %result275}276 277define i64 @atomicrmw_udec_wrap_i64(ptr %ptr, i64 %val) {278; CHECK-LABEL: atomicrmw_udec_wrap_i64:279; CHECK: .cfi_startproc280; CHECK-NEXT: ! %bb.0:281; CHECK-NEXT: save %sp, -104, %sp282; CHECK-NEXT: .cfi_def_cfa_register %fp283; CHECK-NEXT: .cfi_window_save284; CHECK-NEXT: .cfi_register %o7, %i7285; CHECK-NEXT: ldd [%i0], %g2286; CHECK-NEXT: add %fp, -8, %i3287; CHECK-NEXT: mov 5, %i4288; CHECK-NEXT: .LBB7_1: ! %atomicrmw.start289; CHECK-NEXT: ! =>This Inner Loop Header: Depth=1290; CHECK-NEXT: mov %g0, %i5291; CHECK-NEXT: mov %g0, %g4292; CHECK-NEXT: mov %g0, %l0293; CHECK-NEXT: addcc %g3, -1, %o3294; CHECK-NEXT: addxcc %g2, -1, %o2295; CHECK-NEXT: orcc %g3, %g2, %g0296; CHECK-NEXT: move %icc, 1, %i5297; CHECK-NEXT: cmp %g2, %i1298; CHECK-NEXT: movgu %icc, 1, %g4299; CHECK-NEXT: cmp %g3, %i2300; CHECK-NEXT: movgu %icc, 1, %l0301; CHECK-NEXT: cmp %g2, %i1302; CHECK-NEXT: move %icc, %l0, %g4303; CHECK-NEXT: orcc %i5, %g4, %g0304; CHECK-NEXT: movne %icc, %i1, %o2305; CHECK-NEXT: movne %icc, %i2, %o3306; CHECK-NEXT: std %g2, [%fp+-8]307; CHECK-NEXT: mov %i0, %o0308; CHECK-NEXT: mov %i3, %o1309; CHECK-NEXT: mov %i4, %o4310; CHECK-NEXT: call __atomic_compare_exchange_8311; CHECK-NEXT: mov %i4, %o5312; CHECK-NEXT: cmp %o0, 0313; CHECK-NEXT: be %icc, .LBB7_1314; CHECK-NEXT: ldd [%fp+-8], %g2315; CHECK-NEXT: ! %bb.2: ! %atomicrmw.end316; CHECK-NEXT: mov %g2, %i0317; CHECK-NEXT: ret318; CHECK-NEXT: restore %g0, %g3, %o1319 %result = atomicrmw udec_wrap ptr %ptr, i64 %val seq_cst320 ret i64 %result321}322