1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s 3 4;;; Test atomicrmw operations 5 6@c = common global i8 0, align 4 7@s = common global i16 0, align 4 8@i = common global i32 0, align 4 9@l = common global i64 0, align 4 10 11; Function Attrs: norecurse nounwind 12define signext i8 @test_atomic_fetch_add_1() { 13; CHECK-LABEL: test_atomic_fetch_add_1: 14; CHECK: # %bb.0: # %entry 15; CHECK-NEXT: fencem 3 16; CHECK-NEXT: lea %s0, c@lo 17; CHECK-NEXT: and %s0, %s0, (32)0 18; CHECK-NEXT: lea.sl %s0, c@hi(, %s0) 19; CHECK-NEXT: and %s0, -4, %s0 20; CHECK-NEXT: ldl.sx %s2, (, %s0) 21; CHECK-NEXT: lea %s1, -256 22; CHECK-NEXT: and %s1, %s1, (32)0 23; CHECK-NEXT: .LBB0_1: # %atomicrmw.start 24; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 25; CHECK-NEXT: or %s3, 0, %s2 26; CHECK-NEXT: adds.w.sx %s2, 1, %s2 27; CHECK-NEXT: and %s2, %s2, (56)0 28; CHECK-NEXT: and %s4, %s3, %s1 29; CHECK-NEXT: or %s2, %s4, %s2 30; CHECK-NEXT: cas.w %s2, (%s0), %s3 31; CHECK-NEXT: brne.w %s2, %s3, .LBB0_1 32; CHECK-NEXT: # %bb.2: # %atomicrmw.end 33; CHECK-NEXT: sll %s0, %s2, 56 34; CHECK-NEXT: sra.l %s0, %s0, 56 35; CHECK-NEXT: fencem 3 36; CHECK-NEXT: b.l.t (, %s10) 37entry: 38 %0 = atomicrmw add ptr @c, i8 1 seq_cst 39 ret i8 %0 40} 41 42; Function Attrs: norecurse nounwind 43define signext i16 @test_atomic_fetch_sub_2() { 44; CHECK-LABEL: test_atomic_fetch_sub_2: 45; CHECK: # %bb.0: # %entry 46; CHECK-NEXT: fencem 3 47; CHECK-NEXT: lea %s0, s@lo 48; CHECK-NEXT: and %s0, %s0, (32)0 49; CHECK-NEXT: lea.sl %s0, s@hi(, %s0) 50; CHECK-NEXT: and %s0, -4, %s0 51; CHECK-NEXT: ldl.sx %s2, (, %s0) 52; CHECK-NEXT: lea %s1, -65536 53; CHECK-NEXT: and %s1, %s1, (32)0 54; CHECK-NEXT: .LBB1_1: # %atomicrmw.start 55; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 56; CHECK-NEXT: or %s3, 0, %s2 57; CHECK-NEXT: adds.w.sx %s2, -1, %s2 58; CHECK-NEXT: and %s2, %s2, (48)0 59; CHECK-NEXT: and %s4, %s3, %s1 60; CHECK-NEXT: or %s2, %s4, %s2 61; CHECK-NEXT: cas.w %s2, (%s0), %s3 62; CHECK-NEXT: brne.w %s2, %s3, .LBB1_1 63; CHECK-NEXT: # %bb.2: # %atomicrmw.end 64; CHECK-NEXT: sll %s0, %s2, 48 65; CHECK-NEXT: sra.l %s0, %s0, 48 66; CHECK-NEXT: fencem 3 67; CHECK-NEXT: b.l.t (, %s10) 68entry: 69 %0 = atomicrmw sub ptr @s, i16 1 seq_cst 70 ret i16 %0 71} 72 73; Function Attrs: norecurse nounwind 74define signext i32 @test_atomic_fetch_and_4() { 75; CHECK-LABEL: test_atomic_fetch_and_4: 76; CHECK: # %bb.0: # %entry 77; CHECK-NEXT: fencem 3 78; CHECK-NEXT: lea %s0, i@lo 79; CHECK-NEXT: and %s0, %s0, (32)0 80; CHECK-NEXT: lea.sl %s0, i@hi(, %s0) 81; CHECK-NEXT: ldl.sx %s1, (, %s0) 82; CHECK-NEXT: .LBB2_1: # %atomicrmw.start 83; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 84; CHECK-NEXT: or %s2, 0, %s1 85; CHECK-NEXT: and %s1, 1, %s2 86; CHECK-NEXT: cas.w %s1, (%s0), %s2 87; CHECK-NEXT: brne.w %s1, %s2, .LBB2_1 88; CHECK-NEXT: # %bb.2: # %atomicrmw.end 89; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1 90; CHECK-NEXT: fencem 3 91; CHECK-NEXT: b.l.t (, %s10) 92entry: 93 %0 = atomicrmw and ptr @i, i32 1 seq_cst 94 ret i32 %0 95} 96; Function Attrs: norecurse nounwind 97define i64 @test_atomic_fetch_or_8() { 98; CHECK-LABEL: test_atomic_fetch_or_8: 99; CHECK: # %bb.0: # %entry 100; CHECK-NEXT: fencem 3 101; CHECK-NEXT: lea %s0, l@lo 102; CHECK-NEXT: and %s0, %s0, (32)0 103; CHECK-NEXT: lea.sl %s1, l@hi(, %s0) 104; CHECK-NEXT: ld %s0, (, %s1) 105; CHECK-NEXT: .LBB3_1: # %atomicrmw.start 106; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 107; CHECK-NEXT: or %s2, 0, %s0 108; CHECK-NEXT: or %s0, 1, %s0 109; CHECK-NEXT: cas.l %s0, (%s1), %s2 110; CHECK-NEXT: brne.l %s0, %s2, .LBB3_1 111; CHECK-NEXT: # %bb.2: # %atomicrmw.end 112; CHECK-NEXT: fencem 3 113; CHECK-NEXT: b.l.t (, %s10) 114entry: 115 %0 = atomicrmw or ptr @l, i64 1 seq_cst 116 ret i64 %0 117} 118 119; Function Attrs: norecurse nounwind 120define signext i8 @test_atomic_fetch_xor_1() { 121; CHECK-LABEL: test_atomic_fetch_xor_1: 122; CHECK: # %bb.0: # %entry 123; CHECK-NEXT: fencem 3 124; CHECK-NEXT: lea %s0, c@lo 125; CHECK-NEXT: and %s0, %s0, (32)0 126; CHECK-NEXT: lea.sl %s0, c@hi(, %s0) 127; CHECK-NEXT: and %s1, -4, %s0 128; CHECK-NEXT: ldl.sx %s0, (, %s1) 129; CHECK-NEXT: .LBB4_1: # %atomicrmw.start 130; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 131; CHECK-NEXT: or %s2, 0, %s0 132; CHECK-NEXT: xor %s0, 1, %s2 133; CHECK-NEXT: cas.w %s0, (%s1), %s2 134; CHECK-NEXT: brne.w %s0, %s2, .LBB4_1 135; CHECK-NEXT: # %bb.2: # %atomicrmw.end 136; CHECK-NEXT: sll %s0, %s0, 56 137; CHECK-NEXT: sra.l %s0, %s0, 56 138; CHECK-NEXT: fencem 3 139; CHECK-NEXT: b.l.t (, %s10) 140entry: 141 %0 = atomicrmw xor ptr @c, i8 1 seq_cst 142 ret i8 %0 143} 144 145; Function Attrs: norecurse nounwind 146define signext i16 @test_atomic_fetch_nand_2() { 147; CHECK-LABEL: test_atomic_fetch_nand_2: 148; CHECK: # %bb.0: # %entry 149; CHECK-NEXT: fencem 3 150; CHECK-NEXT: lea %s0, s@lo 151; CHECK-NEXT: and %s0, %s0, (32)0 152; CHECK-NEXT: lea.sl %s0, s@hi(, %s0) 153; CHECK-NEXT: and %s0, -4, %s0 154; CHECK-NEXT: ldl.sx %s2, (, %s0) 155; CHECK-NEXT: lea %s1, 65534 156; CHECK-NEXT: lea %s3, -65536 157; CHECK-NEXT: and %s3, %s3, (32)0 158; CHECK-NEXT: .LBB5_1: # %atomicrmw.start 159; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 160; CHECK-NEXT: or %s4, 0, %s2 161; CHECK-NEXT: xor %s2, -1, %s4 162; CHECK-NEXT: or %s2, %s2, %s1 163; CHECK-NEXT: and %s2, %s2, (48)0 164; CHECK-NEXT: and %s5, %s4, %s3 165; CHECK-NEXT: or %s2, %s5, %s2 166; CHECK-NEXT: cas.w %s2, (%s0), %s4 167; CHECK-NEXT: brne.w %s2, %s4, .LBB5_1 168; CHECK-NEXT: # %bb.2: # %atomicrmw.end 169; CHECK-NEXT: sll %s0, %s2, 48 170; CHECK-NEXT: sra.l %s0, %s0, 48 171; CHECK-NEXT: fencem 3 172; CHECK-NEXT: b.l.t (, %s10) 173entry: 174 %0 = atomicrmw nand ptr @s, i16 1 seq_cst 175 ret i16 %0 176} 177 178; Function Attrs: norecurse nounwind 179define signext i32 @test_atomic_fetch_max_4() { 180; CHECK-LABEL: test_atomic_fetch_max_4: 181; CHECK: # %bb.0: # %entry 182; CHECK-NEXT: fencem 3 183; CHECK-NEXT: lea %s0, i@lo 184; CHECK-NEXT: and %s0, %s0, (32)0 185; CHECK-NEXT: lea.sl %s1, i@hi(, %s0) 186; CHECK-NEXT: ldl.sx %s0, (, %s1) 187; CHECK-NEXT: .LBB6_1: # %atomicrmw.start 188; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 189; CHECK-NEXT: or %s2, 0, %s0 190; CHECK-NEXT: maxs.w.sx %s0, 1, %s0 191; CHECK-NEXT: cas.w %s0, (%s1), %s2 192; CHECK-NEXT: brne.w %s0, %s2, .LBB6_1 193; CHECK-NEXT: # %bb.2: # %atomicrmw.end 194; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 195; CHECK-NEXT: fencem 3 196; CHECK-NEXT: b.l.t (, %s10) 197entry: 198 %0 = atomicrmw max ptr @i, i32 1 seq_cst 199 ret i32 %0 200} 201 202; Function Attrs: norecurse nounwind 203define signext i32 @test_atomic_fetch_min_4() { 204; CHECK-LABEL: test_atomic_fetch_min_4: 205; CHECK: # %bb.0: # %entry 206; CHECK-NEXT: fencem 3 207; CHECK-NEXT: lea %s0, i@lo 208; CHECK-NEXT: and %s0, %s0, (32)0 209; CHECK-NEXT: lea.sl %s1, i@hi(, %s0) 210; CHECK-NEXT: ldl.sx %s0, (, %s1) 211; CHECK-NEXT: .LBB7_1: # %atomicrmw.start 212; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 213; CHECK-NEXT: or %s2, 0, %s0 214; CHECK-NEXT: mins.w.sx %s0, 1, %s0 215; CHECK-NEXT: cas.w %s0, (%s1), %s2 216; CHECK-NEXT: brne.w %s0, %s2, .LBB7_1 217; CHECK-NEXT: # %bb.2: # %atomicrmw.end 218; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 219; CHECK-NEXT: fencem 3 220; CHECK-NEXT: b.l.t (, %s10) 221entry: 222 %0 = atomicrmw min ptr @i, i32 1 seq_cst 223 ret i32 %0 224} 225 226; Function Attrs: norecurse nounwind 227define signext i32 @test_atomic_fetch_umax_4() { 228; CHECK-LABEL: test_atomic_fetch_umax_4: 229; CHECK: # %bb.0: # %entry 230; CHECK-NEXT: fencem 3 231; CHECK-NEXT: lea %s0, i@lo 232; CHECK-NEXT: and %s0, %s0, (32)0 233; CHECK-NEXT: lea.sl %s0, i@hi(, %s0) 234; CHECK-NEXT: ldl.sx %s1, (, %s0) 235; CHECK-NEXT: .LBB8_1: # %atomicrmw.start 236; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 237; CHECK-NEXT: or %s2, 0, %s1 238; CHECK-NEXT: cmpu.w %s3, %s1, (63)0 239; CHECK-NEXT: or %s1, 0, %s2 240; CHECK-NEXT: cmov.w.le %s1, (63)0, %s3 241; CHECK-NEXT: cas.w %s1, (%s0), %s2 242; CHECK-NEXT: brne.w %s1, %s2, .LBB8_1 243; CHECK-NEXT: # %bb.2: # %atomicrmw.end 244; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1 245; CHECK-NEXT: fencem 3 246; CHECK-NEXT: b.l.t (, %s10) 247entry: 248 %0 = atomicrmw umax ptr @i, i32 1 seq_cst 249 ret i32 %0 250} 251 252; Function Attrs: norecurse nounwind 253define signext i32 @test_atomic_fetch_umin_4() { 254; CHECK-LABEL: test_atomic_fetch_umin_4: 255; CHECK: # %bb.0: # %entry 256; CHECK-NEXT: fencem 3 257; CHECK-NEXT: lea %s0, i@lo 258; CHECK-NEXT: and %s0, %s0, (32)0 259; CHECK-NEXT: lea.sl %s0, i@hi(, %s0) 260; CHECK-NEXT: ldl.sx %s1, (, %s0) 261; CHECK-NEXT: .LBB9_1: # %atomicrmw.start 262; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 263; CHECK-NEXT: or %s2, 0, %s1 264; CHECK-NEXT: cmpu.w %s3, 2, %s1 265; CHECK-NEXT: or %s1, 0, %s2 266; CHECK-NEXT: cmov.w.le %s1, (63)0, %s3 267; CHECK-NEXT: cas.w %s1, (%s0), %s2 268; CHECK-NEXT: brne.w %s1, %s2, .LBB9_1 269; CHECK-NEXT: # %bb.2: # %atomicrmw.end 270; CHECK-NEXT: adds.w.sx %s0, %s1, (0)1 271; CHECK-NEXT: fencem 3 272; CHECK-NEXT: b.l.t (, %s10) 273entry: 274 %0 = atomicrmw umin ptr @i, i32 1 seq_cst 275 ret i32 %0 276} 277