1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \ 3; RUN: FileCheck %s -check-prefix=MIPS32 4; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O0 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \ 5; RUN: FileCheck %s -check-prefix=MIPS32O0 6; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r2 -relocation-model=pic -verify-machineinstrs < %s | \ 7; RUN: FileCheck %s -check-prefix=MIPS32R2 8; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \ 9; RUN: FileCheck %s -check-prefix=MIPS32R6 10; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O0 --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \ 11; RUN: FileCheck %s -check-prefix=MIPS32R6O0 12; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips4 -relocation-model=pic -verify-machineinstrs < %s | \ 13; RUN: FileCheck %s -check-prefix=MIPS4 14; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \ 15; RUN: FileCheck %s -check-prefix=MIPS64 16; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r2 -relocation-model=pic -verify-machineinstrs < %s | \ 17; RUN: FileCheck %s -check-prefix=MIPS64R2 18; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs < %s | \ 19; RUN: FileCheck %s -check-prefix=MIPS64R6 20; RUN: llc -mtriple=mips64-unknown-linux-gnu -O0 -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs -verify-machineinstrs < %s | \ 21; RUN: FileCheck %s -check-prefix=MIPS64R6O0 22; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r2 -mattr=micromips -relocation-model=pic -verify-machineinstrs < %s | \ 23; RUN: FileCheck %s -check-prefix=MM32 24 25; We want to verify the produced code is well formed all optimization levels, the rest of the tests which ensure correctness. 26; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O1 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O1 27; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O2 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O2 28; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O3 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O3 29 30; Keep one big-endian check so that we don't reduce testing, but don't add more 31; since endianness doesn't affect the body of the atomic operations. 32; RUN: llc -mtriple=mips-unknown-linux-gnu --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \ 33; RUN: FileCheck %s -check-prefix=MIPS32EB 34 35@x = common global i32 0, align 4 36 37define i32 @AtomicLoadAdd32(i32 signext %incr) nounwind { 38; MIPS32-LABEL: AtomicLoadAdd32: 39; MIPS32: # %bb.0: # %entry 40; MIPS32-NEXT: lui $2, %hi(_gp_disp) 41; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 42; MIPS32-NEXT: addu $1, $2, $25 43; MIPS32-NEXT: lw $1, %got(x)($1) 44; MIPS32-NEXT: $BB0_1: # %entry 45; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 46; MIPS32-NEXT: ll $2, 0($1) 47; MIPS32-NEXT: addu $3, $2, $4 48; MIPS32-NEXT: sc $3, 0($1) 49; MIPS32-NEXT: beqz $3, $BB0_1 50; MIPS32-NEXT: nop 51; MIPS32-NEXT: # %bb.2: # %entry 52; MIPS32-NEXT: jr $ra 53; MIPS32-NEXT: nop 54; 55; MIPS32O0-LABEL: AtomicLoadAdd32: 56; MIPS32O0: # %bb.0: # %entry 57; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 58; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 59; MIPS32O0-NEXT: addu $2, $2, $25 60; MIPS32O0-NEXT: lw $2, %got(x)($2) 61; MIPS32O0-NEXT: $BB0_1: # %entry 62; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 63; MIPS32O0-NEXT: ll $25, 0($2) 64; MIPS32O0-NEXT: addu $1, $25, $4 65; MIPS32O0-NEXT: sc $1, 0($2) 66; MIPS32O0-NEXT: beqz $1, $BB0_1 67; MIPS32O0-NEXT: nop 68; MIPS32O0-NEXT: # %bb.2: # %entry 69; MIPS32O0-NEXT: move $2, $25 70; MIPS32O0-NEXT: jr $ra 71; MIPS32O0-NEXT: nop 72; 73; MIPS32R2-LABEL: AtomicLoadAdd32: 74; MIPS32R2: # %bb.0: # %entry 75; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 76; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 77; MIPS32R2-NEXT: addu $1, $2, $25 78; MIPS32R2-NEXT: lw $1, %got(x)($1) 79; MIPS32R2-NEXT: $BB0_1: # %entry 80; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 81; MIPS32R2-NEXT: ll $2, 0($1) 82; MIPS32R2-NEXT: addu $3, $2, $4 83; MIPS32R2-NEXT: sc $3, 0($1) 84; MIPS32R2-NEXT: beqz $3, $BB0_1 85; MIPS32R2-NEXT: nop 86; MIPS32R2-NEXT: # %bb.2: # %entry 87; MIPS32R2-NEXT: jr $ra 88; MIPS32R2-NEXT: nop 89; 90; MIPS32R6-LABEL: AtomicLoadAdd32: 91; MIPS32R6: # %bb.0: # %entry 92; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 93; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 94; MIPS32R6-NEXT: addu $1, $2, $25 95; MIPS32R6-NEXT: lw $1, %got(x)($1) 96; MIPS32R6-NEXT: $BB0_1: # %entry 97; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 98; MIPS32R6-NEXT: ll $2, 0($1) 99; MIPS32R6-NEXT: addu $3, $2, $4 100; MIPS32R6-NEXT: sc $3, 0($1) 101; MIPS32R6-NEXT: beqzc $3, $BB0_1 102; MIPS32R6-NEXT: nop 103; MIPS32R6-NEXT: # %bb.2: # %entry 104; MIPS32R6-NEXT: jrc $ra 105; 106; MIPS32R6O0-LABEL: AtomicLoadAdd32: 107; MIPS32R6O0: # %bb.0: # %entry 108; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 109; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 110; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 111; MIPS32R6O0-NEXT: addu $2, $2, $25 112; MIPS32R6O0-NEXT: move $25, $4 113; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 114; MIPS32R6O0-NEXT: $BB0_1: # %entry 115; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 116; MIPS32R6O0-NEXT: ll $1, 0($2) 117; MIPS32R6O0-NEXT: addu $3, $1, $4 118; MIPS32R6O0-NEXT: sc $3, 0($2) 119; MIPS32R6O0-NEXT: beqzc $3, $BB0_1 120; MIPS32R6O0-NEXT: # %bb.2: # %entry 121; MIPS32R6O0-NEXT: move $2, $1 122; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 123; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 124; MIPS32R6O0-NEXT: jrc $ra 125; 126; MIPS4-LABEL: AtomicLoadAdd32: 127; MIPS4: # %bb.0: # %entry 128; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 129; MIPS4-NEXT: daddu $1, $1, $25 130; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 131; MIPS4-NEXT: ld $1, %got_disp(x)($1) 132; MIPS4-NEXT: .LBB0_1: # %entry 133; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 134; MIPS4-NEXT: ll $2, 0($1) 135; MIPS4-NEXT: addu $3, $2, $4 136; MIPS4-NEXT: sc $3, 0($1) 137; MIPS4-NEXT: beqz $3, .LBB0_1 138; MIPS4-NEXT: nop 139; MIPS4-NEXT: # %bb.2: # %entry 140; MIPS4-NEXT: jr $ra 141; MIPS4-NEXT: nop 142; 143; MIPS64-LABEL: AtomicLoadAdd32: 144; MIPS64: # %bb.0: # %entry 145; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 146; MIPS64-NEXT: daddu $1, $1, $25 147; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 148; MIPS64-NEXT: ld $1, %got_disp(x)($1) 149; MIPS64-NEXT: .LBB0_1: # %entry 150; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 151; MIPS64-NEXT: ll $2, 0($1) 152; MIPS64-NEXT: addu $3, $2, $4 153; MIPS64-NEXT: sc $3, 0($1) 154; MIPS64-NEXT: beqz $3, .LBB0_1 155; MIPS64-NEXT: nop 156; MIPS64-NEXT: # %bb.2: # %entry 157; MIPS64-NEXT: jr $ra 158; MIPS64-NEXT: nop 159; 160; MIPS64R2-LABEL: AtomicLoadAdd32: 161; MIPS64R2: # %bb.0: # %entry 162; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 163; MIPS64R2-NEXT: daddu $1, $1, $25 164; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 165; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 166; MIPS64R2-NEXT: .LBB0_1: # %entry 167; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 168; MIPS64R2-NEXT: ll $2, 0($1) 169; MIPS64R2-NEXT: addu $3, $2, $4 170; MIPS64R2-NEXT: sc $3, 0($1) 171; MIPS64R2-NEXT: beqz $3, .LBB0_1 172; MIPS64R2-NEXT: nop 173; MIPS64R2-NEXT: # %bb.2: # %entry 174; MIPS64R2-NEXT: jr $ra 175; MIPS64R2-NEXT: nop 176; 177; MIPS64R6-LABEL: AtomicLoadAdd32: 178; MIPS64R6: # %bb.0: # %entry 179; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 180; MIPS64R6-NEXT: daddu $1, $1, $25 181; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 182; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 183; MIPS64R6-NEXT: .LBB0_1: # %entry 184; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 185; MIPS64R6-NEXT: ll $2, 0($1) 186; MIPS64R6-NEXT: addu $3, $2, $4 187; MIPS64R6-NEXT: sc $3, 0($1) 188; MIPS64R6-NEXT: beqzc $3, .LBB0_1 189; MIPS64R6-NEXT: nop 190; MIPS64R6-NEXT: # %bb.2: # %entry 191; MIPS64R6-NEXT: jrc $ra 192; 193; MIPS64R6O0-LABEL: AtomicLoadAdd32: 194; MIPS64R6O0: # %bb.0: # %entry 195; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 196; MIPS64R6O0-NEXT: daddu $1, $1, $25 197; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 198; MIPS64R6O0-NEXT: move $2, $4 199; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 200; MIPS64R6O0-NEXT: .LBB0_1: # %entry 201; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 202; MIPS64R6O0-NEXT: ll $3, 0($1) 203; MIPS64R6O0-NEXT: addu $5, $3, $2 204; MIPS64R6O0-NEXT: sc $5, 0($1) 205; MIPS64R6O0-NEXT: beqzc $5, .LBB0_1 206; MIPS64R6O0-NEXT: # %bb.2: # %entry 207; MIPS64R6O0-NEXT: move $2, $3 208; MIPS64R6O0-NEXT: jrc $ra 209; 210; MM32-LABEL: AtomicLoadAdd32: 211; MM32: # %bb.0: # %entry 212; MM32-NEXT: lui $2, %hi(_gp_disp) 213; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 214; MM32-NEXT: addu $2, $2, $25 215; MM32-NEXT: lw $1, %got(x)($2) 216; MM32-NEXT: $BB0_1: # %entry 217; MM32-NEXT: # =>This Inner Loop Header: Depth=1 218; MM32-NEXT: ll $2, 0($1) 219; MM32-NEXT: addu16 $3, $2, $4 220; MM32-NEXT: sc $3, 0($1) 221; MM32-NEXT: beqzc $3, $BB0_1 222; MM32-NEXT: # %bb.2: # %entry 223; MM32-NEXT: jrc $ra 224; 225; O1-LABEL: AtomicLoadAdd32: 226; O1: # %bb.0: # %entry 227; O1-NEXT: lui $2, %hi(_gp_disp) 228; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 229; O1-NEXT: addu $1, $2, $25 230; O1-NEXT: lw $1, %got(x)($1) 231; O1-NEXT: $BB0_1: # %entry 232; O1-NEXT: # =>This Inner Loop Header: Depth=1 233; O1-NEXT: ll $2, 0($1) 234; O1-NEXT: addu $3, $2, $4 235; O1-NEXT: sc $3, 0($1) 236; O1-NEXT: beqz $3, $BB0_1 237; O1-NEXT: nop 238; O1-NEXT: # %bb.2: # %entry 239; O1-NEXT: jr $ra 240; O1-NEXT: nop 241; 242; O2-LABEL: AtomicLoadAdd32: 243; O2: # %bb.0: # %entry 244; O2-NEXT: lui $2, %hi(_gp_disp) 245; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 246; O2-NEXT: addu $1, $2, $25 247; O2-NEXT: lw $1, %got(x)($1) 248; O2-NEXT: $BB0_1: # %entry 249; O2-NEXT: # =>This Inner Loop Header: Depth=1 250; O2-NEXT: ll $2, 0($1) 251; O2-NEXT: addu $3, $2, $4 252; O2-NEXT: sc $3, 0($1) 253; O2-NEXT: beqz $3, $BB0_1 254; O2-NEXT: nop 255; O2-NEXT: # %bb.2: # %entry 256; O2-NEXT: jr $ra 257; O2-NEXT: nop 258; 259; O3-LABEL: AtomicLoadAdd32: 260; O3: # %bb.0: # %entry 261; O3-NEXT: lui $2, %hi(_gp_disp) 262; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 263; O3-NEXT: addu $1, $2, $25 264; O3-NEXT: lw $1, %got(x)($1) 265; O3-NEXT: $BB0_1: # %entry 266; O3-NEXT: # =>This Inner Loop Header: Depth=1 267; O3-NEXT: ll $2, 0($1) 268; O3-NEXT: addu $3, $2, $4 269; O3-NEXT: sc $3, 0($1) 270; O3-NEXT: beqz $3, $BB0_1 271; O3-NEXT: nop 272; O3-NEXT: # %bb.2: # %entry 273; O3-NEXT: jr $ra 274; O3-NEXT: nop 275; 276; MIPS32EB-LABEL: AtomicLoadAdd32: 277; MIPS32EB: # %bb.0: # %entry 278; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 279; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 280; MIPS32EB-NEXT: addu $1, $2, $25 281; MIPS32EB-NEXT: lw $1, %got(x)($1) 282; MIPS32EB-NEXT: $BB0_1: # %entry 283; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 284; MIPS32EB-NEXT: ll $2, 0($1) 285; MIPS32EB-NEXT: addu $3, $2, $4 286; MIPS32EB-NEXT: sc $3, 0($1) 287; MIPS32EB-NEXT: beqz $3, $BB0_1 288; MIPS32EB-NEXT: nop 289; MIPS32EB-NEXT: # %bb.2: # %entry 290; MIPS32EB-NEXT: jr $ra 291; MIPS32EB-NEXT: nop 292entry: 293 %0 = atomicrmw add i32* @x, i32 %incr monotonic 294 ret i32 %0 295 296} 297 298define i32 @AtomicLoadSub32(i32 signext %incr) nounwind { 299; MIPS32-LABEL: AtomicLoadSub32: 300; MIPS32: # %bb.0: # %entry 301; MIPS32-NEXT: lui $2, %hi(_gp_disp) 302; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 303; MIPS32-NEXT: addu $1, $2, $25 304; MIPS32-NEXT: lw $1, %got(x)($1) 305; MIPS32-NEXT: $BB1_1: # %entry 306; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 307; MIPS32-NEXT: ll $2, 0($1) 308; MIPS32-NEXT: subu $3, $2, $4 309; MIPS32-NEXT: sc $3, 0($1) 310; MIPS32-NEXT: beqz $3, $BB1_1 311; MIPS32-NEXT: nop 312; MIPS32-NEXT: # %bb.2: # %entry 313; MIPS32-NEXT: jr $ra 314; MIPS32-NEXT: nop 315; 316; MIPS32O0-LABEL: AtomicLoadSub32: 317; MIPS32O0: # %bb.0: # %entry 318; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 319; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 320; MIPS32O0-NEXT: addu $2, $2, $25 321; MIPS32O0-NEXT: lw $2, %got(x)($2) 322; MIPS32O0-NEXT: $BB1_1: # %entry 323; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 324; MIPS32O0-NEXT: ll $25, 0($2) 325; MIPS32O0-NEXT: subu $1, $25, $4 326; MIPS32O0-NEXT: sc $1, 0($2) 327; MIPS32O0-NEXT: beqz $1, $BB1_1 328; MIPS32O0-NEXT: nop 329; MIPS32O0-NEXT: # %bb.2: # %entry 330; MIPS32O0-NEXT: move $2, $25 331; MIPS32O0-NEXT: jr $ra 332; MIPS32O0-NEXT: nop 333; 334; MIPS32R2-LABEL: AtomicLoadSub32: 335; MIPS32R2: # %bb.0: # %entry 336; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 337; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 338; MIPS32R2-NEXT: addu $1, $2, $25 339; MIPS32R2-NEXT: lw $1, %got(x)($1) 340; MIPS32R2-NEXT: $BB1_1: # %entry 341; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 342; MIPS32R2-NEXT: ll $2, 0($1) 343; MIPS32R2-NEXT: subu $3, $2, $4 344; MIPS32R2-NEXT: sc $3, 0($1) 345; MIPS32R2-NEXT: beqz $3, $BB1_1 346; MIPS32R2-NEXT: nop 347; MIPS32R2-NEXT: # %bb.2: # %entry 348; MIPS32R2-NEXT: jr $ra 349; MIPS32R2-NEXT: nop 350; 351; MIPS32R6-LABEL: AtomicLoadSub32: 352; MIPS32R6: # %bb.0: # %entry 353; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 354; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 355; MIPS32R6-NEXT: addu $1, $2, $25 356; MIPS32R6-NEXT: lw $1, %got(x)($1) 357; MIPS32R6-NEXT: $BB1_1: # %entry 358; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 359; MIPS32R6-NEXT: ll $2, 0($1) 360; MIPS32R6-NEXT: subu $3, $2, $4 361; MIPS32R6-NEXT: sc $3, 0($1) 362; MIPS32R6-NEXT: beqzc $3, $BB1_1 363; MIPS32R6-NEXT: nop 364; MIPS32R6-NEXT: # %bb.2: # %entry 365; MIPS32R6-NEXT: jrc $ra 366; 367; MIPS32R6O0-LABEL: AtomicLoadSub32: 368; MIPS32R6O0: # %bb.0: # %entry 369; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 370; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 371; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 372; MIPS32R6O0-NEXT: addu $2, $2, $25 373; MIPS32R6O0-NEXT: move $25, $4 374; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 375; MIPS32R6O0-NEXT: $BB1_1: # %entry 376; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 377; MIPS32R6O0-NEXT: ll $1, 0($2) 378; MIPS32R6O0-NEXT: subu $3, $1, $4 379; MIPS32R6O0-NEXT: sc $3, 0($2) 380; MIPS32R6O0-NEXT: beqzc $3, $BB1_1 381; MIPS32R6O0-NEXT: # %bb.2: # %entry 382; MIPS32R6O0-NEXT: move $2, $1 383; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 384; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 385; MIPS32R6O0-NEXT: jrc $ra 386; 387; MIPS4-LABEL: AtomicLoadSub32: 388; MIPS4: # %bb.0: # %entry 389; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 390; MIPS4-NEXT: daddu $1, $1, $25 391; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 392; MIPS4-NEXT: ld $1, %got_disp(x)($1) 393; MIPS4-NEXT: .LBB1_1: # %entry 394; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 395; MIPS4-NEXT: ll $2, 0($1) 396; MIPS4-NEXT: subu $3, $2, $4 397; MIPS4-NEXT: sc $3, 0($1) 398; MIPS4-NEXT: beqz $3, .LBB1_1 399; MIPS4-NEXT: nop 400; MIPS4-NEXT: # %bb.2: # %entry 401; MIPS4-NEXT: jr $ra 402; MIPS4-NEXT: nop 403; 404; MIPS64-LABEL: AtomicLoadSub32: 405; MIPS64: # %bb.0: # %entry 406; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 407; MIPS64-NEXT: daddu $1, $1, $25 408; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 409; MIPS64-NEXT: ld $1, %got_disp(x)($1) 410; MIPS64-NEXT: .LBB1_1: # %entry 411; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 412; MIPS64-NEXT: ll $2, 0($1) 413; MIPS64-NEXT: subu $3, $2, $4 414; MIPS64-NEXT: sc $3, 0($1) 415; MIPS64-NEXT: beqz $3, .LBB1_1 416; MIPS64-NEXT: nop 417; MIPS64-NEXT: # %bb.2: # %entry 418; MIPS64-NEXT: jr $ra 419; MIPS64-NEXT: nop 420; 421; MIPS64R2-LABEL: AtomicLoadSub32: 422; MIPS64R2: # %bb.0: # %entry 423; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 424; MIPS64R2-NEXT: daddu $1, $1, $25 425; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 426; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 427; MIPS64R2-NEXT: .LBB1_1: # %entry 428; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 429; MIPS64R2-NEXT: ll $2, 0($1) 430; MIPS64R2-NEXT: subu $3, $2, $4 431; MIPS64R2-NEXT: sc $3, 0($1) 432; MIPS64R2-NEXT: beqz $3, .LBB1_1 433; MIPS64R2-NEXT: nop 434; MIPS64R2-NEXT: # %bb.2: # %entry 435; MIPS64R2-NEXT: jr $ra 436; MIPS64R2-NEXT: nop 437; 438; MIPS64R6-LABEL: AtomicLoadSub32: 439; MIPS64R6: # %bb.0: # %entry 440; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 441; MIPS64R6-NEXT: daddu $1, $1, $25 442; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 443; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 444; MIPS64R6-NEXT: .LBB1_1: # %entry 445; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 446; MIPS64R6-NEXT: ll $2, 0($1) 447; MIPS64R6-NEXT: subu $3, $2, $4 448; MIPS64R6-NEXT: sc $3, 0($1) 449; MIPS64R6-NEXT: beqzc $3, .LBB1_1 450; MIPS64R6-NEXT: nop 451; MIPS64R6-NEXT: # %bb.2: # %entry 452; MIPS64R6-NEXT: jrc $ra 453; 454; MIPS64R6O0-LABEL: AtomicLoadSub32: 455; MIPS64R6O0: # %bb.0: # %entry 456; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 457; MIPS64R6O0-NEXT: daddu $1, $1, $25 458; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 459; MIPS64R6O0-NEXT: move $2, $4 460; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 461; MIPS64R6O0-NEXT: .LBB1_1: # %entry 462; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 463; MIPS64R6O0-NEXT: ll $3, 0($1) 464; MIPS64R6O0-NEXT: subu $5, $3, $2 465; MIPS64R6O0-NEXT: sc $5, 0($1) 466; MIPS64R6O0-NEXT: beqzc $5, .LBB1_1 467; MIPS64R6O0-NEXT: # %bb.2: # %entry 468; MIPS64R6O0-NEXT: move $2, $3 469; MIPS64R6O0-NEXT: jrc $ra 470; 471; MM32-LABEL: AtomicLoadSub32: 472; MM32: # %bb.0: # %entry 473; MM32-NEXT: lui $2, %hi(_gp_disp) 474; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 475; MM32-NEXT: addu $2, $2, $25 476; MM32-NEXT: lw $1, %got(x)($2) 477; MM32-NEXT: $BB1_1: # %entry 478; MM32-NEXT: # =>This Inner Loop Header: Depth=1 479; MM32-NEXT: ll $2, 0($1) 480; MM32-NEXT: subu16 $3, $2, $4 481; MM32-NEXT: sc $3, 0($1) 482; MM32-NEXT: beqzc $3, $BB1_1 483; MM32-NEXT: # %bb.2: # %entry 484; MM32-NEXT: jrc $ra 485; 486; O1-LABEL: AtomicLoadSub32: 487; O1: # %bb.0: # %entry 488; O1-NEXT: lui $2, %hi(_gp_disp) 489; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 490; O1-NEXT: addu $1, $2, $25 491; O1-NEXT: lw $1, %got(x)($1) 492; O1-NEXT: $BB1_1: # %entry 493; O1-NEXT: # =>This Inner Loop Header: Depth=1 494; O1-NEXT: ll $2, 0($1) 495; O1-NEXT: subu $3, $2, $4 496; O1-NEXT: sc $3, 0($1) 497; O1-NEXT: beqz $3, $BB1_1 498; O1-NEXT: nop 499; O1-NEXT: # %bb.2: # %entry 500; O1-NEXT: jr $ra 501; O1-NEXT: nop 502; 503; O2-LABEL: AtomicLoadSub32: 504; O2: # %bb.0: # %entry 505; O2-NEXT: lui $2, %hi(_gp_disp) 506; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 507; O2-NEXT: addu $1, $2, $25 508; O2-NEXT: lw $1, %got(x)($1) 509; O2-NEXT: $BB1_1: # %entry 510; O2-NEXT: # =>This Inner Loop Header: Depth=1 511; O2-NEXT: ll $2, 0($1) 512; O2-NEXT: subu $3, $2, $4 513; O2-NEXT: sc $3, 0($1) 514; O2-NEXT: beqz $3, $BB1_1 515; O2-NEXT: nop 516; O2-NEXT: # %bb.2: # %entry 517; O2-NEXT: jr $ra 518; O2-NEXT: nop 519; 520; O3-LABEL: AtomicLoadSub32: 521; O3: # %bb.0: # %entry 522; O3-NEXT: lui $2, %hi(_gp_disp) 523; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 524; O3-NEXT: addu $1, $2, $25 525; O3-NEXT: lw $1, %got(x)($1) 526; O3-NEXT: $BB1_1: # %entry 527; O3-NEXT: # =>This Inner Loop Header: Depth=1 528; O3-NEXT: ll $2, 0($1) 529; O3-NEXT: subu $3, $2, $4 530; O3-NEXT: sc $3, 0($1) 531; O3-NEXT: beqz $3, $BB1_1 532; O3-NEXT: nop 533; O3-NEXT: # %bb.2: # %entry 534; O3-NEXT: jr $ra 535; O3-NEXT: nop 536; 537; MIPS32EB-LABEL: AtomicLoadSub32: 538; MIPS32EB: # %bb.0: # %entry 539; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 540; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 541; MIPS32EB-NEXT: addu $1, $2, $25 542; MIPS32EB-NEXT: lw $1, %got(x)($1) 543; MIPS32EB-NEXT: $BB1_1: # %entry 544; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 545; MIPS32EB-NEXT: ll $2, 0($1) 546; MIPS32EB-NEXT: subu $3, $2, $4 547; MIPS32EB-NEXT: sc $3, 0($1) 548; MIPS32EB-NEXT: beqz $3, $BB1_1 549; MIPS32EB-NEXT: nop 550; MIPS32EB-NEXT: # %bb.2: # %entry 551; MIPS32EB-NEXT: jr $ra 552; MIPS32EB-NEXT: nop 553entry: 554 %0 = atomicrmw sub i32* @x, i32 %incr monotonic 555 ret i32 %0 556 557} 558 559define i32 @AtomicLoadXor32(i32 signext %incr) nounwind { 560; MIPS32-LABEL: AtomicLoadXor32: 561; MIPS32: # %bb.0: # %entry 562; MIPS32-NEXT: lui $2, %hi(_gp_disp) 563; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 564; MIPS32-NEXT: addu $1, $2, $25 565; MIPS32-NEXT: lw $1, %got(x)($1) 566; MIPS32-NEXT: $BB2_1: # %entry 567; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 568; MIPS32-NEXT: ll $2, 0($1) 569; MIPS32-NEXT: xor $3, $2, $4 570; MIPS32-NEXT: sc $3, 0($1) 571; MIPS32-NEXT: beqz $3, $BB2_1 572; MIPS32-NEXT: nop 573; MIPS32-NEXT: # %bb.2: # %entry 574; MIPS32-NEXT: jr $ra 575; MIPS32-NEXT: nop 576; 577; MIPS32O0-LABEL: AtomicLoadXor32: 578; MIPS32O0: # %bb.0: # %entry 579; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 580; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 581; MIPS32O0-NEXT: addu $2, $2, $25 582; MIPS32O0-NEXT: lw $2, %got(x)($2) 583; MIPS32O0-NEXT: $BB2_1: # %entry 584; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 585; MIPS32O0-NEXT: ll $25, 0($2) 586; MIPS32O0-NEXT: xor $1, $25, $4 587; MIPS32O0-NEXT: sc $1, 0($2) 588; MIPS32O0-NEXT: beqz $1, $BB2_1 589; MIPS32O0-NEXT: nop 590; MIPS32O0-NEXT: # %bb.2: # %entry 591; MIPS32O0-NEXT: move $2, $25 592; MIPS32O0-NEXT: jr $ra 593; MIPS32O0-NEXT: nop 594; 595; MIPS32R2-LABEL: AtomicLoadXor32: 596; MIPS32R2: # %bb.0: # %entry 597; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 598; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 599; MIPS32R2-NEXT: addu $1, $2, $25 600; MIPS32R2-NEXT: lw $1, %got(x)($1) 601; MIPS32R2-NEXT: $BB2_1: # %entry 602; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 603; MIPS32R2-NEXT: ll $2, 0($1) 604; MIPS32R2-NEXT: xor $3, $2, $4 605; MIPS32R2-NEXT: sc $3, 0($1) 606; MIPS32R2-NEXT: beqz $3, $BB2_1 607; MIPS32R2-NEXT: nop 608; MIPS32R2-NEXT: # %bb.2: # %entry 609; MIPS32R2-NEXT: jr $ra 610; MIPS32R2-NEXT: nop 611; 612; MIPS32R6-LABEL: AtomicLoadXor32: 613; MIPS32R6: # %bb.0: # %entry 614; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 615; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 616; MIPS32R6-NEXT: addu $1, $2, $25 617; MIPS32R6-NEXT: lw $1, %got(x)($1) 618; MIPS32R6-NEXT: $BB2_1: # %entry 619; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 620; MIPS32R6-NEXT: ll $2, 0($1) 621; MIPS32R6-NEXT: xor $3, $2, $4 622; MIPS32R6-NEXT: sc $3, 0($1) 623; MIPS32R6-NEXT: beqzc $3, $BB2_1 624; MIPS32R6-NEXT: nop 625; MIPS32R6-NEXT: # %bb.2: # %entry 626; MIPS32R6-NEXT: jrc $ra 627; 628; MIPS32R6O0-LABEL: AtomicLoadXor32: 629; MIPS32R6O0: # %bb.0: # %entry 630; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 631; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 632; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 633; MIPS32R6O0-NEXT: addu $2, $2, $25 634; MIPS32R6O0-NEXT: move $25, $4 635; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 636; MIPS32R6O0-NEXT: $BB2_1: # %entry 637; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 638; MIPS32R6O0-NEXT: ll $1, 0($2) 639; MIPS32R6O0-NEXT: xor $3, $1, $4 640; MIPS32R6O0-NEXT: sc $3, 0($2) 641; MIPS32R6O0-NEXT: beqzc $3, $BB2_1 642; MIPS32R6O0-NEXT: # %bb.2: # %entry 643; MIPS32R6O0-NEXT: move $2, $1 644; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 645; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 646; MIPS32R6O0-NEXT: jrc $ra 647; 648; MIPS4-LABEL: AtomicLoadXor32: 649; MIPS4: # %bb.0: # %entry 650; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 651; MIPS4-NEXT: daddu $1, $1, $25 652; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 653; MIPS4-NEXT: ld $1, %got_disp(x)($1) 654; MIPS4-NEXT: .LBB2_1: # %entry 655; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 656; MIPS4-NEXT: ll $2, 0($1) 657; MIPS4-NEXT: xor $3, $2, $4 658; MIPS4-NEXT: sc $3, 0($1) 659; MIPS4-NEXT: beqz $3, .LBB2_1 660; MIPS4-NEXT: nop 661; MIPS4-NEXT: # %bb.2: # %entry 662; MIPS4-NEXT: jr $ra 663; MIPS4-NEXT: nop 664; 665; MIPS64-LABEL: AtomicLoadXor32: 666; MIPS64: # %bb.0: # %entry 667; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 668; MIPS64-NEXT: daddu $1, $1, $25 669; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 670; MIPS64-NEXT: ld $1, %got_disp(x)($1) 671; MIPS64-NEXT: .LBB2_1: # %entry 672; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 673; MIPS64-NEXT: ll $2, 0($1) 674; MIPS64-NEXT: xor $3, $2, $4 675; MIPS64-NEXT: sc $3, 0($1) 676; MIPS64-NEXT: beqz $3, .LBB2_1 677; MIPS64-NEXT: nop 678; MIPS64-NEXT: # %bb.2: # %entry 679; MIPS64-NEXT: jr $ra 680; MIPS64-NEXT: nop 681; 682; MIPS64R2-LABEL: AtomicLoadXor32: 683; MIPS64R2: # %bb.0: # %entry 684; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 685; MIPS64R2-NEXT: daddu $1, $1, $25 686; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 687; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 688; MIPS64R2-NEXT: .LBB2_1: # %entry 689; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 690; MIPS64R2-NEXT: ll $2, 0($1) 691; MIPS64R2-NEXT: xor $3, $2, $4 692; MIPS64R2-NEXT: sc $3, 0($1) 693; MIPS64R2-NEXT: beqz $3, .LBB2_1 694; MIPS64R2-NEXT: nop 695; MIPS64R2-NEXT: # %bb.2: # %entry 696; MIPS64R2-NEXT: jr $ra 697; MIPS64R2-NEXT: nop 698; 699; MIPS64R6-LABEL: AtomicLoadXor32: 700; MIPS64R6: # %bb.0: # %entry 701; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 702; MIPS64R6-NEXT: daddu $1, $1, $25 703; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 704; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 705; MIPS64R6-NEXT: .LBB2_1: # %entry 706; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 707; MIPS64R6-NEXT: ll $2, 0($1) 708; MIPS64R6-NEXT: xor $3, $2, $4 709; MIPS64R6-NEXT: sc $3, 0($1) 710; MIPS64R6-NEXT: beqzc $3, .LBB2_1 711; MIPS64R6-NEXT: nop 712; MIPS64R6-NEXT: # %bb.2: # %entry 713; MIPS64R6-NEXT: jrc $ra 714; 715; MIPS64R6O0-LABEL: AtomicLoadXor32: 716; MIPS64R6O0: # %bb.0: # %entry 717; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 718; MIPS64R6O0-NEXT: daddu $1, $1, $25 719; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 720; MIPS64R6O0-NEXT: move $2, $4 721; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 722; MIPS64R6O0-NEXT: .LBB2_1: # %entry 723; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 724; MIPS64R6O0-NEXT: ll $3, 0($1) 725; MIPS64R6O0-NEXT: xor $5, $3, $2 726; MIPS64R6O0-NEXT: sc $5, 0($1) 727; MIPS64R6O0-NEXT: beqzc $5, .LBB2_1 728; MIPS64R6O0-NEXT: # %bb.2: # %entry 729; MIPS64R6O0-NEXT: move $2, $3 730; MIPS64R6O0-NEXT: jrc $ra 731; 732; MM32-LABEL: AtomicLoadXor32: 733; MM32: # %bb.0: # %entry 734; MM32-NEXT: lui $2, %hi(_gp_disp) 735; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 736; MM32-NEXT: addu $2, $2, $25 737; MM32-NEXT: lw $1, %got(x)($2) 738; MM32-NEXT: $BB2_1: # %entry 739; MM32-NEXT: # =>This Inner Loop Header: Depth=1 740; MM32-NEXT: ll $2, 0($1) 741; MM32-NEXT: xor $3, $2, $4 742; MM32-NEXT: sc $3, 0($1) 743; MM32-NEXT: beqzc $3, $BB2_1 744; MM32-NEXT: # %bb.2: # %entry 745; MM32-NEXT: jrc $ra 746; 747; O1-LABEL: AtomicLoadXor32: 748; O1: # %bb.0: # %entry 749; O1-NEXT: lui $2, %hi(_gp_disp) 750; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 751; O1-NEXT: addu $1, $2, $25 752; O1-NEXT: lw $1, %got(x)($1) 753; O1-NEXT: $BB2_1: # %entry 754; O1-NEXT: # =>This Inner Loop Header: Depth=1 755; O1-NEXT: ll $2, 0($1) 756; O1-NEXT: xor $3, $2, $4 757; O1-NEXT: sc $3, 0($1) 758; O1-NEXT: beqz $3, $BB2_1 759; O1-NEXT: nop 760; O1-NEXT: # %bb.2: # %entry 761; O1-NEXT: jr $ra 762; O1-NEXT: nop 763; 764; O2-LABEL: AtomicLoadXor32: 765; O2: # %bb.0: # %entry 766; O2-NEXT: lui $2, %hi(_gp_disp) 767; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 768; O2-NEXT: addu $1, $2, $25 769; O2-NEXT: lw $1, %got(x)($1) 770; O2-NEXT: $BB2_1: # %entry 771; O2-NEXT: # =>This Inner Loop Header: Depth=1 772; O2-NEXT: ll $2, 0($1) 773; O2-NEXT: xor $3, $2, $4 774; O2-NEXT: sc $3, 0($1) 775; O2-NEXT: beqz $3, $BB2_1 776; O2-NEXT: nop 777; O2-NEXT: # %bb.2: # %entry 778; O2-NEXT: jr $ra 779; O2-NEXT: nop 780; 781; O3-LABEL: AtomicLoadXor32: 782; O3: # %bb.0: # %entry 783; O3-NEXT: lui $2, %hi(_gp_disp) 784; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 785; O3-NEXT: addu $1, $2, $25 786; O3-NEXT: lw $1, %got(x)($1) 787; O3-NEXT: $BB2_1: # %entry 788; O3-NEXT: # =>This Inner Loop Header: Depth=1 789; O3-NEXT: ll $2, 0($1) 790; O3-NEXT: xor $3, $2, $4 791; O3-NEXT: sc $3, 0($1) 792; O3-NEXT: beqz $3, $BB2_1 793; O3-NEXT: nop 794; O3-NEXT: # %bb.2: # %entry 795; O3-NEXT: jr $ra 796; O3-NEXT: nop 797; 798; MIPS32EB-LABEL: AtomicLoadXor32: 799; MIPS32EB: # %bb.0: # %entry 800; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 801; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 802; MIPS32EB-NEXT: addu $1, $2, $25 803; MIPS32EB-NEXT: lw $1, %got(x)($1) 804; MIPS32EB-NEXT: $BB2_1: # %entry 805; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 806; MIPS32EB-NEXT: ll $2, 0($1) 807; MIPS32EB-NEXT: xor $3, $2, $4 808; MIPS32EB-NEXT: sc $3, 0($1) 809; MIPS32EB-NEXT: beqz $3, $BB2_1 810; MIPS32EB-NEXT: nop 811; MIPS32EB-NEXT: # %bb.2: # %entry 812; MIPS32EB-NEXT: jr $ra 813; MIPS32EB-NEXT: nop 814entry: 815 %0 = atomicrmw xor i32* @x, i32 %incr monotonic 816 ret i32 %0 817} 818 819define i32 @AtomicLoadOr32(i32 signext %incr) nounwind { 820; MIPS32-LABEL: AtomicLoadOr32: 821; MIPS32: # %bb.0: # %entry 822; MIPS32-NEXT: lui $2, %hi(_gp_disp) 823; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 824; MIPS32-NEXT: addu $1, $2, $25 825; MIPS32-NEXT: lw $1, %got(x)($1) 826; MIPS32-NEXT: $BB3_1: # %entry 827; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 828; MIPS32-NEXT: ll $2, 0($1) 829; MIPS32-NEXT: or $3, $2, $4 830; MIPS32-NEXT: sc $3, 0($1) 831; MIPS32-NEXT: beqz $3, $BB3_1 832; MIPS32-NEXT: nop 833; MIPS32-NEXT: # %bb.2: # %entry 834; MIPS32-NEXT: jr $ra 835; MIPS32-NEXT: nop 836; 837; MIPS32O0-LABEL: AtomicLoadOr32: 838; MIPS32O0: # %bb.0: # %entry 839; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 840; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 841; MIPS32O0-NEXT: addu $2, $2, $25 842; MIPS32O0-NEXT: lw $2, %got(x)($2) 843; MIPS32O0-NEXT: $BB3_1: # %entry 844; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 845; MIPS32O0-NEXT: ll $25, 0($2) 846; MIPS32O0-NEXT: or $1, $25, $4 847; MIPS32O0-NEXT: sc $1, 0($2) 848; MIPS32O0-NEXT: beqz $1, $BB3_1 849; MIPS32O0-NEXT: nop 850; MIPS32O0-NEXT: # %bb.2: # %entry 851; MIPS32O0-NEXT: move $2, $25 852; MIPS32O0-NEXT: jr $ra 853; MIPS32O0-NEXT: nop 854; 855; MIPS32R2-LABEL: AtomicLoadOr32: 856; MIPS32R2: # %bb.0: # %entry 857; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 858; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 859; MIPS32R2-NEXT: addu $1, $2, $25 860; MIPS32R2-NEXT: lw $1, %got(x)($1) 861; MIPS32R2-NEXT: $BB3_1: # %entry 862; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 863; MIPS32R2-NEXT: ll $2, 0($1) 864; MIPS32R2-NEXT: or $3, $2, $4 865; MIPS32R2-NEXT: sc $3, 0($1) 866; MIPS32R2-NEXT: beqz $3, $BB3_1 867; MIPS32R2-NEXT: nop 868; MIPS32R2-NEXT: # %bb.2: # %entry 869; MIPS32R2-NEXT: jr $ra 870; MIPS32R2-NEXT: nop 871; 872; MIPS32R6-LABEL: AtomicLoadOr32: 873; MIPS32R6: # %bb.0: # %entry 874; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 875; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 876; MIPS32R6-NEXT: addu $1, $2, $25 877; MIPS32R6-NEXT: lw $1, %got(x)($1) 878; MIPS32R6-NEXT: $BB3_1: # %entry 879; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 880; MIPS32R6-NEXT: ll $2, 0($1) 881; MIPS32R6-NEXT: or $3, $2, $4 882; MIPS32R6-NEXT: sc $3, 0($1) 883; MIPS32R6-NEXT: beqzc $3, $BB3_1 884; MIPS32R6-NEXT: nop 885; MIPS32R6-NEXT: # %bb.2: # %entry 886; MIPS32R6-NEXT: jrc $ra 887; 888; MIPS32R6O0-LABEL: AtomicLoadOr32: 889; MIPS32R6O0: # %bb.0: # %entry 890; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 891; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 892; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 893; MIPS32R6O0-NEXT: addu $2, $2, $25 894; MIPS32R6O0-NEXT: move $25, $4 895; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 896; MIPS32R6O0-NEXT: $BB3_1: # %entry 897; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 898; MIPS32R6O0-NEXT: ll $1, 0($2) 899; MIPS32R6O0-NEXT: or $3, $1, $4 900; MIPS32R6O0-NEXT: sc $3, 0($2) 901; MIPS32R6O0-NEXT: beqzc $3, $BB3_1 902; MIPS32R6O0-NEXT: # %bb.2: # %entry 903; MIPS32R6O0-NEXT: move $2, $1 904; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 905; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 906; MIPS32R6O0-NEXT: jrc $ra 907; 908; MIPS4-LABEL: AtomicLoadOr32: 909; MIPS4: # %bb.0: # %entry 910; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 911; MIPS4-NEXT: daddu $1, $1, $25 912; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 913; MIPS4-NEXT: ld $1, %got_disp(x)($1) 914; MIPS4-NEXT: .LBB3_1: # %entry 915; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 916; MIPS4-NEXT: ll $2, 0($1) 917; MIPS4-NEXT: or $3, $2, $4 918; MIPS4-NEXT: sc $3, 0($1) 919; MIPS4-NEXT: beqz $3, .LBB3_1 920; MIPS4-NEXT: nop 921; MIPS4-NEXT: # %bb.2: # %entry 922; MIPS4-NEXT: jr $ra 923; MIPS4-NEXT: nop 924; 925; MIPS64-LABEL: AtomicLoadOr32: 926; MIPS64: # %bb.0: # %entry 927; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 928; MIPS64-NEXT: daddu $1, $1, $25 929; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 930; MIPS64-NEXT: ld $1, %got_disp(x)($1) 931; MIPS64-NEXT: .LBB3_1: # %entry 932; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 933; MIPS64-NEXT: ll $2, 0($1) 934; MIPS64-NEXT: or $3, $2, $4 935; MIPS64-NEXT: sc $3, 0($1) 936; MIPS64-NEXT: beqz $3, .LBB3_1 937; MIPS64-NEXT: nop 938; MIPS64-NEXT: # %bb.2: # %entry 939; MIPS64-NEXT: jr $ra 940; MIPS64-NEXT: nop 941; 942; MIPS64R2-LABEL: AtomicLoadOr32: 943; MIPS64R2: # %bb.0: # %entry 944; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 945; MIPS64R2-NEXT: daddu $1, $1, $25 946; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 947; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 948; MIPS64R2-NEXT: .LBB3_1: # %entry 949; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 950; MIPS64R2-NEXT: ll $2, 0($1) 951; MIPS64R2-NEXT: or $3, $2, $4 952; MIPS64R2-NEXT: sc $3, 0($1) 953; MIPS64R2-NEXT: beqz $3, .LBB3_1 954; MIPS64R2-NEXT: nop 955; MIPS64R2-NEXT: # %bb.2: # %entry 956; MIPS64R2-NEXT: jr $ra 957; MIPS64R2-NEXT: nop 958; 959; MIPS64R6-LABEL: AtomicLoadOr32: 960; MIPS64R6: # %bb.0: # %entry 961; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 962; MIPS64R6-NEXT: daddu $1, $1, $25 963; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 964; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 965; MIPS64R6-NEXT: .LBB3_1: # %entry 966; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 967; MIPS64R6-NEXT: ll $2, 0($1) 968; MIPS64R6-NEXT: or $3, $2, $4 969; MIPS64R6-NEXT: sc $3, 0($1) 970; MIPS64R6-NEXT: beqzc $3, .LBB3_1 971; MIPS64R6-NEXT: nop 972; MIPS64R6-NEXT: # %bb.2: # %entry 973; MIPS64R6-NEXT: jrc $ra 974; 975; MIPS64R6O0-LABEL: AtomicLoadOr32: 976; MIPS64R6O0: # %bb.0: # %entry 977; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 978; MIPS64R6O0-NEXT: daddu $1, $1, $25 979; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 980; MIPS64R6O0-NEXT: move $2, $4 981; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 982; MIPS64R6O0-NEXT: .LBB3_1: # %entry 983; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 984; MIPS64R6O0-NEXT: ll $3, 0($1) 985; MIPS64R6O0-NEXT: or $5, $3, $2 986; MIPS64R6O0-NEXT: sc $5, 0($1) 987; MIPS64R6O0-NEXT: beqzc $5, .LBB3_1 988; MIPS64R6O0-NEXT: # %bb.2: # %entry 989; MIPS64R6O0-NEXT: move $2, $3 990; MIPS64R6O0-NEXT: jrc $ra 991; 992; MM32-LABEL: AtomicLoadOr32: 993; MM32: # %bb.0: # %entry 994; MM32-NEXT: lui $2, %hi(_gp_disp) 995; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 996; MM32-NEXT: addu $2, $2, $25 997; MM32-NEXT: lw $1, %got(x)($2) 998; MM32-NEXT: $BB3_1: # %entry 999; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1000; MM32-NEXT: ll $2, 0($1) 1001; MM32-NEXT: or $3, $2, $4 1002; MM32-NEXT: sc $3, 0($1) 1003; MM32-NEXT: beqzc $3, $BB3_1 1004; MM32-NEXT: # %bb.2: # %entry 1005; MM32-NEXT: jrc $ra 1006; 1007; O1-LABEL: AtomicLoadOr32: 1008; O1: # %bb.0: # %entry 1009; O1-NEXT: lui $2, %hi(_gp_disp) 1010; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1011; O1-NEXT: addu $1, $2, $25 1012; O1-NEXT: lw $1, %got(x)($1) 1013; O1-NEXT: $BB3_1: # %entry 1014; O1-NEXT: # =>This Inner Loop Header: Depth=1 1015; O1-NEXT: ll $2, 0($1) 1016; O1-NEXT: or $3, $2, $4 1017; O1-NEXT: sc $3, 0($1) 1018; O1-NEXT: beqz $3, $BB3_1 1019; O1-NEXT: nop 1020; O1-NEXT: # %bb.2: # %entry 1021; O1-NEXT: jr $ra 1022; O1-NEXT: nop 1023; 1024; O2-LABEL: AtomicLoadOr32: 1025; O2: # %bb.0: # %entry 1026; O2-NEXT: lui $2, %hi(_gp_disp) 1027; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1028; O2-NEXT: addu $1, $2, $25 1029; O2-NEXT: lw $1, %got(x)($1) 1030; O2-NEXT: $BB3_1: # %entry 1031; O2-NEXT: # =>This Inner Loop Header: Depth=1 1032; O2-NEXT: ll $2, 0($1) 1033; O2-NEXT: or $3, $2, $4 1034; O2-NEXT: sc $3, 0($1) 1035; O2-NEXT: beqz $3, $BB3_1 1036; O2-NEXT: nop 1037; O2-NEXT: # %bb.2: # %entry 1038; O2-NEXT: jr $ra 1039; O2-NEXT: nop 1040; 1041; O3-LABEL: AtomicLoadOr32: 1042; O3: # %bb.0: # %entry 1043; O3-NEXT: lui $2, %hi(_gp_disp) 1044; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1045; O3-NEXT: addu $1, $2, $25 1046; O3-NEXT: lw $1, %got(x)($1) 1047; O3-NEXT: $BB3_1: # %entry 1048; O3-NEXT: # =>This Inner Loop Header: Depth=1 1049; O3-NEXT: ll $2, 0($1) 1050; O3-NEXT: or $3, $2, $4 1051; O3-NEXT: sc $3, 0($1) 1052; O3-NEXT: beqz $3, $BB3_1 1053; O3-NEXT: nop 1054; O3-NEXT: # %bb.2: # %entry 1055; O3-NEXT: jr $ra 1056; O3-NEXT: nop 1057; 1058; MIPS32EB-LABEL: AtomicLoadOr32: 1059; MIPS32EB: # %bb.0: # %entry 1060; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1061; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1062; MIPS32EB-NEXT: addu $1, $2, $25 1063; MIPS32EB-NEXT: lw $1, %got(x)($1) 1064; MIPS32EB-NEXT: $BB3_1: # %entry 1065; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1066; MIPS32EB-NEXT: ll $2, 0($1) 1067; MIPS32EB-NEXT: or $3, $2, $4 1068; MIPS32EB-NEXT: sc $3, 0($1) 1069; MIPS32EB-NEXT: beqz $3, $BB3_1 1070; MIPS32EB-NEXT: nop 1071; MIPS32EB-NEXT: # %bb.2: # %entry 1072; MIPS32EB-NEXT: jr $ra 1073; MIPS32EB-NEXT: nop 1074entry: 1075 %0 = atomicrmw or i32* @x, i32 %incr monotonic 1076 ret i32 %0 1077} 1078 1079define i32 @AtomicLoadAnd32(i32 signext %incr) nounwind { 1080; MIPS32-LABEL: AtomicLoadAnd32: 1081; MIPS32: # %bb.0: # %entry 1082; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1083; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1084; MIPS32-NEXT: addu $1, $2, $25 1085; MIPS32-NEXT: lw $1, %got(x)($1) 1086; MIPS32-NEXT: $BB4_1: # %entry 1087; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1088; MIPS32-NEXT: ll $2, 0($1) 1089; MIPS32-NEXT: and $3, $2, $4 1090; MIPS32-NEXT: sc $3, 0($1) 1091; MIPS32-NEXT: beqz $3, $BB4_1 1092; MIPS32-NEXT: nop 1093; MIPS32-NEXT: # %bb.2: # %entry 1094; MIPS32-NEXT: jr $ra 1095; MIPS32-NEXT: nop 1096; 1097; MIPS32O0-LABEL: AtomicLoadAnd32: 1098; MIPS32O0: # %bb.0: # %entry 1099; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1100; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1101; MIPS32O0-NEXT: addu $2, $2, $25 1102; MIPS32O0-NEXT: lw $2, %got(x)($2) 1103; MIPS32O0-NEXT: $BB4_1: # %entry 1104; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1105; MIPS32O0-NEXT: ll $25, 0($2) 1106; MIPS32O0-NEXT: and $1, $25, $4 1107; MIPS32O0-NEXT: sc $1, 0($2) 1108; MIPS32O0-NEXT: beqz $1, $BB4_1 1109; MIPS32O0-NEXT: nop 1110; MIPS32O0-NEXT: # %bb.2: # %entry 1111; MIPS32O0-NEXT: move $2, $25 1112; MIPS32O0-NEXT: jr $ra 1113; MIPS32O0-NEXT: nop 1114; 1115; MIPS32R2-LABEL: AtomicLoadAnd32: 1116; MIPS32R2: # %bb.0: # %entry 1117; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1118; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1119; MIPS32R2-NEXT: addu $1, $2, $25 1120; MIPS32R2-NEXT: lw $1, %got(x)($1) 1121; MIPS32R2-NEXT: $BB4_1: # %entry 1122; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1123; MIPS32R2-NEXT: ll $2, 0($1) 1124; MIPS32R2-NEXT: and $3, $2, $4 1125; MIPS32R2-NEXT: sc $3, 0($1) 1126; MIPS32R2-NEXT: beqz $3, $BB4_1 1127; MIPS32R2-NEXT: nop 1128; MIPS32R2-NEXT: # %bb.2: # %entry 1129; MIPS32R2-NEXT: jr $ra 1130; MIPS32R2-NEXT: nop 1131; 1132; MIPS32R6-LABEL: AtomicLoadAnd32: 1133; MIPS32R6: # %bb.0: # %entry 1134; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1135; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1136; MIPS32R6-NEXT: addu $1, $2, $25 1137; MIPS32R6-NEXT: lw $1, %got(x)($1) 1138; MIPS32R6-NEXT: $BB4_1: # %entry 1139; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1140; MIPS32R6-NEXT: ll $2, 0($1) 1141; MIPS32R6-NEXT: and $3, $2, $4 1142; MIPS32R6-NEXT: sc $3, 0($1) 1143; MIPS32R6-NEXT: beqzc $3, $BB4_1 1144; MIPS32R6-NEXT: nop 1145; MIPS32R6-NEXT: # %bb.2: # %entry 1146; MIPS32R6-NEXT: jrc $ra 1147; 1148; MIPS32R6O0-LABEL: AtomicLoadAnd32: 1149; MIPS32R6O0: # %bb.0: # %entry 1150; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1151; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1152; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 1153; MIPS32R6O0-NEXT: addu $2, $2, $25 1154; MIPS32R6O0-NEXT: move $25, $4 1155; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 1156; MIPS32R6O0-NEXT: $BB4_1: # %entry 1157; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1158; MIPS32R6O0-NEXT: ll $1, 0($2) 1159; MIPS32R6O0-NEXT: and $3, $1, $4 1160; MIPS32R6O0-NEXT: sc $3, 0($2) 1161; MIPS32R6O0-NEXT: beqzc $3, $BB4_1 1162; MIPS32R6O0-NEXT: # %bb.2: # %entry 1163; MIPS32R6O0-NEXT: move $2, $1 1164; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 1165; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 1166; MIPS32R6O0-NEXT: jrc $ra 1167; 1168; MIPS4-LABEL: AtomicLoadAnd32: 1169; MIPS4: # %bb.0: # %entry 1170; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1171; MIPS4-NEXT: daddu $1, $1, $25 1172; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1173; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1174; MIPS4-NEXT: .LBB4_1: # %entry 1175; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1176; MIPS4-NEXT: ll $2, 0($1) 1177; MIPS4-NEXT: and $3, $2, $4 1178; MIPS4-NEXT: sc $3, 0($1) 1179; MIPS4-NEXT: beqz $3, .LBB4_1 1180; MIPS4-NEXT: nop 1181; MIPS4-NEXT: # %bb.2: # %entry 1182; MIPS4-NEXT: jr $ra 1183; MIPS4-NEXT: nop 1184; 1185; MIPS64-LABEL: AtomicLoadAnd32: 1186; MIPS64: # %bb.0: # %entry 1187; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1188; MIPS64-NEXT: daddu $1, $1, $25 1189; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1190; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1191; MIPS64-NEXT: .LBB4_1: # %entry 1192; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1193; MIPS64-NEXT: ll $2, 0($1) 1194; MIPS64-NEXT: and $3, $2, $4 1195; MIPS64-NEXT: sc $3, 0($1) 1196; MIPS64-NEXT: beqz $3, .LBB4_1 1197; MIPS64-NEXT: nop 1198; MIPS64-NEXT: # %bb.2: # %entry 1199; MIPS64-NEXT: jr $ra 1200; MIPS64-NEXT: nop 1201; 1202; MIPS64R2-LABEL: AtomicLoadAnd32: 1203; MIPS64R2: # %bb.0: # %entry 1204; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1205; MIPS64R2-NEXT: daddu $1, $1, $25 1206; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1207; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1208; MIPS64R2-NEXT: .LBB4_1: # %entry 1209; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1210; MIPS64R2-NEXT: ll $2, 0($1) 1211; MIPS64R2-NEXT: and $3, $2, $4 1212; MIPS64R2-NEXT: sc $3, 0($1) 1213; MIPS64R2-NEXT: beqz $3, .LBB4_1 1214; MIPS64R2-NEXT: nop 1215; MIPS64R2-NEXT: # %bb.2: # %entry 1216; MIPS64R2-NEXT: jr $ra 1217; MIPS64R2-NEXT: nop 1218; 1219; MIPS64R6-LABEL: AtomicLoadAnd32: 1220; MIPS64R6: # %bb.0: # %entry 1221; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1222; MIPS64R6-NEXT: daddu $1, $1, $25 1223; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1224; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1225; MIPS64R6-NEXT: .LBB4_1: # %entry 1226; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1227; MIPS64R6-NEXT: ll $2, 0($1) 1228; MIPS64R6-NEXT: and $3, $2, $4 1229; MIPS64R6-NEXT: sc $3, 0($1) 1230; MIPS64R6-NEXT: beqzc $3, .LBB4_1 1231; MIPS64R6-NEXT: nop 1232; MIPS64R6-NEXT: # %bb.2: # %entry 1233; MIPS64R6-NEXT: jrc $ra 1234; 1235; MIPS64R6O0-LABEL: AtomicLoadAnd32: 1236; MIPS64R6O0: # %bb.0: # %entry 1237; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1238; MIPS64R6O0-NEXT: daddu $1, $1, $25 1239; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1240; MIPS64R6O0-NEXT: move $2, $4 1241; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1242; MIPS64R6O0-NEXT: .LBB4_1: # %entry 1243; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1244; MIPS64R6O0-NEXT: ll $3, 0($1) 1245; MIPS64R6O0-NEXT: and $5, $3, $2 1246; MIPS64R6O0-NEXT: sc $5, 0($1) 1247; MIPS64R6O0-NEXT: beqzc $5, .LBB4_1 1248; MIPS64R6O0-NEXT: # %bb.2: # %entry 1249; MIPS64R6O0-NEXT: move $2, $3 1250; MIPS64R6O0-NEXT: jrc $ra 1251; 1252; MM32-LABEL: AtomicLoadAnd32: 1253; MM32: # %bb.0: # %entry 1254; MM32-NEXT: lui $2, %hi(_gp_disp) 1255; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1256; MM32-NEXT: addu $2, $2, $25 1257; MM32-NEXT: lw $1, %got(x)($2) 1258; MM32-NEXT: $BB4_1: # %entry 1259; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1260; MM32-NEXT: ll $2, 0($1) 1261; MM32-NEXT: and $3, $2, $4 1262; MM32-NEXT: sc $3, 0($1) 1263; MM32-NEXT: beqzc $3, $BB4_1 1264; MM32-NEXT: # %bb.2: # %entry 1265; MM32-NEXT: jrc $ra 1266; 1267; O1-LABEL: AtomicLoadAnd32: 1268; O1: # %bb.0: # %entry 1269; O1-NEXT: lui $2, %hi(_gp_disp) 1270; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1271; O1-NEXT: addu $1, $2, $25 1272; O1-NEXT: lw $1, %got(x)($1) 1273; O1-NEXT: $BB4_1: # %entry 1274; O1-NEXT: # =>This Inner Loop Header: Depth=1 1275; O1-NEXT: ll $2, 0($1) 1276; O1-NEXT: and $3, $2, $4 1277; O1-NEXT: sc $3, 0($1) 1278; O1-NEXT: beqz $3, $BB4_1 1279; O1-NEXT: nop 1280; O1-NEXT: # %bb.2: # %entry 1281; O1-NEXT: jr $ra 1282; O1-NEXT: nop 1283; 1284; O2-LABEL: AtomicLoadAnd32: 1285; O2: # %bb.0: # %entry 1286; O2-NEXT: lui $2, %hi(_gp_disp) 1287; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1288; O2-NEXT: addu $1, $2, $25 1289; O2-NEXT: lw $1, %got(x)($1) 1290; O2-NEXT: $BB4_1: # %entry 1291; O2-NEXT: # =>This Inner Loop Header: Depth=1 1292; O2-NEXT: ll $2, 0($1) 1293; O2-NEXT: and $3, $2, $4 1294; O2-NEXT: sc $3, 0($1) 1295; O2-NEXT: beqz $3, $BB4_1 1296; O2-NEXT: nop 1297; O2-NEXT: # %bb.2: # %entry 1298; O2-NEXT: jr $ra 1299; O2-NEXT: nop 1300; 1301; O3-LABEL: AtomicLoadAnd32: 1302; O3: # %bb.0: # %entry 1303; O3-NEXT: lui $2, %hi(_gp_disp) 1304; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1305; O3-NEXT: addu $1, $2, $25 1306; O3-NEXT: lw $1, %got(x)($1) 1307; O3-NEXT: $BB4_1: # %entry 1308; O3-NEXT: # =>This Inner Loop Header: Depth=1 1309; O3-NEXT: ll $2, 0($1) 1310; O3-NEXT: and $3, $2, $4 1311; O3-NEXT: sc $3, 0($1) 1312; O3-NEXT: beqz $3, $BB4_1 1313; O3-NEXT: nop 1314; O3-NEXT: # %bb.2: # %entry 1315; O3-NEXT: jr $ra 1316; O3-NEXT: nop 1317; 1318; MIPS32EB-LABEL: AtomicLoadAnd32: 1319; MIPS32EB: # %bb.0: # %entry 1320; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1321; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1322; MIPS32EB-NEXT: addu $1, $2, $25 1323; MIPS32EB-NEXT: lw $1, %got(x)($1) 1324; MIPS32EB-NEXT: $BB4_1: # %entry 1325; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1326; MIPS32EB-NEXT: ll $2, 0($1) 1327; MIPS32EB-NEXT: and $3, $2, $4 1328; MIPS32EB-NEXT: sc $3, 0($1) 1329; MIPS32EB-NEXT: beqz $3, $BB4_1 1330; MIPS32EB-NEXT: nop 1331; MIPS32EB-NEXT: # %bb.2: # %entry 1332; MIPS32EB-NEXT: jr $ra 1333; MIPS32EB-NEXT: nop 1334entry: 1335 %0 = atomicrmw and i32* @x, i32 %incr monotonic 1336 ret i32 %0 1337} 1338 1339define i32 @AtomicLoadNand32(i32 signext %incr) nounwind { 1340; MIPS32-LABEL: AtomicLoadNand32: 1341; MIPS32: # %bb.0: # %entry 1342; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1343; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1344; MIPS32-NEXT: addu $1, $2, $25 1345; MIPS32-NEXT: lw $1, %got(x)($1) 1346; MIPS32-NEXT: $BB5_1: # %entry 1347; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1348; MIPS32-NEXT: ll $2, 0($1) 1349; MIPS32-NEXT: and $3, $2, $4 1350; MIPS32-NEXT: nor $3, $zero, $3 1351; MIPS32-NEXT: sc $3, 0($1) 1352; MIPS32-NEXT: beqz $3, $BB5_1 1353; MIPS32-NEXT: nop 1354; MIPS32-NEXT: # %bb.2: # %entry 1355; MIPS32-NEXT: jr $ra 1356; MIPS32-NEXT: nop 1357; 1358; MIPS32O0-LABEL: AtomicLoadNand32: 1359; MIPS32O0: # %bb.0: # %entry 1360; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1361; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1362; MIPS32O0-NEXT: addu $2, $2, $25 1363; MIPS32O0-NEXT: lw $2, %got(x)($2) 1364; MIPS32O0-NEXT: $BB5_1: # %entry 1365; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1366; MIPS32O0-NEXT: ll $25, 0($2) 1367; MIPS32O0-NEXT: and $1, $25, $4 1368; MIPS32O0-NEXT: nor $1, $zero, $1 1369; MIPS32O0-NEXT: sc $1, 0($2) 1370; MIPS32O0-NEXT: beqz $1, $BB5_1 1371; MIPS32O0-NEXT: nop 1372; MIPS32O0-NEXT: # %bb.2: # %entry 1373; MIPS32O0-NEXT: move $2, $25 1374; MIPS32O0-NEXT: jr $ra 1375; MIPS32O0-NEXT: nop 1376; 1377; MIPS32R2-LABEL: AtomicLoadNand32: 1378; MIPS32R2: # %bb.0: # %entry 1379; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1380; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1381; MIPS32R2-NEXT: addu $1, $2, $25 1382; MIPS32R2-NEXT: lw $1, %got(x)($1) 1383; MIPS32R2-NEXT: $BB5_1: # %entry 1384; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1385; MIPS32R2-NEXT: ll $2, 0($1) 1386; MIPS32R2-NEXT: and $3, $2, $4 1387; MIPS32R2-NEXT: nor $3, $zero, $3 1388; MIPS32R2-NEXT: sc $3, 0($1) 1389; MIPS32R2-NEXT: beqz $3, $BB5_1 1390; MIPS32R2-NEXT: nop 1391; MIPS32R2-NEXT: # %bb.2: # %entry 1392; MIPS32R2-NEXT: jr $ra 1393; MIPS32R2-NEXT: nop 1394; 1395; MIPS32R6-LABEL: AtomicLoadNand32: 1396; MIPS32R6: # %bb.0: # %entry 1397; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1398; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1399; MIPS32R6-NEXT: addu $1, $2, $25 1400; MIPS32R6-NEXT: lw $1, %got(x)($1) 1401; MIPS32R6-NEXT: $BB5_1: # %entry 1402; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1403; MIPS32R6-NEXT: ll $2, 0($1) 1404; MIPS32R6-NEXT: and $3, $2, $4 1405; MIPS32R6-NEXT: nor $3, $zero, $3 1406; MIPS32R6-NEXT: sc $3, 0($1) 1407; MIPS32R6-NEXT: beqzc $3, $BB5_1 1408; MIPS32R6-NEXT: nop 1409; MIPS32R6-NEXT: # %bb.2: # %entry 1410; MIPS32R6-NEXT: jrc $ra 1411; 1412; MIPS32R6O0-LABEL: AtomicLoadNand32: 1413; MIPS32R6O0: # %bb.0: # %entry 1414; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1415; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1416; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 1417; MIPS32R6O0-NEXT: addu $2, $2, $25 1418; MIPS32R6O0-NEXT: move $25, $4 1419; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 1420; MIPS32R6O0-NEXT: $BB5_1: # %entry 1421; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1422; MIPS32R6O0-NEXT: ll $1, 0($2) 1423; MIPS32R6O0-NEXT: and $3, $1, $4 1424; MIPS32R6O0-NEXT: nor $3, $zero, $3 1425; MIPS32R6O0-NEXT: sc $3, 0($2) 1426; MIPS32R6O0-NEXT: beqzc $3, $BB5_1 1427; MIPS32R6O0-NEXT: # %bb.2: # %entry 1428; MIPS32R6O0-NEXT: move $2, $1 1429; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 1430; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 1431; MIPS32R6O0-NEXT: jrc $ra 1432; 1433; MIPS4-LABEL: AtomicLoadNand32: 1434; MIPS4: # %bb.0: # %entry 1435; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1436; MIPS4-NEXT: daddu $1, $1, $25 1437; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1438; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1439; MIPS4-NEXT: .LBB5_1: # %entry 1440; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1441; MIPS4-NEXT: ll $2, 0($1) 1442; MIPS4-NEXT: and $3, $2, $4 1443; MIPS4-NEXT: nor $3, $zero, $3 1444; MIPS4-NEXT: sc $3, 0($1) 1445; MIPS4-NEXT: beqz $3, .LBB5_1 1446; MIPS4-NEXT: nop 1447; MIPS4-NEXT: # %bb.2: # %entry 1448; MIPS4-NEXT: jr $ra 1449; MIPS4-NEXT: nop 1450; 1451; MIPS64-LABEL: AtomicLoadNand32: 1452; MIPS64: # %bb.0: # %entry 1453; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1454; MIPS64-NEXT: daddu $1, $1, $25 1455; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1456; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1457; MIPS64-NEXT: .LBB5_1: # %entry 1458; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1459; MIPS64-NEXT: ll $2, 0($1) 1460; MIPS64-NEXT: and $3, $2, $4 1461; MIPS64-NEXT: nor $3, $zero, $3 1462; MIPS64-NEXT: sc $3, 0($1) 1463; MIPS64-NEXT: beqz $3, .LBB5_1 1464; MIPS64-NEXT: nop 1465; MIPS64-NEXT: # %bb.2: # %entry 1466; MIPS64-NEXT: jr $ra 1467; MIPS64-NEXT: nop 1468; 1469; MIPS64R2-LABEL: AtomicLoadNand32: 1470; MIPS64R2: # %bb.0: # %entry 1471; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1472; MIPS64R2-NEXT: daddu $1, $1, $25 1473; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1474; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1475; MIPS64R2-NEXT: .LBB5_1: # %entry 1476; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1477; MIPS64R2-NEXT: ll $2, 0($1) 1478; MIPS64R2-NEXT: and $3, $2, $4 1479; MIPS64R2-NEXT: nor $3, $zero, $3 1480; MIPS64R2-NEXT: sc $3, 0($1) 1481; MIPS64R2-NEXT: beqz $3, .LBB5_1 1482; MIPS64R2-NEXT: nop 1483; MIPS64R2-NEXT: # %bb.2: # %entry 1484; MIPS64R2-NEXT: jr $ra 1485; MIPS64R2-NEXT: nop 1486; 1487; MIPS64R6-LABEL: AtomicLoadNand32: 1488; MIPS64R6: # %bb.0: # %entry 1489; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1490; MIPS64R6-NEXT: daddu $1, $1, $25 1491; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1492; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1493; MIPS64R6-NEXT: .LBB5_1: # %entry 1494; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1495; MIPS64R6-NEXT: ll $2, 0($1) 1496; MIPS64R6-NEXT: and $3, $2, $4 1497; MIPS64R6-NEXT: nor $3, $zero, $3 1498; MIPS64R6-NEXT: sc $3, 0($1) 1499; MIPS64R6-NEXT: beqzc $3, .LBB5_1 1500; MIPS64R6-NEXT: nop 1501; MIPS64R6-NEXT: # %bb.2: # %entry 1502; MIPS64R6-NEXT: jrc $ra 1503; 1504; MIPS64R6O0-LABEL: AtomicLoadNand32: 1505; MIPS64R6O0: # %bb.0: # %entry 1506; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1507; MIPS64R6O0-NEXT: daddu $1, $1, $25 1508; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1509; MIPS64R6O0-NEXT: move $2, $4 1510; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1511; MIPS64R6O0-NEXT: .LBB5_1: # %entry 1512; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1513; MIPS64R6O0-NEXT: ll $3, 0($1) 1514; MIPS64R6O0-NEXT: and $5, $3, $2 1515; MIPS64R6O0-NEXT: nor $5, $zero, $5 1516; MIPS64R6O0-NEXT: sc $5, 0($1) 1517; MIPS64R6O0-NEXT: beqzc $5, .LBB5_1 1518; MIPS64R6O0-NEXT: # %bb.2: # %entry 1519; MIPS64R6O0-NEXT: move $2, $3 1520; MIPS64R6O0-NEXT: jrc $ra 1521; 1522; MM32-LABEL: AtomicLoadNand32: 1523; MM32: # %bb.0: # %entry 1524; MM32-NEXT: lui $2, %hi(_gp_disp) 1525; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1526; MM32-NEXT: addu $2, $2, $25 1527; MM32-NEXT: lw $1, %got(x)($2) 1528; MM32-NEXT: $BB5_1: # %entry 1529; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1530; MM32-NEXT: ll $2, 0($1) 1531; MM32-NEXT: and $3, $2, $4 1532; MM32-NEXT: nor $3, $zero, $3 1533; MM32-NEXT: sc $3, 0($1) 1534; MM32-NEXT: beqzc $3, $BB5_1 1535; MM32-NEXT: # %bb.2: # %entry 1536; MM32-NEXT: jrc $ra 1537; 1538; O1-LABEL: AtomicLoadNand32: 1539; O1: # %bb.0: # %entry 1540; O1-NEXT: lui $2, %hi(_gp_disp) 1541; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1542; O1-NEXT: addu $1, $2, $25 1543; O1-NEXT: lw $1, %got(x)($1) 1544; O1-NEXT: $BB5_1: # %entry 1545; O1-NEXT: # =>This Inner Loop Header: Depth=1 1546; O1-NEXT: ll $2, 0($1) 1547; O1-NEXT: and $3, $2, $4 1548; O1-NEXT: nor $3, $zero, $3 1549; O1-NEXT: sc $3, 0($1) 1550; O1-NEXT: beqz $3, $BB5_1 1551; O1-NEXT: nop 1552; O1-NEXT: # %bb.2: # %entry 1553; O1-NEXT: jr $ra 1554; O1-NEXT: nop 1555; 1556; O2-LABEL: AtomicLoadNand32: 1557; O2: # %bb.0: # %entry 1558; O2-NEXT: lui $2, %hi(_gp_disp) 1559; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1560; O2-NEXT: addu $1, $2, $25 1561; O2-NEXT: lw $1, %got(x)($1) 1562; O2-NEXT: $BB5_1: # %entry 1563; O2-NEXT: # =>This Inner Loop Header: Depth=1 1564; O2-NEXT: ll $2, 0($1) 1565; O2-NEXT: and $3, $2, $4 1566; O2-NEXT: nor $3, $zero, $3 1567; O2-NEXT: sc $3, 0($1) 1568; O2-NEXT: beqz $3, $BB5_1 1569; O2-NEXT: nop 1570; O2-NEXT: # %bb.2: # %entry 1571; O2-NEXT: jr $ra 1572; O2-NEXT: nop 1573; 1574; O3-LABEL: AtomicLoadNand32: 1575; O3: # %bb.0: # %entry 1576; O3-NEXT: lui $2, %hi(_gp_disp) 1577; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1578; O3-NEXT: addu $1, $2, $25 1579; O3-NEXT: lw $1, %got(x)($1) 1580; O3-NEXT: $BB5_1: # %entry 1581; O3-NEXT: # =>This Inner Loop Header: Depth=1 1582; O3-NEXT: ll $2, 0($1) 1583; O3-NEXT: and $3, $2, $4 1584; O3-NEXT: nor $3, $zero, $3 1585; O3-NEXT: sc $3, 0($1) 1586; O3-NEXT: beqz $3, $BB5_1 1587; O3-NEXT: nop 1588; O3-NEXT: # %bb.2: # %entry 1589; O3-NEXT: jr $ra 1590; O3-NEXT: nop 1591; 1592; MIPS32EB-LABEL: AtomicLoadNand32: 1593; MIPS32EB: # %bb.0: # %entry 1594; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1595; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1596; MIPS32EB-NEXT: addu $1, $2, $25 1597; MIPS32EB-NEXT: lw $1, %got(x)($1) 1598; MIPS32EB-NEXT: $BB5_1: # %entry 1599; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1600; MIPS32EB-NEXT: ll $2, 0($1) 1601; MIPS32EB-NEXT: and $3, $2, $4 1602; MIPS32EB-NEXT: nor $3, $zero, $3 1603; MIPS32EB-NEXT: sc $3, 0($1) 1604; MIPS32EB-NEXT: beqz $3, $BB5_1 1605; MIPS32EB-NEXT: nop 1606; MIPS32EB-NEXT: # %bb.2: # %entry 1607; MIPS32EB-NEXT: jr $ra 1608; MIPS32EB-NEXT: nop 1609entry: 1610 %0 = atomicrmw nand i32* @x, i32 %incr monotonic 1611 ret i32 %0 1612 1613} 1614 1615define i32 @AtomicSwap32(i32 signext %newval) nounwind { 1616; MIPS32-LABEL: AtomicSwap32: 1617; MIPS32: # %bb.0: # %entry 1618; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1619; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1620; MIPS32-NEXT: addiu $sp, $sp, -8 1621; MIPS32-NEXT: addu $1, $2, $25 1622; MIPS32-NEXT: sw $4, 4($sp) 1623; MIPS32-NEXT: lw $1, %got(x)($1) 1624; MIPS32-NEXT: $BB6_1: # %entry 1625; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1626; MIPS32-NEXT: ll $2, 0($1) 1627; MIPS32-NEXT: move $3, $4 1628; MIPS32-NEXT: sc $3, 0($1) 1629; MIPS32-NEXT: beqz $3, $BB6_1 1630; MIPS32-NEXT: nop 1631; MIPS32-NEXT: # %bb.2: # %entry 1632; MIPS32-NEXT: jr $ra 1633; MIPS32-NEXT: addiu $sp, $sp, 8 1634; 1635; MIPS32O0-LABEL: AtomicSwap32: 1636; MIPS32O0: # %bb.0: # %entry 1637; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1638; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1639; MIPS32O0-NEXT: addiu $sp, $sp, -8 1640; MIPS32O0-NEXT: addu $2, $2, $25 1641; MIPS32O0-NEXT: sw $4, 4($sp) 1642; MIPS32O0-NEXT: lw $4, 4($sp) 1643; MIPS32O0-NEXT: lw $2, %got(x)($2) 1644; MIPS32O0-NEXT: $BB6_1: # %entry 1645; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1646; MIPS32O0-NEXT: ll $25, 0($2) 1647; MIPS32O0-NEXT: move $1, $4 1648; MIPS32O0-NEXT: sc $1, 0($2) 1649; MIPS32O0-NEXT: beqz $1, $BB6_1 1650; MIPS32O0-NEXT: nop 1651; MIPS32O0-NEXT: # %bb.2: # %entry 1652; MIPS32O0-NEXT: move $2, $25 1653; MIPS32O0-NEXT: addiu $sp, $sp, 8 1654; MIPS32O0-NEXT: jr $ra 1655; MIPS32O0-NEXT: nop 1656; 1657; MIPS32R2-LABEL: AtomicSwap32: 1658; MIPS32R2: # %bb.0: # %entry 1659; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1660; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1661; MIPS32R2-NEXT: addiu $sp, $sp, -8 1662; MIPS32R2-NEXT: addu $1, $2, $25 1663; MIPS32R2-NEXT: sw $4, 4($sp) 1664; MIPS32R2-NEXT: lw $1, %got(x)($1) 1665; MIPS32R2-NEXT: $BB6_1: # %entry 1666; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1667; MIPS32R2-NEXT: ll $2, 0($1) 1668; MIPS32R2-NEXT: move $3, $4 1669; MIPS32R2-NEXT: sc $3, 0($1) 1670; MIPS32R2-NEXT: beqz $3, $BB6_1 1671; MIPS32R2-NEXT: nop 1672; MIPS32R2-NEXT: # %bb.2: # %entry 1673; MIPS32R2-NEXT: jr $ra 1674; MIPS32R2-NEXT: addiu $sp, $sp, 8 1675; 1676; MIPS32R6-LABEL: AtomicSwap32: 1677; MIPS32R6: # %bb.0: # %entry 1678; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1679; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1680; MIPS32R6-NEXT: addiu $sp, $sp, -8 1681; MIPS32R6-NEXT: addu $1, $2, $25 1682; MIPS32R6-NEXT: sw $4, 4($sp) 1683; MIPS32R6-NEXT: lw $1, %got(x)($1) 1684; MIPS32R6-NEXT: $BB6_1: # %entry 1685; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1686; MIPS32R6-NEXT: ll $2, 0($1) 1687; MIPS32R6-NEXT: move $3, $4 1688; MIPS32R6-NEXT: sc $3, 0($1) 1689; MIPS32R6-NEXT: beqzc $3, $BB6_1 1690; MIPS32R6-NEXT: nop 1691; MIPS32R6-NEXT: # %bb.2: # %entry 1692; MIPS32R6-NEXT: jr $ra 1693; MIPS32R6-NEXT: addiu $sp, $sp, 8 1694; 1695; MIPS32R6O0-LABEL: AtomicSwap32: 1696; MIPS32R6O0: # %bb.0: # %entry 1697; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1698; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1699; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 1700; MIPS32R6O0-NEXT: addu $2, $2, $25 1701; MIPS32R6O0-NEXT: move $25, $4 1702; MIPS32R6O0-NEXT: sw $4, 4($sp) 1703; MIPS32R6O0-NEXT: lw $4, 4($sp) 1704; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 1705; MIPS32R6O0-NEXT: $BB6_1: # %entry 1706; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1707; MIPS32R6O0-NEXT: ll $1, 0($2) 1708; MIPS32R6O0-NEXT: move $3, $4 1709; MIPS32R6O0-NEXT: sc $3, 0($2) 1710; MIPS32R6O0-NEXT: beqzc $3, $BB6_1 1711; MIPS32R6O0-NEXT: # %bb.2: # %entry 1712; MIPS32R6O0-NEXT: move $2, $1 1713; MIPS32R6O0-NEXT: sw $25, 0($sp) # 4-byte Folded Spill 1714; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 1715; MIPS32R6O0-NEXT: jrc $ra 1716; 1717; MIPS4-LABEL: AtomicSwap32: 1718; MIPS4: # %bb.0: # %entry 1719; MIPS4-NEXT: daddiu $sp, $sp, -16 1720; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1721; MIPS4-NEXT: daddu $1, $1, $25 1722; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1723; MIPS4-NEXT: sw $4, 12($sp) 1724; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1725; MIPS4-NEXT: .LBB6_1: # %entry 1726; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1727; MIPS4-NEXT: ll $2, 0($1) 1728; MIPS4-NEXT: move $3, $4 1729; MIPS4-NEXT: sc $3, 0($1) 1730; MIPS4-NEXT: beqz $3, .LBB6_1 1731; MIPS4-NEXT: nop 1732; MIPS4-NEXT: # %bb.2: # %entry 1733; MIPS4-NEXT: jr $ra 1734; MIPS4-NEXT: daddiu $sp, $sp, 16 1735; 1736; MIPS64-LABEL: AtomicSwap32: 1737; MIPS64: # %bb.0: # %entry 1738; MIPS64-NEXT: daddiu $sp, $sp, -16 1739; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1740; MIPS64-NEXT: daddu $1, $1, $25 1741; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1742; MIPS64-NEXT: sw $4, 12($sp) 1743; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1744; MIPS64-NEXT: .LBB6_1: # %entry 1745; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1746; MIPS64-NEXT: ll $2, 0($1) 1747; MIPS64-NEXT: move $3, $4 1748; MIPS64-NEXT: sc $3, 0($1) 1749; MIPS64-NEXT: beqz $3, .LBB6_1 1750; MIPS64-NEXT: nop 1751; MIPS64-NEXT: # %bb.2: # %entry 1752; MIPS64-NEXT: jr $ra 1753; MIPS64-NEXT: daddiu $sp, $sp, 16 1754; 1755; MIPS64R2-LABEL: AtomicSwap32: 1756; MIPS64R2: # %bb.0: # %entry 1757; MIPS64R2-NEXT: daddiu $sp, $sp, -16 1758; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1759; MIPS64R2-NEXT: daddu $1, $1, $25 1760; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1761; MIPS64R2-NEXT: sw $4, 12($sp) 1762; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1763; MIPS64R2-NEXT: .LBB6_1: # %entry 1764; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1765; MIPS64R2-NEXT: ll $2, 0($1) 1766; MIPS64R2-NEXT: move $3, $4 1767; MIPS64R2-NEXT: sc $3, 0($1) 1768; MIPS64R2-NEXT: beqz $3, .LBB6_1 1769; MIPS64R2-NEXT: nop 1770; MIPS64R2-NEXT: # %bb.2: # %entry 1771; MIPS64R2-NEXT: jr $ra 1772; MIPS64R2-NEXT: daddiu $sp, $sp, 16 1773; 1774; MIPS64R6-LABEL: AtomicSwap32: 1775; MIPS64R6: # %bb.0: # %entry 1776; MIPS64R6-NEXT: daddiu $sp, $sp, -16 1777; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1778; MIPS64R6-NEXT: daddu $1, $1, $25 1779; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1780; MIPS64R6-NEXT: sw $4, 12($sp) 1781; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1782; MIPS64R6-NEXT: .LBB6_1: # %entry 1783; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1784; MIPS64R6-NEXT: ll $2, 0($1) 1785; MIPS64R6-NEXT: move $3, $4 1786; MIPS64R6-NEXT: sc $3, 0($1) 1787; MIPS64R6-NEXT: beqzc $3, .LBB6_1 1788; MIPS64R6-NEXT: nop 1789; MIPS64R6-NEXT: # %bb.2: # %entry 1790; MIPS64R6-NEXT: jr $ra 1791; MIPS64R6-NEXT: daddiu $sp, $sp, 16 1792; 1793; MIPS64R6O0-LABEL: AtomicSwap32: 1794; MIPS64R6O0: # %bb.0: # %entry 1795; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 1796; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1797; MIPS64R6O0-NEXT: daddu $1, $1, $25 1798; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1799; MIPS64R6O0-NEXT: move $2, $4 1800; MIPS64R6O0-NEXT: sw $2, 12($sp) 1801; MIPS64R6O0-NEXT: lw $2, 12($sp) 1802; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1803; MIPS64R6O0-NEXT: .LBB6_1: # %entry 1804; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1805; MIPS64R6O0-NEXT: ll $3, 0($1) 1806; MIPS64R6O0-NEXT: move $5, $2 1807; MIPS64R6O0-NEXT: sc $5, 0($1) 1808; MIPS64R6O0-NEXT: beqzc $5, .LBB6_1 1809; MIPS64R6O0-NEXT: # %bb.2: # %entry 1810; MIPS64R6O0-NEXT: move $2, $3 1811; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 1812; MIPS64R6O0-NEXT: jrc $ra 1813; 1814; MM32-LABEL: AtomicSwap32: 1815; MM32: # %bb.0: # %entry 1816; MM32-NEXT: lui $2, %hi(_gp_disp) 1817; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1818; MM32-NEXT: addiu $sp, $sp, -8 1819; MM32-NEXT: addu $2, $2, $25 1820; MM32-NEXT: sw $4, 4($sp) 1821; MM32-NEXT: lw $1, %got(x)($2) 1822; MM32-NEXT: $BB6_1: # %entry 1823; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1824; MM32-NEXT: ll $2, 0($1) 1825; MM32-NEXT: move $3, $4 1826; MM32-NEXT: sc $3, 0($1) 1827; MM32-NEXT: beqzc $3, $BB6_1 1828; MM32-NEXT: # %bb.2: # %entry 1829; MM32-NEXT: addiusp 8 1830; MM32-NEXT: jrc $ra 1831; 1832; O1-LABEL: AtomicSwap32: 1833; O1: # %bb.0: # %entry 1834; O1-NEXT: lui $2, %hi(_gp_disp) 1835; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1836; O1-NEXT: addiu $sp, $sp, -8 1837; O1-NEXT: addu $1, $2, $25 1838; O1-NEXT: sw $4, 4($sp) 1839; O1-NEXT: lw $1, %got(x)($1) 1840; O1-NEXT: $BB6_1: # %entry 1841; O1-NEXT: # =>This Inner Loop Header: Depth=1 1842; O1-NEXT: ll $2, 0($1) 1843; O1-NEXT: move $3, $4 1844; O1-NEXT: sc $3, 0($1) 1845; O1-NEXT: beqz $3, $BB6_1 1846; O1-NEXT: nop 1847; O1-NEXT: # %bb.2: # %entry 1848; O1-NEXT: jr $ra 1849; O1-NEXT: addiu $sp, $sp, 8 1850; 1851; O2-LABEL: AtomicSwap32: 1852; O2: # %bb.0: # %entry 1853; O2-NEXT: lui $2, %hi(_gp_disp) 1854; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1855; O2-NEXT: addiu $sp, $sp, -8 1856; O2-NEXT: addu $1, $2, $25 1857; O2-NEXT: sw $4, 4($sp) 1858; O2-NEXT: lw $1, %got(x)($1) 1859; O2-NEXT: $BB6_1: # %entry 1860; O2-NEXT: # =>This Inner Loop Header: Depth=1 1861; O2-NEXT: ll $2, 0($1) 1862; O2-NEXT: move $3, $4 1863; O2-NEXT: sc $3, 0($1) 1864; O2-NEXT: beqz $3, $BB6_1 1865; O2-NEXT: nop 1866; O2-NEXT: # %bb.2: # %entry 1867; O2-NEXT: jr $ra 1868; O2-NEXT: addiu $sp, $sp, 8 1869; 1870; O3-LABEL: AtomicSwap32: 1871; O3: # %bb.0: # %entry 1872; O3-NEXT: lui $2, %hi(_gp_disp) 1873; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1874; O3-NEXT: addiu $sp, $sp, -8 1875; O3-NEXT: addu $1, $2, $25 1876; O3-NEXT: sw $4, 4($sp) 1877; O3-NEXT: lw $1, %got(x)($1) 1878; O3-NEXT: $BB6_1: # %entry 1879; O3-NEXT: # =>This Inner Loop Header: Depth=1 1880; O3-NEXT: ll $2, 0($1) 1881; O3-NEXT: move $3, $4 1882; O3-NEXT: sc $3, 0($1) 1883; O3-NEXT: beqz $3, $BB6_1 1884; O3-NEXT: nop 1885; O3-NEXT: # %bb.2: # %entry 1886; O3-NEXT: jr $ra 1887; O3-NEXT: addiu $sp, $sp, 8 1888; 1889; MIPS32EB-LABEL: AtomicSwap32: 1890; MIPS32EB: # %bb.0: # %entry 1891; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1892; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1893; MIPS32EB-NEXT: addiu $sp, $sp, -8 1894; MIPS32EB-NEXT: addu $1, $2, $25 1895; MIPS32EB-NEXT: sw $4, 4($sp) 1896; MIPS32EB-NEXT: lw $1, %got(x)($1) 1897; MIPS32EB-NEXT: $BB6_1: # %entry 1898; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1899; MIPS32EB-NEXT: ll $2, 0($1) 1900; MIPS32EB-NEXT: move $3, $4 1901; MIPS32EB-NEXT: sc $3, 0($1) 1902; MIPS32EB-NEXT: beqz $3, $BB6_1 1903; MIPS32EB-NEXT: nop 1904; MIPS32EB-NEXT: # %bb.2: # %entry 1905; MIPS32EB-NEXT: jr $ra 1906; MIPS32EB-NEXT: addiu $sp, $sp, 8 1907entry: 1908 %newval.addr = alloca i32, align 4 1909 store i32 %newval, i32* %newval.addr, align 4 1910 %tmp = load i32, i32* %newval.addr, align 4 1911 %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic 1912 ret i32 %0 1913 1914} 1915 1916define i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind { 1917; MIPS32-LABEL: AtomicCmpSwap32: 1918; MIPS32: # %bb.0: # %entry 1919; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1920; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1921; MIPS32-NEXT: addiu $sp, $sp, -8 1922; MIPS32-NEXT: addu $1, $2, $25 1923; MIPS32-NEXT: sw $5, 4($sp) 1924; MIPS32-NEXT: lw $1, %got(x)($1) 1925; MIPS32-NEXT: $BB7_1: # %entry 1926; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1927; MIPS32-NEXT: ll $2, 0($1) 1928; MIPS32-NEXT: bne $2, $4, $BB7_3 1929; MIPS32-NEXT: nop 1930; MIPS32-NEXT: # %bb.2: # %entry 1931; MIPS32-NEXT: # in Loop: Header=BB7_1 Depth=1 1932; MIPS32-NEXT: move $3, $5 1933; MIPS32-NEXT: sc $3, 0($1) 1934; MIPS32-NEXT: beqz $3, $BB7_1 1935; MIPS32-NEXT: nop 1936; MIPS32-NEXT: $BB7_3: # %entry 1937; MIPS32-NEXT: jr $ra 1938; MIPS32-NEXT: addiu $sp, $sp, 8 1939; 1940; MIPS32O0-LABEL: AtomicCmpSwap32: 1941; MIPS32O0: # %bb.0: # %entry 1942; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1943; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1944; MIPS32O0-NEXT: addiu $sp, $sp, -16 1945; MIPS32O0-NEXT: addu $2, $2, $25 1946; MIPS32O0-NEXT: sw $5, 12($sp) 1947; MIPS32O0-NEXT: lw $5, 12($sp) 1948; MIPS32O0-NEXT: lw $2, %got(x)($2) 1949; MIPS32O0-NEXT: lw $25, 8($sp) # 4-byte Folded Reload 1950; MIPS32O0-NEXT: move $1, $4 1951; MIPS32O0-NEXT: $BB7_1: # %entry 1952; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1953; MIPS32O0-NEXT: ll $3, 0($2) 1954; MIPS32O0-NEXT: bne $3, $1, $BB7_3 1955; MIPS32O0-NEXT: nop 1956; MIPS32O0-NEXT: # %bb.2: # %entry 1957; MIPS32O0-NEXT: # in Loop: Header=BB7_1 Depth=1 1958; MIPS32O0-NEXT: move $6, $5 1959; MIPS32O0-NEXT: sc $6, 0($2) 1960; MIPS32O0-NEXT: beqz $6, $BB7_1 1961; MIPS32O0-NEXT: nop 1962; MIPS32O0-NEXT: $BB7_3: # %entry 1963; MIPS32O0-NEXT: xor $1, $3, $4 1964; MIPS32O0-NEXT: sltiu $1, $1, 1 1965; MIPS32O0-NEXT: move $2, $3 1966; MIPS32O0-NEXT: sw $3, 8($sp) # 4-byte Folded Spill 1967; MIPS32O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 1968; MIPS32O0-NEXT: sw $1, 0($sp) # 4-byte Folded Spill 1969; MIPS32O0-NEXT: addiu $sp, $sp, 16 1970; MIPS32O0-NEXT: jr $ra 1971; MIPS32O0-NEXT: nop 1972; 1973; MIPS32R2-LABEL: AtomicCmpSwap32: 1974; MIPS32R2: # %bb.0: # %entry 1975; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1976; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1977; MIPS32R2-NEXT: addiu $sp, $sp, -8 1978; MIPS32R2-NEXT: addu $1, $2, $25 1979; MIPS32R2-NEXT: sw $5, 4($sp) 1980; MIPS32R2-NEXT: lw $1, %got(x)($1) 1981; MIPS32R2-NEXT: $BB7_1: # %entry 1982; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1983; MIPS32R2-NEXT: ll $2, 0($1) 1984; MIPS32R2-NEXT: bne $2, $4, $BB7_3 1985; MIPS32R2-NEXT: nop 1986; MIPS32R2-NEXT: # %bb.2: # %entry 1987; MIPS32R2-NEXT: # in Loop: Header=BB7_1 Depth=1 1988; MIPS32R2-NEXT: move $3, $5 1989; MIPS32R2-NEXT: sc $3, 0($1) 1990; MIPS32R2-NEXT: beqz $3, $BB7_1 1991; MIPS32R2-NEXT: nop 1992; MIPS32R2-NEXT: $BB7_3: # %entry 1993; MIPS32R2-NEXT: jr $ra 1994; MIPS32R2-NEXT: addiu $sp, $sp, 8 1995; 1996; MIPS32R6-LABEL: AtomicCmpSwap32: 1997; MIPS32R6: # %bb.0: # %entry 1998; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1999; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 2000; MIPS32R6-NEXT: addiu $sp, $sp, -8 2001; MIPS32R6-NEXT: addu $1, $2, $25 2002; MIPS32R6-NEXT: sw $5, 4($sp) 2003; MIPS32R6-NEXT: lw $1, %got(x)($1) 2004; MIPS32R6-NEXT: $BB7_1: # %entry 2005; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 2006; MIPS32R6-NEXT: ll $2, 0($1) 2007; MIPS32R6-NEXT: bnec $2, $4, $BB7_3 2008; MIPS32R6-NEXT: # %bb.2: # %entry 2009; MIPS32R6-NEXT: # in Loop: Header=BB7_1 Depth=1 2010; MIPS32R6-NEXT: move $3, $5 2011; MIPS32R6-NEXT: sc $3, 0($1) 2012; MIPS32R6-NEXT: beqzc $3, $BB7_1 2013; MIPS32R6-NEXT: nop 2014; MIPS32R6-NEXT: $BB7_3: # %entry 2015; MIPS32R6-NEXT: jr $ra 2016; MIPS32R6-NEXT: addiu $sp, $sp, 8 2017; 2018; MIPS32R6O0-LABEL: AtomicCmpSwap32: 2019; MIPS32R6O0: # %bb.0: # %entry 2020; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 2021; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2022; MIPS32R6O0-NEXT: addiu $sp, $sp, -24 2023; MIPS32R6O0-NEXT: addu $2, $2, $25 2024; MIPS32R6O0-NEXT: move $25, $5 2025; MIPS32R6O0-NEXT: move $1, $4 2026; MIPS32R6O0-NEXT: sw $5, 20($sp) 2027; MIPS32R6O0-NEXT: lw $5, 20($sp) 2028; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 2029; MIPS32R6O0-NEXT: lw $3, 16($sp) # 4-byte Folded Reload 2030; MIPS32R6O0-NEXT: $BB7_1: # %entry 2031; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2032; MIPS32R6O0-NEXT: ll $6, 0($2) 2033; MIPS32R6O0-NEXT: bnec $6, $4, $BB7_3 2034; MIPS32R6O0-NEXT: # %bb.2: # %entry 2035; MIPS32R6O0-NEXT: # in Loop: Header=BB7_1 Depth=1 2036; MIPS32R6O0-NEXT: move $7, $5 2037; MIPS32R6O0-NEXT: sc $7, 0($2) 2038; MIPS32R6O0-NEXT: beqzc $7, $BB7_1 2039; MIPS32R6O0-NEXT: $BB7_3: # %entry 2040; MIPS32R6O0-NEXT: move $2, $6 2041; MIPS32R6O0-NEXT: sw $6, 16($sp) # 4-byte Folded Spill 2042; MIPS32R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 2043; MIPS32R6O0-NEXT: sw $3, 8($sp) # 4-byte Folded Spill 2044; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 2045; MIPS32R6O0-NEXT: addiu $sp, $sp, 24 2046; MIPS32R6O0-NEXT: jrc $ra 2047; 2048; MIPS4-LABEL: AtomicCmpSwap32: 2049; MIPS4: # %bb.0: # %entry 2050; MIPS4-NEXT: daddiu $sp, $sp, -16 2051; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2052; MIPS4-NEXT: daddu $1, $1, $25 2053; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2054; MIPS4-NEXT: sw $5, 12($sp) 2055; MIPS4-NEXT: ld $1, %got_disp(x)($1) 2056; MIPS4-NEXT: .LBB7_1: # %entry 2057; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 2058; MIPS4-NEXT: ll $2, 0($1) 2059; MIPS4-NEXT: bne $2, $4, .LBB7_3 2060; MIPS4-NEXT: nop 2061; MIPS4-NEXT: # %bb.2: # %entry 2062; MIPS4-NEXT: # in Loop: Header=BB7_1 Depth=1 2063; MIPS4-NEXT: move $3, $5 2064; MIPS4-NEXT: sc $3, 0($1) 2065; MIPS4-NEXT: beqz $3, .LBB7_1 2066; MIPS4-NEXT: nop 2067; MIPS4-NEXT: .LBB7_3: # %entry 2068; MIPS4-NEXT: jr $ra 2069; MIPS4-NEXT: daddiu $sp, $sp, 16 2070; 2071; MIPS64-LABEL: AtomicCmpSwap32: 2072; MIPS64: # %bb.0: # %entry 2073; MIPS64-NEXT: daddiu $sp, $sp, -16 2074; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2075; MIPS64-NEXT: daddu $1, $1, $25 2076; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2077; MIPS64-NEXT: sw $5, 12($sp) 2078; MIPS64-NEXT: ld $1, %got_disp(x)($1) 2079; MIPS64-NEXT: .LBB7_1: # %entry 2080; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 2081; MIPS64-NEXT: ll $2, 0($1) 2082; MIPS64-NEXT: bne $2, $4, .LBB7_3 2083; MIPS64-NEXT: nop 2084; MIPS64-NEXT: # %bb.2: # %entry 2085; MIPS64-NEXT: # in Loop: Header=BB7_1 Depth=1 2086; MIPS64-NEXT: move $3, $5 2087; MIPS64-NEXT: sc $3, 0($1) 2088; MIPS64-NEXT: beqz $3, .LBB7_1 2089; MIPS64-NEXT: nop 2090; MIPS64-NEXT: .LBB7_3: # %entry 2091; MIPS64-NEXT: jr $ra 2092; MIPS64-NEXT: daddiu $sp, $sp, 16 2093; 2094; MIPS64R2-LABEL: AtomicCmpSwap32: 2095; MIPS64R2: # %bb.0: # %entry 2096; MIPS64R2-NEXT: daddiu $sp, $sp, -16 2097; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2098; MIPS64R2-NEXT: daddu $1, $1, $25 2099; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2100; MIPS64R2-NEXT: sw $5, 12($sp) 2101; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 2102; MIPS64R2-NEXT: .LBB7_1: # %entry 2103; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 2104; MIPS64R2-NEXT: ll $2, 0($1) 2105; MIPS64R2-NEXT: bne $2, $4, .LBB7_3 2106; MIPS64R2-NEXT: nop 2107; MIPS64R2-NEXT: # %bb.2: # %entry 2108; MIPS64R2-NEXT: # in Loop: Header=BB7_1 Depth=1 2109; MIPS64R2-NEXT: move $3, $5 2110; MIPS64R2-NEXT: sc $3, 0($1) 2111; MIPS64R2-NEXT: beqz $3, .LBB7_1 2112; MIPS64R2-NEXT: nop 2113; MIPS64R2-NEXT: .LBB7_3: # %entry 2114; MIPS64R2-NEXT: jr $ra 2115; MIPS64R2-NEXT: daddiu $sp, $sp, 16 2116; 2117; MIPS64R6-LABEL: AtomicCmpSwap32: 2118; MIPS64R6: # %bb.0: # %entry 2119; MIPS64R6-NEXT: daddiu $sp, $sp, -16 2120; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2121; MIPS64R6-NEXT: daddu $1, $1, $25 2122; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2123; MIPS64R6-NEXT: sw $5, 12($sp) 2124; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 2125; MIPS64R6-NEXT: .LBB7_1: # %entry 2126; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 2127; MIPS64R6-NEXT: ll $2, 0($1) 2128; MIPS64R6-NEXT: bnec $2, $4, .LBB7_3 2129; MIPS64R6-NEXT: # %bb.2: # %entry 2130; MIPS64R6-NEXT: # in Loop: Header=BB7_1 Depth=1 2131; MIPS64R6-NEXT: move $3, $5 2132; MIPS64R6-NEXT: sc $3, 0($1) 2133; MIPS64R6-NEXT: beqzc $3, .LBB7_1 2134; MIPS64R6-NEXT: nop 2135; MIPS64R6-NEXT: .LBB7_3: # %entry 2136; MIPS64R6-NEXT: jr $ra 2137; MIPS64R6-NEXT: daddiu $sp, $sp, 16 2138; 2139; MIPS64R6O0-LABEL: AtomicCmpSwap32: 2140; MIPS64R6O0: # %bb.0: # %entry 2141; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 2142; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2143; MIPS64R6O0-NEXT: daddu $1, $1, $25 2144; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2145; MIPS64R6O0-NEXT: move $2, $4 2146; MIPS64R6O0-NEXT: move $3, $5 2147; MIPS64R6O0-NEXT: sw $3, 12($sp) 2148; MIPS64R6O0-NEXT: lw $3, 12($sp) 2149; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 2150; MIPS64R6O0-NEXT: lw $6, 8($sp) # 4-byte Folded Reload 2151; MIPS64R6O0-NEXT: .LBB7_1: # %entry 2152; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2153; MIPS64R6O0-NEXT: ll $7, 0($1) 2154; MIPS64R6O0-NEXT: bnec $7, $2, .LBB7_3 2155; MIPS64R6O0-NEXT: # %bb.2: # %entry 2156; MIPS64R6O0-NEXT: # in Loop: Header=BB7_1 Depth=1 2157; MIPS64R6O0-NEXT: move $8, $3 2158; MIPS64R6O0-NEXT: sc $8, 0($1) 2159; MIPS64R6O0-NEXT: beqzc $8, .LBB7_1 2160; MIPS64R6O0-NEXT: .LBB7_3: # %entry 2161; MIPS64R6O0-NEXT: move $2, $7 2162; MIPS64R6O0-NEXT: sw $7, 8($sp) # 4-byte Folded Spill 2163; MIPS64R6O0-NEXT: sw $6, 4($sp) # 4-byte Folded Spill 2164; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 2165; MIPS64R6O0-NEXT: jrc $ra 2166; 2167; MM32-LABEL: AtomicCmpSwap32: 2168; MM32: # %bb.0: # %entry 2169; MM32-NEXT: lui $2, %hi(_gp_disp) 2170; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 2171; MM32-NEXT: addiu $sp, $sp, -8 2172; MM32-NEXT: addu $2, $2, $25 2173; MM32-NEXT: sw $5, 4($sp) 2174; MM32-NEXT: lw $1, %got(x)($2) 2175; MM32-NEXT: $BB7_1: # %entry 2176; MM32-NEXT: # =>This Inner Loop Header: Depth=1 2177; MM32-NEXT: ll $2, 0($1) 2178; MM32-NEXT: bne $2, $4, $BB7_3 2179; MM32-NEXT: nop 2180; MM32-NEXT: # %bb.2: # %entry 2181; MM32-NEXT: # in Loop: Header=BB7_1 Depth=1 2182; MM32-NEXT: move $3, $5 2183; MM32-NEXT: sc $3, 0($1) 2184; MM32-NEXT: beqzc $3, $BB7_1 2185; MM32-NEXT: $BB7_3: # %entry 2186; MM32-NEXT: addiusp 8 2187; MM32-NEXT: jrc $ra 2188; 2189; O1-LABEL: AtomicCmpSwap32: 2190; O1: # %bb.0: # %entry 2191; O1-NEXT: lui $2, %hi(_gp_disp) 2192; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 2193; O1-NEXT: addiu $sp, $sp, -8 2194; O1-NEXT: addu $1, $2, $25 2195; O1-NEXT: sw $5, 4($sp) 2196; O1-NEXT: lw $1, %got(x)($1) 2197; O1-NEXT: $BB7_1: # %entry 2198; O1-NEXT: # =>This Inner Loop Header: Depth=1 2199; O1-NEXT: ll $2, 0($1) 2200; O1-NEXT: bne $2, $4, $BB7_3 2201; O1-NEXT: nop 2202; O1-NEXT: # %bb.2: # %entry 2203; O1-NEXT: # in Loop: Header=BB7_1 Depth=1 2204; O1-NEXT: move $3, $5 2205; O1-NEXT: sc $3, 0($1) 2206; O1-NEXT: beqz $3, $BB7_1 2207; O1-NEXT: nop 2208; O1-NEXT: $BB7_3: # %entry 2209; O1-NEXT: jr $ra 2210; O1-NEXT: addiu $sp, $sp, 8 2211; 2212; O2-LABEL: AtomicCmpSwap32: 2213; O2: # %bb.0: # %entry 2214; O2-NEXT: lui $2, %hi(_gp_disp) 2215; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 2216; O2-NEXT: addiu $sp, $sp, -8 2217; O2-NEXT: addu $1, $2, $25 2218; O2-NEXT: sw $5, 4($sp) 2219; O2-NEXT: lw $1, %got(x)($1) 2220; O2-NEXT: $BB7_1: # %entry 2221; O2-NEXT: # =>This Inner Loop Header: Depth=1 2222; O2-NEXT: ll $2, 0($1) 2223; O2-NEXT: bne $2, $4, $BB7_3 2224; O2-NEXT: nop 2225; O2-NEXT: # %bb.2: # %entry 2226; O2-NEXT: # in Loop: Header=BB7_1 Depth=1 2227; O2-NEXT: move $3, $5 2228; O2-NEXT: sc $3, 0($1) 2229; O2-NEXT: beqz $3, $BB7_1 2230; O2-NEXT: nop 2231; O2-NEXT: $BB7_3: # %entry 2232; O2-NEXT: jr $ra 2233; O2-NEXT: addiu $sp, $sp, 8 2234; 2235; O3-LABEL: AtomicCmpSwap32: 2236; O3: # %bb.0: # %entry 2237; O3-NEXT: lui $2, %hi(_gp_disp) 2238; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 2239; O3-NEXT: addiu $sp, $sp, -8 2240; O3-NEXT: addu $1, $2, $25 2241; O3-NEXT: sw $5, 4($sp) 2242; O3-NEXT: lw $1, %got(x)($1) 2243; O3-NEXT: $BB7_1: # %entry 2244; O3-NEXT: # =>This Inner Loop Header: Depth=1 2245; O3-NEXT: ll $2, 0($1) 2246; O3-NEXT: bne $2, $4, $BB7_3 2247; O3-NEXT: nop 2248; O3-NEXT: # %bb.2: # %entry 2249; O3-NEXT: # in Loop: Header=BB7_1 Depth=1 2250; O3-NEXT: move $3, $5 2251; O3-NEXT: sc $3, 0($1) 2252; O3-NEXT: beqz $3, $BB7_1 2253; O3-NEXT: nop 2254; O3-NEXT: $BB7_3: # %entry 2255; O3-NEXT: jr $ra 2256; O3-NEXT: addiu $sp, $sp, 8 2257; 2258; MIPS32EB-LABEL: AtomicCmpSwap32: 2259; MIPS32EB: # %bb.0: # %entry 2260; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 2261; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 2262; MIPS32EB-NEXT: addiu $sp, $sp, -8 2263; MIPS32EB-NEXT: addu $1, $2, $25 2264; MIPS32EB-NEXT: sw $5, 4($sp) 2265; MIPS32EB-NEXT: lw $1, %got(x)($1) 2266; MIPS32EB-NEXT: $BB7_1: # %entry 2267; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 2268; MIPS32EB-NEXT: ll $2, 0($1) 2269; MIPS32EB-NEXT: bne $2, $4, $BB7_3 2270; MIPS32EB-NEXT: nop 2271; MIPS32EB-NEXT: # %bb.2: # %entry 2272; MIPS32EB-NEXT: # in Loop: Header=BB7_1 Depth=1 2273; MIPS32EB-NEXT: move $3, $5 2274; MIPS32EB-NEXT: sc $3, 0($1) 2275; MIPS32EB-NEXT: beqz $3, $BB7_1 2276; MIPS32EB-NEXT: nop 2277; MIPS32EB-NEXT: $BB7_3: # %entry 2278; MIPS32EB-NEXT: jr $ra 2279; MIPS32EB-NEXT: addiu $sp, $sp, 8 2280entry: 2281 %newval.addr = alloca i32, align 4 2282 store i32 %newval, i32* %newval.addr, align 4 2283 %tmp = load i32, i32* %newval.addr, align 4 2284 %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic monotonic 2285 %1 = extractvalue { i32, i1 } %0, 0 2286 ret i32 %1 2287 2288} 2289 2290@y = common global i8 0, align 1 2291 2292define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind { 2293; MIPS32-LABEL: AtomicLoadAdd8: 2294; MIPS32: # %bb.0: # %entry 2295; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2296; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2297; MIPS32-NEXT: addu $1, $2, $25 2298; MIPS32-NEXT: lw $1, %got(y)($1) 2299; MIPS32-NEXT: addiu $2, $zero, -4 2300; MIPS32-NEXT: and $2, $1, $2 2301; MIPS32-NEXT: andi $1, $1, 3 2302; MIPS32-NEXT: sll $3, $1, 3 2303; MIPS32-NEXT: ori $1, $zero, 255 2304; MIPS32-NEXT: sllv $5, $1, $3 2305; MIPS32-NEXT: nor $6, $zero, $5 2306; MIPS32-NEXT: sllv $4, $4, $3 2307; MIPS32-NEXT: $BB8_1: # %entry 2308; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 2309; MIPS32-NEXT: ll $7, 0($2) 2310; MIPS32-NEXT: addu $8, $7, $4 2311; MIPS32-NEXT: and $8, $8, $5 2312; MIPS32-NEXT: and $9, $7, $6 2313; MIPS32-NEXT: or $9, $9, $8 2314; MIPS32-NEXT: sc $9, 0($2) 2315; MIPS32-NEXT: beqz $9, $BB8_1 2316; MIPS32-NEXT: nop 2317; MIPS32-NEXT: # %bb.2: # %entry 2318; MIPS32-NEXT: and $1, $7, $5 2319; MIPS32-NEXT: srlv $1, $1, $3 2320; MIPS32-NEXT: sll $1, $1, 24 2321; MIPS32-NEXT: sra $1, $1, 24 2322; MIPS32-NEXT: # %bb.3: # %entry 2323; MIPS32-NEXT: sll $1, $1, 24 2324; MIPS32-NEXT: jr $ra 2325; MIPS32-NEXT: sra $2, $1, 24 2326; 2327; MIPS32O0-LABEL: AtomicLoadAdd8: 2328; MIPS32O0: # %bb.0: # %entry 2329; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 2330; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2331; MIPS32O0-NEXT: addiu $sp, $sp, -8 2332; MIPS32O0-NEXT: addu $2, $2, $25 2333; MIPS32O0-NEXT: lw $2, %got(y)($2) 2334; MIPS32O0-NEXT: addiu $25, $zero, -4 2335; MIPS32O0-NEXT: and $25, $2, $25 2336; MIPS32O0-NEXT: andi $2, $2, 3 2337; MIPS32O0-NEXT: sll $2, $2, 3 2338; MIPS32O0-NEXT: ori $1, $zero, 255 2339; MIPS32O0-NEXT: sllv $1, $1, $2 2340; MIPS32O0-NEXT: nor $3, $zero, $1 2341; MIPS32O0-NEXT: sllv $4, $4, $2 2342; MIPS32O0-NEXT: $BB8_1: # %entry 2343; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 2344; MIPS32O0-NEXT: ll $6, 0($25) 2345; MIPS32O0-NEXT: addu $7, $6, $4 2346; MIPS32O0-NEXT: and $7, $7, $1 2347; MIPS32O0-NEXT: and $8, $6, $3 2348; MIPS32O0-NEXT: or $8, $8, $7 2349; MIPS32O0-NEXT: sc $8, 0($25) 2350; MIPS32O0-NEXT: beqz $8, $BB8_1 2351; MIPS32O0-NEXT: nop 2352; MIPS32O0-NEXT: # %bb.2: # %entry 2353; MIPS32O0-NEXT: and $5, $6, $1 2354; MIPS32O0-NEXT: srlv $5, $5, $2 2355; MIPS32O0-NEXT: sll $5, $5, 24 2356; MIPS32O0-NEXT: sra $5, $5, 24 2357; MIPS32O0-NEXT: # %bb.3: # %entry 2358; MIPS32O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 2359; MIPS32O0-NEXT: # %bb.4: # %entry 2360; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 2361; MIPS32O0-NEXT: sll $2, $1, 24 2362; MIPS32O0-NEXT: sra $2, $2, 24 2363; MIPS32O0-NEXT: addiu $sp, $sp, 8 2364; MIPS32O0-NEXT: jr $ra 2365; MIPS32O0-NEXT: nop 2366; 2367; MIPS32R2-LABEL: AtomicLoadAdd8: 2368; MIPS32R2: # %bb.0: # %entry 2369; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 2370; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 2371; MIPS32R2-NEXT: addu $1, $2, $25 2372; MIPS32R2-NEXT: lw $1, %got(y)($1) 2373; MIPS32R2-NEXT: addiu $2, $zero, -4 2374; MIPS32R2-NEXT: and $2, $1, $2 2375; MIPS32R2-NEXT: andi $1, $1, 3 2376; MIPS32R2-NEXT: sll $3, $1, 3 2377; MIPS32R2-NEXT: ori $1, $zero, 255 2378; MIPS32R2-NEXT: sllv $5, $1, $3 2379; MIPS32R2-NEXT: nor $6, $zero, $5 2380; MIPS32R2-NEXT: sllv $4, $4, $3 2381; MIPS32R2-NEXT: $BB8_1: # %entry 2382; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 2383; MIPS32R2-NEXT: ll $7, 0($2) 2384; MIPS32R2-NEXT: addu $8, $7, $4 2385; MIPS32R2-NEXT: and $8, $8, $5 2386; MIPS32R2-NEXT: and $9, $7, $6 2387; MIPS32R2-NEXT: or $9, $9, $8 2388; MIPS32R2-NEXT: sc $9, 0($2) 2389; MIPS32R2-NEXT: beqz $9, $BB8_1 2390; MIPS32R2-NEXT: nop 2391; MIPS32R2-NEXT: # %bb.2: # %entry 2392; MIPS32R2-NEXT: and $1, $7, $5 2393; MIPS32R2-NEXT: srlv $1, $1, $3 2394; MIPS32R2-NEXT: seb $1, $1 2395; MIPS32R2-NEXT: # %bb.3: # %entry 2396; MIPS32R2-NEXT: jr $ra 2397; MIPS32R2-NEXT: seb $2, $1 2398; 2399; MIPS32R6-LABEL: AtomicLoadAdd8: 2400; MIPS32R6: # %bb.0: # %entry 2401; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 2402; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 2403; MIPS32R6-NEXT: addu $1, $2, $25 2404; MIPS32R6-NEXT: lw $1, %got(y)($1) 2405; MIPS32R6-NEXT: addiu $2, $zero, -4 2406; MIPS32R6-NEXT: and $2, $1, $2 2407; MIPS32R6-NEXT: andi $1, $1, 3 2408; MIPS32R6-NEXT: sll $3, $1, 3 2409; MIPS32R6-NEXT: ori $1, $zero, 255 2410; MIPS32R6-NEXT: sllv $5, $1, $3 2411; MIPS32R6-NEXT: nor $6, $zero, $5 2412; MIPS32R6-NEXT: sllv $4, $4, $3 2413; MIPS32R6-NEXT: $BB8_1: # %entry 2414; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 2415; MIPS32R6-NEXT: ll $7, 0($2) 2416; MIPS32R6-NEXT: addu $8, $7, $4 2417; MIPS32R6-NEXT: and $8, $8, $5 2418; MIPS32R6-NEXT: and $9, $7, $6 2419; MIPS32R6-NEXT: or $9, $9, $8 2420; MIPS32R6-NEXT: sc $9, 0($2) 2421; MIPS32R6-NEXT: beqzc $9, $BB8_1 2422; MIPS32R6-NEXT: # %bb.2: # %entry 2423; MIPS32R6-NEXT: and $1, $7, $5 2424; MIPS32R6-NEXT: srlv $1, $1, $3 2425; MIPS32R6-NEXT: seb $1, $1 2426; MIPS32R6-NEXT: # %bb.3: # %entry 2427; MIPS32R6-NEXT: jr $ra 2428; MIPS32R6-NEXT: seb $2, $1 2429; 2430; MIPS32R6O0-LABEL: AtomicLoadAdd8: 2431; MIPS32R6O0: # %bb.0: # %entry 2432; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 2433; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2434; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 2435; MIPS32R6O0-NEXT: addu $2, $2, $25 2436; MIPS32R6O0-NEXT: move $25, $4 2437; MIPS32R6O0-NEXT: lw $2, %got(y)($2) 2438; MIPS32R6O0-NEXT: addiu $1, $zero, -4 2439; MIPS32R6O0-NEXT: and $1, $2, $1 2440; MIPS32R6O0-NEXT: andi $2, $2, 3 2441; MIPS32R6O0-NEXT: sll $2, $2, 3 2442; MIPS32R6O0-NEXT: ori $3, $zero, 255 2443; MIPS32R6O0-NEXT: sllv $3, $3, $2 2444; MIPS32R6O0-NEXT: nor $5, $zero, $3 2445; MIPS32R6O0-NEXT: sllv $4, $4, $2 2446; MIPS32R6O0-NEXT: $BB8_1: # %entry 2447; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2448; MIPS32R6O0-NEXT: ll $7, 0($1) 2449; MIPS32R6O0-NEXT: addu $8, $7, $4 2450; MIPS32R6O0-NEXT: and $8, $8, $3 2451; MIPS32R6O0-NEXT: and $9, $7, $5 2452; MIPS32R6O0-NEXT: or $9, $9, $8 2453; MIPS32R6O0-NEXT: sc $9, 0($1) 2454; MIPS32R6O0-NEXT: beqzc $9, $BB8_1 2455; MIPS32R6O0-NEXT: # %bb.2: # %entry 2456; MIPS32R6O0-NEXT: and $6, $7, $3 2457; MIPS32R6O0-NEXT: srlv $6, $6, $2 2458; MIPS32R6O0-NEXT: seb $6, $6 2459; MIPS32R6O0-NEXT: # %bb.3: # %entry 2460; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 2461; MIPS32R6O0-NEXT: sw $6, 0($sp) # 4-byte Folded Spill 2462; MIPS32R6O0-NEXT: # %bb.4: # %entry 2463; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 2464; MIPS32R6O0-NEXT: seb $2, $1 2465; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 2466; MIPS32R6O0-NEXT: jrc $ra 2467; 2468; MIPS4-LABEL: AtomicLoadAdd8: 2469; MIPS4: # %bb.0: # %entry 2470; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2471; MIPS4-NEXT: daddu $1, $1, $25 2472; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2473; MIPS4-NEXT: ld $1, %got_disp(y)($1) 2474; MIPS4-NEXT: daddiu $2, $zero, -4 2475; MIPS4-NEXT: and $2, $1, $2 2476; MIPS4-NEXT: andi $1, $1, 3 2477; MIPS4-NEXT: sll $3, $1, 3 2478; MIPS4-NEXT: ori $1, $zero, 255 2479; MIPS4-NEXT: sllv $5, $1, $3 2480; MIPS4-NEXT: nor $6, $zero, $5 2481; MIPS4-NEXT: sllv $4, $4, $3 2482; MIPS4-NEXT: .LBB8_1: # %entry 2483; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 2484; MIPS4-NEXT: ll $7, 0($2) 2485; MIPS4-NEXT: addu $8, $7, $4 2486; MIPS4-NEXT: and $8, $8, $5 2487; MIPS4-NEXT: and $9, $7, $6 2488; MIPS4-NEXT: or $9, $9, $8 2489; MIPS4-NEXT: sc $9, 0($2) 2490; MIPS4-NEXT: beqz $9, .LBB8_1 2491; MIPS4-NEXT: nop 2492; MIPS4-NEXT: # %bb.2: # %entry 2493; MIPS4-NEXT: and $1, $7, $5 2494; MIPS4-NEXT: srlv $1, $1, $3 2495; MIPS4-NEXT: sll $1, $1, 24 2496; MIPS4-NEXT: sra $1, $1, 24 2497; MIPS4-NEXT: # %bb.3: # %entry 2498; MIPS4-NEXT: sll $1, $1, 24 2499; MIPS4-NEXT: jr $ra 2500; MIPS4-NEXT: sra $2, $1, 24 2501; 2502; MIPS64-LABEL: AtomicLoadAdd8: 2503; MIPS64: # %bb.0: # %entry 2504; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2505; MIPS64-NEXT: daddu $1, $1, $25 2506; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2507; MIPS64-NEXT: ld $1, %got_disp(y)($1) 2508; MIPS64-NEXT: daddiu $2, $zero, -4 2509; MIPS64-NEXT: and $2, $1, $2 2510; MIPS64-NEXT: andi $1, $1, 3 2511; MIPS64-NEXT: sll $3, $1, 3 2512; MIPS64-NEXT: ori $1, $zero, 255 2513; MIPS64-NEXT: sllv $5, $1, $3 2514; MIPS64-NEXT: nor $6, $zero, $5 2515; MIPS64-NEXT: sllv $4, $4, $3 2516; MIPS64-NEXT: .LBB8_1: # %entry 2517; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 2518; MIPS64-NEXT: ll $7, 0($2) 2519; MIPS64-NEXT: addu $8, $7, $4 2520; MIPS64-NEXT: and $8, $8, $5 2521; MIPS64-NEXT: and $9, $7, $6 2522; MIPS64-NEXT: or $9, $9, $8 2523; MIPS64-NEXT: sc $9, 0($2) 2524; MIPS64-NEXT: beqz $9, .LBB8_1 2525; MIPS64-NEXT: nop 2526; MIPS64-NEXT: # %bb.2: # %entry 2527; MIPS64-NEXT: and $1, $7, $5 2528; MIPS64-NEXT: srlv $1, $1, $3 2529; MIPS64-NEXT: sll $1, $1, 24 2530; MIPS64-NEXT: sra $1, $1, 24 2531; MIPS64-NEXT: # %bb.3: # %entry 2532; MIPS64-NEXT: sll $1, $1, 24 2533; MIPS64-NEXT: jr $ra 2534; MIPS64-NEXT: sra $2, $1, 24 2535; 2536; MIPS64R2-LABEL: AtomicLoadAdd8: 2537; MIPS64R2: # %bb.0: # %entry 2538; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2539; MIPS64R2-NEXT: daddu $1, $1, $25 2540; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2541; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 2542; MIPS64R2-NEXT: daddiu $2, $zero, -4 2543; MIPS64R2-NEXT: and $2, $1, $2 2544; MIPS64R2-NEXT: andi $1, $1, 3 2545; MIPS64R2-NEXT: sll $3, $1, 3 2546; MIPS64R2-NEXT: ori $1, $zero, 255 2547; MIPS64R2-NEXT: sllv $5, $1, $3 2548; MIPS64R2-NEXT: nor $6, $zero, $5 2549; MIPS64R2-NEXT: sllv $4, $4, $3 2550; MIPS64R2-NEXT: .LBB8_1: # %entry 2551; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 2552; MIPS64R2-NEXT: ll $7, 0($2) 2553; MIPS64R2-NEXT: addu $8, $7, $4 2554; MIPS64R2-NEXT: and $8, $8, $5 2555; MIPS64R2-NEXT: and $9, $7, $6 2556; MIPS64R2-NEXT: or $9, $9, $8 2557; MIPS64R2-NEXT: sc $9, 0($2) 2558; MIPS64R2-NEXT: beqz $9, .LBB8_1 2559; MIPS64R2-NEXT: nop 2560; MIPS64R2-NEXT: # %bb.2: # %entry 2561; MIPS64R2-NEXT: and $1, $7, $5 2562; MIPS64R2-NEXT: srlv $1, $1, $3 2563; MIPS64R2-NEXT: seb $1, $1 2564; MIPS64R2-NEXT: # %bb.3: # %entry 2565; MIPS64R2-NEXT: jr $ra 2566; MIPS64R2-NEXT: seb $2, $1 2567; 2568; MIPS64R6-LABEL: AtomicLoadAdd8: 2569; MIPS64R6: # %bb.0: # %entry 2570; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2571; MIPS64R6-NEXT: daddu $1, $1, $25 2572; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2573; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 2574; MIPS64R6-NEXT: daddiu $2, $zero, -4 2575; MIPS64R6-NEXT: and $2, $1, $2 2576; MIPS64R6-NEXT: andi $1, $1, 3 2577; MIPS64R6-NEXT: sll $3, $1, 3 2578; MIPS64R6-NEXT: ori $1, $zero, 255 2579; MIPS64R6-NEXT: sllv $5, $1, $3 2580; MIPS64R6-NEXT: nor $6, $zero, $5 2581; MIPS64R6-NEXT: sllv $4, $4, $3 2582; MIPS64R6-NEXT: .LBB8_1: # %entry 2583; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 2584; MIPS64R6-NEXT: ll $7, 0($2) 2585; MIPS64R6-NEXT: addu $8, $7, $4 2586; MIPS64R6-NEXT: and $8, $8, $5 2587; MIPS64R6-NEXT: and $9, $7, $6 2588; MIPS64R6-NEXT: or $9, $9, $8 2589; MIPS64R6-NEXT: sc $9, 0($2) 2590; MIPS64R6-NEXT: beqzc $9, .LBB8_1 2591; MIPS64R6-NEXT: # %bb.2: # %entry 2592; MIPS64R6-NEXT: and $1, $7, $5 2593; MIPS64R6-NEXT: srlv $1, $1, $3 2594; MIPS64R6-NEXT: seb $1, $1 2595; MIPS64R6-NEXT: # %bb.3: # %entry 2596; MIPS64R6-NEXT: jr $ra 2597; MIPS64R6-NEXT: seb $2, $1 2598; 2599; MIPS64R6O0-LABEL: AtomicLoadAdd8: 2600; MIPS64R6O0: # %bb.0: # %entry 2601; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 2602; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2603; MIPS64R6O0-NEXT: daddu $1, $1, $25 2604; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2605; MIPS64R6O0-NEXT: move $2, $4 2606; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 2607; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 2608; MIPS64R6O0-NEXT: and $4, $1, $4 2609; MIPS64R6O0-NEXT: andi $3, $1, 3 2610; MIPS64R6O0-NEXT: xori $3, $3, 3 2611; MIPS64R6O0-NEXT: sll $3, $3, 3 2612; MIPS64R6O0-NEXT: ori $5, $zero, 255 2613; MIPS64R6O0-NEXT: sllv $5, $5, $3 2614; MIPS64R6O0-NEXT: nor $6, $zero, $5 2615; MIPS64R6O0-NEXT: sllv $2, $2, $3 2616; MIPS64R6O0-NEXT: .LBB8_1: # %entry 2617; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2618; MIPS64R6O0-NEXT: ll $8, 0($4) 2619; MIPS64R6O0-NEXT: addu $9, $8, $2 2620; MIPS64R6O0-NEXT: and $9, $9, $5 2621; MIPS64R6O0-NEXT: and $10, $8, $6 2622; MIPS64R6O0-NEXT: or $10, $10, $9 2623; MIPS64R6O0-NEXT: sc $10, 0($4) 2624; MIPS64R6O0-NEXT: beqzc $10, .LBB8_1 2625; MIPS64R6O0-NEXT: # %bb.2: # %entry 2626; MIPS64R6O0-NEXT: and $7, $8, $5 2627; MIPS64R6O0-NEXT: srlv $7, $7, $3 2628; MIPS64R6O0-NEXT: seb $7, $7 2629; MIPS64R6O0-NEXT: # %bb.3: # %entry 2630; MIPS64R6O0-NEXT: sw $7, 12($sp) # 4-byte Folded Spill 2631; MIPS64R6O0-NEXT: # %bb.4: # %entry 2632; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 2633; MIPS64R6O0-NEXT: seb $2, $1 2634; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 2635; MIPS64R6O0-NEXT: jrc $ra 2636; 2637; MM32-LABEL: AtomicLoadAdd8: 2638; MM32: # %bb.0: # %entry 2639; MM32-NEXT: lui $2, %hi(_gp_disp) 2640; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 2641; MM32-NEXT: addu $2, $2, $25 2642; MM32-NEXT: lw $1, %got(y)($2) 2643; MM32-NEXT: addiu $2, $zero, -4 2644; MM32-NEXT: and $2, $1, $2 2645; MM32-NEXT: andi $1, $1, 3 2646; MM32-NEXT: sll $3, $1, 3 2647; MM32-NEXT: ori $1, $zero, 255 2648; MM32-NEXT: sllv $5, $1, $3 2649; MM32-NEXT: nor $6, $zero, $5 2650; MM32-NEXT: sllv $4, $4, $3 2651; MM32-NEXT: $BB8_1: # %entry 2652; MM32-NEXT: # =>This Inner Loop Header: Depth=1 2653; MM32-NEXT: ll $7, 0($2) 2654; MM32-NEXT: addu $8, $7, $4 2655; MM32-NEXT: and $8, $8, $5 2656; MM32-NEXT: and $9, $7, $6 2657; MM32-NEXT: or $9, $9, $8 2658; MM32-NEXT: sc $9, 0($2) 2659; MM32-NEXT: beqzc $9, $BB8_1 2660; MM32-NEXT: # %bb.2: # %entry 2661; MM32-NEXT: and $1, $7, $5 2662; MM32-NEXT: srlv $1, $1, $3 2663; MM32-NEXT: seb $1, $1 2664; MM32-NEXT: # %bb.3: # %entry 2665; MM32-NEXT: jr $ra 2666; MM32-NEXT: seb $2, $1 2667; 2668; O1-LABEL: AtomicLoadAdd8: 2669; O1: # %bb.0: # %entry 2670; O1-NEXT: lui $2, %hi(_gp_disp) 2671; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 2672; O1-NEXT: addu $1, $2, $25 2673; O1-NEXT: lw $1, %got(y)($1) 2674; O1-NEXT: addiu $2, $zero, -4 2675; O1-NEXT: and $2, $1, $2 2676; O1-NEXT: andi $1, $1, 3 2677; O1-NEXT: sll $3, $1, 3 2678; O1-NEXT: ori $1, $zero, 255 2679; O1-NEXT: sllv $5, $1, $3 2680; O1-NEXT: nor $6, $zero, $5 2681; O1-NEXT: sllv $4, $4, $3 2682; O1-NEXT: $BB8_1: # %entry 2683; O1-NEXT: # =>This Inner Loop Header: Depth=1 2684; O1-NEXT: ll $7, 0($2) 2685; O1-NEXT: addu $8, $7, $4 2686; O1-NEXT: and $8, $8, $5 2687; O1-NEXT: and $9, $7, $6 2688; O1-NEXT: or $9, $9, $8 2689; O1-NEXT: sc $9, 0($2) 2690; O1-NEXT: beqz $9, $BB8_1 2691; O1-NEXT: nop 2692; O1-NEXT: # %bb.2: # %entry 2693; O1-NEXT: and $1, $7, $5 2694; O1-NEXT: srlv $1, $1, $3 2695; O1-NEXT: sll $1, $1, 24 2696; O1-NEXT: sra $1, $1, 24 2697; O1-NEXT: # %bb.3: # %entry 2698; O1-NEXT: sll $1, $1, 24 2699; O1-NEXT: jr $ra 2700; O1-NEXT: sra $2, $1, 24 2701; 2702; O2-LABEL: AtomicLoadAdd8: 2703; O2: # %bb.0: # %entry 2704; O2-NEXT: lui $2, %hi(_gp_disp) 2705; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 2706; O2-NEXT: addu $1, $2, $25 2707; O2-NEXT: lw $1, %got(y)($1) 2708; O2-NEXT: addiu $2, $zero, -4 2709; O2-NEXT: and $2, $1, $2 2710; O2-NEXT: andi $1, $1, 3 2711; O2-NEXT: sll $3, $1, 3 2712; O2-NEXT: ori $1, $zero, 255 2713; O2-NEXT: sllv $5, $1, $3 2714; O2-NEXT: nor $6, $zero, $5 2715; O2-NEXT: sllv $4, $4, $3 2716; O2-NEXT: $BB8_1: # %entry 2717; O2-NEXT: # =>This Inner Loop Header: Depth=1 2718; O2-NEXT: ll $7, 0($2) 2719; O2-NEXT: addu $8, $7, $4 2720; O2-NEXT: and $8, $8, $5 2721; O2-NEXT: and $9, $7, $6 2722; O2-NEXT: or $9, $9, $8 2723; O2-NEXT: sc $9, 0($2) 2724; O2-NEXT: beqz $9, $BB8_1 2725; O2-NEXT: nop 2726; O2-NEXT: # %bb.2: # %entry 2727; O2-NEXT: and $1, $7, $5 2728; O2-NEXT: srlv $1, $1, $3 2729; O2-NEXT: sll $1, $1, 24 2730; O2-NEXT: sra $1, $1, 24 2731; O2-NEXT: # %bb.3: # %entry 2732; O2-NEXT: sll $1, $1, 24 2733; O2-NEXT: jr $ra 2734; O2-NEXT: sra $2, $1, 24 2735; 2736; O3-LABEL: AtomicLoadAdd8: 2737; O3: # %bb.0: # %entry 2738; O3-NEXT: lui $2, %hi(_gp_disp) 2739; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 2740; O3-NEXT: addu $1, $2, $25 2741; O3-NEXT: addiu $2, $zero, -4 2742; O3-NEXT: lw $1, %got(y)($1) 2743; O3-NEXT: and $2, $1, $2 2744; O3-NEXT: andi $1, $1, 3 2745; O3-NEXT: sll $3, $1, 3 2746; O3-NEXT: ori $1, $zero, 255 2747; O3-NEXT: sllv $5, $1, $3 2748; O3-NEXT: sllv $4, $4, $3 2749; O3-NEXT: nor $6, $zero, $5 2750; O3-NEXT: $BB8_1: # %entry 2751; O3-NEXT: # =>This Inner Loop Header: Depth=1 2752; O3-NEXT: ll $7, 0($2) 2753; O3-NEXT: addu $8, $7, $4 2754; O3-NEXT: and $8, $8, $5 2755; O3-NEXT: and $9, $7, $6 2756; O3-NEXT: or $9, $9, $8 2757; O3-NEXT: sc $9, 0($2) 2758; O3-NEXT: beqz $9, $BB8_1 2759; O3-NEXT: nop 2760; O3-NEXT: # %bb.2: # %entry 2761; O3-NEXT: and $1, $7, $5 2762; O3-NEXT: srlv $1, $1, $3 2763; O3-NEXT: sll $1, $1, 24 2764; O3-NEXT: sra $1, $1, 24 2765; O3-NEXT: # %bb.3: # %entry 2766; O3-NEXT: sll $1, $1, 24 2767; O3-NEXT: jr $ra 2768; O3-NEXT: sra $2, $1, 24 2769; 2770; MIPS32EB-LABEL: AtomicLoadAdd8: 2771; MIPS32EB: # %bb.0: # %entry 2772; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 2773; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 2774; MIPS32EB-NEXT: addu $1, $2, $25 2775; MIPS32EB-NEXT: lw $1, %got(y)($1) 2776; MIPS32EB-NEXT: addiu $2, $zero, -4 2777; MIPS32EB-NEXT: and $2, $1, $2 2778; MIPS32EB-NEXT: andi $1, $1, 3 2779; MIPS32EB-NEXT: xori $1, $1, 3 2780; MIPS32EB-NEXT: sll $3, $1, 3 2781; MIPS32EB-NEXT: ori $1, $zero, 255 2782; MIPS32EB-NEXT: sllv $5, $1, $3 2783; MIPS32EB-NEXT: nor $6, $zero, $5 2784; MIPS32EB-NEXT: sllv $4, $4, $3 2785; MIPS32EB-NEXT: $BB8_1: # %entry 2786; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 2787; MIPS32EB-NEXT: ll $7, 0($2) 2788; MIPS32EB-NEXT: addu $8, $7, $4 2789; MIPS32EB-NEXT: and $8, $8, $5 2790; MIPS32EB-NEXT: and $9, $7, $6 2791; MIPS32EB-NEXT: or $9, $9, $8 2792; MIPS32EB-NEXT: sc $9, 0($2) 2793; MIPS32EB-NEXT: beqz $9, $BB8_1 2794; MIPS32EB-NEXT: nop 2795; MIPS32EB-NEXT: # %bb.2: # %entry 2796; MIPS32EB-NEXT: and $1, $7, $5 2797; MIPS32EB-NEXT: srlv $1, $1, $3 2798; MIPS32EB-NEXT: sll $1, $1, 24 2799; MIPS32EB-NEXT: sra $1, $1, 24 2800; MIPS32EB-NEXT: # %bb.3: # %entry 2801; MIPS32EB-NEXT: sll $1, $1, 24 2802; MIPS32EB-NEXT: jr $ra 2803; MIPS32EB-NEXT: sra $2, $1, 24 2804entry: 2805 %0 = atomicrmw add i8* @y, i8 %incr monotonic 2806 ret i8 %0 2807} 2808 2809define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind { 2810; MIPS32-LABEL: AtomicLoadSub8: 2811; MIPS32: # %bb.0: # %entry 2812; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2813; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2814; MIPS32-NEXT: addu $1, $2, $25 2815; MIPS32-NEXT: lw $1, %got(y)($1) 2816; MIPS32-NEXT: addiu $2, $zero, -4 2817; MIPS32-NEXT: and $2, $1, $2 2818; MIPS32-NEXT: andi $1, $1, 3 2819; MIPS32-NEXT: sll $3, $1, 3 2820; MIPS32-NEXT: ori $1, $zero, 255 2821; MIPS32-NEXT: sllv $5, $1, $3 2822; MIPS32-NEXT: nor $6, $zero, $5 2823; MIPS32-NEXT: sllv $4, $4, $3 2824; MIPS32-NEXT: $BB9_1: # %entry 2825; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 2826; MIPS32-NEXT: ll $7, 0($2) 2827; MIPS32-NEXT: subu $8, $7, $4 2828; MIPS32-NEXT: and $8, $8, $5 2829; MIPS32-NEXT: and $9, $7, $6 2830; MIPS32-NEXT: or $9, $9, $8 2831; MIPS32-NEXT: sc $9, 0($2) 2832; MIPS32-NEXT: beqz $9, $BB9_1 2833; MIPS32-NEXT: nop 2834; MIPS32-NEXT: # %bb.2: # %entry 2835; MIPS32-NEXT: and $1, $7, $5 2836; MIPS32-NEXT: srlv $1, $1, $3 2837; MIPS32-NEXT: sll $1, $1, 24 2838; MIPS32-NEXT: sra $1, $1, 24 2839; MIPS32-NEXT: # %bb.3: # %entry 2840; MIPS32-NEXT: sll $1, $1, 24 2841; MIPS32-NEXT: jr $ra 2842; MIPS32-NEXT: sra $2, $1, 24 2843; 2844; MIPS32O0-LABEL: AtomicLoadSub8: 2845; MIPS32O0: # %bb.0: # %entry 2846; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 2847; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2848; MIPS32O0-NEXT: addiu $sp, $sp, -8 2849; MIPS32O0-NEXT: addu $2, $2, $25 2850; MIPS32O0-NEXT: lw $2, %got(y)($2) 2851; MIPS32O0-NEXT: addiu $25, $zero, -4 2852; MIPS32O0-NEXT: and $25, $2, $25 2853; MIPS32O0-NEXT: andi $2, $2, 3 2854; MIPS32O0-NEXT: sll $2, $2, 3 2855; MIPS32O0-NEXT: ori $1, $zero, 255 2856; MIPS32O0-NEXT: sllv $1, $1, $2 2857; MIPS32O0-NEXT: nor $3, $zero, $1 2858; MIPS32O0-NEXT: sllv $4, $4, $2 2859; MIPS32O0-NEXT: $BB9_1: # %entry 2860; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 2861; MIPS32O0-NEXT: ll $6, 0($25) 2862; MIPS32O0-NEXT: subu $7, $6, $4 2863; MIPS32O0-NEXT: and $7, $7, $1 2864; MIPS32O0-NEXT: and $8, $6, $3 2865; MIPS32O0-NEXT: or $8, $8, $7 2866; MIPS32O0-NEXT: sc $8, 0($25) 2867; MIPS32O0-NEXT: beqz $8, $BB9_1 2868; MIPS32O0-NEXT: nop 2869; MIPS32O0-NEXT: # %bb.2: # %entry 2870; MIPS32O0-NEXT: and $5, $6, $1 2871; MIPS32O0-NEXT: srlv $5, $5, $2 2872; MIPS32O0-NEXT: sll $5, $5, 24 2873; MIPS32O0-NEXT: sra $5, $5, 24 2874; MIPS32O0-NEXT: # %bb.3: # %entry 2875; MIPS32O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 2876; MIPS32O0-NEXT: # %bb.4: # %entry 2877; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 2878; MIPS32O0-NEXT: sll $2, $1, 24 2879; MIPS32O0-NEXT: sra $2, $2, 24 2880; MIPS32O0-NEXT: addiu $sp, $sp, 8 2881; MIPS32O0-NEXT: jr $ra 2882; MIPS32O0-NEXT: nop 2883; 2884; MIPS32R2-LABEL: AtomicLoadSub8: 2885; MIPS32R2: # %bb.0: # %entry 2886; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 2887; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 2888; MIPS32R2-NEXT: addu $1, $2, $25 2889; MIPS32R2-NEXT: lw $1, %got(y)($1) 2890; MIPS32R2-NEXT: addiu $2, $zero, -4 2891; MIPS32R2-NEXT: and $2, $1, $2 2892; MIPS32R2-NEXT: andi $1, $1, 3 2893; MIPS32R2-NEXT: sll $3, $1, 3 2894; MIPS32R2-NEXT: ori $1, $zero, 255 2895; MIPS32R2-NEXT: sllv $5, $1, $3 2896; MIPS32R2-NEXT: nor $6, $zero, $5 2897; MIPS32R2-NEXT: sllv $4, $4, $3 2898; MIPS32R2-NEXT: $BB9_1: # %entry 2899; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 2900; MIPS32R2-NEXT: ll $7, 0($2) 2901; MIPS32R2-NEXT: subu $8, $7, $4 2902; MIPS32R2-NEXT: and $8, $8, $5 2903; MIPS32R2-NEXT: and $9, $7, $6 2904; MIPS32R2-NEXT: or $9, $9, $8 2905; MIPS32R2-NEXT: sc $9, 0($2) 2906; MIPS32R2-NEXT: beqz $9, $BB9_1 2907; MIPS32R2-NEXT: nop 2908; MIPS32R2-NEXT: # %bb.2: # %entry 2909; MIPS32R2-NEXT: and $1, $7, $5 2910; MIPS32R2-NEXT: srlv $1, $1, $3 2911; MIPS32R2-NEXT: seb $1, $1 2912; MIPS32R2-NEXT: # %bb.3: # %entry 2913; MIPS32R2-NEXT: jr $ra 2914; MIPS32R2-NEXT: seb $2, $1 2915; 2916; MIPS32R6-LABEL: AtomicLoadSub8: 2917; MIPS32R6: # %bb.0: # %entry 2918; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 2919; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 2920; MIPS32R6-NEXT: addu $1, $2, $25 2921; MIPS32R6-NEXT: lw $1, %got(y)($1) 2922; MIPS32R6-NEXT: addiu $2, $zero, -4 2923; MIPS32R6-NEXT: and $2, $1, $2 2924; MIPS32R6-NEXT: andi $1, $1, 3 2925; MIPS32R6-NEXT: sll $3, $1, 3 2926; MIPS32R6-NEXT: ori $1, $zero, 255 2927; MIPS32R6-NEXT: sllv $5, $1, $3 2928; MIPS32R6-NEXT: nor $6, $zero, $5 2929; MIPS32R6-NEXT: sllv $4, $4, $3 2930; MIPS32R6-NEXT: $BB9_1: # %entry 2931; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 2932; MIPS32R6-NEXT: ll $7, 0($2) 2933; MIPS32R6-NEXT: subu $8, $7, $4 2934; MIPS32R6-NEXT: and $8, $8, $5 2935; MIPS32R6-NEXT: and $9, $7, $6 2936; MIPS32R6-NEXT: or $9, $9, $8 2937; MIPS32R6-NEXT: sc $9, 0($2) 2938; MIPS32R6-NEXT: beqzc $9, $BB9_1 2939; MIPS32R6-NEXT: # %bb.2: # %entry 2940; MIPS32R6-NEXT: and $1, $7, $5 2941; MIPS32R6-NEXT: srlv $1, $1, $3 2942; MIPS32R6-NEXT: seb $1, $1 2943; MIPS32R6-NEXT: # %bb.3: # %entry 2944; MIPS32R6-NEXT: jr $ra 2945; MIPS32R6-NEXT: seb $2, $1 2946; 2947; MIPS32R6O0-LABEL: AtomicLoadSub8: 2948; MIPS32R6O0: # %bb.0: # %entry 2949; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 2950; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2951; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 2952; MIPS32R6O0-NEXT: addu $2, $2, $25 2953; MIPS32R6O0-NEXT: move $25, $4 2954; MIPS32R6O0-NEXT: lw $2, %got(y)($2) 2955; MIPS32R6O0-NEXT: addiu $1, $zero, -4 2956; MIPS32R6O0-NEXT: and $1, $2, $1 2957; MIPS32R6O0-NEXT: andi $2, $2, 3 2958; MIPS32R6O0-NEXT: sll $2, $2, 3 2959; MIPS32R6O0-NEXT: ori $3, $zero, 255 2960; MIPS32R6O0-NEXT: sllv $3, $3, $2 2961; MIPS32R6O0-NEXT: nor $5, $zero, $3 2962; MIPS32R6O0-NEXT: sllv $4, $4, $2 2963; MIPS32R6O0-NEXT: $BB9_1: # %entry 2964; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2965; MIPS32R6O0-NEXT: ll $7, 0($1) 2966; MIPS32R6O0-NEXT: subu $8, $7, $4 2967; MIPS32R6O0-NEXT: and $8, $8, $3 2968; MIPS32R6O0-NEXT: and $9, $7, $5 2969; MIPS32R6O0-NEXT: or $9, $9, $8 2970; MIPS32R6O0-NEXT: sc $9, 0($1) 2971; MIPS32R6O0-NEXT: beqzc $9, $BB9_1 2972; MIPS32R6O0-NEXT: # %bb.2: # %entry 2973; MIPS32R6O0-NEXT: and $6, $7, $3 2974; MIPS32R6O0-NEXT: srlv $6, $6, $2 2975; MIPS32R6O0-NEXT: seb $6, $6 2976; MIPS32R6O0-NEXT: # %bb.3: # %entry 2977; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 2978; MIPS32R6O0-NEXT: sw $6, 0($sp) # 4-byte Folded Spill 2979; MIPS32R6O0-NEXT: # %bb.4: # %entry 2980; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 2981; MIPS32R6O0-NEXT: seb $2, $1 2982; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 2983; MIPS32R6O0-NEXT: jrc $ra 2984; 2985; MIPS4-LABEL: AtomicLoadSub8: 2986; MIPS4: # %bb.0: # %entry 2987; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 2988; MIPS4-NEXT: daddu $1, $1, $25 2989; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 2990; MIPS4-NEXT: ld $1, %got_disp(y)($1) 2991; MIPS4-NEXT: daddiu $2, $zero, -4 2992; MIPS4-NEXT: and $2, $1, $2 2993; MIPS4-NEXT: andi $1, $1, 3 2994; MIPS4-NEXT: sll $3, $1, 3 2995; MIPS4-NEXT: ori $1, $zero, 255 2996; MIPS4-NEXT: sllv $5, $1, $3 2997; MIPS4-NEXT: nor $6, $zero, $5 2998; MIPS4-NEXT: sllv $4, $4, $3 2999; MIPS4-NEXT: .LBB9_1: # %entry 3000; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 3001; MIPS4-NEXT: ll $7, 0($2) 3002; MIPS4-NEXT: subu $8, $7, $4 3003; MIPS4-NEXT: and $8, $8, $5 3004; MIPS4-NEXT: and $9, $7, $6 3005; MIPS4-NEXT: or $9, $9, $8 3006; MIPS4-NEXT: sc $9, 0($2) 3007; MIPS4-NEXT: beqz $9, .LBB9_1 3008; MIPS4-NEXT: nop 3009; MIPS4-NEXT: # %bb.2: # %entry 3010; MIPS4-NEXT: and $1, $7, $5 3011; MIPS4-NEXT: srlv $1, $1, $3 3012; MIPS4-NEXT: sll $1, $1, 24 3013; MIPS4-NEXT: sra $1, $1, 24 3014; MIPS4-NEXT: # %bb.3: # %entry 3015; MIPS4-NEXT: sll $1, $1, 24 3016; MIPS4-NEXT: jr $ra 3017; MIPS4-NEXT: sra $2, $1, 24 3018; 3019; MIPS64-LABEL: AtomicLoadSub8: 3020; MIPS64: # %bb.0: # %entry 3021; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3022; MIPS64-NEXT: daddu $1, $1, $25 3023; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3024; MIPS64-NEXT: ld $1, %got_disp(y)($1) 3025; MIPS64-NEXT: daddiu $2, $zero, -4 3026; MIPS64-NEXT: and $2, $1, $2 3027; MIPS64-NEXT: andi $1, $1, 3 3028; MIPS64-NEXT: sll $3, $1, 3 3029; MIPS64-NEXT: ori $1, $zero, 255 3030; MIPS64-NEXT: sllv $5, $1, $3 3031; MIPS64-NEXT: nor $6, $zero, $5 3032; MIPS64-NEXT: sllv $4, $4, $3 3033; MIPS64-NEXT: .LBB9_1: # %entry 3034; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 3035; MIPS64-NEXT: ll $7, 0($2) 3036; MIPS64-NEXT: subu $8, $7, $4 3037; MIPS64-NEXT: and $8, $8, $5 3038; MIPS64-NEXT: and $9, $7, $6 3039; MIPS64-NEXT: or $9, $9, $8 3040; MIPS64-NEXT: sc $9, 0($2) 3041; MIPS64-NEXT: beqz $9, .LBB9_1 3042; MIPS64-NEXT: nop 3043; MIPS64-NEXT: # %bb.2: # %entry 3044; MIPS64-NEXT: and $1, $7, $5 3045; MIPS64-NEXT: srlv $1, $1, $3 3046; MIPS64-NEXT: sll $1, $1, 24 3047; MIPS64-NEXT: sra $1, $1, 24 3048; MIPS64-NEXT: # %bb.3: # %entry 3049; MIPS64-NEXT: sll $1, $1, 24 3050; MIPS64-NEXT: jr $ra 3051; MIPS64-NEXT: sra $2, $1, 24 3052; 3053; MIPS64R2-LABEL: AtomicLoadSub8: 3054; MIPS64R2: # %bb.0: # %entry 3055; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3056; MIPS64R2-NEXT: daddu $1, $1, $25 3057; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3058; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 3059; MIPS64R2-NEXT: daddiu $2, $zero, -4 3060; MIPS64R2-NEXT: and $2, $1, $2 3061; MIPS64R2-NEXT: andi $1, $1, 3 3062; MIPS64R2-NEXT: sll $3, $1, 3 3063; MIPS64R2-NEXT: ori $1, $zero, 255 3064; MIPS64R2-NEXT: sllv $5, $1, $3 3065; MIPS64R2-NEXT: nor $6, $zero, $5 3066; MIPS64R2-NEXT: sllv $4, $4, $3 3067; MIPS64R2-NEXT: .LBB9_1: # %entry 3068; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 3069; MIPS64R2-NEXT: ll $7, 0($2) 3070; MIPS64R2-NEXT: subu $8, $7, $4 3071; MIPS64R2-NEXT: and $8, $8, $5 3072; MIPS64R2-NEXT: and $9, $7, $6 3073; MIPS64R2-NEXT: or $9, $9, $8 3074; MIPS64R2-NEXT: sc $9, 0($2) 3075; MIPS64R2-NEXT: beqz $9, .LBB9_1 3076; MIPS64R2-NEXT: nop 3077; MIPS64R2-NEXT: # %bb.2: # %entry 3078; MIPS64R2-NEXT: and $1, $7, $5 3079; MIPS64R2-NEXT: srlv $1, $1, $3 3080; MIPS64R2-NEXT: seb $1, $1 3081; MIPS64R2-NEXT: # %bb.3: # %entry 3082; MIPS64R2-NEXT: jr $ra 3083; MIPS64R2-NEXT: seb $2, $1 3084; 3085; MIPS64R6-LABEL: AtomicLoadSub8: 3086; MIPS64R6: # %bb.0: # %entry 3087; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3088; MIPS64R6-NEXT: daddu $1, $1, $25 3089; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3090; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 3091; MIPS64R6-NEXT: daddiu $2, $zero, -4 3092; MIPS64R6-NEXT: and $2, $1, $2 3093; MIPS64R6-NEXT: andi $1, $1, 3 3094; MIPS64R6-NEXT: sll $3, $1, 3 3095; MIPS64R6-NEXT: ori $1, $zero, 255 3096; MIPS64R6-NEXT: sllv $5, $1, $3 3097; MIPS64R6-NEXT: nor $6, $zero, $5 3098; MIPS64R6-NEXT: sllv $4, $4, $3 3099; MIPS64R6-NEXT: .LBB9_1: # %entry 3100; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 3101; MIPS64R6-NEXT: ll $7, 0($2) 3102; MIPS64R6-NEXT: subu $8, $7, $4 3103; MIPS64R6-NEXT: and $8, $8, $5 3104; MIPS64R6-NEXT: and $9, $7, $6 3105; MIPS64R6-NEXT: or $9, $9, $8 3106; MIPS64R6-NEXT: sc $9, 0($2) 3107; MIPS64R6-NEXT: beqzc $9, .LBB9_1 3108; MIPS64R6-NEXT: # %bb.2: # %entry 3109; MIPS64R6-NEXT: and $1, $7, $5 3110; MIPS64R6-NEXT: srlv $1, $1, $3 3111; MIPS64R6-NEXT: seb $1, $1 3112; MIPS64R6-NEXT: # %bb.3: # %entry 3113; MIPS64R6-NEXT: jr $ra 3114; MIPS64R6-NEXT: seb $2, $1 3115; 3116; MIPS64R6O0-LABEL: AtomicLoadSub8: 3117; MIPS64R6O0: # %bb.0: # %entry 3118; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 3119; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3120; MIPS64R6O0-NEXT: daddu $1, $1, $25 3121; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3122; MIPS64R6O0-NEXT: move $2, $4 3123; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 3124; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 3125; MIPS64R6O0-NEXT: and $4, $1, $4 3126; MIPS64R6O0-NEXT: andi $3, $1, 3 3127; MIPS64R6O0-NEXT: xori $3, $3, 3 3128; MIPS64R6O0-NEXT: sll $3, $3, 3 3129; MIPS64R6O0-NEXT: ori $5, $zero, 255 3130; MIPS64R6O0-NEXT: sllv $5, $5, $3 3131; MIPS64R6O0-NEXT: nor $6, $zero, $5 3132; MIPS64R6O0-NEXT: sllv $2, $2, $3 3133; MIPS64R6O0-NEXT: .LBB9_1: # %entry 3134; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3135; MIPS64R6O0-NEXT: ll $8, 0($4) 3136; MIPS64R6O0-NEXT: subu $9, $8, $2 3137; MIPS64R6O0-NEXT: and $9, $9, $5 3138; MIPS64R6O0-NEXT: and $10, $8, $6 3139; MIPS64R6O0-NEXT: or $10, $10, $9 3140; MIPS64R6O0-NEXT: sc $10, 0($4) 3141; MIPS64R6O0-NEXT: beqzc $10, .LBB9_1 3142; MIPS64R6O0-NEXT: # %bb.2: # %entry 3143; MIPS64R6O0-NEXT: and $7, $8, $5 3144; MIPS64R6O0-NEXT: srlv $7, $7, $3 3145; MIPS64R6O0-NEXT: seb $7, $7 3146; MIPS64R6O0-NEXT: # %bb.3: # %entry 3147; MIPS64R6O0-NEXT: sw $7, 12($sp) # 4-byte Folded Spill 3148; MIPS64R6O0-NEXT: # %bb.4: # %entry 3149; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 3150; MIPS64R6O0-NEXT: seb $2, $1 3151; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 3152; MIPS64R6O0-NEXT: jrc $ra 3153; 3154; MM32-LABEL: AtomicLoadSub8: 3155; MM32: # %bb.0: # %entry 3156; MM32-NEXT: lui $2, %hi(_gp_disp) 3157; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 3158; MM32-NEXT: addu $2, $2, $25 3159; MM32-NEXT: lw $1, %got(y)($2) 3160; MM32-NEXT: addiu $2, $zero, -4 3161; MM32-NEXT: and $2, $1, $2 3162; MM32-NEXT: andi $1, $1, 3 3163; MM32-NEXT: sll $3, $1, 3 3164; MM32-NEXT: ori $1, $zero, 255 3165; MM32-NEXT: sllv $5, $1, $3 3166; MM32-NEXT: nor $6, $zero, $5 3167; MM32-NEXT: sllv $4, $4, $3 3168; MM32-NEXT: $BB9_1: # %entry 3169; MM32-NEXT: # =>This Inner Loop Header: Depth=1 3170; MM32-NEXT: ll $7, 0($2) 3171; MM32-NEXT: subu $8, $7, $4 3172; MM32-NEXT: and $8, $8, $5 3173; MM32-NEXT: and $9, $7, $6 3174; MM32-NEXT: or $9, $9, $8 3175; MM32-NEXT: sc $9, 0($2) 3176; MM32-NEXT: beqzc $9, $BB9_1 3177; MM32-NEXT: # %bb.2: # %entry 3178; MM32-NEXT: and $1, $7, $5 3179; MM32-NEXT: srlv $1, $1, $3 3180; MM32-NEXT: seb $1, $1 3181; MM32-NEXT: # %bb.3: # %entry 3182; MM32-NEXT: jr $ra 3183; MM32-NEXT: seb $2, $1 3184; 3185; O1-LABEL: AtomicLoadSub8: 3186; O1: # %bb.0: # %entry 3187; O1-NEXT: lui $2, %hi(_gp_disp) 3188; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 3189; O1-NEXT: addu $1, $2, $25 3190; O1-NEXT: lw $1, %got(y)($1) 3191; O1-NEXT: addiu $2, $zero, -4 3192; O1-NEXT: and $2, $1, $2 3193; O1-NEXT: andi $1, $1, 3 3194; O1-NEXT: sll $3, $1, 3 3195; O1-NEXT: ori $1, $zero, 255 3196; O1-NEXT: sllv $5, $1, $3 3197; O1-NEXT: nor $6, $zero, $5 3198; O1-NEXT: sllv $4, $4, $3 3199; O1-NEXT: $BB9_1: # %entry 3200; O1-NEXT: # =>This Inner Loop Header: Depth=1 3201; O1-NEXT: ll $7, 0($2) 3202; O1-NEXT: subu $8, $7, $4 3203; O1-NEXT: and $8, $8, $5 3204; O1-NEXT: and $9, $7, $6 3205; O1-NEXT: or $9, $9, $8 3206; O1-NEXT: sc $9, 0($2) 3207; O1-NEXT: beqz $9, $BB9_1 3208; O1-NEXT: nop 3209; O1-NEXT: # %bb.2: # %entry 3210; O1-NEXT: and $1, $7, $5 3211; O1-NEXT: srlv $1, $1, $3 3212; O1-NEXT: sll $1, $1, 24 3213; O1-NEXT: sra $1, $1, 24 3214; O1-NEXT: # %bb.3: # %entry 3215; O1-NEXT: sll $1, $1, 24 3216; O1-NEXT: jr $ra 3217; O1-NEXT: sra $2, $1, 24 3218; 3219; O2-LABEL: AtomicLoadSub8: 3220; O2: # %bb.0: # %entry 3221; O2-NEXT: lui $2, %hi(_gp_disp) 3222; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 3223; O2-NEXT: addu $1, $2, $25 3224; O2-NEXT: lw $1, %got(y)($1) 3225; O2-NEXT: addiu $2, $zero, -4 3226; O2-NEXT: and $2, $1, $2 3227; O2-NEXT: andi $1, $1, 3 3228; O2-NEXT: sll $3, $1, 3 3229; O2-NEXT: ori $1, $zero, 255 3230; O2-NEXT: sllv $5, $1, $3 3231; O2-NEXT: nor $6, $zero, $5 3232; O2-NEXT: sllv $4, $4, $3 3233; O2-NEXT: $BB9_1: # %entry 3234; O2-NEXT: # =>This Inner Loop Header: Depth=1 3235; O2-NEXT: ll $7, 0($2) 3236; O2-NEXT: subu $8, $7, $4 3237; O2-NEXT: and $8, $8, $5 3238; O2-NEXT: and $9, $7, $6 3239; O2-NEXT: or $9, $9, $8 3240; O2-NEXT: sc $9, 0($2) 3241; O2-NEXT: beqz $9, $BB9_1 3242; O2-NEXT: nop 3243; O2-NEXT: # %bb.2: # %entry 3244; O2-NEXT: and $1, $7, $5 3245; O2-NEXT: srlv $1, $1, $3 3246; O2-NEXT: sll $1, $1, 24 3247; O2-NEXT: sra $1, $1, 24 3248; O2-NEXT: # %bb.3: # %entry 3249; O2-NEXT: sll $1, $1, 24 3250; O2-NEXT: jr $ra 3251; O2-NEXT: sra $2, $1, 24 3252; 3253; O3-LABEL: AtomicLoadSub8: 3254; O3: # %bb.0: # %entry 3255; O3-NEXT: lui $2, %hi(_gp_disp) 3256; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 3257; O3-NEXT: addu $1, $2, $25 3258; O3-NEXT: addiu $2, $zero, -4 3259; O3-NEXT: lw $1, %got(y)($1) 3260; O3-NEXT: and $2, $1, $2 3261; O3-NEXT: andi $1, $1, 3 3262; O3-NEXT: sll $3, $1, 3 3263; O3-NEXT: ori $1, $zero, 255 3264; O3-NEXT: sllv $5, $1, $3 3265; O3-NEXT: sllv $4, $4, $3 3266; O3-NEXT: nor $6, $zero, $5 3267; O3-NEXT: $BB9_1: # %entry 3268; O3-NEXT: # =>This Inner Loop Header: Depth=1 3269; O3-NEXT: ll $7, 0($2) 3270; O3-NEXT: subu $8, $7, $4 3271; O3-NEXT: and $8, $8, $5 3272; O3-NEXT: and $9, $7, $6 3273; O3-NEXT: or $9, $9, $8 3274; O3-NEXT: sc $9, 0($2) 3275; O3-NEXT: beqz $9, $BB9_1 3276; O3-NEXT: nop 3277; O3-NEXT: # %bb.2: # %entry 3278; O3-NEXT: and $1, $7, $5 3279; O3-NEXT: srlv $1, $1, $3 3280; O3-NEXT: sll $1, $1, 24 3281; O3-NEXT: sra $1, $1, 24 3282; O3-NEXT: # %bb.3: # %entry 3283; O3-NEXT: sll $1, $1, 24 3284; O3-NEXT: jr $ra 3285; O3-NEXT: sra $2, $1, 24 3286; 3287; MIPS32EB-LABEL: AtomicLoadSub8: 3288; MIPS32EB: # %bb.0: # %entry 3289; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 3290; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 3291; MIPS32EB-NEXT: addu $1, $2, $25 3292; MIPS32EB-NEXT: lw $1, %got(y)($1) 3293; MIPS32EB-NEXT: addiu $2, $zero, -4 3294; MIPS32EB-NEXT: and $2, $1, $2 3295; MIPS32EB-NEXT: andi $1, $1, 3 3296; MIPS32EB-NEXT: xori $1, $1, 3 3297; MIPS32EB-NEXT: sll $3, $1, 3 3298; MIPS32EB-NEXT: ori $1, $zero, 255 3299; MIPS32EB-NEXT: sllv $5, $1, $3 3300; MIPS32EB-NEXT: nor $6, $zero, $5 3301; MIPS32EB-NEXT: sllv $4, $4, $3 3302; MIPS32EB-NEXT: $BB9_1: # %entry 3303; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 3304; MIPS32EB-NEXT: ll $7, 0($2) 3305; MIPS32EB-NEXT: subu $8, $7, $4 3306; MIPS32EB-NEXT: and $8, $8, $5 3307; MIPS32EB-NEXT: and $9, $7, $6 3308; MIPS32EB-NEXT: or $9, $9, $8 3309; MIPS32EB-NEXT: sc $9, 0($2) 3310; MIPS32EB-NEXT: beqz $9, $BB9_1 3311; MIPS32EB-NEXT: nop 3312; MIPS32EB-NEXT: # %bb.2: # %entry 3313; MIPS32EB-NEXT: and $1, $7, $5 3314; MIPS32EB-NEXT: srlv $1, $1, $3 3315; MIPS32EB-NEXT: sll $1, $1, 24 3316; MIPS32EB-NEXT: sra $1, $1, 24 3317; MIPS32EB-NEXT: # %bb.3: # %entry 3318; MIPS32EB-NEXT: sll $1, $1, 24 3319; MIPS32EB-NEXT: jr $ra 3320; MIPS32EB-NEXT: sra $2, $1, 24 3321entry: 3322 %0 = atomicrmw sub i8* @y, i8 %incr monotonic 3323 ret i8 %0 3324 3325} 3326 3327define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind { 3328; MIPS32-LABEL: AtomicLoadNand8: 3329; MIPS32: # %bb.0: # %entry 3330; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3331; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3332; MIPS32-NEXT: addu $1, $2, $25 3333; MIPS32-NEXT: lw $1, %got(y)($1) 3334; MIPS32-NEXT: addiu $2, $zero, -4 3335; MIPS32-NEXT: and $2, $1, $2 3336; MIPS32-NEXT: andi $1, $1, 3 3337; MIPS32-NEXT: sll $3, $1, 3 3338; MIPS32-NEXT: ori $1, $zero, 255 3339; MIPS32-NEXT: sllv $5, $1, $3 3340; MIPS32-NEXT: nor $6, $zero, $5 3341; MIPS32-NEXT: sllv $4, $4, $3 3342; MIPS32-NEXT: $BB10_1: # %entry 3343; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 3344; MIPS32-NEXT: ll $7, 0($2) 3345; MIPS32-NEXT: and $8, $7, $4 3346; MIPS32-NEXT: nor $8, $zero, $8 3347; MIPS32-NEXT: and $8, $8, $5 3348; MIPS32-NEXT: and $9, $7, $6 3349; MIPS32-NEXT: or $9, $9, $8 3350; MIPS32-NEXT: sc $9, 0($2) 3351; MIPS32-NEXT: beqz $9, $BB10_1 3352; MIPS32-NEXT: nop 3353; MIPS32-NEXT: # %bb.2: # %entry 3354; MIPS32-NEXT: and $1, $7, $5 3355; MIPS32-NEXT: srlv $1, $1, $3 3356; MIPS32-NEXT: sll $1, $1, 24 3357; MIPS32-NEXT: sra $1, $1, 24 3358; MIPS32-NEXT: # %bb.3: # %entry 3359; MIPS32-NEXT: sll $1, $1, 24 3360; MIPS32-NEXT: jr $ra 3361; MIPS32-NEXT: sra $2, $1, 24 3362; 3363; MIPS32O0-LABEL: AtomicLoadNand8: 3364; MIPS32O0: # %bb.0: # %entry 3365; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 3366; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3367; MIPS32O0-NEXT: addiu $sp, $sp, -8 3368; MIPS32O0-NEXT: addu $2, $2, $25 3369; MIPS32O0-NEXT: lw $2, %got(y)($2) 3370; MIPS32O0-NEXT: addiu $25, $zero, -4 3371; MIPS32O0-NEXT: and $25, $2, $25 3372; MIPS32O0-NEXT: andi $2, $2, 3 3373; MIPS32O0-NEXT: sll $2, $2, 3 3374; MIPS32O0-NEXT: ori $1, $zero, 255 3375; MIPS32O0-NEXT: sllv $1, $1, $2 3376; MIPS32O0-NEXT: nor $3, $zero, $1 3377; MIPS32O0-NEXT: sllv $4, $4, $2 3378; MIPS32O0-NEXT: $BB10_1: # %entry 3379; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 3380; MIPS32O0-NEXT: ll $6, 0($25) 3381; MIPS32O0-NEXT: and $7, $6, $4 3382; MIPS32O0-NEXT: nor $7, $zero, $7 3383; MIPS32O0-NEXT: and $7, $7, $1 3384; MIPS32O0-NEXT: and $8, $6, $3 3385; MIPS32O0-NEXT: or $8, $8, $7 3386; MIPS32O0-NEXT: sc $8, 0($25) 3387; MIPS32O0-NEXT: beqz $8, $BB10_1 3388; MIPS32O0-NEXT: nop 3389; MIPS32O0-NEXT: # %bb.2: # %entry 3390; MIPS32O0-NEXT: and $5, $6, $1 3391; MIPS32O0-NEXT: srlv $5, $5, $2 3392; MIPS32O0-NEXT: sll $5, $5, 24 3393; MIPS32O0-NEXT: sra $5, $5, 24 3394; MIPS32O0-NEXT: # %bb.3: # %entry 3395; MIPS32O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 3396; MIPS32O0-NEXT: # %bb.4: # %entry 3397; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 3398; MIPS32O0-NEXT: sll $2, $1, 24 3399; MIPS32O0-NEXT: sra $2, $2, 24 3400; MIPS32O0-NEXT: addiu $sp, $sp, 8 3401; MIPS32O0-NEXT: jr $ra 3402; MIPS32O0-NEXT: nop 3403; 3404; MIPS32R2-LABEL: AtomicLoadNand8: 3405; MIPS32R2: # %bb.0: # %entry 3406; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 3407; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 3408; MIPS32R2-NEXT: addu $1, $2, $25 3409; MIPS32R2-NEXT: lw $1, %got(y)($1) 3410; MIPS32R2-NEXT: addiu $2, $zero, -4 3411; MIPS32R2-NEXT: and $2, $1, $2 3412; MIPS32R2-NEXT: andi $1, $1, 3 3413; MIPS32R2-NEXT: sll $3, $1, 3 3414; MIPS32R2-NEXT: ori $1, $zero, 255 3415; MIPS32R2-NEXT: sllv $5, $1, $3 3416; MIPS32R2-NEXT: nor $6, $zero, $5 3417; MIPS32R2-NEXT: sllv $4, $4, $3 3418; MIPS32R2-NEXT: $BB10_1: # %entry 3419; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 3420; MIPS32R2-NEXT: ll $7, 0($2) 3421; MIPS32R2-NEXT: and $8, $7, $4 3422; MIPS32R2-NEXT: nor $8, $zero, $8 3423; MIPS32R2-NEXT: and $8, $8, $5 3424; MIPS32R2-NEXT: and $9, $7, $6 3425; MIPS32R2-NEXT: or $9, $9, $8 3426; MIPS32R2-NEXT: sc $9, 0($2) 3427; MIPS32R2-NEXT: beqz $9, $BB10_1 3428; MIPS32R2-NEXT: nop 3429; MIPS32R2-NEXT: # %bb.2: # %entry 3430; MIPS32R2-NEXT: and $1, $7, $5 3431; MIPS32R2-NEXT: srlv $1, $1, $3 3432; MIPS32R2-NEXT: seb $1, $1 3433; MIPS32R2-NEXT: # %bb.3: # %entry 3434; MIPS32R2-NEXT: jr $ra 3435; MIPS32R2-NEXT: seb $2, $1 3436; 3437; MIPS32R6-LABEL: AtomicLoadNand8: 3438; MIPS32R6: # %bb.0: # %entry 3439; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 3440; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 3441; MIPS32R6-NEXT: addu $1, $2, $25 3442; MIPS32R6-NEXT: lw $1, %got(y)($1) 3443; MIPS32R6-NEXT: addiu $2, $zero, -4 3444; MIPS32R6-NEXT: and $2, $1, $2 3445; MIPS32R6-NEXT: andi $1, $1, 3 3446; MIPS32R6-NEXT: sll $3, $1, 3 3447; MIPS32R6-NEXT: ori $1, $zero, 255 3448; MIPS32R6-NEXT: sllv $5, $1, $3 3449; MIPS32R6-NEXT: nor $6, $zero, $5 3450; MIPS32R6-NEXT: sllv $4, $4, $3 3451; MIPS32R6-NEXT: $BB10_1: # %entry 3452; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 3453; MIPS32R6-NEXT: ll $7, 0($2) 3454; MIPS32R6-NEXT: and $8, $7, $4 3455; MIPS32R6-NEXT: nor $8, $zero, $8 3456; MIPS32R6-NEXT: and $8, $8, $5 3457; MIPS32R6-NEXT: and $9, $7, $6 3458; MIPS32R6-NEXT: or $9, $9, $8 3459; MIPS32R6-NEXT: sc $9, 0($2) 3460; MIPS32R6-NEXT: beqzc $9, $BB10_1 3461; MIPS32R6-NEXT: # %bb.2: # %entry 3462; MIPS32R6-NEXT: and $1, $7, $5 3463; MIPS32R6-NEXT: srlv $1, $1, $3 3464; MIPS32R6-NEXT: seb $1, $1 3465; MIPS32R6-NEXT: # %bb.3: # %entry 3466; MIPS32R6-NEXT: jr $ra 3467; MIPS32R6-NEXT: seb $2, $1 3468; 3469; MIPS32R6O0-LABEL: AtomicLoadNand8: 3470; MIPS32R6O0: # %bb.0: # %entry 3471; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 3472; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3473; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 3474; MIPS32R6O0-NEXT: addu $2, $2, $25 3475; MIPS32R6O0-NEXT: move $25, $4 3476; MIPS32R6O0-NEXT: lw $2, %got(y)($2) 3477; MIPS32R6O0-NEXT: addiu $1, $zero, -4 3478; MIPS32R6O0-NEXT: and $1, $2, $1 3479; MIPS32R6O0-NEXT: andi $2, $2, 3 3480; MIPS32R6O0-NEXT: sll $2, $2, 3 3481; MIPS32R6O0-NEXT: ori $3, $zero, 255 3482; MIPS32R6O0-NEXT: sllv $3, $3, $2 3483; MIPS32R6O0-NEXT: nor $5, $zero, $3 3484; MIPS32R6O0-NEXT: sllv $4, $4, $2 3485; MIPS32R6O0-NEXT: $BB10_1: # %entry 3486; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3487; MIPS32R6O0-NEXT: ll $7, 0($1) 3488; MIPS32R6O0-NEXT: and $8, $7, $4 3489; MIPS32R6O0-NEXT: nor $8, $zero, $8 3490; MIPS32R6O0-NEXT: and $8, $8, $3 3491; MIPS32R6O0-NEXT: and $9, $7, $5 3492; MIPS32R6O0-NEXT: or $9, $9, $8 3493; MIPS32R6O0-NEXT: sc $9, 0($1) 3494; MIPS32R6O0-NEXT: beqzc $9, $BB10_1 3495; MIPS32R6O0-NEXT: # %bb.2: # %entry 3496; MIPS32R6O0-NEXT: and $6, $7, $3 3497; MIPS32R6O0-NEXT: srlv $6, $6, $2 3498; MIPS32R6O0-NEXT: seb $6, $6 3499; MIPS32R6O0-NEXT: # %bb.3: # %entry 3500; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 3501; MIPS32R6O0-NEXT: sw $6, 0($sp) # 4-byte Folded Spill 3502; MIPS32R6O0-NEXT: # %bb.4: # %entry 3503; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 3504; MIPS32R6O0-NEXT: seb $2, $1 3505; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 3506; MIPS32R6O0-NEXT: jrc $ra 3507; 3508; MIPS4-LABEL: AtomicLoadNand8: 3509; MIPS4: # %bb.0: # %entry 3510; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3511; MIPS4-NEXT: daddu $1, $1, $25 3512; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3513; MIPS4-NEXT: ld $1, %got_disp(y)($1) 3514; MIPS4-NEXT: daddiu $2, $zero, -4 3515; MIPS4-NEXT: and $2, $1, $2 3516; MIPS4-NEXT: andi $1, $1, 3 3517; MIPS4-NEXT: sll $3, $1, 3 3518; MIPS4-NEXT: ori $1, $zero, 255 3519; MIPS4-NEXT: sllv $5, $1, $3 3520; MIPS4-NEXT: nor $6, $zero, $5 3521; MIPS4-NEXT: sllv $4, $4, $3 3522; MIPS4-NEXT: .LBB10_1: # %entry 3523; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 3524; MIPS4-NEXT: ll $7, 0($2) 3525; MIPS4-NEXT: and $8, $7, $4 3526; MIPS4-NEXT: nor $8, $zero, $8 3527; MIPS4-NEXT: and $8, $8, $5 3528; MIPS4-NEXT: and $9, $7, $6 3529; MIPS4-NEXT: or $9, $9, $8 3530; MIPS4-NEXT: sc $9, 0($2) 3531; MIPS4-NEXT: beqz $9, .LBB10_1 3532; MIPS4-NEXT: nop 3533; MIPS4-NEXT: # %bb.2: # %entry 3534; MIPS4-NEXT: and $1, $7, $5 3535; MIPS4-NEXT: srlv $1, $1, $3 3536; MIPS4-NEXT: sll $1, $1, 24 3537; MIPS4-NEXT: sra $1, $1, 24 3538; MIPS4-NEXT: # %bb.3: # %entry 3539; MIPS4-NEXT: sll $1, $1, 24 3540; MIPS4-NEXT: jr $ra 3541; MIPS4-NEXT: sra $2, $1, 24 3542; 3543; MIPS64-LABEL: AtomicLoadNand8: 3544; MIPS64: # %bb.0: # %entry 3545; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3546; MIPS64-NEXT: daddu $1, $1, $25 3547; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3548; MIPS64-NEXT: ld $1, %got_disp(y)($1) 3549; MIPS64-NEXT: daddiu $2, $zero, -4 3550; MIPS64-NEXT: and $2, $1, $2 3551; MIPS64-NEXT: andi $1, $1, 3 3552; MIPS64-NEXT: sll $3, $1, 3 3553; MIPS64-NEXT: ori $1, $zero, 255 3554; MIPS64-NEXT: sllv $5, $1, $3 3555; MIPS64-NEXT: nor $6, $zero, $5 3556; MIPS64-NEXT: sllv $4, $4, $3 3557; MIPS64-NEXT: .LBB10_1: # %entry 3558; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 3559; MIPS64-NEXT: ll $7, 0($2) 3560; MIPS64-NEXT: and $8, $7, $4 3561; MIPS64-NEXT: nor $8, $zero, $8 3562; MIPS64-NEXT: and $8, $8, $5 3563; MIPS64-NEXT: and $9, $7, $6 3564; MIPS64-NEXT: or $9, $9, $8 3565; MIPS64-NEXT: sc $9, 0($2) 3566; MIPS64-NEXT: beqz $9, .LBB10_1 3567; MIPS64-NEXT: nop 3568; MIPS64-NEXT: # %bb.2: # %entry 3569; MIPS64-NEXT: and $1, $7, $5 3570; MIPS64-NEXT: srlv $1, $1, $3 3571; MIPS64-NEXT: sll $1, $1, 24 3572; MIPS64-NEXT: sra $1, $1, 24 3573; MIPS64-NEXT: # %bb.3: # %entry 3574; MIPS64-NEXT: sll $1, $1, 24 3575; MIPS64-NEXT: jr $ra 3576; MIPS64-NEXT: sra $2, $1, 24 3577; 3578; MIPS64R2-LABEL: AtomicLoadNand8: 3579; MIPS64R2: # %bb.0: # %entry 3580; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3581; MIPS64R2-NEXT: daddu $1, $1, $25 3582; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3583; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 3584; MIPS64R2-NEXT: daddiu $2, $zero, -4 3585; MIPS64R2-NEXT: and $2, $1, $2 3586; MIPS64R2-NEXT: andi $1, $1, 3 3587; MIPS64R2-NEXT: sll $3, $1, 3 3588; MIPS64R2-NEXT: ori $1, $zero, 255 3589; MIPS64R2-NEXT: sllv $5, $1, $3 3590; MIPS64R2-NEXT: nor $6, $zero, $5 3591; MIPS64R2-NEXT: sllv $4, $4, $3 3592; MIPS64R2-NEXT: .LBB10_1: # %entry 3593; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 3594; MIPS64R2-NEXT: ll $7, 0($2) 3595; MIPS64R2-NEXT: and $8, $7, $4 3596; MIPS64R2-NEXT: nor $8, $zero, $8 3597; MIPS64R2-NEXT: and $8, $8, $5 3598; MIPS64R2-NEXT: and $9, $7, $6 3599; MIPS64R2-NEXT: or $9, $9, $8 3600; MIPS64R2-NEXT: sc $9, 0($2) 3601; MIPS64R2-NEXT: beqz $9, .LBB10_1 3602; MIPS64R2-NEXT: nop 3603; MIPS64R2-NEXT: # %bb.2: # %entry 3604; MIPS64R2-NEXT: and $1, $7, $5 3605; MIPS64R2-NEXT: srlv $1, $1, $3 3606; MIPS64R2-NEXT: seb $1, $1 3607; MIPS64R2-NEXT: # %bb.3: # %entry 3608; MIPS64R2-NEXT: jr $ra 3609; MIPS64R2-NEXT: seb $2, $1 3610; 3611; MIPS64R6-LABEL: AtomicLoadNand8: 3612; MIPS64R6: # %bb.0: # %entry 3613; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3614; MIPS64R6-NEXT: daddu $1, $1, $25 3615; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3616; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 3617; MIPS64R6-NEXT: daddiu $2, $zero, -4 3618; MIPS64R6-NEXT: and $2, $1, $2 3619; MIPS64R6-NEXT: andi $1, $1, 3 3620; MIPS64R6-NEXT: sll $3, $1, 3 3621; MIPS64R6-NEXT: ori $1, $zero, 255 3622; MIPS64R6-NEXT: sllv $5, $1, $3 3623; MIPS64R6-NEXT: nor $6, $zero, $5 3624; MIPS64R6-NEXT: sllv $4, $4, $3 3625; MIPS64R6-NEXT: .LBB10_1: # %entry 3626; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 3627; MIPS64R6-NEXT: ll $7, 0($2) 3628; MIPS64R6-NEXT: and $8, $7, $4 3629; MIPS64R6-NEXT: nor $8, $zero, $8 3630; MIPS64R6-NEXT: and $8, $8, $5 3631; MIPS64R6-NEXT: and $9, $7, $6 3632; MIPS64R6-NEXT: or $9, $9, $8 3633; MIPS64R6-NEXT: sc $9, 0($2) 3634; MIPS64R6-NEXT: beqzc $9, .LBB10_1 3635; MIPS64R6-NEXT: # %bb.2: # %entry 3636; MIPS64R6-NEXT: and $1, $7, $5 3637; MIPS64R6-NEXT: srlv $1, $1, $3 3638; MIPS64R6-NEXT: seb $1, $1 3639; MIPS64R6-NEXT: # %bb.3: # %entry 3640; MIPS64R6-NEXT: jr $ra 3641; MIPS64R6-NEXT: seb $2, $1 3642; 3643; MIPS64R6O0-LABEL: AtomicLoadNand8: 3644; MIPS64R6O0: # %bb.0: # %entry 3645; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 3646; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3647; MIPS64R6O0-NEXT: daddu $1, $1, $25 3648; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3649; MIPS64R6O0-NEXT: move $2, $4 3650; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 3651; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 3652; MIPS64R6O0-NEXT: and $4, $1, $4 3653; MIPS64R6O0-NEXT: andi $3, $1, 3 3654; MIPS64R6O0-NEXT: xori $3, $3, 3 3655; MIPS64R6O0-NEXT: sll $3, $3, 3 3656; MIPS64R6O0-NEXT: ori $5, $zero, 255 3657; MIPS64R6O0-NEXT: sllv $5, $5, $3 3658; MIPS64R6O0-NEXT: nor $6, $zero, $5 3659; MIPS64R6O0-NEXT: sllv $2, $2, $3 3660; MIPS64R6O0-NEXT: .LBB10_1: # %entry 3661; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3662; MIPS64R6O0-NEXT: ll $8, 0($4) 3663; MIPS64R6O0-NEXT: and $9, $8, $2 3664; MIPS64R6O0-NEXT: nor $9, $zero, $9 3665; MIPS64R6O0-NEXT: and $9, $9, $5 3666; MIPS64R6O0-NEXT: and $10, $8, $6 3667; MIPS64R6O0-NEXT: or $10, $10, $9 3668; MIPS64R6O0-NEXT: sc $10, 0($4) 3669; MIPS64R6O0-NEXT: beqzc $10, .LBB10_1 3670; MIPS64R6O0-NEXT: # %bb.2: # %entry 3671; MIPS64R6O0-NEXT: and $7, $8, $5 3672; MIPS64R6O0-NEXT: srlv $7, $7, $3 3673; MIPS64R6O0-NEXT: seb $7, $7 3674; MIPS64R6O0-NEXT: # %bb.3: # %entry 3675; MIPS64R6O0-NEXT: sw $7, 12($sp) # 4-byte Folded Spill 3676; MIPS64R6O0-NEXT: # %bb.4: # %entry 3677; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 3678; MIPS64R6O0-NEXT: seb $2, $1 3679; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 3680; MIPS64R6O0-NEXT: jrc $ra 3681; 3682; MM32-LABEL: AtomicLoadNand8: 3683; MM32: # %bb.0: # %entry 3684; MM32-NEXT: lui $2, %hi(_gp_disp) 3685; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 3686; MM32-NEXT: addu $2, $2, $25 3687; MM32-NEXT: lw $1, %got(y)($2) 3688; MM32-NEXT: addiu $2, $zero, -4 3689; MM32-NEXT: and $2, $1, $2 3690; MM32-NEXT: andi $1, $1, 3 3691; MM32-NEXT: sll $3, $1, 3 3692; MM32-NEXT: ori $1, $zero, 255 3693; MM32-NEXT: sllv $5, $1, $3 3694; MM32-NEXT: nor $6, $zero, $5 3695; MM32-NEXT: sllv $4, $4, $3 3696; MM32-NEXT: $BB10_1: # %entry 3697; MM32-NEXT: # =>This Inner Loop Header: Depth=1 3698; MM32-NEXT: ll $7, 0($2) 3699; MM32-NEXT: and $8, $7, $4 3700; MM32-NEXT: nor $8, $zero, $8 3701; MM32-NEXT: and $8, $8, $5 3702; MM32-NEXT: and $9, $7, $6 3703; MM32-NEXT: or $9, $9, $8 3704; MM32-NEXT: sc $9, 0($2) 3705; MM32-NEXT: beqzc $9, $BB10_1 3706; MM32-NEXT: # %bb.2: # %entry 3707; MM32-NEXT: and $1, $7, $5 3708; MM32-NEXT: srlv $1, $1, $3 3709; MM32-NEXT: seb $1, $1 3710; MM32-NEXT: # %bb.3: # %entry 3711; MM32-NEXT: jr $ra 3712; MM32-NEXT: seb $2, $1 3713; 3714; O1-LABEL: AtomicLoadNand8: 3715; O1: # %bb.0: # %entry 3716; O1-NEXT: lui $2, %hi(_gp_disp) 3717; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 3718; O1-NEXT: addu $1, $2, $25 3719; O1-NEXT: lw $1, %got(y)($1) 3720; O1-NEXT: addiu $2, $zero, -4 3721; O1-NEXT: and $2, $1, $2 3722; O1-NEXT: andi $1, $1, 3 3723; O1-NEXT: sll $3, $1, 3 3724; O1-NEXT: ori $1, $zero, 255 3725; O1-NEXT: sllv $5, $1, $3 3726; O1-NEXT: nor $6, $zero, $5 3727; O1-NEXT: sllv $4, $4, $3 3728; O1-NEXT: $BB10_1: # %entry 3729; O1-NEXT: # =>This Inner Loop Header: Depth=1 3730; O1-NEXT: ll $7, 0($2) 3731; O1-NEXT: and $8, $7, $4 3732; O1-NEXT: nor $8, $zero, $8 3733; O1-NEXT: and $8, $8, $5 3734; O1-NEXT: and $9, $7, $6 3735; O1-NEXT: or $9, $9, $8 3736; O1-NEXT: sc $9, 0($2) 3737; O1-NEXT: beqz $9, $BB10_1 3738; O1-NEXT: nop 3739; O1-NEXT: # %bb.2: # %entry 3740; O1-NEXT: and $1, $7, $5 3741; O1-NEXT: srlv $1, $1, $3 3742; O1-NEXT: sll $1, $1, 24 3743; O1-NEXT: sra $1, $1, 24 3744; O1-NEXT: # %bb.3: # %entry 3745; O1-NEXT: sll $1, $1, 24 3746; O1-NEXT: jr $ra 3747; O1-NEXT: sra $2, $1, 24 3748; 3749; O2-LABEL: AtomicLoadNand8: 3750; O2: # %bb.0: # %entry 3751; O2-NEXT: lui $2, %hi(_gp_disp) 3752; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 3753; O2-NEXT: addu $1, $2, $25 3754; O2-NEXT: lw $1, %got(y)($1) 3755; O2-NEXT: addiu $2, $zero, -4 3756; O2-NEXT: and $2, $1, $2 3757; O2-NEXT: andi $1, $1, 3 3758; O2-NEXT: sll $3, $1, 3 3759; O2-NEXT: ori $1, $zero, 255 3760; O2-NEXT: sllv $5, $1, $3 3761; O2-NEXT: nor $6, $zero, $5 3762; O2-NEXT: sllv $4, $4, $3 3763; O2-NEXT: $BB10_1: # %entry 3764; O2-NEXT: # =>This Inner Loop Header: Depth=1 3765; O2-NEXT: ll $7, 0($2) 3766; O2-NEXT: and $8, $7, $4 3767; O2-NEXT: nor $8, $zero, $8 3768; O2-NEXT: and $8, $8, $5 3769; O2-NEXT: and $9, $7, $6 3770; O2-NEXT: or $9, $9, $8 3771; O2-NEXT: sc $9, 0($2) 3772; O2-NEXT: beqz $9, $BB10_1 3773; O2-NEXT: nop 3774; O2-NEXT: # %bb.2: # %entry 3775; O2-NEXT: and $1, $7, $5 3776; O2-NEXT: srlv $1, $1, $3 3777; O2-NEXT: sll $1, $1, 24 3778; O2-NEXT: sra $1, $1, 24 3779; O2-NEXT: # %bb.3: # %entry 3780; O2-NEXT: sll $1, $1, 24 3781; O2-NEXT: jr $ra 3782; O2-NEXT: sra $2, $1, 24 3783; 3784; O3-LABEL: AtomicLoadNand8: 3785; O3: # %bb.0: # %entry 3786; O3-NEXT: lui $2, %hi(_gp_disp) 3787; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 3788; O3-NEXT: addu $1, $2, $25 3789; O3-NEXT: addiu $2, $zero, -4 3790; O3-NEXT: lw $1, %got(y)($1) 3791; O3-NEXT: and $2, $1, $2 3792; O3-NEXT: andi $1, $1, 3 3793; O3-NEXT: sll $3, $1, 3 3794; O3-NEXT: ori $1, $zero, 255 3795; O3-NEXT: sllv $5, $1, $3 3796; O3-NEXT: sllv $4, $4, $3 3797; O3-NEXT: nor $6, $zero, $5 3798; O3-NEXT: $BB10_1: # %entry 3799; O3-NEXT: # =>This Inner Loop Header: Depth=1 3800; O3-NEXT: ll $7, 0($2) 3801; O3-NEXT: and $8, $7, $4 3802; O3-NEXT: nor $8, $zero, $8 3803; O3-NEXT: and $8, $8, $5 3804; O3-NEXT: and $9, $7, $6 3805; O3-NEXT: or $9, $9, $8 3806; O3-NEXT: sc $9, 0($2) 3807; O3-NEXT: beqz $9, $BB10_1 3808; O3-NEXT: nop 3809; O3-NEXT: # %bb.2: # %entry 3810; O3-NEXT: and $1, $7, $5 3811; O3-NEXT: srlv $1, $1, $3 3812; O3-NEXT: sll $1, $1, 24 3813; O3-NEXT: sra $1, $1, 24 3814; O3-NEXT: # %bb.3: # %entry 3815; O3-NEXT: sll $1, $1, 24 3816; O3-NEXT: jr $ra 3817; O3-NEXT: sra $2, $1, 24 3818; 3819; MIPS32EB-LABEL: AtomicLoadNand8: 3820; MIPS32EB: # %bb.0: # %entry 3821; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 3822; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 3823; MIPS32EB-NEXT: addu $1, $2, $25 3824; MIPS32EB-NEXT: lw $1, %got(y)($1) 3825; MIPS32EB-NEXT: addiu $2, $zero, -4 3826; MIPS32EB-NEXT: and $2, $1, $2 3827; MIPS32EB-NEXT: andi $1, $1, 3 3828; MIPS32EB-NEXT: xori $1, $1, 3 3829; MIPS32EB-NEXT: sll $3, $1, 3 3830; MIPS32EB-NEXT: ori $1, $zero, 255 3831; MIPS32EB-NEXT: sllv $5, $1, $3 3832; MIPS32EB-NEXT: nor $6, $zero, $5 3833; MIPS32EB-NEXT: sllv $4, $4, $3 3834; MIPS32EB-NEXT: $BB10_1: # %entry 3835; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 3836; MIPS32EB-NEXT: ll $7, 0($2) 3837; MIPS32EB-NEXT: and $8, $7, $4 3838; MIPS32EB-NEXT: nor $8, $zero, $8 3839; MIPS32EB-NEXT: and $8, $8, $5 3840; MIPS32EB-NEXT: and $9, $7, $6 3841; MIPS32EB-NEXT: or $9, $9, $8 3842; MIPS32EB-NEXT: sc $9, 0($2) 3843; MIPS32EB-NEXT: beqz $9, $BB10_1 3844; MIPS32EB-NEXT: nop 3845; MIPS32EB-NEXT: # %bb.2: # %entry 3846; MIPS32EB-NEXT: and $1, $7, $5 3847; MIPS32EB-NEXT: srlv $1, $1, $3 3848; MIPS32EB-NEXT: sll $1, $1, 24 3849; MIPS32EB-NEXT: sra $1, $1, 24 3850; MIPS32EB-NEXT: # %bb.3: # %entry 3851; MIPS32EB-NEXT: sll $1, $1, 24 3852; MIPS32EB-NEXT: jr $ra 3853; MIPS32EB-NEXT: sra $2, $1, 24 3854entry: 3855 %0 = atomicrmw nand i8* @y, i8 %incr monotonic 3856 ret i8 %0 3857 3858} 3859 3860define signext i8 @AtomicSwap8(i8 signext %newval) nounwind { 3861; MIPS32-LABEL: AtomicSwap8: 3862; MIPS32: # %bb.0: # %entry 3863; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3864; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3865; MIPS32-NEXT: addu $1, $2, $25 3866; MIPS32-NEXT: lw $1, %got(y)($1) 3867; MIPS32-NEXT: addiu $2, $zero, -4 3868; MIPS32-NEXT: and $2, $1, $2 3869; MIPS32-NEXT: andi $1, $1, 3 3870; MIPS32-NEXT: sll $3, $1, 3 3871; MIPS32-NEXT: ori $1, $zero, 255 3872; MIPS32-NEXT: sllv $5, $1, $3 3873; MIPS32-NEXT: nor $6, $zero, $5 3874; MIPS32-NEXT: sllv $4, $4, $3 3875; MIPS32-NEXT: $BB11_1: # %entry 3876; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 3877; MIPS32-NEXT: ll $7, 0($2) 3878; MIPS32-NEXT: and $8, $4, $5 3879; MIPS32-NEXT: and $9, $7, $6 3880; MIPS32-NEXT: or $9, $9, $8 3881; MIPS32-NEXT: sc $9, 0($2) 3882; MIPS32-NEXT: beqz $9, $BB11_1 3883; MIPS32-NEXT: nop 3884; MIPS32-NEXT: # %bb.2: # %entry 3885; MIPS32-NEXT: and $1, $7, $5 3886; MIPS32-NEXT: srlv $1, $1, $3 3887; MIPS32-NEXT: sll $1, $1, 24 3888; MIPS32-NEXT: sra $1, $1, 24 3889; MIPS32-NEXT: # %bb.3: # %entry 3890; MIPS32-NEXT: sll $1, $1, 24 3891; MIPS32-NEXT: jr $ra 3892; MIPS32-NEXT: sra $2, $1, 24 3893; 3894; MIPS32O0-LABEL: AtomicSwap8: 3895; MIPS32O0: # %bb.0: # %entry 3896; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 3897; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3898; MIPS32O0-NEXT: addiu $sp, $sp, -8 3899; MIPS32O0-NEXT: addu $2, $2, $25 3900; MIPS32O0-NEXT: lw $2, %got(y)($2) 3901; MIPS32O0-NEXT: addiu $25, $zero, -4 3902; MIPS32O0-NEXT: and $25, $2, $25 3903; MIPS32O0-NEXT: andi $2, $2, 3 3904; MIPS32O0-NEXT: sll $2, $2, 3 3905; MIPS32O0-NEXT: ori $1, $zero, 255 3906; MIPS32O0-NEXT: sllv $1, $1, $2 3907; MIPS32O0-NEXT: nor $3, $zero, $1 3908; MIPS32O0-NEXT: sllv $4, $4, $2 3909; MIPS32O0-NEXT: $BB11_1: # %entry 3910; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 3911; MIPS32O0-NEXT: ll $6, 0($25) 3912; MIPS32O0-NEXT: and $7, $4, $1 3913; MIPS32O0-NEXT: and $8, $6, $3 3914; MIPS32O0-NEXT: or $8, $8, $7 3915; MIPS32O0-NEXT: sc $8, 0($25) 3916; MIPS32O0-NEXT: beqz $8, $BB11_1 3917; MIPS32O0-NEXT: nop 3918; MIPS32O0-NEXT: # %bb.2: # %entry 3919; MIPS32O0-NEXT: and $5, $6, $1 3920; MIPS32O0-NEXT: srlv $5, $5, $2 3921; MIPS32O0-NEXT: sll $5, $5, 24 3922; MIPS32O0-NEXT: sra $5, $5, 24 3923; MIPS32O0-NEXT: # %bb.3: # %entry 3924; MIPS32O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 3925; MIPS32O0-NEXT: # %bb.4: # %entry 3926; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 3927; MIPS32O0-NEXT: sll $2, $1, 24 3928; MIPS32O0-NEXT: sra $2, $2, 24 3929; MIPS32O0-NEXT: addiu $sp, $sp, 8 3930; MIPS32O0-NEXT: jr $ra 3931; MIPS32O0-NEXT: nop 3932; 3933; MIPS32R2-LABEL: AtomicSwap8: 3934; MIPS32R2: # %bb.0: # %entry 3935; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 3936; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 3937; MIPS32R2-NEXT: addu $1, $2, $25 3938; MIPS32R2-NEXT: lw $1, %got(y)($1) 3939; MIPS32R2-NEXT: addiu $2, $zero, -4 3940; MIPS32R2-NEXT: and $2, $1, $2 3941; MIPS32R2-NEXT: andi $1, $1, 3 3942; MIPS32R2-NEXT: sll $3, $1, 3 3943; MIPS32R2-NEXT: ori $1, $zero, 255 3944; MIPS32R2-NEXT: sllv $5, $1, $3 3945; MIPS32R2-NEXT: nor $6, $zero, $5 3946; MIPS32R2-NEXT: sllv $4, $4, $3 3947; MIPS32R2-NEXT: $BB11_1: # %entry 3948; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 3949; MIPS32R2-NEXT: ll $7, 0($2) 3950; MIPS32R2-NEXT: and $8, $4, $5 3951; MIPS32R2-NEXT: and $9, $7, $6 3952; MIPS32R2-NEXT: or $9, $9, $8 3953; MIPS32R2-NEXT: sc $9, 0($2) 3954; MIPS32R2-NEXT: beqz $9, $BB11_1 3955; MIPS32R2-NEXT: nop 3956; MIPS32R2-NEXT: # %bb.2: # %entry 3957; MIPS32R2-NEXT: and $1, $7, $5 3958; MIPS32R2-NEXT: srlv $1, $1, $3 3959; MIPS32R2-NEXT: seb $1, $1 3960; MIPS32R2-NEXT: # %bb.3: # %entry 3961; MIPS32R2-NEXT: jr $ra 3962; MIPS32R2-NEXT: seb $2, $1 3963; 3964; MIPS32R6-LABEL: AtomicSwap8: 3965; MIPS32R6: # %bb.0: # %entry 3966; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 3967; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 3968; MIPS32R6-NEXT: addu $1, $2, $25 3969; MIPS32R6-NEXT: lw $1, %got(y)($1) 3970; MIPS32R6-NEXT: addiu $2, $zero, -4 3971; MIPS32R6-NEXT: and $2, $1, $2 3972; MIPS32R6-NEXT: andi $1, $1, 3 3973; MIPS32R6-NEXT: sll $3, $1, 3 3974; MIPS32R6-NEXT: ori $1, $zero, 255 3975; MIPS32R6-NEXT: sllv $5, $1, $3 3976; MIPS32R6-NEXT: nor $6, $zero, $5 3977; MIPS32R6-NEXT: sllv $4, $4, $3 3978; MIPS32R6-NEXT: $BB11_1: # %entry 3979; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 3980; MIPS32R6-NEXT: ll $7, 0($2) 3981; MIPS32R6-NEXT: and $8, $4, $5 3982; MIPS32R6-NEXT: and $9, $7, $6 3983; MIPS32R6-NEXT: or $9, $9, $8 3984; MIPS32R6-NEXT: sc $9, 0($2) 3985; MIPS32R6-NEXT: beqzc $9, $BB11_1 3986; MIPS32R6-NEXT: # %bb.2: # %entry 3987; MIPS32R6-NEXT: and $1, $7, $5 3988; MIPS32R6-NEXT: srlv $1, $1, $3 3989; MIPS32R6-NEXT: seb $1, $1 3990; MIPS32R6-NEXT: # %bb.3: # %entry 3991; MIPS32R6-NEXT: jr $ra 3992; MIPS32R6-NEXT: seb $2, $1 3993; 3994; MIPS32R6O0-LABEL: AtomicSwap8: 3995; MIPS32R6O0: # %bb.0: # %entry 3996; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 3997; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3998; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 3999; MIPS32R6O0-NEXT: addu $2, $2, $25 4000; MIPS32R6O0-NEXT: move $25, $4 4001; MIPS32R6O0-NEXT: lw $2, %got(y)($2) 4002; MIPS32R6O0-NEXT: addiu $1, $zero, -4 4003; MIPS32R6O0-NEXT: and $1, $2, $1 4004; MIPS32R6O0-NEXT: andi $2, $2, 3 4005; MIPS32R6O0-NEXT: sll $2, $2, 3 4006; MIPS32R6O0-NEXT: ori $3, $zero, 255 4007; MIPS32R6O0-NEXT: sllv $3, $3, $2 4008; MIPS32R6O0-NEXT: nor $5, $zero, $3 4009; MIPS32R6O0-NEXT: sllv $4, $4, $2 4010; MIPS32R6O0-NEXT: $BB11_1: # %entry 4011; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4012; MIPS32R6O0-NEXT: ll $7, 0($1) 4013; MIPS32R6O0-NEXT: and $8, $4, $3 4014; MIPS32R6O0-NEXT: and $9, $7, $5 4015; MIPS32R6O0-NEXT: or $9, $9, $8 4016; MIPS32R6O0-NEXT: sc $9, 0($1) 4017; MIPS32R6O0-NEXT: beqzc $9, $BB11_1 4018; MIPS32R6O0-NEXT: # %bb.2: # %entry 4019; MIPS32R6O0-NEXT: and $6, $7, $3 4020; MIPS32R6O0-NEXT: srlv $6, $6, $2 4021; MIPS32R6O0-NEXT: seb $6, $6 4022; MIPS32R6O0-NEXT: # %bb.3: # %entry 4023; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 4024; MIPS32R6O0-NEXT: sw $6, 0($sp) # 4-byte Folded Spill 4025; MIPS32R6O0-NEXT: # %bb.4: # %entry 4026; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 4027; MIPS32R6O0-NEXT: seb $2, $1 4028; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 4029; MIPS32R6O0-NEXT: jrc $ra 4030; 4031; MIPS4-LABEL: AtomicSwap8: 4032; MIPS4: # %bb.0: # %entry 4033; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4034; MIPS4-NEXT: daddu $1, $1, $25 4035; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4036; MIPS4-NEXT: ld $1, %got_disp(y)($1) 4037; MIPS4-NEXT: daddiu $2, $zero, -4 4038; MIPS4-NEXT: and $2, $1, $2 4039; MIPS4-NEXT: andi $1, $1, 3 4040; MIPS4-NEXT: sll $3, $1, 3 4041; MIPS4-NEXT: ori $1, $zero, 255 4042; MIPS4-NEXT: sllv $5, $1, $3 4043; MIPS4-NEXT: nor $6, $zero, $5 4044; MIPS4-NEXT: sllv $4, $4, $3 4045; MIPS4-NEXT: .LBB11_1: # %entry 4046; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 4047; MIPS4-NEXT: ll $7, 0($2) 4048; MIPS4-NEXT: and $8, $4, $5 4049; MIPS4-NEXT: and $9, $7, $6 4050; MIPS4-NEXT: or $9, $9, $8 4051; MIPS4-NEXT: sc $9, 0($2) 4052; MIPS4-NEXT: beqz $9, .LBB11_1 4053; MIPS4-NEXT: nop 4054; MIPS4-NEXT: # %bb.2: # %entry 4055; MIPS4-NEXT: and $1, $7, $5 4056; MIPS4-NEXT: srlv $1, $1, $3 4057; MIPS4-NEXT: sll $1, $1, 24 4058; MIPS4-NEXT: sra $1, $1, 24 4059; MIPS4-NEXT: # %bb.3: # %entry 4060; MIPS4-NEXT: sll $1, $1, 24 4061; MIPS4-NEXT: jr $ra 4062; MIPS4-NEXT: sra $2, $1, 24 4063; 4064; MIPS64-LABEL: AtomicSwap8: 4065; MIPS64: # %bb.0: # %entry 4066; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4067; MIPS64-NEXT: daddu $1, $1, $25 4068; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4069; MIPS64-NEXT: ld $1, %got_disp(y)($1) 4070; MIPS64-NEXT: daddiu $2, $zero, -4 4071; MIPS64-NEXT: and $2, $1, $2 4072; MIPS64-NEXT: andi $1, $1, 3 4073; MIPS64-NEXT: sll $3, $1, 3 4074; MIPS64-NEXT: ori $1, $zero, 255 4075; MIPS64-NEXT: sllv $5, $1, $3 4076; MIPS64-NEXT: nor $6, $zero, $5 4077; MIPS64-NEXT: sllv $4, $4, $3 4078; MIPS64-NEXT: .LBB11_1: # %entry 4079; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 4080; MIPS64-NEXT: ll $7, 0($2) 4081; MIPS64-NEXT: and $8, $4, $5 4082; MIPS64-NEXT: and $9, $7, $6 4083; MIPS64-NEXT: or $9, $9, $8 4084; MIPS64-NEXT: sc $9, 0($2) 4085; MIPS64-NEXT: beqz $9, .LBB11_1 4086; MIPS64-NEXT: nop 4087; MIPS64-NEXT: # %bb.2: # %entry 4088; MIPS64-NEXT: and $1, $7, $5 4089; MIPS64-NEXT: srlv $1, $1, $3 4090; MIPS64-NEXT: sll $1, $1, 24 4091; MIPS64-NEXT: sra $1, $1, 24 4092; MIPS64-NEXT: # %bb.3: # %entry 4093; MIPS64-NEXT: sll $1, $1, 24 4094; MIPS64-NEXT: jr $ra 4095; MIPS64-NEXT: sra $2, $1, 24 4096; 4097; MIPS64R2-LABEL: AtomicSwap8: 4098; MIPS64R2: # %bb.0: # %entry 4099; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4100; MIPS64R2-NEXT: daddu $1, $1, $25 4101; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4102; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 4103; MIPS64R2-NEXT: daddiu $2, $zero, -4 4104; MIPS64R2-NEXT: and $2, $1, $2 4105; MIPS64R2-NEXT: andi $1, $1, 3 4106; MIPS64R2-NEXT: sll $3, $1, 3 4107; MIPS64R2-NEXT: ori $1, $zero, 255 4108; MIPS64R2-NEXT: sllv $5, $1, $3 4109; MIPS64R2-NEXT: nor $6, $zero, $5 4110; MIPS64R2-NEXT: sllv $4, $4, $3 4111; MIPS64R2-NEXT: .LBB11_1: # %entry 4112; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 4113; MIPS64R2-NEXT: ll $7, 0($2) 4114; MIPS64R2-NEXT: and $8, $4, $5 4115; MIPS64R2-NEXT: and $9, $7, $6 4116; MIPS64R2-NEXT: or $9, $9, $8 4117; MIPS64R2-NEXT: sc $9, 0($2) 4118; MIPS64R2-NEXT: beqz $9, .LBB11_1 4119; MIPS64R2-NEXT: nop 4120; MIPS64R2-NEXT: # %bb.2: # %entry 4121; MIPS64R2-NEXT: and $1, $7, $5 4122; MIPS64R2-NEXT: srlv $1, $1, $3 4123; MIPS64R2-NEXT: seb $1, $1 4124; MIPS64R2-NEXT: # %bb.3: # %entry 4125; MIPS64R2-NEXT: jr $ra 4126; MIPS64R2-NEXT: seb $2, $1 4127; 4128; MIPS64R6-LABEL: AtomicSwap8: 4129; MIPS64R6: # %bb.0: # %entry 4130; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4131; MIPS64R6-NEXT: daddu $1, $1, $25 4132; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4133; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 4134; MIPS64R6-NEXT: daddiu $2, $zero, -4 4135; MIPS64R6-NEXT: and $2, $1, $2 4136; MIPS64R6-NEXT: andi $1, $1, 3 4137; MIPS64R6-NEXT: sll $3, $1, 3 4138; MIPS64R6-NEXT: ori $1, $zero, 255 4139; MIPS64R6-NEXT: sllv $5, $1, $3 4140; MIPS64R6-NEXT: nor $6, $zero, $5 4141; MIPS64R6-NEXT: sllv $4, $4, $3 4142; MIPS64R6-NEXT: .LBB11_1: # %entry 4143; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 4144; MIPS64R6-NEXT: ll $7, 0($2) 4145; MIPS64R6-NEXT: and $8, $4, $5 4146; MIPS64R6-NEXT: and $9, $7, $6 4147; MIPS64R6-NEXT: or $9, $9, $8 4148; MIPS64R6-NEXT: sc $9, 0($2) 4149; MIPS64R6-NEXT: beqzc $9, .LBB11_1 4150; MIPS64R6-NEXT: # %bb.2: # %entry 4151; MIPS64R6-NEXT: and $1, $7, $5 4152; MIPS64R6-NEXT: srlv $1, $1, $3 4153; MIPS64R6-NEXT: seb $1, $1 4154; MIPS64R6-NEXT: # %bb.3: # %entry 4155; MIPS64R6-NEXT: jr $ra 4156; MIPS64R6-NEXT: seb $2, $1 4157; 4158; MIPS64R6O0-LABEL: AtomicSwap8: 4159; MIPS64R6O0: # %bb.0: # %entry 4160; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 4161; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4162; MIPS64R6O0-NEXT: daddu $1, $1, $25 4163; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4164; MIPS64R6O0-NEXT: move $2, $4 4165; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 4166; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 4167; MIPS64R6O0-NEXT: and $4, $1, $4 4168; MIPS64R6O0-NEXT: andi $3, $1, 3 4169; MIPS64R6O0-NEXT: xori $3, $3, 3 4170; MIPS64R6O0-NEXT: sll $3, $3, 3 4171; MIPS64R6O0-NEXT: ori $5, $zero, 255 4172; MIPS64R6O0-NEXT: sllv $5, $5, $3 4173; MIPS64R6O0-NEXT: nor $6, $zero, $5 4174; MIPS64R6O0-NEXT: sllv $2, $2, $3 4175; MIPS64R6O0-NEXT: .LBB11_1: # %entry 4176; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4177; MIPS64R6O0-NEXT: ll $8, 0($4) 4178; MIPS64R6O0-NEXT: and $9, $2, $5 4179; MIPS64R6O0-NEXT: and $10, $8, $6 4180; MIPS64R6O0-NEXT: or $10, $10, $9 4181; MIPS64R6O0-NEXT: sc $10, 0($4) 4182; MIPS64R6O0-NEXT: beqzc $10, .LBB11_1 4183; MIPS64R6O0-NEXT: # %bb.2: # %entry 4184; MIPS64R6O0-NEXT: and $7, $8, $5 4185; MIPS64R6O0-NEXT: srlv $7, $7, $3 4186; MIPS64R6O0-NEXT: seb $7, $7 4187; MIPS64R6O0-NEXT: # %bb.3: # %entry 4188; MIPS64R6O0-NEXT: sw $7, 12($sp) # 4-byte Folded Spill 4189; MIPS64R6O0-NEXT: # %bb.4: # %entry 4190; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 4191; MIPS64R6O0-NEXT: seb $2, $1 4192; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 4193; MIPS64R6O0-NEXT: jrc $ra 4194; 4195; MM32-LABEL: AtomicSwap8: 4196; MM32: # %bb.0: # %entry 4197; MM32-NEXT: lui $2, %hi(_gp_disp) 4198; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 4199; MM32-NEXT: addu $2, $2, $25 4200; MM32-NEXT: lw $1, %got(y)($2) 4201; MM32-NEXT: addiu $2, $zero, -4 4202; MM32-NEXT: and $2, $1, $2 4203; MM32-NEXT: andi $1, $1, 3 4204; MM32-NEXT: sll $3, $1, 3 4205; MM32-NEXT: ori $1, $zero, 255 4206; MM32-NEXT: sllv $5, $1, $3 4207; MM32-NEXT: nor $6, $zero, $5 4208; MM32-NEXT: sllv $4, $4, $3 4209; MM32-NEXT: $BB11_1: # %entry 4210; MM32-NEXT: # =>This Inner Loop Header: Depth=1 4211; MM32-NEXT: ll $7, 0($2) 4212; MM32-NEXT: and $8, $4, $5 4213; MM32-NEXT: and $9, $7, $6 4214; MM32-NEXT: or $9, $9, $8 4215; MM32-NEXT: sc $9, 0($2) 4216; MM32-NEXT: beqzc $9, $BB11_1 4217; MM32-NEXT: # %bb.2: # %entry 4218; MM32-NEXT: and $1, $7, $5 4219; MM32-NEXT: srlv $1, $1, $3 4220; MM32-NEXT: seb $1, $1 4221; MM32-NEXT: # %bb.3: # %entry 4222; MM32-NEXT: jr $ra 4223; MM32-NEXT: seb $2, $1 4224; 4225; O1-LABEL: AtomicSwap8: 4226; O1: # %bb.0: # %entry 4227; O1-NEXT: lui $2, %hi(_gp_disp) 4228; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 4229; O1-NEXT: addu $1, $2, $25 4230; O1-NEXT: lw $1, %got(y)($1) 4231; O1-NEXT: addiu $2, $zero, -4 4232; O1-NEXT: and $2, $1, $2 4233; O1-NEXT: andi $1, $1, 3 4234; O1-NEXT: sll $3, $1, 3 4235; O1-NEXT: ori $1, $zero, 255 4236; O1-NEXT: sllv $5, $1, $3 4237; O1-NEXT: nor $6, $zero, $5 4238; O1-NEXT: sllv $4, $4, $3 4239; O1-NEXT: $BB11_1: # %entry 4240; O1-NEXT: # =>This Inner Loop Header: Depth=1 4241; O1-NEXT: ll $7, 0($2) 4242; O1-NEXT: and $8, $4, $5 4243; O1-NEXT: and $9, $7, $6 4244; O1-NEXT: or $9, $9, $8 4245; O1-NEXT: sc $9, 0($2) 4246; O1-NEXT: beqz $9, $BB11_1 4247; O1-NEXT: nop 4248; O1-NEXT: # %bb.2: # %entry 4249; O1-NEXT: and $1, $7, $5 4250; O1-NEXT: srlv $1, $1, $3 4251; O1-NEXT: sll $1, $1, 24 4252; O1-NEXT: sra $1, $1, 24 4253; O1-NEXT: # %bb.3: # %entry 4254; O1-NEXT: sll $1, $1, 24 4255; O1-NEXT: jr $ra 4256; O1-NEXT: sra $2, $1, 24 4257; 4258; O2-LABEL: AtomicSwap8: 4259; O2: # %bb.0: # %entry 4260; O2-NEXT: lui $2, %hi(_gp_disp) 4261; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 4262; O2-NEXT: addu $1, $2, $25 4263; O2-NEXT: lw $1, %got(y)($1) 4264; O2-NEXT: addiu $2, $zero, -4 4265; O2-NEXT: and $2, $1, $2 4266; O2-NEXT: andi $1, $1, 3 4267; O2-NEXT: sll $3, $1, 3 4268; O2-NEXT: ori $1, $zero, 255 4269; O2-NEXT: sllv $5, $1, $3 4270; O2-NEXT: nor $6, $zero, $5 4271; O2-NEXT: sllv $4, $4, $3 4272; O2-NEXT: $BB11_1: # %entry 4273; O2-NEXT: # =>This Inner Loop Header: Depth=1 4274; O2-NEXT: ll $7, 0($2) 4275; O2-NEXT: and $8, $4, $5 4276; O2-NEXT: and $9, $7, $6 4277; O2-NEXT: or $9, $9, $8 4278; O2-NEXT: sc $9, 0($2) 4279; O2-NEXT: beqz $9, $BB11_1 4280; O2-NEXT: nop 4281; O2-NEXT: # %bb.2: # %entry 4282; O2-NEXT: and $1, $7, $5 4283; O2-NEXT: srlv $1, $1, $3 4284; O2-NEXT: sll $1, $1, 24 4285; O2-NEXT: sra $1, $1, 24 4286; O2-NEXT: # %bb.3: # %entry 4287; O2-NEXT: sll $1, $1, 24 4288; O2-NEXT: jr $ra 4289; O2-NEXT: sra $2, $1, 24 4290; 4291; O3-LABEL: AtomicSwap8: 4292; O3: # %bb.0: # %entry 4293; O3-NEXT: lui $2, %hi(_gp_disp) 4294; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 4295; O3-NEXT: addu $1, $2, $25 4296; O3-NEXT: addiu $2, $zero, -4 4297; O3-NEXT: lw $1, %got(y)($1) 4298; O3-NEXT: and $2, $1, $2 4299; O3-NEXT: andi $1, $1, 3 4300; O3-NEXT: sll $3, $1, 3 4301; O3-NEXT: ori $1, $zero, 255 4302; O3-NEXT: sllv $5, $1, $3 4303; O3-NEXT: sllv $4, $4, $3 4304; O3-NEXT: nor $6, $zero, $5 4305; O3-NEXT: $BB11_1: # %entry 4306; O3-NEXT: # =>This Inner Loop Header: Depth=1 4307; O3-NEXT: ll $7, 0($2) 4308; O3-NEXT: and $8, $4, $5 4309; O3-NEXT: and $9, $7, $6 4310; O3-NEXT: or $9, $9, $8 4311; O3-NEXT: sc $9, 0($2) 4312; O3-NEXT: beqz $9, $BB11_1 4313; O3-NEXT: nop 4314; O3-NEXT: # %bb.2: # %entry 4315; O3-NEXT: and $1, $7, $5 4316; O3-NEXT: srlv $1, $1, $3 4317; O3-NEXT: sll $1, $1, 24 4318; O3-NEXT: sra $1, $1, 24 4319; O3-NEXT: # %bb.3: # %entry 4320; O3-NEXT: sll $1, $1, 24 4321; O3-NEXT: jr $ra 4322; O3-NEXT: sra $2, $1, 24 4323; 4324; MIPS32EB-LABEL: AtomicSwap8: 4325; MIPS32EB: # %bb.0: # %entry 4326; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 4327; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 4328; MIPS32EB-NEXT: addu $1, $2, $25 4329; MIPS32EB-NEXT: lw $1, %got(y)($1) 4330; MIPS32EB-NEXT: addiu $2, $zero, -4 4331; MIPS32EB-NEXT: and $2, $1, $2 4332; MIPS32EB-NEXT: andi $1, $1, 3 4333; MIPS32EB-NEXT: xori $1, $1, 3 4334; MIPS32EB-NEXT: sll $3, $1, 3 4335; MIPS32EB-NEXT: ori $1, $zero, 255 4336; MIPS32EB-NEXT: sllv $5, $1, $3 4337; MIPS32EB-NEXT: nor $6, $zero, $5 4338; MIPS32EB-NEXT: sllv $4, $4, $3 4339; MIPS32EB-NEXT: $BB11_1: # %entry 4340; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 4341; MIPS32EB-NEXT: ll $7, 0($2) 4342; MIPS32EB-NEXT: and $8, $4, $5 4343; MIPS32EB-NEXT: and $9, $7, $6 4344; MIPS32EB-NEXT: or $9, $9, $8 4345; MIPS32EB-NEXT: sc $9, 0($2) 4346; MIPS32EB-NEXT: beqz $9, $BB11_1 4347; MIPS32EB-NEXT: nop 4348; MIPS32EB-NEXT: # %bb.2: # %entry 4349; MIPS32EB-NEXT: and $1, $7, $5 4350; MIPS32EB-NEXT: srlv $1, $1, $3 4351; MIPS32EB-NEXT: sll $1, $1, 24 4352; MIPS32EB-NEXT: sra $1, $1, 24 4353; MIPS32EB-NEXT: # %bb.3: # %entry 4354; MIPS32EB-NEXT: sll $1, $1, 24 4355; MIPS32EB-NEXT: jr $ra 4356; MIPS32EB-NEXT: sra $2, $1, 24 4357entry: 4358 %0 = atomicrmw xchg i8* @y, i8 %newval monotonic 4359 ret i8 %0 4360} 4361 4362define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind { 4363; MIPS32-LABEL: AtomicCmpSwap8: 4364; MIPS32: # %bb.0: # %entry 4365; MIPS32-NEXT: lui $2, %hi(_gp_disp) 4366; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 4367; MIPS32-NEXT: addu $1, $2, $25 4368; MIPS32-NEXT: lw $1, %got(y)($1) 4369; MIPS32-NEXT: addiu $2, $zero, -4 4370; MIPS32-NEXT: and $2, $1, $2 4371; MIPS32-NEXT: andi $1, $1, 3 4372; MIPS32-NEXT: sll $3, $1, 3 4373; MIPS32-NEXT: ori $1, $zero, 255 4374; MIPS32-NEXT: sllv $6, $1, $3 4375; MIPS32-NEXT: nor $7, $zero, $6 4376; MIPS32-NEXT: andi $1, $4, 255 4377; MIPS32-NEXT: sllv $4, $1, $3 4378; MIPS32-NEXT: andi $1, $5, 255 4379; MIPS32-NEXT: sllv $5, $1, $3 4380; MIPS32-NEXT: $BB12_1: # %entry 4381; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 4382; MIPS32-NEXT: ll $8, 0($2) 4383; MIPS32-NEXT: and $9, $8, $6 4384; MIPS32-NEXT: bne $9, $4, $BB12_3 4385; MIPS32-NEXT: nop 4386; MIPS32-NEXT: # %bb.2: # %entry 4387; MIPS32-NEXT: # in Loop: Header=BB12_1 Depth=1 4388; MIPS32-NEXT: and $8, $8, $7 4389; MIPS32-NEXT: or $8, $8, $5 4390; MIPS32-NEXT: sc $8, 0($2) 4391; MIPS32-NEXT: beqz $8, $BB12_1 4392; MIPS32-NEXT: nop 4393; MIPS32-NEXT: $BB12_3: # %entry 4394; MIPS32-NEXT: srlv $1, $9, $3 4395; MIPS32-NEXT: sll $1, $1, 24 4396; MIPS32-NEXT: sra $1, $1, 24 4397; MIPS32-NEXT: # %bb.4: # %entry 4398; MIPS32-NEXT: sll $1, $1, 24 4399; MIPS32-NEXT: jr $ra 4400; MIPS32-NEXT: sra $2, $1, 24 4401; 4402; MIPS32O0-LABEL: AtomicCmpSwap8: 4403; MIPS32O0: # %bb.0: # %entry 4404; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 4405; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 4406; MIPS32O0-NEXT: addiu $sp, $sp, -8 4407; MIPS32O0-NEXT: addu $2, $2, $25 4408; MIPS32O0-NEXT: lw $2, %got(y)($2) 4409; MIPS32O0-NEXT: addiu $25, $zero, -4 4410; MIPS32O0-NEXT: and $25, $2, $25 4411; MIPS32O0-NEXT: andi $2, $2, 3 4412; MIPS32O0-NEXT: sll $2, $2, 3 4413; MIPS32O0-NEXT: ori $1, $zero, 255 4414; MIPS32O0-NEXT: sllv $1, $1, $2 4415; MIPS32O0-NEXT: nor $3, $zero, $1 4416; MIPS32O0-NEXT: andi $4, $4, 255 4417; MIPS32O0-NEXT: sllv $4, $4, $2 4418; MIPS32O0-NEXT: andi $5, $5, 255 4419; MIPS32O0-NEXT: sllv $5, $5, $2 4420; MIPS32O0-NEXT: $BB12_1: # %entry 4421; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 4422; MIPS32O0-NEXT: ll $7, 0($25) 4423; MIPS32O0-NEXT: and $8, $7, $1 4424; MIPS32O0-NEXT: bne $8, $4, $BB12_3 4425; MIPS32O0-NEXT: nop 4426; MIPS32O0-NEXT: # %bb.2: # %entry 4427; MIPS32O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4428; MIPS32O0-NEXT: and $7, $7, $3 4429; MIPS32O0-NEXT: or $7, $7, $5 4430; MIPS32O0-NEXT: sc $7, 0($25) 4431; MIPS32O0-NEXT: beqz $7, $BB12_1 4432; MIPS32O0-NEXT: nop 4433; MIPS32O0-NEXT: $BB12_3: # %entry 4434; MIPS32O0-NEXT: srlv $6, $8, $2 4435; MIPS32O0-NEXT: sll $6, $6, 24 4436; MIPS32O0-NEXT: sra $6, $6, 24 4437; MIPS32O0-NEXT: # %bb.4: # %entry 4438; MIPS32O0-NEXT: sw $6, 4($sp) # 4-byte Folded Spill 4439; MIPS32O0-NEXT: # %bb.5: # %entry 4440; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 4441; MIPS32O0-NEXT: sll $2, $1, 24 4442; MIPS32O0-NEXT: sra $2, $2, 24 4443; MIPS32O0-NEXT: addiu $sp, $sp, 8 4444; MIPS32O0-NEXT: jr $ra 4445; MIPS32O0-NEXT: nop 4446; 4447; MIPS32R2-LABEL: AtomicCmpSwap8: 4448; MIPS32R2: # %bb.0: # %entry 4449; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 4450; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 4451; MIPS32R2-NEXT: addu $1, $2, $25 4452; MIPS32R2-NEXT: lw $1, %got(y)($1) 4453; MIPS32R2-NEXT: addiu $2, $zero, -4 4454; MIPS32R2-NEXT: and $3, $1, $2 4455; MIPS32R2-NEXT: andi $1, $1, 3 4456; MIPS32R2-NEXT: sll $1, $1, 3 4457; MIPS32R2-NEXT: ori $2, $zero, 255 4458; MIPS32R2-NEXT: sllv $6, $2, $1 4459; MIPS32R2-NEXT: nor $7, $zero, $6 4460; MIPS32R2-NEXT: andi $2, $4, 255 4461; MIPS32R2-NEXT: sllv $4, $2, $1 4462; MIPS32R2-NEXT: andi $2, $5, 255 4463; MIPS32R2-NEXT: sllv $5, $2, $1 4464; MIPS32R2-NEXT: $BB12_1: # %entry 4465; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 4466; MIPS32R2-NEXT: ll $8, 0($3) 4467; MIPS32R2-NEXT: and $9, $8, $6 4468; MIPS32R2-NEXT: bne $9, $4, $BB12_3 4469; MIPS32R2-NEXT: nop 4470; MIPS32R2-NEXT: # %bb.2: # %entry 4471; MIPS32R2-NEXT: # in Loop: Header=BB12_1 Depth=1 4472; MIPS32R2-NEXT: and $8, $8, $7 4473; MIPS32R2-NEXT: or $8, $8, $5 4474; MIPS32R2-NEXT: sc $8, 0($3) 4475; MIPS32R2-NEXT: beqz $8, $BB12_1 4476; MIPS32R2-NEXT: nop 4477; MIPS32R2-NEXT: $BB12_3: # %entry 4478; MIPS32R2-NEXT: srlv $2, $9, $1 4479; MIPS32R2-NEXT: seb $2, $2 4480; MIPS32R2-NEXT: # %bb.4: # %entry 4481; MIPS32R2-NEXT: jr $ra 4482; MIPS32R2-NEXT: nop 4483; 4484; MIPS32R6-LABEL: AtomicCmpSwap8: 4485; MIPS32R6: # %bb.0: # %entry 4486; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 4487; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 4488; MIPS32R6-NEXT: addu $1, $2, $25 4489; MIPS32R6-NEXT: lw $1, %got(y)($1) 4490; MIPS32R6-NEXT: addiu $2, $zero, -4 4491; MIPS32R6-NEXT: and $3, $1, $2 4492; MIPS32R6-NEXT: andi $1, $1, 3 4493; MIPS32R6-NEXT: sll $1, $1, 3 4494; MIPS32R6-NEXT: ori $2, $zero, 255 4495; MIPS32R6-NEXT: sllv $6, $2, $1 4496; MIPS32R6-NEXT: nor $7, $zero, $6 4497; MIPS32R6-NEXT: andi $2, $4, 255 4498; MIPS32R6-NEXT: sllv $4, $2, $1 4499; MIPS32R6-NEXT: andi $2, $5, 255 4500; MIPS32R6-NEXT: sllv $5, $2, $1 4501; MIPS32R6-NEXT: $BB12_1: # %entry 4502; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 4503; MIPS32R6-NEXT: ll $8, 0($3) 4504; MIPS32R6-NEXT: and $9, $8, $6 4505; MIPS32R6-NEXT: bnec $9, $4, $BB12_3 4506; MIPS32R6-NEXT: # %bb.2: # %entry 4507; MIPS32R6-NEXT: # in Loop: Header=BB12_1 Depth=1 4508; MIPS32R6-NEXT: and $8, $8, $7 4509; MIPS32R6-NEXT: or $8, $8, $5 4510; MIPS32R6-NEXT: sc $8, 0($3) 4511; MIPS32R6-NEXT: beqzc $8, $BB12_1 4512; MIPS32R6-NEXT: $BB12_3: # %entry 4513; MIPS32R6-NEXT: srlv $2, $9, $1 4514; MIPS32R6-NEXT: seb $2, $2 4515; MIPS32R6-NEXT: # %bb.4: # %entry 4516; MIPS32R6-NEXT: jrc $ra 4517; 4518; MIPS32R6O0-LABEL: AtomicCmpSwap8: 4519; MIPS32R6O0: # %bb.0: # %entry 4520; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 4521; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 4522; MIPS32R6O0-NEXT: addiu $sp, $sp, -16 4523; MIPS32R6O0-NEXT: addu $2, $2, $25 4524; MIPS32R6O0-NEXT: move $25, $5 4525; MIPS32R6O0-NEXT: move $1, $4 4526; MIPS32R6O0-NEXT: lw $2, %got(y)($2) 4527; MIPS32R6O0-NEXT: addiu $3, $zero, -4 4528; MIPS32R6O0-NEXT: and $3, $2, $3 4529; MIPS32R6O0-NEXT: andi $2, $2, 3 4530; MIPS32R6O0-NEXT: sll $2, $2, 3 4531; MIPS32R6O0-NEXT: ori $6, $zero, 255 4532; MIPS32R6O0-NEXT: sllv $6, $6, $2 4533; MIPS32R6O0-NEXT: nor $7, $zero, $6 4534; MIPS32R6O0-NEXT: andi $4, $4, 255 4535; MIPS32R6O0-NEXT: sllv $4, $4, $2 4536; MIPS32R6O0-NEXT: andi $5, $5, 255 4537; MIPS32R6O0-NEXT: sllv $5, $5, $2 4538; MIPS32R6O0-NEXT: $BB12_1: # %entry 4539; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4540; MIPS32R6O0-NEXT: ll $9, 0($3) 4541; MIPS32R6O0-NEXT: and $10, $9, $6 4542; MIPS32R6O0-NEXT: bnec $10, $4, $BB12_3 4543; MIPS32R6O0-NEXT: # %bb.2: # %entry 4544; MIPS32R6O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4545; MIPS32R6O0-NEXT: and $9, $9, $7 4546; MIPS32R6O0-NEXT: or $9, $9, $5 4547; MIPS32R6O0-NEXT: sc $9, 0($3) 4548; MIPS32R6O0-NEXT: beqzc $9, $BB12_1 4549; MIPS32R6O0-NEXT: $BB12_3: # %entry 4550; MIPS32R6O0-NEXT: srlv $8, $10, $2 4551; MIPS32R6O0-NEXT: seb $8, $8 4552; MIPS32R6O0-NEXT: # %bb.4: # %entry 4553; MIPS32R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 4554; MIPS32R6O0-NEXT: sw $8, 8($sp) # 4-byte Folded Spill 4555; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 4556; MIPS32R6O0-NEXT: # %bb.5: # %entry 4557; MIPS32R6O0-NEXT: lw $2, 8($sp) # 4-byte Folded Reload 4558; MIPS32R6O0-NEXT: addiu $sp, $sp, 16 4559; MIPS32R6O0-NEXT: jrc $ra 4560; 4561; MIPS4-LABEL: AtomicCmpSwap8: 4562; MIPS4: # %bb.0: # %entry 4563; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4564; MIPS4-NEXT: daddu $1, $1, $25 4565; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4566; MIPS4-NEXT: ld $1, %got_disp(y)($1) 4567; MIPS4-NEXT: daddiu $2, $zero, -4 4568; MIPS4-NEXT: and $2, $1, $2 4569; MIPS4-NEXT: andi $1, $1, 3 4570; MIPS4-NEXT: sll $3, $1, 3 4571; MIPS4-NEXT: ori $1, $zero, 255 4572; MIPS4-NEXT: sllv $6, $1, $3 4573; MIPS4-NEXT: nor $7, $zero, $6 4574; MIPS4-NEXT: andi $1, $4, 255 4575; MIPS4-NEXT: sllv $4, $1, $3 4576; MIPS4-NEXT: andi $1, $5, 255 4577; MIPS4-NEXT: sllv $5, $1, $3 4578; MIPS4-NEXT: .LBB12_1: # %entry 4579; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 4580; MIPS4-NEXT: ll $8, 0($2) 4581; MIPS4-NEXT: and $9, $8, $6 4582; MIPS4-NEXT: bne $9, $4, .LBB12_3 4583; MIPS4-NEXT: nop 4584; MIPS4-NEXT: # %bb.2: # %entry 4585; MIPS4-NEXT: # in Loop: Header=BB12_1 Depth=1 4586; MIPS4-NEXT: and $8, $8, $7 4587; MIPS4-NEXT: or $8, $8, $5 4588; MIPS4-NEXT: sc $8, 0($2) 4589; MIPS4-NEXT: beqz $8, .LBB12_1 4590; MIPS4-NEXT: nop 4591; MIPS4-NEXT: .LBB12_3: # %entry 4592; MIPS4-NEXT: srlv $1, $9, $3 4593; MIPS4-NEXT: sll $1, $1, 24 4594; MIPS4-NEXT: sra $1, $1, 24 4595; MIPS4-NEXT: # %bb.4: # %entry 4596; MIPS4-NEXT: sll $1, $1, 24 4597; MIPS4-NEXT: jr $ra 4598; MIPS4-NEXT: sra $2, $1, 24 4599; 4600; MIPS64-LABEL: AtomicCmpSwap8: 4601; MIPS64: # %bb.0: # %entry 4602; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4603; MIPS64-NEXT: daddu $1, $1, $25 4604; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4605; MIPS64-NEXT: ld $1, %got_disp(y)($1) 4606; MIPS64-NEXT: daddiu $2, $zero, -4 4607; MIPS64-NEXT: and $2, $1, $2 4608; MIPS64-NEXT: andi $1, $1, 3 4609; MIPS64-NEXT: sll $3, $1, 3 4610; MIPS64-NEXT: ori $1, $zero, 255 4611; MIPS64-NEXT: sllv $6, $1, $3 4612; MIPS64-NEXT: nor $7, $zero, $6 4613; MIPS64-NEXT: andi $1, $4, 255 4614; MIPS64-NEXT: sllv $4, $1, $3 4615; MIPS64-NEXT: andi $1, $5, 255 4616; MIPS64-NEXT: sllv $5, $1, $3 4617; MIPS64-NEXT: .LBB12_1: # %entry 4618; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 4619; MIPS64-NEXT: ll $8, 0($2) 4620; MIPS64-NEXT: and $9, $8, $6 4621; MIPS64-NEXT: bne $9, $4, .LBB12_3 4622; MIPS64-NEXT: nop 4623; MIPS64-NEXT: # %bb.2: # %entry 4624; MIPS64-NEXT: # in Loop: Header=BB12_1 Depth=1 4625; MIPS64-NEXT: and $8, $8, $7 4626; MIPS64-NEXT: or $8, $8, $5 4627; MIPS64-NEXT: sc $8, 0($2) 4628; MIPS64-NEXT: beqz $8, .LBB12_1 4629; MIPS64-NEXT: nop 4630; MIPS64-NEXT: .LBB12_3: # %entry 4631; MIPS64-NEXT: srlv $1, $9, $3 4632; MIPS64-NEXT: sll $1, $1, 24 4633; MIPS64-NEXT: sra $1, $1, 24 4634; MIPS64-NEXT: # %bb.4: # %entry 4635; MIPS64-NEXT: sll $1, $1, 24 4636; MIPS64-NEXT: jr $ra 4637; MIPS64-NEXT: sra $2, $1, 24 4638; 4639; MIPS64R2-LABEL: AtomicCmpSwap8: 4640; MIPS64R2: # %bb.0: # %entry 4641; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4642; MIPS64R2-NEXT: daddu $1, $1, $25 4643; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4644; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 4645; MIPS64R2-NEXT: daddiu $2, $zero, -4 4646; MIPS64R2-NEXT: and $3, $1, $2 4647; MIPS64R2-NEXT: andi $1, $1, 3 4648; MIPS64R2-NEXT: sll $1, $1, 3 4649; MIPS64R2-NEXT: ori $2, $zero, 255 4650; MIPS64R2-NEXT: sllv $6, $2, $1 4651; MIPS64R2-NEXT: nor $7, $zero, $6 4652; MIPS64R2-NEXT: andi $2, $4, 255 4653; MIPS64R2-NEXT: sllv $4, $2, $1 4654; MIPS64R2-NEXT: andi $2, $5, 255 4655; MIPS64R2-NEXT: sllv $5, $2, $1 4656; MIPS64R2-NEXT: .LBB12_1: # %entry 4657; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 4658; MIPS64R2-NEXT: ll $8, 0($3) 4659; MIPS64R2-NEXT: and $9, $8, $6 4660; MIPS64R2-NEXT: bne $9, $4, .LBB12_3 4661; MIPS64R2-NEXT: nop 4662; MIPS64R2-NEXT: # %bb.2: # %entry 4663; MIPS64R2-NEXT: # in Loop: Header=BB12_1 Depth=1 4664; MIPS64R2-NEXT: and $8, $8, $7 4665; MIPS64R2-NEXT: or $8, $8, $5 4666; MIPS64R2-NEXT: sc $8, 0($3) 4667; MIPS64R2-NEXT: beqz $8, .LBB12_1 4668; MIPS64R2-NEXT: nop 4669; MIPS64R2-NEXT: .LBB12_3: # %entry 4670; MIPS64R2-NEXT: srlv $2, $9, $1 4671; MIPS64R2-NEXT: seb $2, $2 4672; MIPS64R2-NEXT: # %bb.4: # %entry 4673; MIPS64R2-NEXT: jr $ra 4674; MIPS64R2-NEXT: nop 4675; 4676; MIPS64R6-LABEL: AtomicCmpSwap8: 4677; MIPS64R6: # %bb.0: # %entry 4678; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4679; MIPS64R6-NEXT: daddu $1, $1, $25 4680; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4681; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 4682; MIPS64R6-NEXT: daddiu $2, $zero, -4 4683; MIPS64R6-NEXT: and $3, $1, $2 4684; MIPS64R6-NEXT: andi $1, $1, 3 4685; MIPS64R6-NEXT: sll $1, $1, 3 4686; MIPS64R6-NEXT: ori $2, $zero, 255 4687; MIPS64R6-NEXT: sllv $6, $2, $1 4688; MIPS64R6-NEXT: nor $7, $zero, $6 4689; MIPS64R6-NEXT: andi $2, $4, 255 4690; MIPS64R6-NEXT: sllv $4, $2, $1 4691; MIPS64R6-NEXT: andi $2, $5, 255 4692; MIPS64R6-NEXT: sllv $5, $2, $1 4693; MIPS64R6-NEXT: .LBB12_1: # %entry 4694; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 4695; MIPS64R6-NEXT: ll $8, 0($3) 4696; MIPS64R6-NEXT: and $9, $8, $6 4697; MIPS64R6-NEXT: bnec $9, $4, .LBB12_3 4698; MIPS64R6-NEXT: # %bb.2: # %entry 4699; MIPS64R6-NEXT: # in Loop: Header=BB12_1 Depth=1 4700; MIPS64R6-NEXT: and $8, $8, $7 4701; MIPS64R6-NEXT: or $8, $8, $5 4702; MIPS64R6-NEXT: sc $8, 0($3) 4703; MIPS64R6-NEXT: beqzc $8, .LBB12_1 4704; MIPS64R6-NEXT: .LBB12_3: # %entry 4705; MIPS64R6-NEXT: srlv $2, $9, $1 4706; MIPS64R6-NEXT: seb $2, $2 4707; MIPS64R6-NEXT: # %bb.4: # %entry 4708; MIPS64R6-NEXT: jrc $ra 4709; 4710; MIPS64R6O0-LABEL: AtomicCmpSwap8: 4711; MIPS64R6O0: # %bb.0: # %entry 4712; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 4713; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4714; MIPS64R6O0-NEXT: daddu $1, $1, $25 4715; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4716; MIPS64R6O0-NEXT: move $2, $5 4717; MIPS64R6O0-NEXT: move $3, $4 4718; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 4719; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 4720; MIPS64R6O0-NEXT: and $4, $1, $4 4721; MIPS64R6O0-NEXT: andi $6, $1, 3 4722; MIPS64R6O0-NEXT: xori $6, $6, 3 4723; MIPS64R6O0-NEXT: sll $6, $6, 3 4724; MIPS64R6O0-NEXT: ori $7, $zero, 255 4725; MIPS64R6O0-NEXT: sllv $7, $7, $6 4726; MIPS64R6O0-NEXT: nor $8, $zero, $7 4727; MIPS64R6O0-NEXT: andi $3, $3, 255 4728; MIPS64R6O0-NEXT: sllv $3, $3, $6 4729; MIPS64R6O0-NEXT: andi $2, $2, 255 4730; MIPS64R6O0-NEXT: sllv $2, $2, $6 4731; MIPS64R6O0-NEXT: .LBB12_1: # %entry 4732; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4733; MIPS64R6O0-NEXT: ll $10, 0($4) 4734; MIPS64R6O0-NEXT: and $11, $10, $7 4735; MIPS64R6O0-NEXT: bnec $11, $3, .LBB12_3 4736; MIPS64R6O0-NEXT: # %bb.2: # %entry 4737; MIPS64R6O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4738; MIPS64R6O0-NEXT: and $10, $10, $8 4739; MIPS64R6O0-NEXT: or $10, $10, $2 4740; MIPS64R6O0-NEXT: sc $10, 0($4) 4741; MIPS64R6O0-NEXT: beqzc $10, .LBB12_1 4742; MIPS64R6O0-NEXT: .LBB12_3: # %entry 4743; MIPS64R6O0-NEXT: srlv $9, $11, $6 4744; MIPS64R6O0-NEXT: seb $9, $9 4745; MIPS64R6O0-NEXT: # %bb.4: # %entry 4746; MIPS64R6O0-NEXT: sw $9, 12($sp) # 4-byte Folded Spill 4747; MIPS64R6O0-NEXT: # %bb.5: # %entry 4748; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 4749; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 4750; MIPS64R6O0-NEXT: jrc $ra 4751; 4752; MM32-LABEL: AtomicCmpSwap8: 4753; MM32: # %bb.0: # %entry 4754; MM32-NEXT: lui $2, %hi(_gp_disp) 4755; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 4756; MM32-NEXT: addu $2, $2, $25 4757; MM32-NEXT: lw $1, %got(y)($2) 4758; MM32-NEXT: addiu $2, $zero, -4 4759; MM32-NEXT: and $3, $1, $2 4760; MM32-NEXT: andi $1, $1, 3 4761; MM32-NEXT: sll $1, $1, 3 4762; MM32-NEXT: ori $2, $zero, 255 4763; MM32-NEXT: sllv $6, $2, $1 4764; MM32-NEXT: nor $7, $zero, $6 4765; MM32-NEXT: andi $2, $4, 255 4766; MM32-NEXT: sllv $4, $2, $1 4767; MM32-NEXT: andi $2, $5, 255 4768; MM32-NEXT: sllv $5, $2, $1 4769; MM32-NEXT: $BB12_1: # %entry 4770; MM32-NEXT: # =>This Inner Loop Header: Depth=1 4771; MM32-NEXT: ll $8, 0($3) 4772; MM32-NEXT: and $9, $8, $6 4773; MM32-NEXT: bne $9, $4, $BB12_3 4774; MM32-NEXT: nop 4775; MM32-NEXT: # %bb.2: # %entry 4776; MM32-NEXT: # in Loop: Header=BB12_1 Depth=1 4777; MM32-NEXT: and $8, $8, $7 4778; MM32-NEXT: or $8, $8, $5 4779; MM32-NEXT: sc $8, 0($3) 4780; MM32-NEXT: beqzc $8, $BB12_1 4781; MM32-NEXT: $BB12_3: # %entry 4782; MM32-NEXT: srlv $2, $9, $1 4783; MM32-NEXT: seb $2, $2 4784; MM32-NEXT: # %bb.4: # %entry 4785; MM32-NEXT: jrc $ra 4786; 4787; O1-LABEL: AtomicCmpSwap8: 4788; O1: # %bb.0: # %entry 4789; O1-NEXT: lui $2, %hi(_gp_disp) 4790; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 4791; O1-NEXT: addu $1, $2, $25 4792; O1-NEXT: lw $1, %got(y)($1) 4793; O1-NEXT: addiu $2, $zero, -4 4794; O1-NEXT: and $2, $1, $2 4795; O1-NEXT: andi $1, $1, 3 4796; O1-NEXT: sll $3, $1, 3 4797; O1-NEXT: ori $1, $zero, 255 4798; O1-NEXT: sllv $6, $1, $3 4799; O1-NEXT: nor $7, $zero, $6 4800; O1-NEXT: andi $1, $4, 255 4801; O1-NEXT: sllv $4, $1, $3 4802; O1-NEXT: andi $1, $5, 255 4803; O1-NEXT: sllv $5, $1, $3 4804; O1-NEXT: $BB12_1: # %entry 4805; O1-NEXT: # =>This Inner Loop Header: Depth=1 4806; O1-NEXT: ll $8, 0($2) 4807; O1-NEXT: and $9, $8, $6 4808; O1-NEXT: bne $9, $4, $BB12_3 4809; O1-NEXT: nop 4810; O1-NEXT: # %bb.2: # %entry 4811; O1-NEXT: # in Loop: Header=BB12_1 Depth=1 4812; O1-NEXT: and $8, $8, $7 4813; O1-NEXT: or $8, $8, $5 4814; O1-NEXT: sc $8, 0($2) 4815; O1-NEXT: beqz $8, $BB12_1 4816; O1-NEXT: nop 4817; O1-NEXT: $BB12_3: # %entry 4818; O1-NEXT: srlv $1, $9, $3 4819; O1-NEXT: sll $1, $1, 24 4820; O1-NEXT: sra $1, $1, 24 4821; O1-NEXT: # %bb.4: # %entry 4822; O1-NEXT: sll $1, $1, 24 4823; O1-NEXT: jr $ra 4824; O1-NEXT: sra $2, $1, 24 4825; 4826; O2-LABEL: AtomicCmpSwap8: 4827; O2: # %bb.0: # %entry 4828; O2-NEXT: lui $2, %hi(_gp_disp) 4829; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 4830; O2-NEXT: addu $1, $2, $25 4831; O2-NEXT: lw $1, %got(y)($1) 4832; O2-NEXT: addiu $2, $zero, -4 4833; O2-NEXT: and $2, $1, $2 4834; O2-NEXT: andi $1, $1, 3 4835; O2-NEXT: sll $3, $1, 3 4836; O2-NEXT: ori $1, $zero, 255 4837; O2-NEXT: sllv $6, $1, $3 4838; O2-NEXT: nor $7, $zero, $6 4839; O2-NEXT: andi $1, $4, 255 4840; O2-NEXT: sllv $4, $1, $3 4841; O2-NEXT: andi $1, $5, 255 4842; O2-NEXT: sllv $5, $1, $3 4843; O2-NEXT: $BB12_1: # %entry 4844; O2-NEXT: # =>This Inner Loop Header: Depth=1 4845; O2-NEXT: ll $8, 0($2) 4846; O2-NEXT: and $9, $8, $6 4847; O2-NEXT: bne $9, $4, $BB12_3 4848; O2-NEXT: nop 4849; O2-NEXT: # %bb.2: # %entry 4850; O2-NEXT: # in Loop: Header=BB12_1 Depth=1 4851; O2-NEXT: and $8, $8, $7 4852; O2-NEXT: or $8, $8, $5 4853; O2-NEXT: sc $8, 0($2) 4854; O2-NEXT: beqz $8, $BB12_1 4855; O2-NEXT: nop 4856; O2-NEXT: $BB12_3: # %entry 4857; O2-NEXT: srlv $1, $9, $3 4858; O2-NEXT: sll $1, $1, 24 4859; O2-NEXT: sra $1, $1, 24 4860; O2-NEXT: # %bb.4: # %entry 4861; O2-NEXT: sll $1, $1, 24 4862; O2-NEXT: jr $ra 4863; O2-NEXT: sra $2, $1, 24 4864; 4865; O3-LABEL: AtomicCmpSwap8: 4866; O3: # %bb.0: # %entry 4867; O3-NEXT: lui $2, %hi(_gp_disp) 4868; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 4869; O3-NEXT: addu $1, $2, $25 4870; O3-NEXT: addiu $2, $zero, -4 4871; O3-NEXT: lw $1, %got(y)($1) 4872; O3-NEXT: and $2, $1, $2 4873; O3-NEXT: andi $1, $1, 3 4874; O3-NEXT: sll $3, $1, 3 4875; O3-NEXT: ori $1, $zero, 255 4876; O3-NEXT: sllv $6, $1, $3 4877; O3-NEXT: andi $1, $4, 255 4878; O3-NEXT: sllv $4, $1, $3 4879; O3-NEXT: andi $1, $5, 255 4880; O3-NEXT: nor $7, $zero, $6 4881; O3-NEXT: sllv $5, $1, $3 4882; O3-NEXT: $BB12_1: # %entry 4883; O3-NEXT: # =>This Inner Loop Header: Depth=1 4884; O3-NEXT: ll $8, 0($2) 4885; O3-NEXT: and $9, $8, $6 4886; O3-NEXT: bne $9, $4, $BB12_3 4887; O3-NEXT: nop 4888; O3-NEXT: # %bb.2: # %entry 4889; O3-NEXT: # in Loop: Header=BB12_1 Depth=1 4890; O3-NEXT: and $8, $8, $7 4891; O3-NEXT: or $8, $8, $5 4892; O3-NEXT: sc $8, 0($2) 4893; O3-NEXT: beqz $8, $BB12_1 4894; O3-NEXT: nop 4895; O3-NEXT: $BB12_3: # %entry 4896; O3-NEXT: srlv $1, $9, $3 4897; O3-NEXT: sll $1, $1, 24 4898; O3-NEXT: sra $1, $1, 24 4899; O3-NEXT: # %bb.4: # %entry 4900; O3-NEXT: sll $1, $1, 24 4901; O3-NEXT: jr $ra 4902; O3-NEXT: sra $2, $1, 24 4903; 4904; MIPS32EB-LABEL: AtomicCmpSwap8: 4905; MIPS32EB: # %bb.0: # %entry 4906; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 4907; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 4908; MIPS32EB-NEXT: addu $1, $2, $25 4909; MIPS32EB-NEXT: lw $1, %got(y)($1) 4910; MIPS32EB-NEXT: addiu $2, $zero, -4 4911; MIPS32EB-NEXT: and $2, $1, $2 4912; MIPS32EB-NEXT: andi $1, $1, 3 4913; MIPS32EB-NEXT: xori $1, $1, 3 4914; MIPS32EB-NEXT: sll $3, $1, 3 4915; MIPS32EB-NEXT: ori $1, $zero, 255 4916; MIPS32EB-NEXT: sllv $6, $1, $3 4917; MIPS32EB-NEXT: nor $7, $zero, $6 4918; MIPS32EB-NEXT: andi $1, $4, 255 4919; MIPS32EB-NEXT: sllv $4, $1, $3 4920; MIPS32EB-NEXT: andi $1, $5, 255 4921; MIPS32EB-NEXT: sllv $5, $1, $3 4922; MIPS32EB-NEXT: $BB12_1: # %entry 4923; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 4924; MIPS32EB-NEXT: ll $8, 0($2) 4925; MIPS32EB-NEXT: and $9, $8, $6 4926; MIPS32EB-NEXT: bne $9, $4, $BB12_3 4927; MIPS32EB-NEXT: nop 4928; MIPS32EB-NEXT: # %bb.2: # %entry 4929; MIPS32EB-NEXT: # in Loop: Header=BB12_1 Depth=1 4930; MIPS32EB-NEXT: and $8, $8, $7 4931; MIPS32EB-NEXT: or $8, $8, $5 4932; MIPS32EB-NEXT: sc $8, 0($2) 4933; MIPS32EB-NEXT: beqz $8, $BB12_1 4934; MIPS32EB-NEXT: nop 4935; MIPS32EB-NEXT: $BB12_3: # %entry 4936; MIPS32EB-NEXT: srlv $1, $9, $3 4937; MIPS32EB-NEXT: sll $1, $1, 24 4938; MIPS32EB-NEXT: sra $1, $1, 24 4939; MIPS32EB-NEXT: # %bb.4: # %entry 4940; MIPS32EB-NEXT: sll $1, $1, 24 4941; MIPS32EB-NEXT: jr $ra 4942; MIPS32EB-NEXT: sra $2, $1, 24 4943entry: 4944 %pair0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic monotonic 4945 %0 = extractvalue { i8, i1 } %pair0, 0 4946 ret i8 %0 4947} 4948 4949define i1 @AtomicCmpSwapRes8(i8* %ptr, i8 signext %oldval, i8 signext %newval) nounwind { 4950; MIPS32-LABEL: AtomicCmpSwapRes8: 4951; MIPS32: # %bb.0: # %entry 4952; MIPS32-NEXT: addiu $1, $zero, -4 4953; MIPS32-NEXT: and $2, $4, $1 4954; MIPS32-NEXT: andi $1, $4, 3 4955; MIPS32-NEXT: sll $3, $1, 3 4956; MIPS32-NEXT: ori $1, $zero, 255 4957; MIPS32-NEXT: sllv $4, $1, $3 4958; MIPS32-NEXT: nor $7, $zero, $4 4959; MIPS32-NEXT: andi $1, $5, 255 4960; MIPS32-NEXT: sllv $8, $1, $3 4961; MIPS32-NEXT: andi $1, $6, 255 4962; MIPS32-NEXT: sllv $6, $1, $3 4963; MIPS32-NEXT: $BB13_1: # %entry 4964; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 4965; MIPS32-NEXT: ll $9, 0($2) 4966; MIPS32-NEXT: and $10, $9, $4 4967; MIPS32-NEXT: bne $10, $8, $BB13_3 4968; MIPS32-NEXT: nop 4969; MIPS32-NEXT: # %bb.2: # %entry 4970; MIPS32-NEXT: # in Loop: Header=BB13_1 Depth=1 4971; MIPS32-NEXT: and $9, $9, $7 4972; MIPS32-NEXT: or $9, $9, $6 4973; MIPS32-NEXT: sc $9, 0($2) 4974; MIPS32-NEXT: beqz $9, $BB13_1 4975; MIPS32-NEXT: nop 4976; MIPS32-NEXT: $BB13_3: # %entry 4977; MIPS32-NEXT: srlv $1, $10, $3 4978; MIPS32-NEXT: sll $1, $1, 24 4979; MIPS32-NEXT: sra $1, $1, 24 4980; MIPS32-NEXT: # %bb.4: # %entry 4981; MIPS32-NEXT: sll $2, $5, 24 4982; MIPS32-NEXT: sra $2, $2, 24 4983; MIPS32-NEXT: xor $1, $1, $2 4984; MIPS32-NEXT: jr $ra 4985; MIPS32-NEXT: sltiu $2, $1, 1 4986; 4987; MIPS32O0-LABEL: AtomicCmpSwapRes8: 4988; MIPS32O0: # %bb.0: # %entry 4989; MIPS32O0-NEXT: addiu $sp, $sp, -8 4990; MIPS32O0-NEXT: addiu $1, $zero, -4 4991; MIPS32O0-NEXT: and $1, $4, $1 4992; MIPS32O0-NEXT: andi $4, $4, 3 4993; MIPS32O0-NEXT: sll $4, $4, 3 4994; MIPS32O0-NEXT: ori $2, $zero, 255 4995; MIPS32O0-NEXT: sllv $2, $2, $4 4996; MIPS32O0-NEXT: nor $3, $zero, $2 4997; MIPS32O0-NEXT: andi $7, $5, 255 4998; MIPS32O0-NEXT: sllv $7, $7, $4 4999; MIPS32O0-NEXT: andi $6, $6, 255 5000; MIPS32O0-NEXT: sllv $6, $6, $4 5001; MIPS32O0-NEXT: $BB13_1: # %entry 5002; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 5003; MIPS32O0-NEXT: ll $9, 0($1) 5004; MIPS32O0-NEXT: and $10, $9, $2 5005; MIPS32O0-NEXT: bne $10, $7, $BB13_3 5006; MIPS32O0-NEXT: nop 5007; MIPS32O0-NEXT: # %bb.2: # %entry 5008; MIPS32O0-NEXT: # in Loop: Header=BB13_1 Depth=1 5009; MIPS32O0-NEXT: and $9, $9, $3 5010; MIPS32O0-NEXT: or $9, $9, $6 5011; MIPS32O0-NEXT: sc $9, 0($1) 5012; MIPS32O0-NEXT: beqz $9, $BB13_1 5013; MIPS32O0-NEXT: nop 5014; MIPS32O0-NEXT: $BB13_3: # %entry 5015; MIPS32O0-NEXT: srlv $8, $10, $4 5016; MIPS32O0-NEXT: sll $8, $8, 24 5017; MIPS32O0-NEXT: sra $8, $8, 24 5018; MIPS32O0-NEXT: # %bb.4: # %entry 5019; MIPS32O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 5020; MIPS32O0-NEXT: sw $8, 0($sp) # 4-byte Folded Spill 5021; MIPS32O0-NEXT: # %bb.5: # %entry 5022; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 5023; MIPS32O0-NEXT: sll $2, $1, 24 5024; MIPS32O0-NEXT: sra $2, $2, 24 5025; MIPS32O0-NEXT: lw $3, 0($sp) # 4-byte Folded Reload 5026; MIPS32O0-NEXT: xor $2, $3, $2 5027; MIPS32O0-NEXT: sltiu $2, $2, 1 5028; MIPS32O0-NEXT: addiu $sp, $sp, 8 5029; MIPS32O0-NEXT: jr $ra 5030; MIPS32O0-NEXT: nop 5031; 5032; MIPS32R2-LABEL: AtomicCmpSwapRes8: 5033; MIPS32R2: # %bb.0: # %entry 5034; MIPS32R2-NEXT: addiu $1, $zero, -4 5035; MIPS32R2-NEXT: and $2, $4, $1 5036; MIPS32R2-NEXT: andi $1, $4, 3 5037; MIPS32R2-NEXT: sll $3, $1, 3 5038; MIPS32R2-NEXT: ori $1, $zero, 255 5039; MIPS32R2-NEXT: sllv $4, $1, $3 5040; MIPS32R2-NEXT: nor $7, $zero, $4 5041; MIPS32R2-NEXT: andi $1, $5, 255 5042; MIPS32R2-NEXT: sllv $8, $1, $3 5043; MIPS32R2-NEXT: andi $1, $6, 255 5044; MIPS32R2-NEXT: sllv $6, $1, $3 5045; MIPS32R2-NEXT: $BB13_1: # %entry 5046; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 5047; MIPS32R2-NEXT: ll $9, 0($2) 5048; MIPS32R2-NEXT: and $10, $9, $4 5049; MIPS32R2-NEXT: bne $10, $8, $BB13_3 5050; MIPS32R2-NEXT: nop 5051; MIPS32R2-NEXT: # %bb.2: # %entry 5052; MIPS32R2-NEXT: # in Loop: Header=BB13_1 Depth=1 5053; MIPS32R2-NEXT: and $9, $9, $7 5054; MIPS32R2-NEXT: or $9, $9, $6 5055; MIPS32R2-NEXT: sc $9, 0($2) 5056; MIPS32R2-NEXT: beqz $9, $BB13_1 5057; MIPS32R2-NEXT: nop 5058; MIPS32R2-NEXT: $BB13_3: # %entry 5059; MIPS32R2-NEXT: srlv $1, $10, $3 5060; MIPS32R2-NEXT: seb $1, $1 5061; MIPS32R2-NEXT: # %bb.4: # %entry 5062; MIPS32R2-NEXT: xor $1, $1, $5 5063; MIPS32R2-NEXT: jr $ra 5064; MIPS32R2-NEXT: sltiu $2, $1, 1 5065; 5066; MIPS32R6-LABEL: AtomicCmpSwapRes8: 5067; MIPS32R6: # %bb.0: # %entry 5068; MIPS32R6-NEXT: addiu $1, $zero, -4 5069; MIPS32R6-NEXT: and $2, $4, $1 5070; MIPS32R6-NEXT: andi $1, $4, 3 5071; MIPS32R6-NEXT: sll $3, $1, 3 5072; MIPS32R6-NEXT: ori $1, $zero, 255 5073; MIPS32R6-NEXT: sllv $4, $1, $3 5074; MIPS32R6-NEXT: nor $7, $zero, $4 5075; MIPS32R6-NEXT: andi $1, $5, 255 5076; MIPS32R6-NEXT: sllv $8, $1, $3 5077; MIPS32R6-NEXT: andi $1, $6, 255 5078; MIPS32R6-NEXT: sllv $6, $1, $3 5079; MIPS32R6-NEXT: $BB13_1: # %entry 5080; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 5081; MIPS32R6-NEXT: ll $9, 0($2) 5082; MIPS32R6-NEXT: and $10, $9, $4 5083; MIPS32R6-NEXT: bnec $10, $8, $BB13_3 5084; MIPS32R6-NEXT: # %bb.2: # %entry 5085; MIPS32R6-NEXT: # in Loop: Header=BB13_1 Depth=1 5086; MIPS32R6-NEXT: and $9, $9, $7 5087; MIPS32R6-NEXT: or $9, $9, $6 5088; MIPS32R6-NEXT: sc $9, 0($2) 5089; MIPS32R6-NEXT: beqzc $9, $BB13_1 5090; MIPS32R6-NEXT: $BB13_3: # %entry 5091; MIPS32R6-NEXT: srlv $1, $10, $3 5092; MIPS32R6-NEXT: seb $1, $1 5093; MIPS32R6-NEXT: # %bb.4: # %entry 5094; MIPS32R6-NEXT: xor $1, $1, $5 5095; MIPS32R6-NEXT: jr $ra 5096; MIPS32R6-NEXT: sltiu $2, $1, 1 5097; 5098; MIPS32R6O0-LABEL: AtomicCmpSwapRes8: 5099; MIPS32R6O0: # %bb.0: # %entry 5100; MIPS32R6O0-NEXT: addiu $sp, $sp, -24 5101; MIPS32R6O0-NEXT: move $1, $6 5102; MIPS32R6O0-NEXT: move $2, $5 5103; MIPS32R6O0-NEXT: move $3, $4 5104; MIPS32R6O0-NEXT: addiu $7, $zero, -4 5105; MIPS32R6O0-NEXT: and $7, $4, $7 5106; MIPS32R6O0-NEXT: andi $4, $4, 3 5107; MIPS32R6O0-NEXT: sll $4, $4, 3 5108; MIPS32R6O0-NEXT: ori $8, $zero, 255 5109; MIPS32R6O0-NEXT: sllv $8, $8, $4 5110; MIPS32R6O0-NEXT: nor $9, $zero, $8 5111; MIPS32R6O0-NEXT: andi $10, $5, 255 5112; MIPS32R6O0-NEXT: sllv $10, $10, $4 5113; MIPS32R6O0-NEXT: andi $6, $6, 255 5114; MIPS32R6O0-NEXT: sllv $6, $6, $4 5115; MIPS32R6O0-NEXT: $BB13_1: # %entry 5116; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5117; MIPS32R6O0-NEXT: ll $12, 0($7) 5118; MIPS32R6O0-NEXT: and $13, $12, $8 5119; MIPS32R6O0-NEXT: bnec $13, $10, $BB13_3 5120; MIPS32R6O0-NEXT: # %bb.2: # %entry 5121; MIPS32R6O0-NEXT: # in Loop: Header=BB13_1 Depth=1 5122; MIPS32R6O0-NEXT: and $12, $12, $9 5123; MIPS32R6O0-NEXT: or $12, $12, $6 5124; MIPS32R6O0-NEXT: sc $12, 0($7) 5125; MIPS32R6O0-NEXT: beqzc $12, $BB13_1 5126; MIPS32R6O0-NEXT: $BB13_3: # %entry 5127; MIPS32R6O0-NEXT: srlv $11, $13, $4 5128; MIPS32R6O0-NEXT: seb $11, $11 5129; MIPS32R6O0-NEXT: # %bb.4: # %entry 5130; MIPS32R6O0-NEXT: sw $11, 20($sp) # 4-byte Folded Spill 5131; MIPS32R6O0-NEXT: sw $5, 16($sp) # 4-byte Folded Spill 5132; MIPS32R6O0-NEXT: sw $3, 12($sp) # 4-byte Folded Spill 5133; MIPS32R6O0-NEXT: sw $1, 8($sp) # 4-byte Folded Spill 5134; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 5135; MIPS32R6O0-NEXT: # %bb.5: # %entry 5136; MIPS32R6O0-NEXT: lw $1, 20($sp) # 4-byte Folded Reload 5137; MIPS32R6O0-NEXT: lw $2, 16($sp) # 4-byte Folded Reload 5138; MIPS32R6O0-NEXT: xor $1, $1, $2 5139; MIPS32R6O0-NEXT: sltiu $2, $1, 1 5140; MIPS32R6O0-NEXT: addiu $sp, $sp, 24 5141; MIPS32R6O0-NEXT: jrc $ra 5142; 5143; MIPS4-LABEL: AtomicCmpSwapRes8: 5144; MIPS4: # %bb.0: # %entry 5145; MIPS4-NEXT: daddiu $1, $zero, -4 5146; MIPS4-NEXT: and $2, $4, $1 5147; MIPS4-NEXT: andi $1, $4, 3 5148; MIPS4-NEXT: sll $3, $1, 3 5149; MIPS4-NEXT: ori $1, $zero, 255 5150; MIPS4-NEXT: sllv $4, $1, $3 5151; MIPS4-NEXT: nor $7, $zero, $4 5152; MIPS4-NEXT: andi $1, $5, 255 5153; MIPS4-NEXT: sllv $8, $1, $3 5154; MIPS4-NEXT: andi $1, $6, 255 5155; MIPS4-NEXT: sllv $6, $1, $3 5156; MIPS4-NEXT: .LBB13_1: # %entry 5157; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 5158; MIPS4-NEXT: ll $9, 0($2) 5159; MIPS4-NEXT: and $10, $9, $4 5160; MIPS4-NEXT: bne $10, $8, .LBB13_3 5161; MIPS4-NEXT: nop 5162; MIPS4-NEXT: # %bb.2: # %entry 5163; MIPS4-NEXT: # in Loop: Header=BB13_1 Depth=1 5164; MIPS4-NEXT: and $9, $9, $7 5165; MIPS4-NEXT: or $9, $9, $6 5166; MIPS4-NEXT: sc $9, 0($2) 5167; MIPS4-NEXT: beqz $9, .LBB13_1 5168; MIPS4-NEXT: nop 5169; MIPS4-NEXT: .LBB13_3: # %entry 5170; MIPS4-NEXT: srlv $1, $10, $3 5171; MIPS4-NEXT: sll $1, $1, 24 5172; MIPS4-NEXT: sra $1, $1, 24 5173; MIPS4-NEXT: # %bb.4: # %entry 5174; MIPS4-NEXT: sll $2, $5, 24 5175; MIPS4-NEXT: sra $2, $2, 24 5176; MIPS4-NEXT: xor $1, $1, $2 5177; MIPS4-NEXT: jr $ra 5178; MIPS4-NEXT: sltiu $2, $1, 1 5179; 5180; MIPS64-LABEL: AtomicCmpSwapRes8: 5181; MIPS64: # %bb.0: # %entry 5182; MIPS64-NEXT: daddiu $1, $zero, -4 5183; MIPS64-NEXT: and $2, $4, $1 5184; MIPS64-NEXT: andi $1, $4, 3 5185; MIPS64-NEXT: sll $3, $1, 3 5186; MIPS64-NEXT: ori $1, $zero, 255 5187; MIPS64-NEXT: sllv $4, $1, $3 5188; MIPS64-NEXT: nor $7, $zero, $4 5189; MIPS64-NEXT: andi $1, $5, 255 5190; MIPS64-NEXT: sllv $8, $1, $3 5191; MIPS64-NEXT: andi $1, $6, 255 5192; MIPS64-NEXT: sllv $6, $1, $3 5193; MIPS64-NEXT: .LBB13_1: # %entry 5194; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 5195; MIPS64-NEXT: ll $9, 0($2) 5196; MIPS64-NEXT: and $10, $9, $4 5197; MIPS64-NEXT: bne $10, $8, .LBB13_3 5198; MIPS64-NEXT: nop 5199; MIPS64-NEXT: # %bb.2: # %entry 5200; MIPS64-NEXT: # in Loop: Header=BB13_1 Depth=1 5201; MIPS64-NEXT: and $9, $9, $7 5202; MIPS64-NEXT: or $9, $9, $6 5203; MIPS64-NEXT: sc $9, 0($2) 5204; MIPS64-NEXT: beqz $9, .LBB13_1 5205; MIPS64-NEXT: nop 5206; MIPS64-NEXT: .LBB13_3: # %entry 5207; MIPS64-NEXT: srlv $1, $10, $3 5208; MIPS64-NEXT: sll $1, $1, 24 5209; MIPS64-NEXT: sra $1, $1, 24 5210; MIPS64-NEXT: # %bb.4: # %entry 5211; MIPS64-NEXT: sll $2, $5, 24 5212; MIPS64-NEXT: sra $2, $2, 24 5213; MIPS64-NEXT: xor $1, $1, $2 5214; MIPS64-NEXT: jr $ra 5215; MIPS64-NEXT: sltiu $2, $1, 1 5216; 5217; MIPS64R2-LABEL: AtomicCmpSwapRes8: 5218; MIPS64R2: # %bb.0: # %entry 5219; MIPS64R2-NEXT: daddiu $1, $zero, -4 5220; MIPS64R2-NEXT: and $2, $4, $1 5221; MIPS64R2-NEXT: andi $1, $4, 3 5222; MIPS64R2-NEXT: sll $3, $1, 3 5223; MIPS64R2-NEXT: ori $1, $zero, 255 5224; MIPS64R2-NEXT: sllv $4, $1, $3 5225; MIPS64R2-NEXT: nor $7, $zero, $4 5226; MIPS64R2-NEXT: andi $1, $5, 255 5227; MIPS64R2-NEXT: sllv $8, $1, $3 5228; MIPS64R2-NEXT: andi $1, $6, 255 5229; MIPS64R2-NEXT: sllv $6, $1, $3 5230; MIPS64R2-NEXT: .LBB13_1: # %entry 5231; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 5232; MIPS64R2-NEXT: ll $9, 0($2) 5233; MIPS64R2-NEXT: and $10, $9, $4 5234; MIPS64R2-NEXT: bne $10, $8, .LBB13_3 5235; MIPS64R2-NEXT: nop 5236; MIPS64R2-NEXT: # %bb.2: # %entry 5237; MIPS64R2-NEXT: # in Loop: Header=BB13_1 Depth=1 5238; MIPS64R2-NEXT: and $9, $9, $7 5239; MIPS64R2-NEXT: or $9, $9, $6 5240; MIPS64R2-NEXT: sc $9, 0($2) 5241; MIPS64R2-NEXT: beqz $9, .LBB13_1 5242; MIPS64R2-NEXT: nop 5243; MIPS64R2-NEXT: .LBB13_3: # %entry 5244; MIPS64R2-NEXT: srlv $1, $10, $3 5245; MIPS64R2-NEXT: seb $1, $1 5246; MIPS64R2-NEXT: # %bb.4: # %entry 5247; MIPS64R2-NEXT: xor $1, $1, $5 5248; MIPS64R2-NEXT: jr $ra 5249; MIPS64R2-NEXT: sltiu $2, $1, 1 5250; 5251; MIPS64R6-LABEL: AtomicCmpSwapRes8: 5252; MIPS64R6: # %bb.0: # %entry 5253; MIPS64R6-NEXT: daddiu $1, $zero, -4 5254; MIPS64R6-NEXT: and $2, $4, $1 5255; MIPS64R6-NEXT: andi $1, $4, 3 5256; MIPS64R6-NEXT: sll $3, $1, 3 5257; MIPS64R6-NEXT: ori $1, $zero, 255 5258; MIPS64R6-NEXT: sllv $4, $1, $3 5259; MIPS64R6-NEXT: nor $7, $zero, $4 5260; MIPS64R6-NEXT: andi $1, $5, 255 5261; MIPS64R6-NEXT: sllv $8, $1, $3 5262; MIPS64R6-NEXT: andi $1, $6, 255 5263; MIPS64R6-NEXT: sllv $6, $1, $3 5264; MIPS64R6-NEXT: .LBB13_1: # %entry 5265; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 5266; MIPS64R6-NEXT: ll $9, 0($2) 5267; MIPS64R6-NEXT: and $10, $9, $4 5268; MIPS64R6-NEXT: bnec $10, $8, .LBB13_3 5269; MIPS64R6-NEXT: # %bb.2: # %entry 5270; MIPS64R6-NEXT: # in Loop: Header=BB13_1 Depth=1 5271; MIPS64R6-NEXT: and $9, $9, $7 5272; MIPS64R6-NEXT: or $9, $9, $6 5273; MIPS64R6-NEXT: sc $9, 0($2) 5274; MIPS64R6-NEXT: beqzc $9, .LBB13_1 5275; MIPS64R6-NEXT: .LBB13_3: # %entry 5276; MIPS64R6-NEXT: srlv $1, $10, $3 5277; MIPS64R6-NEXT: seb $1, $1 5278; MIPS64R6-NEXT: # %bb.4: # %entry 5279; MIPS64R6-NEXT: xor $1, $1, $5 5280; MIPS64R6-NEXT: jr $ra 5281; MIPS64R6-NEXT: sltiu $2, $1, 1 5282; 5283; MIPS64R6O0-LABEL: AtomicCmpSwapRes8: 5284; MIPS64R6O0: # %bb.0: # %entry 5285; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 5286; MIPS64R6O0-NEXT: move $1, $6 5287; MIPS64R6O0-NEXT: move $2, $5 5288; MIPS64R6O0-NEXT: move $5, $4 5289; MIPS64R6O0-NEXT: daddiu $6, $zero, -4 5290; MIPS64R6O0-NEXT: and $6, $4, $6 5291; MIPS64R6O0-NEXT: andi $3, $4, 3 5292; MIPS64R6O0-NEXT: xori $3, $3, 3 5293; MIPS64R6O0-NEXT: sll $3, $3, 3 5294; MIPS64R6O0-NEXT: ori $7, $zero, 255 5295; MIPS64R6O0-NEXT: sllv $7, $7, $3 5296; MIPS64R6O0-NEXT: nor $8, $zero, $7 5297; MIPS64R6O0-NEXT: andi $9, $2, 255 5298; MIPS64R6O0-NEXT: sllv $9, $9, $3 5299; MIPS64R6O0-NEXT: andi $1, $1, 255 5300; MIPS64R6O0-NEXT: sllv $1, $1, $3 5301; MIPS64R6O0-NEXT: .LBB13_1: # %entry 5302; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5303; MIPS64R6O0-NEXT: ll $11, 0($6) 5304; MIPS64R6O0-NEXT: and $12, $11, $7 5305; MIPS64R6O0-NEXT: bnec $12, $9, .LBB13_3 5306; MIPS64R6O0-NEXT: # %bb.2: # %entry 5307; MIPS64R6O0-NEXT: # in Loop: Header=BB13_1 Depth=1 5308; MIPS64R6O0-NEXT: and $11, $11, $8 5309; MIPS64R6O0-NEXT: or $11, $11, $1 5310; MIPS64R6O0-NEXT: sc $11, 0($6) 5311; MIPS64R6O0-NEXT: beqzc $11, .LBB13_1 5312; MIPS64R6O0-NEXT: .LBB13_3: # %entry 5313; MIPS64R6O0-NEXT: srlv $10, $12, $3 5314; MIPS64R6O0-NEXT: seb $10, $10 5315; MIPS64R6O0-NEXT: # %bb.4: # %entry 5316; MIPS64R6O0-NEXT: sd $5, 8($sp) # 8-byte Folded Spill 5317; MIPS64R6O0-NEXT: sw $10, 4($sp) # 4-byte Folded Spill 5318; MIPS64R6O0-NEXT: sw $2, 0($sp) # 4-byte Folded Spill 5319; MIPS64R6O0-NEXT: # %bb.5: # %entry 5320; MIPS64R6O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 5321; MIPS64R6O0-NEXT: lw $2, 0($sp) # 4-byte Folded Reload 5322; MIPS64R6O0-NEXT: xor $1, $1, $2 5323; MIPS64R6O0-NEXT: sltiu $2, $1, 1 5324; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 5325; MIPS64R6O0-NEXT: jrc $ra 5326; 5327; MM32-LABEL: AtomicCmpSwapRes8: 5328; MM32: # %bb.0: # %entry 5329; MM32-NEXT: addiu $1, $zero, -4 5330; MM32-NEXT: and $2, $4, $1 5331; MM32-NEXT: andi $1, $4, 3 5332; MM32-NEXT: sll $3, $1, 3 5333; MM32-NEXT: ori $1, $zero, 255 5334; MM32-NEXT: sllv $4, $1, $3 5335; MM32-NEXT: nor $7, $zero, $4 5336; MM32-NEXT: andi $1, $5, 255 5337; MM32-NEXT: sllv $8, $1, $3 5338; MM32-NEXT: andi $1, $6, 255 5339; MM32-NEXT: sllv $6, $1, $3 5340; MM32-NEXT: $BB13_1: # %entry 5341; MM32-NEXT: # =>This Inner Loop Header: Depth=1 5342; MM32-NEXT: ll $9, 0($2) 5343; MM32-NEXT: and $10, $9, $4 5344; MM32-NEXT: bne $10, $8, $BB13_3 5345; MM32-NEXT: nop 5346; MM32-NEXT: # %bb.2: # %entry 5347; MM32-NEXT: # in Loop: Header=BB13_1 Depth=1 5348; MM32-NEXT: and $9, $9, $7 5349; MM32-NEXT: or $9, $9, $6 5350; MM32-NEXT: sc $9, 0($2) 5351; MM32-NEXT: beqzc $9, $BB13_1 5352; MM32-NEXT: $BB13_3: # %entry 5353; MM32-NEXT: srlv $1, $10, $3 5354; MM32-NEXT: seb $1, $1 5355; MM32-NEXT: # %bb.4: # %entry 5356; MM32-NEXT: xor $1, $1, $5 5357; MM32-NEXT: jr $ra 5358; MM32-NEXT: sltiu $2, $1, 1 5359; 5360; O1-LABEL: AtomicCmpSwapRes8: 5361; O1: # %bb.0: # %entry 5362; O1-NEXT: addiu $1, $zero, -4 5363; O1-NEXT: and $2, $4, $1 5364; O1-NEXT: andi $1, $4, 3 5365; O1-NEXT: sll $3, $1, 3 5366; O1-NEXT: ori $1, $zero, 255 5367; O1-NEXT: sllv $4, $1, $3 5368; O1-NEXT: nor $7, $zero, $4 5369; O1-NEXT: andi $1, $5, 255 5370; O1-NEXT: sllv $8, $1, $3 5371; O1-NEXT: andi $1, $6, 255 5372; O1-NEXT: sllv $6, $1, $3 5373; O1-NEXT: $BB13_1: # %entry 5374; O1-NEXT: # =>This Inner Loop Header: Depth=1 5375; O1-NEXT: ll $9, 0($2) 5376; O1-NEXT: and $10, $9, $4 5377; O1-NEXT: bne $10, $8, $BB13_3 5378; O1-NEXT: nop 5379; O1-NEXT: # %bb.2: # %entry 5380; O1-NEXT: # in Loop: Header=BB13_1 Depth=1 5381; O1-NEXT: and $9, $9, $7 5382; O1-NEXT: or $9, $9, $6 5383; O1-NEXT: sc $9, 0($2) 5384; O1-NEXT: beqz $9, $BB13_1 5385; O1-NEXT: nop 5386; O1-NEXT: $BB13_3: # %entry 5387; O1-NEXT: srlv $1, $10, $3 5388; O1-NEXT: sll $1, $1, 24 5389; O1-NEXT: sra $1, $1, 24 5390; O1-NEXT: # %bb.4: # %entry 5391; O1-NEXT: sll $2, $5, 24 5392; O1-NEXT: sra $2, $2, 24 5393; O1-NEXT: xor $1, $1, $2 5394; O1-NEXT: jr $ra 5395; O1-NEXT: sltiu $2, $1, 1 5396; 5397; O2-LABEL: AtomicCmpSwapRes8: 5398; O2: # %bb.0: # %entry 5399; O2-NEXT: addiu $1, $zero, -4 5400; O2-NEXT: and $2, $4, $1 5401; O2-NEXT: andi $1, $4, 3 5402; O2-NEXT: sll $3, $1, 3 5403; O2-NEXT: ori $1, $zero, 255 5404; O2-NEXT: sllv $4, $1, $3 5405; O2-NEXT: nor $7, $zero, $4 5406; O2-NEXT: andi $1, $5, 255 5407; O2-NEXT: sllv $8, $1, $3 5408; O2-NEXT: andi $1, $6, 255 5409; O2-NEXT: sllv $6, $1, $3 5410; O2-NEXT: $BB13_1: # %entry 5411; O2-NEXT: # =>This Inner Loop Header: Depth=1 5412; O2-NEXT: ll $9, 0($2) 5413; O2-NEXT: and $10, $9, $4 5414; O2-NEXT: bne $10, $8, $BB13_3 5415; O2-NEXT: nop 5416; O2-NEXT: # %bb.2: # %entry 5417; O2-NEXT: # in Loop: Header=BB13_1 Depth=1 5418; O2-NEXT: and $9, $9, $7 5419; O2-NEXT: or $9, $9, $6 5420; O2-NEXT: sc $9, 0($2) 5421; O2-NEXT: beqz $9, $BB13_1 5422; O2-NEXT: nop 5423; O2-NEXT: $BB13_3: # %entry 5424; O2-NEXT: srlv $1, $10, $3 5425; O2-NEXT: sll $1, $1, 24 5426; O2-NEXT: sra $1, $1, 24 5427; O2-NEXT: # %bb.4: # %entry 5428; O2-NEXT: sll $2, $5, 24 5429; O2-NEXT: sra $2, $2, 24 5430; O2-NEXT: xor $1, $1, $2 5431; O2-NEXT: jr $ra 5432; O2-NEXT: sltiu $2, $1, 1 5433; 5434; O3-LABEL: AtomicCmpSwapRes8: 5435; O3: # %bb.0: # %entry 5436; O3-NEXT: addiu $1, $zero, -4 5437; O3-NEXT: and $2, $4, $1 5438; O3-NEXT: andi $1, $4, 3 5439; O3-NEXT: sll $3, $1, 3 5440; O3-NEXT: ori $1, $zero, 255 5441; O3-NEXT: sllv $4, $1, $3 5442; O3-NEXT: andi $1, $5, 255 5443; O3-NEXT: sllv $8, $1, $3 5444; O3-NEXT: andi $1, $6, 255 5445; O3-NEXT: nor $7, $zero, $4 5446; O3-NEXT: sllv $6, $1, $3 5447; O3-NEXT: $BB13_1: # %entry 5448; O3-NEXT: # =>This Inner Loop Header: Depth=1 5449; O3-NEXT: ll $9, 0($2) 5450; O3-NEXT: and $10, $9, $4 5451; O3-NEXT: bne $10, $8, $BB13_3 5452; O3-NEXT: nop 5453; O3-NEXT: # %bb.2: # %entry 5454; O3-NEXT: # in Loop: Header=BB13_1 Depth=1 5455; O3-NEXT: and $9, $9, $7 5456; O3-NEXT: or $9, $9, $6 5457; O3-NEXT: sc $9, 0($2) 5458; O3-NEXT: beqz $9, $BB13_1 5459; O3-NEXT: nop 5460; O3-NEXT: $BB13_3: # %entry 5461; O3-NEXT: srlv $1, $10, $3 5462; O3-NEXT: sll $1, $1, 24 5463; O3-NEXT: sra $1, $1, 24 5464; O3-NEXT: # %bb.4: # %entry 5465; O3-NEXT: sll $2, $5, 24 5466; O3-NEXT: sra $2, $2, 24 5467; O3-NEXT: xor $1, $1, $2 5468; O3-NEXT: jr $ra 5469; O3-NEXT: sltiu $2, $1, 1 5470; 5471; MIPS32EB-LABEL: AtomicCmpSwapRes8: 5472; MIPS32EB: # %bb.0: # %entry 5473; MIPS32EB-NEXT: addiu $1, $zero, -4 5474; MIPS32EB-NEXT: and $2, $4, $1 5475; MIPS32EB-NEXT: andi $1, $4, 3 5476; MIPS32EB-NEXT: xori $1, $1, 3 5477; MIPS32EB-NEXT: sll $3, $1, 3 5478; MIPS32EB-NEXT: ori $1, $zero, 255 5479; MIPS32EB-NEXT: sllv $4, $1, $3 5480; MIPS32EB-NEXT: nor $7, $zero, $4 5481; MIPS32EB-NEXT: andi $1, $5, 255 5482; MIPS32EB-NEXT: sllv $8, $1, $3 5483; MIPS32EB-NEXT: andi $1, $6, 255 5484; MIPS32EB-NEXT: sllv $6, $1, $3 5485; MIPS32EB-NEXT: $BB13_1: # %entry 5486; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 5487; MIPS32EB-NEXT: ll $9, 0($2) 5488; MIPS32EB-NEXT: and $10, $9, $4 5489; MIPS32EB-NEXT: bne $10, $8, $BB13_3 5490; MIPS32EB-NEXT: nop 5491; MIPS32EB-NEXT: # %bb.2: # %entry 5492; MIPS32EB-NEXT: # in Loop: Header=BB13_1 Depth=1 5493; MIPS32EB-NEXT: and $9, $9, $7 5494; MIPS32EB-NEXT: or $9, $9, $6 5495; MIPS32EB-NEXT: sc $9, 0($2) 5496; MIPS32EB-NEXT: beqz $9, $BB13_1 5497; MIPS32EB-NEXT: nop 5498; MIPS32EB-NEXT: $BB13_3: # %entry 5499; MIPS32EB-NEXT: srlv $1, $10, $3 5500; MIPS32EB-NEXT: sll $1, $1, 24 5501; MIPS32EB-NEXT: sra $1, $1, 24 5502; MIPS32EB-NEXT: # %bb.4: # %entry 5503; MIPS32EB-NEXT: sll $2, $5, 24 5504; MIPS32EB-NEXT: sra $2, $2, 24 5505; MIPS32EB-NEXT: xor $1, $1, $2 5506; MIPS32EB-NEXT: jr $ra 5507; MIPS32EB-NEXT: sltiu $2, $1, 1 5508entry: 5509 %0 = cmpxchg i8* %ptr, i8 %oldval, i8 %newval monotonic monotonic 5510 %1 = extractvalue { i8, i1 } %0, 1 5511 ret i1 %1 5512; FIXME: -march=mips produces a redundant sign extension here... 5513; FIXME: ...Leading to this split check. 5514 5515} 5516 5517; Check one i16 so that we cover the seh sign extend 5518@z = common global i16 0, align 1 5519 5520define signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind { 5521; MIPS32-LABEL: AtomicLoadAdd16: 5522; MIPS32: # %bb.0: # %entry 5523; MIPS32-NEXT: lui $2, %hi(_gp_disp) 5524; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 5525; MIPS32-NEXT: addu $1, $2, $25 5526; MIPS32-NEXT: lw $1, %got(z)($1) 5527; MIPS32-NEXT: addiu $2, $zero, -4 5528; MIPS32-NEXT: and $2, $1, $2 5529; MIPS32-NEXT: andi $1, $1, 3 5530; MIPS32-NEXT: sll $3, $1, 3 5531; MIPS32-NEXT: ori $1, $zero, 65535 5532; MIPS32-NEXT: sllv $5, $1, $3 5533; MIPS32-NEXT: nor $6, $zero, $5 5534; MIPS32-NEXT: sllv $4, $4, $3 5535; MIPS32-NEXT: $BB14_1: # %entry 5536; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 5537; MIPS32-NEXT: ll $7, 0($2) 5538; MIPS32-NEXT: addu $8, $7, $4 5539; MIPS32-NEXT: and $8, $8, $5 5540; MIPS32-NEXT: and $9, $7, $6 5541; MIPS32-NEXT: or $9, $9, $8 5542; MIPS32-NEXT: sc $9, 0($2) 5543; MIPS32-NEXT: beqz $9, $BB14_1 5544; MIPS32-NEXT: nop 5545; MIPS32-NEXT: # %bb.2: # %entry 5546; MIPS32-NEXT: and $1, $7, $5 5547; MIPS32-NEXT: srlv $1, $1, $3 5548; MIPS32-NEXT: sll $1, $1, 16 5549; MIPS32-NEXT: sra $1, $1, 16 5550; MIPS32-NEXT: # %bb.3: # %entry 5551; MIPS32-NEXT: sll $1, $1, 16 5552; MIPS32-NEXT: jr $ra 5553; MIPS32-NEXT: sra $2, $1, 16 5554; 5555; MIPS32O0-LABEL: AtomicLoadAdd16: 5556; MIPS32O0: # %bb.0: # %entry 5557; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 5558; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 5559; MIPS32O0-NEXT: addiu $sp, $sp, -8 5560; MIPS32O0-NEXT: addu $2, $2, $25 5561; MIPS32O0-NEXT: lw $2, %got(z)($2) 5562; MIPS32O0-NEXT: addiu $25, $zero, -4 5563; MIPS32O0-NEXT: and $25, $2, $25 5564; MIPS32O0-NEXT: andi $2, $2, 3 5565; MIPS32O0-NEXT: sll $2, $2, 3 5566; MIPS32O0-NEXT: ori $1, $zero, 65535 5567; MIPS32O0-NEXT: sllv $1, $1, $2 5568; MIPS32O0-NEXT: nor $3, $zero, $1 5569; MIPS32O0-NEXT: sllv $4, $4, $2 5570; MIPS32O0-NEXT: $BB14_1: # %entry 5571; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 5572; MIPS32O0-NEXT: ll $6, 0($25) 5573; MIPS32O0-NEXT: addu $7, $6, $4 5574; MIPS32O0-NEXT: and $7, $7, $1 5575; MIPS32O0-NEXT: and $8, $6, $3 5576; MIPS32O0-NEXT: or $8, $8, $7 5577; MIPS32O0-NEXT: sc $8, 0($25) 5578; MIPS32O0-NEXT: beqz $8, $BB14_1 5579; MIPS32O0-NEXT: nop 5580; MIPS32O0-NEXT: # %bb.2: # %entry 5581; MIPS32O0-NEXT: and $5, $6, $1 5582; MIPS32O0-NEXT: srlv $5, $5, $2 5583; MIPS32O0-NEXT: sll $5, $5, 16 5584; MIPS32O0-NEXT: sra $5, $5, 16 5585; MIPS32O0-NEXT: # %bb.3: # %entry 5586; MIPS32O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 5587; MIPS32O0-NEXT: # %bb.4: # %entry 5588; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 5589; MIPS32O0-NEXT: sll $2, $1, 16 5590; MIPS32O0-NEXT: sra $2, $2, 16 5591; MIPS32O0-NEXT: addiu $sp, $sp, 8 5592; MIPS32O0-NEXT: jr $ra 5593; MIPS32O0-NEXT: nop 5594; 5595; MIPS32R2-LABEL: AtomicLoadAdd16: 5596; MIPS32R2: # %bb.0: # %entry 5597; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 5598; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 5599; MIPS32R2-NEXT: addu $1, $2, $25 5600; MIPS32R2-NEXT: lw $1, %got(z)($1) 5601; MIPS32R2-NEXT: addiu $2, $zero, -4 5602; MIPS32R2-NEXT: and $2, $1, $2 5603; MIPS32R2-NEXT: andi $1, $1, 3 5604; MIPS32R2-NEXT: sll $3, $1, 3 5605; MIPS32R2-NEXT: ori $1, $zero, 65535 5606; MIPS32R2-NEXT: sllv $5, $1, $3 5607; MIPS32R2-NEXT: nor $6, $zero, $5 5608; MIPS32R2-NEXT: sllv $4, $4, $3 5609; MIPS32R2-NEXT: $BB14_1: # %entry 5610; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 5611; MIPS32R2-NEXT: ll $7, 0($2) 5612; MIPS32R2-NEXT: addu $8, $7, $4 5613; MIPS32R2-NEXT: and $8, $8, $5 5614; MIPS32R2-NEXT: and $9, $7, $6 5615; MIPS32R2-NEXT: or $9, $9, $8 5616; MIPS32R2-NEXT: sc $9, 0($2) 5617; MIPS32R2-NEXT: beqz $9, $BB14_1 5618; MIPS32R2-NEXT: nop 5619; MIPS32R2-NEXT: # %bb.2: # %entry 5620; MIPS32R2-NEXT: and $1, $7, $5 5621; MIPS32R2-NEXT: srlv $1, $1, $3 5622; MIPS32R2-NEXT: seh $1, $1 5623; MIPS32R2-NEXT: # %bb.3: # %entry 5624; MIPS32R2-NEXT: jr $ra 5625; MIPS32R2-NEXT: seh $2, $1 5626; 5627; MIPS32R6-LABEL: AtomicLoadAdd16: 5628; MIPS32R6: # %bb.0: # %entry 5629; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 5630; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 5631; MIPS32R6-NEXT: addu $1, $2, $25 5632; MIPS32R6-NEXT: lw $1, %got(z)($1) 5633; MIPS32R6-NEXT: addiu $2, $zero, -4 5634; MIPS32R6-NEXT: and $2, $1, $2 5635; MIPS32R6-NEXT: andi $1, $1, 3 5636; MIPS32R6-NEXT: sll $3, $1, 3 5637; MIPS32R6-NEXT: ori $1, $zero, 65535 5638; MIPS32R6-NEXT: sllv $5, $1, $3 5639; MIPS32R6-NEXT: nor $6, $zero, $5 5640; MIPS32R6-NEXT: sllv $4, $4, $3 5641; MIPS32R6-NEXT: $BB14_1: # %entry 5642; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 5643; MIPS32R6-NEXT: ll $7, 0($2) 5644; MIPS32R6-NEXT: addu $8, $7, $4 5645; MIPS32R6-NEXT: and $8, $8, $5 5646; MIPS32R6-NEXT: and $9, $7, $6 5647; MIPS32R6-NEXT: or $9, $9, $8 5648; MIPS32R6-NEXT: sc $9, 0($2) 5649; MIPS32R6-NEXT: beqzc $9, $BB14_1 5650; MIPS32R6-NEXT: # %bb.2: # %entry 5651; MIPS32R6-NEXT: and $1, $7, $5 5652; MIPS32R6-NEXT: srlv $1, $1, $3 5653; MIPS32R6-NEXT: seh $1, $1 5654; MIPS32R6-NEXT: # %bb.3: # %entry 5655; MIPS32R6-NEXT: jr $ra 5656; MIPS32R6-NEXT: seh $2, $1 5657; 5658; MIPS32R6O0-LABEL: AtomicLoadAdd16: 5659; MIPS32R6O0: # %bb.0: # %entry 5660; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 5661; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 5662; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 5663; MIPS32R6O0-NEXT: addu $2, $2, $25 5664; MIPS32R6O0-NEXT: move $25, $4 5665; MIPS32R6O0-NEXT: lw $2, %got(z)($2) 5666; MIPS32R6O0-NEXT: addiu $1, $zero, -4 5667; MIPS32R6O0-NEXT: and $1, $2, $1 5668; MIPS32R6O0-NEXT: andi $2, $2, 3 5669; MIPS32R6O0-NEXT: sll $2, $2, 3 5670; MIPS32R6O0-NEXT: ori $3, $zero, 65535 5671; MIPS32R6O0-NEXT: sllv $3, $3, $2 5672; MIPS32R6O0-NEXT: nor $5, $zero, $3 5673; MIPS32R6O0-NEXT: sllv $4, $4, $2 5674; MIPS32R6O0-NEXT: $BB14_1: # %entry 5675; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5676; MIPS32R6O0-NEXT: ll $7, 0($1) 5677; MIPS32R6O0-NEXT: addu $8, $7, $4 5678; MIPS32R6O0-NEXT: and $8, $8, $3 5679; MIPS32R6O0-NEXT: and $9, $7, $5 5680; MIPS32R6O0-NEXT: or $9, $9, $8 5681; MIPS32R6O0-NEXT: sc $9, 0($1) 5682; MIPS32R6O0-NEXT: beqzc $9, $BB14_1 5683; MIPS32R6O0-NEXT: # %bb.2: # %entry 5684; MIPS32R6O0-NEXT: and $6, $7, $3 5685; MIPS32R6O0-NEXT: srlv $6, $6, $2 5686; MIPS32R6O0-NEXT: seh $6, $6 5687; MIPS32R6O0-NEXT: # %bb.3: # %entry 5688; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 5689; MIPS32R6O0-NEXT: sw $6, 0($sp) # 4-byte Folded Spill 5690; MIPS32R6O0-NEXT: # %bb.4: # %entry 5691; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 5692; MIPS32R6O0-NEXT: seh $2, $1 5693; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 5694; MIPS32R6O0-NEXT: jrc $ra 5695; 5696; MIPS4-LABEL: AtomicLoadAdd16: 5697; MIPS4: # %bb.0: # %entry 5698; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5699; MIPS4-NEXT: daddu $1, $1, $25 5700; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5701; MIPS4-NEXT: ld $1, %got_disp(z)($1) 5702; MIPS4-NEXT: daddiu $2, $zero, -4 5703; MIPS4-NEXT: and $2, $1, $2 5704; MIPS4-NEXT: andi $1, $1, 3 5705; MIPS4-NEXT: sll $3, $1, 3 5706; MIPS4-NEXT: ori $1, $zero, 65535 5707; MIPS4-NEXT: sllv $5, $1, $3 5708; MIPS4-NEXT: nor $6, $zero, $5 5709; MIPS4-NEXT: sllv $4, $4, $3 5710; MIPS4-NEXT: .LBB14_1: # %entry 5711; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 5712; MIPS4-NEXT: ll $7, 0($2) 5713; MIPS4-NEXT: addu $8, $7, $4 5714; MIPS4-NEXT: and $8, $8, $5 5715; MIPS4-NEXT: and $9, $7, $6 5716; MIPS4-NEXT: or $9, $9, $8 5717; MIPS4-NEXT: sc $9, 0($2) 5718; MIPS4-NEXT: beqz $9, .LBB14_1 5719; MIPS4-NEXT: nop 5720; MIPS4-NEXT: # %bb.2: # %entry 5721; MIPS4-NEXT: and $1, $7, $5 5722; MIPS4-NEXT: srlv $1, $1, $3 5723; MIPS4-NEXT: sll $1, $1, 16 5724; MIPS4-NEXT: sra $1, $1, 16 5725; MIPS4-NEXT: # %bb.3: # %entry 5726; MIPS4-NEXT: sll $1, $1, 16 5727; MIPS4-NEXT: jr $ra 5728; MIPS4-NEXT: sra $2, $1, 16 5729; 5730; MIPS64-LABEL: AtomicLoadAdd16: 5731; MIPS64: # %bb.0: # %entry 5732; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5733; MIPS64-NEXT: daddu $1, $1, $25 5734; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5735; MIPS64-NEXT: ld $1, %got_disp(z)($1) 5736; MIPS64-NEXT: daddiu $2, $zero, -4 5737; MIPS64-NEXT: and $2, $1, $2 5738; MIPS64-NEXT: andi $1, $1, 3 5739; MIPS64-NEXT: sll $3, $1, 3 5740; MIPS64-NEXT: ori $1, $zero, 65535 5741; MIPS64-NEXT: sllv $5, $1, $3 5742; MIPS64-NEXT: nor $6, $zero, $5 5743; MIPS64-NEXT: sllv $4, $4, $3 5744; MIPS64-NEXT: .LBB14_1: # %entry 5745; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 5746; MIPS64-NEXT: ll $7, 0($2) 5747; MIPS64-NEXT: addu $8, $7, $4 5748; MIPS64-NEXT: and $8, $8, $5 5749; MIPS64-NEXT: and $9, $7, $6 5750; MIPS64-NEXT: or $9, $9, $8 5751; MIPS64-NEXT: sc $9, 0($2) 5752; MIPS64-NEXT: beqz $9, .LBB14_1 5753; MIPS64-NEXT: nop 5754; MIPS64-NEXT: # %bb.2: # %entry 5755; MIPS64-NEXT: and $1, $7, $5 5756; MIPS64-NEXT: srlv $1, $1, $3 5757; MIPS64-NEXT: sll $1, $1, 16 5758; MIPS64-NEXT: sra $1, $1, 16 5759; MIPS64-NEXT: # %bb.3: # %entry 5760; MIPS64-NEXT: sll $1, $1, 16 5761; MIPS64-NEXT: jr $ra 5762; MIPS64-NEXT: sra $2, $1, 16 5763; 5764; MIPS64R2-LABEL: AtomicLoadAdd16: 5765; MIPS64R2: # %bb.0: # %entry 5766; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5767; MIPS64R2-NEXT: daddu $1, $1, $25 5768; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5769; MIPS64R2-NEXT: ld $1, %got_disp(z)($1) 5770; MIPS64R2-NEXT: daddiu $2, $zero, -4 5771; MIPS64R2-NEXT: and $2, $1, $2 5772; MIPS64R2-NEXT: andi $1, $1, 3 5773; MIPS64R2-NEXT: sll $3, $1, 3 5774; MIPS64R2-NEXT: ori $1, $zero, 65535 5775; MIPS64R2-NEXT: sllv $5, $1, $3 5776; MIPS64R2-NEXT: nor $6, $zero, $5 5777; MIPS64R2-NEXT: sllv $4, $4, $3 5778; MIPS64R2-NEXT: .LBB14_1: # %entry 5779; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 5780; MIPS64R2-NEXT: ll $7, 0($2) 5781; MIPS64R2-NEXT: addu $8, $7, $4 5782; MIPS64R2-NEXT: and $8, $8, $5 5783; MIPS64R2-NEXT: and $9, $7, $6 5784; MIPS64R2-NEXT: or $9, $9, $8 5785; MIPS64R2-NEXT: sc $9, 0($2) 5786; MIPS64R2-NEXT: beqz $9, .LBB14_1 5787; MIPS64R2-NEXT: nop 5788; MIPS64R2-NEXT: # %bb.2: # %entry 5789; MIPS64R2-NEXT: and $1, $7, $5 5790; MIPS64R2-NEXT: srlv $1, $1, $3 5791; MIPS64R2-NEXT: seh $1, $1 5792; MIPS64R2-NEXT: # %bb.3: # %entry 5793; MIPS64R2-NEXT: jr $ra 5794; MIPS64R2-NEXT: seh $2, $1 5795; 5796; MIPS64R6-LABEL: AtomicLoadAdd16: 5797; MIPS64R6: # %bb.0: # %entry 5798; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5799; MIPS64R6-NEXT: daddu $1, $1, $25 5800; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5801; MIPS64R6-NEXT: ld $1, %got_disp(z)($1) 5802; MIPS64R6-NEXT: daddiu $2, $zero, -4 5803; MIPS64R6-NEXT: and $2, $1, $2 5804; MIPS64R6-NEXT: andi $1, $1, 3 5805; MIPS64R6-NEXT: sll $3, $1, 3 5806; MIPS64R6-NEXT: ori $1, $zero, 65535 5807; MIPS64R6-NEXT: sllv $5, $1, $3 5808; MIPS64R6-NEXT: nor $6, $zero, $5 5809; MIPS64R6-NEXT: sllv $4, $4, $3 5810; MIPS64R6-NEXT: .LBB14_1: # %entry 5811; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 5812; MIPS64R6-NEXT: ll $7, 0($2) 5813; MIPS64R6-NEXT: addu $8, $7, $4 5814; MIPS64R6-NEXT: and $8, $8, $5 5815; MIPS64R6-NEXT: and $9, $7, $6 5816; MIPS64R6-NEXT: or $9, $9, $8 5817; MIPS64R6-NEXT: sc $9, 0($2) 5818; MIPS64R6-NEXT: beqzc $9, .LBB14_1 5819; MIPS64R6-NEXT: # %bb.2: # %entry 5820; MIPS64R6-NEXT: and $1, $7, $5 5821; MIPS64R6-NEXT: srlv $1, $1, $3 5822; MIPS64R6-NEXT: seh $1, $1 5823; MIPS64R6-NEXT: # %bb.3: # %entry 5824; MIPS64R6-NEXT: jr $ra 5825; MIPS64R6-NEXT: seh $2, $1 5826; 5827; MIPS64R6O0-LABEL: AtomicLoadAdd16: 5828; MIPS64R6O0: # %bb.0: # %entry 5829; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 5830; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5831; MIPS64R6O0-NEXT: daddu $1, $1, $25 5832; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5833; MIPS64R6O0-NEXT: move $2, $4 5834; MIPS64R6O0-NEXT: ld $1, %got_disp(z)($1) 5835; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 5836; MIPS64R6O0-NEXT: and $4, $1, $4 5837; MIPS64R6O0-NEXT: andi $3, $1, 3 5838; MIPS64R6O0-NEXT: xori $3, $3, 2 5839; MIPS64R6O0-NEXT: sll $3, $3, 3 5840; MIPS64R6O0-NEXT: ori $5, $zero, 65535 5841; MIPS64R6O0-NEXT: sllv $5, $5, $3 5842; MIPS64R6O0-NEXT: nor $6, $zero, $5 5843; MIPS64R6O0-NEXT: sllv $2, $2, $3 5844; MIPS64R6O0-NEXT: .LBB14_1: # %entry 5845; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5846; MIPS64R6O0-NEXT: ll $8, 0($4) 5847; MIPS64R6O0-NEXT: addu $9, $8, $2 5848; MIPS64R6O0-NEXT: and $9, $9, $5 5849; MIPS64R6O0-NEXT: and $10, $8, $6 5850; MIPS64R6O0-NEXT: or $10, $10, $9 5851; MIPS64R6O0-NEXT: sc $10, 0($4) 5852; MIPS64R6O0-NEXT: beqzc $10, .LBB14_1 5853; MIPS64R6O0-NEXT: # %bb.2: # %entry 5854; MIPS64R6O0-NEXT: and $7, $8, $5 5855; MIPS64R6O0-NEXT: srlv $7, $7, $3 5856; MIPS64R6O0-NEXT: seh $7, $7 5857; MIPS64R6O0-NEXT: # %bb.3: # %entry 5858; MIPS64R6O0-NEXT: sw $7, 12($sp) # 4-byte Folded Spill 5859; MIPS64R6O0-NEXT: # %bb.4: # %entry 5860; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 5861; MIPS64R6O0-NEXT: seh $2, $1 5862; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 5863; MIPS64R6O0-NEXT: jrc $ra 5864; 5865; MM32-LABEL: AtomicLoadAdd16: 5866; MM32: # %bb.0: # %entry 5867; MM32-NEXT: lui $2, %hi(_gp_disp) 5868; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 5869; MM32-NEXT: addu $2, $2, $25 5870; MM32-NEXT: lw $1, %got(z)($2) 5871; MM32-NEXT: addiu $2, $zero, -4 5872; MM32-NEXT: and $2, $1, $2 5873; MM32-NEXT: andi $1, $1, 3 5874; MM32-NEXT: sll $3, $1, 3 5875; MM32-NEXT: ori $1, $zero, 65535 5876; MM32-NEXT: sllv $5, $1, $3 5877; MM32-NEXT: nor $6, $zero, $5 5878; MM32-NEXT: sllv $4, $4, $3 5879; MM32-NEXT: $BB14_1: # %entry 5880; MM32-NEXT: # =>This Inner Loop Header: Depth=1 5881; MM32-NEXT: ll $7, 0($2) 5882; MM32-NEXT: addu $8, $7, $4 5883; MM32-NEXT: and $8, $8, $5 5884; MM32-NEXT: and $9, $7, $6 5885; MM32-NEXT: or $9, $9, $8 5886; MM32-NEXT: sc $9, 0($2) 5887; MM32-NEXT: beqzc $9, $BB14_1 5888; MM32-NEXT: # %bb.2: # %entry 5889; MM32-NEXT: and $1, $7, $5 5890; MM32-NEXT: srlv $1, $1, $3 5891; MM32-NEXT: seh $1, $1 5892; MM32-NEXT: # %bb.3: # %entry 5893; MM32-NEXT: jr $ra 5894; MM32-NEXT: seh $2, $1 5895; 5896; O1-LABEL: AtomicLoadAdd16: 5897; O1: # %bb.0: # %entry 5898; O1-NEXT: lui $2, %hi(_gp_disp) 5899; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 5900; O1-NEXT: addu $1, $2, $25 5901; O1-NEXT: lw $1, %got(z)($1) 5902; O1-NEXT: addiu $2, $zero, -4 5903; O1-NEXT: and $2, $1, $2 5904; O1-NEXT: andi $1, $1, 3 5905; O1-NEXT: sll $3, $1, 3 5906; O1-NEXT: ori $1, $zero, 65535 5907; O1-NEXT: sllv $5, $1, $3 5908; O1-NEXT: nor $6, $zero, $5 5909; O1-NEXT: sllv $4, $4, $3 5910; O1-NEXT: $BB14_1: # %entry 5911; O1-NEXT: # =>This Inner Loop Header: Depth=1 5912; O1-NEXT: ll $7, 0($2) 5913; O1-NEXT: addu $8, $7, $4 5914; O1-NEXT: and $8, $8, $5 5915; O1-NEXT: and $9, $7, $6 5916; O1-NEXT: or $9, $9, $8 5917; O1-NEXT: sc $9, 0($2) 5918; O1-NEXT: beqz $9, $BB14_1 5919; O1-NEXT: nop 5920; O1-NEXT: # %bb.2: # %entry 5921; O1-NEXT: and $1, $7, $5 5922; O1-NEXT: srlv $1, $1, $3 5923; O1-NEXT: sll $1, $1, 16 5924; O1-NEXT: sra $1, $1, 16 5925; O1-NEXT: # %bb.3: # %entry 5926; O1-NEXT: sll $1, $1, 16 5927; O1-NEXT: jr $ra 5928; O1-NEXT: sra $2, $1, 16 5929; 5930; O2-LABEL: AtomicLoadAdd16: 5931; O2: # %bb.0: # %entry 5932; O2-NEXT: lui $2, %hi(_gp_disp) 5933; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 5934; O2-NEXT: addu $1, $2, $25 5935; O2-NEXT: lw $1, %got(z)($1) 5936; O2-NEXT: addiu $2, $zero, -4 5937; O2-NEXT: and $2, $1, $2 5938; O2-NEXT: andi $1, $1, 3 5939; O2-NEXT: sll $3, $1, 3 5940; O2-NEXT: ori $1, $zero, 65535 5941; O2-NEXT: sllv $5, $1, $3 5942; O2-NEXT: nor $6, $zero, $5 5943; O2-NEXT: sllv $4, $4, $3 5944; O2-NEXT: $BB14_1: # %entry 5945; O2-NEXT: # =>This Inner Loop Header: Depth=1 5946; O2-NEXT: ll $7, 0($2) 5947; O2-NEXT: addu $8, $7, $4 5948; O2-NEXT: and $8, $8, $5 5949; O2-NEXT: and $9, $7, $6 5950; O2-NEXT: or $9, $9, $8 5951; O2-NEXT: sc $9, 0($2) 5952; O2-NEXT: beqz $9, $BB14_1 5953; O2-NEXT: nop 5954; O2-NEXT: # %bb.2: # %entry 5955; O2-NEXT: and $1, $7, $5 5956; O2-NEXT: srlv $1, $1, $3 5957; O2-NEXT: sll $1, $1, 16 5958; O2-NEXT: sra $1, $1, 16 5959; O2-NEXT: # %bb.3: # %entry 5960; O2-NEXT: sll $1, $1, 16 5961; O2-NEXT: jr $ra 5962; O2-NEXT: sra $2, $1, 16 5963; 5964; O3-LABEL: AtomicLoadAdd16: 5965; O3: # %bb.0: # %entry 5966; O3-NEXT: lui $2, %hi(_gp_disp) 5967; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 5968; O3-NEXT: addu $1, $2, $25 5969; O3-NEXT: addiu $2, $zero, -4 5970; O3-NEXT: lw $1, %got(z)($1) 5971; O3-NEXT: and $2, $1, $2 5972; O3-NEXT: andi $1, $1, 3 5973; O3-NEXT: sll $3, $1, 3 5974; O3-NEXT: ori $1, $zero, 65535 5975; O3-NEXT: sllv $5, $1, $3 5976; O3-NEXT: sllv $4, $4, $3 5977; O3-NEXT: nor $6, $zero, $5 5978; O3-NEXT: $BB14_1: # %entry 5979; O3-NEXT: # =>This Inner Loop Header: Depth=1 5980; O3-NEXT: ll $7, 0($2) 5981; O3-NEXT: addu $8, $7, $4 5982; O3-NEXT: and $8, $8, $5 5983; O3-NEXT: and $9, $7, $6 5984; O3-NEXT: or $9, $9, $8 5985; O3-NEXT: sc $9, 0($2) 5986; O3-NEXT: beqz $9, $BB14_1 5987; O3-NEXT: nop 5988; O3-NEXT: # %bb.2: # %entry 5989; O3-NEXT: and $1, $7, $5 5990; O3-NEXT: srlv $1, $1, $3 5991; O3-NEXT: sll $1, $1, 16 5992; O3-NEXT: sra $1, $1, 16 5993; O3-NEXT: # %bb.3: # %entry 5994; O3-NEXT: sll $1, $1, 16 5995; O3-NEXT: jr $ra 5996; O3-NEXT: sra $2, $1, 16 5997; 5998; MIPS32EB-LABEL: AtomicLoadAdd16: 5999; MIPS32EB: # %bb.0: # %entry 6000; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 6001; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 6002; MIPS32EB-NEXT: addu $1, $2, $25 6003; MIPS32EB-NEXT: lw $1, %got(z)($1) 6004; MIPS32EB-NEXT: addiu $2, $zero, -4 6005; MIPS32EB-NEXT: and $2, $1, $2 6006; MIPS32EB-NEXT: andi $1, $1, 3 6007; MIPS32EB-NEXT: xori $1, $1, 2 6008; MIPS32EB-NEXT: sll $3, $1, 3 6009; MIPS32EB-NEXT: ori $1, $zero, 65535 6010; MIPS32EB-NEXT: sllv $5, $1, $3 6011; MIPS32EB-NEXT: nor $6, $zero, $5 6012; MIPS32EB-NEXT: sllv $4, $4, $3 6013; MIPS32EB-NEXT: $BB14_1: # %entry 6014; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 6015; MIPS32EB-NEXT: ll $7, 0($2) 6016; MIPS32EB-NEXT: addu $8, $7, $4 6017; MIPS32EB-NEXT: and $8, $8, $5 6018; MIPS32EB-NEXT: and $9, $7, $6 6019; MIPS32EB-NEXT: or $9, $9, $8 6020; MIPS32EB-NEXT: sc $9, 0($2) 6021; MIPS32EB-NEXT: beqz $9, $BB14_1 6022; MIPS32EB-NEXT: nop 6023; MIPS32EB-NEXT: # %bb.2: # %entry 6024; MIPS32EB-NEXT: and $1, $7, $5 6025; MIPS32EB-NEXT: srlv $1, $1, $3 6026; MIPS32EB-NEXT: sll $1, $1, 16 6027; MIPS32EB-NEXT: sra $1, $1, 16 6028; MIPS32EB-NEXT: # %bb.3: # %entry 6029; MIPS32EB-NEXT: sll $1, $1, 16 6030; MIPS32EB-NEXT: jr $ra 6031; MIPS32EB-NEXT: sra $2, $1, 16 6032entry: 6033 %0 = atomicrmw add i16* @z, i16 %incr monotonic 6034 ret i16 %0 6035 6036} 6037 6038; Test that the i16 return value from cmpxchg is recognised as signed, 6039; so that setCC doesn't end up comparing an unsigned value to a signed 6040; value. 6041; The rest of the functions here are testing the atomic expansion, so 6042; we just match the end of the function. 6043define {i16, i1} @foo(i16* %addr, i16 %l, i16 %r, i16 %new) { 6044; MIPS32-LABEL: foo: 6045; MIPS32: # %bb.0: 6046; MIPS32-NEXT: addu $1, $5, $6 6047; MIPS32-NEXT: sync 6048; MIPS32-NEXT: addiu $2, $zero, -4 6049; MIPS32-NEXT: and $3, $4, $2 6050; MIPS32-NEXT: andi $2, $4, 3 6051; MIPS32-NEXT: sll $4, $2, 3 6052; MIPS32-NEXT: ori $2, $zero, 65535 6053; MIPS32-NEXT: sllv $5, $2, $4 6054; MIPS32-NEXT: nor $6, $zero, $5 6055; MIPS32-NEXT: andi $2, $1, 65535 6056; MIPS32-NEXT: sllv $8, $2, $4 6057; MIPS32-NEXT: andi $2, $7, 65535 6058; MIPS32-NEXT: sllv $7, $2, $4 6059; MIPS32-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6060; MIPS32-NEXT: ll $9, 0($3) 6061; MIPS32-NEXT: and $10, $9, $5 6062; MIPS32-NEXT: bne $10, $8, $BB15_3 6063; MIPS32-NEXT: nop 6064; MIPS32-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6065; MIPS32-NEXT: and $9, $9, $6 6066; MIPS32-NEXT: or $9, $9, $7 6067; MIPS32-NEXT: sc $9, 0($3) 6068; MIPS32-NEXT: beqz $9, $BB15_1 6069; MIPS32-NEXT: nop 6070; MIPS32-NEXT: $BB15_3: 6071; MIPS32-NEXT: srlv $2, $10, $4 6072; MIPS32-NEXT: sll $2, $2, 16 6073; MIPS32-NEXT: sra $2, $2, 16 6074; MIPS32-NEXT: # %bb.4: 6075; MIPS32-NEXT: sll $1, $1, 16 6076; MIPS32-NEXT: sra $1, $1, 16 6077; MIPS32-NEXT: xor $1, $2, $1 6078; MIPS32-NEXT: sltiu $3, $1, 1 6079; MIPS32-NEXT: sync 6080; MIPS32-NEXT: jr $ra 6081; MIPS32-NEXT: nop 6082; 6083; MIPS32O0-LABEL: foo: 6084; MIPS32O0: # %bb.0: 6085; MIPS32O0-NEXT: addiu $sp, $sp, -8 6086; MIPS32O0-NEXT: .cfi_def_cfa_offset 8 6087; MIPS32O0-NEXT: addu $5, $5, $6 6088; MIPS32O0-NEXT: sync 6089; MIPS32O0-NEXT: addiu $6, $zero, -4 6090; MIPS32O0-NEXT: and $6, $4, $6 6091; MIPS32O0-NEXT: andi $4, $4, 3 6092; MIPS32O0-NEXT: sll $4, $4, 3 6093; MIPS32O0-NEXT: ori $1, $zero, 65535 6094; MIPS32O0-NEXT: sllv $1, $1, $4 6095; MIPS32O0-NEXT: nor $2, $zero, $1 6096; MIPS32O0-NEXT: andi $3, $5, 65535 6097; MIPS32O0-NEXT: sllv $3, $3, $4 6098; MIPS32O0-NEXT: andi $7, $7, 65535 6099; MIPS32O0-NEXT: sllv $7, $7, $4 6100; MIPS32O0-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6101; MIPS32O0-NEXT: ll $9, 0($6) 6102; MIPS32O0-NEXT: and $10, $9, $1 6103; MIPS32O0-NEXT: bne $10, $3, $BB15_3 6104; MIPS32O0-NEXT: nop 6105; MIPS32O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6106; MIPS32O0-NEXT: and $9, $9, $2 6107; MIPS32O0-NEXT: or $9, $9, $7 6108; MIPS32O0-NEXT: sc $9, 0($6) 6109; MIPS32O0-NEXT: beqz $9, $BB15_1 6110; MIPS32O0-NEXT: nop 6111; MIPS32O0-NEXT: $BB15_3: 6112; MIPS32O0-NEXT: srlv $8, $10, $4 6113; MIPS32O0-NEXT: sll $8, $8, 16 6114; MIPS32O0-NEXT: sra $8, $8, 16 6115; MIPS32O0-NEXT: # %bb.4: 6116; MIPS32O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 6117; MIPS32O0-NEXT: sw $8, 0($sp) # 4-byte Folded Spill 6118; MIPS32O0-NEXT: # %bb.5: 6119; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 6120; MIPS32O0-NEXT: sll $2, $1, 16 6121; MIPS32O0-NEXT: sra $2, $2, 16 6122; MIPS32O0-NEXT: lw $3, 0($sp) # 4-byte Folded Reload 6123; MIPS32O0-NEXT: xor $2, $3, $2 6124; MIPS32O0-NEXT: sltiu $3, $2, 1 6125; MIPS32O0-NEXT: sync 6126; MIPS32O0-NEXT: lw $2, 0($sp) # 4-byte Folded Reload 6127; MIPS32O0-NEXT: addiu $sp, $sp, 8 6128; MIPS32O0-NEXT: jr $ra 6129; MIPS32O0-NEXT: nop 6130; 6131; MIPS32R2-LABEL: foo: 6132; MIPS32R2: # %bb.0: 6133; MIPS32R2-NEXT: addu $1, $5, $6 6134; MIPS32R2-NEXT: sync 6135; MIPS32R2-NEXT: addiu $2, $zero, -4 6136; MIPS32R2-NEXT: and $3, $4, $2 6137; MIPS32R2-NEXT: andi $2, $4, 3 6138; MIPS32R2-NEXT: sll $4, $2, 3 6139; MIPS32R2-NEXT: ori $2, $zero, 65535 6140; MIPS32R2-NEXT: sllv $5, $2, $4 6141; MIPS32R2-NEXT: nor $6, $zero, $5 6142; MIPS32R2-NEXT: andi $2, $1, 65535 6143; MIPS32R2-NEXT: sllv $8, $2, $4 6144; MIPS32R2-NEXT: andi $2, $7, 65535 6145; MIPS32R2-NEXT: sllv $7, $2, $4 6146; MIPS32R2-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6147; MIPS32R2-NEXT: ll $9, 0($3) 6148; MIPS32R2-NEXT: and $10, $9, $5 6149; MIPS32R2-NEXT: bne $10, $8, $BB15_3 6150; MIPS32R2-NEXT: nop 6151; MIPS32R2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6152; MIPS32R2-NEXT: and $9, $9, $6 6153; MIPS32R2-NEXT: or $9, $9, $7 6154; MIPS32R2-NEXT: sc $9, 0($3) 6155; MIPS32R2-NEXT: beqz $9, $BB15_1 6156; MIPS32R2-NEXT: nop 6157; MIPS32R2-NEXT: $BB15_3: 6158; MIPS32R2-NEXT: srlv $2, $10, $4 6159; MIPS32R2-NEXT: seh $2, $2 6160; MIPS32R2-NEXT: # %bb.4: 6161; MIPS32R2-NEXT: seh $1, $1 6162; MIPS32R2-NEXT: xor $1, $2, $1 6163; MIPS32R2-NEXT: sltiu $3, $1, 1 6164; MIPS32R2-NEXT: sync 6165; MIPS32R2-NEXT: jr $ra 6166; MIPS32R2-NEXT: nop 6167; 6168; MIPS32R6-LABEL: foo: 6169; MIPS32R6: # %bb.0: 6170; MIPS32R6-NEXT: addu $1, $5, $6 6171; MIPS32R6-NEXT: sync 6172; MIPS32R6-NEXT: addiu $2, $zero, -4 6173; MIPS32R6-NEXT: and $3, $4, $2 6174; MIPS32R6-NEXT: andi $2, $4, 3 6175; MIPS32R6-NEXT: sll $4, $2, 3 6176; MIPS32R6-NEXT: ori $2, $zero, 65535 6177; MIPS32R6-NEXT: sllv $5, $2, $4 6178; MIPS32R6-NEXT: nor $6, $zero, $5 6179; MIPS32R6-NEXT: andi $2, $1, 65535 6180; MIPS32R6-NEXT: sllv $8, $2, $4 6181; MIPS32R6-NEXT: andi $2, $7, 65535 6182; MIPS32R6-NEXT: sllv $7, $2, $4 6183; MIPS32R6-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6184; MIPS32R6-NEXT: ll $9, 0($3) 6185; MIPS32R6-NEXT: and $10, $9, $5 6186; MIPS32R6-NEXT: bnec $10, $8, $BB15_3 6187; MIPS32R6-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6188; MIPS32R6-NEXT: and $9, $9, $6 6189; MIPS32R6-NEXT: or $9, $9, $7 6190; MIPS32R6-NEXT: sc $9, 0($3) 6191; MIPS32R6-NEXT: beqzc $9, $BB15_1 6192; MIPS32R6-NEXT: $BB15_3: 6193; MIPS32R6-NEXT: srlv $2, $10, $4 6194; MIPS32R6-NEXT: seh $2, $2 6195; MIPS32R6-NEXT: # %bb.4: 6196; MIPS32R6-NEXT: seh $1, $1 6197; MIPS32R6-NEXT: xor $1, $2, $1 6198; MIPS32R6-NEXT: sltiu $3, $1, 1 6199; MIPS32R6-NEXT: sync 6200; MIPS32R6-NEXT: jrc $ra 6201; 6202; MIPS32R6O0-LABEL: foo: 6203; MIPS32R6O0: # %bb.0: 6204; MIPS32R6O0-NEXT: addiu $sp, $sp, -24 6205; MIPS32R6O0-NEXT: .cfi_def_cfa_offset 24 6206; MIPS32R6O0-NEXT: move $1, $7 6207; MIPS32R6O0-NEXT: move $2, $6 6208; MIPS32R6O0-NEXT: move $3, $5 6209; MIPS32R6O0-NEXT: move $8, $4 6210; MIPS32R6O0-NEXT: addu $5, $5, $6 6211; MIPS32R6O0-NEXT: sync 6212; MIPS32R6O0-NEXT: addiu $6, $zero, -4 6213; MIPS32R6O0-NEXT: and $6, $4, $6 6214; MIPS32R6O0-NEXT: andi $4, $4, 3 6215; MIPS32R6O0-NEXT: sll $4, $4, 3 6216; MIPS32R6O0-NEXT: ori $9, $zero, 65535 6217; MIPS32R6O0-NEXT: sllv $9, $9, $4 6218; MIPS32R6O0-NEXT: nor $10, $zero, $9 6219; MIPS32R6O0-NEXT: andi $11, $5, 65535 6220; MIPS32R6O0-NEXT: sllv $11, $11, $4 6221; MIPS32R6O0-NEXT: andi $7, $7, 65535 6222; MIPS32R6O0-NEXT: sllv $7, $7, $4 6223; MIPS32R6O0-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6224; MIPS32R6O0-NEXT: ll $13, 0($6) 6225; MIPS32R6O0-NEXT: and $14, $13, $9 6226; MIPS32R6O0-NEXT: bnec $14, $11, $BB15_3 6227; MIPS32R6O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6228; MIPS32R6O0-NEXT: and $13, $13, $10 6229; MIPS32R6O0-NEXT: or $13, $13, $7 6230; MIPS32R6O0-NEXT: sc $13, 0($6) 6231; MIPS32R6O0-NEXT: beqzc $13, $BB15_1 6232; MIPS32R6O0-NEXT: $BB15_3: 6233; MIPS32R6O0-NEXT: srlv $12, $14, $4 6234; MIPS32R6O0-NEXT: seh $12, $12 6235; MIPS32R6O0-NEXT: # %bb.4: 6236; MIPS32R6O0-NEXT: sw $12, 20($sp) # 4-byte Folded Spill 6237; MIPS32R6O0-NEXT: sw $3, 16($sp) # 4-byte Folded Spill 6238; MIPS32R6O0-NEXT: sw $8, 12($sp) # 4-byte Folded Spill 6239; MIPS32R6O0-NEXT: sw $5, 8($sp) # 4-byte Folded Spill 6240; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 6241; MIPS32R6O0-NEXT: sw $2, 0($sp) # 4-byte Folded Spill 6242; MIPS32R6O0-NEXT: # %bb.5: 6243; MIPS32R6O0-NEXT: lw $1, 8($sp) # 4-byte Folded Reload 6244; MIPS32R6O0-NEXT: seh $2, $1 6245; MIPS32R6O0-NEXT: lw $3, 20($sp) # 4-byte Folded Reload 6246; MIPS32R6O0-NEXT: xor $2, $3, $2 6247; MIPS32R6O0-NEXT: sltiu $3, $2, 1 6248; MIPS32R6O0-NEXT: sync 6249; MIPS32R6O0-NEXT: lw $2, 20($sp) # 4-byte Folded Reload 6250; MIPS32R6O0-NEXT: addiu $sp, $sp, 24 6251; MIPS32R6O0-NEXT: jrc $ra 6252; 6253; MIPS4-LABEL: foo: 6254; MIPS4: # %bb.0: 6255; MIPS4-NEXT: sll $1, $6, 0 6256; MIPS4-NEXT: sll $2, $5, 0 6257; MIPS4-NEXT: addu $1, $2, $1 6258; MIPS4-NEXT: sync 6259; MIPS4-NEXT: sll $2, $7, 0 6260; MIPS4-NEXT: daddiu $3, $zero, -4 6261; MIPS4-NEXT: and $3, $4, $3 6262; MIPS4-NEXT: andi $4, $4, 3 6263; MIPS4-NEXT: sll $4, $4, 3 6264; MIPS4-NEXT: ori $5, $zero, 65535 6265; MIPS4-NEXT: sllv $5, $5, $4 6266; MIPS4-NEXT: nor $6, $zero, $5 6267; MIPS4-NEXT: andi $7, $1, 65535 6268; MIPS4-NEXT: sllv $7, $7, $4 6269; MIPS4-NEXT: andi $2, $2, 65535 6270; MIPS4-NEXT: sllv $8, $2, $4 6271; MIPS4-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6272; MIPS4-NEXT: ll $9, 0($3) 6273; MIPS4-NEXT: and $10, $9, $5 6274; MIPS4-NEXT: bne $10, $7, .LBB15_3 6275; MIPS4-NEXT: nop 6276; MIPS4-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6277; MIPS4-NEXT: and $9, $9, $6 6278; MIPS4-NEXT: or $9, $9, $8 6279; MIPS4-NEXT: sc $9, 0($3) 6280; MIPS4-NEXT: beqz $9, .LBB15_1 6281; MIPS4-NEXT: nop 6282; MIPS4-NEXT: .LBB15_3: 6283; MIPS4-NEXT: srlv $2, $10, $4 6284; MIPS4-NEXT: sll $2, $2, 16 6285; MIPS4-NEXT: sra $2, $2, 16 6286; MIPS4-NEXT: # %bb.4: 6287; MIPS4-NEXT: sll $1, $1, 16 6288; MIPS4-NEXT: sra $1, $1, 16 6289; MIPS4-NEXT: xor $1, $2, $1 6290; MIPS4-NEXT: sltiu $3, $1, 1 6291; MIPS4-NEXT: sync 6292; MIPS4-NEXT: jr $ra 6293; MIPS4-NEXT: nop 6294; 6295; MIPS64-LABEL: foo: 6296; MIPS64: # %bb.0: 6297; MIPS64-NEXT: sll $1, $6, 0 6298; MIPS64-NEXT: sll $2, $5, 0 6299; MIPS64-NEXT: addu $1, $2, $1 6300; MIPS64-NEXT: sync 6301; MIPS64-NEXT: sll $2, $7, 0 6302; MIPS64-NEXT: daddiu $3, $zero, -4 6303; MIPS64-NEXT: and $3, $4, $3 6304; MIPS64-NEXT: andi $4, $4, 3 6305; MIPS64-NEXT: sll $4, $4, 3 6306; MIPS64-NEXT: ori $5, $zero, 65535 6307; MIPS64-NEXT: sllv $5, $5, $4 6308; MIPS64-NEXT: nor $6, $zero, $5 6309; MIPS64-NEXT: andi $7, $1, 65535 6310; MIPS64-NEXT: sllv $7, $7, $4 6311; MIPS64-NEXT: andi $2, $2, 65535 6312; MIPS64-NEXT: sllv $8, $2, $4 6313; MIPS64-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6314; MIPS64-NEXT: ll $9, 0($3) 6315; MIPS64-NEXT: and $10, $9, $5 6316; MIPS64-NEXT: bne $10, $7, .LBB15_3 6317; MIPS64-NEXT: nop 6318; MIPS64-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6319; MIPS64-NEXT: and $9, $9, $6 6320; MIPS64-NEXT: or $9, $9, $8 6321; MIPS64-NEXT: sc $9, 0($3) 6322; MIPS64-NEXT: beqz $9, .LBB15_1 6323; MIPS64-NEXT: nop 6324; MIPS64-NEXT: .LBB15_3: 6325; MIPS64-NEXT: srlv $2, $10, $4 6326; MIPS64-NEXT: sll $2, $2, 16 6327; MIPS64-NEXT: sra $2, $2, 16 6328; MIPS64-NEXT: # %bb.4: 6329; MIPS64-NEXT: sll $1, $1, 16 6330; MIPS64-NEXT: sra $1, $1, 16 6331; MIPS64-NEXT: xor $1, $2, $1 6332; MIPS64-NEXT: sltiu $3, $1, 1 6333; MIPS64-NEXT: sync 6334; MIPS64-NEXT: jr $ra 6335; MIPS64-NEXT: nop 6336; 6337; MIPS64R2-LABEL: foo: 6338; MIPS64R2: # %bb.0: 6339; MIPS64R2-NEXT: sll $1, $6, 0 6340; MIPS64R2-NEXT: sll $2, $5, 0 6341; MIPS64R2-NEXT: addu $1, $2, $1 6342; MIPS64R2-NEXT: sync 6343; MIPS64R2-NEXT: sll $2, $7, 0 6344; MIPS64R2-NEXT: daddiu $3, $zero, -4 6345; MIPS64R2-NEXT: and $3, $4, $3 6346; MIPS64R2-NEXT: andi $4, $4, 3 6347; MIPS64R2-NEXT: sll $4, $4, 3 6348; MIPS64R2-NEXT: ori $5, $zero, 65535 6349; MIPS64R2-NEXT: sllv $5, $5, $4 6350; MIPS64R2-NEXT: nor $6, $zero, $5 6351; MIPS64R2-NEXT: andi $7, $1, 65535 6352; MIPS64R2-NEXT: sllv $7, $7, $4 6353; MIPS64R2-NEXT: andi $2, $2, 65535 6354; MIPS64R2-NEXT: sllv $8, $2, $4 6355; MIPS64R2-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6356; MIPS64R2-NEXT: ll $9, 0($3) 6357; MIPS64R2-NEXT: and $10, $9, $5 6358; MIPS64R2-NEXT: bne $10, $7, .LBB15_3 6359; MIPS64R2-NEXT: nop 6360; MIPS64R2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6361; MIPS64R2-NEXT: and $9, $9, $6 6362; MIPS64R2-NEXT: or $9, $9, $8 6363; MIPS64R2-NEXT: sc $9, 0($3) 6364; MIPS64R2-NEXT: beqz $9, .LBB15_1 6365; MIPS64R2-NEXT: nop 6366; MIPS64R2-NEXT: .LBB15_3: 6367; MIPS64R2-NEXT: srlv $2, $10, $4 6368; MIPS64R2-NEXT: seh $2, $2 6369; MIPS64R2-NEXT: # %bb.4: 6370; MIPS64R2-NEXT: seh $1, $1 6371; MIPS64R2-NEXT: xor $1, $2, $1 6372; MIPS64R2-NEXT: sltiu $3, $1, 1 6373; MIPS64R2-NEXT: sync 6374; MIPS64R2-NEXT: jr $ra 6375; MIPS64R2-NEXT: nop 6376; 6377; MIPS64R6-LABEL: foo: 6378; MIPS64R6: # %bb.0: 6379; MIPS64R6-NEXT: sll $1, $6, 0 6380; MIPS64R6-NEXT: sll $2, $5, 0 6381; MIPS64R6-NEXT: addu $1, $2, $1 6382; MIPS64R6-NEXT: sync 6383; MIPS64R6-NEXT: sll $2, $7, 0 6384; MIPS64R6-NEXT: daddiu $3, $zero, -4 6385; MIPS64R6-NEXT: and $3, $4, $3 6386; MIPS64R6-NEXT: andi $4, $4, 3 6387; MIPS64R6-NEXT: sll $4, $4, 3 6388; MIPS64R6-NEXT: ori $5, $zero, 65535 6389; MIPS64R6-NEXT: sllv $5, $5, $4 6390; MIPS64R6-NEXT: nor $6, $zero, $5 6391; MIPS64R6-NEXT: andi $7, $1, 65535 6392; MIPS64R6-NEXT: sllv $7, $7, $4 6393; MIPS64R6-NEXT: andi $2, $2, 65535 6394; MIPS64R6-NEXT: sllv $8, $2, $4 6395; MIPS64R6-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6396; MIPS64R6-NEXT: ll $9, 0($3) 6397; MIPS64R6-NEXT: and $10, $9, $5 6398; MIPS64R6-NEXT: bnec $10, $7, .LBB15_3 6399; MIPS64R6-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6400; MIPS64R6-NEXT: and $9, $9, $6 6401; MIPS64R6-NEXT: or $9, $9, $8 6402; MIPS64R6-NEXT: sc $9, 0($3) 6403; MIPS64R6-NEXT: beqzc $9, .LBB15_1 6404; MIPS64R6-NEXT: .LBB15_3: 6405; MIPS64R6-NEXT: srlv $2, $10, $4 6406; MIPS64R6-NEXT: seh $2, $2 6407; MIPS64R6-NEXT: # %bb.4: 6408; MIPS64R6-NEXT: seh $1, $1 6409; MIPS64R6-NEXT: xor $1, $2, $1 6410; MIPS64R6-NEXT: sltiu $3, $1, 1 6411; MIPS64R6-NEXT: sync 6412; MIPS64R6-NEXT: jrc $ra 6413; 6414; MIPS64R6O0-LABEL: foo: 6415; MIPS64R6O0: # %bb.0: 6416; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 6417; MIPS64R6O0-NEXT: .cfi_def_cfa_offset 16 6418; MIPS64R6O0-NEXT: move $1, $7 6419; MIPS64R6O0-NEXT: sll $1, $1, 0 6420; MIPS64R6O0-NEXT: move $2, $6 6421; MIPS64R6O0-NEXT: sll $2, $2, 0 6422; MIPS64R6O0-NEXT: move $3, $5 6423; MIPS64R6O0-NEXT: sll $3, $3, 0 6424; MIPS64R6O0-NEXT: move $5, $4 6425; MIPS64R6O0-NEXT: addu $2, $3, $2 6426; MIPS64R6O0-NEXT: sync 6427; MIPS64R6O0-NEXT: daddiu $6, $zero, -4 6428; MIPS64R6O0-NEXT: and $6, $4, $6 6429; MIPS64R6O0-NEXT: andi $3, $4, 3 6430; MIPS64R6O0-NEXT: xori $3, $3, 2 6431; MIPS64R6O0-NEXT: sll $3, $3, 3 6432; MIPS64R6O0-NEXT: ori $8, $zero, 65535 6433; MIPS64R6O0-NEXT: sllv $8, $8, $3 6434; MIPS64R6O0-NEXT: nor $9, $zero, $8 6435; MIPS64R6O0-NEXT: andi $10, $2, 65535 6436; MIPS64R6O0-NEXT: sllv $10, $10, $3 6437; MIPS64R6O0-NEXT: andi $1, $1, 65535 6438; MIPS64R6O0-NEXT: sllv $1, $1, $3 6439; MIPS64R6O0-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6440; MIPS64R6O0-NEXT: ll $12, 0($6) 6441; MIPS64R6O0-NEXT: and $13, $12, $8 6442; MIPS64R6O0-NEXT: bnec $13, $10, .LBB15_3 6443; MIPS64R6O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6444; MIPS64R6O0-NEXT: and $12, $12, $9 6445; MIPS64R6O0-NEXT: or $12, $12, $1 6446; MIPS64R6O0-NEXT: sc $12, 0($6) 6447; MIPS64R6O0-NEXT: beqzc $12, .LBB15_1 6448; MIPS64R6O0-NEXT: .LBB15_3: 6449; MIPS64R6O0-NEXT: srlv $11, $13, $3 6450; MIPS64R6O0-NEXT: seh $11, $11 6451; MIPS64R6O0-NEXT: # %bb.4: 6452; MIPS64R6O0-NEXT: sw $2, 12($sp) # 4-byte Folded Spill 6453; MIPS64R6O0-NEXT: sw $11, 8($sp) # 4-byte Folded Spill 6454; MIPS64R6O0-NEXT: sd $5, 0($sp) # 8-byte Folded Spill 6455; MIPS64R6O0-NEXT: # %bb.5: 6456; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 6457; MIPS64R6O0-NEXT: seh $2, $1 6458; MIPS64R6O0-NEXT: lw $3, 8($sp) # 4-byte Folded Reload 6459; MIPS64R6O0-NEXT: xor $2, $3, $2 6460; MIPS64R6O0-NEXT: sltiu $3, $2, 1 6461; MIPS64R6O0-NEXT: sync 6462; MIPS64R6O0-NEXT: lw $2, 8($sp) # 4-byte Folded Reload 6463; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 6464; MIPS64R6O0-NEXT: jrc $ra 6465; 6466; MM32-LABEL: foo: 6467; MM32: # %bb.0: 6468; MM32-NEXT: addu16 $3, $5, $6 6469; MM32-NEXT: sync 6470; MM32-NEXT: addiu $1, $zero, -4 6471; MM32-NEXT: and $1, $4, $1 6472; MM32-NEXT: andi $2, $4, 3 6473; MM32-NEXT: sll $4, $2, 3 6474; MM32-NEXT: ori $2, $zero, 65535 6475; MM32-NEXT: sllv $5, $2, $4 6476; MM32-NEXT: nor $6, $zero, $5 6477; MM32-NEXT: andi $2, $3, 65535 6478; MM32-NEXT: sllv $8, $2, $4 6479; MM32-NEXT: andi $2, $7, 65535 6480; MM32-NEXT: sllv $7, $2, $4 6481; MM32-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6482; MM32-NEXT: ll $9, 0($1) 6483; MM32-NEXT: and $10, $9, $5 6484; MM32-NEXT: bne $10, $8, $BB15_3 6485; MM32-NEXT: nop 6486; MM32-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6487; MM32-NEXT: and $9, $9, $6 6488; MM32-NEXT: or $9, $9, $7 6489; MM32-NEXT: sc $9, 0($1) 6490; MM32-NEXT: beqzc $9, $BB15_1 6491; MM32-NEXT: $BB15_3: 6492; MM32-NEXT: srlv $2, $10, $4 6493; MM32-NEXT: seh $2, $2 6494; MM32-NEXT: # %bb.4: 6495; MM32-NEXT: seh $1, $3 6496; MM32-NEXT: xor $1, $2, $1 6497; MM32-NEXT: sltiu $3, $1, 1 6498; MM32-NEXT: sync 6499; MM32-NEXT: jrc $ra 6500; 6501; O1-LABEL: foo: 6502; O1: # %bb.0: 6503; O1-NEXT: addu $1, $5, $6 6504; O1-NEXT: sync 6505; O1-NEXT: addiu $2, $zero, -4 6506; O1-NEXT: and $3, $4, $2 6507; O1-NEXT: andi $2, $4, 3 6508; O1-NEXT: sll $4, $2, 3 6509; O1-NEXT: ori $2, $zero, 65535 6510; O1-NEXT: sllv $5, $2, $4 6511; O1-NEXT: nor $6, $zero, $5 6512; O1-NEXT: andi $2, $1, 65535 6513; O1-NEXT: sllv $8, $2, $4 6514; O1-NEXT: andi $2, $7, 65535 6515; O1-NEXT: sllv $7, $2, $4 6516; O1-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6517; O1-NEXT: ll $9, 0($3) 6518; O1-NEXT: and $10, $9, $5 6519; O1-NEXT: bne $10, $8, $BB15_3 6520; O1-NEXT: nop 6521; O1-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6522; O1-NEXT: and $9, $9, $6 6523; O1-NEXT: or $9, $9, $7 6524; O1-NEXT: sc $9, 0($3) 6525; O1-NEXT: beqz $9, $BB15_1 6526; O1-NEXT: nop 6527; O1-NEXT: $BB15_3: 6528; O1-NEXT: srlv $2, $10, $4 6529; O1-NEXT: sll $2, $2, 16 6530; O1-NEXT: sra $2, $2, 16 6531; O1-NEXT: # %bb.4: 6532; O1-NEXT: sll $1, $1, 16 6533; O1-NEXT: sra $1, $1, 16 6534; O1-NEXT: xor $1, $2, $1 6535; O1-NEXT: sltiu $3, $1, 1 6536; O1-NEXT: sync 6537; O1-NEXT: jr $ra 6538; O1-NEXT: nop 6539; 6540; O2-LABEL: foo: 6541; O2: # %bb.0: 6542; O2-NEXT: addu $1, $5, $6 6543; O2-NEXT: sync 6544; O2-NEXT: addiu $2, $zero, -4 6545; O2-NEXT: and $3, $4, $2 6546; O2-NEXT: andi $2, $4, 3 6547; O2-NEXT: sll $4, $2, 3 6548; O2-NEXT: ori $2, $zero, 65535 6549; O2-NEXT: sllv $5, $2, $4 6550; O2-NEXT: nor $6, $zero, $5 6551; O2-NEXT: andi $2, $1, 65535 6552; O2-NEXT: sllv $8, $2, $4 6553; O2-NEXT: andi $2, $7, 65535 6554; O2-NEXT: sllv $7, $2, $4 6555; O2-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6556; O2-NEXT: ll $9, 0($3) 6557; O2-NEXT: and $10, $9, $5 6558; O2-NEXT: bne $10, $8, $BB15_3 6559; O2-NEXT: nop 6560; O2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6561; O2-NEXT: and $9, $9, $6 6562; O2-NEXT: or $9, $9, $7 6563; O2-NEXT: sc $9, 0($3) 6564; O2-NEXT: beqz $9, $BB15_1 6565; O2-NEXT: nop 6566; O2-NEXT: $BB15_3: 6567; O2-NEXT: srlv $2, $10, $4 6568; O2-NEXT: sll $2, $2, 16 6569; O2-NEXT: sra $2, $2, 16 6570; O2-NEXT: # %bb.4: 6571; O2-NEXT: sll $1, $1, 16 6572; O2-NEXT: sra $1, $1, 16 6573; O2-NEXT: xor $1, $2, $1 6574; O2-NEXT: sltiu $3, $1, 1 6575; O2-NEXT: sync 6576; O2-NEXT: jr $ra 6577; O2-NEXT: nop 6578; 6579; O3-LABEL: foo: 6580; O3: # %bb.0: 6581; O3-NEXT: addiu $2, $zero, -4 6582; O3-NEXT: addu $1, $5, $6 6583; O3-NEXT: sync 6584; O3-NEXT: and $3, $4, $2 6585; O3-NEXT: andi $2, $4, 3 6586; O3-NEXT: sll $4, $2, 3 6587; O3-NEXT: ori $2, $zero, 65535 6588; O3-NEXT: sllv $5, $2, $4 6589; O3-NEXT: andi $2, $1, 65535 6590; O3-NEXT: sll $1, $1, 16 6591; O3-NEXT: sllv $8, $2, $4 6592; O3-NEXT: andi $2, $7, 65535 6593; O3-NEXT: nor $6, $zero, $5 6594; O3-NEXT: sra $1, $1, 16 6595; O3-NEXT: sllv $7, $2, $4 6596; O3-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6597; O3-NEXT: ll $9, 0($3) 6598; O3-NEXT: and $10, $9, $5 6599; O3-NEXT: bne $10, $8, $BB15_3 6600; O3-NEXT: nop 6601; O3-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6602; O3-NEXT: and $9, $9, $6 6603; O3-NEXT: or $9, $9, $7 6604; O3-NEXT: sc $9, 0($3) 6605; O3-NEXT: beqz $9, $BB15_1 6606; O3-NEXT: nop 6607; O3-NEXT: $BB15_3: 6608; O3-NEXT: srlv $2, $10, $4 6609; O3-NEXT: sll $2, $2, 16 6610; O3-NEXT: sra $2, $2, 16 6611; O3-NEXT: # %bb.4: 6612; O3-NEXT: sync 6613; O3-NEXT: xor $1, $2, $1 6614; O3-NEXT: jr $ra 6615; O3-NEXT: sltiu $3, $1, 1 6616; 6617; MIPS32EB-LABEL: foo: 6618; MIPS32EB: # %bb.0: 6619; MIPS32EB-NEXT: addu $1, $5, $6 6620; MIPS32EB-NEXT: sync 6621; MIPS32EB-NEXT: addiu $2, $zero, -4 6622; MIPS32EB-NEXT: and $3, $4, $2 6623; MIPS32EB-NEXT: andi $2, $4, 3 6624; MIPS32EB-NEXT: xori $2, $2, 2 6625; MIPS32EB-NEXT: sll $4, $2, 3 6626; MIPS32EB-NEXT: ori $2, $zero, 65535 6627; MIPS32EB-NEXT: sllv $5, $2, $4 6628; MIPS32EB-NEXT: nor $6, $zero, $5 6629; MIPS32EB-NEXT: andi $2, $1, 65535 6630; MIPS32EB-NEXT: sllv $8, $2, $4 6631; MIPS32EB-NEXT: andi $2, $7, 65535 6632; MIPS32EB-NEXT: sllv $7, $2, $4 6633; MIPS32EB-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6634; MIPS32EB-NEXT: ll $9, 0($3) 6635; MIPS32EB-NEXT: and $10, $9, $5 6636; MIPS32EB-NEXT: bne $10, $8, $BB15_3 6637; MIPS32EB-NEXT: nop 6638; MIPS32EB-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6639; MIPS32EB-NEXT: and $9, $9, $6 6640; MIPS32EB-NEXT: or $9, $9, $7 6641; MIPS32EB-NEXT: sc $9, 0($3) 6642; MIPS32EB-NEXT: beqz $9, $BB15_1 6643; MIPS32EB-NEXT: nop 6644; MIPS32EB-NEXT: $BB15_3: 6645; MIPS32EB-NEXT: srlv $2, $10, $4 6646; MIPS32EB-NEXT: sll $2, $2, 16 6647; MIPS32EB-NEXT: sra $2, $2, 16 6648; MIPS32EB-NEXT: # %bb.4: 6649; MIPS32EB-NEXT: sll $1, $1, 16 6650; MIPS32EB-NEXT: sra $1, $1, 16 6651; MIPS32EB-NEXT: xor $1, $2, $1 6652; MIPS32EB-NEXT: sltiu $3, $1, 1 6653; MIPS32EB-NEXT: sync 6654; MIPS32EB-NEXT: jr $ra 6655; MIPS32EB-NEXT: nop 6656 %desired = add i16 %l, %r 6657 %res = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst 6658 ret {i16, i1} %res 6659} 6660 6661@countsint = common global i32 0, align 4 6662 6663define i32 @CheckSync(i32 signext %v) nounwind noinline { 6664; MIPS32-LABEL: CheckSync: 6665; MIPS32: # %bb.0: # %entry 6666; MIPS32-NEXT: lui $2, %hi(_gp_disp) 6667; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 6668; MIPS32-NEXT: addu $1, $2, $25 6669; MIPS32-NEXT: sync 6670; MIPS32-NEXT: lw $1, %got(countsint)($1) 6671; MIPS32-NEXT: $BB16_1: # %entry 6672; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 6673; MIPS32-NEXT: ll $2, 0($1) 6674; MIPS32-NEXT: addu $3, $2, $4 6675; MIPS32-NEXT: sc $3, 0($1) 6676; MIPS32-NEXT: beqz $3, $BB16_1 6677; MIPS32-NEXT: nop 6678; MIPS32-NEXT: # %bb.2: # %entry 6679; MIPS32-NEXT: sync 6680; MIPS32-NEXT: jr $ra 6681; MIPS32-NEXT: nop 6682; 6683; MIPS32O0-LABEL: CheckSync: 6684; MIPS32O0: # %bb.0: # %entry 6685; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 6686; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6687; MIPS32O0-NEXT: addu $2, $2, $25 6688; MIPS32O0-NEXT: sync 6689; MIPS32O0-NEXT: lw $2, %got(countsint)($2) 6690; MIPS32O0-NEXT: $BB16_1: # %entry 6691; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 6692; MIPS32O0-NEXT: ll $25, 0($2) 6693; MIPS32O0-NEXT: addu $1, $25, $4 6694; MIPS32O0-NEXT: sc $1, 0($2) 6695; MIPS32O0-NEXT: beqz $1, $BB16_1 6696; MIPS32O0-NEXT: nop 6697; MIPS32O0-NEXT: # %bb.2: # %entry 6698; MIPS32O0-NEXT: sync 6699; MIPS32O0-NEXT: move $2, $25 6700; MIPS32O0-NEXT: jr $ra 6701; MIPS32O0-NEXT: nop 6702; 6703; MIPS32R2-LABEL: CheckSync: 6704; MIPS32R2: # %bb.0: # %entry 6705; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 6706; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 6707; MIPS32R2-NEXT: addu $1, $2, $25 6708; MIPS32R2-NEXT: sync 6709; MIPS32R2-NEXT: lw $1, %got(countsint)($1) 6710; MIPS32R2-NEXT: $BB16_1: # %entry 6711; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 6712; MIPS32R2-NEXT: ll $2, 0($1) 6713; MIPS32R2-NEXT: addu $3, $2, $4 6714; MIPS32R2-NEXT: sc $3, 0($1) 6715; MIPS32R2-NEXT: beqz $3, $BB16_1 6716; MIPS32R2-NEXT: nop 6717; MIPS32R2-NEXT: # %bb.2: # %entry 6718; MIPS32R2-NEXT: sync 6719; MIPS32R2-NEXT: jr $ra 6720; MIPS32R2-NEXT: nop 6721; 6722; MIPS32R6-LABEL: CheckSync: 6723; MIPS32R6: # %bb.0: # %entry 6724; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 6725; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 6726; MIPS32R6-NEXT: addu $1, $2, $25 6727; MIPS32R6-NEXT: sync 6728; MIPS32R6-NEXT: lw $1, %got(countsint)($1) 6729; MIPS32R6-NEXT: $BB16_1: # %entry 6730; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 6731; MIPS32R6-NEXT: ll $2, 0($1) 6732; MIPS32R6-NEXT: addu $3, $2, $4 6733; MIPS32R6-NEXT: sc $3, 0($1) 6734; MIPS32R6-NEXT: beqzc $3, $BB16_1 6735; MIPS32R6-NEXT: # %bb.2: # %entry 6736; MIPS32R6-NEXT: sync 6737; MIPS32R6-NEXT: jrc $ra 6738; 6739; MIPS32R6O0-LABEL: CheckSync: 6740; MIPS32R6O0: # %bb.0: # %entry 6741; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 6742; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6743; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 6744; MIPS32R6O0-NEXT: addu $2, $2, $25 6745; MIPS32R6O0-NEXT: move $25, $4 6746; MIPS32R6O0-NEXT: sync 6747; MIPS32R6O0-NEXT: lw $2, %got(countsint)($2) 6748; MIPS32R6O0-NEXT: $BB16_1: # %entry 6749; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 6750; MIPS32R6O0-NEXT: ll $1, 0($2) 6751; MIPS32R6O0-NEXT: addu $3, $1, $4 6752; MIPS32R6O0-NEXT: sc $3, 0($2) 6753; MIPS32R6O0-NEXT: beqzc $3, $BB16_1 6754; MIPS32R6O0-NEXT: # %bb.2: # %entry 6755; MIPS32R6O0-NEXT: sync 6756; MIPS32R6O0-NEXT: move $2, $1 6757; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 6758; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 6759; MIPS32R6O0-NEXT: jrc $ra 6760; 6761; MIPS4-LABEL: CheckSync: 6762; MIPS4: # %bb.0: # %entry 6763; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6764; MIPS4-NEXT: daddu $1, $1, $25 6765; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6766; MIPS4-NEXT: sync 6767; MIPS4-NEXT: ld $1, %got_disp(countsint)($1) 6768; MIPS4-NEXT: .LBB16_1: # %entry 6769; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 6770; MIPS4-NEXT: ll $2, 0($1) 6771; MIPS4-NEXT: addu $3, $2, $4 6772; MIPS4-NEXT: sc $3, 0($1) 6773; MIPS4-NEXT: beqz $3, .LBB16_1 6774; MIPS4-NEXT: nop 6775; MIPS4-NEXT: # %bb.2: # %entry 6776; MIPS4-NEXT: sync 6777; MIPS4-NEXT: jr $ra 6778; MIPS4-NEXT: nop 6779; 6780; MIPS64-LABEL: CheckSync: 6781; MIPS64: # %bb.0: # %entry 6782; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6783; MIPS64-NEXT: daddu $1, $1, $25 6784; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6785; MIPS64-NEXT: sync 6786; MIPS64-NEXT: ld $1, %got_disp(countsint)($1) 6787; MIPS64-NEXT: .LBB16_1: # %entry 6788; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 6789; MIPS64-NEXT: ll $2, 0($1) 6790; MIPS64-NEXT: addu $3, $2, $4 6791; MIPS64-NEXT: sc $3, 0($1) 6792; MIPS64-NEXT: beqz $3, .LBB16_1 6793; MIPS64-NEXT: nop 6794; MIPS64-NEXT: # %bb.2: # %entry 6795; MIPS64-NEXT: sync 6796; MIPS64-NEXT: jr $ra 6797; MIPS64-NEXT: nop 6798; 6799; MIPS64R2-LABEL: CheckSync: 6800; MIPS64R2: # %bb.0: # %entry 6801; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6802; MIPS64R2-NEXT: daddu $1, $1, $25 6803; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6804; MIPS64R2-NEXT: sync 6805; MIPS64R2-NEXT: ld $1, %got_disp(countsint)($1) 6806; MIPS64R2-NEXT: .LBB16_1: # %entry 6807; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 6808; MIPS64R2-NEXT: ll $2, 0($1) 6809; MIPS64R2-NEXT: addu $3, $2, $4 6810; MIPS64R2-NEXT: sc $3, 0($1) 6811; MIPS64R2-NEXT: beqz $3, .LBB16_1 6812; MIPS64R2-NEXT: nop 6813; MIPS64R2-NEXT: # %bb.2: # %entry 6814; MIPS64R2-NEXT: sync 6815; MIPS64R2-NEXT: jr $ra 6816; MIPS64R2-NEXT: nop 6817; 6818; MIPS64R6-LABEL: CheckSync: 6819; MIPS64R6: # %bb.0: # %entry 6820; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6821; MIPS64R6-NEXT: daddu $1, $1, $25 6822; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6823; MIPS64R6-NEXT: sync 6824; MIPS64R6-NEXT: ld $1, %got_disp(countsint)($1) 6825; MIPS64R6-NEXT: .LBB16_1: # %entry 6826; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 6827; MIPS64R6-NEXT: ll $2, 0($1) 6828; MIPS64R6-NEXT: addu $3, $2, $4 6829; MIPS64R6-NEXT: sc $3, 0($1) 6830; MIPS64R6-NEXT: beqzc $3, .LBB16_1 6831; MIPS64R6-NEXT: # %bb.2: # %entry 6832; MIPS64R6-NEXT: sync 6833; MIPS64R6-NEXT: jrc $ra 6834; 6835; MIPS64R6O0-LABEL: CheckSync: 6836; MIPS64R6O0: # %bb.0: # %entry 6837; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6838; MIPS64R6O0-NEXT: daddu $1, $1, $25 6839; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6840; MIPS64R6O0-NEXT: move $2, $4 6841; MIPS64R6O0-NEXT: sync 6842; MIPS64R6O0-NEXT: ld $1, %got_disp(countsint)($1) 6843; MIPS64R6O0-NEXT: .LBB16_1: # %entry 6844; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 6845; MIPS64R6O0-NEXT: ll $3, 0($1) 6846; MIPS64R6O0-NEXT: addu $5, $3, $2 6847; MIPS64R6O0-NEXT: sc $5, 0($1) 6848; MIPS64R6O0-NEXT: beqzc $5, .LBB16_1 6849; MIPS64R6O0-NEXT: # %bb.2: # %entry 6850; MIPS64R6O0-NEXT: sync 6851; MIPS64R6O0-NEXT: move $2, $3 6852; MIPS64R6O0-NEXT: jrc $ra 6853; 6854; MM32-LABEL: CheckSync: 6855; MM32: # %bb.0: # %entry 6856; MM32-NEXT: lui $2, %hi(_gp_disp) 6857; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 6858; MM32-NEXT: addu $2, $2, $25 6859; MM32-NEXT: sync 6860; MM32-NEXT: lw $1, %got(countsint)($2) 6861; MM32-NEXT: $BB16_1: # %entry 6862; MM32-NEXT: # =>This Inner Loop Header: Depth=1 6863; MM32-NEXT: ll $2, 0($1) 6864; MM32-NEXT: addu16 $3, $2, $4 6865; MM32-NEXT: sc $3, 0($1) 6866; MM32-NEXT: beqzc $3, $BB16_1 6867; MM32-NEXT: # %bb.2: # %entry 6868; MM32-NEXT: sync 6869; MM32-NEXT: jrc $ra 6870; 6871; O1-LABEL: CheckSync: 6872; O1: # %bb.0: # %entry 6873; O1-NEXT: lui $2, %hi(_gp_disp) 6874; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 6875; O1-NEXT: addu $1, $2, $25 6876; O1-NEXT: sync 6877; O1-NEXT: lw $1, %got(countsint)($1) 6878; O1-NEXT: $BB16_1: # %entry 6879; O1-NEXT: # =>This Inner Loop Header: Depth=1 6880; O1-NEXT: ll $2, 0($1) 6881; O1-NEXT: addu $3, $2, $4 6882; O1-NEXT: sc $3, 0($1) 6883; O1-NEXT: beqz $3, $BB16_1 6884; O1-NEXT: nop 6885; O1-NEXT: # %bb.2: # %entry 6886; O1-NEXT: sync 6887; O1-NEXT: jr $ra 6888; O1-NEXT: nop 6889; 6890; O2-LABEL: CheckSync: 6891; O2: # %bb.0: # %entry 6892; O2-NEXT: lui $2, %hi(_gp_disp) 6893; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 6894; O2-NEXT: addu $1, $2, $25 6895; O2-NEXT: sync 6896; O2-NEXT: lw $1, %got(countsint)($1) 6897; O2-NEXT: $BB16_1: # %entry 6898; O2-NEXT: # =>This Inner Loop Header: Depth=1 6899; O2-NEXT: ll $2, 0($1) 6900; O2-NEXT: addu $3, $2, $4 6901; O2-NEXT: sc $3, 0($1) 6902; O2-NEXT: beqz $3, $BB16_1 6903; O2-NEXT: nop 6904; O2-NEXT: # %bb.2: # %entry 6905; O2-NEXT: sync 6906; O2-NEXT: jr $ra 6907; O2-NEXT: nop 6908; 6909; O3-LABEL: CheckSync: 6910; O3: # %bb.0: # %entry 6911; O3-NEXT: lui $2, %hi(_gp_disp) 6912; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 6913; O3-NEXT: addu $1, $2, $25 6914; O3-NEXT: sync 6915; O3-NEXT: lw $1, %got(countsint)($1) 6916; O3-NEXT: $BB16_1: # %entry 6917; O3-NEXT: # =>This Inner Loop Header: Depth=1 6918; O3-NEXT: ll $2, 0($1) 6919; O3-NEXT: addu $3, $2, $4 6920; O3-NEXT: sc $3, 0($1) 6921; O3-NEXT: beqz $3, $BB16_1 6922; O3-NEXT: nop 6923; O3-NEXT: # %bb.2: # %entry 6924; O3-NEXT: sync 6925; O3-NEXT: jr $ra 6926; O3-NEXT: nop 6927; 6928; MIPS32EB-LABEL: CheckSync: 6929; MIPS32EB: # %bb.0: # %entry 6930; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 6931; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 6932; MIPS32EB-NEXT: addu $1, $2, $25 6933; MIPS32EB-NEXT: sync 6934; MIPS32EB-NEXT: lw $1, %got(countsint)($1) 6935; MIPS32EB-NEXT: $BB16_1: # %entry 6936; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 6937; MIPS32EB-NEXT: ll $2, 0($1) 6938; MIPS32EB-NEXT: addu $3, $2, $4 6939; MIPS32EB-NEXT: sc $3, 0($1) 6940; MIPS32EB-NEXT: beqz $3, $BB16_1 6941; MIPS32EB-NEXT: nop 6942; MIPS32EB-NEXT: # %bb.2: # %entry 6943; MIPS32EB-NEXT: sync 6944; MIPS32EB-NEXT: jr $ra 6945; MIPS32EB-NEXT: nop 6946entry: 6947 %0 = atomicrmw add i32* @countsint, i32 %v seq_cst 6948 ret i32 %0 6949} 6950 6951; make sure that this assertion in 6952; TwoAddressInstructionPass::TryInstructionTransform does not fail: 6953; 6954; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) && 6955; 6956; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an 6957; operand of an atomic instruction with register $zero. 6958@a = external global i32 6959 6960define i32 @zeroreg() nounwind { 6961; MIPS32-LABEL: zeroreg: 6962; MIPS32: # %bb.0: # %entry 6963; MIPS32-NEXT: lui $2, %hi(_gp_disp) 6964; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 6965; MIPS32-NEXT: addu $1, $2, $25 6966; MIPS32-NEXT: sync 6967; MIPS32-NEXT: addiu $2, $zero, 0 6968; MIPS32-NEXT: addiu $3, $zero, 1 6969; MIPS32-NEXT: lw $1, %got(a)($1) 6970; MIPS32-NEXT: $BB17_1: # %entry 6971; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 6972; MIPS32-NEXT: ll $4, 0($1) 6973; MIPS32-NEXT: bne $4, $3, $BB17_3 6974; MIPS32-NEXT: nop 6975; MIPS32-NEXT: # %bb.2: # %entry 6976; MIPS32-NEXT: # in Loop: Header=BB17_1 Depth=1 6977; MIPS32-NEXT: move $5, $2 6978; MIPS32-NEXT: sc $5, 0($1) 6979; MIPS32-NEXT: beqz $5, $BB17_1 6980; MIPS32-NEXT: nop 6981; MIPS32-NEXT: $BB17_3: # %entry 6982; MIPS32-NEXT: xor $1, $4, $3 6983; MIPS32-NEXT: sltiu $2, $1, 1 6984; MIPS32-NEXT: sync 6985; MIPS32-NEXT: jr $ra 6986; MIPS32-NEXT: nop 6987; 6988; MIPS32O0-LABEL: zeroreg: 6989; MIPS32O0: # %bb.0: # %entry 6990; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 6991; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6992; MIPS32O0-NEXT: addiu $sp, $sp, -16 6993; MIPS32O0-NEXT: addu $2, $2, $25 6994; MIPS32O0-NEXT: sync 6995; MIPS32O0-NEXT: lw $2, %got(a)($2) 6996; MIPS32O0-NEXT: addiu $25, $zero, 0 6997; MIPS32O0-NEXT: addiu $1, $zero, 1 6998; MIPS32O0-NEXT: lw $3, 12($sp) # 4-byte Folded Reload 6999; MIPS32O0-NEXT: move $4, $1 7000; MIPS32O0-NEXT: $BB17_1: # %entry 7001; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 7002; MIPS32O0-NEXT: ll $5, 0($2) 7003; MIPS32O0-NEXT: bne $5, $4, $BB17_3 7004; MIPS32O0-NEXT: nop 7005; MIPS32O0-NEXT: # %bb.2: # %entry 7006; MIPS32O0-NEXT: # in Loop: Header=BB17_1 Depth=1 7007; MIPS32O0-NEXT: move $6, $25 7008; MIPS32O0-NEXT: sc $6, 0($2) 7009; MIPS32O0-NEXT: beqz $6, $BB17_1 7010; MIPS32O0-NEXT: nop 7011; MIPS32O0-NEXT: $BB17_3: # %entry 7012; MIPS32O0-NEXT: xor $1, $5, $1 7013; MIPS32O0-NEXT: sltiu $1, $1, 1 7014; MIPS32O0-NEXT: sync 7015; MIPS32O0-NEXT: addiu $2, $zero, 1 7016; MIPS32O0-NEXT: xor $2, $5, $2 7017; MIPS32O0-NEXT: sltiu $2, $2, 1 7018; MIPS32O0-NEXT: andi $2, $2, 1 7019; MIPS32O0-NEXT: sw $3, 8($sp) # 4-byte Folded Spill 7020; MIPS32O0-NEXT: sw $5, 12($sp) # 4-byte Folded Spill 7021; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 7022; MIPS32O0-NEXT: addiu $sp, $sp, 16 7023; MIPS32O0-NEXT: jr $ra 7024; MIPS32O0-NEXT: nop 7025; 7026; MIPS32R2-LABEL: zeroreg: 7027; MIPS32R2: # %bb.0: # %entry 7028; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 7029; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 7030; MIPS32R2-NEXT: addu $1, $2, $25 7031; MIPS32R2-NEXT: sync 7032; MIPS32R2-NEXT: addiu $2, $zero, 0 7033; MIPS32R2-NEXT: addiu $3, $zero, 1 7034; MIPS32R2-NEXT: lw $1, %got(a)($1) 7035; MIPS32R2-NEXT: $BB17_1: # %entry 7036; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 7037; MIPS32R2-NEXT: ll $4, 0($1) 7038; MIPS32R2-NEXT: bne $4, $3, $BB17_3 7039; MIPS32R2-NEXT: nop 7040; MIPS32R2-NEXT: # %bb.2: # %entry 7041; MIPS32R2-NEXT: # in Loop: Header=BB17_1 Depth=1 7042; MIPS32R2-NEXT: move $5, $2 7043; MIPS32R2-NEXT: sc $5, 0($1) 7044; MIPS32R2-NEXT: beqz $5, $BB17_1 7045; MIPS32R2-NEXT: nop 7046; MIPS32R2-NEXT: $BB17_3: # %entry 7047; MIPS32R2-NEXT: xor $1, $4, $3 7048; MIPS32R2-NEXT: sltiu $2, $1, 1 7049; MIPS32R2-NEXT: sync 7050; MIPS32R2-NEXT: jr $ra 7051; MIPS32R2-NEXT: nop 7052; 7053; MIPS32R6-LABEL: zeroreg: 7054; MIPS32R6: # %bb.0: # %entry 7055; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 7056; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 7057; MIPS32R6-NEXT: addu $1, $2, $25 7058; MIPS32R6-NEXT: sync 7059; MIPS32R6-NEXT: addiu $2, $zero, 0 7060; MIPS32R6-NEXT: addiu $3, $zero, 1 7061; MIPS32R6-NEXT: lw $1, %got(a)($1) 7062; MIPS32R6-NEXT: $BB17_1: # %entry 7063; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 7064; MIPS32R6-NEXT: ll $4, 0($1) 7065; MIPS32R6-NEXT: bnec $4, $3, $BB17_3 7066; MIPS32R6-NEXT: # %bb.2: # %entry 7067; MIPS32R6-NEXT: # in Loop: Header=BB17_1 Depth=1 7068; MIPS32R6-NEXT: move $5, $2 7069; MIPS32R6-NEXT: sc $5, 0($1) 7070; MIPS32R6-NEXT: beqzc $5, $BB17_1 7071; MIPS32R6-NEXT: $BB17_3: # %entry 7072; MIPS32R6-NEXT: xor $1, $4, $3 7073; MIPS32R6-NEXT: sltiu $2, $1, 1 7074; MIPS32R6-NEXT: sync 7075; MIPS32R6-NEXT: jrc $ra 7076; 7077; MIPS32R6O0-LABEL: zeroreg: 7078; MIPS32R6O0: # %bb.0: # %entry 7079; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 7080; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 7081; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 7082; MIPS32R6O0-NEXT: addu $2, $2, $25 7083; MIPS32R6O0-NEXT: sync 7084; MIPS32R6O0-NEXT: lw $2, %got(a)($2) 7085; MIPS32R6O0-NEXT: addiu $25, $zero, 0 7086; MIPS32R6O0-NEXT: addiu $1, $zero, 1 7087; MIPS32R6O0-NEXT: lw $3, 4($sp) # 4-byte Folded Reload 7088; MIPS32R6O0-NEXT: move $4, $1 7089; MIPS32R6O0-NEXT: $BB17_1: # %entry 7090; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7091; MIPS32R6O0-NEXT: ll $5, 0($2) 7092; MIPS32R6O0-NEXT: bnec $5, $4, $BB17_3 7093; MIPS32R6O0-NEXT: # %bb.2: # %entry 7094; MIPS32R6O0-NEXT: # in Loop: Header=BB17_1 Depth=1 7095; MIPS32R6O0-NEXT: move $6, $25 7096; MIPS32R6O0-NEXT: sc $6, 0($2) 7097; MIPS32R6O0-NEXT: beqzc $6, $BB17_1 7098; MIPS32R6O0-NEXT: $BB17_3: # %entry 7099; MIPS32R6O0-NEXT: xor $1, $5, $1 7100; MIPS32R6O0-NEXT: sltiu $2, $1, 1 7101; MIPS32R6O0-NEXT: sync 7102; MIPS32R6O0-NEXT: sw $3, 0($sp) # 4-byte Folded Spill 7103; MIPS32R6O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 7104; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 7105; MIPS32R6O0-NEXT: jrc $ra 7106; 7107; MIPS4-LABEL: zeroreg: 7108; MIPS4: # %bb.0: # %entry 7109; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7110; MIPS4-NEXT: daddu $1, $1, $25 7111; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7112; MIPS4-NEXT: sync 7113; MIPS4-NEXT: addiu $2, $zero, 0 7114; MIPS4-NEXT: addiu $3, $zero, 1 7115; MIPS4-NEXT: ld $1, %got_disp(a)($1) 7116; MIPS4-NEXT: .LBB17_1: # %entry 7117; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 7118; MIPS4-NEXT: ll $4, 0($1) 7119; MIPS4-NEXT: bne $4, $3, .LBB17_3 7120; MIPS4-NEXT: nop 7121; MIPS4-NEXT: # %bb.2: # %entry 7122; MIPS4-NEXT: # in Loop: Header=BB17_1 Depth=1 7123; MIPS4-NEXT: move $5, $2 7124; MIPS4-NEXT: sc $5, 0($1) 7125; MIPS4-NEXT: beqz $5, .LBB17_1 7126; MIPS4-NEXT: nop 7127; MIPS4-NEXT: .LBB17_3: # %entry 7128; MIPS4-NEXT: xor $1, $4, $3 7129; MIPS4-NEXT: sltiu $2, $1, 1 7130; MIPS4-NEXT: sync 7131; MIPS4-NEXT: jr $ra 7132; MIPS4-NEXT: nop 7133; 7134; MIPS64-LABEL: zeroreg: 7135; MIPS64: # %bb.0: # %entry 7136; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7137; MIPS64-NEXT: daddu $1, $1, $25 7138; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7139; MIPS64-NEXT: sync 7140; MIPS64-NEXT: addiu $2, $zero, 0 7141; MIPS64-NEXT: addiu $3, $zero, 1 7142; MIPS64-NEXT: ld $1, %got_disp(a)($1) 7143; MIPS64-NEXT: .LBB17_1: # %entry 7144; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 7145; MIPS64-NEXT: ll $4, 0($1) 7146; MIPS64-NEXT: bne $4, $3, .LBB17_3 7147; MIPS64-NEXT: nop 7148; MIPS64-NEXT: # %bb.2: # %entry 7149; MIPS64-NEXT: # in Loop: Header=BB17_1 Depth=1 7150; MIPS64-NEXT: move $5, $2 7151; MIPS64-NEXT: sc $5, 0($1) 7152; MIPS64-NEXT: beqz $5, .LBB17_1 7153; MIPS64-NEXT: nop 7154; MIPS64-NEXT: .LBB17_3: # %entry 7155; MIPS64-NEXT: xor $1, $4, $3 7156; MIPS64-NEXT: sltiu $2, $1, 1 7157; MIPS64-NEXT: sync 7158; MIPS64-NEXT: jr $ra 7159; MIPS64-NEXT: nop 7160; 7161; MIPS64R2-LABEL: zeroreg: 7162; MIPS64R2: # %bb.0: # %entry 7163; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7164; MIPS64R2-NEXT: daddu $1, $1, $25 7165; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7166; MIPS64R2-NEXT: sync 7167; MIPS64R2-NEXT: addiu $2, $zero, 0 7168; MIPS64R2-NEXT: addiu $3, $zero, 1 7169; MIPS64R2-NEXT: ld $1, %got_disp(a)($1) 7170; MIPS64R2-NEXT: .LBB17_1: # %entry 7171; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 7172; MIPS64R2-NEXT: ll $4, 0($1) 7173; MIPS64R2-NEXT: bne $4, $3, .LBB17_3 7174; MIPS64R2-NEXT: nop 7175; MIPS64R2-NEXT: # %bb.2: # %entry 7176; MIPS64R2-NEXT: # in Loop: Header=BB17_1 Depth=1 7177; MIPS64R2-NEXT: move $5, $2 7178; MIPS64R2-NEXT: sc $5, 0($1) 7179; MIPS64R2-NEXT: beqz $5, .LBB17_1 7180; MIPS64R2-NEXT: nop 7181; MIPS64R2-NEXT: .LBB17_3: # %entry 7182; MIPS64R2-NEXT: xor $1, $4, $3 7183; MIPS64R2-NEXT: sltiu $2, $1, 1 7184; MIPS64R2-NEXT: sync 7185; MIPS64R2-NEXT: jr $ra 7186; MIPS64R2-NEXT: nop 7187; 7188; MIPS64R6-LABEL: zeroreg: 7189; MIPS64R6: # %bb.0: # %entry 7190; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7191; MIPS64R6-NEXT: daddu $1, $1, $25 7192; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7193; MIPS64R6-NEXT: sync 7194; MIPS64R6-NEXT: addiu $2, $zero, 0 7195; MIPS64R6-NEXT: addiu $3, $zero, 1 7196; MIPS64R6-NEXT: ld $1, %got_disp(a)($1) 7197; MIPS64R6-NEXT: .LBB17_1: # %entry 7198; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 7199; MIPS64R6-NEXT: ll $4, 0($1) 7200; MIPS64R6-NEXT: bnec $4, $3, .LBB17_3 7201; MIPS64R6-NEXT: # %bb.2: # %entry 7202; MIPS64R6-NEXT: # in Loop: Header=BB17_1 Depth=1 7203; MIPS64R6-NEXT: move $5, $2 7204; MIPS64R6-NEXT: sc $5, 0($1) 7205; MIPS64R6-NEXT: beqzc $5, .LBB17_1 7206; MIPS64R6-NEXT: .LBB17_3: # %entry 7207; MIPS64R6-NEXT: xor $1, $4, $3 7208; MIPS64R6-NEXT: sltiu $2, $1, 1 7209; MIPS64R6-NEXT: sync 7210; MIPS64R6-NEXT: jrc $ra 7211; 7212; MIPS64R6O0-LABEL: zeroreg: 7213; MIPS64R6O0: # %bb.0: # %entry 7214; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 7215; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7216; MIPS64R6O0-NEXT: daddu $1, $1, $25 7217; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7218; MIPS64R6O0-NEXT: sync 7219; MIPS64R6O0-NEXT: ld $1, %got_disp(a)($1) 7220; MIPS64R6O0-NEXT: addiu $2, $zero, 0 7221; MIPS64R6O0-NEXT: addiu $3, $zero, 1 7222; MIPS64R6O0-NEXT: lw $4, 12($sp) # 4-byte Folded Reload 7223; MIPS64R6O0-NEXT: move $5, $3 7224; MIPS64R6O0-NEXT: .LBB17_1: # %entry 7225; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7226; MIPS64R6O0-NEXT: ll $6, 0($1) 7227; MIPS64R6O0-NEXT: bnec $6, $5, .LBB17_3 7228; MIPS64R6O0-NEXT: # %bb.2: # %entry 7229; MIPS64R6O0-NEXT: # in Loop: Header=BB17_1 Depth=1 7230; MIPS64R6O0-NEXT: move $7, $2 7231; MIPS64R6O0-NEXT: sc $7, 0($1) 7232; MIPS64R6O0-NEXT: beqzc $7, .LBB17_1 7233; MIPS64R6O0-NEXT: .LBB17_3: # %entry 7234; MIPS64R6O0-NEXT: xor $2, $6, $3 7235; MIPS64R6O0-NEXT: sltiu $2, $2, 1 7236; MIPS64R6O0-NEXT: sync 7237; MIPS64R6O0-NEXT: sw $4, 8($sp) # 4-byte Folded Spill 7238; MIPS64R6O0-NEXT: sw $6, 12($sp) # 4-byte Folded Spill 7239; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 7240; MIPS64R6O0-NEXT: jrc $ra 7241; 7242; MM32-LABEL: zeroreg: 7243; MM32: # %bb.0: # %entry 7244; MM32-NEXT: lui $2, %hi(_gp_disp) 7245; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 7246; MM32-NEXT: addu $2, $2, $25 7247; MM32-NEXT: sync 7248; MM32-NEXT: li16 $3, 0 7249; MM32-NEXT: li16 $4, 1 7250; MM32-NEXT: lw $1, %got(a)($2) 7251; MM32-NEXT: $BB17_1: # %entry 7252; MM32-NEXT: # =>This Inner Loop Header: Depth=1 7253; MM32-NEXT: ll $2, 0($1) 7254; MM32-NEXT: bne $2, $4, $BB17_3 7255; MM32-NEXT: nop 7256; MM32-NEXT: # %bb.2: # %entry 7257; MM32-NEXT: # in Loop: Header=BB17_1 Depth=1 7258; MM32-NEXT: move $5, $3 7259; MM32-NEXT: sc $5, 0($1) 7260; MM32-NEXT: beqzc $5, $BB17_1 7261; MM32-NEXT: $BB17_3: # %entry 7262; MM32-NEXT: xor $1, $2, $4 7263; MM32-NEXT: sltiu $2, $1, 1 7264; MM32-NEXT: sync 7265; MM32-NEXT: jrc $ra 7266; 7267; O1-LABEL: zeroreg: 7268; O1: # %bb.0: # %entry 7269; O1-NEXT: lui $2, %hi(_gp_disp) 7270; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 7271; O1-NEXT: addu $1, $2, $25 7272; O1-NEXT: sync 7273; O1-NEXT: addiu $2, $zero, 0 7274; O1-NEXT: addiu $3, $zero, 1 7275; O1-NEXT: lw $1, %got(a)($1) 7276; O1-NEXT: $BB17_1: # %entry 7277; O1-NEXT: # =>This Inner Loop Header: Depth=1 7278; O1-NEXT: ll $4, 0($1) 7279; O1-NEXT: bne $4, $3, $BB17_3 7280; O1-NEXT: nop 7281; O1-NEXT: # %bb.2: # %entry 7282; O1-NEXT: # in Loop: Header=BB17_1 Depth=1 7283; O1-NEXT: move $5, $2 7284; O1-NEXT: sc $5, 0($1) 7285; O1-NEXT: beqz $5, $BB17_1 7286; O1-NEXT: nop 7287; O1-NEXT: $BB17_3: # %entry 7288; O1-NEXT: xor $1, $4, $3 7289; O1-NEXT: sltiu $2, $1, 1 7290; O1-NEXT: sync 7291; O1-NEXT: jr $ra 7292; O1-NEXT: nop 7293; 7294; O2-LABEL: zeroreg: 7295; O2: # %bb.0: # %entry 7296; O2-NEXT: lui $2, %hi(_gp_disp) 7297; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 7298; O2-NEXT: addu $1, $2, $25 7299; O2-NEXT: sync 7300; O2-NEXT: addiu $2, $zero, 0 7301; O2-NEXT: addiu $3, $zero, 1 7302; O2-NEXT: lw $1, %got(a)($1) 7303; O2-NEXT: $BB17_1: # %entry 7304; O2-NEXT: # =>This Inner Loop Header: Depth=1 7305; O2-NEXT: ll $4, 0($1) 7306; O2-NEXT: bne $4, $3, $BB17_3 7307; O2-NEXT: nop 7308; O2-NEXT: # %bb.2: # %entry 7309; O2-NEXT: # in Loop: Header=BB17_1 Depth=1 7310; O2-NEXT: move $5, $2 7311; O2-NEXT: sc $5, 0($1) 7312; O2-NEXT: beqz $5, $BB17_1 7313; O2-NEXT: nop 7314; O2-NEXT: $BB17_3: # %entry 7315; O2-NEXT: xor $1, $4, $3 7316; O2-NEXT: sltiu $2, $1, 1 7317; O2-NEXT: sync 7318; O2-NEXT: jr $ra 7319; O2-NEXT: nop 7320; 7321; O3-LABEL: zeroreg: 7322; O3: # %bb.0: # %entry 7323; O3-NEXT: lui $2, %hi(_gp_disp) 7324; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 7325; O3-NEXT: addu $1, $2, $25 7326; O3-NEXT: addiu $2, $zero, 0 7327; O3-NEXT: addiu $3, $zero, 1 7328; O3-NEXT: sync 7329; O3-NEXT: lw $1, %got(a)($1) 7330; O3-NEXT: $BB17_1: # %entry 7331; O3-NEXT: # =>This Inner Loop Header: Depth=1 7332; O3-NEXT: ll $4, 0($1) 7333; O3-NEXT: bne $4, $3, $BB17_3 7334; O3-NEXT: nop 7335; O3-NEXT: # %bb.2: # %entry 7336; O3-NEXT: # in Loop: Header=BB17_1 Depth=1 7337; O3-NEXT: move $5, $2 7338; O3-NEXT: sc $5, 0($1) 7339; O3-NEXT: beqz $5, $BB17_1 7340; O3-NEXT: nop 7341; O3-NEXT: $BB17_3: # %entry 7342; O3-NEXT: sync 7343; O3-NEXT: xor $1, $4, $3 7344; O3-NEXT: jr $ra 7345; O3-NEXT: sltiu $2, $1, 1 7346; 7347; MIPS32EB-LABEL: zeroreg: 7348; MIPS32EB: # %bb.0: # %entry 7349; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 7350; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 7351; MIPS32EB-NEXT: addu $1, $2, $25 7352; MIPS32EB-NEXT: sync 7353; MIPS32EB-NEXT: addiu $2, $zero, 0 7354; MIPS32EB-NEXT: addiu $3, $zero, 1 7355; MIPS32EB-NEXT: lw $1, %got(a)($1) 7356; MIPS32EB-NEXT: $BB17_1: # %entry 7357; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 7358; MIPS32EB-NEXT: ll $4, 0($1) 7359; MIPS32EB-NEXT: bne $4, $3, $BB17_3 7360; MIPS32EB-NEXT: nop 7361; MIPS32EB-NEXT: # %bb.2: # %entry 7362; MIPS32EB-NEXT: # in Loop: Header=BB17_1 Depth=1 7363; MIPS32EB-NEXT: move $5, $2 7364; MIPS32EB-NEXT: sc $5, 0($1) 7365; MIPS32EB-NEXT: beqz $5, $BB17_1 7366; MIPS32EB-NEXT: nop 7367; MIPS32EB-NEXT: $BB17_3: # %entry 7368; MIPS32EB-NEXT: xor $1, $4, $3 7369; MIPS32EB-NEXT: sltiu $2, $1, 1 7370; MIPS32EB-NEXT: sync 7371; MIPS32EB-NEXT: jr $ra 7372; MIPS32EB-NEXT: nop 7373entry: 7374 %pair0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst seq_cst 7375 %0 = extractvalue { i32, i1 } %pair0, 0 7376 %1 = icmp eq i32 %0, 1 7377 %conv = zext i1 %1 to i32 7378 ret i32 %conv 7379} 7380 7381; Check that MIPS32R6 has the correct offset range. 7382; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store. 7383define i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind { 7384; MIPS32-LABEL: AtomicLoadAdd32_OffGt9Bit: 7385; MIPS32: # %bb.0: # %entry 7386; MIPS32-NEXT: lui $2, %hi(_gp_disp) 7387; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 7388; MIPS32-NEXT: addu $1, $2, $25 7389; MIPS32-NEXT: lw $1, %got(x)($1) 7390; MIPS32-NEXT: addiu $1, $1, 1024 7391; MIPS32-NEXT: $BB18_1: # %entry 7392; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 7393; MIPS32-NEXT: ll $2, 0($1) 7394; MIPS32-NEXT: addu $3, $2, $4 7395; MIPS32-NEXT: sc $3, 0($1) 7396; MIPS32-NEXT: beqz $3, $BB18_1 7397; MIPS32-NEXT: nop 7398; MIPS32-NEXT: # %bb.2: # %entry 7399; MIPS32-NEXT: jr $ra 7400; MIPS32-NEXT: nop 7401; 7402; MIPS32O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7403; MIPS32O0: # %bb.0: # %entry 7404; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 7405; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 7406; MIPS32O0-NEXT: addu $2, $2, $25 7407; MIPS32O0-NEXT: lw $2, %got(x)($2) 7408; MIPS32O0-NEXT: addiu $2, $2, 1024 7409; MIPS32O0-NEXT: $BB18_1: # %entry 7410; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 7411; MIPS32O0-NEXT: ll $25, 0($2) 7412; MIPS32O0-NEXT: addu $1, $25, $4 7413; MIPS32O0-NEXT: sc $1, 0($2) 7414; MIPS32O0-NEXT: beqz $1, $BB18_1 7415; MIPS32O0-NEXT: nop 7416; MIPS32O0-NEXT: # %bb.2: # %entry 7417; MIPS32O0-NEXT: move $2, $25 7418; MIPS32O0-NEXT: jr $ra 7419; MIPS32O0-NEXT: nop 7420; 7421; MIPS32R2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7422; MIPS32R2: # %bb.0: # %entry 7423; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 7424; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 7425; MIPS32R2-NEXT: addu $1, $2, $25 7426; MIPS32R2-NEXT: lw $1, %got(x)($1) 7427; MIPS32R2-NEXT: addiu $1, $1, 1024 7428; MIPS32R2-NEXT: $BB18_1: # %entry 7429; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 7430; MIPS32R2-NEXT: ll $2, 0($1) 7431; MIPS32R2-NEXT: addu $3, $2, $4 7432; MIPS32R2-NEXT: sc $3, 0($1) 7433; MIPS32R2-NEXT: beqz $3, $BB18_1 7434; MIPS32R2-NEXT: nop 7435; MIPS32R2-NEXT: # %bb.2: # %entry 7436; MIPS32R2-NEXT: jr $ra 7437; MIPS32R2-NEXT: nop 7438; 7439; MIPS32R6-LABEL: AtomicLoadAdd32_OffGt9Bit: 7440; MIPS32R6: # %bb.0: # %entry 7441; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 7442; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 7443; MIPS32R6-NEXT: addu $1, $2, $25 7444; MIPS32R6-NEXT: lw $1, %got(x)($1) 7445; MIPS32R6-NEXT: addiu $1, $1, 1024 7446; MIPS32R6-NEXT: $BB18_1: # %entry 7447; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 7448; MIPS32R6-NEXT: ll $2, 0($1) 7449; MIPS32R6-NEXT: addu $3, $2, $4 7450; MIPS32R6-NEXT: sc $3, 0($1) 7451; MIPS32R6-NEXT: beqzc $3, $BB18_1 7452; MIPS32R6-NEXT: nop 7453; MIPS32R6-NEXT: # %bb.2: # %entry 7454; MIPS32R6-NEXT: jrc $ra 7455; 7456; MIPS32R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7457; MIPS32R6O0: # %bb.0: # %entry 7458; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 7459; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 7460; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 7461; MIPS32R6O0-NEXT: addu $2, $2, $25 7462; MIPS32R6O0-NEXT: move $25, $4 7463; MIPS32R6O0-NEXT: lw $2, %got(x)($2) 7464; MIPS32R6O0-NEXT: addiu $2, $2, 1024 7465; MIPS32R6O0-NEXT: $BB18_1: # %entry 7466; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7467; MIPS32R6O0-NEXT: ll $1, 0($2) 7468; MIPS32R6O0-NEXT: addu $3, $1, $4 7469; MIPS32R6O0-NEXT: sc $3, 0($2) 7470; MIPS32R6O0-NEXT: beqzc $3, $BB18_1 7471; MIPS32R6O0-NEXT: # %bb.2: # %entry 7472; MIPS32R6O0-NEXT: move $2, $1 7473; MIPS32R6O0-NEXT: sw $25, 4($sp) # 4-byte Folded Spill 7474; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 7475; MIPS32R6O0-NEXT: jrc $ra 7476; 7477; MIPS4-LABEL: AtomicLoadAdd32_OffGt9Bit: 7478; MIPS4: # %bb.0: # %entry 7479; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7480; MIPS4-NEXT: daddu $1, $1, $25 7481; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7482; MIPS4-NEXT: ld $1, %got_disp(x)($1) 7483; MIPS4-NEXT: daddiu $1, $1, 1024 7484; MIPS4-NEXT: .LBB18_1: # %entry 7485; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 7486; MIPS4-NEXT: ll $2, 0($1) 7487; MIPS4-NEXT: addu $3, $2, $4 7488; MIPS4-NEXT: sc $3, 0($1) 7489; MIPS4-NEXT: beqz $3, .LBB18_1 7490; MIPS4-NEXT: nop 7491; MIPS4-NEXT: # %bb.2: # %entry 7492; MIPS4-NEXT: jr $ra 7493; MIPS4-NEXT: nop 7494; 7495; MIPS64-LABEL: AtomicLoadAdd32_OffGt9Bit: 7496; MIPS64: # %bb.0: # %entry 7497; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7498; MIPS64-NEXT: daddu $1, $1, $25 7499; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7500; MIPS64-NEXT: ld $1, %got_disp(x)($1) 7501; MIPS64-NEXT: daddiu $1, $1, 1024 7502; MIPS64-NEXT: .LBB18_1: # %entry 7503; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 7504; MIPS64-NEXT: ll $2, 0($1) 7505; MIPS64-NEXT: addu $3, $2, $4 7506; MIPS64-NEXT: sc $3, 0($1) 7507; MIPS64-NEXT: beqz $3, .LBB18_1 7508; MIPS64-NEXT: nop 7509; MIPS64-NEXT: # %bb.2: # %entry 7510; MIPS64-NEXT: jr $ra 7511; MIPS64-NEXT: nop 7512; 7513; MIPS64R2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7514; MIPS64R2: # %bb.0: # %entry 7515; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7516; MIPS64R2-NEXT: daddu $1, $1, $25 7517; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7518; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 7519; MIPS64R2-NEXT: daddiu $1, $1, 1024 7520; MIPS64R2-NEXT: .LBB18_1: # %entry 7521; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 7522; MIPS64R2-NEXT: ll $2, 0($1) 7523; MIPS64R2-NEXT: addu $3, $2, $4 7524; MIPS64R2-NEXT: sc $3, 0($1) 7525; MIPS64R2-NEXT: beqz $3, .LBB18_1 7526; MIPS64R2-NEXT: nop 7527; MIPS64R2-NEXT: # %bb.2: # %entry 7528; MIPS64R2-NEXT: jr $ra 7529; MIPS64R2-NEXT: nop 7530; 7531; MIPS64R6-LABEL: AtomicLoadAdd32_OffGt9Bit: 7532; MIPS64R6: # %bb.0: # %entry 7533; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7534; MIPS64R6-NEXT: daddu $1, $1, $25 7535; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7536; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 7537; MIPS64R6-NEXT: daddiu $1, $1, 1024 7538; MIPS64R6-NEXT: .LBB18_1: # %entry 7539; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 7540; MIPS64R6-NEXT: ll $2, 0($1) 7541; MIPS64R6-NEXT: addu $3, $2, $4 7542; MIPS64R6-NEXT: sc $3, 0($1) 7543; MIPS64R6-NEXT: beqzc $3, .LBB18_1 7544; MIPS64R6-NEXT: nop 7545; MIPS64R6-NEXT: # %bb.2: # %entry 7546; MIPS64R6-NEXT: jrc $ra 7547; 7548; MIPS64R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7549; MIPS64R6O0: # %bb.0: # %entry 7550; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7551; MIPS64R6O0-NEXT: daddu $1, $1, $25 7552; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7553; MIPS64R6O0-NEXT: move $2, $4 7554; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 7555; MIPS64R6O0-NEXT: daddiu $1, $1, 1024 7556; MIPS64R6O0-NEXT: .LBB18_1: # %entry 7557; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7558; MIPS64R6O0-NEXT: ll $3, 0($1) 7559; MIPS64R6O0-NEXT: addu $5, $3, $2 7560; MIPS64R6O0-NEXT: sc $5, 0($1) 7561; MIPS64R6O0-NEXT: beqzc $5, .LBB18_1 7562; MIPS64R6O0-NEXT: # %bb.2: # %entry 7563; MIPS64R6O0-NEXT: move $2, $3 7564; MIPS64R6O0-NEXT: jrc $ra 7565; 7566; MM32-LABEL: AtomicLoadAdd32_OffGt9Bit: 7567; MM32: # %bb.0: # %entry 7568; MM32-NEXT: lui $2, %hi(_gp_disp) 7569; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 7570; MM32-NEXT: addu $2, $2, $25 7571; MM32-NEXT: lw $1, %got(x)($2) 7572; MM32-NEXT: addiu $1, $1, 1024 7573; MM32-NEXT: $BB18_1: # %entry 7574; MM32-NEXT: # =>This Inner Loop Header: Depth=1 7575; MM32-NEXT: ll $2, 0($1) 7576; MM32-NEXT: addu16 $3, $2, $4 7577; MM32-NEXT: sc $3, 0($1) 7578; MM32-NEXT: beqzc $3, $BB18_1 7579; MM32-NEXT: # %bb.2: # %entry 7580; MM32-NEXT: jrc $ra 7581; 7582; O1-LABEL: AtomicLoadAdd32_OffGt9Bit: 7583; O1: # %bb.0: # %entry 7584; O1-NEXT: lui $2, %hi(_gp_disp) 7585; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 7586; O1-NEXT: addu $1, $2, $25 7587; O1-NEXT: lw $1, %got(x)($1) 7588; O1-NEXT: addiu $1, $1, 1024 7589; O1-NEXT: $BB18_1: # %entry 7590; O1-NEXT: # =>This Inner Loop Header: Depth=1 7591; O1-NEXT: ll $2, 0($1) 7592; O1-NEXT: addu $3, $2, $4 7593; O1-NEXT: sc $3, 0($1) 7594; O1-NEXT: beqz $3, $BB18_1 7595; O1-NEXT: nop 7596; O1-NEXT: # %bb.2: # %entry 7597; O1-NEXT: jr $ra 7598; O1-NEXT: nop 7599; 7600; O2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7601; O2: # %bb.0: # %entry 7602; O2-NEXT: lui $2, %hi(_gp_disp) 7603; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 7604; O2-NEXT: addu $1, $2, $25 7605; O2-NEXT: lw $1, %got(x)($1) 7606; O2-NEXT: addiu $1, $1, 1024 7607; O2-NEXT: $BB18_1: # %entry 7608; O2-NEXT: # =>This Inner Loop Header: Depth=1 7609; O2-NEXT: ll $2, 0($1) 7610; O2-NEXT: addu $3, $2, $4 7611; O2-NEXT: sc $3, 0($1) 7612; O2-NEXT: beqz $3, $BB18_1 7613; O2-NEXT: nop 7614; O2-NEXT: # %bb.2: # %entry 7615; O2-NEXT: jr $ra 7616; O2-NEXT: nop 7617; 7618; O3-LABEL: AtomicLoadAdd32_OffGt9Bit: 7619; O3: # %bb.0: # %entry 7620; O3-NEXT: lui $2, %hi(_gp_disp) 7621; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 7622; O3-NEXT: addu $1, $2, $25 7623; O3-NEXT: lw $1, %got(x)($1) 7624; O3-NEXT: addiu $1, $1, 1024 7625; O3-NEXT: $BB18_1: # %entry 7626; O3-NEXT: # =>This Inner Loop Header: Depth=1 7627; O3-NEXT: ll $2, 0($1) 7628; O3-NEXT: addu $3, $2, $4 7629; O3-NEXT: sc $3, 0($1) 7630; O3-NEXT: beqz $3, $BB18_1 7631; O3-NEXT: nop 7632; O3-NEXT: # %bb.2: # %entry 7633; O3-NEXT: jr $ra 7634; O3-NEXT: nop 7635; 7636; MIPS32EB-LABEL: AtomicLoadAdd32_OffGt9Bit: 7637; MIPS32EB: # %bb.0: # %entry 7638; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 7639; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 7640; MIPS32EB-NEXT: addu $1, $2, $25 7641; MIPS32EB-NEXT: lw $1, %got(x)($1) 7642; MIPS32EB-NEXT: addiu $1, $1, 1024 7643; MIPS32EB-NEXT: $BB18_1: # %entry 7644; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 7645; MIPS32EB-NEXT: ll $2, 0($1) 7646; MIPS32EB-NEXT: addu $3, $2, $4 7647; MIPS32EB-NEXT: sc $3, 0($1) 7648; MIPS32EB-NEXT: beqz $3, $BB18_1 7649; MIPS32EB-NEXT: nop 7650; MIPS32EB-NEXT: # %bb.2: # %entry 7651; MIPS32EB-NEXT: jr $ra 7652; MIPS32EB-NEXT: nop 7653entry: 7654 %0 = atomicrmw add i32* getelementptr(i32, i32* @x, i32 256), i32 %incr monotonic 7655 ret i32 %0 7656 7657} 7658