1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch64 -mattr=+d,-ld-seq-sa < %s | FileCheck %s --check-prefixes=LA64,NO-LD-SEQ-SA 3; RUN: llc --mtriple=loongarch64 -mattr=+d,+ld-seq-sa < %s | FileCheck %s --check-prefixes=LA64,LD-SEQ-SA 4; RUN: llc --mtriple=loongarch64 -mattr=+d,+lamcas < %s | FileCheck %s --check-prefix=LA64-LAMCAS 5 6define void @cmpxchg_i8_acquire_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind { 7; LA64-LABEL: cmpxchg_i8_acquire_acquire: 8; LA64: # %bb.0: 9; LA64-NEXT: slli.d $a3, $a0, 3 10; LA64-NEXT: bstrins.d $a0, $zero, 1, 0 11; LA64-NEXT: ori $a4, $zero, 255 12; LA64-NEXT: sll.w $a4, $a4, $a3 13; LA64-NEXT: andi $a1, $a1, 255 14; LA64-NEXT: sll.w $a1, $a1, $a3 15; LA64-NEXT: andi $a2, $a2, 255 16; LA64-NEXT: sll.w $a2, $a2, $a3 17; LA64-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 18; LA64-NEXT: ll.w $a3, $a0, 0 19; LA64-NEXT: and $a5, $a3, $a4 20; LA64-NEXT: bne $a5, $a1, .LBB0_3 21; LA64-NEXT: # %bb.2: # in Loop: Header=BB0_1 Depth=1 22; LA64-NEXT: andn $a5, $a3, $a4 23; LA64-NEXT: or $a5, $a5, $a2 24; LA64-NEXT: sc.w $a5, $a0, 0 25; LA64-NEXT: beqz $a5, .LBB0_1 26; LA64-NEXT: b .LBB0_4 27; LA64-NEXT: .LBB0_3: 28; LA64-NEXT: dbar 20 29; LA64-NEXT: .LBB0_4: 30; LA64-NEXT: ret 31; 32; LA64-LAMCAS-LABEL: cmpxchg_i8_acquire_acquire: 33; LA64-LAMCAS: # %bb.0: 34; LA64-LAMCAS-NEXT: amcas_db.b $a1, $a2, $a0 35; LA64-LAMCAS-NEXT: ret 36 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire acquire 37 ret void 38} 39 40define void @cmpxchg_i16_acquire_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind { 41; LA64-LABEL: cmpxchg_i16_acquire_acquire: 42; LA64: # %bb.0: 43; LA64-NEXT: slli.d $a3, $a0, 3 44; LA64-NEXT: bstrins.d $a0, $zero, 1, 0 45; LA64-NEXT: lu12i.w $a4, 15 46; LA64-NEXT: ori $a4, $a4, 4095 47; LA64-NEXT: sll.w $a4, $a4, $a3 48; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0 49; LA64-NEXT: sll.w $a1, $a1, $a3 50; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0 51; LA64-NEXT: sll.w $a2, $a2, $a3 52; LA64-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 53; LA64-NEXT: ll.w $a3, $a0, 0 54; LA64-NEXT: and $a5, $a3, $a4 55; LA64-NEXT: bne $a5, $a1, .LBB1_3 56; LA64-NEXT: # %bb.2: # in Loop: Header=BB1_1 Depth=1 57; LA64-NEXT: andn $a5, $a3, $a4 58; LA64-NEXT: or $a5, $a5, $a2 59; LA64-NEXT: sc.w $a5, $a0, 0 60; LA64-NEXT: beqz $a5, .LBB1_1 61; LA64-NEXT: b .LBB1_4 62; LA64-NEXT: .LBB1_3: 63; LA64-NEXT: dbar 20 64; LA64-NEXT: .LBB1_4: 65; LA64-NEXT: ret 66; 67; LA64-LAMCAS-LABEL: cmpxchg_i16_acquire_acquire: 68; LA64-LAMCAS: # %bb.0: 69; LA64-LAMCAS-NEXT: amcas_db.h $a1, $a2, $a0 70; LA64-LAMCAS-NEXT: ret 71 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire acquire 72 ret void 73} 74 75define void @cmpxchg_i32_acquire_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind { 76; LA64-LABEL: cmpxchg_i32_acquire_acquire: 77; LA64: # %bb.0: 78; LA64-NEXT: addi.w $a1, $a1, 0 79; LA64-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 80; LA64-NEXT: ll.w $a3, $a0, 0 81; LA64-NEXT: bne $a3, $a1, .LBB2_3 82; LA64-NEXT: # %bb.2: # in Loop: Header=BB2_1 Depth=1 83; LA64-NEXT: move $a4, $a2 84; LA64-NEXT: sc.w $a4, $a0, 0 85; LA64-NEXT: beqz $a4, .LBB2_1 86; LA64-NEXT: b .LBB2_4 87; LA64-NEXT: .LBB2_3: 88; LA64-NEXT: dbar 20 89; LA64-NEXT: .LBB2_4: 90; LA64-NEXT: ret 91; 92; LA64-LAMCAS-LABEL: cmpxchg_i32_acquire_acquire: 93; LA64-LAMCAS: # %bb.0: 94; LA64-LAMCAS-NEXT: amcas_db.w $a1, $a2, $a0 95; LA64-LAMCAS-NEXT: ret 96 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire 97 ret void 98} 99 100define void @cmpxchg_i64_acquire_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind { 101; LA64-LABEL: cmpxchg_i64_acquire_acquire: 102; LA64: # %bb.0: 103; LA64-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 104; LA64-NEXT: ll.d $a3, $a0, 0 105; LA64-NEXT: bne $a3, $a1, .LBB3_3 106; LA64-NEXT: # %bb.2: # in Loop: Header=BB3_1 Depth=1 107; LA64-NEXT: move $a4, $a2 108; LA64-NEXT: sc.d $a4, $a0, 0 109; LA64-NEXT: beqz $a4, .LBB3_1 110; LA64-NEXT: b .LBB3_4 111; LA64-NEXT: .LBB3_3: 112; LA64-NEXT: dbar 20 113; LA64-NEXT: .LBB3_4: 114; LA64-NEXT: ret 115; 116; LA64-LAMCAS-LABEL: cmpxchg_i64_acquire_acquire: 117; LA64-LAMCAS: # %bb.0: 118; LA64-LAMCAS-NEXT: amcas_db.d $a1, $a2, $a0 119; LA64-LAMCAS-NEXT: ret 120 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire acquire 121 ret void 122} 123 124define void @cmpxchg_i8_acquire_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind { 125; NO-LD-SEQ-SA-LABEL: cmpxchg_i8_acquire_monotonic: 126; NO-LD-SEQ-SA: # %bb.0: 127; NO-LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 128; NO-LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 129; NO-LD-SEQ-SA-NEXT: ori $a4, $zero, 255 130; NO-LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 131; NO-LD-SEQ-SA-NEXT: andi $a1, $a1, 255 132; NO-LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 133; NO-LD-SEQ-SA-NEXT: andi $a2, $a2, 255 134; NO-LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 135; NO-LD-SEQ-SA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 136; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 137; NO-LD-SEQ-SA-NEXT: and $a5, $a3, $a4 138; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB4_3 139; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB4_1 Depth=1 140; NO-LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 141; NO-LD-SEQ-SA-NEXT: or $a5, $a5, $a2 142; NO-LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 143; NO-LD-SEQ-SA-NEXT: beqz $a5, .LBB4_1 144; NO-LD-SEQ-SA-NEXT: b .LBB4_4 145; NO-LD-SEQ-SA-NEXT: .LBB4_3: 146; NO-LD-SEQ-SA-NEXT: dbar 1792 147; NO-LD-SEQ-SA-NEXT: .LBB4_4: 148; NO-LD-SEQ-SA-NEXT: ret 149; 150; LD-SEQ-SA-LABEL: cmpxchg_i8_acquire_monotonic: 151; LD-SEQ-SA: # %bb.0: 152; LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 153; LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 154; LD-SEQ-SA-NEXT: ori $a4, $zero, 255 155; LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 156; LD-SEQ-SA-NEXT: andi $a1, $a1, 255 157; LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 158; LD-SEQ-SA-NEXT: andi $a2, $a2, 255 159; LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 160; LD-SEQ-SA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 161; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 162; LD-SEQ-SA-NEXT: and $a5, $a3, $a4 163; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB4_3 164; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB4_1 Depth=1 165; LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 166; LD-SEQ-SA-NEXT: or $a5, $a5, $a2 167; LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 168; LD-SEQ-SA-NEXT: beqz $a5, .LBB4_1 169; LD-SEQ-SA-NEXT: b .LBB4_4 170; LD-SEQ-SA-NEXT: .LBB4_3: 171; LD-SEQ-SA-NEXT: .LBB4_4: 172; LD-SEQ-SA-NEXT: ret 173; 174; LA64-LAMCAS-LABEL: cmpxchg_i8_acquire_monotonic: 175; LA64-LAMCAS: # %bb.0: 176; LA64-LAMCAS-NEXT: amcas_db.b $a1, $a2, $a0 177; LA64-LAMCAS-NEXT: ret 178 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire monotonic 179 ret void 180} 181 182define void @cmpxchg_i16_acquire_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind { 183; NO-LD-SEQ-SA-LABEL: cmpxchg_i16_acquire_monotonic: 184; NO-LD-SEQ-SA: # %bb.0: 185; NO-LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 186; NO-LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 187; NO-LD-SEQ-SA-NEXT: lu12i.w $a4, 15 188; NO-LD-SEQ-SA-NEXT: ori $a4, $a4, 4095 189; NO-LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 190; NO-LD-SEQ-SA-NEXT: bstrpick.d $a1, $a1, 15, 0 191; NO-LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 192; NO-LD-SEQ-SA-NEXT: bstrpick.d $a2, $a2, 15, 0 193; NO-LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 194; NO-LD-SEQ-SA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1 195; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 196; NO-LD-SEQ-SA-NEXT: and $a5, $a3, $a4 197; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB5_3 198; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB5_1 Depth=1 199; NO-LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 200; NO-LD-SEQ-SA-NEXT: or $a5, $a5, $a2 201; NO-LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 202; NO-LD-SEQ-SA-NEXT: beqz $a5, .LBB5_1 203; NO-LD-SEQ-SA-NEXT: b .LBB5_4 204; NO-LD-SEQ-SA-NEXT: .LBB5_3: 205; NO-LD-SEQ-SA-NEXT: dbar 1792 206; NO-LD-SEQ-SA-NEXT: .LBB5_4: 207; NO-LD-SEQ-SA-NEXT: ret 208; 209; LD-SEQ-SA-LABEL: cmpxchg_i16_acquire_monotonic: 210; LD-SEQ-SA: # %bb.0: 211; LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 212; LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 213; LD-SEQ-SA-NEXT: lu12i.w $a4, 15 214; LD-SEQ-SA-NEXT: ori $a4, $a4, 4095 215; LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 216; LD-SEQ-SA-NEXT: bstrpick.d $a1, $a1, 15, 0 217; LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 218; LD-SEQ-SA-NEXT: bstrpick.d $a2, $a2, 15, 0 219; LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 220; LD-SEQ-SA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1 221; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 222; LD-SEQ-SA-NEXT: and $a5, $a3, $a4 223; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB5_3 224; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB5_1 Depth=1 225; LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 226; LD-SEQ-SA-NEXT: or $a5, $a5, $a2 227; LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 228; LD-SEQ-SA-NEXT: beqz $a5, .LBB5_1 229; LD-SEQ-SA-NEXT: b .LBB5_4 230; LD-SEQ-SA-NEXT: .LBB5_3: 231; LD-SEQ-SA-NEXT: .LBB5_4: 232; LD-SEQ-SA-NEXT: ret 233; 234; LA64-LAMCAS-LABEL: cmpxchg_i16_acquire_monotonic: 235; LA64-LAMCAS: # %bb.0: 236; LA64-LAMCAS-NEXT: amcas_db.h $a1, $a2, $a0 237; LA64-LAMCAS-NEXT: ret 238 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire monotonic 239 ret void 240} 241 242define void @cmpxchg_i32_acquire_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind { 243; NO-LD-SEQ-SA-LABEL: cmpxchg_i32_acquire_monotonic: 244; NO-LD-SEQ-SA: # %bb.0: 245; NO-LD-SEQ-SA-NEXT: addi.w $a1, $a1, 0 246; NO-LD-SEQ-SA-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1 247; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 248; NO-LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB6_3 249; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB6_1 Depth=1 250; NO-LD-SEQ-SA-NEXT: move $a4, $a2 251; NO-LD-SEQ-SA-NEXT: sc.w $a4, $a0, 0 252; NO-LD-SEQ-SA-NEXT: beqz $a4, .LBB6_1 253; NO-LD-SEQ-SA-NEXT: b .LBB6_4 254; NO-LD-SEQ-SA-NEXT: .LBB6_3: 255; NO-LD-SEQ-SA-NEXT: dbar 1792 256; NO-LD-SEQ-SA-NEXT: .LBB6_4: 257; NO-LD-SEQ-SA-NEXT: ret 258; 259; LD-SEQ-SA-LABEL: cmpxchg_i32_acquire_monotonic: 260; LD-SEQ-SA: # %bb.0: 261; LD-SEQ-SA-NEXT: addi.w $a1, $a1, 0 262; LD-SEQ-SA-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1 263; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 264; LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB6_3 265; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB6_1 Depth=1 266; LD-SEQ-SA-NEXT: move $a4, $a2 267; LD-SEQ-SA-NEXT: sc.w $a4, $a0, 0 268; LD-SEQ-SA-NEXT: beqz $a4, .LBB6_1 269; LD-SEQ-SA-NEXT: b .LBB6_4 270; LD-SEQ-SA-NEXT: .LBB6_3: 271; LD-SEQ-SA-NEXT: .LBB6_4: 272; LD-SEQ-SA-NEXT: ret 273; 274; LA64-LAMCAS-LABEL: cmpxchg_i32_acquire_monotonic: 275; LA64-LAMCAS: # %bb.0: 276; LA64-LAMCAS-NEXT: amcas_db.w $a1, $a2, $a0 277; LA64-LAMCAS-NEXT: ret 278 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire monotonic 279 ret void 280} 281 282define void @cmpxchg_i64_acquire_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind { 283; NO-LD-SEQ-SA-LABEL: cmpxchg_i64_acquire_monotonic: 284; NO-LD-SEQ-SA: # %bb.0: 285; NO-LD-SEQ-SA-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1 286; NO-LD-SEQ-SA-NEXT: ll.d $a3, $a0, 0 287; NO-LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB7_3 288; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB7_1 Depth=1 289; NO-LD-SEQ-SA-NEXT: move $a4, $a2 290; NO-LD-SEQ-SA-NEXT: sc.d $a4, $a0, 0 291; NO-LD-SEQ-SA-NEXT: beqz $a4, .LBB7_1 292; NO-LD-SEQ-SA-NEXT: b .LBB7_4 293; NO-LD-SEQ-SA-NEXT: .LBB7_3: 294; NO-LD-SEQ-SA-NEXT: dbar 1792 295; NO-LD-SEQ-SA-NEXT: .LBB7_4: 296; NO-LD-SEQ-SA-NEXT: ret 297; 298; LD-SEQ-SA-LABEL: cmpxchg_i64_acquire_monotonic: 299; LD-SEQ-SA: # %bb.0: 300; LD-SEQ-SA-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1 301; LD-SEQ-SA-NEXT: ll.d $a3, $a0, 0 302; LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB7_3 303; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB7_1 Depth=1 304; LD-SEQ-SA-NEXT: move $a4, $a2 305; LD-SEQ-SA-NEXT: sc.d $a4, $a0, 0 306; LD-SEQ-SA-NEXT: beqz $a4, .LBB7_1 307; LD-SEQ-SA-NEXT: b .LBB7_4 308; LD-SEQ-SA-NEXT: .LBB7_3: 309; LD-SEQ-SA-NEXT: .LBB7_4: 310; LD-SEQ-SA-NEXT: ret 311; 312; LA64-LAMCAS-LABEL: cmpxchg_i64_acquire_monotonic: 313; LA64-LAMCAS: # %bb.0: 314; LA64-LAMCAS-NEXT: amcas_db.d $a1, $a2, $a0 315; LA64-LAMCAS-NEXT: ret 316 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire monotonic 317 ret void 318} 319 320define i8 @cmpxchg_i8_acquire_acquire_reti8(ptr %ptr, i8 %cmp, i8 %val) nounwind { 321; LA64-LABEL: cmpxchg_i8_acquire_acquire_reti8: 322; LA64: # %bb.0: 323; LA64-NEXT: slli.d $a3, $a0, 3 324; LA64-NEXT: bstrins.d $a0, $zero, 1, 0 325; LA64-NEXT: ori $a4, $zero, 255 326; LA64-NEXT: sll.w $a4, $a4, $a3 327; LA64-NEXT: andi $a1, $a1, 255 328; LA64-NEXT: sll.w $a1, $a1, $a3 329; LA64-NEXT: andi $a2, $a2, 255 330; LA64-NEXT: sll.w $a2, $a2, $a3 331; LA64-NEXT: .LBB8_1: # =>This Inner Loop Header: Depth=1 332; LA64-NEXT: ll.w $a5, $a0, 0 333; LA64-NEXT: and $a6, $a5, $a4 334; LA64-NEXT: bne $a6, $a1, .LBB8_3 335; LA64-NEXT: # %bb.2: # in Loop: Header=BB8_1 Depth=1 336; LA64-NEXT: andn $a6, $a5, $a4 337; LA64-NEXT: or $a6, $a6, $a2 338; LA64-NEXT: sc.w $a6, $a0, 0 339; LA64-NEXT: beqz $a6, .LBB8_1 340; LA64-NEXT: b .LBB8_4 341; LA64-NEXT: .LBB8_3: 342; LA64-NEXT: dbar 20 343; LA64-NEXT: .LBB8_4: 344; LA64-NEXT: srl.w $a0, $a5, $a3 345; LA64-NEXT: ret 346; 347; LA64-LAMCAS-LABEL: cmpxchg_i8_acquire_acquire_reti8: 348; LA64-LAMCAS: # %bb.0: 349; LA64-LAMCAS-NEXT: amcas_db.b $a1, $a2, $a0 350; LA64-LAMCAS-NEXT: move $a0, $a1 351; LA64-LAMCAS-NEXT: ret 352 %tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire acquire 353 %res = extractvalue { i8, i1 } %tmp, 0 354 ret i8 %res 355} 356 357define i16 @cmpxchg_i16_acquire_acquire_reti16(ptr %ptr, i16 %cmp, i16 %val) nounwind { 358; LA64-LABEL: cmpxchg_i16_acquire_acquire_reti16: 359; LA64: # %bb.0: 360; LA64-NEXT: slli.d $a3, $a0, 3 361; LA64-NEXT: bstrins.d $a0, $zero, 1, 0 362; LA64-NEXT: lu12i.w $a4, 15 363; LA64-NEXT: ori $a4, $a4, 4095 364; LA64-NEXT: sll.w $a4, $a4, $a3 365; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0 366; LA64-NEXT: sll.w $a1, $a1, $a3 367; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0 368; LA64-NEXT: sll.w $a2, $a2, $a3 369; LA64-NEXT: .LBB9_1: # =>This Inner Loop Header: Depth=1 370; LA64-NEXT: ll.w $a5, $a0, 0 371; LA64-NEXT: and $a6, $a5, $a4 372; LA64-NEXT: bne $a6, $a1, .LBB9_3 373; LA64-NEXT: # %bb.2: # in Loop: Header=BB9_1 Depth=1 374; LA64-NEXT: andn $a6, $a5, $a4 375; LA64-NEXT: or $a6, $a6, $a2 376; LA64-NEXT: sc.w $a6, $a0, 0 377; LA64-NEXT: beqz $a6, .LBB9_1 378; LA64-NEXT: b .LBB9_4 379; LA64-NEXT: .LBB9_3: 380; LA64-NEXT: dbar 20 381; LA64-NEXT: .LBB9_4: 382; LA64-NEXT: srl.w $a0, $a5, $a3 383; LA64-NEXT: ret 384; 385; LA64-LAMCAS-LABEL: cmpxchg_i16_acquire_acquire_reti16: 386; LA64-LAMCAS: # %bb.0: 387; LA64-LAMCAS-NEXT: amcas_db.h $a1, $a2, $a0 388; LA64-LAMCAS-NEXT: move $a0, $a1 389; LA64-LAMCAS-NEXT: ret 390 %tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire acquire 391 %res = extractvalue { i16, i1 } %tmp, 0 392 ret i16 %res 393} 394 395define i32 @cmpxchg_i32_acquire_acquire_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind { 396; LA64-LABEL: cmpxchg_i32_acquire_acquire_reti32: 397; LA64: # %bb.0: 398; LA64-NEXT: addi.w $a3, $a1, 0 399; LA64-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1 400; LA64-NEXT: ll.w $a1, $a0, 0 401; LA64-NEXT: bne $a1, $a3, .LBB10_3 402; LA64-NEXT: # %bb.2: # in Loop: Header=BB10_1 Depth=1 403; LA64-NEXT: move $a4, $a2 404; LA64-NEXT: sc.w $a4, $a0, 0 405; LA64-NEXT: beqz $a4, .LBB10_1 406; LA64-NEXT: b .LBB10_4 407; LA64-NEXT: .LBB10_3: 408; LA64-NEXT: dbar 20 409; LA64-NEXT: .LBB10_4: 410; LA64-NEXT: move $a0, $a1 411; LA64-NEXT: ret 412; 413; LA64-LAMCAS-LABEL: cmpxchg_i32_acquire_acquire_reti32: 414; LA64-LAMCAS: # %bb.0: 415; LA64-LAMCAS-NEXT: amcas_db.w $a1, $a2, $a0 416; LA64-LAMCAS-NEXT: move $a0, $a1 417; LA64-LAMCAS-NEXT: ret 418 %tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire 419 %res = extractvalue { i32, i1 } %tmp, 0 420 ret i32 %res 421} 422 423define i64 @cmpxchg_i64_acquire_acquire_reti64(ptr %ptr, i64 %cmp, i64 %val) nounwind { 424; LA64-LABEL: cmpxchg_i64_acquire_acquire_reti64: 425; LA64: # %bb.0: 426; LA64-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 427; LA64-NEXT: ll.d $a3, $a0, 0 428; LA64-NEXT: bne $a3, $a1, .LBB11_3 429; LA64-NEXT: # %bb.2: # in Loop: Header=BB11_1 Depth=1 430; LA64-NEXT: move $a4, $a2 431; LA64-NEXT: sc.d $a4, $a0, 0 432; LA64-NEXT: beqz $a4, .LBB11_1 433; LA64-NEXT: b .LBB11_4 434; LA64-NEXT: .LBB11_3: 435; LA64-NEXT: dbar 20 436; LA64-NEXT: .LBB11_4: 437; LA64-NEXT: move $a0, $a3 438; LA64-NEXT: ret 439; 440; LA64-LAMCAS-LABEL: cmpxchg_i64_acquire_acquire_reti64: 441; LA64-LAMCAS: # %bb.0: 442; LA64-LAMCAS-NEXT: amcas_db.d $a1, $a2, $a0 443; LA64-LAMCAS-NEXT: move $a0, $a1 444; LA64-LAMCAS-NEXT: ret 445 %tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire acquire 446 %res = extractvalue { i64, i1 } %tmp, 0 447 ret i64 %res 448} 449 450define i1 @cmpxchg_i8_acquire_acquire_reti1(ptr %ptr, i8 %cmp, i8 %val) nounwind { 451; LA64-LABEL: cmpxchg_i8_acquire_acquire_reti1: 452; LA64: # %bb.0: 453; LA64-NEXT: slli.d $a3, $a0, 3 454; LA64-NEXT: bstrins.d $a0, $zero, 1, 0 455; LA64-NEXT: ori $a4, $zero, 255 456; LA64-NEXT: sll.w $a4, $a4, $a3 457; LA64-NEXT: andi $a1, $a1, 255 458; LA64-NEXT: sll.w $a1, $a1, $a3 459; LA64-NEXT: andi $a2, $a2, 255 460; LA64-NEXT: sll.w $a2, $a2, $a3 461; LA64-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1 462; LA64-NEXT: ll.w $a3, $a0, 0 463; LA64-NEXT: and $a5, $a3, $a4 464; LA64-NEXT: bne $a5, $a1, .LBB12_3 465; LA64-NEXT: # %bb.2: # in Loop: Header=BB12_1 Depth=1 466; LA64-NEXT: andn $a5, $a3, $a4 467; LA64-NEXT: or $a5, $a5, $a2 468; LA64-NEXT: sc.w $a5, $a0, 0 469; LA64-NEXT: beqz $a5, .LBB12_1 470; LA64-NEXT: b .LBB12_4 471; LA64-NEXT: .LBB12_3: 472; LA64-NEXT: dbar 20 473; LA64-NEXT: .LBB12_4: 474; LA64-NEXT: and $a0, $a3, $a4 475; LA64-NEXT: xor $a0, $a1, $a0 476; LA64-NEXT: sltui $a0, $a0, 1 477; LA64-NEXT: ret 478; 479; LA64-LAMCAS-LABEL: cmpxchg_i8_acquire_acquire_reti1: 480; LA64-LAMCAS: # %bb.0: 481; LA64-LAMCAS-NEXT: ext.w.b $a3, $a1 482; LA64-LAMCAS-NEXT: amcas_db.b $a1, $a2, $a0 483; LA64-LAMCAS-NEXT: xor $a0, $a1, $a3 484; LA64-LAMCAS-NEXT: sltui $a0, $a0, 1 485; LA64-LAMCAS-NEXT: ret 486 %tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire acquire 487 %res = extractvalue { i8, i1 } %tmp, 1 488 ret i1 %res 489} 490 491define i1 @cmpxchg_i16_acquire_acquire_reti1(ptr %ptr, i16 %cmp, i16 %val) nounwind { 492; LA64-LABEL: cmpxchg_i16_acquire_acquire_reti1: 493; LA64: # %bb.0: 494; LA64-NEXT: slli.d $a3, $a0, 3 495; LA64-NEXT: bstrins.d $a0, $zero, 1, 0 496; LA64-NEXT: lu12i.w $a4, 15 497; LA64-NEXT: ori $a4, $a4, 4095 498; LA64-NEXT: sll.w $a4, $a4, $a3 499; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0 500; LA64-NEXT: sll.w $a1, $a1, $a3 501; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0 502; LA64-NEXT: sll.w $a2, $a2, $a3 503; LA64-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1 504; LA64-NEXT: ll.w $a3, $a0, 0 505; LA64-NEXT: and $a5, $a3, $a4 506; LA64-NEXT: bne $a5, $a1, .LBB13_3 507; LA64-NEXT: # %bb.2: # in Loop: Header=BB13_1 Depth=1 508; LA64-NEXT: andn $a5, $a3, $a4 509; LA64-NEXT: or $a5, $a5, $a2 510; LA64-NEXT: sc.w $a5, $a0, 0 511; LA64-NEXT: beqz $a5, .LBB13_1 512; LA64-NEXT: b .LBB13_4 513; LA64-NEXT: .LBB13_3: 514; LA64-NEXT: dbar 20 515; LA64-NEXT: .LBB13_4: 516; LA64-NEXT: and $a0, $a3, $a4 517; LA64-NEXT: xor $a0, $a1, $a0 518; LA64-NEXT: sltui $a0, $a0, 1 519; LA64-NEXT: ret 520; 521; LA64-LAMCAS-LABEL: cmpxchg_i16_acquire_acquire_reti1: 522; LA64-LAMCAS: # %bb.0: 523; LA64-LAMCAS-NEXT: ext.w.h $a3, $a1 524; LA64-LAMCAS-NEXT: amcas_db.h $a1, $a2, $a0 525; LA64-LAMCAS-NEXT: xor $a0, $a1, $a3 526; LA64-LAMCAS-NEXT: sltui $a0, $a0, 1 527; LA64-LAMCAS-NEXT: ret 528 %tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire acquire 529 %res = extractvalue { i16, i1 } %tmp, 1 530 ret i1 %res 531} 532 533define i1 @cmpxchg_i32_acquire_acquire_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind { 534; LA64-LABEL: cmpxchg_i32_acquire_acquire_reti1: 535; LA64: # %bb.0: 536; LA64-NEXT: addi.w $a1, $a1, 0 537; LA64-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1 538; LA64-NEXT: ll.w $a3, $a0, 0 539; LA64-NEXT: bne $a3, $a1, .LBB14_3 540; LA64-NEXT: # %bb.2: # in Loop: Header=BB14_1 Depth=1 541; LA64-NEXT: move $a4, $a2 542; LA64-NEXT: sc.w $a4, $a0, 0 543; LA64-NEXT: beqz $a4, .LBB14_1 544; LA64-NEXT: b .LBB14_4 545; LA64-NEXT: .LBB14_3: 546; LA64-NEXT: dbar 20 547; LA64-NEXT: .LBB14_4: 548; LA64-NEXT: xor $a0, $a3, $a1 549; LA64-NEXT: sltui $a0, $a0, 1 550; LA64-NEXT: ret 551; 552; LA64-LAMCAS-LABEL: cmpxchg_i32_acquire_acquire_reti1: 553; LA64-LAMCAS: # %bb.0: 554; LA64-LAMCAS-NEXT: addi.w $a3, $a1, 0 555; LA64-LAMCAS-NEXT: amcas_db.w $a1, $a2, $a0 556; LA64-LAMCAS-NEXT: xor $a0, $a1, $a3 557; LA64-LAMCAS-NEXT: sltui $a0, $a0, 1 558; LA64-LAMCAS-NEXT: ret 559 %tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire 560 %res = extractvalue { i32, i1 } %tmp, 1 561 ret i1 %res 562} 563 564define i1 @cmpxchg_i64_acquire_acquire_reti1(ptr %ptr, i64 %cmp, i64 %val) nounwind { 565; LA64-LABEL: cmpxchg_i64_acquire_acquire_reti1: 566; LA64: # %bb.0: 567; LA64-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 568; LA64-NEXT: ll.d $a3, $a0, 0 569; LA64-NEXT: bne $a3, $a1, .LBB15_3 570; LA64-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 571; LA64-NEXT: move $a4, $a2 572; LA64-NEXT: sc.d $a4, $a0, 0 573; LA64-NEXT: beqz $a4, .LBB15_1 574; LA64-NEXT: b .LBB15_4 575; LA64-NEXT: .LBB15_3: 576; LA64-NEXT: dbar 20 577; LA64-NEXT: .LBB15_4: 578; LA64-NEXT: xor $a0, $a3, $a1 579; LA64-NEXT: sltui $a0, $a0, 1 580; LA64-NEXT: ret 581; 582; LA64-LAMCAS-LABEL: cmpxchg_i64_acquire_acquire_reti1: 583; LA64-LAMCAS: # %bb.0: 584; LA64-LAMCAS-NEXT: move $a3, $a1 585; LA64-LAMCAS-NEXT: amcas_db.d $a3, $a2, $a0 586; LA64-LAMCAS-NEXT: xor $a0, $a3, $a1 587; LA64-LAMCAS-NEXT: sltui $a0, $a0, 1 588; LA64-LAMCAS-NEXT: ret 589 %tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire acquire 590 %res = extractvalue { i64, i1 } %tmp, 1 591 ret i1 %res 592} 593 594define void @cmpxchg_i8_monotonic_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind { 595; NO-LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic: 596; NO-LD-SEQ-SA: # %bb.0: 597; NO-LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 598; NO-LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 599; NO-LD-SEQ-SA-NEXT: ori $a4, $zero, 255 600; NO-LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 601; NO-LD-SEQ-SA-NEXT: andi $a1, $a1, 255 602; NO-LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 603; NO-LD-SEQ-SA-NEXT: andi $a2, $a2, 255 604; NO-LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 605; NO-LD-SEQ-SA-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 606; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 607; NO-LD-SEQ-SA-NEXT: and $a5, $a3, $a4 608; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB16_3 609; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB16_1 Depth=1 610; NO-LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 611; NO-LD-SEQ-SA-NEXT: or $a5, $a5, $a2 612; NO-LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 613; NO-LD-SEQ-SA-NEXT: beqz $a5, .LBB16_1 614; NO-LD-SEQ-SA-NEXT: b .LBB16_4 615; NO-LD-SEQ-SA-NEXT: .LBB16_3: 616; NO-LD-SEQ-SA-NEXT: dbar 1792 617; NO-LD-SEQ-SA-NEXT: .LBB16_4: 618; NO-LD-SEQ-SA-NEXT: ret 619; 620; LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic: 621; LD-SEQ-SA: # %bb.0: 622; LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 623; LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 624; LD-SEQ-SA-NEXT: ori $a4, $zero, 255 625; LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 626; LD-SEQ-SA-NEXT: andi $a1, $a1, 255 627; LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 628; LD-SEQ-SA-NEXT: andi $a2, $a2, 255 629; LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 630; LD-SEQ-SA-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 631; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 632; LD-SEQ-SA-NEXT: and $a5, $a3, $a4 633; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB16_3 634; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB16_1 Depth=1 635; LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 636; LD-SEQ-SA-NEXT: or $a5, $a5, $a2 637; LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 638; LD-SEQ-SA-NEXT: beqz $a5, .LBB16_1 639; LD-SEQ-SA-NEXT: b .LBB16_4 640; LD-SEQ-SA-NEXT: .LBB16_3: 641; LD-SEQ-SA-NEXT: .LBB16_4: 642; LD-SEQ-SA-NEXT: ret 643; 644; LA64-LAMCAS-LABEL: cmpxchg_i8_monotonic_monotonic: 645; LA64-LAMCAS: # %bb.0: 646; LA64-LAMCAS-NEXT: amcas.b $a1, $a2, $a0 647; LA64-LAMCAS-NEXT: ret 648 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic 649 ret void 650} 651 652define void @cmpxchg_i16_monotonic_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind { 653; NO-LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic: 654; NO-LD-SEQ-SA: # %bb.0: 655; NO-LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 656; NO-LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 657; NO-LD-SEQ-SA-NEXT: lu12i.w $a4, 15 658; NO-LD-SEQ-SA-NEXT: ori $a4, $a4, 4095 659; NO-LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 660; NO-LD-SEQ-SA-NEXT: bstrpick.d $a1, $a1, 15, 0 661; NO-LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 662; NO-LD-SEQ-SA-NEXT: bstrpick.d $a2, $a2, 15, 0 663; NO-LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 664; NO-LD-SEQ-SA-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1 665; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 666; NO-LD-SEQ-SA-NEXT: and $a5, $a3, $a4 667; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB17_3 668; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB17_1 Depth=1 669; NO-LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 670; NO-LD-SEQ-SA-NEXT: or $a5, $a5, $a2 671; NO-LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 672; NO-LD-SEQ-SA-NEXT: beqz $a5, .LBB17_1 673; NO-LD-SEQ-SA-NEXT: b .LBB17_4 674; NO-LD-SEQ-SA-NEXT: .LBB17_3: 675; NO-LD-SEQ-SA-NEXT: dbar 1792 676; NO-LD-SEQ-SA-NEXT: .LBB17_4: 677; NO-LD-SEQ-SA-NEXT: ret 678; 679; LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic: 680; LD-SEQ-SA: # %bb.0: 681; LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 682; LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 683; LD-SEQ-SA-NEXT: lu12i.w $a4, 15 684; LD-SEQ-SA-NEXT: ori $a4, $a4, 4095 685; LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 686; LD-SEQ-SA-NEXT: bstrpick.d $a1, $a1, 15, 0 687; LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 688; LD-SEQ-SA-NEXT: bstrpick.d $a2, $a2, 15, 0 689; LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 690; LD-SEQ-SA-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1 691; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 692; LD-SEQ-SA-NEXT: and $a5, $a3, $a4 693; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB17_3 694; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB17_1 Depth=1 695; LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 696; LD-SEQ-SA-NEXT: or $a5, $a5, $a2 697; LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 698; LD-SEQ-SA-NEXT: beqz $a5, .LBB17_1 699; LD-SEQ-SA-NEXT: b .LBB17_4 700; LD-SEQ-SA-NEXT: .LBB17_3: 701; LD-SEQ-SA-NEXT: .LBB17_4: 702; LD-SEQ-SA-NEXT: ret 703; 704; LA64-LAMCAS-LABEL: cmpxchg_i16_monotonic_monotonic: 705; LA64-LAMCAS: # %bb.0: 706; LA64-LAMCAS-NEXT: amcas.h $a1, $a2, $a0 707; LA64-LAMCAS-NEXT: ret 708 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic 709 ret void 710} 711 712define void @cmpxchg_i32_monotonic_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind { 713; NO-LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic: 714; NO-LD-SEQ-SA: # %bb.0: 715; NO-LD-SEQ-SA-NEXT: addi.w $a1, $a1, 0 716; NO-LD-SEQ-SA-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 717; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 718; NO-LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB18_3 719; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB18_1 Depth=1 720; NO-LD-SEQ-SA-NEXT: move $a4, $a2 721; NO-LD-SEQ-SA-NEXT: sc.w $a4, $a0, 0 722; NO-LD-SEQ-SA-NEXT: beqz $a4, .LBB18_1 723; NO-LD-SEQ-SA-NEXT: b .LBB18_4 724; NO-LD-SEQ-SA-NEXT: .LBB18_3: 725; NO-LD-SEQ-SA-NEXT: dbar 1792 726; NO-LD-SEQ-SA-NEXT: .LBB18_4: 727; NO-LD-SEQ-SA-NEXT: ret 728; 729; LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic: 730; LD-SEQ-SA: # %bb.0: 731; LD-SEQ-SA-NEXT: addi.w $a1, $a1, 0 732; LD-SEQ-SA-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 733; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 734; LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB18_3 735; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB18_1 Depth=1 736; LD-SEQ-SA-NEXT: move $a4, $a2 737; LD-SEQ-SA-NEXT: sc.w $a4, $a0, 0 738; LD-SEQ-SA-NEXT: beqz $a4, .LBB18_1 739; LD-SEQ-SA-NEXT: b .LBB18_4 740; LD-SEQ-SA-NEXT: .LBB18_3: 741; LD-SEQ-SA-NEXT: .LBB18_4: 742; LD-SEQ-SA-NEXT: ret 743; 744; LA64-LAMCAS-LABEL: cmpxchg_i32_monotonic_monotonic: 745; LA64-LAMCAS: # %bb.0: 746; LA64-LAMCAS-NEXT: amcas.w $a1, $a2, $a0 747; LA64-LAMCAS-NEXT: ret 748 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic 749 ret void 750} 751 752define void @cmpxchg_i64_monotonic_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind { 753; NO-LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic: 754; NO-LD-SEQ-SA: # %bb.0: 755; NO-LD-SEQ-SA-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1 756; NO-LD-SEQ-SA-NEXT: ll.d $a3, $a0, 0 757; NO-LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB19_3 758; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB19_1 Depth=1 759; NO-LD-SEQ-SA-NEXT: move $a4, $a2 760; NO-LD-SEQ-SA-NEXT: sc.d $a4, $a0, 0 761; NO-LD-SEQ-SA-NEXT: beqz $a4, .LBB19_1 762; NO-LD-SEQ-SA-NEXT: b .LBB19_4 763; NO-LD-SEQ-SA-NEXT: .LBB19_3: 764; NO-LD-SEQ-SA-NEXT: dbar 1792 765; NO-LD-SEQ-SA-NEXT: .LBB19_4: 766; NO-LD-SEQ-SA-NEXT: ret 767; 768; LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic: 769; LD-SEQ-SA: # %bb.0: 770; LD-SEQ-SA-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1 771; LD-SEQ-SA-NEXT: ll.d $a3, $a0, 0 772; LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB19_3 773; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB19_1 Depth=1 774; LD-SEQ-SA-NEXT: move $a4, $a2 775; LD-SEQ-SA-NEXT: sc.d $a4, $a0, 0 776; LD-SEQ-SA-NEXT: beqz $a4, .LBB19_1 777; LD-SEQ-SA-NEXT: b .LBB19_4 778; LD-SEQ-SA-NEXT: .LBB19_3: 779; LD-SEQ-SA-NEXT: .LBB19_4: 780; LD-SEQ-SA-NEXT: ret 781; 782; LA64-LAMCAS-LABEL: cmpxchg_i64_monotonic_monotonic: 783; LA64-LAMCAS: # %bb.0: 784; LA64-LAMCAS-NEXT: amcas.d $a1, $a2, $a0 785; LA64-LAMCAS-NEXT: ret 786 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic 787 ret void 788} 789 790define i8 @cmpxchg_i8_monotonic_monotonic_reti8(ptr %ptr, i8 %cmp, i8 %val) nounwind { 791; NO-LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic_reti8: 792; NO-LD-SEQ-SA: # %bb.0: 793; NO-LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 794; NO-LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 795; NO-LD-SEQ-SA-NEXT: ori $a4, $zero, 255 796; NO-LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 797; NO-LD-SEQ-SA-NEXT: andi $a1, $a1, 255 798; NO-LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 799; NO-LD-SEQ-SA-NEXT: andi $a2, $a2, 255 800; NO-LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 801; NO-LD-SEQ-SA-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1 802; NO-LD-SEQ-SA-NEXT: ll.w $a5, $a0, 0 803; NO-LD-SEQ-SA-NEXT: and $a6, $a5, $a4 804; NO-LD-SEQ-SA-NEXT: bne $a6, $a1, .LBB20_3 805; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB20_1 Depth=1 806; NO-LD-SEQ-SA-NEXT: andn $a6, $a5, $a4 807; NO-LD-SEQ-SA-NEXT: or $a6, $a6, $a2 808; NO-LD-SEQ-SA-NEXT: sc.w $a6, $a0, 0 809; NO-LD-SEQ-SA-NEXT: beqz $a6, .LBB20_1 810; NO-LD-SEQ-SA-NEXT: b .LBB20_4 811; NO-LD-SEQ-SA-NEXT: .LBB20_3: 812; NO-LD-SEQ-SA-NEXT: dbar 1792 813; NO-LD-SEQ-SA-NEXT: .LBB20_4: 814; NO-LD-SEQ-SA-NEXT: srl.w $a0, $a5, $a3 815; NO-LD-SEQ-SA-NEXT: ret 816; 817; LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic_reti8: 818; LD-SEQ-SA: # %bb.0: 819; LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 820; LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 821; LD-SEQ-SA-NEXT: ori $a4, $zero, 255 822; LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 823; LD-SEQ-SA-NEXT: andi $a1, $a1, 255 824; LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 825; LD-SEQ-SA-NEXT: andi $a2, $a2, 255 826; LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 827; LD-SEQ-SA-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1 828; LD-SEQ-SA-NEXT: ll.w $a5, $a0, 0 829; LD-SEQ-SA-NEXT: and $a6, $a5, $a4 830; LD-SEQ-SA-NEXT: bne $a6, $a1, .LBB20_3 831; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB20_1 Depth=1 832; LD-SEQ-SA-NEXT: andn $a6, $a5, $a4 833; LD-SEQ-SA-NEXT: or $a6, $a6, $a2 834; LD-SEQ-SA-NEXT: sc.w $a6, $a0, 0 835; LD-SEQ-SA-NEXT: beqz $a6, .LBB20_1 836; LD-SEQ-SA-NEXT: b .LBB20_4 837; LD-SEQ-SA-NEXT: .LBB20_3: 838; LD-SEQ-SA-NEXT: .LBB20_4: 839; LD-SEQ-SA-NEXT: srl.w $a0, $a5, $a3 840; LD-SEQ-SA-NEXT: ret 841; 842; LA64-LAMCAS-LABEL: cmpxchg_i8_monotonic_monotonic_reti8: 843; LA64-LAMCAS: # %bb.0: 844; LA64-LAMCAS-NEXT: amcas.b $a1, $a2, $a0 845; LA64-LAMCAS-NEXT: move $a0, $a1 846; LA64-LAMCAS-NEXT: ret 847 %tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic 848 %res = extractvalue { i8, i1 } %tmp, 0 849 ret i8 %res 850} 851 852define i16 @cmpxchg_i16_monotonic_monotonic_reti16(ptr %ptr, i16 %cmp, i16 %val) nounwind { 853; NO-LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic_reti16: 854; NO-LD-SEQ-SA: # %bb.0: 855; NO-LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 856; NO-LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 857; NO-LD-SEQ-SA-NEXT: lu12i.w $a4, 15 858; NO-LD-SEQ-SA-NEXT: ori $a4, $a4, 4095 859; NO-LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 860; NO-LD-SEQ-SA-NEXT: bstrpick.d $a1, $a1, 15, 0 861; NO-LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 862; NO-LD-SEQ-SA-NEXT: bstrpick.d $a2, $a2, 15, 0 863; NO-LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 864; NO-LD-SEQ-SA-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 865; NO-LD-SEQ-SA-NEXT: ll.w $a5, $a0, 0 866; NO-LD-SEQ-SA-NEXT: and $a6, $a5, $a4 867; NO-LD-SEQ-SA-NEXT: bne $a6, $a1, .LBB21_3 868; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB21_1 Depth=1 869; NO-LD-SEQ-SA-NEXT: andn $a6, $a5, $a4 870; NO-LD-SEQ-SA-NEXT: or $a6, $a6, $a2 871; NO-LD-SEQ-SA-NEXT: sc.w $a6, $a0, 0 872; NO-LD-SEQ-SA-NEXT: beqz $a6, .LBB21_1 873; NO-LD-SEQ-SA-NEXT: b .LBB21_4 874; NO-LD-SEQ-SA-NEXT: .LBB21_3: 875; NO-LD-SEQ-SA-NEXT: dbar 1792 876; NO-LD-SEQ-SA-NEXT: .LBB21_4: 877; NO-LD-SEQ-SA-NEXT: srl.w $a0, $a5, $a3 878; NO-LD-SEQ-SA-NEXT: ret 879; 880; LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic_reti16: 881; LD-SEQ-SA: # %bb.0: 882; LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 883; LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 884; LD-SEQ-SA-NEXT: lu12i.w $a4, 15 885; LD-SEQ-SA-NEXT: ori $a4, $a4, 4095 886; LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 887; LD-SEQ-SA-NEXT: bstrpick.d $a1, $a1, 15, 0 888; LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 889; LD-SEQ-SA-NEXT: bstrpick.d $a2, $a2, 15, 0 890; LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 891; LD-SEQ-SA-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 892; LD-SEQ-SA-NEXT: ll.w $a5, $a0, 0 893; LD-SEQ-SA-NEXT: and $a6, $a5, $a4 894; LD-SEQ-SA-NEXT: bne $a6, $a1, .LBB21_3 895; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB21_1 Depth=1 896; LD-SEQ-SA-NEXT: andn $a6, $a5, $a4 897; LD-SEQ-SA-NEXT: or $a6, $a6, $a2 898; LD-SEQ-SA-NEXT: sc.w $a6, $a0, 0 899; LD-SEQ-SA-NEXT: beqz $a6, .LBB21_1 900; LD-SEQ-SA-NEXT: b .LBB21_4 901; LD-SEQ-SA-NEXT: .LBB21_3: 902; LD-SEQ-SA-NEXT: .LBB21_4: 903; LD-SEQ-SA-NEXT: srl.w $a0, $a5, $a3 904; LD-SEQ-SA-NEXT: ret 905; 906; LA64-LAMCAS-LABEL: cmpxchg_i16_monotonic_monotonic_reti16: 907; LA64-LAMCAS: # %bb.0: 908; LA64-LAMCAS-NEXT: amcas.h $a1, $a2, $a0 909; LA64-LAMCAS-NEXT: move $a0, $a1 910; LA64-LAMCAS-NEXT: ret 911 %tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic 912 %res = extractvalue { i16, i1 } %tmp, 0 913 ret i16 %res 914} 915 916define i32 @cmpxchg_i32_monotonic_monotonic_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind { 917; NO-LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic_reti32: 918; NO-LD-SEQ-SA: # %bb.0: 919; NO-LD-SEQ-SA-NEXT: addi.w $a3, $a1, 0 920; NO-LD-SEQ-SA-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 921; NO-LD-SEQ-SA-NEXT: ll.w $a1, $a0, 0 922; NO-LD-SEQ-SA-NEXT: bne $a1, $a3, .LBB22_3 923; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1 924; NO-LD-SEQ-SA-NEXT: move $a4, $a2 925; NO-LD-SEQ-SA-NEXT: sc.w $a4, $a0, 0 926; NO-LD-SEQ-SA-NEXT: beqz $a4, .LBB22_1 927; NO-LD-SEQ-SA-NEXT: b .LBB22_4 928; NO-LD-SEQ-SA-NEXT: .LBB22_3: 929; NO-LD-SEQ-SA-NEXT: dbar 1792 930; NO-LD-SEQ-SA-NEXT: .LBB22_4: 931; NO-LD-SEQ-SA-NEXT: move $a0, $a1 932; NO-LD-SEQ-SA-NEXT: ret 933; 934; LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic_reti32: 935; LD-SEQ-SA: # %bb.0: 936; LD-SEQ-SA-NEXT: addi.w $a3, $a1, 0 937; LD-SEQ-SA-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 938; LD-SEQ-SA-NEXT: ll.w $a1, $a0, 0 939; LD-SEQ-SA-NEXT: bne $a1, $a3, .LBB22_3 940; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1 941; LD-SEQ-SA-NEXT: move $a4, $a2 942; LD-SEQ-SA-NEXT: sc.w $a4, $a0, 0 943; LD-SEQ-SA-NEXT: beqz $a4, .LBB22_1 944; LD-SEQ-SA-NEXT: b .LBB22_4 945; LD-SEQ-SA-NEXT: .LBB22_3: 946; LD-SEQ-SA-NEXT: .LBB22_4: 947; LD-SEQ-SA-NEXT: move $a0, $a1 948; LD-SEQ-SA-NEXT: ret 949; 950; LA64-LAMCAS-LABEL: cmpxchg_i32_monotonic_monotonic_reti32: 951; LA64-LAMCAS: # %bb.0: 952; LA64-LAMCAS-NEXT: amcas.w $a1, $a2, $a0 953; LA64-LAMCAS-NEXT: move $a0, $a1 954; LA64-LAMCAS-NEXT: ret 955 %tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic 956 %res = extractvalue { i32, i1 } %tmp, 0 957 ret i32 %res 958} 959 960define i64 @cmpxchg_i64_monotonic_monotonic_reti64(ptr %ptr, i64 %cmp, i64 %val) nounwind { 961; NO-LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic_reti64: 962; NO-LD-SEQ-SA: # %bb.0: 963; NO-LD-SEQ-SA-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 964; NO-LD-SEQ-SA-NEXT: ll.d $a3, $a0, 0 965; NO-LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB23_3 966; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB23_1 Depth=1 967; NO-LD-SEQ-SA-NEXT: move $a4, $a2 968; NO-LD-SEQ-SA-NEXT: sc.d $a4, $a0, 0 969; NO-LD-SEQ-SA-NEXT: beqz $a4, .LBB23_1 970; NO-LD-SEQ-SA-NEXT: b .LBB23_4 971; NO-LD-SEQ-SA-NEXT: .LBB23_3: 972; NO-LD-SEQ-SA-NEXT: dbar 1792 973; NO-LD-SEQ-SA-NEXT: .LBB23_4: 974; NO-LD-SEQ-SA-NEXT: move $a0, $a3 975; NO-LD-SEQ-SA-NEXT: ret 976; 977; LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic_reti64: 978; LD-SEQ-SA: # %bb.0: 979; LD-SEQ-SA-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 980; LD-SEQ-SA-NEXT: ll.d $a3, $a0, 0 981; LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB23_3 982; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB23_1 Depth=1 983; LD-SEQ-SA-NEXT: move $a4, $a2 984; LD-SEQ-SA-NEXT: sc.d $a4, $a0, 0 985; LD-SEQ-SA-NEXT: beqz $a4, .LBB23_1 986; LD-SEQ-SA-NEXT: b .LBB23_4 987; LD-SEQ-SA-NEXT: .LBB23_3: 988; LD-SEQ-SA-NEXT: .LBB23_4: 989; LD-SEQ-SA-NEXT: move $a0, $a3 990; LD-SEQ-SA-NEXT: ret 991; 992; LA64-LAMCAS-LABEL: cmpxchg_i64_monotonic_monotonic_reti64: 993; LA64-LAMCAS: # %bb.0: 994; LA64-LAMCAS-NEXT: amcas.d $a1, $a2, $a0 995; LA64-LAMCAS-NEXT: move $a0, $a1 996; LA64-LAMCAS-NEXT: ret 997 %tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic 998 %res = extractvalue { i64, i1 } %tmp, 0 999 ret i64 %res 1000} 1001 1002define i1 @cmpxchg_i8_monotonic_monotonic_reti1(ptr %ptr, i8 %cmp, i8 %val) nounwind { 1003; NO-LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic_reti1: 1004; NO-LD-SEQ-SA: # %bb.0: 1005; NO-LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 1006; NO-LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 1007; NO-LD-SEQ-SA-NEXT: ori $a4, $zero, 255 1008; NO-LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 1009; NO-LD-SEQ-SA-NEXT: andi $a1, $a1, 255 1010; NO-LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 1011; NO-LD-SEQ-SA-NEXT: andi $a2, $a2, 255 1012; NO-LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 1013; NO-LD-SEQ-SA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 1014; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 1015; NO-LD-SEQ-SA-NEXT: and $a5, $a3, $a4 1016; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB24_3 1017; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB24_1 Depth=1 1018; NO-LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 1019; NO-LD-SEQ-SA-NEXT: or $a5, $a5, $a2 1020; NO-LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 1021; NO-LD-SEQ-SA-NEXT: beqz $a5, .LBB24_1 1022; NO-LD-SEQ-SA-NEXT: b .LBB24_4 1023; NO-LD-SEQ-SA-NEXT: .LBB24_3: 1024; NO-LD-SEQ-SA-NEXT: dbar 1792 1025; NO-LD-SEQ-SA-NEXT: .LBB24_4: 1026; NO-LD-SEQ-SA-NEXT: and $a0, $a3, $a4 1027; NO-LD-SEQ-SA-NEXT: xor $a0, $a1, $a0 1028; NO-LD-SEQ-SA-NEXT: sltui $a0, $a0, 1 1029; NO-LD-SEQ-SA-NEXT: ret 1030; 1031; LD-SEQ-SA-LABEL: cmpxchg_i8_monotonic_monotonic_reti1: 1032; LD-SEQ-SA: # %bb.0: 1033; LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 1034; LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 1035; LD-SEQ-SA-NEXT: ori $a4, $zero, 255 1036; LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 1037; LD-SEQ-SA-NEXT: andi $a1, $a1, 255 1038; LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 1039; LD-SEQ-SA-NEXT: andi $a2, $a2, 255 1040; LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 1041; LD-SEQ-SA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 1042; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 1043; LD-SEQ-SA-NEXT: and $a5, $a3, $a4 1044; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB24_3 1045; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB24_1 Depth=1 1046; LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 1047; LD-SEQ-SA-NEXT: or $a5, $a5, $a2 1048; LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 1049; LD-SEQ-SA-NEXT: beqz $a5, .LBB24_1 1050; LD-SEQ-SA-NEXT: b .LBB24_4 1051; LD-SEQ-SA-NEXT: .LBB24_3: 1052; LD-SEQ-SA-NEXT: .LBB24_4: 1053; LD-SEQ-SA-NEXT: and $a0, $a3, $a4 1054; LD-SEQ-SA-NEXT: xor $a0, $a1, $a0 1055; LD-SEQ-SA-NEXT: sltui $a0, $a0, 1 1056; LD-SEQ-SA-NEXT: ret 1057; 1058; LA64-LAMCAS-LABEL: cmpxchg_i8_monotonic_monotonic_reti1: 1059; LA64-LAMCAS: # %bb.0: 1060; LA64-LAMCAS-NEXT: ext.w.b $a3, $a1 1061; LA64-LAMCAS-NEXT: amcas.b $a1, $a2, $a0 1062; LA64-LAMCAS-NEXT: xor $a0, $a1, $a3 1063; LA64-LAMCAS-NEXT: sltui $a0, $a0, 1 1064; LA64-LAMCAS-NEXT: ret 1065 %tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic 1066 %res = extractvalue { i8, i1 } %tmp, 1 1067 ret i1 %res 1068} 1069 1070define i1 @cmpxchg_i16_monotonic_monotonic_reti1(ptr %ptr, i16 %cmp, i16 %val) nounwind { 1071; NO-LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic_reti1: 1072; NO-LD-SEQ-SA: # %bb.0: 1073; NO-LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 1074; NO-LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 1075; NO-LD-SEQ-SA-NEXT: lu12i.w $a4, 15 1076; NO-LD-SEQ-SA-NEXT: ori $a4, $a4, 4095 1077; NO-LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 1078; NO-LD-SEQ-SA-NEXT: bstrpick.d $a1, $a1, 15, 0 1079; NO-LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 1080; NO-LD-SEQ-SA-NEXT: bstrpick.d $a2, $a2, 15, 0 1081; NO-LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 1082; NO-LD-SEQ-SA-NEXT: .LBB25_1: # =>This Inner Loop Header: Depth=1 1083; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 1084; NO-LD-SEQ-SA-NEXT: and $a5, $a3, $a4 1085; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB25_3 1086; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB25_1 Depth=1 1087; NO-LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 1088; NO-LD-SEQ-SA-NEXT: or $a5, $a5, $a2 1089; NO-LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 1090; NO-LD-SEQ-SA-NEXT: beqz $a5, .LBB25_1 1091; NO-LD-SEQ-SA-NEXT: b .LBB25_4 1092; NO-LD-SEQ-SA-NEXT: .LBB25_3: 1093; NO-LD-SEQ-SA-NEXT: dbar 1792 1094; NO-LD-SEQ-SA-NEXT: .LBB25_4: 1095; NO-LD-SEQ-SA-NEXT: and $a0, $a3, $a4 1096; NO-LD-SEQ-SA-NEXT: xor $a0, $a1, $a0 1097; NO-LD-SEQ-SA-NEXT: sltui $a0, $a0, 1 1098; NO-LD-SEQ-SA-NEXT: ret 1099; 1100; LD-SEQ-SA-LABEL: cmpxchg_i16_monotonic_monotonic_reti1: 1101; LD-SEQ-SA: # %bb.0: 1102; LD-SEQ-SA-NEXT: slli.d $a3, $a0, 3 1103; LD-SEQ-SA-NEXT: bstrins.d $a0, $zero, 1, 0 1104; LD-SEQ-SA-NEXT: lu12i.w $a4, 15 1105; LD-SEQ-SA-NEXT: ori $a4, $a4, 4095 1106; LD-SEQ-SA-NEXT: sll.w $a4, $a4, $a3 1107; LD-SEQ-SA-NEXT: bstrpick.d $a1, $a1, 15, 0 1108; LD-SEQ-SA-NEXT: sll.w $a1, $a1, $a3 1109; LD-SEQ-SA-NEXT: bstrpick.d $a2, $a2, 15, 0 1110; LD-SEQ-SA-NEXT: sll.w $a2, $a2, $a3 1111; LD-SEQ-SA-NEXT: .LBB25_1: # =>This Inner Loop Header: Depth=1 1112; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 1113; LD-SEQ-SA-NEXT: and $a5, $a3, $a4 1114; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB25_3 1115; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB25_1 Depth=1 1116; LD-SEQ-SA-NEXT: andn $a5, $a3, $a4 1117; LD-SEQ-SA-NEXT: or $a5, $a5, $a2 1118; LD-SEQ-SA-NEXT: sc.w $a5, $a0, 0 1119; LD-SEQ-SA-NEXT: beqz $a5, .LBB25_1 1120; LD-SEQ-SA-NEXT: b .LBB25_4 1121; LD-SEQ-SA-NEXT: .LBB25_3: 1122; LD-SEQ-SA-NEXT: .LBB25_4: 1123; LD-SEQ-SA-NEXT: and $a0, $a3, $a4 1124; LD-SEQ-SA-NEXT: xor $a0, $a1, $a0 1125; LD-SEQ-SA-NEXT: sltui $a0, $a0, 1 1126; LD-SEQ-SA-NEXT: ret 1127; 1128; LA64-LAMCAS-LABEL: cmpxchg_i16_monotonic_monotonic_reti1: 1129; LA64-LAMCAS: # %bb.0: 1130; LA64-LAMCAS-NEXT: ext.w.h $a3, $a1 1131; LA64-LAMCAS-NEXT: amcas.h $a1, $a2, $a0 1132; LA64-LAMCAS-NEXT: xor $a0, $a1, $a3 1133; LA64-LAMCAS-NEXT: sltui $a0, $a0, 1 1134; LA64-LAMCAS-NEXT: ret 1135 %tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic 1136 %res = extractvalue { i16, i1 } %tmp, 1 1137 ret i1 %res 1138} 1139 1140define i1 @cmpxchg_i32_monotonic_monotonic_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind { 1141; NO-LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic_reti1: 1142; NO-LD-SEQ-SA: # %bb.0: 1143; NO-LD-SEQ-SA-NEXT: addi.w $a1, $a1, 0 1144; NO-LD-SEQ-SA-NEXT: .LBB26_1: # =>This Inner Loop Header: Depth=1 1145; NO-LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 1146; NO-LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB26_3 1147; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB26_1 Depth=1 1148; NO-LD-SEQ-SA-NEXT: move $a4, $a2 1149; NO-LD-SEQ-SA-NEXT: sc.w $a4, $a0, 0 1150; NO-LD-SEQ-SA-NEXT: beqz $a4, .LBB26_1 1151; NO-LD-SEQ-SA-NEXT: b .LBB26_4 1152; NO-LD-SEQ-SA-NEXT: .LBB26_3: 1153; NO-LD-SEQ-SA-NEXT: dbar 1792 1154; NO-LD-SEQ-SA-NEXT: .LBB26_4: 1155; NO-LD-SEQ-SA-NEXT: xor $a0, $a3, $a1 1156; NO-LD-SEQ-SA-NEXT: sltui $a0, $a0, 1 1157; NO-LD-SEQ-SA-NEXT: ret 1158; 1159; LD-SEQ-SA-LABEL: cmpxchg_i32_monotonic_monotonic_reti1: 1160; LD-SEQ-SA: # %bb.0: 1161; LD-SEQ-SA-NEXT: addi.w $a1, $a1, 0 1162; LD-SEQ-SA-NEXT: .LBB26_1: # =>This Inner Loop Header: Depth=1 1163; LD-SEQ-SA-NEXT: ll.w $a3, $a0, 0 1164; LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB26_3 1165; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB26_1 Depth=1 1166; LD-SEQ-SA-NEXT: move $a4, $a2 1167; LD-SEQ-SA-NEXT: sc.w $a4, $a0, 0 1168; LD-SEQ-SA-NEXT: beqz $a4, .LBB26_1 1169; LD-SEQ-SA-NEXT: b .LBB26_4 1170; LD-SEQ-SA-NEXT: .LBB26_3: 1171; LD-SEQ-SA-NEXT: .LBB26_4: 1172; LD-SEQ-SA-NEXT: xor $a0, $a3, $a1 1173; LD-SEQ-SA-NEXT: sltui $a0, $a0, 1 1174; LD-SEQ-SA-NEXT: ret 1175; 1176; LA64-LAMCAS-LABEL: cmpxchg_i32_monotonic_monotonic_reti1: 1177; LA64-LAMCAS: # %bb.0: 1178; LA64-LAMCAS-NEXT: addi.w $a3, $a1, 0 1179; LA64-LAMCAS-NEXT: amcas.w $a1, $a2, $a0 1180; LA64-LAMCAS-NEXT: xor $a0, $a1, $a3 1181; LA64-LAMCAS-NEXT: sltui $a0, $a0, 1 1182; LA64-LAMCAS-NEXT: ret 1183 %tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic 1184 %res = extractvalue { i32, i1 } %tmp, 1 1185 ret i1 %res 1186} 1187 1188define i1 @cmpxchg_i64_monotonic_monotonic_reti1(ptr %ptr, i64 %cmp, i64 %val) nounwind { 1189; NO-LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic_reti1: 1190; NO-LD-SEQ-SA: # %bb.0: 1191; NO-LD-SEQ-SA-NEXT: .LBB27_1: # =>This Inner Loop Header: Depth=1 1192; NO-LD-SEQ-SA-NEXT: ll.d $a3, $a0, 0 1193; NO-LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB27_3 1194; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB27_1 Depth=1 1195; NO-LD-SEQ-SA-NEXT: move $a4, $a2 1196; NO-LD-SEQ-SA-NEXT: sc.d $a4, $a0, 0 1197; NO-LD-SEQ-SA-NEXT: beqz $a4, .LBB27_1 1198; NO-LD-SEQ-SA-NEXT: b .LBB27_4 1199; NO-LD-SEQ-SA-NEXT: .LBB27_3: 1200; NO-LD-SEQ-SA-NEXT: dbar 1792 1201; NO-LD-SEQ-SA-NEXT: .LBB27_4: 1202; NO-LD-SEQ-SA-NEXT: xor $a0, $a3, $a1 1203; NO-LD-SEQ-SA-NEXT: sltui $a0, $a0, 1 1204; NO-LD-SEQ-SA-NEXT: ret 1205; 1206; LD-SEQ-SA-LABEL: cmpxchg_i64_monotonic_monotonic_reti1: 1207; LD-SEQ-SA: # %bb.0: 1208; LD-SEQ-SA-NEXT: .LBB27_1: # =>This Inner Loop Header: Depth=1 1209; LD-SEQ-SA-NEXT: ll.d $a3, $a0, 0 1210; LD-SEQ-SA-NEXT: bne $a3, $a1, .LBB27_3 1211; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB27_1 Depth=1 1212; LD-SEQ-SA-NEXT: move $a4, $a2 1213; LD-SEQ-SA-NEXT: sc.d $a4, $a0, 0 1214; LD-SEQ-SA-NEXT: beqz $a4, .LBB27_1 1215; LD-SEQ-SA-NEXT: b .LBB27_4 1216; LD-SEQ-SA-NEXT: .LBB27_3: 1217; LD-SEQ-SA-NEXT: .LBB27_4: 1218; LD-SEQ-SA-NEXT: xor $a0, $a3, $a1 1219; LD-SEQ-SA-NEXT: sltui $a0, $a0, 1 1220; LD-SEQ-SA-NEXT: ret 1221; 1222; LA64-LAMCAS-LABEL: cmpxchg_i64_monotonic_monotonic_reti1: 1223; LA64-LAMCAS: # %bb.0: 1224; LA64-LAMCAS-NEXT: move $a3, $a1 1225; LA64-LAMCAS-NEXT: amcas.d $a3, $a2, $a0 1226; LA64-LAMCAS-NEXT: xor $a0, $a3, $a1 1227; LA64-LAMCAS-NEXT: sltui $a0, $a0, 1 1228; LA64-LAMCAS-NEXT: ret 1229 %tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic 1230 %res = extractvalue { i64, i1 } %tmp, 1 1231 ret i1 %res 1232} 1233