1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips4 -relocation-model=pic -verify-machineinstrs < %s | \ 3; RUN: FileCheck %s -check-prefix=MIPS4 4; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \ 5; RUN: FileCheck %s -check-prefix=MIPS64 6; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r2 -relocation-model=pic -verify-machineinstrs < %s | \ 7; RUN: FileCheck %s -check-prefix=MIPS64R2 8; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs < %s | \ 9; RUN: FileCheck %s -check-prefix=MIPS64R6 10; RUN: llc -mtriple=mips64-unknown-linux-gnu -O0 -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs -verify-machineinstrs < %s | \ 11; RUN: FileCheck %s -check-prefix=MIPS64R6O0 12 13; We want to verify the produced code is well formed all optimization levels, the rest of the test which ensure correctness. 14; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O1 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O1 15; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O2 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O2 16; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O3 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O3 17 18; Keep one big-endian check so that we don't reduce testing, but don't add more 19; since endianness doesn't affect the body of the atomic operations. 20; RUN: llc -mtriple=mips64-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \ 21; RUN: FileCheck %s -check-prefix=MIPS64EB 22 23@x = common global i64 0, align 4 24 25define i64 @AtomicLoadAdd(i64 signext %incr) nounwind { 26; MIPS4-LABEL: AtomicLoadAdd: 27; MIPS4: # %bb.0: # %entry 28; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 29; MIPS4-NEXT: daddu $1, $1, $25 30; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 31; MIPS4-NEXT: ld $1, %got_disp(x)($1) 32; MIPS4-NEXT: .LBB0_1: # %entry 33; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 34; MIPS4-NEXT: lld $2, 0($1) 35; MIPS4-NEXT: daddu $3, $2, $4 36; MIPS4-NEXT: scd $3, 0($1) 37; MIPS4-NEXT: beqz $3, .LBB0_1 38; MIPS4-NEXT: nop 39; MIPS4-NEXT: # %bb.2: # %entry 40; MIPS4-NEXT: jr $ra 41; MIPS4-NEXT: nop 42; 43; MIPS64-LABEL: AtomicLoadAdd: 44; MIPS64: # %bb.0: # %entry 45; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 46; MIPS64-NEXT: daddu $1, $1, $25 47; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 48; MIPS64-NEXT: ld $1, %got_disp(x)($1) 49; MIPS64-NEXT: .LBB0_1: # %entry 50; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 51; MIPS64-NEXT: lld $2, 0($1) 52; MIPS64-NEXT: daddu $3, $2, $4 53; MIPS64-NEXT: scd $3, 0($1) 54; MIPS64-NEXT: beqz $3, .LBB0_1 55; MIPS64-NEXT: nop 56; MIPS64-NEXT: # %bb.2: # %entry 57; MIPS64-NEXT: jr $ra 58; MIPS64-NEXT: nop 59; 60; MIPS64R2-LABEL: AtomicLoadAdd: 61; MIPS64R2: # %bb.0: # %entry 62; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 63; MIPS64R2-NEXT: daddu $1, $1, $25 64; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 65; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 66; MIPS64R2-NEXT: .LBB0_1: # %entry 67; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 68; MIPS64R2-NEXT: lld $2, 0($1) 69; MIPS64R2-NEXT: daddu $3, $2, $4 70; MIPS64R2-NEXT: scd $3, 0($1) 71; MIPS64R2-NEXT: beqz $3, .LBB0_1 72; MIPS64R2-NEXT: nop 73; MIPS64R2-NEXT: # %bb.2: # %entry 74; MIPS64R2-NEXT: jr $ra 75; MIPS64R2-NEXT: nop 76; 77; MIPS64R6-LABEL: AtomicLoadAdd: 78; MIPS64R6: # %bb.0: # %entry 79; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 80; MIPS64R6-NEXT: daddu $1, $1, $25 81; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 82; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 83; MIPS64R6-NEXT: .LBB0_1: # %entry 84; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 85; MIPS64R6-NEXT: lld $2, 0($1) 86; MIPS64R6-NEXT: daddu $3, $2, $4 87; MIPS64R6-NEXT: scd $3, 0($1) 88; MIPS64R6-NEXT: beqzc $3, .LBB0_1 89; MIPS64R6-NEXT: nop 90; MIPS64R6-NEXT: # %bb.2: # %entry 91; MIPS64R6-NEXT: jrc $ra 92; 93; MIPS64R6O0-LABEL: AtomicLoadAdd: 94; MIPS64R6O0: # %bb.0: # %entry 95; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 96; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 97; MIPS64R6O0-NEXT: daddu $1, $1, $25 98; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 99; MIPS64R6O0-NEXT: move $2, $4 100; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 101; MIPS64R6O0-NEXT: .LBB0_1: # %entry 102; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 103; MIPS64R6O0-NEXT: lld $3, 0($1) 104; MIPS64R6O0-NEXT: daddu $5, $3, $4 105; MIPS64R6O0-NEXT: scd $5, 0($1) 106; MIPS64R6O0-NEXT: beqzc $5, .LBB0_1 107; MIPS64R6O0-NEXT: # %bb.2: # %entry 108; MIPS64R6O0-NEXT: sd $2, 8($sp) # 8-byte Folded Spill 109; MIPS64R6O0-NEXT: move $2, $3 110; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 111; MIPS64R6O0-NEXT: jrc $ra 112; 113; O1-LABEL: AtomicLoadAdd: 114; O1: # %bb.0: # %entry 115; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 116; O1-NEXT: daddu $1, $1, $25 117; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 118; O1-NEXT: ld $1, %got_disp(x)($1) 119; O1-NEXT: .LBB0_1: # %entry 120; O1-NEXT: # =>This Inner Loop Header: Depth=1 121; O1-NEXT: lld $2, 0($1) 122; O1-NEXT: daddu $3, $2, $4 123; O1-NEXT: scd $3, 0($1) 124; O1-NEXT: beqz $3, .LBB0_1 125; O1-NEXT: nop 126; O1-NEXT: # %bb.2: # %entry 127; O1-NEXT: jr $ra 128; O1-NEXT: nop 129; 130; O2-LABEL: AtomicLoadAdd: 131; O2: # %bb.0: # %entry 132; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 133; O2-NEXT: daddu $1, $1, $25 134; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 135; O2-NEXT: ld $1, %got_disp(x)($1) 136; O2-NEXT: .LBB0_1: # %entry 137; O2-NEXT: # =>This Inner Loop Header: Depth=1 138; O2-NEXT: lld $2, 0($1) 139; O2-NEXT: daddu $3, $2, $4 140; O2-NEXT: scd $3, 0($1) 141; O2-NEXT: beqz $3, .LBB0_1 142; O2-NEXT: nop 143; O2-NEXT: # %bb.2: # %entry 144; O2-NEXT: jr $ra 145; O2-NEXT: nop 146; 147; O3-LABEL: AtomicLoadAdd: 148; O3: # %bb.0: # %entry 149; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 150; O3-NEXT: daddu $1, $1, $25 151; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 152; O3-NEXT: ld $1, %got_disp(x)($1) 153; O3-NEXT: .LBB0_1: # %entry 154; O3-NEXT: # =>This Inner Loop Header: Depth=1 155; O3-NEXT: lld $2, 0($1) 156; O3-NEXT: daddu $3, $2, $4 157; O3-NEXT: scd $3, 0($1) 158; O3-NEXT: beqz $3, .LBB0_1 159; O3-NEXT: nop 160; O3-NEXT: # %bb.2: # %entry 161; O3-NEXT: jr $ra 162; O3-NEXT: nop 163; 164; MIPS64EB-LABEL: AtomicLoadAdd: 165; MIPS64EB: # %bb.0: # %entry 166; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 167; MIPS64EB-NEXT: daddu $1, $1, $25 168; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 169; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 170; MIPS64EB-NEXT: .LBB0_1: # %entry 171; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 172; MIPS64EB-NEXT: lld $2, 0($1) 173; MIPS64EB-NEXT: daddu $3, $2, $4 174; MIPS64EB-NEXT: scd $3, 0($1) 175; MIPS64EB-NEXT: beqz $3, .LBB0_1 176; MIPS64EB-NEXT: nop 177; MIPS64EB-NEXT: # %bb.2: # %entry 178; MIPS64EB-NEXT: jr $ra 179; MIPS64EB-NEXT: nop 180entry: 181 %0 = atomicrmw add i64* @x, i64 %incr monotonic 182 ret i64 %0 183 184} 185 186define i64 @AtomicLoadSub(i64 signext %incr) nounwind { 187; MIPS4-LABEL: AtomicLoadSub: 188; MIPS4: # %bb.0: # %entry 189; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 190; MIPS4-NEXT: daddu $1, $1, $25 191; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 192; MIPS4-NEXT: ld $1, %got_disp(x)($1) 193; MIPS4-NEXT: .LBB1_1: # %entry 194; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 195; MIPS4-NEXT: lld $2, 0($1) 196; MIPS4-NEXT: dsubu $3, $2, $4 197; MIPS4-NEXT: scd $3, 0($1) 198; MIPS4-NEXT: beqz $3, .LBB1_1 199; MIPS4-NEXT: nop 200; MIPS4-NEXT: # %bb.2: # %entry 201; MIPS4-NEXT: jr $ra 202; MIPS4-NEXT: nop 203; 204; MIPS64-LABEL: AtomicLoadSub: 205; MIPS64: # %bb.0: # %entry 206; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 207; MIPS64-NEXT: daddu $1, $1, $25 208; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 209; MIPS64-NEXT: ld $1, %got_disp(x)($1) 210; MIPS64-NEXT: .LBB1_1: # %entry 211; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 212; MIPS64-NEXT: lld $2, 0($1) 213; MIPS64-NEXT: dsubu $3, $2, $4 214; MIPS64-NEXT: scd $3, 0($1) 215; MIPS64-NEXT: beqz $3, .LBB1_1 216; MIPS64-NEXT: nop 217; MIPS64-NEXT: # %bb.2: # %entry 218; MIPS64-NEXT: jr $ra 219; MIPS64-NEXT: nop 220; 221; MIPS64R2-LABEL: AtomicLoadSub: 222; MIPS64R2: # %bb.0: # %entry 223; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 224; MIPS64R2-NEXT: daddu $1, $1, $25 225; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 226; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 227; MIPS64R2-NEXT: .LBB1_1: # %entry 228; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 229; MIPS64R2-NEXT: lld $2, 0($1) 230; MIPS64R2-NEXT: dsubu $3, $2, $4 231; MIPS64R2-NEXT: scd $3, 0($1) 232; MIPS64R2-NEXT: beqz $3, .LBB1_1 233; MIPS64R2-NEXT: nop 234; MIPS64R2-NEXT: # %bb.2: # %entry 235; MIPS64R2-NEXT: jr $ra 236; MIPS64R2-NEXT: nop 237; 238; MIPS64R6-LABEL: AtomicLoadSub: 239; MIPS64R6: # %bb.0: # %entry 240; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 241; MIPS64R6-NEXT: daddu $1, $1, $25 242; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 243; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 244; MIPS64R6-NEXT: .LBB1_1: # %entry 245; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 246; MIPS64R6-NEXT: lld $2, 0($1) 247; MIPS64R6-NEXT: dsubu $3, $2, $4 248; MIPS64R6-NEXT: scd $3, 0($1) 249; MIPS64R6-NEXT: beqzc $3, .LBB1_1 250; MIPS64R6-NEXT: nop 251; MIPS64R6-NEXT: # %bb.2: # %entry 252; MIPS64R6-NEXT: jrc $ra 253; 254; MIPS64R6O0-LABEL: AtomicLoadSub: 255; MIPS64R6O0: # %bb.0: # %entry 256; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 257; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 258; MIPS64R6O0-NEXT: daddu $1, $1, $25 259; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 260; MIPS64R6O0-NEXT: move $2, $4 261; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 262; MIPS64R6O0-NEXT: .LBB1_1: # %entry 263; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 264; MIPS64R6O0-NEXT: lld $3, 0($1) 265; MIPS64R6O0-NEXT: dsubu $5, $3, $4 266; MIPS64R6O0-NEXT: scd $5, 0($1) 267; MIPS64R6O0-NEXT: beqzc $5, .LBB1_1 268; MIPS64R6O0-NEXT: # %bb.2: # %entry 269; MIPS64R6O0-NEXT: sd $2, 8($sp) # 8-byte Folded Spill 270; MIPS64R6O0-NEXT: move $2, $3 271; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 272; MIPS64R6O0-NEXT: jrc $ra 273; 274; O1-LABEL: AtomicLoadSub: 275; O1: # %bb.0: # %entry 276; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 277; O1-NEXT: daddu $1, $1, $25 278; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 279; O1-NEXT: ld $1, %got_disp(x)($1) 280; O1-NEXT: .LBB1_1: # %entry 281; O1-NEXT: # =>This Inner Loop Header: Depth=1 282; O1-NEXT: lld $2, 0($1) 283; O1-NEXT: dsubu $3, $2, $4 284; O1-NEXT: scd $3, 0($1) 285; O1-NEXT: beqz $3, .LBB1_1 286; O1-NEXT: nop 287; O1-NEXT: # %bb.2: # %entry 288; O1-NEXT: jr $ra 289; O1-NEXT: nop 290; 291; O2-LABEL: AtomicLoadSub: 292; O2: # %bb.0: # %entry 293; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 294; O2-NEXT: daddu $1, $1, $25 295; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 296; O2-NEXT: ld $1, %got_disp(x)($1) 297; O2-NEXT: .LBB1_1: # %entry 298; O2-NEXT: # =>This Inner Loop Header: Depth=1 299; O2-NEXT: lld $2, 0($1) 300; O2-NEXT: dsubu $3, $2, $4 301; O2-NEXT: scd $3, 0($1) 302; O2-NEXT: beqz $3, .LBB1_1 303; O2-NEXT: nop 304; O2-NEXT: # %bb.2: # %entry 305; O2-NEXT: jr $ra 306; O2-NEXT: nop 307; 308; O3-LABEL: AtomicLoadSub: 309; O3: # %bb.0: # %entry 310; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 311; O3-NEXT: daddu $1, $1, $25 312; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 313; O3-NEXT: ld $1, %got_disp(x)($1) 314; O3-NEXT: .LBB1_1: # %entry 315; O3-NEXT: # =>This Inner Loop Header: Depth=1 316; O3-NEXT: lld $2, 0($1) 317; O3-NEXT: dsubu $3, $2, $4 318; O3-NEXT: scd $3, 0($1) 319; O3-NEXT: beqz $3, .LBB1_1 320; O3-NEXT: nop 321; O3-NEXT: # %bb.2: # %entry 322; O3-NEXT: jr $ra 323; O3-NEXT: nop 324; 325; MIPS64EB-LABEL: AtomicLoadSub: 326; MIPS64EB: # %bb.0: # %entry 327; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 328; MIPS64EB-NEXT: daddu $1, $1, $25 329; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 330; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 331; MIPS64EB-NEXT: .LBB1_1: # %entry 332; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 333; MIPS64EB-NEXT: lld $2, 0($1) 334; MIPS64EB-NEXT: dsubu $3, $2, $4 335; MIPS64EB-NEXT: scd $3, 0($1) 336; MIPS64EB-NEXT: beqz $3, .LBB1_1 337; MIPS64EB-NEXT: nop 338; MIPS64EB-NEXT: # %bb.2: # %entry 339; MIPS64EB-NEXT: jr $ra 340; MIPS64EB-NEXT: nop 341entry: 342 %0 = atomicrmw sub i64* @x, i64 %incr monotonic 343 ret i64 %0 344 345} 346 347define i64 @AtomicLoadAnd(i64 signext %incr) nounwind { 348; MIPS4-LABEL: AtomicLoadAnd: 349; MIPS4: # %bb.0: # %entry 350; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 351; MIPS4-NEXT: daddu $1, $1, $25 352; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 353; MIPS4-NEXT: ld $1, %got_disp(x)($1) 354; MIPS4-NEXT: .LBB2_1: # %entry 355; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 356; MIPS4-NEXT: lld $2, 0($1) 357; MIPS4-NEXT: and $3, $2, $4 358; MIPS4-NEXT: scd $3, 0($1) 359; MIPS4-NEXT: beqz $3, .LBB2_1 360; MIPS4-NEXT: nop 361; MIPS4-NEXT: # %bb.2: # %entry 362; MIPS4-NEXT: jr $ra 363; MIPS4-NEXT: nop 364; 365; MIPS64-LABEL: AtomicLoadAnd: 366; MIPS64: # %bb.0: # %entry 367; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 368; MIPS64-NEXT: daddu $1, $1, $25 369; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 370; MIPS64-NEXT: ld $1, %got_disp(x)($1) 371; MIPS64-NEXT: .LBB2_1: # %entry 372; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 373; MIPS64-NEXT: lld $2, 0($1) 374; MIPS64-NEXT: and $3, $2, $4 375; MIPS64-NEXT: scd $3, 0($1) 376; MIPS64-NEXT: beqz $3, .LBB2_1 377; MIPS64-NEXT: nop 378; MIPS64-NEXT: # %bb.2: # %entry 379; MIPS64-NEXT: jr $ra 380; MIPS64-NEXT: nop 381; 382; MIPS64R2-LABEL: AtomicLoadAnd: 383; MIPS64R2: # %bb.0: # %entry 384; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 385; MIPS64R2-NEXT: daddu $1, $1, $25 386; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 387; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 388; MIPS64R2-NEXT: .LBB2_1: # %entry 389; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 390; MIPS64R2-NEXT: lld $2, 0($1) 391; MIPS64R2-NEXT: and $3, $2, $4 392; MIPS64R2-NEXT: scd $3, 0($1) 393; MIPS64R2-NEXT: beqz $3, .LBB2_1 394; MIPS64R2-NEXT: nop 395; MIPS64R2-NEXT: # %bb.2: # %entry 396; MIPS64R2-NEXT: jr $ra 397; MIPS64R2-NEXT: nop 398; 399; MIPS64R6-LABEL: AtomicLoadAnd: 400; MIPS64R6: # %bb.0: # %entry 401; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 402; MIPS64R6-NEXT: daddu $1, $1, $25 403; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 404; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 405; MIPS64R6-NEXT: .LBB2_1: # %entry 406; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 407; MIPS64R6-NEXT: lld $2, 0($1) 408; MIPS64R6-NEXT: and $3, $2, $4 409; MIPS64R6-NEXT: scd $3, 0($1) 410; MIPS64R6-NEXT: beqzc $3, .LBB2_1 411; MIPS64R6-NEXT: nop 412; MIPS64R6-NEXT: # %bb.2: # %entry 413; MIPS64R6-NEXT: jrc $ra 414; 415; MIPS64R6O0-LABEL: AtomicLoadAnd: 416; MIPS64R6O0: # %bb.0: # %entry 417; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 418; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 419; MIPS64R6O0-NEXT: daddu $1, $1, $25 420; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 421; MIPS64R6O0-NEXT: move $2, $4 422; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 423; MIPS64R6O0-NEXT: .LBB2_1: # %entry 424; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 425; MIPS64R6O0-NEXT: lld $3, 0($1) 426; MIPS64R6O0-NEXT: and $5, $3, $4 427; MIPS64R6O0-NEXT: scd $5, 0($1) 428; MIPS64R6O0-NEXT: beqzc $5, .LBB2_1 429; MIPS64R6O0-NEXT: # %bb.2: # %entry 430; MIPS64R6O0-NEXT: sd $2, 8($sp) # 8-byte Folded Spill 431; MIPS64R6O0-NEXT: move $2, $3 432; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 433; MIPS64R6O0-NEXT: jrc $ra 434; 435; O1-LABEL: AtomicLoadAnd: 436; O1: # %bb.0: # %entry 437; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 438; O1-NEXT: daddu $1, $1, $25 439; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 440; O1-NEXT: ld $1, %got_disp(x)($1) 441; O1-NEXT: .LBB2_1: # %entry 442; O1-NEXT: # =>This Inner Loop Header: Depth=1 443; O1-NEXT: lld $2, 0($1) 444; O1-NEXT: and $3, $2, $4 445; O1-NEXT: scd $3, 0($1) 446; O1-NEXT: beqz $3, .LBB2_1 447; O1-NEXT: nop 448; O1-NEXT: # %bb.2: # %entry 449; O1-NEXT: jr $ra 450; O1-NEXT: nop 451; 452; O2-LABEL: AtomicLoadAnd: 453; O2: # %bb.0: # %entry 454; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 455; O2-NEXT: daddu $1, $1, $25 456; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 457; O2-NEXT: ld $1, %got_disp(x)($1) 458; O2-NEXT: .LBB2_1: # %entry 459; O2-NEXT: # =>This Inner Loop Header: Depth=1 460; O2-NEXT: lld $2, 0($1) 461; O2-NEXT: and $3, $2, $4 462; O2-NEXT: scd $3, 0($1) 463; O2-NEXT: beqz $3, .LBB2_1 464; O2-NEXT: nop 465; O2-NEXT: # %bb.2: # %entry 466; O2-NEXT: jr $ra 467; O2-NEXT: nop 468; 469; O3-LABEL: AtomicLoadAnd: 470; O3: # %bb.0: # %entry 471; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 472; O3-NEXT: daddu $1, $1, $25 473; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 474; O3-NEXT: ld $1, %got_disp(x)($1) 475; O3-NEXT: .LBB2_1: # %entry 476; O3-NEXT: # =>This Inner Loop Header: Depth=1 477; O3-NEXT: lld $2, 0($1) 478; O3-NEXT: and $3, $2, $4 479; O3-NEXT: scd $3, 0($1) 480; O3-NEXT: beqz $3, .LBB2_1 481; O3-NEXT: nop 482; O3-NEXT: # %bb.2: # %entry 483; O3-NEXT: jr $ra 484; O3-NEXT: nop 485; 486; MIPS64EB-LABEL: AtomicLoadAnd: 487; MIPS64EB: # %bb.0: # %entry 488; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 489; MIPS64EB-NEXT: daddu $1, $1, $25 490; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 491; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 492; MIPS64EB-NEXT: .LBB2_1: # %entry 493; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 494; MIPS64EB-NEXT: lld $2, 0($1) 495; MIPS64EB-NEXT: and $3, $2, $4 496; MIPS64EB-NEXT: scd $3, 0($1) 497; MIPS64EB-NEXT: beqz $3, .LBB2_1 498; MIPS64EB-NEXT: nop 499; MIPS64EB-NEXT: # %bb.2: # %entry 500; MIPS64EB-NEXT: jr $ra 501; MIPS64EB-NEXT: nop 502entry: 503 %0 = atomicrmw and i64* @x, i64 %incr monotonic 504 ret i64 %0 505 506} 507 508define i64 @AtomicLoadOr(i64 signext %incr) nounwind { 509; MIPS4-LABEL: AtomicLoadOr: 510; MIPS4: # %bb.0: # %entry 511; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 512; MIPS4-NEXT: daddu $1, $1, $25 513; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 514; MIPS4-NEXT: ld $1, %got_disp(x)($1) 515; MIPS4-NEXT: .LBB3_1: # %entry 516; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 517; MIPS4-NEXT: lld $2, 0($1) 518; MIPS4-NEXT: or $3, $2, $4 519; MIPS4-NEXT: scd $3, 0($1) 520; MIPS4-NEXT: beqz $3, .LBB3_1 521; MIPS4-NEXT: nop 522; MIPS4-NEXT: # %bb.2: # %entry 523; MIPS4-NEXT: jr $ra 524; MIPS4-NEXT: nop 525; 526; MIPS64-LABEL: AtomicLoadOr: 527; MIPS64: # %bb.0: # %entry 528; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 529; MIPS64-NEXT: daddu $1, $1, $25 530; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 531; MIPS64-NEXT: ld $1, %got_disp(x)($1) 532; MIPS64-NEXT: .LBB3_1: # %entry 533; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 534; MIPS64-NEXT: lld $2, 0($1) 535; MIPS64-NEXT: or $3, $2, $4 536; MIPS64-NEXT: scd $3, 0($1) 537; MIPS64-NEXT: beqz $3, .LBB3_1 538; MIPS64-NEXT: nop 539; MIPS64-NEXT: # %bb.2: # %entry 540; MIPS64-NEXT: jr $ra 541; MIPS64-NEXT: nop 542; 543; MIPS64R2-LABEL: AtomicLoadOr: 544; MIPS64R2: # %bb.0: # %entry 545; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 546; MIPS64R2-NEXT: daddu $1, $1, $25 547; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 548; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 549; MIPS64R2-NEXT: .LBB3_1: # %entry 550; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 551; MIPS64R2-NEXT: lld $2, 0($1) 552; MIPS64R2-NEXT: or $3, $2, $4 553; MIPS64R2-NEXT: scd $3, 0($1) 554; MIPS64R2-NEXT: beqz $3, .LBB3_1 555; MIPS64R2-NEXT: nop 556; MIPS64R2-NEXT: # %bb.2: # %entry 557; MIPS64R2-NEXT: jr $ra 558; MIPS64R2-NEXT: nop 559; 560; MIPS64R6-LABEL: AtomicLoadOr: 561; MIPS64R6: # %bb.0: # %entry 562; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 563; MIPS64R6-NEXT: daddu $1, $1, $25 564; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 565; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 566; MIPS64R6-NEXT: .LBB3_1: # %entry 567; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 568; MIPS64R6-NEXT: lld $2, 0($1) 569; MIPS64R6-NEXT: or $3, $2, $4 570; MIPS64R6-NEXT: scd $3, 0($1) 571; MIPS64R6-NEXT: beqzc $3, .LBB3_1 572; MIPS64R6-NEXT: nop 573; MIPS64R6-NEXT: # %bb.2: # %entry 574; MIPS64R6-NEXT: jrc $ra 575; 576; MIPS64R6O0-LABEL: AtomicLoadOr: 577; MIPS64R6O0: # %bb.0: # %entry 578; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 579; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 580; MIPS64R6O0-NEXT: daddu $1, $1, $25 581; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 582; MIPS64R6O0-NEXT: move $2, $4 583; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 584; MIPS64R6O0-NEXT: .LBB3_1: # %entry 585; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 586; MIPS64R6O0-NEXT: lld $3, 0($1) 587; MIPS64R6O0-NEXT: or $5, $3, $4 588; MIPS64R6O0-NEXT: scd $5, 0($1) 589; MIPS64R6O0-NEXT: beqzc $5, .LBB3_1 590; MIPS64R6O0-NEXT: # %bb.2: # %entry 591; MIPS64R6O0-NEXT: sd $2, 8($sp) # 8-byte Folded Spill 592; MIPS64R6O0-NEXT: move $2, $3 593; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 594; MIPS64R6O0-NEXT: jrc $ra 595; 596; O1-LABEL: AtomicLoadOr: 597; O1: # %bb.0: # %entry 598; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 599; O1-NEXT: daddu $1, $1, $25 600; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 601; O1-NEXT: ld $1, %got_disp(x)($1) 602; O1-NEXT: .LBB3_1: # %entry 603; O1-NEXT: # =>This Inner Loop Header: Depth=1 604; O1-NEXT: lld $2, 0($1) 605; O1-NEXT: or $3, $2, $4 606; O1-NEXT: scd $3, 0($1) 607; O1-NEXT: beqz $3, .LBB3_1 608; O1-NEXT: nop 609; O1-NEXT: # %bb.2: # %entry 610; O1-NEXT: jr $ra 611; O1-NEXT: nop 612; 613; O2-LABEL: AtomicLoadOr: 614; O2: # %bb.0: # %entry 615; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 616; O2-NEXT: daddu $1, $1, $25 617; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 618; O2-NEXT: ld $1, %got_disp(x)($1) 619; O2-NEXT: .LBB3_1: # %entry 620; O2-NEXT: # =>This Inner Loop Header: Depth=1 621; O2-NEXT: lld $2, 0($1) 622; O2-NEXT: or $3, $2, $4 623; O2-NEXT: scd $3, 0($1) 624; O2-NEXT: beqz $3, .LBB3_1 625; O2-NEXT: nop 626; O2-NEXT: # %bb.2: # %entry 627; O2-NEXT: jr $ra 628; O2-NEXT: nop 629; 630; O3-LABEL: AtomicLoadOr: 631; O3: # %bb.0: # %entry 632; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 633; O3-NEXT: daddu $1, $1, $25 634; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 635; O3-NEXT: ld $1, %got_disp(x)($1) 636; O3-NEXT: .LBB3_1: # %entry 637; O3-NEXT: # =>This Inner Loop Header: Depth=1 638; O3-NEXT: lld $2, 0($1) 639; O3-NEXT: or $3, $2, $4 640; O3-NEXT: scd $3, 0($1) 641; O3-NEXT: beqz $3, .LBB3_1 642; O3-NEXT: nop 643; O3-NEXT: # %bb.2: # %entry 644; O3-NEXT: jr $ra 645; O3-NEXT: nop 646; 647; MIPS64EB-LABEL: AtomicLoadOr: 648; MIPS64EB: # %bb.0: # %entry 649; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 650; MIPS64EB-NEXT: daddu $1, $1, $25 651; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 652; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 653; MIPS64EB-NEXT: .LBB3_1: # %entry 654; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 655; MIPS64EB-NEXT: lld $2, 0($1) 656; MIPS64EB-NEXT: or $3, $2, $4 657; MIPS64EB-NEXT: scd $3, 0($1) 658; MIPS64EB-NEXT: beqz $3, .LBB3_1 659; MIPS64EB-NEXT: nop 660; MIPS64EB-NEXT: # %bb.2: # %entry 661; MIPS64EB-NEXT: jr $ra 662; MIPS64EB-NEXT: nop 663entry: 664 %0 = atomicrmw or i64* @x, i64 %incr monotonic 665 ret i64 %0 666 667} 668 669define i64 @AtomicLoadXor(i64 signext %incr) nounwind { 670; MIPS4-LABEL: AtomicLoadXor: 671; MIPS4: # %bb.0: # %entry 672; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 673; MIPS4-NEXT: daddu $1, $1, $25 674; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 675; MIPS4-NEXT: ld $1, %got_disp(x)($1) 676; MIPS4-NEXT: .LBB4_1: # %entry 677; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 678; MIPS4-NEXT: lld $2, 0($1) 679; MIPS4-NEXT: xor $3, $2, $4 680; MIPS4-NEXT: scd $3, 0($1) 681; MIPS4-NEXT: beqz $3, .LBB4_1 682; MIPS4-NEXT: nop 683; MIPS4-NEXT: # %bb.2: # %entry 684; MIPS4-NEXT: jr $ra 685; MIPS4-NEXT: nop 686; 687; MIPS64-LABEL: AtomicLoadXor: 688; MIPS64: # %bb.0: # %entry 689; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 690; MIPS64-NEXT: daddu $1, $1, $25 691; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 692; MIPS64-NEXT: ld $1, %got_disp(x)($1) 693; MIPS64-NEXT: .LBB4_1: # %entry 694; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 695; MIPS64-NEXT: lld $2, 0($1) 696; MIPS64-NEXT: xor $3, $2, $4 697; MIPS64-NEXT: scd $3, 0($1) 698; MIPS64-NEXT: beqz $3, .LBB4_1 699; MIPS64-NEXT: nop 700; MIPS64-NEXT: # %bb.2: # %entry 701; MIPS64-NEXT: jr $ra 702; MIPS64-NEXT: nop 703; 704; MIPS64R2-LABEL: AtomicLoadXor: 705; MIPS64R2: # %bb.0: # %entry 706; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 707; MIPS64R2-NEXT: daddu $1, $1, $25 708; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 709; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 710; MIPS64R2-NEXT: .LBB4_1: # %entry 711; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 712; MIPS64R2-NEXT: lld $2, 0($1) 713; MIPS64R2-NEXT: xor $3, $2, $4 714; MIPS64R2-NEXT: scd $3, 0($1) 715; MIPS64R2-NEXT: beqz $3, .LBB4_1 716; MIPS64R2-NEXT: nop 717; MIPS64R2-NEXT: # %bb.2: # %entry 718; MIPS64R2-NEXT: jr $ra 719; MIPS64R2-NEXT: nop 720; 721; MIPS64R6-LABEL: AtomicLoadXor: 722; MIPS64R6: # %bb.0: # %entry 723; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 724; MIPS64R6-NEXT: daddu $1, $1, $25 725; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 726; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 727; MIPS64R6-NEXT: .LBB4_1: # %entry 728; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 729; MIPS64R6-NEXT: lld $2, 0($1) 730; MIPS64R6-NEXT: xor $3, $2, $4 731; MIPS64R6-NEXT: scd $3, 0($1) 732; MIPS64R6-NEXT: beqzc $3, .LBB4_1 733; MIPS64R6-NEXT: nop 734; MIPS64R6-NEXT: # %bb.2: # %entry 735; MIPS64R6-NEXT: jrc $ra 736; 737; MIPS64R6O0-LABEL: AtomicLoadXor: 738; MIPS64R6O0: # %bb.0: # %entry 739; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 740; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 741; MIPS64R6O0-NEXT: daddu $1, $1, $25 742; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 743; MIPS64R6O0-NEXT: move $2, $4 744; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 745; MIPS64R6O0-NEXT: .LBB4_1: # %entry 746; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 747; MIPS64R6O0-NEXT: lld $3, 0($1) 748; MIPS64R6O0-NEXT: xor $5, $3, $4 749; MIPS64R6O0-NEXT: scd $5, 0($1) 750; MIPS64R6O0-NEXT: beqzc $5, .LBB4_1 751; MIPS64R6O0-NEXT: # %bb.2: # %entry 752; MIPS64R6O0-NEXT: sd $2, 8($sp) # 8-byte Folded Spill 753; MIPS64R6O0-NEXT: move $2, $3 754; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 755; MIPS64R6O0-NEXT: jrc $ra 756; 757; O1-LABEL: AtomicLoadXor: 758; O1: # %bb.0: # %entry 759; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 760; O1-NEXT: daddu $1, $1, $25 761; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 762; O1-NEXT: ld $1, %got_disp(x)($1) 763; O1-NEXT: .LBB4_1: # %entry 764; O1-NEXT: # =>This Inner Loop Header: Depth=1 765; O1-NEXT: lld $2, 0($1) 766; O1-NEXT: xor $3, $2, $4 767; O1-NEXT: scd $3, 0($1) 768; O1-NEXT: beqz $3, .LBB4_1 769; O1-NEXT: nop 770; O1-NEXT: # %bb.2: # %entry 771; O1-NEXT: jr $ra 772; O1-NEXT: nop 773; 774; O2-LABEL: AtomicLoadXor: 775; O2: # %bb.0: # %entry 776; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 777; O2-NEXT: daddu $1, $1, $25 778; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 779; O2-NEXT: ld $1, %got_disp(x)($1) 780; O2-NEXT: .LBB4_1: # %entry 781; O2-NEXT: # =>This Inner Loop Header: Depth=1 782; O2-NEXT: lld $2, 0($1) 783; O2-NEXT: xor $3, $2, $4 784; O2-NEXT: scd $3, 0($1) 785; O2-NEXT: beqz $3, .LBB4_1 786; O2-NEXT: nop 787; O2-NEXT: # %bb.2: # %entry 788; O2-NEXT: jr $ra 789; O2-NEXT: nop 790; 791; O3-LABEL: AtomicLoadXor: 792; O3: # %bb.0: # %entry 793; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 794; O3-NEXT: daddu $1, $1, $25 795; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 796; O3-NEXT: ld $1, %got_disp(x)($1) 797; O3-NEXT: .LBB4_1: # %entry 798; O3-NEXT: # =>This Inner Loop Header: Depth=1 799; O3-NEXT: lld $2, 0($1) 800; O3-NEXT: xor $3, $2, $4 801; O3-NEXT: scd $3, 0($1) 802; O3-NEXT: beqz $3, .LBB4_1 803; O3-NEXT: nop 804; O3-NEXT: # %bb.2: # %entry 805; O3-NEXT: jr $ra 806; O3-NEXT: nop 807; 808; MIPS64EB-LABEL: AtomicLoadXor: 809; MIPS64EB: # %bb.0: # %entry 810; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 811; MIPS64EB-NEXT: daddu $1, $1, $25 812; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 813; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 814; MIPS64EB-NEXT: .LBB4_1: # %entry 815; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 816; MIPS64EB-NEXT: lld $2, 0($1) 817; MIPS64EB-NEXT: xor $3, $2, $4 818; MIPS64EB-NEXT: scd $3, 0($1) 819; MIPS64EB-NEXT: beqz $3, .LBB4_1 820; MIPS64EB-NEXT: nop 821; MIPS64EB-NEXT: # %bb.2: # %entry 822; MIPS64EB-NEXT: jr $ra 823; MIPS64EB-NEXT: nop 824entry: 825 %0 = atomicrmw xor i64* @x, i64 %incr monotonic 826 ret i64 %0 827 828} 829 830define i64 @AtomicLoadNand(i64 signext %incr) nounwind { 831; MIPS4-LABEL: AtomicLoadNand: 832; MIPS4: # %bb.0: # %entry 833; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 834; MIPS4-NEXT: daddu $1, $1, $25 835; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 836; MIPS4-NEXT: ld $1, %got_disp(x)($1) 837; MIPS4-NEXT: .LBB5_1: # %entry 838; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 839; MIPS4-NEXT: lld $2, 0($1) 840; MIPS4-NEXT: and $3, $2, $4 841; MIPS4-NEXT: nor $3, $zero, $3 842; MIPS4-NEXT: scd $3, 0($1) 843; MIPS4-NEXT: beqz $3, .LBB5_1 844; MIPS4-NEXT: nop 845; MIPS4-NEXT: # %bb.2: # %entry 846; MIPS4-NEXT: jr $ra 847; MIPS4-NEXT: nop 848; 849; MIPS64-LABEL: AtomicLoadNand: 850; MIPS64: # %bb.0: # %entry 851; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 852; MIPS64-NEXT: daddu $1, $1, $25 853; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 854; MIPS64-NEXT: ld $1, %got_disp(x)($1) 855; MIPS64-NEXT: .LBB5_1: # %entry 856; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 857; MIPS64-NEXT: lld $2, 0($1) 858; MIPS64-NEXT: and $3, $2, $4 859; MIPS64-NEXT: nor $3, $zero, $3 860; MIPS64-NEXT: scd $3, 0($1) 861; MIPS64-NEXT: beqz $3, .LBB5_1 862; MIPS64-NEXT: nop 863; MIPS64-NEXT: # %bb.2: # %entry 864; MIPS64-NEXT: jr $ra 865; MIPS64-NEXT: nop 866; 867; MIPS64R2-LABEL: AtomicLoadNand: 868; MIPS64R2: # %bb.0: # %entry 869; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 870; MIPS64R2-NEXT: daddu $1, $1, $25 871; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 872; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 873; MIPS64R2-NEXT: .LBB5_1: # %entry 874; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 875; MIPS64R2-NEXT: lld $2, 0($1) 876; MIPS64R2-NEXT: and $3, $2, $4 877; MIPS64R2-NEXT: nor $3, $zero, $3 878; MIPS64R2-NEXT: scd $3, 0($1) 879; MIPS64R2-NEXT: beqz $3, .LBB5_1 880; MIPS64R2-NEXT: nop 881; MIPS64R2-NEXT: # %bb.2: # %entry 882; MIPS64R2-NEXT: jr $ra 883; MIPS64R2-NEXT: nop 884; 885; MIPS64R6-LABEL: AtomicLoadNand: 886; MIPS64R6: # %bb.0: # %entry 887; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 888; MIPS64R6-NEXT: daddu $1, $1, $25 889; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 890; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 891; MIPS64R6-NEXT: .LBB5_1: # %entry 892; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 893; MIPS64R6-NEXT: lld $2, 0($1) 894; MIPS64R6-NEXT: and $3, $2, $4 895; MIPS64R6-NEXT: nor $3, $zero, $3 896; MIPS64R6-NEXT: scd $3, 0($1) 897; MIPS64R6-NEXT: beqzc $3, .LBB5_1 898; MIPS64R6-NEXT: nop 899; MIPS64R6-NEXT: # %bb.2: # %entry 900; MIPS64R6-NEXT: jrc $ra 901; 902; MIPS64R6O0-LABEL: AtomicLoadNand: 903; MIPS64R6O0: # %bb.0: # %entry 904; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 905; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 906; MIPS64R6O0-NEXT: daddu $1, $1, $25 907; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 908; MIPS64R6O0-NEXT: move $2, $4 909; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 910; MIPS64R6O0-NEXT: .LBB5_1: # %entry 911; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 912; MIPS64R6O0-NEXT: lld $3, 0($1) 913; MIPS64R6O0-NEXT: and $5, $3, $4 914; MIPS64R6O0-NEXT: nor $5, $zero, $5 915; MIPS64R6O0-NEXT: scd $5, 0($1) 916; MIPS64R6O0-NEXT: beqzc $5, .LBB5_1 917; MIPS64R6O0-NEXT: # %bb.2: # %entry 918; MIPS64R6O0-NEXT: sd $2, 8($sp) # 8-byte Folded Spill 919; MIPS64R6O0-NEXT: move $2, $3 920; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 921; MIPS64R6O0-NEXT: jrc $ra 922; 923; O1-LABEL: AtomicLoadNand: 924; O1: # %bb.0: # %entry 925; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 926; O1-NEXT: daddu $1, $1, $25 927; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 928; O1-NEXT: ld $1, %got_disp(x)($1) 929; O1-NEXT: .LBB5_1: # %entry 930; O1-NEXT: # =>This Inner Loop Header: Depth=1 931; O1-NEXT: lld $2, 0($1) 932; O1-NEXT: and $3, $2, $4 933; O1-NEXT: nor $3, $zero, $3 934; O1-NEXT: scd $3, 0($1) 935; O1-NEXT: beqz $3, .LBB5_1 936; O1-NEXT: nop 937; O1-NEXT: # %bb.2: # %entry 938; O1-NEXT: jr $ra 939; O1-NEXT: nop 940; 941; O2-LABEL: AtomicLoadNand: 942; O2: # %bb.0: # %entry 943; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 944; O2-NEXT: daddu $1, $1, $25 945; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 946; O2-NEXT: ld $1, %got_disp(x)($1) 947; O2-NEXT: .LBB5_1: # %entry 948; O2-NEXT: # =>This Inner Loop Header: Depth=1 949; O2-NEXT: lld $2, 0($1) 950; O2-NEXT: and $3, $2, $4 951; O2-NEXT: nor $3, $zero, $3 952; O2-NEXT: scd $3, 0($1) 953; O2-NEXT: beqz $3, .LBB5_1 954; O2-NEXT: nop 955; O2-NEXT: # %bb.2: # %entry 956; O2-NEXT: jr $ra 957; O2-NEXT: nop 958; 959; O3-LABEL: AtomicLoadNand: 960; O3: # %bb.0: # %entry 961; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 962; O3-NEXT: daddu $1, $1, $25 963; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 964; O3-NEXT: ld $1, %got_disp(x)($1) 965; O3-NEXT: .LBB5_1: # %entry 966; O3-NEXT: # =>This Inner Loop Header: Depth=1 967; O3-NEXT: lld $2, 0($1) 968; O3-NEXT: and $3, $2, $4 969; O3-NEXT: nor $3, $zero, $3 970; O3-NEXT: scd $3, 0($1) 971; O3-NEXT: beqz $3, .LBB5_1 972; O3-NEXT: nop 973; O3-NEXT: # %bb.2: # %entry 974; O3-NEXT: jr $ra 975; O3-NEXT: nop 976; 977; MIPS64EB-LABEL: AtomicLoadNand: 978; MIPS64EB: # %bb.0: # %entry 979; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 980; MIPS64EB-NEXT: daddu $1, $1, $25 981; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 982; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 983; MIPS64EB-NEXT: .LBB5_1: # %entry 984; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 985; MIPS64EB-NEXT: lld $2, 0($1) 986; MIPS64EB-NEXT: and $3, $2, $4 987; MIPS64EB-NEXT: nor $3, $zero, $3 988; MIPS64EB-NEXT: scd $3, 0($1) 989; MIPS64EB-NEXT: beqz $3, .LBB5_1 990; MIPS64EB-NEXT: nop 991; MIPS64EB-NEXT: # %bb.2: # %entry 992; MIPS64EB-NEXT: jr $ra 993; MIPS64EB-NEXT: nop 994entry: 995 %0 = atomicrmw nand i64* @x, i64 %incr monotonic 996 ret i64 %0 997 998} 999 1000define i64 @AtomicSwap64(i64 signext %newval) nounwind { 1001; MIPS4-LABEL: AtomicSwap64: 1002; MIPS4: # %bb.0: # %entry 1003; MIPS4-NEXT: daddiu $sp, $sp, -16 1004; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1005; MIPS4-NEXT: daddu $1, $1, $25 1006; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1007; MIPS4-NEXT: sd $4, 8($sp) 1008; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1009; MIPS4-NEXT: .LBB6_1: # %entry 1010; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1011; MIPS4-NEXT: lld $2, 0($1) 1012; MIPS4-NEXT: move $3, $4 1013; MIPS4-NEXT: scd $3, 0($1) 1014; MIPS4-NEXT: beqz $3, .LBB6_1 1015; MIPS4-NEXT: nop 1016; MIPS4-NEXT: # %bb.2: # %entry 1017; MIPS4-NEXT: jr $ra 1018; MIPS4-NEXT: daddiu $sp, $sp, 16 1019; 1020; MIPS64-LABEL: AtomicSwap64: 1021; MIPS64: # %bb.0: # %entry 1022; MIPS64-NEXT: daddiu $sp, $sp, -16 1023; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1024; MIPS64-NEXT: daddu $1, $1, $25 1025; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1026; MIPS64-NEXT: sd $4, 8($sp) 1027; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1028; MIPS64-NEXT: .LBB6_1: # %entry 1029; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1030; MIPS64-NEXT: lld $2, 0($1) 1031; MIPS64-NEXT: move $3, $4 1032; MIPS64-NEXT: scd $3, 0($1) 1033; MIPS64-NEXT: beqz $3, .LBB6_1 1034; MIPS64-NEXT: nop 1035; MIPS64-NEXT: # %bb.2: # %entry 1036; MIPS64-NEXT: jr $ra 1037; MIPS64-NEXT: daddiu $sp, $sp, 16 1038; 1039; MIPS64R2-LABEL: AtomicSwap64: 1040; MIPS64R2: # %bb.0: # %entry 1041; MIPS64R2-NEXT: daddiu $sp, $sp, -16 1042; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1043; MIPS64R2-NEXT: daddu $1, $1, $25 1044; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1045; MIPS64R2-NEXT: sd $4, 8($sp) 1046; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1047; MIPS64R2-NEXT: .LBB6_1: # %entry 1048; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1049; MIPS64R2-NEXT: lld $2, 0($1) 1050; MIPS64R2-NEXT: move $3, $4 1051; MIPS64R2-NEXT: scd $3, 0($1) 1052; MIPS64R2-NEXT: beqz $3, .LBB6_1 1053; MIPS64R2-NEXT: nop 1054; MIPS64R2-NEXT: # %bb.2: # %entry 1055; MIPS64R2-NEXT: jr $ra 1056; MIPS64R2-NEXT: daddiu $sp, $sp, 16 1057; 1058; MIPS64R6-LABEL: AtomicSwap64: 1059; MIPS64R6: # %bb.0: # %entry 1060; MIPS64R6-NEXT: daddiu $sp, $sp, -16 1061; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1062; MIPS64R6-NEXT: daddu $1, $1, $25 1063; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1064; MIPS64R6-NEXT: sd $4, 8($sp) 1065; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1066; MIPS64R6-NEXT: .LBB6_1: # %entry 1067; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1068; MIPS64R6-NEXT: lld $2, 0($1) 1069; MIPS64R6-NEXT: move $3, $4 1070; MIPS64R6-NEXT: scd $3, 0($1) 1071; MIPS64R6-NEXT: beqzc $3, .LBB6_1 1072; MIPS64R6-NEXT: nop 1073; MIPS64R6-NEXT: # %bb.2: # %entry 1074; MIPS64R6-NEXT: jr $ra 1075; MIPS64R6-NEXT: daddiu $sp, $sp, 16 1076; 1077; MIPS64R6O0-LABEL: AtomicSwap64: 1078; MIPS64R6O0: # %bb.0: # %entry 1079; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 1080; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1081; MIPS64R6O0-NEXT: daddu $1, $1, $25 1082; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1083; MIPS64R6O0-NEXT: move $2, $4 1084; MIPS64R6O0-NEXT: sd $4, 8($sp) 1085; MIPS64R6O0-NEXT: ld $3, 8($sp) 1086; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1087; MIPS64R6O0-NEXT: .LBB6_1: # %entry 1088; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1089; MIPS64R6O0-NEXT: lld $4, 0($1) 1090; MIPS64R6O0-NEXT: move $5, $3 1091; MIPS64R6O0-NEXT: scd $5, 0($1) 1092; MIPS64R6O0-NEXT: beqzc $5, .LBB6_1 1093; MIPS64R6O0-NEXT: # %bb.2: # %entry 1094; MIPS64R6O0-NEXT: sd $2, 0($sp) # 8-byte Folded Spill 1095; MIPS64R6O0-NEXT: move $2, $4 1096; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 1097; MIPS64R6O0-NEXT: jrc $ra 1098; 1099; O1-LABEL: AtomicSwap64: 1100; O1: # %bb.0: # %entry 1101; O1-NEXT: daddiu $sp, $sp, -16 1102; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1103; O1-NEXT: daddu $1, $1, $25 1104; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1105; O1-NEXT: sd $4, 8($sp) 1106; O1-NEXT: ld $1, %got_disp(x)($1) 1107; O1-NEXT: .LBB6_1: # %entry 1108; O1-NEXT: # =>This Inner Loop Header: Depth=1 1109; O1-NEXT: lld $2, 0($1) 1110; O1-NEXT: move $3, $4 1111; O1-NEXT: scd $3, 0($1) 1112; O1-NEXT: beqz $3, .LBB6_1 1113; O1-NEXT: nop 1114; O1-NEXT: # %bb.2: # %entry 1115; O1-NEXT: jr $ra 1116; O1-NEXT: daddiu $sp, $sp, 16 1117; 1118; O2-LABEL: AtomicSwap64: 1119; O2: # %bb.0: # %entry 1120; O2-NEXT: daddiu $sp, $sp, -16 1121; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1122; O2-NEXT: daddu $1, $1, $25 1123; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1124; O2-NEXT: sd $4, 8($sp) 1125; O2-NEXT: ld $1, %got_disp(x)($1) 1126; O2-NEXT: .LBB6_1: # %entry 1127; O2-NEXT: # =>This Inner Loop Header: Depth=1 1128; O2-NEXT: lld $2, 0($1) 1129; O2-NEXT: move $3, $4 1130; O2-NEXT: scd $3, 0($1) 1131; O2-NEXT: beqz $3, .LBB6_1 1132; O2-NEXT: nop 1133; O2-NEXT: # %bb.2: # %entry 1134; O2-NEXT: jr $ra 1135; O2-NEXT: daddiu $sp, $sp, 16 1136; 1137; O3-LABEL: AtomicSwap64: 1138; O3: # %bb.0: # %entry 1139; O3-NEXT: daddiu $sp, $sp, -16 1140; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1141; O3-NEXT: sd $4, 8($sp) 1142; O3-NEXT: daddu $1, $1, $25 1143; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1144; O3-NEXT: ld $1, %got_disp(x)($1) 1145; O3-NEXT: .LBB6_1: # %entry 1146; O3-NEXT: # =>This Inner Loop Header: Depth=1 1147; O3-NEXT: lld $2, 0($1) 1148; O3-NEXT: move $3, $4 1149; O3-NEXT: scd $3, 0($1) 1150; O3-NEXT: beqz $3, .LBB6_1 1151; O3-NEXT: nop 1152; O3-NEXT: # %bb.2: # %entry 1153; O3-NEXT: jr $ra 1154; O3-NEXT: daddiu $sp, $sp, 16 1155; 1156; MIPS64EB-LABEL: AtomicSwap64: 1157; MIPS64EB: # %bb.0: # %entry 1158; MIPS64EB-NEXT: daddiu $sp, $sp, -16 1159; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1160; MIPS64EB-NEXT: daddu $1, $1, $25 1161; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1162; MIPS64EB-NEXT: sd $4, 8($sp) 1163; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 1164; MIPS64EB-NEXT: .LBB6_1: # %entry 1165; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 1166; MIPS64EB-NEXT: lld $2, 0($1) 1167; MIPS64EB-NEXT: move $3, $4 1168; MIPS64EB-NEXT: scd $3, 0($1) 1169; MIPS64EB-NEXT: beqz $3, .LBB6_1 1170; MIPS64EB-NEXT: nop 1171; MIPS64EB-NEXT: # %bb.2: # %entry 1172; MIPS64EB-NEXT: jr $ra 1173; MIPS64EB-NEXT: daddiu $sp, $sp, 16 1174entry: 1175 %newval.addr = alloca i64, align 4 1176 store i64 %newval, i64* %newval.addr, align 4 1177 %tmp = load i64, i64* %newval.addr, align 4 1178 %0 = atomicrmw xchg i64* @x, i64 %tmp monotonic 1179 ret i64 %0 1180 1181} 1182 1183define i64 @AtomicCmpSwap64(i64 signext %oldval, i64 signext %newval) nounwind { 1184; MIPS4-LABEL: AtomicCmpSwap64: 1185; MIPS4: # %bb.0: # %entry 1186; MIPS4-NEXT: daddiu $sp, $sp, -16 1187; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1188; MIPS4-NEXT: daddu $1, $1, $25 1189; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1190; MIPS4-NEXT: sd $5, 8($sp) 1191; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1192; MIPS4-NEXT: .LBB7_1: # %entry 1193; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1194; MIPS4-NEXT: lld $2, 0($1) 1195; MIPS4-NEXT: bne $2, $4, .LBB7_3 1196; MIPS4-NEXT: nop 1197; MIPS4-NEXT: # %bb.2: # %entry 1198; MIPS4-NEXT: # in Loop: Header=BB7_1 Depth=1 1199; MIPS4-NEXT: move $3, $5 1200; MIPS4-NEXT: scd $3, 0($1) 1201; MIPS4-NEXT: beqz $3, .LBB7_1 1202; MIPS4-NEXT: nop 1203; MIPS4-NEXT: .LBB7_3: # %entry 1204; MIPS4-NEXT: jr $ra 1205; MIPS4-NEXT: daddiu $sp, $sp, 16 1206; 1207; MIPS64-LABEL: AtomicCmpSwap64: 1208; MIPS64: # %bb.0: # %entry 1209; MIPS64-NEXT: daddiu $sp, $sp, -16 1210; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1211; MIPS64-NEXT: daddu $1, $1, $25 1212; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1213; MIPS64-NEXT: sd $5, 8($sp) 1214; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1215; MIPS64-NEXT: .LBB7_1: # %entry 1216; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1217; MIPS64-NEXT: lld $2, 0($1) 1218; MIPS64-NEXT: bne $2, $4, .LBB7_3 1219; MIPS64-NEXT: nop 1220; MIPS64-NEXT: # %bb.2: # %entry 1221; MIPS64-NEXT: # in Loop: Header=BB7_1 Depth=1 1222; MIPS64-NEXT: move $3, $5 1223; MIPS64-NEXT: scd $3, 0($1) 1224; MIPS64-NEXT: beqz $3, .LBB7_1 1225; MIPS64-NEXT: nop 1226; MIPS64-NEXT: .LBB7_3: # %entry 1227; MIPS64-NEXT: jr $ra 1228; MIPS64-NEXT: daddiu $sp, $sp, 16 1229; 1230; MIPS64R2-LABEL: AtomicCmpSwap64: 1231; MIPS64R2: # %bb.0: # %entry 1232; MIPS64R2-NEXT: daddiu $sp, $sp, -16 1233; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1234; MIPS64R2-NEXT: daddu $1, $1, $25 1235; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1236; MIPS64R2-NEXT: sd $5, 8($sp) 1237; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1238; MIPS64R2-NEXT: .LBB7_1: # %entry 1239; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1240; MIPS64R2-NEXT: lld $2, 0($1) 1241; MIPS64R2-NEXT: bne $2, $4, .LBB7_3 1242; MIPS64R2-NEXT: nop 1243; MIPS64R2-NEXT: # %bb.2: # %entry 1244; MIPS64R2-NEXT: # in Loop: Header=BB7_1 Depth=1 1245; MIPS64R2-NEXT: move $3, $5 1246; MIPS64R2-NEXT: scd $3, 0($1) 1247; MIPS64R2-NEXT: beqz $3, .LBB7_1 1248; MIPS64R2-NEXT: nop 1249; MIPS64R2-NEXT: .LBB7_3: # %entry 1250; MIPS64R2-NEXT: jr $ra 1251; MIPS64R2-NEXT: daddiu $sp, $sp, 16 1252; 1253; MIPS64R6-LABEL: AtomicCmpSwap64: 1254; MIPS64R6: # %bb.0: # %entry 1255; MIPS64R6-NEXT: daddiu $sp, $sp, -16 1256; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1257; MIPS64R6-NEXT: daddu $1, $1, $25 1258; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1259; MIPS64R6-NEXT: sd $5, 8($sp) 1260; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1261; MIPS64R6-NEXT: .LBB7_1: # %entry 1262; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1263; MIPS64R6-NEXT: lld $2, 0($1) 1264; MIPS64R6-NEXT: bnec $2, $4, .LBB7_3 1265; MIPS64R6-NEXT: # %bb.2: # %entry 1266; MIPS64R6-NEXT: # in Loop: Header=BB7_1 Depth=1 1267; MIPS64R6-NEXT: move $3, $5 1268; MIPS64R6-NEXT: scd $3, 0($1) 1269; MIPS64R6-NEXT: beqzc $3, .LBB7_1 1270; MIPS64R6-NEXT: nop 1271; MIPS64R6-NEXT: .LBB7_3: # %entry 1272; MIPS64R6-NEXT: jr $ra 1273; MIPS64R6-NEXT: daddiu $sp, $sp, 16 1274; 1275; MIPS64R6O0-LABEL: AtomicCmpSwap64: 1276; MIPS64R6O0: # %bb.0: # %entry 1277; MIPS64R6O0-NEXT: daddiu $sp, $sp, -32 1278; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1279; MIPS64R6O0-NEXT: daddu $1, $1, $25 1280; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1281; MIPS64R6O0-NEXT: move $2, $5 1282; MIPS64R6O0-NEXT: move $3, $4 1283; MIPS64R6O0-NEXT: sd $5, 24($sp) 1284; MIPS64R6O0-NEXT: ld $5, 24($sp) 1285; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1286; MIPS64R6O0-NEXT: .LBB7_1: # %entry 1287; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1288; MIPS64R6O0-NEXT: lld $6, 0($1) 1289; MIPS64R6O0-NEXT: bnec $6, $4, .LBB7_3 1290; MIPS64R6O0-NEXT: # %bb.2: # %entry 1291; MIPS64R6O0-NEXT: # in Loop: Header=BB7_1 Depth=1 1292; MIPS64R6O0-NEXT: move $7, $5 1293; MIPS64R6O0-NEXT: scd $7, 0($1) 1294; MIPS64R6O0-NEXT: beqzc $7, .LBB7_1 1295; MIPS64R6O0-NEXT: .LBB7_3: # %entry 1296; MIPS64R6O0-NEXT: sd $2, 16($sp) # 8-byte Folded Spill 1297; MIPS64R6O0-NEXT: move $2, $6 1298; MIPS64R6O0-NEXT: sd $3, 8($sp) # 8-byte Folded Spill 1299; MIPS64R6O0-NEXT: daddiu $sp, $sp, 32 1300; MIPS64R6O0-NEXT: jrc $ra 1301; 1302; O1-LABEL: AtomicCmpSwap64: 1303; O1: # %bb.0: # %entry 1304; O1-NEXT: daddiu $sp, $sp, -16 1305; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1306; O1-NEXT: daddu $1, $1, $25 1307; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1308; O1-NEXT: sd $5, 8($sp) 1309; O1-NEXT: ld $1, %got_disp(x)($1) 1310; O1-NEXT: .LBB7_1: # %entry 1311; O1-NEXT: # =>This Inner Loop Header: Depth=1 1312; O1-NEXT: lld $2, 0($1) 1313; O1-NEXT: bne $2, $4, .LBB7_3 1314; O1-NEXT: nop 1315; O1-NEXT: # %bb.2: # %entry 1316; O1-NEXT: # in Loop: Header=BB7_1 Depth=1 1317; O1-NEXT: move $3, $5 1318; O1-NEXT: scd $3, 0($1) 1319; O1-NEXT: beqz $3, .LBB7_1 1320; O1-NEXT: nop 1321; O1-NEXT: .LBB7_3: # %entry 1322; O1-NEXT: jr $ra 1323; O1-NEXT: daddiu $sp, $sp, 16 1324; 1325; O2-LABEL: AtomicCmpSwap64: 1326; O2: # %bb.0: # %entry 1327; O2-NEXT: daddiu $sp, $sp, -16 1328; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1329; O2-NEXT: daddu $1, $1, $25 1330; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1331; O2-NEXT: sd $5, 8($sp) 1332; O2-NEXT: ld $1, %got_disp(x)($1) 1333; O2-NEXT: .LBB7_1: # %entry 1334; O2-NEXT: # =>This Inner Loop Header: Depth=1 1335; O2-NEXT: lld $2, 0($1) 1336; O2-NEXT: bne $2, $4, .LBB7_3 1337; O2-NEXT: nop 1338; O2-NEXT: # %bb.2: # %entry 1339; O2-NEXT: # in Loop: Header=BB7_1 Depth=1 1340; O2-NEXT: move $3, $5 1341; O2-NEXT: scd $3, 0($1) 1342; O2-NEXT: beqz $3, .LBB7_1 1343; O2-NEXT: nop 1344; O2-NEXT: .LBB7_3: # %entry 1345; O2-NEXT: jr $ra 1346; O2-NEXT: daddiu $sp, $sp, 16 1347; 1348; O3-LABEL: AtomicCmpSwap64: 1349; O3: # %bb.0: # %entry 1350; O3-NEXT: daddiu $sp, $sp, -16 1351; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1352; O3-NEXT: sd $5, 8($sp) 1353; O3-NEXT: daddu $1, $1, $25 1354; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1355; O3-NEXT: ld $1, %got_disp(x)($1) 1356; O3-NEXT: .LBB7_1: # %entry 1357; O3-NEXT: # =>This Inner Loop Header: Depth=1 1358; O3-NEXT: lld $2, 0($1) 1359; O3-NEXT: bne $2, $4, .LBB7_3 1360; O3-NEXT: nop 1361; O3-NEXT: # %bb.2: # %entry 1362; O3-NEXT: # in Loop: Header=BB7_1 Depth=1 1363; O3-NEXT: move $3, $5 1364; O3-NEXT: scd $3, 0($1) 1365; O3-NEXT: beqz $3, .LBB7_1 1366; O3-NEXT: nop 1367; O3-NEXT: .LBB7_3: # %entry 1368; O3-NEXT: jr $ra 1369; O3-NEXT: daddiu $sp, $sp, 16 1370; 1371; MIPS64EB-LABEL: AtomicCmpSwap64: 1372; MIPS64EB: # %bb.0: # %entry 1373; MIPS64EB-NEXT: daddiu $sp, $sp, -16 1374; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1375; MIPS64EB-NEXT: daddu $1, $1, $25 1376; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1377; MIPS64EB-NEXT: sd $5, 8($sp) 1378; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 1379; MIPS64EB-NEXT: .LBB7_1: # %entry 1380; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 1381; MIPS64EB-NEXT: lld $2, 0($1) 1382; MIPS64EB-NEXT: bne $2, $4, .LBB7_3 1383; MIPS64EB-NEXT: nop 1384; MIPS64EB-NEXT: # %bb.2: # %entry 1385; MIPS64EB-NEXT: # in Loop: Header=BB7_1 Depth=1 1386; MIPS64EB-NEXT: move $3, $5 1387; MIPS64EB-NEXT: scd $3, 0($1) 1388; MIPS64EB-NEXT: beqz $3, .LBB7_1 1389; MIPS64EB-NEXT: nop 1390; MIPS64EB-NEXT: .LBB7_3: # %entry 1391; MIPS64EB-NEXT: jr $ra 1392; MIPS64EB-NEXT: daddiu $sp, $sp, 16 1393entry: 1394 %newval.addr = alloca i64, align 4 1395 store i64 %newval, i64* %newval.addr, align 4 1396 %tmp = load i64, i64* %newval.addr, align 4 1397 %0 = cmpxchg i64* @x, i64 %oldval, i64 %tmp monotonic monotonic 1398 %1 = extractvalue { i64, i1 } %0, 0 1399 ret i64 %1 1400 1401} 1402