277 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s3 4;;; Test atomicrmw operations5 6@c = common global i8 0, align 47@s = common global i16 0, align 48@i = common global i32 0, align 49@l = common global i64 0, align 410 11; Function Attrs: norecurse nounwind12define signext i8 @test_atomic_fetch_add_1() {13; CHECK-LABEL: test_atomic_fetch_add_1:14; CHECK: # %bb.0: # %entry15; CHECK-NEXT: fencem 316; CHECK-NEXT: lea %s0, c@lo17; CHECK-NEXT: and %s0, %s0, (32)018; CHECK-NEXT: lea.sl %s0, c@hi(, %s0)19; CHECK-NEXT: and %s0, -4, %s020; CHECK-NEXT: ldl.sx %s2, (, %s0)21; CHECK-NEXT: lea %s1, -25622; CHECK-NEXT: and %s1, %s1, (32)023; CHECK-NEXT: .LBB0_1: # %atomicrmw.start24; CHECK-NEXT: # =>This Inner Loop Header: Depth=125; CHECK-NEXT: or %s3, 0, %s226; CHECK-NEXT: adds.w.sx %s2, 1, %s227; CHECK-NEXT: and %s2, %s2, (56)028; CHECK-NEXT: and %s4, %s3, %s129; CHECK-NEXT: or %s2, %s4, %s230; CHECK-NEXT: cas.w %s2, (%s0), %s331; CHECK-NEXT: brne.w %s2, %s3, .LBB0_132; CHECK-NEXT: # %bb.2: # %atomicrmw.end33; CHECK-NEXT: sll %s0, %s2, 5634; CHECK-NEXT: sra.l %s0, %s0, 5635; CHECK-NEXT: fencem 336; CHECK-NEXT: b.l.t (, %s10)37entry:38 %0 = atomicrmw add ptr @c, i8 1 seq_cst39 ret i8 %040}41 42; Function Attrs: norecurse nounwind43define signext i16 @test_atomic_fetch_sub_2() {44; CHECK-LABEL: test_atomic_fetch_sub_2:45; CHECK: # %bb.0: # %entry46; CHECK-NEXT: fencem 347; CHECK-NEXT: lea %s0, s@lo48; CHECK-NEXT: and %s0, %s0, (32)049; CHECK-NEXT: lea.sl %s0, s@hi(, %s0)50; CHECK-NEXT: and %s0, -4, %s051; CHECK-NEXT: ldl.sx %s2, (, %s0)52; CHECK-NEXT: lea %s1, -6553653; CHECK-NEXT: and %s1, %s1, (32)054; CHECK-NEXT: .LBB1_1: # %atomicrmw.start55; CHECK-NEXT: # =>This Inner Loop Header: Depth=156; CHECK-NEXT: or %s3, 0, %s257; CHECK-NEXT: adds.w.sx %s2, -1, %s258; CHECK-NEXT: and %s2, %s2, (48)059; CHECK-NEXT: and %s4, %s3, %s160; CHECK-NEXT: or %s2, %s4, %s261; CHECK-NEXT: cas.w %s2, (%s0), %s362; CHECK-NEXT: brne.w %s2, %s3, .LBB1_163; CHECK-NEXT: # %bb.2: # %atomicrmw.end64; CHECK-NEXT: sll %s0, %s2, 4865; CHECK-NEXT: sra.l %s0, %s0, 4866; CHECK-NEXT: fencem 367; CHECK-NEXT: b.l.t (, %s10)68entry:69 %0 = atomicrmw sub ptr @s, i16 1 seq_cst70 ret i16 %071}72 73; Function Attrs: norecurse nounwind74define signext i32 @test_atomic_fetch_and_4() {75; CHECK-LABEL: test_atomic_fetch_and_4:76; CHECK: # %bb.0: # %entry77; CHECK-NEXT: fencem 378; CHECK-NEXT: lea %s0, i@lo79; CHECK-NEXT: and %s0, %s0, (32)080; CHECK-NEXT: lea.sl %s0, i@hi(, %s0)81; CHECK-NEXT: ldl.sx %s1, (, %s0)82; CHECK-NEXT: .LBB2_1: # %atomicrmw.start83; CHECK-NEXT: # =>This Inner Loop Header: Depth=184; CHECK-NEXT: or %s2, 0, %s185; CHECK-NEXT: and %s1, 1, %s286; CHECK-NEXT: cas.w %s1, (%s0), %s287; CHECK-NEXT: brne.w %s1, %s2, .LBB2_188; CHECK-NEXT: # %bb.2: # %atomicrmw.end89; CHECK-NEXT: adds.w.sx %s0, %s1, (0)190; CHECK-NEXT: fencem 391; CHECK-NEXT: b.l.t (, %s10)92entry:93 %0 = atomicrmw and ptr @i, i32 1 seq_cst94 ret i32 %095}96; Function Attrs: norecurse nounwind97define i64 @test_atomic_fetch_or_8() {98; CHECK-LABEL: test_atomic_fetch_or_8:99; CHECK: # %bb.0: # %entry100; CHECK-NEXT: fencem 3101; CHECK-NEXT: lea %s0, l@lo102; CHECK-NEXT: and %s0, %s0, (32)0103; CHECK-NEXT: lea.sl %s1, l@hi(, %s0)104; CHECK-NEXT: ld %s0, (, %s1)105; CHECK-NEXT: .LBB3_1: # %atomicrmw.start106; CHECK-NEXT: # =>This Inner Loop Header: Depth=1107; CHECK-NEXT: or %s2, 0, %s0108; CHECK-NEXT: or %s0, 1, %s0109; CHECK-NEXT: cas.l %s0, (%s1), %s2110; CHECK-NEXT: brne.l %s0, %s2, .LBB3_1111; CHECK-NEXT: # %bb.2: # %atomicrmw.end112; CHECK-NEXT: fencem 3113; CHECK-NEXT: b.l.t (, %s10)114entry:115 %0 = atomicrmw or ptr @l, i64 1 seq_cst116 ret i64 %0117}118 119; Function Attrs: norecurse nounwind120define signext i8 @test_atomic_fetch_xor_1() {121; CHECK-LABEL: test_atomic_fetch_xor_1:122; CHECK: # %bb.0: # %entry123; CHECK-NEXT: fencem 3124; CHECK-NEXT: lea %s0, c@lo125; CHECK-NEXT: and %s0, %s0, (32)0126; CHECK-NEXT: lea.sl %s0, c@hi(, %s0)127; CHECK-NEXT: and %s1, -4, %s0128; CHECK-NEXT: ldl.sx %s0, (, %s1)129; CHECK-NEXT: .LBB4_1: # %atomicrmw.start130; CHECK-NEXT: # =>This Inner Loop Header: Depth=1131; CHECK-NEXT: or %s2, 0, %s0132; CHECK-NEXT: xor %s0, 1, %s2133; CHECK-NEXT: cas.w %s0, (%s1), %s2134; CHECK-NEXT: brne.w %s0, %s2, .LBB4_1135; CHECK-NEXT: # %bb.2: # %atomicrmw.end136; CHECK-NEXT: sll %s0, %s0, 56137; CHECK-NEXT: sra.l %s0, %s0, 56138; CHECK-NEXT: fencem 3139; CHECK-NEXT: b.l.t (, %s10)140entry:141 %0 = atomicrmw xor ptr @c, i8 1 seq_cst142 ret i8 %0143}144 145; Function Attrs: norecurse nounwind146define signext i16 @test_atomic_fetch_nand_2() {147; CHECK-LABEL: test_atomic_fetch_nand_2:148; CHECK: # %bb.0: # %entry149; CHECK-NEXT: fencem 3150; CHECK-NEXT: lea %s0, s@lo151; CHECK-NEXT: and %s0, %s0, (32)0152; CHECK-NEXT: lea.sl %s0, s@hi(, %s0)153; CHECK-NEXT: and %s0, -4, %s0154; CHECK-NEXT: ldl.sx %s2, (, %s0)155; CHECK-NEXT: lea %s1, 65534156; CHECK-NEXT: lea %s3, -65536157; CHECK-NEXT: and %s3, %s3, (32)0158; CHECK-NEXT: .LBB5_1: # %atomicrmw.start159; CHECK-NEXT: # =>This Inner Loop Header: Depth=1160; CHECK-NEXT: or %s4, 0, %s2161; CHECK-NEXT: xor %s2, -1, %s4162; CHECK-NEXT: or %s2, %s2, %s1163; CHECK-NEXT: and %s2, %s2, (48)0164; CHECK-NEXT: and %s5, %s4, %s3165; CHECK-NEXT: or %s2, %s5, %s2166; CHECK-NEXT: cas.w %s2, (%s0), %s4167; CHECK-NEXT: brne.w %s2, %s4, .LBB5_1168; CHECK-NEXT: # %bb.2: # %atomicrmw.end169; CHECK-NEXT: sll %s0, %s2, 48170; CHECK-NEXT: sra.l %s0, %s0, 48171; CHECK-NEXT: fencem 3172; CHECK-NEXT: b.l.t (, %s10)173entry:174 %0 = atomicrmw nand ptr @s, i16 1 seq_cst175 ret i16 %0176}177 178; Function Attrs: norecurse nounwind179define signext i32 @test_atomic_fetch_max_4() {180; CHECK-LABEL: test_atomic_fetch_max_4:181; CHECK: # %bb.0: # %entry182; CHECK-NEXT: fencem 3183; CHECK-NEXT: lea %s0, i@lo184; CHECK-NEXT: and %s0, %s0, (32)0185; CHECK-NEXT: lea.sl %s1, i@hi(, %s0)186; CHECK-NEXT: ldl.sx %s0, (, %s1)187; CHECK-NEXT: .LBB6_1: # %atomicrmw.start188; CHECK-NEXT: # =>This Inner Loop Header: Depth=1189; CHECK-NEXT: or %s2, 0, %s0190; CHECK-NEXT: maxs.w.sx %s0, 1, %s0191; CHECK-NEXT: cas.w %s0, (%s1), %s2192; CHECK-NEXT: brne.w %s0, %s2, .LBB6_1193; CHECK-NEXT: # %bb.2: # %atomicrmw.end194; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1195; CHECK-NEXT: fencem 3196; CHECK-NEXT: b.l.t (, %s10)197entry:198 %0 = atomicrmw max ptr @i, i32 1 seq_cst199 ret i32 %0200}201 202; Function Attrs: norecurse nounwind203define signext i32 @test_atomic_fetch_min_4() {204; CHECK-LABEL: test_atomic_fetch_min_4:205; CHECK: # %bb.0: # %entry206; CHECK-NEXT: fencem 3207; CHECK-NEXT: lea %s0, i@lo208; CHECK-NEXT: and %s0, %s0, (32)0209; CHECK-NEXT: lea.sl %s1, i@hi(, %s0)210; CHECK-NEXT: ldl.sx %s0, (, %s1)211; CHECK-NEXT: .LBB7_1: # %atomicrmw.start212; CHECK-NEXT: # =>This Inner Loop Header: Depth=1213; CHECK-NEXT: or %s2, 0, %s0214; CHECK-NEXT: mins.w.sx %s0, 1, %s0215; CHECK-NEXT: cas.w %s0, (%s1), %s2216; CHECK-NEXT: brne.w %s0, %s2, .LBB7_1217; CHECK-NEXT: # %bb.2: # %atomicrmw.end218; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1219; CHECK-NEXT: fencem 3220; CHECK-NEXT: b.l.t (, %s10)221entry:222 %0 = atomicrmw min ptr @i, i32 1 seq_cst223 ret i32 %0224}225 226; Function Attrs: norecurse nounwind227define signext i32 @test_atomic_fetch_umax_4() {228; CHECK-LABEL: test_atomic_fetch_umax_4:229; CHECK: # %bb.0: # %entry230; CHECK-NEXT: fencem 3231; CHECK-NEXT: lea %s0, i@lo232; CHECK-NEXT: and %s0, %s0, (32)0233; CHECK-NEXT: lea.sl %s0, i@hi(, %s0)234; CHECK-NEXT: ldl.sx %s1, (, %s0)235; CHECK-NEXT: .LBB8_1: # %atomicrmw.start236; CHECK-NEXT: # =>This Inner Loop Header: Depth=1237; CHECK-NEXT: or %s2, 0, %s1238; CHECK-NEXT: cmpu.w %s3, %s1, (63)0239; CHECK-NEXT: or %s1, 0, %s2240; CHECK-NEXT: cmov.w.le %s1, (63)0, %s3241; CHECK-NEXT: cas.w %s1, (%s0), %s2242; CHECK-NEXT: brne.w %s1, %s2, .LBB8_1243; CHECK-NEXT: # %bb.2: # %atomicrmw.end244; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1245; CHECK-NEXT: fencem 3246; CHECK-NEXT: b.l.t (, %s10)247entry:248 %0 = atomicrmw umax ptr @i, i32 1 seq_cst249 ret i32 %0250}251 252; Function Attrs: norecurse nounwind253define signext i32 @test_atomic_fetch_umin_4() {254; CHECK-LABEL: test_atomic_fetch_umin_4:255; CHECK: # %bb.0: # %entry256; CHECK-NEXT: fencem 3257; CHECK-NEXT: lea %s0, i@lo258; CHECK-NEXT: and %s0, %s0, (32)0259; CHECK-NEXT: lea.sl %s0, i@hi(, %s0)260; CHECK-NEXT: ldl.sx %s1, (, %s0)261; CHECK-NEXT: .LBB9_1: # %atomicrmw.start262; CHECK-NEXT: # =>This Inner Loop Header: Depth=1263; CHECK-NEXT: or %s2, 0, %s1264; CHECK-NEXT: cmpu.w %s3, 2, %s1265; CHECK-NEXT: or %s1, 0, %s2266; CHECK-NEXT: cmov.w.le %s1, (63)0, %s3267; CHECK-NEXT: cas.w %s1, (%s0), %s2268; CHECK-NEXT: brne.w %s1, %s2, .LBB9_1269; CHECK-NEXT: # %bb.2: # %atomicrmw.end270; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1271; CHECK-NEXT: fencem 3272; CHECK-NEXT: b.l.t (, %s10)273entry:274 %0 = atomicrmw umin ptr @i, i32 1 seq_cst275 ret i32 %0276}277