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 $1, $2, $25 60; MIPS32O0-NEXT: lw $1, %got(x)($1) 61; MIPS32O0-NEXT: $BB0_1: # %entry 62; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 63; MIPS32O0-NEXT: ll $2, 0($1) 64; MIPS32O0-NEXT: addu $3, $2, $4 65; MIPS32O0-NEXT: sc $3, 0($1) 66; MIPS32O0-NEXT: beqz $3, $BB0_1 67; MIPS32O0-NEXT: nop 68; MIPS32O0-NEXT: # %bb.2: # %entry 69; MIPS32O0-NEXT: jr $ra 70; MIPS32O0-NEXT: nop 71; 72; MIPS32R2-LABEL: AtomicLoadAdd32: 73; MIPS32R2: # %bb.0: # %entry 74; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 75; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 76; MIPS32R2-NEXT: addu $1, $2, $25 77; MIPS32R2-NEXT: lw $1, %got(x)($1) 78; MIPS32R2-NEXT: $BB0_1: # %entry 79; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 80; MIPS32R2-NEXT: ll $2, 0($1) 81; MIPS32R2-NEXT: addu $3, $2, $4 82; MIPS32R2-NEXT: sc $3, 0($1) 83; MIPS32R2-NEXT: beqz $3, $BB0_1 84; MIPS32R2-NEXT: nop 85; MIPS32R2-NEXT: # %bb.2: # %entry 86; MIPS32R2-NEXT: jr $ra 87; MIPS32R2-NEXT: nop 88; 89; MIPS32R6-LABEL: AtomicLoadAdd32: 90; MIPS32R6: # %bb.0: # %entry 91; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 92; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 93; MIPS32R6-NEXT: addu $1, $2, $25 94; MIPS32R6-NEXT: lw $1, %got(x)($1) 95; MIPS32R6-NEXT: $BB0_1: # %entry 96; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 97; MIPS32R6-NEXT: ll $2, 0($1) 98; MIPS32R6-NEXT: addu $3, $2, $4 99; MIPS32R6-NEXT: sc $3, 0($1) 100; MIPS32R6-NEXT: beqzc $3, $BB0_1 101; MIPS32R6-NEXT: nop 102; MIPS32R6-NEXT: # %bb.2: # %entry 103; MIPS32R6-NEXT: jrc $ra 104; 105; MIPS32R6O0-LABEL: AtomicLoadAdd32: 106; MIPS32R6O0: # %bb.0: # %entry 107; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 108; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 109; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 110; MIPS32R6O0-NEXT: addu $1, $2, $25 111; MIPS32R6O0-NEXT: move $2, $4 112; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 113; MIPS32R6O0-NEXT: $BB0_1: # %entry 114; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 115; MIPS32R6O0-NEXT: ll $3, 0($1) 116; MIPS32R6O0-NEXT: addu $5, $3, $4 117; MIPS32R6O0-NEXT: sc $5, 0($1) 118; MIPS32R6O0-NEXT: beqzc $5, $BB0_1 119; MIPS32R6O0-NEXT: # %bb.2: # %entry 120; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 121; MIPS32R6O0-NEXT: move $2, $3 122; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 123; MIPS32R6O0-NEXT: jrc $ra 124; 125; MIPS4-LABEL: AtomicLoadAdd32: 126; MIPS4: # %bb.0: # %entry 127; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 128; MIPS4-NEXT: daddu $1, $1, $25 129; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 130; MIPS4-NEXT: ld $1, %got_disp(x)($1) 131; MIPS4-NEXT: .LBB0_1: # %entry 132; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 133; MIPS4-NEXT: ll $2, 0($1) 134; MIPS4-NEXT: addu $3, $2, $4 135; MIPS4-NEXT: sc $3, 0($1) 136; MIPS4-NEXT: beqz $3, .LBB0_1 137; MIPS4-NEXT: nop 138; MIPS4-NEXT: # %bb.2: # %entry 139; MIPS4-NEXT: jr $ra 140; MIPS4-NEXT: nop 141; 142; MIPS64-LABEL: AtomicLoadAdd32: 143; MIPS64: # %bb.0: # %entry 144; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 145; MIPS64-NEXT: daddu $1, $1, $25 146; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 147; MIPS64-NEXT: ld $1, %got_disp(x)($1) 148; MIPS64-NEXT: .LBB0_1: # %entry 149; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 150; MIPS64-NEXT: ll $2, 0($1) 151; MIPS64-NEXT: addu $3, $2, $4 152; MIPS64-NEXT: sc $3, 0($1) 153; MIPS64-NEXT: beqz $3, .LBB0_1 154; MIPS64-NEXT: nop 155; MIPS64-NEXT: # %bb.2: # %entry 156; MIPS64-NEXT: jr $ra 157; MIPS64-NEXT: nop 158; 159; MIPS64R2-LABEL: AtomicLoadAdd32: 160; MIPS64R2: # %bb.0: # %entry 161; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 162; MIPS64R2-NEXT: daddu $1, $1, $25 163; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 164; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 165; MIPS64R2-NEXT: .LBB0_1: # %entry 166; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 167; MIPS64R2-NEXT: ll $2, 0($1) 168; MIPS64R2-NEXT: addu $3, $2, $4 169; MIPS64R2-NEXT: sc $3, 0($1) 170; MIPS64R2-NEXT: beqz $3, .LBB0_1 171; MIPS64R2-NEXT: nop 172; MIPS64R2-NEXT: # %bb.2: # %entry 173; MIPS64R2-NEXT: jr $ra 174; MIPS64R2-NEXT: nop 175; 176; MIPS64R6-LABEL: AtomicLoadAdd32: 177; MIPS64R6: # %bb.0: # %entry 178; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 179; MIPS64R6-NEXT: daddu $1, $1, $25 180; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 181; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 182; MIPS64R6-NEXT: .LBB0_1: # %entry 183; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 184; MIPS64R6-NEXT: ll $2, 0($1) 185; MIPS64R6-NEXT: addu $3, $2, $4 186; MIPS64R6-NEXT: sc $3, 0($1) 187; MIPS64R6-NEXT: beqzc $3, .LBB0_1 188; MIPS64R6-NEXT: nop 189; MIPS64R6-NEXT: # %bb.2: # %entry 190; MIPS64R6-NEXT: jrc $ra 191; 192; MIPS64R6O0-LABEL: AtomicLoadAdd32: 193; MIPS64R6O0: # %bb.0: # %entry 194; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 195; MIPS64R6O0-NEXT: daddu $1, $1, $25 196; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 197; MIPS64R6O0-NEXT: move $2, $4 198; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 199; MIPS64R6O0-NEXT: .LBB0_1: # %entry 200; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 201; MIPS64R6O0-NEXT: ll $3, 0($1) 202; MIPS64R6O0-NEXT: addu $5, $3, $2 203; MIPS64R6O0-NEXT: sc $5, 0($1) 204; MIPS64R6O0-NEXT: beqzc $5, .LBB0_1 205; MIPS64R6O0-NEXT: # %bb.2: # %entry 206; MIPS64R6O0-NEXT: move $2, $3 207; MIPS64R6O0-NEXT: jrc $ra 208; 209; MM32-LABEL: AtomicLoadAdd32: 210; MM32: # %bb.0: # %entry 211; MM32-NEXT: lui $2, %hi(_gp_disp) 212; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 213; MM32-NEXT: addu $2, $2, $25 214; MM32-NEXT: lw $1, %got(x)($2) 215; MM32-NEXT: $BB0_1: # %entry 216; MM32-NEXT: # =>This Inner Loop Header: Depth=1 217; MM32-NEXT: ll $2, 0($1) 218; MM32-NEXT: addu16 $3, $2, $4 219; MM32-NEXT: sc $3, 0($1) 220; MM32-NEXT: beqzc $3, $BB0_1 221; MM32-NEXT: # %bb.2: # %entry 222; MM32-NEXT: jrc $ra 223; 224; O1-LABEL: AtomicLoadAdd32: 225; O1: # %bb.0: # %entry 226; O1-NEXT: lui $2, %hi(_gp_disp) 227; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 228; O1-NEXT: addu $1, $2, $25 229; O1-NEXT: lw $1, %got(x)($1) 230; O1-NEXT: $BB0_1: # %entry 231; O1-NEXT: # =>This Inner Loop Header: Depth=1 232; O1-NEXT: ll $2, 0($1) 233; O1-NEXT: addu $3, $2, $4 234; O1-NEXT: sc $3, 0($1) 235; O1-NEXT: beqz $3, $BB0_1 236; O1-NEXT: nop 237; O1-NEXT: # %bb.2: # %entry 238; O1-NEXT: jr $ra 239; O1-NEXT: nop 240; 241; O2-LABEL: AtomicLoadAdd32: 242; O2: # %bb.0: # %entry 243; O2-NEXT: lui $2, %hi(_gp_disp) 244; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 245; O2-NEXT: addu $1, $2, $25 246; O2-NEXT: lw $1, %got(x)($1) 247; O2-NEXT: $BB0_1: # %entry 248; O2-NEXT: # =>This Inner Loop Header: Depth=1 249; O2-NEXT: ll $2, 0($1) 250; O2-NEXT: addu $3, $2, $4 251; O2-NEXT: sc $3, 0($1) 252; O2-NEXT: beqz $3, $BB0_1 253; O2-NEXT: nop 254; O2-NEXT: # %bb.2: # %entry 255; O2-NEXT: jr $ra 256; O2-NEXT: nop 257; 258; O3-LABEL: AtomicLoadAdd32: 259; O3: # %bb.0: # %entry 260; O3-NEXT: lui $2, %hi(_gp_disp) 261; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 262; O3-NEXT: addu $1, $2, $25 263; O3-NEXT: lw $1, %got(x)($1) 264; O3-NEXT: $BB0_1: # %entry 265; O3-NEXT: # =>This Inner Loop Header: Depth=1 266; O3-NEXT: ll $2, 0($1) 267; O3-NEXT: addu $3, $2, $4 268; O3-NEXT: sc $3, 0($1) 269; O3-NEXT: beqz $3, $BB0_1 270; O3-NEXT: nop 271; O3-NEXT: # %bb.2: # %entry 272; O3-NEXT: jr $ra 273; O3-NEXT: nop 274; 275; MIPS32EB-LABEL: AtomicLoadAdd32: 276; MIPS32EB: # %bb.0: # %entry 277; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 278; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 279; MIPS32EB-NEXT: addu $1, $2, $25 280; MIPS32EB-NEXT: lw $1, %got(x)($1) 281; MIPS32EB-NEXT: $BB0_1: # %entry 282; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 283; MIPS32EB-NEXT: ll $2, 0($1) 284; MIPS32EB-NEXT: addu $3, $2, $4 285; MIPS32EB-NEXT: sc $3, 0($1) 286; MIPS32EB-NEXT: beqz $3, $BB0_1 287; MIPS32EB-NEXT: nop 288; MIPS32EB-NEXT: # %bb.2: # %entry 289; MIPS32EB-NEXT: jr $ra 290; MIPS32EB-NEXT: nop 291entry: 292 %0 = atomicrmw add i32* @x, i32 %incr monotonic 293 ret i32 %0 294 295} 296 297define i32 @AtomicLoadSub32(i32 signext %incr) nounwind { 298; MIPS32-LABEL: AtomicLoadSub32: 299; MIPS32: # %bb.0: # %entry 300; MIPS32-NEXT: lui $2, %hi(_gp_disp) 301; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 302; MIPS32-NEXT: addu $1, $2, $25 303; MIPS32-NEXT: lw $1, %got(x)($1) 304; MIPS32-NEXT: $BB1_1: # %entry 305; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 306; MIPS32-NEXT: ll $2, 0($1) 307; MIPS32-NEXT: subu $3, $2, $4 308; MIPS32-NEXT: sc $3, 0($1) 309; MIPS32-NEXT: beqz $3, $BB1_1 310; MIPS32-NEXT: nop 311; MIPS32-NEXT: # %bb.2: # %entry 312; MIPS32-NEXT: jr $ra 313; MIPS32-NEXT: nop 314; 315; MIPS32O0-LABEL: AtomicLoadSub32: 316; MIPS32O0: # %bb.0: # %entry 317; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 318; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 319; MIPS32O0-NEXT: addu $1, $2, $25 320; MIPS32O0-NEXT: lw $1, %got(x)($1) 321; MIPS32O0-NEXT: $BB1_1: # %entry 322; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 323; MIPS32O0-NEXT: ll $2, 0($1) 324; MIPS32O0-NEXT: subu $3, $2, $4 325; MIPS32O0-NEXT: sc $3, 0($1) 326; MIPS32O0-NEXT: beqz $3, $BB1_1 327; MIPS32O0-NEXT: nop 328; MIPS32O0-NEXT: # %bb.2: # %entry 329; MIPS32O0-NEXT: jr $ra 330; MIPS32O0-NEXT: nop 331; 332; MIPS32R2-LABEL: AtomicLoadSub32: 333; MIPS32R2: # %bb.0: # %entry 334; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 335; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 336; MIPS32R2-NEXT: addu $1, $2, $25 337; MIPS32R2-NEXT: lw $1, %got(x)($1) 338; MIPS32R2-NEXT: $BB1_1: # %entry 339; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 340; MIPS32R2-NEXT: ll $2, 0($1) 341; MIPS32R2-NEXT: subu $3, $2, $4 342; MIPS32R2-NEXT: sc $3, 0($1) 343; MIPS32R2-NEXT: beqz $3, $BB1_1 344; MIPS32R2-NEXT: nop 345; MIPS32R2-NEXT: # %bb.2: # %entry 346; MIPS32R2-NEXT: jr $ra 347; MIPS32R2-NEXT: nop 348; 349; MIPS32R6-LABEL: AtomicLoadSub32: 350; MIPS32R6: # %bb.0: # %entry 351; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 352; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 353; MIPS32R6-NEXT: addu $1, $2, $25 354; MIPS32R6-NEXT: lw $1, %got(x)($1) 355; MIPS32R6-NEXT: $BB1_1: # %entry 356; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 357; MIPS32R6-NEXT: ll $2, 0($1) 358; MIPS32R6-NEXT: subu $3, $2, $4 359; MIPS32R6-NEXT: sc $3, 0($1) 360; MIPS32R6-NEXT: beqzc $3, $BB1_1 361; MIPS32R6-NEXT: nop 362; MIPS32R6-NEXT: # %bb.2: # %entry 363; MIPS32R6-NEXT: jrc $ra 364; 365; MIPS32R6O0-LABEL: AtomicLoadSub32: 366; MIPS32R6O0: # %bb.0: # %entry 367; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 368; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 369; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 370; MIPS32R6O0-NEXT: addu $1, $2, $25 371; MIPS32R6O0-NEXT: move $2, $4 372; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 373; MIPS32R6O0-NEXT: $BB1_1: # %entry 374; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 375; MIPS32R6O0-NEXT: ll $3, 0($1) 376; MIPS32R6O0-NEXT: subu $5, $3, $4 377; MIPS32R6O0-NEXT: sc $5, 0($1) 378; MIPS32R6O0-NEXT: beqzc $5, $BB1_1 379; MIPS32R6O0-NEXT: # %bb.2: # %entry 380; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 381; MIPS32R6O0-NEXT: move $2, $3 382; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 383; MIPS32R6O0-NEXT: jrc $ra 384; 385; MIPS4-LABEL: AtomicLoadSub32: 386; MIPS4: # %bb.0: # %entry 387; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 388; MIPS4-NEXT: daddu $1, $1, $25 389; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 390; MIPS4-NEXT: ld $1, %got_disp(x)($1) 391; MIPS4-NEXT: .LBB1_1: # %entry 392; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 393; MIPS4-NEXT: ll $2, 0($1) 394; MIPS4-NEXT: subu $3, $2, $4 395; MIPS4-NEXT: sc $3, 0($1) 396; MIPS4-NEXT: beqz $3, .LBB1_1 397; MIPS4-NEXT: nop 398; MIPS4-NEXT: # %bb.2: # %entry 399; MIPS4-NEXT: jr $ra 400; MIPS4-NEXT: nop 401; 402; MIPS64-LABEL: AtomicLoadSub32: 403; MIPS64: # %bb.0: # %entry 404; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 405; MIPS64-NEXT: daddu $1, $1, $25 406; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 407; MIPS64-NEXT: ld $1, %got_disp(x)($1) 408; MIPS64-NEXT: .LBB1_1: # %entry 409; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 410; MIPS64-NEXT: ll $2, 0($1) 411; MIPS64-NEXT: subu $3, $2, $4 412; MIPS64-NEXT: sc $3, 0($1) 413; MIPS64-NEXT: beqz $3, .LBB1_1 414; MIPS64-NEXT: nop 415; MIPS64-NEXT: # %bb.2: # %entry 416; MIPS64-NEXT: jr $ra 417; MIPS64-NEXT: nop 418; 419; MIPS64R2-LABEL: AtomicLoadSub32: 420; MIPS64R2: # %bb.0: # %entry 421; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 422; MIPS64R2-NEXT: daddu $1, $1, $25 423; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 424; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 425; MIPS64R2-NEXT: .LBB1_1: # %entry 426; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 427; MIPS64R2-NEXT: ll $2, 0($1) 428; MIPS64R2-NEXT: subu $3, $2, $4 429; MIPS64R2-NEXT: sc $3, 0($1) 430; MIPS64R2-NEXT: beqz $3, .LBB1_1 431; MIPS64R2-NEXT: nop 432; MIPS64R2-NEXT: # %bb.2: # %entry 433; MIPS64R2-NEXT: jr $ra 434; MIPS64R2-NEXT: nop 435; 436; MIPS64R6-LABEL: AtomicLoadSub32: 437; MIPS64R6: # %bb.0: # %entry 438; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 439; MIPS64R6-NEXT: daddu $1, $1, $25 440; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 441; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 442; MIPS64R6-NEXT: .LBB1_1: # %entry 443; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 444; MIPS64R6-NEXT: ll $2, 0($1) 445; MIPS64R6-NEXT: subu $3, $2, $4 446; MIPS64R6-NEXT: sc $3, 0($1) 447; MIPS64R6-NEXT: beqzc $3, .LBB1_1 448; MIPS64R6-NEXT: nop 449; MIPS64R6-NEXT: # %bb.2: # %entry 450; MIPS64R6-NEXT: jrc $ra 451; 452; MIPS64R6O0-LABEL: AtomicLoadSub32: 453; MIPS64R6O0: # %bb.0: # %entry 454; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 455; MIPS64R6O0-NEXT: daddu $1, $1, $25 456; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 457; MIPS64R6O0-NEXT: move $2, $4 458; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 459; MIPS64R6O0-NEXT: .LBB1_1: # %entry 460; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 461; MIPS64R6O0-NEXT: ll $3, 0($1) 462; MIPS64R6O0-NEXT: subu $5, $3, $2 463; MIPS64R6O0-NEXT: sc $5, 0($1) 464; MIPS64R6O0-NEXT: beqzc $5, .LBB1_1 465; MIPS64R6O0-NEXT: # %bb.2: # %entry 466; MIPS64R6O0-NEXT: move $2, $3 467; MIPS64R6O0-NEXT: jrc $ra 468; 469; MM32-LABEL: AtomicLoadSub32: 470; MM32: # %bb.0: # %entry 471; MM32-NEXT: lui $2, %hi(_gp_disp) 472; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 473; MM32-NEXT: addu $2, $2, $25 474; MM32-NEXT: lw $1, %got(x)($2) 475; MM32-NEXT: $BB1_1: # %entry 476; MM32-NEXT: # =>This Inner Loop Header: Depth=1 477; MM32-NEXT: ll $2, 0($1) 478; MM32-NEXT: subu16 $3, $2, $4 479; MM32-NEXT: sc $3, 0($1) 480; MM32-NEXT: beqzc $3, $BB1_1 481; MM32-NEXT: # %bb.2: # %entry 482; MM32-NEXT: jrc $ra 483; 484; O1-LABEL: AtomicLoadSub32: 485; O1: # %bb.0: # %entry 486; O1-NEXT: lui $2, %hi(_gp_disp) 487; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 488; O1-NEXT: addu $1, $2, $25 489; O1-NEXT: lw $1, %got(x)($1) 490; O1-NEXT: $BB1_1: # %entry 491; O1-NEXT: # =>This Inner Loop Header: Depth=1 492; O1-NEXT: ll $2, 0($1) 493; O1-NEXT: subu $3, $2, $4 494; O1-NEXT: sc $3, 0($1) 495; O1-NEXT: beqz $3, $BB1_1 496; O1-NEXT: nop 497; O1-NEXT: # %bb.2: # %entry 498; O1-NEXT: jr $ra 499; O1-NEXT: nop 500; 501; O2-LABEL: AtomicLoadSub32: 502; O2: # %bb.0: # %entry 503; O2-NEXT: lui $2, %hi(_gp_disp) 504; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 505; O2-NEXT: addu $1, $2, $25 506; O2-NEXT: lw $1, %got(x)($1) 507; O2-NEXT: $BB1_1: # %entry 508; O2-NEXT: # =>This Inner Loop Header: Depth=1 509; O2-NEXT: ll $2, 0($1) 510; O2-NEXT: subu $3, $2, $4 511; O2-NEXT: sc $3, 0($1) 512; O2-NEXT: beqz $3, $BB1_1 513; O2-NEXT: nop 514; O2-NEXT: # %bb.2: # %entry 515; O2-NEXT: jr $ra 516; O2-NEXT: nop 517; 518; O3-LABEL: AtomicLoadSub32: 519; O3: # %bb.0: # %entry 520; O3-NEXT: lui $2, %hi(_gp_disp) 521; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 522; O3-NEXT: addu $1, $2, $25 523; O3-NEXT: lw $1, %got(x)($1) 524; O3-NEXT: $BB1_1: # %entry 525; O3-NEXT: # =>This Inner Loop Header: Depth=1 526; O3-NEXT: ll $2, 0($1) 527; O3-NEXT: subu $3, $2, $4 528; O3-NEXT: sc $3, 0($1) 529; O3-NEXT: beqz $3, $BB1_1 530; O3-NEXT: nop 531; O3-NEXT: # %bb.2: # %entry 532; O3-NEXT: jr $ra 533; O3-NEXT: nop 534; 535; MIPS32EB-LABEL: AtomicLoadSub32: 536; MIPS32EB: # %bb.0: # %entry 537; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 538; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 539; MIPS32EB-NEXT: addu $1, $2, $25 540; MIPS32EB-NEXT: lw $1, %got(x)($1) 541; MIPS32EB-NEXT: $BB1_1: # %entry 542; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 543; MIPS32EB-NEXT: ll $2, 0($1) 544; MIPS32EB-NEXT: subu $3, $2, $4 545; MIPS32EB-NEXT: sc $3, 0($1) 546; MIPS32EB-NEXT: beqz $3, $BB1_1 547; MIPS32EB-NEXT: nop 548; MIPS32EB-NEXT: # %bb.2: # %entry 549; MIPS32EB-NEXT: jr $ra 550; MIPS32EB-NEXT: nop 551entry: 552 %0 = atomicrmw sub i32* @x, i32 %incr monotonic 553 ret i32 %0 554 555} 556 557define i32 @AtomicLoadXor32(i32 signext %incr) nounwind { 558; MIPS32-LABEL: AtomicLoadXor32: 559; MIPS32: # %bb.0: # %entry 560; MIPS32-NEXT: lui $2, %hi(_gp_disp) 561; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 562; MIPS32-NEXT: addu $1, $2, $25 563; MIPS32-NEXT: lw $1, %got(x)($1) 564; MIPS32-NEXT: $BB2_1: # %entry 565; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 566; MIPS32-NEXT: ll $2, 0($1) 567; MIPS32-NEXT: xor $3, $2, $4 568; MIPS32-NEXT: sc $3, 0($1) 569; MIPS32-NEXT: beqz $3, $BB2_1 570; MIPS32-NEXT: nop 571; MIPS32-NEXT: # %bb.2: # %entry 572; MIPS32-NEXT: jr $ra 573; MIPS32-NEXT: nop 574; 575; MIPS32O0-LABEL: AtomicLoadXor32: 576; MIPS32O0: # %bb.0: # %entry 577; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 578; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 579; MIPS32O0-NEXT: addu $1, $2, $25 580; MIPS32O0-NEXT: lw $1, %got(x)($1) 581; MIPS32O0-NEXT: $BB2_1: # %entry 582; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 583; MIPS32O0-NEXT: ll $2, 0($1) 584; MIPS32O0-NEXT: xor $3, $2, $4 585; MIPS32O0-NEXT: sc $3, 0($1) 586; MIPS32O0-NEXT: beqz $3, $BB2_1 587; MIPS32O0-NEXT: nop 588; MIPS32O0-NEXT: # %bb.2: # %entry 589; MIPS32O0-NEXT: jr $ra 590; MIPS32O0-NEXT: nop 591; 592; MIPS32R2-LABEL: AtomicLoadXor32: 593; MIPS32R2: # %bb.0: # %entry 594; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 595; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 596; MIPS32R2-NEXT: addu $1, $2, $25 597; MIPS32R2-NEXT: lw $1, %got(x)($1) 598; MIPS32R2-NEXT: $BB2_1: # %entry 599; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 600; MIPS32R2-NEXT: ll $2, 0($1) 601; MIPS32R2-NEXT: xor $3, $2, $4 602; MIPS32R2-NEXT: sc $3, 0($1) 603; MIPS32R2-NEXT: beqz $3, $BB2_1 604; MIPS32R2-NEXT: nop 605; MIPS32R2-NEXT: # %bb.2: # %entry 606; MIPS32R2-NEXT: jr $ra 607; MIPS32R2-NEXT: nop 608; 609; MIPS32R6-LABEL: AtomicLoadXor32: 610; MIPS32R6: # %bb.0: # %entry 611; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 612; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 613; MIPS32R6-NEXT: addu $1, $2, $25 614; MIPS32R6-NEXT: lw $1, %got(x)($1) 615; MIPS32R6-NEXT: $BB2_1: # %entry 616; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 617; MIPS32R6-NEXT: ll $2, 0($1) 618; MIPS32R6-NEXT: xor $3, $2, $4 619; MIPS32R6-NEXT: sc $3, 0($1) 620; MIPS32R6-NEXT: beqzc $3, $BB2_1 621; MIPS32R6-NEXT: nop 622; MIPS32R6-NEXT: # %bb.2: # %entry 623; MIPS32R6-NEXT: jrc $ra 624; 625; MIPS32R6O0-LABEL: AtomicLoadXor32: 626; MIPS32R6O0: # %bb.0: # %entry 627; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 628; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 629; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 630; MIPS32R6O0-NEXT: addu $1, $2, $25 631; MIPS32R6O0-NEXT: move $2, $4 632; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 633; MIPS32R6O0-NEXT: $BB2_1: # %entry 634; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 635; MIPS32R6O0-NEXT: ll $3, 0($1) 636; MIPS32R6O0-NEXT: xor $5, $3, $4 637; MIPS32R6O0-NEXT: sc $5, 0($1) 638; MIPS32R6O0-NEXT: beqzc $5, $BB2_1 639; MIPS32R6O0-NEXT: # %bb.2: # %entry 640; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 641; MIPS32R6O0-NEXT: move $2, $3 642; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 643; MIPS32R6O0-NEXT: jrc $ra 644; 645; MIPS4-LABEL: AtomicLoadXor32: 646; MIPS4: # %bb.0: # %entry 647; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 648; MIPS4-NEXT: daddu $1, $1, $25 649; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 650; MIPS4-NEXT: ld $1, %got_disp(x)($1) 651; MIPS4-NEXT: .LBB2_1: # %entry 652; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 653; MIPS4-NEXT: ll $2, 0($1) 654; MIPS4-NEXT: xor $3, $2, $4 655; MIPS4-NEXT: sc $3, 0($1) 656; MIPS4-NEXT: beqz $3, .LBB2_1 657; MIPS4-NEXT: nop 658; MIPS4-NEXT: # %bb.2: # %entry 659; MIPS4-NEXT: jr $ra 660; MIPS4-NEXT: nop 661; 662; MIPS64-LABEL: AtomicLoadXor32: 663; MIPS64: # %bb.0: # %entry 664; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 665; MIPS64-NEXT: daddu $1, $1, $25 666; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 667; MIPS64-NEXT: ld $1, %got_disp(x)($1) 668; MIPS64-NEXT: .LBB2_1: # %entry 669; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 670; MIPS64-NEXT: ll $2, 0($1) 671; MIPS64-NEXT: xor $3, $2, $4 672; MIPS64-NEXT: sc $3, 0($1) 673; MIPS64-NEXT: beqz $3, .LBB2_1 674; MIPS64-NEXT: nop 675; MIPS64-NEXT: # %bb.2: # %entry 676; MIPS64-NEXT: jr $ra 677; MIPS64-NEXT: nop 678; 679; MIPS64R2-LABEL: AtomicLoadXor32: 680; MIPS64R2: # %bb.0: # %entry 681; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 682; MIPS64R2-NEXT: daddu $1, $1, $25 683; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 684; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 685; MIPS64R2-NEXT: .LBB2_1: # %entry 686; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 687; MIPS64R2-NEXT: ll $2, 0($1) 688; MIPS64R2-NEXT: xor $3, $2, $4 689; MIPS64R2-NEXT: sc $3, 0($1) 690; MIPS64R2-NEXT: beqz $3, .LBB2_1 691; MIPS64R2-NEXT: nop 692; MIPS64R2-NEXT: # %bb.2: # %entry 693; MIPS64R2-NEXT: jr $ra 694; MIPS64R2-NEXT: nop 695; 696; MIPS64R6-LABEL: AtomicLoadXor32: 697; MIPS64R6: # %bb.0: # %entry 698; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 699; MIPS64R6-NEXT: daddu $1, $1, $25 700; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 701; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 702; MIPS64R6-NEXT: .LBB2_1: # %entry 703; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 704; MIPS64R6-NEXT: ll $2, 0($1) 705; MIPS64R6-NEXT: xor $3, $2, $4 706; MIPS64R6-NEXT: sc $3, 0($1) 707; MIPS64R6-NEXT: beqzc $3, .LBB2_1 708; MIPS64R6-NEXT: nop 709; MIPS64R6-NEXT: # %bb.2: # %entry 710; MIPS64R6-NEXT: jrc $ra 711; 712; MIPS64R6O0-LABEL: AtomicLoadXor32: 713; MIPS64R6O0: # %bb.0: # %entry 714; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 715; MIPS64R6O0-NEXT: daddu $1, $1, $25 716; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 717; MIPS64R6O0-NEXT: move $2, $4 718; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 719; MIPS64R6O0-NEXT: .LBB2_1: # %entry 720; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 721; MIPS64R6O0-NEXT: ll $3, 0($1) 722; MIPS64R6O0-NEXT: xor $5, $3, $2 723; MIPS64R6O0-NEXT: sc $5, 0($1) 724; MIPS64R6O0-NEXT: beqzc $5, .LBB2_1 725; MIPS64R6O0-NEXT: # %bb.2: # %entry 726; MIPS64R6O0-NEXT: move $2, $3 727; MIPS64R6O0-NEXT: jrc $ra 728; 729; MM32-LABEL: AtomicLoadXor32: 730; MM32: # %bb.0: # %entry 731; MM32-NEXT: lui $2, %hi(_gp_disp) 732; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 733; MM32-NEXT: addu $2, $2, $25 734; MM32-NEXT: lw $1, %got(x)($2) 735; MM32-NEXT: $BB2_1: # %entry 736; MM32-NEXT: # =>This Inner Loop Header: Depth=1 737; MM32-NEXT: ll $2, 0($1) 738; MM32-NEXT: xor $3, $2, $4 739; MM32-NEXT: sc $3, 0($1) 740; MM32-NEXT: beqzc $3, $BB2_1 741; MM32-NEXT: # %bb.2: # %entry 742; MM32-NEXT: jrc $ra 743; 744; O1-LABEL: AtomicLoadXor32: 745; O1: # %bb.0: # %entry 746; O1-NEXT: lui $2, %hi(_gp_disp) 747; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 748; O1-NEXT: addu $1, $2, $25 749; O1-NEXT: lw $1, %got(x)($1) 750; O1-NEXT: $BB2_1: # %entry 751; O1-NEXT: # =>This Inner Loop Header: Depth=1 752; O1-NEXT: ll $2, 0($1) 753; O1-NEXT: xor $3, $2, $4 754; O1-NEXT: sc $3, 0($1) 755; O1-NEXT: beqz $3, $BB2_1 756; O1-NEXT: nop 757; O1-NEXT: # %bb.2: # %entry 758; O1-NEXT: jr $ra 759; O1-NEXT: nop 760; 761; O2-LABEL: AtomicLoadXor32: 762; O2: # %bb.0: # %entry 763; O2-NEXT: lui $2, %hi(_gp_disp) 764; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 765; O2-NEXT: addu $1, $2, $25 766; O2-NEXT: lw $1, %got(x)($1) 767; O2-NEXT: $BB2_1: # %entry 768; O2-NEXT: # =>This Inner Loop Header: Depth=1 769; O2-NEXT: ll $2, 0($1) 770; O2-NEXT: xor $3, $2, $4 771; O2-NEXT: sc $3, 0($1) 772; O2-NEXT: beqz $3, $BB2_1 773; O2-NEXT: nop 774; O2-NEXT: # %bb.2: # %entry 775; O2-NEXT: jr $ra 776; O2-NEXT: nop 777; 778; O3-LABEL: AtomicLoadXor32: 779; O3: # %bb.0: # %entry 780; O3-NEXT: lui $2, %hi(_gp_disp) 781; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 782; O3-NEXT: addu $1, $2, $25 783; O3-NEXT: lw $1, %got(x)($1) 784; O3-NEXT: $BB2_1: # %entry 785; O3-NEXT: # =>This Inner Loop Header: Depth=1 786; O3-NEXT: ll $2, 0($1) 787; O3-NEXT: xor $3, $2, $4 788; O3-NEXT: sc $3, 0($1) 789; O3-NEXT: beqz $3, $BB2_1 790; O3-NEXT: nop 791; O3-NEXT: # %bb.2: # %entry 792; O3-NEXT: jr $ra 793; O3-NEXT: nop 794; 795; MIPS32EB-LABEL: AtomicLoadXor32: 796; MIPS32EB: # %bb.0: # %entry 797; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 798; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 799; MIPS32EB-NEXT: addu $1, $2, $25 800; MIPS32EB-NEXT: lw $1, %got(x)($1) 801; MIPS32EB-NEXT: $BB2_1: # %entry 802; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 803; MIPS32EB-NEXT: ll $2, 0($1) 804; MIPS32EB-NEXT: xor $3, $2, $4 805; MIPS32EB-NEXT: sc $3, 0($1) 806; MIPS32EB-NEXT: beqz $3, $BB2_1 807; MIPS32EB-NEXT: nop 808; MIPS32EB-NEXT: # %bb.2: # %entry 809; MIPS32EB-NEXT: jr $ra 810; MIPS32EB-NEXT: nop 811entry: 812 %0 = atomicrmw xor i32* @x, i32 %incr monotonic 813 ret i32 %0 814} 815 816define i32 @AtomicLoadOr32(i32 signext %incr) nounwind { 817; MIPS32-LABEL: AtomicLoadOr32: 818; MIPS32: # %bb.0: # %entry 819; MIPS32-NEXT: lui $2, %hi(_gp_disp) 820; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 821; MIPS32-NEXT: addu $1, $2, $25 822; MIPS32-NEXT: lw $1, %got(x)($1) 823; MIPS32-NEXT: $BB3_1: # %entry 824; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 825; MIPS32-NEXT: ll $2, 0($1) 826; MIPS32-NEXT: or $3, $2, $4 827; MIPS32-NEXT: sc $3, 0($1) 828; MIPS32-NEXT: beqz $3, $BB3_1 829; MIPS32-NEXT: nop 830; MIPS32-NEXT: # %bb.2: # %entry 831; MIPS32-NEXT: jr $ra 832; MIPS32-NEXT: nop 833; 834; MIPS32O0-LABEL: AtomicLoadOr32: 835; MIPS32O0: # %bb.0: # %entry 836; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 837; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 838; MIPS32O0-NEXT: addu $1, $2, $25 839; MIPS32O0-NEXT: lw $1, %got(x)($1) 840; MIPS32O0-NEXT: $BB3_1: # %entry 841; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 842; MIPS32O0-NEXT: ll $2, 0($1) 843; MIPS32O0-NEXT: or $3, $2, $4 844; MIPS32O0-NEXT: sc $3, 0($1) 845; MIPS32O0-NEXT: beqz $3, $BB3_1 846; MIPS32O0-NEXT: nop 847; MIPS32O0-NEXT: # %bb.2: # %entry 848; MIPS32O0-NEXT: jr $ra 849; MIPS32O0-NEXT: nop 850; 851; MIPS32R2-LABEL: AtomicLoadOr32: 852; MIPS32R2: # %bb.0: # %entry 853; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 854; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 855; MIPS32R2-NEXT: addu $1, $2, $25 856; MIPS32R2-NEXT: lw $1, %got(x)($1) 857; MIPS32R2-NEXT: $BB3_1: # %entry 858; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 859; MIPS32R2-NEXT: ll $2, 0($1) 860; MIPS32R2-NEXT: or $3, $2, $4 861; MIPS32R2-NEXT: sc $3, 0($1) 862; MIPS32R2-NEXT: beqz $3, $BB3_1 863; MIPS32R2-NEXT: nop 864; MIPS32R2-NEXT: # %bb.2: # %entry 865; MIPS32R2-NEXT: jr $ra 866; MIPS32R2-NEXT: nop 867; 868; MIPS32R6-LABEL: AtomicLoadOr32: 869; MIPS32R6: # %bb.0: # %entry 870; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 871; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 872; MIPS32R6-NEXT: addu $1, $2, $25 873; MIPS32R6-NEXT: lw $1, %got(x)($1) 874; MIPS32R6-NEXT: $BB3_1: # %entry 875; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 876; MIPS32R6-NEXT: ll $2, 0($1) 877; MIPS32R6-NEXT: or $3, $2, $4 878; MIPS32R6-NEXT: sc $3, 0($1) 879; MIPS32R6-NEXT: beqzc $3, $BB3_1 880; MIPS32R6-NEXT: nop 881; MIPS32R6-NEXT: # %bb.2: # %entry 882; MIPS32R6-NEXT: jrc $ra 883; 884; MIPS32R6O0-LABEL: AtomicLoadOr32: 885; MIPS32R6O0: # %bb.0: # %entry 886; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 887; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 888; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 889; MIPS32R6O0-NEXT: addu $1, $2, $25 890; MIPS32R6O0-NEXT: move $2, $4 891; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 892; MIPS32R6O0-NEXT: $BB3_1: # %entry 893; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 894; MIPS32R6O0-NEXT: ll $3, 0($1) 895; MIPS32R6O0-NEXT: or $5, $3, $4 896; MIPS32R6O0-NEXT: sc $5, 0($1) 897; MIPS32R6O0-NEXT: beqzc $5, $BB3_1 898; MIPS32R6O0-NEXT: # %bb.2: # %entry 899; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 900; MIPS32R6O0-NEXT: move $2, $3 901; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 902; MIPS32R6O0-NEXT: jrc $ra 903; 904; MIPS4-LABEL: AtomicLoadOr32: 905; MIPS4: # %bb.0: # %entry 906; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 907; MIPS4-NEXT: daddu $1, $1, $25 908; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 909; MIPS4-NEXT: ld $1, %got_disp(x)($1) 910; MIPS4-NEXT: .LBB3_1: # %entry 911; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 912; MIPS4-NEXT: ll $2, 0($1) 913; MIPS4-NEXT: or $3, $2, $4 914; MIPS4-NEXT: sc $3, 0($1) 915; MIPS4-NEXT: beqz $3, .LBB3_1 916; MIPS4-NEXT: nop 917; MIPS4-NEXT: # %bb.2: # %entry 918; MIPS4-NEXT: jr $ra 919; MIPS4-NEXT: nop 920; 921; MIPS64-LABEL: AtomicLoadOr32: 922; MIPS64: # %bb.0: # %entry 923; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 924; MIPS64-NEXT: daddu $1, $1, $25 925; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 926; MIPS64-NEXT: ld $1, %got_disp(x)($1) 927; MIPS64-NEXT: .LBB3_1: # %entry 928; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 929; MIPS64-NEXT: ll $2, 0($1) 930; MIPS64-NEXT: or $3, $2, $4 931; MIPS64-NEXT: sc $3, 0($1) 932; MIPS64-NEXT: beqz $3, .LBB3_1 933; MIPS64-NEXT: nop 934; MIPS64-NEXT: # %bb.2: # %entry 935; MIPS64-NEXT: jr $ra 936; MIPS64-NEXT: nop 937; 938; MIPS64R2-LABEL: AtomicLoadOr32: 939; MIPS64R2: # %bb.0: # %entry 940; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 941; MIPS64R2-NEXT: daddu $1, $1, $25 942; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 943; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 944; MIPS64R2-NEXT: .LBB3_1: # %entry 945; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 946; MIPS64R2-NEXT: ll $2, 0($1) 947; MIPS64R2-NEXT: or $3, $2, $4 948; MIPS64R2-NEXT: sc $3, 0($1) 949; MIPS64R2-NEXT: beqz $3, .LBB3_1 950; MIPS64R2-NEXT: nop 951; MIPS64R2-NEXT: # %bb.2: # %entry 952; MIPS64R2-NEXT: jr $ra 953; MIPS64R2-NEXT: nop 954; 955; MIPS64R6-LABEL: AtomicLoadOr32: 956; MIPS64R6: # %bb.0: # %entry 957; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 958; MIPS64R6-NEXT: daddu $1, $1, $25 959; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 960; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 961; MIPS64R6-NEXT: .LBB3_1: # %entry 962; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 963; MIPS64R6-NEXT: ll $2, 0($1) 964; MIPS64R6-NEXT: or $3, $2, $4 965; MIPS64R6-NEXT: sc $3, 0($1) 966; MIPS64R6-NEXT: beqzc $3, .LBB3_1 967; MIPS64R6-NEXT: nop 968; MIPS64R6-NEXT: # %bb.2: # %entry 969; MIPS64R6-NEXT: jrc $ra 970; 971; MIPS64R6O0-LABEL: AtomicLoadOr32: 972; MIPS64R6O0: # %bb.0: # %entry 973; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 974; MIPS64R6O0-NEXT: daddu $1, $1, $25 975; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 976; MIPS64R6O0-NEXT: move $2, $4 977; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 978; MIPS64R6O0-NEXT: .LBB3_1: # %entry 979; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 980; MIPS64R6O0-NEXT: ll $3, 0($1) 981; MIPS64R6O0-NEXT: or $5, $3, $2 982; MIPS64R6O0-NEXT: sc $5, 0($1) 983; MIPS64R6O0-NEXT: beqzc $5, .LBB3_1 984; MIPS64R6O0-NEXT: # %bb.2: # %entry 985; MIPS64R6O0-NEXT: move $2, $3 986; MIPS64R6O0-NEXT: jrc $ra 987; 988; MM32-LABEL: AtomicLoadOr32: 989; MM32: # %bb.0: # %entry 990; MM32-NEXT: lui $2, %hi(_gp_disp) 991; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 992; MM32-NEXT: addu $2, $2, $25 993; MM32-NEXT: lw $1, %got(x)($2) 994; MM32-NEXT: $BB3_1: # %entry 995; MM32-NEXT: # =>This Inner Loop Header: Depth=1 996; MM32-NEXT: ll $2, 0($1) 997; MM32-NEXT: or $3, $2, $4 998; MM32-NEXT: sc $3, 0($1) 999; MM32-NEXT: beqzc $3, $BB3_1 1000; MM32-NEXT: # %bb.2: # %entry 1001; MM32-NEXT: jrc $ra 1002; 1003; O1-LABEL: AtomicLoadOr32: 1004; O1: # %bb.0: # %entry 1005; O1-NEXT: lui $2, %hi(_gp_disp) 1006; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1007; O1-NEXT: addu $1, $2, $25 1008; O1-NEXT: lw $1, %got(x)($1) 1009; O1-NEXT: $BB3_1: # %entry 1010; O1-NEXT: # =>This Inner Loop Header: Depth=1 1011; O1-NEXT: ll $2, 0($1) 1012; O1-NEXT: or $3, $2, $4 1013; O1-NEXT: sc $3, 0($1) 1014; O1-NEXT: beqz $3, $BB3_1 1015; O1-NEXT: nop 1016; O1-NEXT: # %bb.2: # %entry 1017; O1-NEXT: jr $ra 1018; O1-NEXT: nop 1019; 1020; O2-LABEL: AtomicLoadOr32: 1021; O2: # %bb.0: # %entry 1022; O2-NEXT: lui $2, %hi(_gp_disp) 1023; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1024; O2-NEXT: addu $1, $2, $25 1025; O2-NEXT: lw $1, %got(x)($1) 1026; O2-NEXT: $BB3_1: # %entry 1027; O2-NEXT: # =>This Inner Loop Header: Depth=1 1028; O2-NEXT: ll $2, 0($1) 1029; O2-NEXT: or $3, $2, $4 1030; O2-NEXT: sc $3, 0($1) 1031; O2-NEXT: beqz $3, $BB3_1 1032; O2-NEXT: nop 1033; O2-NEXT: # %bb.2: # %entry 1034; O2-NEXT: jr $ra 1035; O2-NEXT: nop 1036; 1037; O3-LABEL: AtomicLoadOr32: 1038; O3: # %bb.0: # %entry 1039; O3-NEXT: lui $2, %hi(_gp_disp) 1040; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1041; O3-NEXT: addu $1, $2, $25 1042; O3-NEXT: lw $1, %got(x)($1) 1043; O3-NEXT: $BB3_1: # %entry 1044; O3-NEXT: # =>This Inner Loop Header: Depth=1 1045; O3-NEXT: ll $2, 0($1) 1046; O3-NEXT: or $3, $2, $4 1047; O3-NEXT: sc $3, 0($1) 1048; O3-NEXT: beqz $3, $BB3_1 1049; O3-NEXT: nop 1050; O3-NEXT: # %bb.2: # %entry 1051; O3-NEXT: jr $ra 1052; O3-NEXT: nop 1053; 1054; MIPS32EB-LABEL: AtomicLoadOr32: 1055; MIPS32EB: # %bb.0: # %entry 1056; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1057; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1058; MIPS32EB-NEXT: addu $1, $2, $25 1059; MIPS32EB-NEXT: lw $1, %got(x)($1) 1060; MIPS32EB-NEXT: $BB3_1: # %entry 1061; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1062; MIPS32EB-NEXT: ll $2, 0($1) 1063; MIPS32EB-NEXT: or $3, $2, $4 1064; MIPS32EB-NEXT: sc $3, 0($1) 1065; MIPS32EB-NEXT: beqz $3, $BB3_1 1066; MIPS32EB-NEXT: nop 1067; MIPS32EB-NEXT: # %bb.2: # %entry 1068; MIPS32EB-NEXT: jr $ra 1069; MIPS32EB-NEXT: nop 1070entry: 1071 %0 = atomicrmw or i32* @x, i32 %incr monotonic 1072 ret i32 %0 1073} 1074 1075define i32 @AtomicLoadAnd32(i32 signext %incr) nounwind { 1076; MIPS32-LABEL: AtomicLoadAnd32: 1077; MIPS32: # %bb.0: # %entry 1078; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1079; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1080; MIPS32-NEXT: addu $1, $2, $25 1081; MIPS32-NEXT: lw $1, %got(x)($1) 1082; MIPS32-NEXT: $BB4_1: # %entry 1083; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1084; MIPS32-NEXT: ll $2, 0($1) 1085; MIPS32-NEXT: and $3, $2, $4 1086; MIPS32-NEXT: sc $3, 0($1) 1087; MIPS32-NEXT: beqz $3, $BB4_1 1088; MIPS32-NEXT: nop 1089; MIPS32-NEXT: # %bb.2: # %entry 1090; MIPS32-NEXT: jr $ra 1091; MIPS32-NEXT: nop 1092; 1093; MIPS32O0-LABEL: AtomicLoadAnd32: 1094; MIPS32O0: # %bb.0: # %entry 1095; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1096; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1097; MIPS32O0-NEXT: addu $1, $2, $25 1098; MIPS32O0-NEXT: lw $1, %got(x)($1) 1099; MIPS32O0-NEXT: $BB4_1: # %entry 1100; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1101; MIPS32O0-NEXT: ll $2, 0($1) 1102; MIPS32O0-NEXT: and $3, $2, $4 1103; MIPS32O0-NEXT: sc $3, 0($1) 1104; MIPS32O0-NEXT: beqz $3, $BB4_1 1105; MIPS32O0-NEXT: nop 1106; MIPS32O0-NEXT: # %bb.2: # %entry 1107; MIPS32O0-NEXT: jr $ra 1108; MIPS32O0-NEXT: nop 1109; 1110; MIPS32R2-LABEL: AtomicLoadAnd32: 1111; MIPS32R2: # %bb.0: # %entry 1112; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1113; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1114; MIPS32R2-NEXT: addu $1, $2, $25 1115; MIPS32R2-NEXT: lw $1, %got(x)($1) 1116; MIPS32R2-NEXT: $BB4_1: # %entry 1117; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1118; MIPS32R2-NEXT: ll $2, 0($1) 1119; MIPS32R2-NEXT: and $3, $2, $4 1120; MIPS32R2-NEXT: sc $3, 0($1) 1121; MIPS32R2-NEXT: beqz $3, $BB4_1 1122; MIPS32R2-NEXT: nop 1123; MIPS32R2-NEXT: # %bb.2: # %entry 1124; MIPS32R2-NEXT: jr $ra 1125; MIPS32R2-NEXT: nop 1126; 1127; MIPS32R6-LABEL: AtomicLoadAnd32: 1128; MIPS32R6: # %bb.0: # %entry 1129; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1130; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1131; MIPS32R6-NEXT: addu $1, $2, $25 1132; MIPS32R6-NEXT: lw $1, %got(x)($1) 1133; MIPS32R6-NEXT: $BB4_1: # %entry 1134; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1135; MIPS32R6-NEXT: ll $2, 0($1) 1136; MIPS32R6-NEXT: and $3, $2, $4 1137; MIPS32R6-NEXT: sc $3, 0($1) 1138; MIPS32R6-NEXT: beqzc $3, $BB4_1 1139; MIPS32R6-NEXT: nop 1140; MIPS32R6-NEXT: # %bb.2: # %entry 1141; MIPS32R6-NEXT: jrc $ra 1142; 1143; MIPS32R6O0-LABEL: AtomicLoadAnd32: 1144; MIPS32R6O0: # %bb.0: # %entry 1145; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1146; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1147; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 1148; MIPS32R6O0-NEXT: addu $1, $2, $25 1149; MIPS32R6O0-NEXT: move $2, $4 1150; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 1151; MIPS32R6O0-NEXT: $BB4_1: # %entry 1152; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1153; MIPS32R6O0-NEXT: ll $3, 0($1) 1154; MIPS32R6O0-NEXT: and $5, $3, $4 1155; MIPS32R6O0-NEXT: sc $5, 0($1) 1156; MIPS32R6O0-NEXT: beqzc $5, $BB4_1 1157; MIPS32R6O0-NEXT: # %bb.2: # %entry 1158; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 1159; MIPS32R6O0-NEXT: move $2, $3 1160; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 1161; MIPS32R6O0-NEXT: jrc $ra 1162; 1163; MIPS4-LABEL: AtomicLoadAnd32: 1164; MIPS4: # %bb.0: # %entry 1165; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1166; MIPS4-NEXT: daddu $1, $1, $25 1167; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1168; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1169; MIPS4-NEXT: .LBB4_1: # %entry 1170; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1171; MIPS4-NEXT: ll $2, 0($1) 1172; MIPS4-NEXT: and $3, $2, $4 1173; MIPS4-NEXT: sc $3, 0($1) 1174; MIPS4-NEXT: beqz $3, .LBB4_1 1175; MIPS4-NEXT: nop 1176; MIPS4-NEXT: # %bb.2: # %entry 1177; MIPS4-NEXT: jr $ra 1178; MIPS4-NEXT: nop 1179; 1180; MIPS64-LABEL: AtomicLoadAnd32: 1181; MIPS64: # %bb.0: # %entry 1182; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1183; MIPS64-NEXT: daddu $1, $1, $25 1184; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1185; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1186; MIPS64-NEXT: .LBB4_1: # %entry 1187; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1188; MIPS64-NEXT: ll $2, 0($1) 1189; MIPS64-NEXT: and $3, $2, $4 1190; MIPS64-NEXT: sc $3, 0($1) 1191; MIPS64-NEXT: beqz $3, .LBB4_1 1192; MIPS64-NEXT: nop 1193; MIPS64-NEXT: # %bb.2: # %entry 1194; MIPS64-NEXT: jr $ra 1195; MIPS64-NEXT: nop 1196; 1197; MIPS64R2-LABEL: AtomicLoadAnd32: 1198; MIPS64R2: # %bb.0: # %entry 1199; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1200; MIPS64R2-NEXT: daddu $1, $1, $25 1201; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1202; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1203; MIPS64R2-NEXT: .LBB4_1: # %entry 1204; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1205; MIPS64R2-NEXT: ll $2, 0($1) 1206; MIPS64R2-NEXT: and $3, $2, $4 1207; MIPS64R2-NEXT: sc $3, 0($1) 1208; MIPS64R2-NEXT: beqz $3, .LBB4_1 1209; MIPS64R2-NEXT: nop 1210; MIPS64R2-NEXT: # %bb.2: # %entry 1211; MIPS64R2-NEXT: jr $ra 1212; MIPS64R2-NEXT: nop 1213; 1214; MIPS64R6-LABEL: AtomicLoadAnd32: 1215; MIPS64R6: # %bb.0: # %entry 1216; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1217; MIPS64R6-NEXT: daddu $1, $1, $25 1218; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1219; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1220; MIPS64R6-NEXT: .LBB4_1: # %entry 1221; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1222; MIPS64R6-NEXT: ll $2, 0($1) 1223; MIPS64R6-NEXT: and $3, $2, $4 1224; MIPS64R6-NEXT: sc $3, 0($1) 1225; MIPS64R6-NEXT: beqzc $3, .LBB4_1 1226; MIPS64R6-NEXT: nop 1227; MIPS64R6-NEXT: # %bb.2: # %entry 1228; MIPS64R6-NEXT: jrc $ra 1229; 1230; MIPS64R6O0-LABEL: AtomicLoadAnd32: 1231; MIPS64R6O0: # %bb.0: # %entry 1232; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1233; MIPS64R6O0-NEXT: daddu $1, $1, $25 1234; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1235; MIPS64R6O0-NEXT: move $2, $4 1236; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1237; MIPS64R6O0-NEXT: .LBB4_1: # %entry 1238; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1239; MIPS64R6O0-NEXT: ll $3, 0($1) 1240; MIPS64R6O0-NEXT: and $5, $3, $2 1241; MIPS64R6O0-NEXT: sc $5, 0($1) 1242; MIPS64R6O0-NEXT: beqzc $5, .LBB4_1 1243; MIPS64R6O0-NEXT: # %bb.2: # %entry 1244; MIPS64R6O0-NEXT: move $2, $3 1245; MIPS64R6O0-NEXT: jrc $ra 1246; 1247; MM32-LABEL: AtomicLoadAnd32: 1248; MM32: # %bb.0: # %entry 1249; MM32-NEXT: lui $2, %hi(_gp_disp) 1250; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1251; MM32-NEXT: addu $2, $2, $25 1252; MM32-NEXT: lw $1, %got(x)($2) 1253; MM32-NEXT: $BB4_1: # %entry 1254; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1255; MM32-NEXT: ll $2, 0($1) 1256; MM32-NEXT: and $3, $2, $4 1257; MM32-NEXT: sc $3, 0($1) 1258; MM32-NEXT: beqzc $3, $BB4_1 1259; MM32-NEXT: # %bb.2: # %entry 1260; MM32-NEXT: jrc $ra 1261; 1262; O1-LABEL: AtomicLoadAnd32: 1263; O1: # %bb.0: # %entry 1264; O1-NEXT: lui $2, %hi(_gp_disp) 1265; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1266; O1-NEXT: addu $1, $2, $25 1267; O1-NEXT: lw $1, %got(x)($1) 1268; O1-NEXT: $BB4_1: # %entry 1269; O1-NEXT: # =>This Inner Loop Header: Depth=1 1270; O1-NEXT: ll $2, 0($1) 1271; O1-NEXT: and $3, $2, $4 1272; O1-NEXT: sc $3, 0($1) 1273; O1-NEXT: beqz $3, $BB4_1 1274; O1-NEXT: nop 1275; O1-NEXT: # %bb.2: # %entry 1276; O1-NEXT: jr $ra 1277; O1-NEXT: nop 1278; 1279; O2-LABEL: AtomicLoadAnd32: 1280; O2: # %bb.0: # %entry 1281; O2-NEXT: lui $2, %hi(_gp_disp) 1282; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1283; O2-NEXT: addu $1, $2, $25 1284; O2-NEXT: lw $1, %got(x)($1) 1285; O2-NEXT: $BB4_1: # %entry 1286; O2-NEXT: # =>This Inner Loop Header: Depth=1 1287; O2-NEXT: ll $2, 0($1) 1288; O2-NEXT: and $3, $2, $4 1289; O2-NEXT: sc $3, 0($1) 1290; O2-NEXT: beqz $3, $BB4_1 1291; O2-NEXT: nop 1292; O2-NEXT: # %bb.2: # %entry 1293; O2-NEXT: jr $ra 1294; O2-NEXT: nop 1295; 1296; O3-LABEL: AtomicLoadAnd32: 1297; O3: # %bb.0: # %entry 1298; O3-NEXT: lui $2, %hi(_gp_disp) 1299; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1300; O3-NEXT: addu $1, $2, $25 1301; O3-NEXT: lw $1, %got(x)($1) 1302; O3-NEXT: $BB4_1: # %entry 1303; O3-NEXT: # =>This Inner Loop Header: Depth=1 1304; O3-NEXT: ll $2, 0($1) 1305; O3-NEXT: and $3, $2, $4 1306; O3-NEXT: sc $3, 0($1) 1307; O3-NEXT: beqz $3, $BB4_1 1308; O3-NEXT: nop 1309; O3-NEXT: # %bb.2: # %entry 1310; O3-NEXT: jr $ra 1311; O3-NEXT: nop 1312; 1313; MIPS32EB-LABEL: AtomicLoadAnd32: 1314; MIPS32EB: # %bb.0: # %entry 1315; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1316; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1317; MIPS32EB-NEXT: addu $1, $2, $25 1318; MIPS32EB-NEXT: lw $1, %got(x)($1) 1319; MIPS32EB-NEXT: $BB4_1: # %entry 1320; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1321; MIPS32EB-NEXT: ll $2, 0($1) 1322; MIPS32EB-NEXT: and $3, $2, $4 1323; MIPS32EB-NEXT: sc $3, 0($1) 1324; MIPS32EB-NEXT: beqz $3, $BB4_1 1325; MIPS32EB-NEXT: nop 1326; MIPS32EB-NEXT: # %bb.2: # %entry 1327; MIPS32EB-NEXT: jr $ra 1328; MIPS32EB-NEXT: nop 1329entry: 1330 %0 = atomicrmw and i32* @x, i32 %incr monotonic 1331 ret i32 %0 1332} 1333 1334define i32 @AtomicLoadNand32(i32 signext %incr) nounwind { 1335; MIPS32-LABEL: AtomicLoadNand32: 1336; MIPS32: # %bb.0: # %entry 1337; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1338; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1339; MIPS32-NEXT: addu $1, $2, $25 1340; MIPS32-NEXT: lw $1, %got(x)($1) 1341; MIPS32-NEXT: $BB5_1: # %entry 1342; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1343; MIPS32-NEXT: ll $2, 0($1) 1344; MIPS32-NEXT: and $3, $2, $4 1345; MIPS32-NEXT: nor $3, $zero, $3 1346; MIPS32-NEXT: sc $3, 0($1) 1347; MIPS32-NEXT: beqz $3, $BB5_1 1348; MIPS32-NEXT: nop 1349; MIPS32-NEXT: # %bb.2: # %entry 1350; MIPS32-NEXT: jr $ra 1351; MIPS32-NEXT: nop 1352; 1353; MIPS32O0-LABEL: AtomicLoadNand32: 1354; MIPS32O0: # %bb.0: # %entry 1355; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1356; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1357; MIPS32O0-NEXT: addu $1, $2, $25 1358; MIPS32O0-NEXT: lw $1, %got(x)($1) 1359; MIPS32O0-NEXT: $BB5_1: # %entry 1360; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1361; MIPS32O0-NEXT: ll $2, 0($1) 1362; MIPS32O0-NEXT: and $3, $2, $4 1363; MIPS32O0-NEXT: nor $3, $zero, $3 1364; MIPS32O0-NEXT: sc $3, 0($1) 1365; MIPS32O0-NEXT: beqz $3, $BB5_1 1366; MIPS32O0-NEXT: nop 1367; MIPS32O0-NEXT: # %bb.2: # %entry 1368; MIPS32O0-NEXT: jr $ra 1369; MIPS32O0-NEXT: nop 1370; 1371; MIPS32R2-LABEL: AtomicLoadNand32: 1372; MIPS32R2: # %bb.0: # %entry 1373; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1374; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1375; MIPS32R2-NEXT: addu $1, $2, $25 1376; MIPS32R2-NEXT: lw $1, %got(x)($1) 1377; MIPS32R2-NEXT: $BB5_1: # %entry 1378; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1379; MIPS32R2-NEXT: ll $2, 0($1) 1380; MIPS32R2-NEXT: and $3, $2, $4 1381; MIPS32R2-NEXT: nor $3, $zero, $3 1382; MIPS32R2-NEXT: sc $3, 0($1) 1383; MIPS32R2-NEXT: beqz $3, $BB5_1 1384; MIPS32R2-NEXT: nop 1385; MIPS32R2-NEXT: # %bb.2: # %entry 1386; MIPS32R2-NEXT: jr $ra 1387; MIPS32R2-NEXT: nop 1388; 1389; MIPS32R6-LABEL: AtomicLoadNand32: 1390; MIPS32R6: # %bb.0: # %entry 1391; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1392; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1393; MIPS32R6-NEXT: addu $1, $2, $25 1394; MIPS32R6-NEXT: lw $1, %got(x)($1) 1395; MIPS32R6-NEXT: $BB5_1: # %entry 1396; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1397; MIPS32R6-NEXT: ll $2, 0($1) 1398; MIPS32R6-NEXT: and $3, $2, $4 1399; MIPS32R6-NEXT: nor $3, $zero, $3 1400; MIPS32R6-NEXT: sc $3, 0($1) 1401; MIPS32R6-NEXT: beqzc $3, $BB5_1 1402; MIPS32R6-NEXT: nop 1403; MIPS32R6-NEXT: # %bb.2: # %entry 1404; MIPS32R6-NEXT: jrc $ra 1405; 1406; MIPS32R6O0-LABEL: AtomicLoadNand32: 1407; MIPS32R6O0: # %bb.0: # %entry 1408; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1409; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1410; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 1411; MIPS32R6O0-NEXT: addu $1, $2, $25 1412; MIPS32R6O0-NEXT: move $2, $4 1413; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 1414; MIPS32R6O0-NEXT: $BB5_1: # %entry 1415; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1416; MIPS32R6O0-NEXT: ll $3, 0($1) 1417; MIPS32R6O0-NEXT: and $5, $3, $4 1418; MIPS32R6O0-NEXT: nor $5, $zero, $5 1419; MIPS32R6O0-NEXT: sc $5, 0($1) 1420; MIPS32R6O0-NEXT: beqzc $5, $BB5_1 1421; MIPS32R6O0-NEXT: # %bb.2: # %entry 1422; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 1423; MIPS32R6O0-NEXT: move $2, $3 1424; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 1425; MIPS32R6O0-NEXT: jrc $ra 1426; 1427; MIPS4-LABEL: AtomicLoadNand32: 1428; MIPS4: # %bb.0: # %entry 1429; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1430; MIPS4-NEXT: daddu $1, $1, $25 1431; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1432; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1433; MIPS4-NEXT: .LBB5_1: # %entry 1434; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1435; MIPS4-NEXT: ll $2, 0($1) 1436; MIPS4-NEXT: and $3, $2, $4 1437; MIPS4-NEXT: nor $3, $zero, $3 1438; MIPS4-NEXT: sc $3, 0($1) 1439; MIPS4-NEXT: beqz $3, .LBB5_1 1440; MIPS4-NEXT: nop 1441; MIPS4-NEXT: # %bb.2: # %entry 1442; MIPS4-NEXT: jr $ra 1443; MIPS4-NEXT: nop 1444; 1445; MIPS64-LABEL: AtomicLoadNand32: 1446; MIPS64: # %bb.0: # %entry 1447; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1448; MIPS64-NEXT: daddu $1, $1, $25 1449; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1450; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1451; MIPS64-NEXT: .LBB5_1: # %entry 1452; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1453; MIPS64-NEXT: ll $2, 0($1) 1454; MIPS64-NEXT: and $3, $2, $4 1455; MIPS64-NEXT: nor $3, $zero, $3 1456; MIPS64-NEXT: sc $3, 0($1) 1457; MIPS64-NEXT: beqz $3, .LBB5_1 1458; MIPS64-NEXT: nop 1459; MIPS64-NEXT: # %bb.2: # %entry 1460; MIPS64-NEXT: jr $ra 1461; MIPS64-NEXT: nop 1462; 1463; MIPS64R2-LABEL: AtomicLoadNand32: 1464; MIPS64R2: # %bb.0: # %entry 1465; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1466; MIPS64R2-NEXT: daddu $1, $1, $25 1467; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1468; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1469; MIPS64R2-NEXT: .LBB5_1: # %entry 1470; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1471; MIPS64R2-NEXT: ll $2, 0($1) 1472; MIPS64R2-NEXT: and $3, $2, $4 1473; MIPS64R2-NEXT: nor $3, $zero, $3 1474; MIPS64R2-NEXT: sc $3, 0($1) 1475; MIPS64R2-NEXT: beqz $3, .LBB5_1 1476; MIPS64R2-NEXT: nop 1477; MIPS64R2-NEXT: # %bb.2: # %entry 1478; MIPS64R2-NEXT: jr $ra 1479; MIPS64R2-NEXT: nop 1480; 1481; MIPS64R6-LABEL: AtomicLoadNand32: 1482; MIPS64R6: # %bb.0: # %entry 1483; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1484; MIPS64R6-NEXT: daddu $1, $1, $25 1485; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1486; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1487; MIPS64R6-NEXT: .LBB5_1: # %entry 1488; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1489; MIPS64R6-NEXT: ll $2, 0($1) 1490; MIPS64R6-NEXT: and $3, $2, $4 1491; MIPS64R6-NEXT: nor $3, $zero, $3 1492; MIPS64R6-NEXT: sc $3, 0($1) 1493; MIPS64R6-NEXT: beqzc $3, .LBB5_1 1494; MIPS64R6-NEXT: nop 1495; MIPS64R6-NEXT: # %bb.2: # %entry 1496; MIPS64R6-NEXT: jrc $ra 1497; 1498; MIPS64R6O0-LABEL: AtomicLoadNand32: 1499; MIPS64R6O0: # %bb.0: # %entry 1500; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1501; MIPS64R6O0-NEXT: daddu $1, $1, $25 1502; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1503; MIPS64R6O0-NEXT: move $2, $4 1504; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1505; MIPS64R6O0-NEXT: .LBB5_1: # %entry 1506; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1507; MIPS64R6O0-NEXT: ll $3, 0($1) 1508; MIPS64R6O0-NEXT: and $5, $3, $2 1509; MIPS64R6O0-NEXT: nor $5, $zero, $5 1510; MIPS64R6O0-NEXT: sc $5, 0($1) 1511; MIPS64R6O0-NEXT: beqzc $5, .LBB5_1 1512; MIPS64R6O0-NEXT: # %bb.2: # %entry 1513; MIPS64R6O0-NEXT: move $2, $3 1514; MIPS64R6O0-NEXT: jrc $ra 1515; 1516; MM32-LABEL: AtomicLoadNand32: 1517; MM32: # %bb.0: # %entry 1518; MM32-NEXT: lui $2, %hi(_gp_disp) 1519; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1520; MM32-NEXT: addu $2, $2, $25 1521; MM32-NEXT: lw $1, %got(x)($2) 1522; MM32-NEXT: $BB5_1: # %entry 1523; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1524; MM32-NEXT: ll $2, 0($1) 1525; MM32-NEXT: and $3, $2, $4 1526; MM32-NEXT: nor $3, $zero, $3 1527; MM32-NEXT: sc $3, 0($1) 1528; MM32-NEXT: beqzc $3, $BB5_1 1529; MM32-NEXT: # %bb.2: # %entry 1530; MM32-NEXT: jrc $ra 1531; 1532; O1-LABEL: AtomicLoadNand32: 1533; O1: # %bb.0: # %entry 1534; O1-NEXT: lui $2, %hi(_gp_disp) 1535; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1536; O1-NEXT: addu $1, $2, $25 1537; O1-NEXT: lw $1, %got(x)($1) 1538; O1-NEXT: $BB5_1: # %entry 1539; O1-NEXT: # =>This Inner Loop Header: Depth=1 1540; O1-NEXT: ll $2, 0($1) 1541; O1-NEXT: and $3, $2, $4 1542; O1-NEXT: nor $3, $zero, $3 1543; O1-NEXT: sc $3, 0($1) 1544; O1-NEXT: beqz $3, $BB5_1 1545; O1-NEXT: nop 1546; O1-NEXT: # %bb.2: # %entry 1547; O1-NEXT: jr $ra 1548; O1-NEXT: nop 1549; 1550; O2-LABEL: AtomicLoadNand32: 1551; O2: # %bb.0: # %entry 1552; O2-NEXT: lui $2, %hi(_gp_disp) 1553; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1554; O2-NEXT: addu $1, $2, $25 1555; O2-NEXT: lw $1, %got(x)($1) 1556; O2-NEXT: $BB5_1: # %entry 1557; O2-NEXT: # =>This Inner Loop Header: Depth=1 1558; O2-NEXT: ll $2, 0($1) 1559; O2-NEXT: and $3, $2, $4 1560; O2-NEXT: nor $3, $zero, $3 1561; O2-NEXT: sc $3, 0($1) 1562; O2-NEXT: beqz $3, $BB5_1 1563; O2-NEXT: nop 1564; O2-NEXT: # %bb.2: # %entry 1565; O2-NEXT: jr $ra 1566; O2-NEXT: nop 1567; 1568; O3-LABEL: AtomicLoadNand32: 1569; O3: # %bb.0: # %entry 1570; O3-NEXT: lui $2, %hi(_gp_disp) 1571; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1572; O3-NEXT: addu $1, $2, $25 1573; O3-NEXT: lw $1, %got(x)($1) 1574; O3-NEXT: $BB5_1: # %entry 1575; O3-NEXT: # =>This Inner Loop Header: Depth=1 1576; O3-NEXT: ll $2, 0($1) 1577; O3-NEXT: and $3, $2, $4 1578; O3-NEXT: nor $3, $zero, $3 1579; O3-NEXT: sc $3, 0($1) 1580; O3-NEXT: beqz $3, $BB5_1 1581; O3-NEXT: nop 1582; O3-NEXT: # %bb.2: # %entry 1583; O3-NEXT: jr $ra 1584; O3-NEXT: nop 1585; 1586; MIPS32EB-LABEL: AtomicLoadNand32: 1587; MIPS32EB: # %bb.0: # %entry 1588; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1589; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1590; MIPS32EB-NEXT: addu $1, $2, $25 1591; MIPS32EB-NEXT: lw $1, %got(x)($1) 1592; MIPS32EB-NEXT: $BB5_1: # %entry 1593; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1594; MIPS32EB-NEXT: ll $2, 0($1) 1595; MIPS32EB-NEXT: and $3, $2, $4 1596; MIPS32EB-NEXT: nor $3, $zero, $3 1597; MIPS32EB-NEXT: sc $3, 0($1) 1598; MIPS32EB-NEXT: beqz $3, $BB5_1 1599; MIPS32EB-NEXT: nop 1600; MIPS32EB-NEXT: # %bb.2: # %entry 1601; MIPS32EB-NEXT: jr $ra 1602; MIPS32EB-NEXT: nop 1603entry: 1604 %0 = atomicrmw nand i32* @x, i32 %incr monotonic 1605 ret i32 %0 1606 1607} 1608 1609define i32 @AtomicSwap32(i32 signext %newval) nounwind { 1610; MIPS32-LABEL: AtomicSwap32: 1611; MIPS32: # %bb.0: # %entry 1612; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1613; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1614; MIPS32-NEXT: addiu $sp, $sp, -8 1615; MIPS32-NEXT: addu $1, $2, $25 1616; MIPS32-NEXT: sw $4, 4($sp) 1617; MIPS32-NEXT: lw $1, %got(x)($1) 1618; MIPS32-NEXT: $BB6_1: # %entry 1619; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1620; MIPS32-NEXT: ll $2, 0($1) 1621; MIPS32-NEXT: move $3, $4 1622; MIPS32-NEXT: sc $3, 0($1) 1623; MIPS32-NEXT: beqz $3, $BB6_1 1624; MIPS32-NEXT: nop 1625; MIPS32-NEXT: # %bb.2: # %entry 1626; MIPS32-NEXT: jr $ra 1627; MIPS32-NEXT: addiu $sp, $sp, 8 1628; 1629; MIPS32O0-LABEL: AtomicSwap32: 1630; MIPS32O0: # %bb.0: # %entry 1631; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1632; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1633; MIPS32O0-NEXT: addiu $sp, $sp, -8 1634; MIPS32O0-NEXT: addu $1, $2, $25 1635; MIPS32O0-NEXT: sw $4, 4($sp) 1636; MIPS32O0-NEXT: lw $2, 4($sp) 1637; MIPS32O0-NEXT: lw $1, %got(x)($1) 1638; MIPS32O0-NEXT: $BB6_1: # %entry 1639; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1640; MIPS32O0-NEXT: ll $3, 0($1) 1641; MIPS32O0-NEXT: move $4, $2 1642; MIPS32O0-NEXT: sc $4, 0($1) 1643; MIPS32O0-NEXT: beqz $4, $BB6_1 1644; MIPS32O0-NEXT: nop 1645; MIPS32O0-NEXT: # %bb.2: # %entry 1646; MIPS32O0-NEXT: move $2, $3 1647; MIPS32O0-NEXT: addiu $sp, $sp, 8 1648; MIPS32O0-NEXT: jr $ra 1649; MIPS32O0-NEXT: nop 1650; 1651; MIPS32R2-LABEL: AtomicSwap32: 1652; MIPS32R2: # %bb.0: # %entry 1653; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1654; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1655; MIPS32R2-NEXT: addiu $sp, $sp, -8 1656; MIPS32R2-NEXT: addu $1, $2, $25 1657; MIPS32R2-NEXT: sw $4, 4($sp) 1658; MIPS32R2-NEXT: lw $1, %got(x)($1) 1659; MIPS32R2-NEXT: $BB6_1: # %entry 1660; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1661; MIPS32R2-NEXT: ll $2, 0($1) 1662; MIPS32R2-NEXT: move $3, $4 1663; MIPS32R2-NEXT: sc $3, 0($1) 1664; MIPS32R2-NEXT: beqz $3, $BB6_1 1665; MIPS32R2-NEXT: nop 1666; MIPS32R2-NEXT: # %bb.2: # %entry 1667; MIPS32R2-NEXT: jr $ra 1668; MIPS32R2-NEXT: addiu $sp, $sp, 8 1669; 1670; MIPS32R6-LABEL: AtomicSwap32: 1671; MIPS32R6: # %bb.0: # %entry 1672; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1673; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1674; MIPS32R6-NEXT: addiu $sp, $sp, -8 1675; MIPS32R6-NEXT: addu $1, $2, $25 1676; MIPS32R6-NEXT: sw $4, 4($sp) 1677; MIPS32R6-NEXT: lw $1, %got(x)($1) 1678; MIPS32R6-NEXT: $BB6_1: # %entry 1679; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1680; MIPS32R6-NEXT: ll $2, 0($1) 1681; MIPS32R6-NEXT: move $3, $4 1682; MIPS32R6-NEXT: sc $3, 0($1) 1683; MIPS32R6-NEXT: beqzc $3, $BB6_1 1684; MIPS32R6-NEXT: nop 1685; MIPS32R6-NEXT: # %bb.2: # %entry 1686; MIPS32R6-NEXT: jr $ra 1687; MIPS32R6-NEXT: addiu $sp, $sp, 8 1688; 1689; MIPS32R6O0-LABEL: AtomicSwap32: 1690; MIPS32R6O0: # %bb.0: # %entry 1691; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1692; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1693; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 1694; MIPS32R6O0-NEXT: addu $1, $2, $25 1695; MIPS32R6O0-NEXT: move $2, $4 1696; MIPS32R6O0-NEXT: sw $4, 4($sp) 1697; MIPS32R6O0-NEXT: lw $3, 4($sp) 1698; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 1699; MIPS32R6O0-NEXT: $BB6_1: # %entry 1700; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1701; MIPS32R6O0-NEXT: ll $4, 0($1) 1702; MIPS32R6O0-NEXT: move $5, $3 1703; MIPS32R6O0-NEXT: sc $5, 0($1) 1704; MIPS32R6O0-NEXT: beqzc $5, $BB6_1 1705; MIPS32R6O0-NEXT: # %bb.2: # %entry 1706; MIPS32R6O0-NEXT: sw $2, 0($sp) # 4-byte Folded Spill 1707; MIPS32R6O0-NEXT: move $2, $4 1708; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 1709; MIPS32R6O0-NEXT: jrc $ra 1710; 1711; MIPS4-LABEL: AtomicSwap32: 1712; MIPS4: # %bb.0: # %entry 1713; MIPS4-NEXT: daddiu $sp, $sp, -16 1714; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1715; MIPS4-NEXT: daddu $1, $1, $25 1716; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1717; MIPS4-NEXT: sw $4, 12($sp) 1718; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1719; MIPS4-NEXT: .LBB6_1: # %entry 1720; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1721; MIPS4-NEXT: ll $2, 0($1) 1722; MIPS4-NEXT: move $3, $4 1723; MIPS4-NEXT: sc $3, 0($1) 1724; MIPS4-NEXT: beqz $3, .LBB6_1 1725; MIPS4-NEXT: nop 1726; MIPS4-NEXT: # %bb.2: # %entry 1727; MIPS4-NEXT: jr $ra 1728; MIPS4-NEXT: daddiu $sp, $sp, 16 1729; 1730; MIPS64-LABEL: AtomicSwap32: 1731; MIPS64: # %bb.0: # %entry 1732; MIPS64-NEXT: daddiu $sp, $sp, -16 1733; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1734; MIPS64-NEXT: daddu $1, $1, $25 1735; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1736; MIPS64-NEXT: sw $4, 12($sp) 1737; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1738; MIPS64-NEXT: .LBB6_1: # %entry 1739; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1740; MIPS64-NEXT: ll $2, 0($1) 1741; MIPS64-NEXT: move $3, $4 1742; MIPS64-NEXT: sc $3, 0($1) 1743; MIPS64-NEXT: beqz $3, .LBB6_1 1744; MIPS64-NEXT: nop 1745; MIPS64-NEXT: # %bb.2: # %entry 1746; MIPS64-NEXT: jr $ra 1747; MIPS64-NEXT: daddiu $sp, $sp, 16 1748; 1749; MIPS64R2-LABEL: AtomicSwap32: 1750; MIPS64R2: # %bb.0: # %entry 1751; MIPS64R2-NEXT: daddiu $sp, $sp, -16 1752; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1753; MIPS64R2-NEXT: daddu $1, $1, $25 1754; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1755; MIPS64R2-NEXT: sw $4, 12($sp) 1756; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1757; MIPS64R2-NEXT: .LBB6_1: # %entry 1758; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1759; MIPS64R2-NEXT: ll $2, 0($1) 1760; MIPS64R2-NEXT: move $3, $4 1761; MIPS64R2-NEXT: sc $3, 0($1) 1762; MIPS64R2-NEXT: beqz $3, .LBB6_1 1763; MIPS64R2-NEXT: nop 1764; MIPS64R2-NEXT: # %bb.2: # %entry 1765; MIPS64R2-NEXT: jr $ra 1766; MIPS64R2-NEXT: daddiu $sp, $sp, 16 1767; 1768; MIPS64R6-LABEL: AtomicSwap32: 1769; MIPS64R6: # %bb.0: # %entry 1770; MIPS64R6-NEXT: daddiu $sp, $sp, -16 1771; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1772; MIPS64R6-NEXT: daddu $1, $1, $25 1773; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1774; MIPS64R6-NEXT: sw $4, 12($sp) 1775; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1776; MIPS64R6-NEXT: .LBB6_1: # %entry 1777; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1778; MIPS64R6-NEXT: ll $2, 0($1) 1779; MIPS64R6-NEXT: move $3, $4 1780; MIPS64R6-NEXT: sc $3, 0($1) 1781; MIPS64R6-NEXT: beqzc $3, .LBB6_1 1782; MIPS64R6-NEXT: nop 1783; MIPS64R6-NEXT: # %bb.2: # %entry 1784; MIPS64R6-NEXT: jr $ra 1785; MIPS64R6-NEXT: daddiu $sp, $sp, 16 1786; 1787; MIPS64R6O0-LABEL: AtomicSwap32: 1788; MIPS64R6O0: # %bb.0: # %entry 1789; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 1790; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1791; MIPS64R6O0-NEXT: daddu $1, $1, $25 1792; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1793; MIPS64R6O0-NEXT: move $2, $4 1794; MIPS64R6O0-NEXT: sw $2, 12($sp) 1795; MIPS64R6O0-NEXT: lw $2, 12($sp) 1796; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1797; MIPS64R6O0-NEXT: .LBB6_1: # %entry 1798; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1799; MIPS64R6O0-NEXT: ll $3, 0($1) 1800; MIPS64R6O0-NEXT: move $5, $2 1801; MIPS64R6O0-NEXT: sc $5, 0($1) 1802; MIPS64R6O0-NEXT: beqzc $5, .LBB6_1 1803; MIPS64R6O0-NEXT: # %bb.2: # %entry 1804; MIPS64R6O0-NEXT: move $2, $3 1805; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 1806; MIPS64R6O0-NEXT: jrc $ra 1807; 1808; MM32-LABEL: AtomicSwap32: 1809; MM32: # %bb.0: # %entry 1810; MM32-NEXT: lui $2, %hi(_gp_disp) 1811; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1812; MM32-NEXT: addiu $sp, $sp, -8 1813; MM32-NEXT: addu $2, $2, $25 1814; MM32-NEXT: sw $4, 4($sp) 1815; MM32-NEXT: lw $1, %got(x)($2) 1816; MM32-NEXT: $BB6_1: # %entry 1817; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1818; MM32-NEXT: ll $2, 0($1) 1819; MM32-NEXT: move $3, $4 1820; MM32-NEXT: sc $3, 0($1) 1821; MM32-NEXT: beqzc $3, $BB6_1 1822; MM32-NEXT: # %bb.2: # %entry 1823; MM32-NEXT: addiusp 8 1824; MM32-NEXT: jrc $ra 1825; 1826; O1-LABEL: AtomicSwap32: 1827; O1: # %bb.0: # %entry 1828; O1-NEXT: lui $2, %hi(_gp_disp) 1829; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1830; O1-NEXT: addiu $sp, $sp, -8 1831; O1-NEXT: addu $1, $2, $25 1832; O1-NEXT: sw $4, 4($sp) 1833; O1-NEXT: lw $1, %got(x)($1) 1834; O1-NEXT: $BB6_1: # %entry 1835; O1-NEXT: # =>This Inner Loop Header: Depth=1 1836; O1-NEXT: ll $2, 0($1) 1837; O1-NEXT: move $3, $4 1838; O1-NEXT: sc $3, 0($1) 1839; O1-NEXT: beqz $3, $BB6_1 1840; O1-NEXT: nop 1841; O1-NEXT: # %bb.2: # %entry 1842; O1-NEXT: jr $ra 1843; O1-NEXT: addiu $sp, $sp, 8 1844; 1845; O2-LABEL: AtomicSwap32: 1846; O2: # %bb.0: # %entry 1847; O2-NEXT: lui $2, %hi(_gp_disp) 1848; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1849; O2-NEXT: addiu $sp, $sp, -8 1850; O2-NEXT: addu $1, $2, $25 1851; O2-NEXT: sw $4, 4($sp) 1852; O2-NEXT: lw $1, %got(x)($1) 1853; O2-NEXT: $BB6_1: # %entry 1854; O2-NEXT: # =>This Inner Loop Header: Depth=1 1855; O2-NEXT: ll $2, 0($1) 1856; O2-NEXT: move $3, $4 1857; O2-NEXT: sc $3, 0($1) 1858; O2-NEXT: beqz $3, $BB6_1 1859; O2-NEXT: nop 1860; O2-NEXT: # %bb.2: # %entry 1861; O2-NEXT: jr $ra 1862; O2-NEXT: addiu $sp, $sp, 8 1863; 1864; O3-LABEL: AtomicSwap32: 1865; O3: # %bb.0: # %entry 1866; O3-NEXT: lui $2, %hi(_gp_disp) 1867; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1868; O3-NEXT: addiu $sp, $sp, -8 1869; O3-NEXT: addu $1, $2, $25 1870; O3-NEXT: sw $4, 4($sp) 1871; O3-NEXT: lw $1, %got(x)($1) 1872; O3-NEXT: $BB6_1: # %entry 1873; O3-NEXT: # =>This Inner Loop Header: Depth=1 1874; O3-NEXT: ll $2, 0($1) 1875; O3-NEXT: move $3, $4 1876; O3-NEXT: sc $3, 0($1) 1877; O3-NEXT: beqz $3, $BB6_1 1878; O3-NEXT: nop 1879; O3-NEXT: # %bb.2: # %entry 1880; O3-NEXT: jr $ra 1881; O3-NEXT: addiu $sp, $sp, 8 1882; 1883; MIPS32EB-LABEL: AtomicSwap32: 1884; MIPS32EB: # %bb.0: # %entry 1885; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1886; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1887; MIPS32EB-NEXT: addiu $sp, $sp, -8 1888; MIPS32EB-NEXT: addu $1, $2, $25 1889; MIPS32EB-NEXT: sw $4, 4($sp) 1890; MIPS32EB-NEXT: lw $1, %got(x)($1) 1891; MIPS32EB-NEXT: $BB6_1: # %entry 1892; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1893; MIPS32EB-NEXT: ll $2, 0($1) 1894; MIPS32EB-NEXT: move $3, $4 1895; MIPS32EB-NEXT: sc $3, 0($1) 1896; MIPS32EB-NEXT: beqz $3, $BB6_1 1897; MIPS32EB-NEXT: nop 1898; MIPS32EB-NEXT: # %bb.2: # %entry 1899; MIPS32EB-NEXT: jr $ra 1900; MIPS32EB-NEXT: addiu $sp, $sp, 8 1901entry: 1902 %newval.addr = alloca i32, align 4 1903 store i32 %newval, i32* %newval.addr, align 4 1904 %tmp = load i32, i32* %newval.addr, align 4 1905 %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic 1906 ret i32 %0 1907 1908} 1909 1910define i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind { 1911; MIPS32-LABEL: AtomicCmpSwap32: 1912; MIPS32: # %bb.0: # %entry 1913; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1914; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1915; MIPS32-NEXT: addiu $sp, $sp, -8 1916; MIPS32-NEXT: addu $1, $2, $25 1917; MIPS32-NEXT: sw $5, 4($sp) 1918; MIPS32-NEXT: lw $1, %got(x)($1) 1919; MIPS32-NEXT: $BB7_1: # %entry 1920; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1921; MIPS32-NEXT: ll $2, 0($1) 1922; MIPS32-NEXT: bne $2, $4, $BB7_3 1923; MIPS32-NEXT: nop 1924; MIPS32-NEXT: # %bb.2: # %entry 1925; MIPS32-NEXT: # in Loop: Header=BB7_1 Depth=1 1926; MIPS32-NEXT: move $3, $5 1927; MIPS32-NEXT: sc $3, 0($1) 1928; MIPS32-NEXT: beqz $3, $BB7_1 1929; MIPS32-NEXT: nop 1930; MIPS32-NEXT: $BB7_3: # %entry 1931; MIPS32-NEXT: jr $ra 1932; MIPS32-NEXT: addiu $sp, $sp, 8 1933; 1934; MIPS32O0-LABEL: AtomicCmpSwap32: 1935; MIPS32O0: # %bb.0: # %entry 1936; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1937; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1938; MIPS32O0-NEXT: addiu $sp, $sp, -8 1939; MIPS32O0-NEXT: addu $1, $2, $25 1940; MIPS32O0-NEXT: sw $5, 4($sp) 1941; MIPS32O0-NEXT: lw $2, 4($sp) 1942; MIPS32O0-NEXT: lw $1, %got(x)($1) 1943; MIPS32O0-NEXT: move $3, $4 1944; MIPS32O0-NEXT: $BB7_1: # %entry 1945; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1946; MIPS32O0-NEXT: ll $5, 0($1) 1947; MIPS32O0-NEXT: bne $5, $3, $BB7_3 1948; MIPS32O0-NEXT: nop 1949; MIPS32O0-NEXT: # %bb.2: # %entry 1950; MIPS32O0-NEXT: # in Loop: Header=BB7_1 Depth=1 1951; MIPS32O0-NEXT: move $6, $2 1952; MIPS32O0-NEXT: sc $6, 0($1) 1953; MIPS32O0-NEXT: beqz $6, $BB7_1 1954; MIPS32O0-NEXT: nop 1955; MIPS32O0-NEXT: $BB7_3: # %entry 1956; MIPS32O0-NEXT: xor $1, $5, $4 1957; MIPS32O0-NEXT: sltiu $1, $1, 1 1958; MIPS32O0-NEXT: move $2, $5 1959; MIPS32O0-NEXT: sw $1, 0($sp) # 4-byte Folded Spill 1960; MIPS32O0-NEXT: addiu $sp, $sp, 8 1961; MIPS32O0-NEXT: jr $ra 1962; MIPS32O0-NEXT: nop 1963; 1964; MIPS32R2-LABEL: AtomicCmpSwap32: 1965; MIPS32R2: # %bb.0: # %entry 1966; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1967; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1968; MIPS32R2-NEXT: addiu $sp, $sp, -8 1969; MIPS32R2-NEXT: addu $1, $2, $25 1970; MIPS32R2-NEXT: sw $5, 4($sp) 1971; MIPS32R2-NEXT: lw $1, %got(x)($1) 1972; MIPS32R2-NEXT: $BB7_1: # %entry 1973; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1974; MIPS32R2-NEXT: ll $2, 0($1) 1975; MIPS32R2-NEXT: bne $2, $4, $BB7_3 1976; MIPS32R2-NEXT: nop 1977; MIPS32R2-NEXT: # %bb.2: # %entry 1978; MIPS32R2-NEXT: # in Loop: Header=BB7_1 Depth=1 1979; MIPS32R2-NEXT: move $3, $5 1980; MIPS32R2-NEXT: sc $3, 0($1) 1981; MIPS32R2-NEXT: beqz $3, $BB7_1 1982; MIPS32R2-NEXT: nop 1983; MIPS32R2-NEXT: $BB7_3: # %entry 1984; MIPS32R2-NEXT: jr $ra 1985; MIPS32R2-NEXT: addiu $sp, $sp, 8 1986; 1987; MIPS32R6-LABEL: AtomicCmpSwap32: 1988; MIPS32R6: # %bb.0: # %entry 1989; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1990; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1991; MIPS32R6-NEXT: addiu $sp, $sp, -8 1992; MIPS32R6-NEXT: addu $1, $2, $25 1993; MIPS32R6-NEXT: sw $5, 4($sp) 1994; MIPS32R6-NEXT: lw $1, %got(x)($1) 1995; MIPS32R6-NEXT: $BB7_1: # %entry 1996; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1997; MIPS32R6-NEXT: ll $2, 0($1) 1998; MIPS32R6-NEXT: bnec $2, $4, $BB7_3 1999; MIPS32R6-NEXT: # %bb.2: # %entry 2000; MIPS32R6-NEXT: # in Loop: Header=BB7_1 Depth=1 2001; MIPS32R6-NEXT: move $3, $5 2002; MIPS32R6-NEXT: sc $3, 0($1) 2003; MIPS32R6-NEXT: beqzc $3, $BB7_1 2004; MIPS32R6-NEXT: nop 2005; MIPS32R6-NEXT: $BB7_3: # %entry 2006; MIPS32R6-NEXT: jr $ra 2007; MIPS32R6-NEXT: addiu $sp, $sp, 8 2008; 2009; MIPS32R6O0-LABEL: AtomicCmpSwap32: 2010; MIPS32R6O0: # %bb.0: # %entry 2011; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 2012; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2013; MIPS32R6O0-NEXT: addiu $sp, $sp, -16 2014; MIPS32R6O0-NEXT: addu $1, $2, $25 2015; MIPS32R6O0-NEXT: move $2, $5 2016; MIPS32R6O0-NEXT: move $3, $4 2017; MIPS32R6O0-NEXT: sw $5, 12($sp) 2018; MIPS32R6O0-NEXT: lw $5, 12($sp) 2019; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 2020; MIPS32R6O0-NEXT: $BB7_1: # %entry 2021; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2022; MIPS32R6O0-NEXT: ll $6, 0($1) 2023; MIPS32R6O0-NEXT: bnec $6, $4, $BB7_3 2024; MIPS32R6O0-NEXT: # %bb.2: # %entry 2025; MIPS32R6O0-NEXT: # in Loop: Header=BB7_1 Depth=1 2026; MIPS32R6O0-NEXT: move $7, $5 2027; MIPS32R6O0-NEXT: sc $7, 0($1) 2028; MIPS32R6O0-NEXT: beqzc $7, $BB7_1 2029; MIPS32R6O0-NEXT: $BB7_3: # %entry 2030; MIPS32R6O0-NEXT: sw $2, 8($sp) # 4-byte Folded Spill 2031; MIPS32R6O0-NEXT: move $2, $6 2032; MIPS32R6O0-NEXT: sw $3, 4($sp) # 4-byte Folded Spill 2033; MIPS32R6O0-NEXT: addiu $sp, $sp, 16 2034; MIPS32R6O0-NEXT: jrc $ra 2035; 2036; MIPS4-LABEL: AtomicCmpSwap32: 2037; MIPS4: # %bb.0: # %entry 2038; MIPS4-NEXT: daddiu $sp, $sp, -16 2039; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2040; MIPS4-NEXT: daddu $1, $1, $25 2041; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2042; MIPS4-NEXT: sw $5, 12($sp) 2043; MIPS4-NEXT: ld $1, %got_disp(x)($1) 2044; MIPS4-NEXT: .LBB7_1: # %entry 2045; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 2046; MIPS4-NEXT: ll $2, 0($1) 2047; MIPS4-NEXT: bne $2, $4, .LBB7_3 2048; MIPS4-NEXT: nop 2049; MIPS4-NEXT: # %bb.2: # %entry 2050; MIPS4-NEXT: # in Loop: Header=BB7_1 Depth=1 2051; MIPS4-NEXT: move $3, $5 2052; MIPS4-NEXT: sc $3, 0($1) 2053; MIPS4-NEXT: beqz $3, .LBB7_1 2054; MIPS4-NEXT: nop 2055; MIPS4-NEXT: .LBB7_3: # %entry 2056; MIPS4-NEXT: jr $ra 2057; MIPS4-NEXT: daddiu $sp, $sp, 16 2058; 2059; MIPS64-LABEL: AtomicCmpSwap32: 2060; MIPS64: # %bb.0: # %entry 2061; MIPS64-NEXT: daddiu $sp, $sp, -16 2062; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2063; MIPS64-NEXT: daddu $1, $1, $25 2064; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2065; MIPS64-NEXT: sw $5, 12($sp) 2066; MIPS64-NEXT: ld $1, %got_disp(x)($1) 2067; MIPS64-NEXT: .LBB7_1: # %entry 2068; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 2069; MIPS64-NEXT: ll $2, 0($1) 2070; MIPS64-NEXT: bne $2, $4, .LBB7_3 2071; MIPS64-NEXT: nop 2072; MIPS64-NEXT: # %bb.2: # %entry 2073; MIPS64-NEXT: # in Loop: Header=BB7_1 Depth=1 2074; MIPS64-NEXT: move $3, $5 2075; MIPS64-NEXT: sc $3, 0($1) 2076; MIPS64-NEXT: beqz $3, .LBB7_1 2077; MIPS64-NEXT: nop 2078; MIPS64-NEXT: .LBB7_3: # %entry 2079; MIPS64-NEXT: jr $ra 2080; MIPS64-NEXT: daddiu $sp, $sp, 16 2081; 2082; MIPS64R2-LABEL: AtomicCmpSwap32: 2083; MIPS64R2: # %bb.0: # %entry 2084; MIPS64R2-NEXT: daddiu $sp, $sp, -16 2085; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2086; MIPS64R2-NEXT: daddu $1, $1, $25 2087; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2088; MIPS64R2-NEXT: sw $5, 12($sp) 2089; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 2090; MIPS64R2-NEXT: .LBB7_1: # %entry 2091; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 2092; MIPS64R2-NEXT: ll $2, 0($1) 2093; MIPS64R2-NEXT: bne $2, $4, .LBB7_3 2094; MIPS64R2-NEXT: nop 2095; MIPS64R2-NEXT: # %bb.2: # %entry 2096; MIPS64R2-NEXT: # in Loop: Header=BB7_1 Depth=1 2097; MIPS64R2-NEXT: move $3, $5 2098; MIPS64R2-NEXT: sc $3, 0($1) 2099; MIPS64R2-NEXT: beqz $3, .LBB7_1 2100; MIPS64R2-NEXT: nop 2101; MIPS64R2-NEXT: .LBB7_3: # %entry 2102; MIPS64R2-NEXT: jr $ra 2103; MIPS64R2-NEXT: daddiu $sp, $sp, 16 2104; 2105; MIPS64R6-LABEL: AtomicCmpSwap32: 2106; MIPS64R6: # %bb.0: # %entry 2107; MIPS64R6-NEXT: daddiu $sp, $sp, -16 2108; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2109; MIPS64R6-NEXT: daddu $1, $1, $25 2110; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2111; MIPS64R6-NEXT: sw $5, 12($sp) 2112; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 2113; MIPS64R6-NEXT: .LBB7_1: # %entry 2114; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 2115; MIPS64R6-NEXT: ll $2, 0($1) 2116; MIPS64R6-NEXT: bnec $2, $4, .LBB7_3 2117; MIPS64R6-NEXT: # %bb.2: # %entry 2118; MIPS64R6-NEXT: # in Loop: Header=BB7_1 Depth=1 2119; MIPS64R6-NEXT: move $3, $5 2120; MIPS64R6-NEXT: sc $3, 0($1) 2121; MIPS64R6-NEXT: beqzc $3, .LBB7_1 2122; MIPS64R6-NEXT: nop 2123; MIPS64R6-NEXT: .LBB7_3: # %entry 2124; MIPS64R6-NEXT: jr $ra 2125; MIPS64R6-NEXT: daddiu $sp, $sp, 16 2126; 2127; MIPS64R6O0-LABEL: AtomicCmpSwap32: 2128; MIPS64R6O0: # %bb.0: # %entry 2129; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 2130; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2131; MIPS64R6O0-NEXT: daddu $1, $1, $25 2132; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2133; MIPS64R6O0-NEXT: move $2, $4 2134; MIPS64R6O0-NEXT: move $3, $5 2135; MIPS64R6O0-NEXT: sw $3, 12($sp) 2136; MIPS64R6O0-NEXT: lw $3, 12($sp) 2137; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 2138; MIPS64R6O0-NEXT: .LBB7_1: # %entry 2139; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2140; MIPS64R6O0-NEXT: ll $6, 0($1) 2141; MIPS64R6O0-NEXT: bnec $6, $2, .LBB7_3 2142; MIPS64R6O0-NEXT: # %bb.2: # %entry 2143; MIPS64R6O0-NEXT: # in Loop: Header=BB7_1 Depth=1 2144; MIPS64R6O0-NEXT: move $7, $3 2145; MIPS64R6O0-NEXT: sc $7, 0($1) 2146; MIPS64R6O0-NEXT: beqzc $7, .LBB7_1 2147; MIPS64R6O0-NEXT: .LBB7_3: # %entry 2148; MIPS64R6O0-NEXT: move $2, $6 2149; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 2150; MIPS64R6O0-NEXT: jrc $ra 2151; 2152; MM32-LABEL: AtomicCmpSwap32: 2153; MM32: # %bb.0: # %entry 2154; MM32-NEXT: lui $2, %hi(_gp_disp) 2155; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 2156; MM32-NEXT: addiu $sp, $sp, -8 2157; MM32-NEXT: addu $2, $2, $25 2158; MM32-NEXT: sw $5, 4($sp) 2159; MM32-NEXT: lw $1, %got(x)($2) 2160; MM32-NEXT: $BB7_1: # %entry 2161; MM32-NEXT: # =>This Inner Loop Header: Depth=1 2162; MM32-NEXT: ll $2, 0($1) 2163; MM32-NEXT: bne $2, $4, $BB7_3 2164; MM32-NEXT: nop 2165; MM32-NEXT: # %bb.2: # %entry 2166; MM32-NEXT: # in Loop: Header=BB7_1 Depth=1 2167; MM32-NEXT: move $3, $5 2168; MM32-NEXT: sc $3, 0($1) 2169; MM32-NEXT: beqzc $3, $BB7_1 2170; MM32-NEXT: $BB7_3: # %entry 2171; MM32-NEXT: addiusp 8 2172; MM32-NEXT: jrc $ra 2173; 2174; O1-LABEL: AtomicCmpSwap32: 2175; O1: # %bb.0: # %entry 2176; O1-NEXT: lui $2, %hi(_gp_disp) 2177; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 2178; O1-NEXT: addiu $sp, $sp, -8 2179; O1-NEXT: addu $1, $2, $25 2180; O1-NEXT: sw $5, 4($sp) 2181; O1-NEXT: lw $1, %got(x)($1) 2182; O1-NEXT: $BB7_1: # %entry 2183; O1-NEXT: # =>This Inner Loop Header: Depth=1 2184; O1-NEXT: ll $2, 0($1) 2185; O1-NEXT: bne $2, $4, $BB7_3 2186; O1-NEXT: nop 2187; O1-NEXT: # %bb.2: # %entry 2188; O1-NEXT: # in Loop: Header=BB7_1 Depth=1 2189; O1-NEXT: move $3, $5 2190; O1-NEXT: sc $3, 0($1) 2191; O1-NEXT: beqz $3, $BB7_1 2192; O1-NEXT: nop 2193; O1-NEXT: $BB7_3: # %entry 2194; O1-NEXT: jr $ra 2195; O1-NEXT: addiu $sp, $sp, 8 2196; 2197; O2-LABEL: AtomicCmpSwap32: 2198; O2: # %bb.0: # %entry 2199; O2-NEXT: lui $2, %hi(_gp_disp) 2200; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 2201; O2-NEXT: addiu $sp, $sp, -8 2202; O2-NEXT: addu $1, $2, $25 2203; O2-NEXT: sw $5, 4($sp) 2204; O2-NEXT: lw $1, %got(x)($1) 2205; O2-NEXT: $BB7_1: # %entry 2206; O2-NEXT: # =>This Inner Loop Header: Depth=1 2207; O2-NEXT: ll $2, 0($1) 2208; O2-NEXT: bne $2, $4, $BB7_3 2209; O2-NEXT: nop 2210; O2-NEXT: # %bb.2: # %entry 2211; O2-NEXT: # in Loop: Header=BB7_1 Depth=1 2212; O2-NEXT: move $3, $5 2213; O2-NEXT: sc $3, 0($1) 2214; O2-NEXT: beqz $3, $BB7_1 2215; O2-NEXT: nop 2216; O2-NEXT: $BB7_3: # %entry 2217; O2-NEXT: jr $ra 2218; O2-NEXT: addiu $sp, $sp, 8 2219; 2220; O3-LABEL: AtomicCmpSwap32: 2221; O3: # %bb.0: # %entry 2222; O3-NEXT: lui $2, %hi(_gp_disp) 2223; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 2224; O3-NEXT: addiu $sp, $sp, -8 2225; O3-NEXT: addu $1, $2, $25 2226; O3-NEXT: sw $5, 4($sp) 2227; O3-NEXT: lw $1, %got(x)($1) 2228; O3-NEXT: $BB7_1: # %entry 2229; O3-NEXT: # =>This Inner Loop Header: Depth=1 2230; O3-NEXT: ll $2, 0($1) 2231; O3-NEXT: bne $2, $4, $BB7_3 2232; O3-NEXT: nop 2233; O3-NEXT: # %bb.2: # %entry 2234; O3-NEXT: # in Loop: Header=BB7_1 Depth=1 2235; O3-NEXT: move $3, $5 2236; O3-NEXT: sc $3, 0($1) 2237; O3-NEXT: beqz $3, $BB7_1 2238; O3-NEXT: nop 2239; O3-NEXT: $BB7_3: # %entry 2240; O3-NEXT: jr $ra 2241; O3-NEXT: addiu $sp, $sp, 8 2242; 2243; MIPS32EB-LABEL: AtomicCmpSwap32: 2244; MIPS32EB: # %bb.0: # %entry 2245; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 2246; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 2247; MIPS32EB-NEXT: addiu $sp, $sp, -8 2248; MIPS32EB-NEXT: addu $1, $2, $25 2249; MIPS32EB-NEXT: sw $5, 4($sp) 2250; MIPS32EB-NEXT: lw $1, %got(x)($1) 2251; MIPS32EB-NEXT: $BB7_1: # %entry 2252; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 2253; MIPS32EB-NEXT: ll $2, 0($1) 2254; MIPS32EB-NEXT: bne $2, $4, $BB7_3 2255; MIPS32EB-NEXT: nop 2256; MIPS32EB-NEXT: # %bb.2: # %entry 2257; MIPS32EB-NEXT: # in Loop: Header=BB7_1 Depth=1 2258; MIPS32EB-NEXT: move $3, $5 2259; MIPS32EB-NEXT: sc $3, 0($1) 2260; MIPS32EB-NEXT: beqz $3, $BB7_1 2261; MIPS32EB-NEXT: nop 2262; MIPS32EB-NEXT: $BB7_3: # %entry 2263; MIPS32EB-NEXT: jr $ra 2264; MIPS32EB-NEXT: addiu $sp, $sp, 8 2265entry: 2266 %newval.addr = alloca i32, align 4 2267 store i32 %newval, i32* %newval.addr, align 4 2268 %tmp = load i32, i32* %newval.addr, align 4 2269 %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic monotonic 2270 %1 = extractvalue { i32, i1 } %0, 0 2271 ret i32 %1 2272 2273} 2274 2275@y = common global i8 0, align 1 2276 2277define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind { 2278; MIPS32-LABEL: AtomicLoadAdd8: 2279; MIPS32: # %bb.0: # %entry 2280; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2281; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2282; MIPS32-NEXT: addu $1, $2, $25 2283; MIPS32-NEXT: lw $1, %got(y)($1) 2284; MIPS32-NEXT: addiu $2, $zero, -4 2285; MIPS32-NEXT: and $2, $1, $2 2286; MIPS32-NEXT: andi $1, $1, 3 2287; MIPS32-NEXT: sll $3, $1, 3 2288; MIPS32-NEXT: ori $1, $zero, 255 2289; MIPS32-NEXT: sllv $5, $1, $3 2290; MIPS32-NEXT: nor $6, $zero, $5 2291; MIPS32-NEXT: sllv $4, $4, $3 2292; MIPS32-NEXT: $BB8_1: # %entry 2293; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 2294; MIPS32-NEXT: ll $7, 0($2) 2295; MIPS32-NEXT: addu $8, $7, $4 2296; MIPS32-NEXT: and $8, $8, $5 2297; MIPS32-NEXT: and $9, $7, $6 2298; MIPS32-NEXT: or $9, $9, $8 2299; MIPS32-NEXT: sc $9, 0($2) 2300; MIPS32-NEXT: beqz $9, $BB8_1 2301; MIPS32-NEXT: nop 2302; MIPS32-NEXT: # %bb.2: # %entry 2303; MIPS32-NEXT: and $1, $7, $5 2304; MIPS32-NEXT: srlv $1, $1, $3 2305; MIPS32-NEXT: sll $1, $1, 24 2306; MIPS32-NEXT: sra $1, $1, 24 2307; MIPS32-NEXT: # %bb.3: # %entry 2308; MIPS32-NEXT: sll $1, $1, 24 2309; MIPS32-NEXT: jr $ra 2310; MIPS32-NEXT: sra $2, $1, 24 2311; 2312; MIPS32O0-LABEL: AtomicLoadAdd8: 2313; MIPS32O0: # %bb.0: # %entry 2314; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 2315; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2316; MIPS32O0-NEXT: addiu $sp, $sp, -8 2317; MIPS32O0-NEXT: addu $1, $2, $25 2318; MIPS32O0-NEXT: lw $1, %got(y)($1) 2319; MIPS32O0-NEXT: addiu $2, $zero, -4 2320; MIPS32O0-NEXT: and $2, $1, $2 2321; MIPS32O0-NEXT: andi $1, $1, 3 2322; MIPS32O0-NEXT: sll $1, $1, 3 2323; MIPS32O0-NEXT: ori $3, $zero, 255 2324; MIPS32O0-NEXT: sllv $3, $3, $1 2325; MIPS32O0-NEXT: nor $5, $zero, $3 2326; MIPS32O0-NEXT: sllv $4, $4, $1 2327; MIPS32O0-NEXT: $BB8_1: # %entry 2328; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 2329; MIPS32O0-NEXT: ll $7, 0($2) 2330; MIPS32O0-NEXT: addu $8, $7, $4 2331; MIPS32O0-NEXT: and $8, $8, $3 2332; MIPS32O0-NEXT: and $9, $7, $5 2333; MIPS32O0-NEXT: or $9, $9, $8 2334; MIPS32O0-NEXT: sc $9, 0($2) 2335; MIPS32O0-NEXT: beqz $9, $BB8_1 2336; MIPS32O0-NEXT: nop 2337; MIPS32O0-NEXT: # %bb.2: # %entry 2338; MIPS32O0-NEXT: and $6, $7, $3 2339; MIPS32O0-NEXT: srlv $6, $6, $1 2340; MIPS32O0-NEXT: sll $6, $6, 24 2341; MIPS32O0-NEXT: sra $6, $6, 24 2342; MIPS32O0-NEXT: # %bb.3: # %entry 2343; MIPS32O0-NEXT: sw $6, 4($sp) # 4-byte Folded Spill 2344; MIPS32O0-NEXT: # %bb.4: # %entry 2345; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 2346; MIPS32O0-NEXT: sll $2, $1, 24 2347; MIPS32O0-NEXT: sra $2, $2, 24 2348; MIPS32O0-NEXT: addiu $sp, $sp, 8 2349; MIPS32O0-NEXT: jr $ra 2350; MIPS32O0-NEXT: nop 2351; 2352; MIPS32R2-LABEL: AtomicLoadAdd8: 2353; MIPS32R2: # %bb.0: # %entry 2354; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 2355; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 2356; MIPS32R2-NEXT: addu $1, $2, $25 2357; MIPS32R2-NEXT: lw $1, %got(y)($1) 2358; MIPS32R2-NEXT: addiu $2, $zero, -4 2359; MIPS32R2-NEXT: and $2, $1, $2 2360; MIPS32R2-NEXT: andi $1, $1, 3 2361; MIPS32R2-NEXT: sll $3, $1, 3 2362; MIPS32R2-NEXT: ori $1, $zero, 255 2363; MIPS32R2-NEXT: sllv $5, $1, $3 2364; MIPS32R2-NEXT: nor $6, $zero, $5 2365; MIPS32R2-NEXT: sllv $4, $4, $3 2366; MIPS32R2-NEXT: $BB8_1: # %entry 2367; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 2368; MIPS32R2-NEXT: ll $7, 0($2) 2369; MIPS32R2-NEXT: addu $8, $7, $4 2370; MIPS32R2-NEXT: and $8, $8, $5 2371; MIPS32R2-NEXT: and $9, $7, $6 2372; MIPS32R2-NEXT: or $9, $9, $8 2373; MIPS32R2-NEXT: sc $9, 0($2) 2374; MIPS32R2-NEXT: beqz $9, $BB8_1 2375; MIPS32R2-NEXT: nop 2376; MIPS32R2-NEXT: # %bb.2: # %entry 2377; MIPS32R2-NEXT: and $1, $7, $5 2378; MIPS32R2-NEXT: srlv $1, $1, $3 2379; MIPS32R2-NEXT: seb $1, $1 2380; MIPS32R2-NEXT: # %bb.3: # %entry 2381; MIPS32R2-NEXT: jr $ra 2382; MIPS32R2-NEXT: seb $2, $1 2383; 2384; MIPS32R6-LABEL: AtomicLoadAdd8: 2385; MIPS32R6: # %bb.0: # %entry 2386; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 2387; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 2388; MIPS32R6-NEXT: addu $1, $2, $25 2389; MIPS32R6-NEXT: lw $1, %got(y)($1) 2390; MIPS32R6-NEXT: addiu $2, $zero, -4 2391; MIPS32R6-NEXT: and $2, $1, $2 2392; MIPS32R6-NEXT: andi $1, $1, 3 2393; MIPS32R6-NEXT: sll $3, $1, 3 2394; MIPS32R6-NEXT: ori $1, $zero, 255 2395; MIPS32R6-NEXT: sllv $5, $1, $3 2396; MIPS32R6-NEXT: nor $6, $zero, $5 2397; MIPS32R6-NEXT: sllv $4, $4, $3 2398; MIPS32R6-NEXT: $BB8_1: # %entry 2399; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 2400; MIPS32R6-NEXT: ll $7, 0($2) 2401; MIPS32R6-NEXT: addu $8, $7, $4 2402; MIPS32R6-NEXT: and $8, $8, $5 2403; MIPS32R6-NEXT: and $9, $7, $6 2404; MIPS32R6-NEXT: or $9, $9, $8 2405; MIPS32R6-NEXT: sc $9, 0($2) 2406; MIPS32R6-NEXT: beqzc $9, $BB8_1 2407; MIPS32R6-NEXT: # %bb.2: # %entry 2408; MIPS32R6-NEXT: and $1, $7, $5 2409; MIPS32R6-NEXT: srlv $1, $1, $3 2410; MIPS32R6-NEXT: seb $1, $1 2411; MIPS32R6-NEXT: # %bb.3: # %entry 2412; MIPS32R6-NEXT: jr $ra 2413; MIPS32R6-NEXT: seb $2, $1 2414; 2415; MIPS32R6O0-LABEL: AtomicLoadAdd8: 2416; MIPS32R6O0: # %bb.0: # %entry 2417; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 2418; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2419; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 2420; MIPS32R6O0-NEXT: addu $1, $2, $25 2421; MIPS32R6O0-NEXT: move $2, $4 2422; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 2423; MIPS32R6O0-NEXT: addiu $3, $zero, -4 2424; MIPS32R6O0-NEXT: and $3, $1, $3 2425; MIPS32R6O0-NEXT: andi $1, $1, 3 2426; MIPS32R6O0-NEXT: sll $1, $1, 3 2427; MIPS32R6O0-NEXT: ori $5, $zero, 255 2428; MIPS32R6O0-NEXT: sllv $5, $5, $1 2429; MIPS32R6O0-NEXT: nor $6, $zero, $5 2430; MIPS32R6O0-NEXT: sllv $4, $4, $1 2431; MIPS32R6O0-NEXT: $BB8_1: # %entry 2432; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2433; MIPS32R6O0-NEXT: ll $8, 0($3) 2434; MIPS32R6O0-NEXT: addu $9, $8, $4 2435; MIPS32R6O0-NEXT: and $9, $9, $5 2436; MIPS32R6O0-NEXT: and $10, $8, $6 2437; MIPS32R6O0-NEXT: or $10, $10, $9 2438; MIPS32R6O0-NEXT: sc $10, 0($3) 2439; MIPS32R6O0-NEXT: beqzc $10, $BB8_1 2440; MIPS32R6O0-NEXT: # %bb.2: # %entry 2441; MIPS32R6O0-NEXT: and $7, $8, $5 2442; MIPS32R6O0-NEXT: srlv $7, $7, $1 2443; MIPS32R6O0-NEXT: seb $7, $7 2444; MIPS32R6O0-NEXT: # %bb.3: # %entry 2445; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 2446; MIPS32R6O0-NEXT: sw $7, 0($sp) # 4-byte Folded Spill 2447; MIPS32R6O0-NEXT: # %bb.4: # %entry 2448; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 2449; MIPS32R6O0-NEXT: seb $2, $1 2450; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 2451; MIPS32R6O0-NEXT: jrc $ra 2452; 2453; MIPS4-LABEL: AtomicLoadAdd8: 2454; MIPS4: # %bb.0: # %entry 2455; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2456; MIPS4-NEXT: daddu $1, $1, $25 2457; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2458; MIPS4-NEXT: ld $1, %got_disp(y)($1) 2459; MIPS4-NEXT: daddiu $2, $zero, -4 2460; MIPS4-NEXT: and $2, $1, $2 2461; MIPS4-NEXT: andi $1, $1, 3 2462; MIPS4-NEXT: sll $3, $1, 3 2463; MIPS4-NEXT: ori $1, $zero, 255 2464; MIPS4-NEXT: sllv $5, $1, $3 2465; MIPS4-NEXT: nor $6, $zero, $5 2466; MIPS4-NEXT: sllv $4, $4, $3 2467; MIPS4-NEXT: .LBB8_1: # %entry 2468; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 2469; MIPS4-NEXT: ll $7, 0($2) 2470; MIPS4-NEXT: addu $8, $7, $4 2471; MIPS4-NEXT: and $8, $8, $5 2472; MIPS4-NEXT: and $9, $7, $6 2473; MIPS4-NEXT: or $9, $9, $8 2474; MIPS4-NEXT: sc $9, 0($2) 2475; MIPS4-NEXT: beqz $9, .LBB8_1 2476; MIPS4-NEXT: nop 2477; MIPS4-NEXT: # %bb.2: # %entry 2478; MIPS4-NEXT: and $1, $7, $5 2479; MIPS4-NEXT: srlv $1, $1, $3 2480; MIPS4-NEXT: sll $1, $1, 24 2481; MIPS4-NEXT: sra $1, $1, 24 2482; MIPS4-NEXT: # %bb.3: # %entry 2483; MIPS4-NEXT: sll $1, $1, 24 2484; MIPS4-NEXT: jr $ra 2485; MIPS4-NEXT: sra $2, $1, 24 2486; 2487; MIPS64-LABEL: AtomicLoadAdd8: 2488; MIPS64: # %bb.0: # %entry 2489; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2490; MIPS64-NEXT: daddu $1, $1, $25 2491; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2492; MIPS64-NEXT: ld $1, %got_disp(y)($1) 2493; MIPS64-NEXT: daddiu $2, $zero, -4 2494; MIPS64-NEXT: and $2, $1, $2 2495; MIPS64-NEXT: andi $1, $1, 3 2496; MIPS64-NEXT: sll $3, $1, 3 2497; MIPS64-NEXT: ori $1, $zero, 255 2498; MIPS64-NEXT: sllv $5, $1, $3 2499; MIPS64-NEXT: nor $6, $zero, $5 2500; MIPS64-NEXT: sllv $4, $4, $3 2501; MIPS64-NEXT: .LBB8_1: # %entry 2502; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 2503; MIPS64-NEXT: ll $7, 0($2) 2504; MIPS64-NEXT: addu $8, $7, $4 2505; MIPS64-NEXT: and $8, $8, $5 2506; MIPS64-NEXT: and $9, $7, $6 2507; MIPS64-NEXT: or $9, $9, $8 2508; MIPS64-NEXT: sc $9, 0($2) 2509; MIPS64-NEXT: beqz $9, .LBB8_1 2510; MIPS64-NEXT: nop 2511; MIPS64-NEXT: # %bb.2: # %entry 2512; MIPS64-NEXT: and $1, $7, $5 2513; MIPS64-NEXT: srlv $1, $1, $3 2514; MIPS64-NEXT: sll $1, $1, 24 2515; MIPS64-NEXT: sra $1, $1, 24 2516; MIPS64-NEXT: # %bb.3: # %entry 2517; MIPS64-NEXT: sll $1, $1, 24 2518; MIPS64-NEXT: jr $ra 2519; MIPS64-NEXT: sra $2, $1, 24 2520; 2521; MIPS64R2-LABEL: AtomicLoadAdd8: 2522; MIPS64R2: # %bb.0: # %entry 2523; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2524; MIPS64R2-NEXT: daddu $1, $1, $25 2525; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2526; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 2527; MIPS64R2-NEXT: daddiu $2, $zero, -4 2528; MIPS64R2-NEXT: and $2, $1, $2 2529; MIPS64R2-NEXT: andi $1, $1, 3 2530; MIPS64R2-NEXT: sll $3, $1, 3 2531; MIPS64R2-NEXT: ori $1, $zero, 255 2532; MIPS64R2-NEXT: sllv $5, $1, $3 2533; MIPS64R2-NEXT: nor $6, $zero, $5 2534; MIPS64R2-NEXT: sllv $4, $4, $3 2535; MIPS64R2-NEXT: .LBB8_1: # %entry 2536; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 2537; MIPS64R2-NEXT: ll $7, 0($2) 2538; MIPS64R2-NEXT: addu $8, $7, $4 2539; MIPS64R2-NEXT: and $8, $8, $5 2540; MIPS64R2-NEXT: and $9, $7, $6 2541; MIPS64R2-NEXT: or $9, $9, $8 2542; MIPS64R2-NEXT: sc $9, 0($2) 2543; MIPS64R2-NEXT: beqz $9, .LBB8_1 2544; MIPS64R2-NEXT: nop 2545; MIPS64R2-NEXT: # %bb.2: # %entry 2546; MIPS64R2-NEXT: and $1, $7, $5 2547; MIPS64R2-NEXT: srlv $1, $1, $3 2548; MIPS64R2-NEXT: seb $1, $1 2549; MIPS64R2-NEXT: # %bb.3: # %entry 2550; MIPS64R2-NEXT: jr $ra 2551; MIPS64R2-NEXT: seb $2, $1 2552; 2553; MIPS64R6-LABEL: AtomicLoadAdd8: 2554; MIPS64R6: # %bb.0: # %entry 2555; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2556; MIPS64R6-NEXT: daddu $1, $1, $25 2557; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2558; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 2559; MIPS64R6-NEXT: daddiu $2, $zero, -4 2560; MIPS64R6-NEXT: and $2, $1, $2 2561; MIPS64R6-NEXT: andi $1, $1, 3 2562; MIPS64R6-NEXT: sll $3, $1, 3 2563; MIPS64R6-NEXT: ori $1, $zero, 255 2564; MIPS64R6-NEXT: sllv $5, $1, $3 2565; MIPS64R6-NEXT: nor $6, $zero, $5 2566; MIPS64R6-NEXT: sllv $4, $4, $3 2567; MIPS64R6-NEXT: .LBB8_1: # %entry 2568; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 2569; MIPS64R6-NEXT: ll $7, 0($2) 2570; MIPS64R6-NEXT: addu $8, $7, $4 2571; MIPS64R6-NEXT: and $8, $8, $5 2572; MIPS64R6-NEXT: and $9, $7, $6 2573; MIPS64R6-NEXT: or $9, $9, $8 2574; MIPS64R6-NEXT: sc $9, 0($2) 2575; MIPS64R6-NEXT: beqzc $9, .LBB8_1 2576; MIPS64R6-NEXT: # %bb.2: # %entry 2577; MIPS64R6-NEXT: and $1, $7, $5 2578; MIPS64R6-NEXT: srlv $1, $1, $3 2579; MIPS64R6-NEXT: seb $1, $1 2580; MIPS64R6-NEXT: # %bb.3: # %entry 2581; MIPS64R6-NEXT: jr $ra 2582; MIPS64R6-NEXT: seb $2, $1 2583; 2584; MIPS64R6O0-LABEL: AtomicLoadAdd8: 2585; MIPS64R6O0: # %bb.0: # %entry 2586; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 2587; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2588; MIPS64R6O0-NEXT: daddu $1, $1, $25 2589; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2590; MIPS64R6O0-NEXT: move $2, $4 2591; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 2592; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 2593; MIPS64R6O0-NEXT: and $3, $1, $3 2594; MIPS64R6O0-NEXT: andi $5, $1, 3 2595; MIPS64R6O0-NEXT: xori $5, $5, 3 2596; MIPS64R6O0-NEXT: sll $5, $5, 3 2597; MIPS64R6O0-NEXT: ori $6, $zero, 255 2598; MIPS64R6O0-NEXT: sllv $6, $6, $5 2599; MIPS64R6O0-NEXT: nor $7, $zero, $6 2600; MIPS64R6O0-NEXT: sllv $2, $2, $5 2601; MIPS64R6O0-NEXT: .LBB8_1: # %entry 2602; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2603; MIPS64R6O0-NEXT: ll $9, 0($3) 2604; MIPS64R6O0-NEXT: addu $10, $9, $2 2605; MIPS64R6O0-NEXT: and $10, $10, $6 2606; MIPS64R6O0-NEXT: and $11, $9, $7 2607; MIPS64R6O0-NEXT: or $11, $11, $10 2608; MIPS64R6O0-NEXT: sc $11, 0($3) 2609; MIPS64R6O0-NEXT: beqzc $11, .LBB8_1 2610; MIPS64R6O0-NEXT: # %bb.2: # %entry 2611; MIPS64R6O0-NEXT: and $8, $9, $6 2612; MIPS64R6O0-NEXT: srlv $8, $8, $5 2613; MIPS64R6O0-NEXT: seb $8, $8 2614; MIPS64R6O0-NEXT: # %bb.3: # %entry 2615; MIPS64R6O0-NEXT: sw $8, 12($sp) # 4-byte Folded Spill 2616; MIPS64R6O0-NEXT: # %bb.4: # %entry 2617; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 2618; MIPS64R6O0-NEXT: seb $2, $1 2619; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 2620; MIPS64R6O0-NEXT: jrc $ra 2621; 2622; MM32-LABEL: AtomicLoadAdd8: 2623; MM32: # %bb.0: # %entry 2624; MM32-NEXT: lui $2, %hi(_gp_disp) 2625; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 2626; MM32-NEXT: addu $2, $2, $25 2627; MM32-NEXT: lw $1, %got(y)($2) 2628; MM32-NEXT: addiu $2, $zero, -4 2629; MM32-NEXT: and $2, $1, $2 2630; MM32-NEXT: andi $1, $1, 3 2631; MM32-NEXT: sll $3, $1, 3 2632; MM32-NEXT: ori $1, $zero, 255 2633; MM32-NEXT: sllv $5, $1, $3 2634; MM32-NEXT: nor $6, $zero, $5 2635; MM32-NEXT: sllv $4, $4, $3 2636; MM32-NEXT: $BB8_1: # %entry 2637; MM32-NEXT: # =>This Inner Loop Header: Depth=1 2638; MM32-NEXT: ll $7, 0($2) 2639; MM32-NEXT: addu $8, $7, $4 2640; MM32-NEXT: and $8, $8, $5 2641; MM32-NEXT: and $9, $7, $6 2642; MM32-NEXT: or $9, $9, $8 2643; MM32-NEXT: sc $9, 0($2) 2644; MM32-NEXT: beqzc $9, $BB8_1 2645; MM32-NEXT: # %bb.2: # %entry 2646; MM32-NEXT: and $1, $7, $5 2647; MM32-NEXT: srlv $1, $1, $3 2648; MM32-NEXT: seb $1, $1 2649; MM32-NEXT: # %bb.3: # %entry 2650; MM32-NEXT: jr $ra 2651; MM32-NEXT: seb $2, $1 2652; 2653; O1-LABEL: AtomicLoadAdd8: 2654; O1: # %bb.0: # %entry 2655; O1-NEXT: lui $2, %hi(_gp_disp) 2656; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 2657; O1-NEXT: addu $1, $2, $25 2658; O1-NEXT: lw $1, %got(y)($1) 2659; O1-NEXT: addiu $2, $zero, -4 2660; O1-NEXT: and $2, $1, $2 2661; O1-NEXT: andi $1, $1, 3 2662; O1-NEXT: sll $3, $1, 3 2663; O1-NEXT: ori $1, $zero, 255 2664; O1-NEXT: sllv $5, $1, $3 2665; O1-NEXT: nor $6, $zero, $5 2666; O1-NEXT: sllv $4, $4, $3 2667; O1-NEXT: $BB8_1: # %entry 2668; O1-NEXT: # =>This Inner Loop Header: Depth=1 2669; O1-NEXT: ll $7, 0($2) 2670; O1-NEXT: addu $8, $7, $4 2671; O1-NEXT: and $8, $8, $5 2672; O1-NEXT: and $9, $7, $6 2673; O1-NEXT: or $9, $9, $8 2674; O1-NEXT: sc $9, 0($2) 2675; O1-NEXT: beqz $9, $BB8_1 2676; O1-NEXT: nop 2677; O1-NEXT: # %bb.2: # %entry 2678; O1-NEXT: and $1, $7, $5 2679; O1-NEXT: srlv $1, $1, $3 2680; O1-NEXT: sll $1, $1, 24 2681; O1-NEXT: sra $1, $1, 24 2682; O1-NEXT: # %bb.3: # %entry 2683; O1-NEXT: sll $1, $1, 24 2684; O1-NEXT: jr $ra 2685; O1-NEXT: sra $2, $1, 24 2686; 2687; O2-LABEL: AtomicLoadAdd8: 2688; O2: # %bb.0: # %entry 2689; O2-NEXT: lui $2, %hi(_gp_disp) 2690; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 2691; O2-NEXT: addu $1, $2, $25 2692; O2-NEXT: lw $1, %got(y)($1) 2693; O2-NEXT: addiu $2, $zero, -4 2694; O2-NEXT: and $2, $1, $2 2695; O2-NEXT: andi $1, $1, 3 2696; O2-NEXT: sll $3, $1, 3 2697; O2-NEXT: ori $1, $zero, 255 2698; O2-NEXT: sllv $5, $1, $3 2699; O2-NEXT: nor $6, $zero, $5 2700; O2-NEXT: sllv $4, $4, $3 2701; O2-NEXT: $BB8_1: # %entry 2702; O2-NEXT: # =>This Inner Loop Header: Depth=1 2703; O2-NEXT: ll $7, 0($2) 2704; O2-NEXT: addu $8, $7, $4 2705; O2-NEXT: and $8, $8, $5 2706; O2-NEXT: and $9, $7, $6 2707; O2-NEXT: or $9, $9, $8 2708; O2-NEXT: sc $9, 0($2) 2709; O2-NEXT: beqz $9, $BB8_1 2710; O2-NEXT: nop 2711; O2-NEXT: # %bb.2: # %entry 2712; O2-NEXT: and $1, $7, $5 2713; O2-NEXT: srlv $1, $1, $3 2714; O2-NEXT: sll $1, $1, 24 2715; O2-NEXT: sra $1, $1, 24 2716; O2-NEXT: # %bb.3: # %entry 2717; O2-NEXT: sll $1, $1, 24 2718; O2-NEXT: jr $ra 2719; O2-NEXT: sra $2, $1, 24 2720; 2721; O3-LABEL: AtomicLoadAdd8: 2722; O3: # %bb.0: # %entry 2723; O3-NEXT: lui $2, %hi(_gp_disp) 2724; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 2725; O3-NEXT: addu $1, $2, $25 2726; O3-NEXT: addiu $2, $zero, -4 2727; O3-NEXT: lw $1, %got(y)($1) 2728; O3-NEXT: and $2, $1, $2 2729; O3-NEXT: andi $1, $1, 3 2730; O3-NEXT: sll $3, $1, 3 2731; O3-NEXT: ori $1, $zero, 255 2732; O3-NEXT: sllv $5, $1, $3 2733; O3-NEXT: sllv $4, $4, $3 2734; O3-NEXT: nor $6, $zero, $5 2735; O3-NEXT: $BB8_1: # %entry 2736; O3-NEXT: # =>This Inner Loop Header: Depth=1 2737; O3-NEXT: ll $7, 0($2) 2738; O3-NEXT: addu $8, $7, $4 2739; O3-NEXT: and $8, $8, $5 2740; O3-NEXT: and $9, $7, $6 2741; O3-NEXT: or $9, $9, $8 2742; O3-NEXT: sc $9, 0($2) 2743; O3-NEXT: beqz $9, $BB8_1 2744; O3-NEXT: nop 2745; O3-NEXT: # %bb.2: # %entry 2746; O3-NEXT: and $1, $7, $5 2747; O3-NEXT: srlv $1, $1, $3 2748; O3-NEXT: sll $1, $1, 24 2749; O3-NEXT: sra $1, $1, 24 2750; O3-NEXT: # %bb.3: # %entry 2751; O3-NEXT: sll $1, $1, 24 2752; O3-NEXT: jr $ra 2753; O3-NEXT: sra $2, $1, 24 2754; 2755; MIPS32EB-LABEL: AtomicLoadAdd8: 2756; MIPS32EB: # %bb.0: # %entry 2757; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 2758; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 2759; MIPS32EB-NEXT: addu $1, $2, $25 2760; MIPS32EB-NEXT: lw $1, %got(y)($1) 2761; MIPS32EB-NEXT: addiu $2, $zero, -4 2762; MIPS32EB-NEXT: and $2, $1, $2 2763; MIPS32EB-NEXT: andi $1, $1, 3 2764; MIPS32EB-NEXT: xori $1, $1, 3 2765; MIPS32EB-NEXT: sll $3, $1, 3 2766; MIPS32EB-NEXT: ori $1, $zero, 255 2767; MIPS32EB-NEXT: sllv $5, $1, $3 2768; MIPS32EB-NEXT: nor $6, $zero, $5 2769; MIPS32EB-NEXT: sllv $4, $4, $3 2770; MIPS32EB-NEXT: $BB8_1: # %entry 2771; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 2772; MIPS32EB-NEXT: ll $7, 0($2) 2773; MIPS32EB-NEXT: addu $8, $7, $4 2774; MIPS32EB-NEXT: and $8, $8, $5 2775; MIPS32EB-NEXT: and $9, $7, $6 2776; MIPS32EB-NEXT: or $9, $9, $8 2777; MIPS32EB-NEXT: sc $9, 0($2) 2778; MIPS32EB-NEXT: beqz $9, $BB8_1 2779; MIPS32EB-NEXT: nop 2780; MIPS32EB-NEXT: # %bb.2: # %entry 2781; MIPS32EB-NEXT: and $1, $7, $5 2782; MIPS32EB-NEXT: srlv $1, $1, $3 2783; MIPS32EB-NEXT: sll $1, $1, 24 2784; MIPS32EB-NEXT: sra $1, $1, 24 2785; MIPS32EB-NEXT: # %bb.3: # %entry 2786; MIPS32EB-NEXT: sll $1, $1, 24 2787; MIPS32EB-NEXT: jr $ra 2788; MIPS32EB-NEXT: sra $2, $1, 24 2789entry: 2790 %0 = atomicrmw add i8* @y, i8 %incr monotonic 2791 ret i8 %0 2792} 2793 2794define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind { 2795; MIPS32-LABEL: AtomicLoadSub8: 2796; MIPS32: # %bb.0: # %entry 2797; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2798; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2799; MIPS32-NEXT: addu $1, $2, $25 2800; MIPS32-NEXT: lw $1, %got(y)($1) 2801; MIPS32-NEXT: addiu $2, $zero, -4 2802; MIPS32-NEXT: and $2, $1, $2 2803; MIPS32-NEXT: andi $1, $1, 3 2804; MIPS32-NEXT: sll $3, $1, 3 2805; MIPS32-NEXT: ori $1, $zero, 255 2806; MIPS32-NEXT: sllv $5, $1, $3 2807; MIPS32-NEXT: nor $6, $zero, $5 2808; MIPS32-NEXT: sllv $4, $4, $3 2809; MIPS32-NEXT: $BB9_1: # %entry 2810; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 2811; MIPS32-NEXT: ll $7, 0($2) 2812; MIPS32-NEXT: subu $8, $7, $4 2813; MIPS32-NEXT: and $8, $8, $5 2814; MIPS32-NEXT: and $9, $7, $6 2815; MIPS32-NEXT: or $9, $9, $8 2816; MIPS32-NEXT: sc $9, 0($2) 2817; MIPS32-NEXT: beqz $9, $BB9_1 2818; MIPS32-NEXT: nop 2819; MIPS32-NEXT: # %bb.2: # %entry 2820; MIPS32-NEXT: and $1, $7, $5 2821; MIPS32-NEXT: srlv $1, $1, $3 2822; MIPS32-NEXT: sll $1, $1, 24 2823; MIPS32-NEXT: sra $1, $1, 24 2824; MIPS32-NEXT: # %bb.3: # %entry 2825; MIPS32-NEXT: sll $1, $1, 24 2826; MIPS32-NEXT: jr $ra 2827; MIPS32-NEXT: sra $2, $1, 24 2828; 2829; MIPS32O0-LABEL: AtomicLoadSub8: 2830; MIPS32O0: # %bb.0: # %entry 2831; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 2832; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2833; MIPS32O0-NEXT: addiu $sp, $sp, -8 2834; MIPS32O0-NEXT: addu $1, $2, $25 2835; MIPS32O0-NEXT: lw $1, %got(y)($1) 2836; MIPS32O0-NEXT: addiu $2, $zero, -4 2837; MIPS32O0-NEXT: and $2, $1, $2 2838; MIPS32O0-NEXT: andi $1, $1, 3 2839; MIPS32O0-NEXT: sll $1, $1, 3 2840; MIPS32O0-NEXT: ori $3, $zero, 255 2841; MIPS32O0-NEXT: sllv $3, $3, $1 2842; MIPS32O0-NEXT: nor $5, $zero, $3 2843; MIPS32O0-NEXT: sllv $4, $4, $1 2844; MIPS32O0-NEXT: $BB9_1: # %entry 2845; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 2846; MIPS32O0-NEXT: ll $7, 0($2) 2847; MIPS32O0-NEXT: subu $8, $7, $4 2848; MIPS32O0-NEXT: and $8, $8, $3 2849; MIPS32O0-NEXT: and $9, $7, $5 2850; MIPS32O0-NEXT: or $9, $9, $8 2851; MIPS32O0-NEXT: sc $9, 0($2) 2852; MIPS32O0-NEXT: beqz $9, $BB9_1 2853; MIPS32O0-NEXT: nop 2854; MIPS32O0-NEXT: # %bb.2: # %entry 2855; MIPS32O0-NEXT: and $6, $7, $3 2856; MIPS32O0-NEXT: srlv $6, $6, $1 2857; MIPS32O0-NEXT: sll $6, $6, 24 2858; MIPS32O0-NEXT: sra $6, $6, 24 2859; MIPS32O0-NEXT: # %bb.3: # %entry 2860; MIPS32O0-NEXT: sw $6, 4($sp) # 4-byte Folded Spill 2861; MIPS32O0-NEXT: # %bb.4: # %entry 2862; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 2863; MIPS32O0-NEXT: sll $2, $1, 24 2864; MIPS32O0-NEXT: sra $2, $2, 24 2865; MIPS32O0-NEXT: addiu $sp, $sp, 8 2866; MIPS32O0-NEXT: jr $ra 2867; MIPS32O0-NEXT: nop 2868; 2869; MIPS32R2-LABEL: AtomicLoadSub8: 2870; MIPS32R2: # %bb.0: # %entry 2871; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 2872; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 2873; MIPS32R2-NEXT: addu $1, $2, $25 2874; MIPS32R2-NEXT: lw $1, %got(y)($1) 2875; MIPS32R2-NEXT: addiu $2, $zero, -4 2876; MIPS32R2-NEXT: and $2, $1, $2 2877; MIPS32R2-NEXT: andi $1, $1, 3 2878; MIPS32R2-NEXT: sll $3, $1, 3 2879; MIPS32R2-NEXT: ori $1, $zero, 255 2880; MIPS32R2-NEXT: sllv $5, $1, $3 2881; MIPS32R2-NEXT: nor $6, $zero, $5 2882; MIPS32R2-NEXT: sllv $4, $4, $3 2883; MIPS32R2-NEXT: $BB9_1: # %entry 2884; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 2885; MIPS32R2-NEXT: ll $7, 0($2) 2886; MIPS32R2-NEXT: subu $8, $7, $4 2887; MIPS32R2-NEXT: and $8, $8, $5 2888; MIPS32R2-NEXT: and $9, $7, $6 2889; MIPS32R2-NEXT: or $9, $9, $8 2890; MIPS32R2-NEXT: sc $9, 0($2) 2891; MIPS32R2-NEXT: beqz $9, $BB9_1 2892; MIPS32R2-NEXT: nop 2893; MIPS32R2-NEXT: # %bb.2: # %entry 2894; MIPS32R2-NEXT: and $1, $7, $5 2895; MIPS32R2-NEXT: srlv $1, $1, $3 2896; MIPS32R2-NEXT: seb $1, $1 2897; MIPS32R2-NEXT: # %bb.3: # %entry 2898; MIPS32R2-NEXT: jr $ra 2899; MIPS32R2-NEXT: seb $2, $1 2900; 2901; MIPS32R6-LABEL: AtomicLoadSub8: 2902; MIPS32R6: # %bb.0: # %entry 2903; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 2904; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 2905; MIPS32R6-NEXT: addu $1, $2, $25 2906; MIPS32R6-NEXT: lw $1, %got(y)($1) 2907; MIPS32R6-NEXT: addiu $2, $zero, -4 2908; MIPS32R6-NEXT: and $2, $1, $2 2909; MIPS32R6-NEXT: andi $1, $1, 3 2910; MIPS32R6-NEXT: sll $3, $1, 3 2911; MIPS32R6-NEXT: ori $1, $zero, 255 2912; MIPS32R6-NEXT: sllv $5, $1, $3 2913; MIPS32R6-NEXT: nor $6, $zero, $5 2914; MIPS32R6-NEXT: sllv $4, $4, $3 2915; MIPS32R6-NEXT: $BB9_1: # %entry 2916; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 2917; MIPS32R6-NEXT: ll $7, 0($2) 2918; MIPS32R6-NEXT: subu $8, $7, $4 2919; MIPS32R6-NEXT: and $8, $8, $5 2920; MIPS32R6-NEXT: and $9, $7, $6 2921; MIPS32R6-NEXT: or $9, $9, $8 2922; MIPS32R6-NEXT: sc $9, 0($2) 2923; MIPS32R6-NEXT: beqzc $9, $BB9_1 2924; MIPS32R6-NEXT: # %bb.2: # %entry 2925; MIPS32R6-NEXT: and $1, $7, $5 2926; MIPS32R6-NEXT: srlv $1, $1, $3 2927; MIPS32R6-NEXT: seb $1, $1 2928; MIPS32R6-NEXT: # %bb.3: # %entry 2929; MIPS32R6-NEXT: jr $ra 2930; MIPS32R6-NEXT: seb $2, $1 2931; 2932; MIPS32R6O0-LABEL: AtomicLoadSub8: 2933; MIPS32R6O0: # %bb.0: # %entry 2934; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 2935; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2936; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 2937; MIPS32R6O0-NEXT: addu $1, $2, $25 2938; MIPS32R6O0-NEXT: move $2, $4 2939; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 2940; MIPS32R6O0-NEXT: addiu $3, $zero, -4 2941; MIPS32R6O0-NEXT: and $3, $1, $3 2942; MIPS32R6O0-NEXT: andi $1, $1, 3 2943; MIPS32R6O0-NEXT: sll $1, $1, 3 2944; MIPS32R6O0-NEXT: ori $5, $zero, 255 2945; MIPS32R6O0-NEXT: sllv $5, $5, $1 2946; MIPS32R6O0-NEXT: nor $6, $zero, $5 2947; MIPS32R6O0-NEXT: sllv $4, $4, $1 2948; MIPS32R6O0-NEXT: $BB9_1: # %entry 2949; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2950; MIPS32R6O0-NEXT: ll $8, 0($3) 2951; MIPS32R6O0-NEXT: subu $9, $8, $4 2952; MIPS32R6O0-NEXT: and $9, $9, $5 2953; MIPS32R6O0-NEXT: and $10, $8, $6 2954; MIPS32R6O0-NEXT: or $10, $10, $9 2955; MIPS32R6O0-NEXT: sc $10, 0($3) 2956; MIPS32R6O0-NEXT: beqzc $10, $BB9_1 2957; MIPS32R6O0-NEXT: # %bb.2: # %entry 2958; MIPS32R6O0-NEXT: and $7, $8, $5 2959; MIPS32R6O0-NEXT: srlv $7, $7, $1 2960; MIPS32R6O0-NEXT: seb $7, $7 2961; MIPS32R6O0-NEXT: # %bb.3: # %entry 2962; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 2963; MIPS32R6O0-NEXT: sw $7, 0($sp) # 4-byte Folded Spill 2964; MIPS32R6O0-NEXT: # %bb.4: # %entry 2965; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 2966; MIPS32R6O0-NEXT: seb $2, $1 2967; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 2968; MIPS32R6O0-NEXT: jrc $ra 2969; 2970; MIPS4-LABEL: AtomicLoadSub8: 2971; MIPS4: # %bb.0: # %entry 2972; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 2973; MIPS4-NEXT: daddu $1, $1, $25 2974; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 2975; MIPS4-NEXT: ld $1, %got_disp(y)($1) 2976; MIPS4-NEXT: daddiu $2, $zero, -4 2977; MIPS4-NEXT: and $2, $1, $2 2978; MIPS4-NEXT: andi $1, $1, 3 2979; MIPS4-NEXT: sll $3, $1, 3 2980; MIPS4-NEXT: ori $1, $zero, 255 2981; MIPS4-NEXT: sllv $5, $1, $3 2982; MIPS4-NEXT: nor $6, $zero, $5 2983; MIPS4-NEXT: sllv $4, $4, $3 2984; MIPS4-NEXT: .LBB9_1: # %entry 2985; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 2986; MIPS4-NEXT: ll $7, 0($2) 2987; MIPS4-NEXT: subu $8, $7, $4 2988; MIPS4-NEXT: and $8, $8, $5 2989; MIPS4-NEXT: and $9, $7, $6 2990; MIPS4-NEXT: or $9, $9, $8 2991; MIPS4-NEXT: sc $9, 0($2) 2992; MIPS4-NEXT: beqz $9, .LBB9_1 2993; MIPS4-NEXT: nop 2994; MIPS4-NEXT: # %bb.2: # %entry 2995; MIPS4-NEXT: and $1, $7, $5 2996; MIPS4-NEXT: srlv $1, $1, $3 2997; MIPS4-NEXT: sll $1, $1, 24 2998; MIPS4-NEXT: sra $1, $1, 24 2999; MIPS4-NEXT: # %bb.3: # %entry 3000; MIPS4-NEXT: sll $1, $1, 24 3001; MIPS4-NEXT: jr $ra 3002; MIPS4-NEXT: sra $2, $1, 24 3003; 3004; MIPS64-LABEL: AtomicLoadSub8: 3005; MIPS64: # %bb.0: # %entry 3006; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3007; MIPS64-NEXT: daddu $1, $1, $25 3008; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3009; MIPS64-NEXT: ld $1, %got_disp(y)($1) 3010; MIPS64-NEXT: daddiu $2, $zero, -4 3011; MIPS64-NEXT: and $2, $1, $2 3012; MIPS64-NEXT: andi $1, $1, 3 3013; MIPS64-NEXT: sll $3, $1, 3 3014; MIPS64-NEXT: ori $1, $zero, 255 3015; MIPS64-NEXT: sllv $5, $1, $3 3016; MIPS64-NEXT: nor $6, $zero, $5 3017; MIPS64-NEXT: sllv $4, $4, $3 3018; MIPS64-NEXT: .LBB9_1: # %entry 3019; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 3020; MIPS64-NEXT: ll $7, 0($2) 3021; MIPS64-NEXT: subu $8, $7, $4 3022; MIPS64-NEXT: and $8, $8, $5 3023; MIPS64-NEXT: and $9, $7, $6 3024; MIPS64-NEXT: or $9, $9, $8 3025; MIPS64-NEXT: sc $9, 0($2) 3026; MIPS64-NEXT: beqz $9, .LBB9_1 3027; MIPS64-NEXT: nop 3028; MIPS64-NEXT: # %bb.2: # %entry 3029; MIPS64-NEXT: and $1, $7, $5 3030; MIPS64-NEXT: srlv $1, $1, $3 3031; MIPS64-NEXT: sll $1, $1, 24 3032; MIPS64-NEXT: sra $1, $1, 24 3033; MIPS64-NEXT: # %bb.3: # %entry 3034; MIPS64-NEXT: sll $1, $1, 24 3035; MIPS64-NEXT: jr $ra 3036; MIPS64-NEXT: sra $2, $1, 24 3037; 3038; MIPS64R2-LABEL: AtomicLoadSub8: 3039; MIPS64R2: # %bb.0: # %entry 3040; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3041; MIPS64R2-NEXT: daddu $1, $1, $25 3042; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3043; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 3044; MIPS64R2-NEXT: daddiu $2, $zero, -4 3045; MIPS64R2-NEXT: and $2, $1, $2 3046; MIPS64R2-NEXT: andi $1, $1, 3 3047; MIPS64R2-NEXT: sll $3, $1, 3 3048; MIPS64R2-NEXT: ori $1, $zero, 255 3049; MIPS64R2-NEXT: sllv $5, $1, $3 3050; MIPS64R2-NEXT: nor $6, $zero, $5 3051; MIPS64R2-NEXT: sllv $4, $4, $3 3052; MIPS64R2-NEXT: .LBB9_1: # %entry 3053; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 3054; MIPS64R2-NEXT: ll $7, 0($2) 3055; MIPS64R2-NEXT: subu $8, $7, $4 3056; MIPS64R2-NEXT: and $8, $8, $5 3057; MIPS64R2-NEXT: and $9, $7, $6 3058; MIPS64R2-NEXT: or $9, $9, $8 3059; MIPS64R2-NEXT: sc $9, 0($2) 3060; MIPS64R2-NEXT: beqz $9, .LBB9_1 3061; MIPS64R2-NEXT: nop 3062; MIPS64R2-NEXT: # %bb.2: # %entry 3063; MIPS64R2-NEXT: and $1, $7, $5 3064; MIPS64R2-NEXT: srlv $1, $1, $3 3065; MIPS64R2-NEXT: seb $1, $1 3066; MIPS64R2-NEXT: # %bb.3: # %entry 3067; MIPS64R2-NEXT: jr $ra 3068; MIPS64R2-NEXT: seb $2, $1 3069; 3070; MIPS64R6-LABEL: AtomicLoadSub8: 3071; MIPS64R6: # %bb.0: # %entry 3072; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3073; MIPS64R6-NEXT: daddu $1, $1, $25 3074; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3075; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 3076; MIPS64R6-NEXT: daddiu $2, $zero, -4 3077; MIPS64R6-NEXT: and $2, $1, $2 3078; MIPS64R6-NEXT: andi $1, $1, 3 3079; MIPS64R6-NEXT: sll $3, $1, 3 3080; MIPS64R6-NEXT: ori $1, $zero, 255 3081; MIPS64R6-NEXT: sllv $5, $1, $3 3082; MIPS64R6-NEXT: nor $6, $zero, $5 3083; MIPS64R6-NEXT: sllv $4, $4, $3 3084; MIPS64R6-NEXT: .LBB9_1: # %entry 3085; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 3086; MIPS64R6-NEXT: ll $7, 0($2) 3087; MIPS64R6-NEXT: subu $8, $7, $4 3088; MIPS64R6-NEXT: and $8, $8, $5 3089; MIPS64R6-NEXT: and $9, $7, $6 3090; MIPS64R6-NEXT: or $9, $9, $8 3091; MIPS64R6-NEXT: sc $9, 0($2) 3092; MIPS64R6-NEXT: beqzc $9, .LBB9_1 3093; MIPS64R6-NEXT: # %bb.2: # %entry 3094; MIPS64R6-NEXT: and $1, $7, $5 3095; MIPS64R6-NEXT: srlv $1, $1, $3 3096; MIPS64R6-NEXT: seb $1, $1 3097; MIPS64R6-NEXT: # %bb.3: # %entry 3098; MIPS64R6-NEXT: jr $ra 3099; MIPS64R6-NEXT: seb $2, $1 3100; 3101; MIPS64R6O0-LABEL: AtomicLoadSub8: 3102; MIPS64R6O0: # %bb.0: # %entry 3103; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 3104; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3105; MIPS64R6O0-NEXT: daddu $1, $1, $25 3106; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3107; MIPS64R6O0-NEXT: move $2, $4 3108; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 3109; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 3110; MIPS64R6O0-NEXT: and $3, $1, $3 3111; MIPS64R6O0-NEXT: andi $5, $1, 3 3112; MIPS64R6O0-NEXT: xori $5, $5, 3 3113; MIPS64R6O0-NEXT: sll $5, $5, 3 3114; MIPS64R6O0-NEXT: ori $6, $zero, 255 3115; MIPS64R6O0-NEXT: sllv $6, $6, $5 3116; MIPS64R6O0-NEXT: nor $7, $zero, $6 3117; MIPS64R6O0-NEXT: sllv $2, $2, $5 3118; MIPS64R6O0-NEXT: .LBB9_1: # %entry 3119; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3120; MIPS64R6O0-NEXT: ll $9, 0($3) 3121; MIPS64R6O0-NEXT: subu $10, $9, $2 3122; MIPS64R6O0-NEXT: and $10, $10, $6 3123; MIPS64R6O0-NEXT: and $11, $9, $7 3124; MIPS64R6O0-NEXT: or $11, $11, $10 3125; MIPS64R6O0-NEXT: sc $11, 0($3) 3126; MIPS64R6O0-NEXT: beqzc $11, .LBB9_1 3127; MIPS64R6O0-NEXT: # %bb.2: # %entry 3128; MIPS64R6O0-NEXT: and $8, $9, $6 3129; MIPS64R6O0-NEXT: srlv $8, $8, $5 3130; MIPS64R6O0-NEXT: seb $8, $8 3131; MIPS64R6O0-NEXT: # %bb.3: # %entry 3132; MIPS64R6O0-NEXT: sw $8, 12($sp) # 4-byte Folded Spill 3133; MIPS64R6O0-NEXT: # %bb.4: # %entry 3134; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 3135; MIPS64R6O0-NEXT: seb $2, $1 3136; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 3137; MIPS64R6O0-NEXT: jrc $ra 3138; 3139; MM32-LABEL: AtomicLoadSub8: 3140; MM32: # %bb.0: # %entry 3141; MM32-NEXT: lui $2, %hi(_gp_disp) 3142; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 3143; MM32-NEXT: addu $2, $2, $25 3144; MM32-NEXT: lw $1, %got(y)($2) 3145; MM32-NEXT: addiu $2, $zero, -4 3146; MM32-NEXT: and $2, $1, $2 3147; MM32-NEXT: andi $1, $1, 3 3148; MM32-NEXT: sll $3, $1, 3 3149; MM32-NEXT: ori $1, $zero, 255 3150; MM32-NEXT: sllv $5, $1, $3 3151; MM32-NEXT: nor $6, $zero, $5 3152; MM32-NEXT: sllv $4, $4, $3 3153; MM32-NEXT: $BB9_1: # %entry 3154; MM32-NEXT: # =>This Inner Loop Header: Depth=1 3155; MM32-NEXT: ll $7, 0($2) 3156; MM32-NEXT: subu $8, $7, $4 3157; MM32-NEXT: and $8, $8, $5 3158; MM32-NEXT: and $9, $7, $6 3159; MM32-NEXT: or $9, $9, $8 3160; MM32-NEXT: sc $9, 0($2) 3161; MM32-NEXT: beqzc $9, $BB9_1 3162; MM32-NEXT: # %bb.2: # %entry 3163; MM32-NEXT: and $1, $7, $5 3164; MM32-NEXT: srlv $1, $1, $3 3165; MM32-NEXT: seb $1, $1 3166; MM32-NEXT: # %bb.3: # %entry 3167; MM32-NEXT: jr $ra 3168; MM32-NEXT: seb $2, $1 3169; 3170; O1-LABEL: AtomicLoadSub8: 3171; O1: # %bb.0: # %entry 3172; O1-NEXT: lui $2, %hi(_gp_disp) 3173; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 3174; O1-NEXT: addu $1, $2, $25 3175; O1-NEXT: lw $1, %got(y)($1) 3176; O1-NEXT: addiu $2, $zero, -4 3177; O1-NEXT: and $2, $1, $2 3178; O1-NEXT: andi $1, $1, 3 3179; O1-NEXT: sll $3, $1, 3 3180; O1-NEXT: ori $1, $zero, 255 3181; O1-NEXT: sllv $5, $1, $3 3182; O1-NEXT: nor $6, $zero, $5 3183; O1-NEXT: sllv $4, $4, $3 3184; O1-NEXT: $BB9_1: # %entry 3185; O1-NEXT: # =>This Inner Loop Header: Depth=1 3186; O1-NEXT: ll $7, 0($2) 3187; O1-NEXT: subu $8, $7, $4 3188; O1-NEXT: and $8, $8, $5 3189; O1-NEXT: and $9, $7, $6 3190; O1-NEXT: or $9, $9, $8 3191; O1-NEXT: sc $9, 0($2) 3192; O1-NEXT: beqz $9, $BB9_1 3193; O1-NEXT: nop 3194; O1-NEXT: # %bb.2: # %entry 3195; O1-NEXT: and $1, $7, $5 3196; O1-NEXT: srlv $1, $1, $3 3197; O1-NEXT: sll $1, $1, 24 3198; O1-NEXT: sra $1, $1, 24 3199; O1-NEXT: # %bb.3: # %entry 3200; O1-NEXT: sll $1, $1, 24 3201; O1-NEXT: jr $ra 3202; O1-NEXT: sra $2, $1, 24 3203; 3204; O2-LABEL: AtomicLoadSub8: 3205; O2: # %bb.0: # %entry 3206; O2-NEXT: lui $2, %hi(_gp_disp) 3207; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 3208; O2-NEXT: addu $1, $2, $25 3209; O2-NEXT: lw $1, %got(y)($1) 3210; O2-NEXT: addiu $2, $zero, -4 3211; O2-NEXT: and $2, $1, $2 3212; O2-NEXT: andi $1, $1, 3 3213; O2-NEXT: sll $3, $1, 3 3214; O2-NEXT: ori $1, $zero, 255 3215; O2-NEXT: sllv $5, $1, $3 3216; O2-NEXT: nor $6, $zero, $5 3217; O2-NEXT: sllv $4, $4, $3 3218; O2-NEXT: $BB9_1: # %entry 3219; O2-NEXT: # =>This Inner Loop Header: Depth=1 3220; O2-NEXT: ll $7, 0($2) 3221; O2-NEXT: subu $8, $7, $4 3222; O2-NEXT: and $8, $8, $5 3223; O2-NEXT: and $9, $7, $6 3224; O2-NEXT: or $9, $9, $8 3225; O2-NEXT: sc $9, 0($2) 3226; O2-NEXT: beqz $9, $BB9_1 3227; O2-NEXT: nop 3228; O2-NEXT: # %bb.2: # %entry 3229; O2-NEXT: and $1, $7, $5 3230; O2-NEXT: srlv $1, $1, $3 3231; O2-NEXT: sll $1, $1, 24 3232; O2-NEXT: sra $1, $1, 24 3233; O2-NEXT: # %bb.3: # %entry 3234; O2-NEXT: sll $1, $1, 24 3235; O2-NEXT: jr $ra 3236; O2-NEXT: sra $2, $1, 24 3237; 3238; O3-LABEL: AtomicLoadSub8: 3239; O3: # %bb.0: # %entry 3240; O3-NEXT: lui $2, %hi(_gp_disp) 3241; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 3242; O3-NEXT: addu $1, $2, $25 3243; O3-NEXT: addiu $2, $zero, -4 3244; O3-NEXT: lw $1, %got(y)($1) 3245; O3-NEXT: and $2, $1, $2 3246; O3-NEXT: andi $1, $1, 3 3247; O3-NEXT: sll $3, $1, 3 3248; O3-NEXT: ori $1, $zero, 255 3249; O3-NEXT: sllv $5, $1, $3 3250; O3-NEXT: sllv $4, $4, $3 3251; O3-NEXT: nor $6, $zero, $5 3252; O3-NEXT: $BB9_1: # %entry 3253; O3-NEXT: # =>This Inner Loop Header: Depth=1 3254; O3-NEXT: ll $7, 0($2) 3255; O3-NEXT: subu $8, $7, $4 3256; O3-NEXT: and $8, $8, $5 3257; O3-NEXT: and $9, $7, $6 3258; O3-NEXT: or $9, $9, $8 3259; O3-NEXT: sc $9, 0($2) 3260; O3-NEXT: beqz $9, $BB9_1 3261; O3-NEXT: nop 3262; O3-NEXT: # %bb.2: # %entry 3263; O3-NEXT: and $1, $7, $5 3264; O3-NEXT: srlv $1, $1, $3 3265; O3-NEXT: sll $1, $1, 24 3266; O3-NEXT: sra $1, $1, 24 3267; O3-NEXT: # %bb.3: # %entry 3268; O3-NEXT: sll $1, $1, 24 3269; O3-NEXT: jr $ra 3270; O3-NEXT: sra $2, $1, 24 3271; 3272; MIPS32EB-LABEL: AtomicLoadSub8: 3273; MIPS32EB: # %bb.0: # %entry 3274; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 3275; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 3276; MIPS32EB-NEXT: addu $1, $2, $25 3277; MIPS32EB-NEXT: lw $1, %got(y)($1) 3278; MIPS32EB-NEXT: addiu $2, $zero, -4 3279; MIPS32EB-NEXT: and $2, $1, $2 3280; MIPS32EB-NEXT: andi $1, $1, 3 3281; MIPS32EB-NEXT: xori $1, $1, 3 3282; MIPS32EB-NEXT: sll $3, $1, 3 3283; MIPS32EB-NEXT: ori $1, $zero, 255 3284; MIPS32EB-NEXT: sllv $5, $1, $3 3285; MIPS32EB-NEXT: nor $6, $zero, $5 3286; MIPS32EB-NEXT: sllv $4, $4, $3 3287; MIPS32EB-NEXT: $BB9_1: # %entry 3288; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 3289; MIPS32EB-NEXT: ll $7, 0($2) 3290; MIPS32EB-NEXT: subu $8, $7, $4 3291; MIPS32EB-NEXT: and $8, $8, $5 3292; MIPS32EB-NEXT: and $9, $7, $6 3293; MIPS32EB-NEXT: or $9, $9, $8 3294; MIPS32EB-NEXT: sc $9, 0($2) 3295; MIPS32EB-NEXT: beqz $9, $BB9_1 3296; MIPS32EB-NEXT: nop 3297; MIPS32EB-NEXT: # %bb.2: # %entry 3298; MIPS32EB-NEXT: and $1, $7, $5 3299; MIPS32EB-NEXT: srlv $1, $1, $3 3300; MIPS32EB-NEXT: sll $1, $1, 24 3301; MIPS32EB-NEXT: sra $1, $1, 24 3302; MIPS32EB-NEXT: # %bb.3: # %entry 3303; MIPS32EB-NEXT: sll $1, $1, 24 3304; MIPS32EB-NEXT: jr $ra 3305; MIPS32EB-NEXT: sra $2, $1, 24 3306entry: 3307 %0 = atomicrmw sub i8* @y, i8 %incr monotonic 3308 ret i8 %0 3309 3310} 3311 3312define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind { 3313; MIPS32-LABEL: AtomicLoadNand8: 3314; MIPS32: # %bb.0: # %entry 3315; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3316; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3317; MIPS32-NEXT: addu $1, $2, $25 3318; MIPS32-NEXT: lw $1, %got(y)($1) 3319; MIPS32-NEXT: addiu $2, $zero, -4 3320; MIPS32-NEXT: and $2, $1, $2 3321; MIPS32-NEXT: andi $1, $1, 3 3322; MIPS32-NEXT: sll $3, $1, 3 3323; MIPS32-NEXT: ori $1, $zero, 255 3324; MIPS32-NEXT: sllv $5, $1, $3 3325; MIPS32-NEXT: nor $6, $zero, $5 3326; MIPS32-NEXT: sllv $4, $4, $3 3327; MIPS32-NEXT: $BB10_1: # %entry 3328; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 3329; MIPS32-NEXT: ll $7, 0($2) 3330; MIPS32-NEXT: and $8, $7, $4 3331; MIPS32-NEXT: nor $8, $zero, $8 3332; MIPS32-NEXT: and $8, $8, $5 3333; MIPS32-NEXT: and $9, $7, $6 3334; MIPS32-NEXT: or $9, $9, $8 3335; MIPS32-NEXT: sc $9, 0($2) 3336; MIPS32-NEXT: beqz $9, $BB10_1 3337; MIPS32-NEXT: nop 3338; MIPS32-NEXT: # %bb.2: # %entry 3339; MIPS32-NEXT: and $1, $7, $5 3340; MIPS32-NEXT: srlv $1, $1, $3 3341; MIPS32-NEXT: sll $1, $1, 24 3342; MIPS32-NEXT: sra $1, $1, 24 3343; MIPS32-NEXT: # %bb.3: # %entry 3344; MIPS32-NEXT: sll $1, $1, 24 3345; MIPS32-NEXT: jr $ra 3346; MIPS32-NEXT: sra $2, $1, 24 3347; 3348; MIPS32O0-LABEL: AtomicLoadNand8: 3349; MIPS32O0: # %bb.0: # %entry 3350; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 3351; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3352; MIPS32O0-NEXT: addiu $sp, $sp, -8 3353; MIPS32O0-NEXT: addu $1, $2, $25 3354; MIPS32O0-NEXT: lw $1, %got(y)($1) 3355; MIPS32O0-NEXT: addiu $2, $zero, -4 3356; MIPS32O0-NEXT: and $2, $1, $2 3357; MIPS32O0-NEXT: andi $1, $1, 3 3358; MIPS32O0-NEXT: sll $1, $1, 3 3359; MIPS32O0-NEXT: ori $3, $zero, 255 3360; MIPS32O0-NEXT: sllv $3, $3, $1 3361; MIPS32O0-NEXT: nor $5, $zero, $3 3362; MIPS32O0-NEXT: sllv $4, $4, $1 3363; MIPS32O0-NEXT: $BB10_1: # %entry 3364; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 3365; MIPS32O0-NEXT: ll $7, 0($2) 3366; MIPS32O0-NEXT: and $8, $7, $4 3367; MIPS32O0-NEXT: nor $8, $zero, $8 3368; MIPS32O0-NEXT: and $8, $8, $3 3369; MIPS32O0-NEXT: and $9, $7, $5 3370; MIPS32O0-NEXT: or $9, $9, $8 3371; MIPS32O0-NEXT: sc $9, 0($2) 3372; MIPS32O0-NEXT: beqz $9, $BB10_1 3373; MIPS32O0-NEXT: nop 3374; MIPS32O0-NEXT: # %bb.2: # %entry 3375; MIPS32O0-NEXT: and $6, $7, $3 3376; MIPS32O0-NEXT: srlv $6, $6, $1 3377; MIPS32O0-NEXT: sll $6, $6, 24 3378; MIPS32O0-NEXT: sra $6, $6, 24 3379; MIPS32O0-NEXT: # %bb.3: # %entry 3380; MIPS32O0-NEXT: sw $6, 4($sp) # 4-byte Folded Spill 3381; MIPS32O0-NEXT: # %bb.4: # %entry 3382; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 3383; MIPS32O0-NEXT: sll $2, $1, 24 3384; MIPS32O0-NEXT: sra $2, $2, 24 3385; MIPS32O0-NEXT: addiu $sp, $sp, 8 3386; MIPS32O0-NEXT: jr $ra 3387; MIPS32O0-NEXT: nop 3388; 3389; MIPS32R2-LABEL: AtomicLoadNand8: 3390; MIPS32R2: # %bb.0: # %entry 3391; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 3392; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 3393; MIPS32R2-NEXT: addu $1, $2, $25 3394; MIPS32R2-NEXT: lw $1, %got(y)($1) 3395; MIPS32R2-NEXT: addiu $2, $zero, -4 3396; MIPS32R2-NEXT: and $2, $1, $2 3397; MIPS32R2-NEXT: andi $1, $1, 3 3398; MIPS32R2-NEXT: sll $3, $1, 3 3399; MIPS32R2-NEXT: ori $1, $zero, 255 3400; MIPS32R2-NEXT: sllv $5, $1, $3 3401; MIPS32R2-NEXT: nor $6, $zero, $5 3402; MIPS32R2-NEXT: sllv $4, $4, $3 3403; MIPS32R2-NEXT: $BB10_1: # %entry 3404; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 3405; MIPS32R2-NEXT: ll $7, 0($2) 3406; MIPS32R2-NEXT: and $8, $7, $4 3407; MIPS32R2-NEXT: nor $8, $zero, $8 3408; MIPS32R2-NEXT: and $8, $8, $5 3409; MIPS32R2-NEXT: and $9, $7, $6 3410; MIPS32R2-NEXT: or $9, $9, $8 3411; MIPS32R2-NEXT: sc $9, 0($2) 3412; MIPS32R2-NEXT: beqz $9, $BB10_1 3413; MIPS32R2-NEXT: nop 3414; MIPS32R2-NEXT: # %bb.2: # %entry 3415; MIPS32R2-NEXT: and $1, $7, $5 3416; MIPS32R2-NEXT: srlv $1, $1, $3 3417; MIPS32R2-NEXT: seb $1, $1 3418; MIPS32R2-NEXT: # %bb.3: # %entry 3419; MIPS32R2-NEXT: jr $ra 3420; MIPS32R2-NEXT: seb $2, $1 3421; 3422; MIPS32R6-LABEL: AtomicLoadNand8: 3423; MIPS32R6: # %bb.0: # %entry 3424; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 3425; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 3426; MIPS32R6-NEXT: addu $1, $2, $25 3427; MIPS32R6-NEXT: lw $1, %got(y)($1) 3428; MIPS32R6-NEXT: addiu $2, $zero, -4 3429; MIPS32R6-NEXT: and $2, $1, $2 3430; MIPS32R6-NEXT: andi $1, $1, 3 3431; MIPS32R6-NEXT: sll $3, $1, 3 3432; MIPS32R6-NEXT: ori $1, $zero, 255 3433; MIPS32R6-NEXT: sllv $5, $1, $3 3434; MIPS32R6-NEXT: nor $6, $zero, $5 3435; MIPS32R6-NEXT: sllv $4, $4, $3 3436; MIPS32R6-NEXT: $BB10_1: # %entry 3437; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 3438; MIPS32R6-NEXT: ll $7, 0($2) 3439; MIPS32R6-NEXT: and $8, $7, $4 3440; MIPS32R6-NEXT: nor $8, $zero, $8 3441; MIPS32R6-NEXT: and $8, $8, $5 3442; MIPS32R6-NEXT: and $9, $7, $6 3443; MIPS32R6-NEXT: or $9, $9, $8 3444; MIPS32R6-NEXT: sc $9, 0($2) 3445; MIPS32R6-NEXT: beqzc $9, $BB10_1 3446; MIPS32R6-NEXT: # %bb.2: # %entry 3447; MIPS32R6-NEXT: and $1, $7, $5 3448; MIPS32R6-NEXT: srlv $1, $1, $3 3449; MIPS32R6-NEXT: seb $1, $1 3450; MIPS32R6-NEXT: # %bb.3: # %entry 3451; MIPS32R6-NEXT: jr $ra 3452; MIPS32R6-NEXT: seb $2, $1 3453; 3454; MIPS32R6O0-LABEL: AtomicLoadNand8: 3455; MIPS32R6O0: # %bb.0: # %entry 3456; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 3457; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3458; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 3459; MIPS32R6O0-NEXT: addu $1, $2, $25 3460; MIPS32R6O0-NEXT: move $2, $4 3461; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 3462; MIPS32R6O0-NEXT: addiu $3, $zero, -4 3463; MIPS32R6O0-NEXT: and $3, $1, $3 3464; MIPS32R6O0-NEXT: andi $1, $1, 3 3465; MIPS32R6O0-NEXT: sll $1, $1, 3 3466; MIPS32R6O0-NEXT: ori $5, $zero, 255 3467; MIPS32R6O0-NEXT: sllv $5, $5, $1 3468; MIPS32R6O0-NEXT: nor $6, $zero, $5 3469; MIPS32R6O0-NEXT: sllv $4, $4, $1 3470; MIPS32R6O0-NEXT: $BB10_1: # %entry 3471; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3472; MIPS32R6O0-NEXT: ll $8, 0($3) 3473; MIPS32R6O0-NEXT: and $9, $8, $4 3474; MIPS32R6O0-NEXT: nor $9, $zero, $9 3475; MIPS32R6O0-NEXT: and $9, $9, $5 3476; MIPS32R6O0-NEXT: and $10, $8, $6 3477; MIPS32R6O0-NEXT: or $10, $10, $9 3478; MIPS32R6O0-NEXT: sc $10, 0($3) 3479; MIPS32R6O0-NEXT: beqzc $10, $BB10_1 3480; MIPS32R6O0-NEXT: # %bb.2: # %entry 3481; MIPS32R6O0-NEXT: and $7, $8, $5 3482; MIPS32R6O0-NEXT: srlv $7, $7, $1 3483; MIPS32R6O0-NEXT: seb $7, $7 3484; MIPS32R6O0-NEXT: # %bb.3: # %entry 3485; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 3486; MIPS32R6O0-NEXT: sw $7, 0($sp) # 4-byte Folded Spill 3487; MIPS32R6O0-NEXT: # %bb.4: # %entry 3488; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 3489; MIPS32R6O0-NEXT: seb $2, $1 3490; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 3491; MIPS32R6O0-NEXT: jrc $ra 3492; 3493; MIPS4-LABEL: AtomicLoadNand8: 3494; MIPS4: # %bb.0: # %entry 3495; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3496; MIPS4-NEXT: daddu $1, $1, $25 3497; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3498; MIPS4-NEXT: ld $1, %got_disp(y)($1) 3499; MIPS4-NEXT: daddiu $2, $zero, -4 3500; MIPS4-NEXT: and $2, $1, $2 3501; MIPS4-NEXT: andi $1, $1, 3 3502; MIPS4-NEXT: sll $3, $1, 3 3503; MIPS4-NEXT: ori $1, $zero, 255 3504; MIPS4-NEXT: sllv $5, $1, $3 3505; MIPS4-NEXT: nor $6, $zero, $5 3506; MIPS4-NEXT: sllv $4, $4, $3 3507; MIPS4-NEXT: .LBB10_1: # %entry 3508; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 3509; MIPS4-NEXT: ll $7, 0($2) 3510; MIPS4-NEXT: and $8, $7, $4 3511; MIPS4-NEXT: nor $8, $zero, $8 3512; MIPS4-NEXT: and $8, $8, $5 3513; MIPS4-NEXT: and $9, $7, $6 3514; MIPS4-NEXT: or $9, $9, $8 3515; MIPS4-NEXT: sc $9, 0($2) 3516; MIPS4-NEXT: beqz $9, .LBB10_1 3517; MIPS4-NEXT: nop 3518; MIPS4-NEXT: # %bb.2: # %entry 3519; MIPS4-NEXT: and $1, $7, $5 3520; MIPS4-NEXT: srlv $1, $1, $3 3521; MIPS4-NEXT: sll $1, $1, 24 3522; MIPS4-NEXT: sra $1, $1, 24 3523; MIPS4-NEXT: # %bb.3: # %entry 3524; MIPS4-NEXT: sll $1, $1, 24 3525; MIPS4-NEXT: jr $ra 3526; MIPS4-NEXT: sra $2, $1, 24 3527; 3528; MIPS64-LABEL: AtomicLoadNand8: 3529; MIPS64: # %bb.0: # %entry 3530; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3531; MIPS64-NEXT: daddu $1, $1, $25 3532; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3533; MIPS64-NEXT: ld $1, %got_disp(y)($1) 3534; MIPS64-NEXT: daddiu $2, $zero, -4 3535; MIPS64-NEXT: and $2, $1, $2 3536; MIPS64-NEXT: andi $1, $1, 3 3537; MIPS64-NEXT: sll $3, $1, 3 3538; MIPS64-NEXT: ori $1, $zero, 255 3539; MIPS64-NEXT: sllv $5, $1, $3 3540; MIPS64-NEXT: nor $6, $zero, $5 3541; MIPS64-NEXT: sllv $4, $4, $3 3542; MIPS64-NEXT: .LBB10_1: # %entry 3543; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 3544; MIPS64-NEXT: ll $7, 0($2) 3545; MIPS64-NEXT: and $8, $7, $4 3546; MIPS64-NEXT: nor $8, $zero, $8 3547; MIPS64-NEXT: and $8, $8, $5 3548; MIPS64-NEXT: and $9, $7, $6 3549; MIPS64-NEXT: or $9, $9, $8 3550; MIPS64-NEXT: sc $9, 0($2) 3551; MIPS64-NEXT: beqz $9, .LBB10_1 3552; MIPS64-NEXT: nop 3553; MIPS64-NEXT: # %bb.2: # %entry 3554; MIPS64-NEXT: and $1, $7, $5 3555; MIPS64-NEXT: srlv $1, $1, $3 3556; MIPS64-NEXT: sll $1, $1, 24 3557; MIPS64-NEXT: sra $1, $1, 24 3558; MIPS64-NEXT: # %bb.3: # %entry 3559; MIPS64-NEXT: sll $1, $1, 24 3560; MIPS64-NEXT: jr $ra 3561; MIPS64-NEXT: sra $2, $1, 24 3562; 3563; MIPS64R2-LABEL: AtomicLoadNand8: 3564; MIPS64R2: # %bb.0: # %entry 3565; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3566; MIPS64R2-NEXT: daddu $1, $1, $25 3567; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3568; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 3569; MIPS64R2-NEXT: daddiu $2, $zero, -4 3570; MIPS64R2-NEXT: and $2, $1, $2 3571; MIPS64R2-NEXT: andi $1, $1, 3 3572; MIPS64R2-NEXT: sll $3, $1, 3 3573; MIPS64R2-NEXT: ori $1, $zero, 255 3574; MIPS64R2-NEXT: sllv $5, $1, $3 3575; MIPS64R2-NEXT: nor $6, $zero, $5 3576; MIPS64R2-NEXT: sllv $4, $4, $3 3577; MIPS64R2-NEXT: .LBB10_1: # %entry 3578; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 3579; MIPS64R2-NEXT: ll $7, 0($2) 3580; MIPS64R2-NEXT: and $8, $7, $4 3581; MIPS64R2-NEXT: nor $8, $zero, $8 3582; MIPS64R2-NEXT: and $8, $8, $5 3583; MIPS64R2-NEXT: and $9, $7, $6 3584; MIPS64R2-NEXT: or $9, $9, $8 3585; MIPS64R2-NEXT: sc $9, 0($2) 3586; MIPS64R2-NEXT: beqz $9, .LBB10_1 3587; MIPS64R2-NEXT: nop 3588; MIPS64R2-NEXT: # %bb.2: # %entry 3589; MIPS64R2-NEXT: and $1, $7, $5 3590; MIPS64R2-NEXT: srlv $1, $1, $3 3591; MIPS64R2-NEXT: seb $1, $1 3592; MIPS64R2-NEXT: # %bb.3: # %entry 3593; MIPS64R2-NEXT: jr $ra 3594; MIPS64R2-NEXT: seb $2, $1 3595; 3596; MIPS64R6-LABEL: AtomicLoadNand8: 3597; MIPS64R6: # %bb.0: # %entry 3598; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3599; MIPS64R6-NEXT: daddu $1, $1, $25 3600; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3601; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 3602; MIPS64R6-NEXT: daddiu $2, $zero, -4 3603; MIPS64R6-NEXT: and $2, $1, $2 3604; MIPS64R6-NEXT: andi $1, $1, 3 3605; MIPS64R6-NEXT: sll $3, $1, 3 3606; MIPS64R6-NEXT: ori $1, $zero, 255 3607; MIPS64R6-NEXT: sllv $5, $1, $3 3608; MIPS64R6-NEXT: nor $6, $zero, $5 3609; MIPS64R6-NEXT: sllv $4, $4, $3 3610; MIPS64R6-NEXT: .LBB10_1: # %entry 3611; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 3612; MIPS64R6-NEXT: ll $7, 0($2) 3613; MIPS64R6-NEXT: and $8, $7, $4 3614; MIPS64R6-NEXT: nor $8, $zero, $8 3615; MIPS64R6-NEXT: and $8, $8, $5 3616; MIPS64R6-NEXT: and $9, $7, $6 3617; MIPS64R6-NEXT: or $9, $9, $8 3618; MIPS64R6-NEXT: sc $9, 0($2) 3619; MIPS64R6-NEXT: beqzc $9, .LBB10_1 3620; MIPS64R6-NEXT: # %bb.2: # %entry 3621; MIPS64R6-NEXT: and $1, $7, $5 3622; MIPS64R6-NEXT: srlv $1, $1, $3 3623; MIPS64R6-NEXT: seb $1, $1 3624; MIPS64R6-NEXT: # %bb.3: # %entry 3625; MIPS64R6-NEXT: jr $ra 3626; MIPS64R6-NEXT: seb $2, $1 3627; 3628; MIPS64R6O0-LABEL: AtomicLoadNand8: 3629; MIPS64R6O0: # %bb.0: # %entry 3630; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 3631; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3632; MIPS64R6O0-NEXT: daddu $1, $1, $25 3633; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3634; MIPS64R6O0-NEXT: move $2, $4 3635; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 3636; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 3637; MIPS64R6O0-NEXT: and $3, $1, $3 3638; MIPS64R6O0-NEXT: andi $5, $1, 3 3639; MIPS64R6O0-NEXT: xori $5, $5, 3 3640; MIPS64R6O0-NEXT: sll $5, $5, 3 3641; MIPS64R6O0-NEXT: ori $6, $zero, 255 3642; MIPS64R6O0-NEXT: sllv $6, $6, $5 3643; MIPS64R6O0-NEXT: nor $7, $zero, $6 3644; MIPS64R6O0-NEXT: sllv $2, $2, $5 3645; MIPS64R6O0-NEXT: .LBB10_1: # %entry 3646; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3647; MIPS64R6O0-NEXT: ll $9, 0($3) 3648; MIPS64R6O0-NEXT: and $10, $9, $2 3649; MIPS64R6O0-NEXT: nor $10, $zero, $10 3650; MIPS64R6O0-NEXT: and $10, $10, $6 3651; MIPS64R6O0-NEXT: and $11, $9, $7 3652; MIPS64R6O0-NEXT: or $11, $11, $10 3653; MIPS64R6O0-NEXT: sc $11, 0($3) 3654; MIPS64R6O0-NEXT: beqzc $11, .LBB10_1 3655; MIPS64R6O0-NEXT: # %bb.2: # %entry 3656; MIPS64R6O0-NEXT: and $8, $9, $6 3657; MIPS64R6O0-NEXT: srlv $8, $8, $5 3658; MIPS64R6O0-NEXT: seb $8, $8 3659; MIPS64R6O0-NEXT: # %bb.3: # %entry 3660; MIPS64R6O0-NEXT: sw $8, 12($sp) # 4-byte Folded Spill 3661; MIPS64R6O0-NEXT: # %bb.4: # %entry 3662; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 3663; MIPS64R6O0-NEXT: seb $2, $1 3664; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 3665; MIPS64R6O0-NEXT: jrc $ra 3666; 3667; MM32-LABEL: AtomicLoadNand8: 3668; MM32: # %bb.0: # %entry 3669; MM32-NEXT: lui $2, %hi(_gp_disp) 3670; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 3671; MM32-NEXT: addu $2, $2, $25 3672; MM32-NEXT: lw $1, %got(y)($2) 3673; MM32-NEXT: addiu $2, $zero, -4 3674; MM32-NEXT: and $2, $1, $2 3675; MM32-NEXT: andi $1, $1, 3 3676; MM32-NEXT: sll $3, $1, 3 3677; MM32-NEXT: ori $1, $zero, 255 3678; MM32-NEXT: sllv $5, $1, $3 3679; MM32-NEXT: nor $6, $zero, $5 3680; MM32-NEXT: sllv $4, $4, $3 3681; MM32-NEXT: $BB10_1: # %entry 3682; MM32-NEXT: # =>This Inner Loop Header: Depth=1 3683; MM32-NEXT: ll $7, 0($2) 3684; MM32-NEXT: and $8, $7, $4 3685; MM32-NEXT: nor $8, $zero, $8 3686; MM32-NEXT: and $8, $8, $5 3687; MM32-NEXT: and $9, $7, $6 3688; MM32-NEXT: or $9, $9, $8 3689; MM32-NEXT: sc $9, 0($2) 3690; MM32-NEXT: beqzc $9, $BB10_1 3691; MM32-NEXT: # %bb.2: # %entry 3692; MM32-NEXT: and $1, $7, $5 3693; MM32-NEXT: srlv $1, $1, $3 3694; MM32-NEXT: seb $1, $1 3695; MM32-NEXT: # %bb.3: # %entry 3696; MM32-NEXT: jr $ra 3697; MM32-NEXT: seb $2, $1 3698; 3699; O1-LABEL: AtomicLoadNand8: 3700; O1: # %bb.0: # %entry 3701; O1-NEXT: lui $2, %hi(_gp_disp) 3702; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 3703; O1-NEXT: addu $1, $2, $25 3704; O1-NEXT: lw $1, %got(y)($1) 3705; O1-NEXT: addiu $2, $zero, -4 3706; O1-NEXT: and $2, $1, $2 3707; O1-NEXT: andi $1, $1, 3 3708; O1-NEXT: sll $3, $1, 3 3709; O1-NEXT: ori $1, $zero, 255 3710; O1-NEXT: sllv $5, $1, $3 3711; O1-NEXT: nor $6, $zero, $5 3712; O1-NEXT: sllv $4, $4, $3 3713; O1-NEXT: $BB10_1: # %entry 3714; O1-NEXT: # =>This Inner Loop Header: Depth=1 3715; O1-NEXT: ll $7, 0($2) 3716; O1-NEXT: and $8, $7, $4 3717; O1-NEXT: nor $8, $zero, $8 3718; O1-NEXT: and $8, $8, $5 3719; O1-NEXT: and $9, $7, $6 3720; O1-NEXT: or $9, $9, $8 3721; O1-NEXT: sc $9, 0($2) 3722; O1-NEXT: beqz $9, $BB10_1 3723; O1-NEXT: nop 3724; O1-NEXT: # %bb.2: # %entry 3725; O1-NEXT: and $1, $7, $5 3726; O1-NEXT: srlv $1, $1, $3 3727; O1-NEXT: sll $1, $1, 24 3728; O1-NEXT: sra $1, $1, 24 3729; O1-NEXT: # %bb.3: # %entry 3730; O1-NEXT: sll $1, $1, 24 3731; O1-NEXT: jr $ra 3732; O1-NEXT: sra $2, $1, 24 3733; 3734; O2-LABEL: AtomicLoadNand8: 3735; O2: # %bb.0: # %entry 3736; O2-NEXT: lui $2, %hi(_gp_disp) 3737; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 3738; O2-NEXT: addu $1, $2, $25 3739; O2-NEXT: lw $1, %got(y)($1) 3740; O2-NEXT: addiu $2, $zero, -4 3741; O2-NEXT: and $2, $1, $2 3742; O2-NEXT: andi $1, $1, 3 3743; O2-NEXT: sll $3, $1, 3 3744; O2-NEXT: ori $1, $zero, 255 3745; O2-NEXT: sllv $5, $1, $3 3746; O2-NEXT: nor $6, $zero, $5 3747; O2-NEXT: sllv $4, $4, $3 3748; O2-NEXT: $BB10_1: # %entry 3749; O2-NEXT: # =>This Inner Loop Header: Depth=1 3750; O2-NEXT: ll $7, 0($2) 3751; O2-NEXT: and $8, $7, $4 3752; O2-NEXT: nor $8, $zero, $8 3753; O2-NEXT: and $8, $8, $5 3754; O2-NEXT: and $9, $7, $6 3755; O2-NEXT: or $9, $9, $8 3756; O2-NEXT: sc $9, 0($2) 3757; O2-NEXT: beqz $9, $BB10_1 3758; O2-NEXT: nop 3759; O2-NEXT: # %bb.2: # %entry 3760; O2-NEXT: and $1, $7, $5 3761; O2-NEXT: srlv $1, $1, $3 3762; O2-NEXT: sll $1, $1, 24 3763; O2-NEXT: sra $1, $1, 24 3764; O2-NEXT: # %bb.3: # %entry 3765; O2-NEXT: sll $1, $1, 24 3766; O2-NEXT: jr $ra 3767; O2-NEXT: sra $2, $1, 24 3768; 3769; O3-LABEL: AtomicLoadNand8: 3770; O3: # %bb.0: # %entry 3771; O3-NEXT: lui $2, %hi(_gp_disp) 3772; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 3773; O3-NEXT: addu $1, $2, $25 3774; O3-NEXT: addiu $2, $zero, -4 3775; O3-NEXT: lw $1, %got(y)($1) 3776; O3-NEXT: and $2, $1, $2 3777; O3-NEXT: andi $1, $1, 3 3778; O3-NEXT: sll $3, $1, 3 3779; O3-NEXT: ori $1, $zero, 255 3780; O3-NEXT: sllv $5, $1, $3 3781; O3-NEXT: sllv $4, $4, $3 3782; O3-NEXT: nor $6, $zero, $5 3783; O3-NEXT: $BB10_1: # %entry 3784; O3-NEXT: # =>This Inner Loop Header: Depth=1 3785; O3-NEXT: ll $7, 0($2) 3786; O3-NEXT: and $8, $7, $4 3787; O3-NEXT: nor $8, $zero, $8 3788; O3-NEXT: and $8, $8, $5 3789; O3-NEXT: and $9, $7, $6 3790; O3-NEXT: or $9, $9, $8 3791; O3-NEXT: sc $9, 0($2) 3792; O3-NEXT: beqz $9, $BB10_1 3793; O3-NEXT: nop 3794; O3-NEXT: # %bb.2: # %entry 3795; O3-NEXT: and $1, $7, $5 3796; O3-NEXT: srlv $1, $1, $3 3797; O3-NEXT: sll $1, $1, 24 3798; O3-NEXT: sra $1, $1, 24 3799; O3-NEXT: # %bb.3: # %entry 3800; O3-NEXT: sll $1, $1, 24 3801; O3-NEXT: jr $ra 3802; O3-NEXT: sra $2, $1, 24 3803; 3804; MIPS32EB-LABEL: AtomicLoadNand8: 3805; MIPS32EB: # %bb.0: # %entry 3806; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 3807; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 3808; MIPS32EB-NEXT: addu $1, $2, $25 3809; MIPS32EB-NEXT: lw $1, %got(y)($1) 3810; MIPS32EB-NEXT: addiu $2, $zero, -4 3811; MIPS32EB-NEXT: and $2, $1, $2 3812; MIPS32EB-NEXT: andi $1, $1, 3 3813; MIPS32EB-NEXT: xori $1, $1, 3 3814; MIPS32EB-NEXT: sll $3, $1, 3 3815; MIPS32EB-NEXT: ori $1, $zero, 255 3816; MIPS32EB-NEXT: sllv $5, $1, $3 3817; MIPS32EB-NEXT: nor $6, $zero, $5 3818; MIPS32EB-NEXT: sllv $4, $4, $3 3819; MIPS32EB-NEXT: $BB10_1: # %entry 3820; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 3821; MIPS32EB-NEXT: ll $7, 0($2) 3822; MIPS32EB-NEXT: and $8, $7, $4 3823; MIPS32EB-NEXT: nor $8, $zero, $8 3824; MIPS32EB-NEXT: and $8, $8, $5 3825; MIPS32EB-NEXT: and $9, $7, $6 3826; MIPS32EB-NEXT: or $9, $9, $8 3827; MIPS32EB-NEXT: sc $9, 0($2) 3828; MIPS32EB-NEXT: beqz $9, $BB10_1 3829; MIPS32EB-NEXT: nop 3830; MIPS32EB-NEXT: # %bb.2: # %entry 3831; MIPS32EB-NEXT: and $1, $7, $5 3832; MIPS32EB-NEXT: srlv $1, $1, $3 3833; MIPS32EB-NEXT: sll $1, $1, 24 3834; MIPS32EB-NEXT: sra $1, $1, 24 3835; MIPS32EB-NEXT: # %bb.3: # %entry 3836; MIPS32EB-NEXT: sll $1, $1, 24 3837; MIPS32EB-NEXT: jr $ra 3838; MIPS32EB-NEXT: sra $2, $1, 24 3839entry: 3840 %0 = atomicrmw nand i8* @y, i8 %incr monotonic 3841 ret i8 %0 3842 3843} 3844 3845define signext i8 @AtomicSwap8(i8 signext %newval) nounwind { 3846; MIPS32-LABEL: AtomicSwap8: 3847; MIPS32: # %bb.0: # %entry 3848; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3849; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3850; MIPS32-NEXT: addu $1, $2, $25 3851; MIPS32-NEXT: lw $1, %got(y)($1) 3852; MIPS32-NEXT: addiu $2, $zero, -4 3853; MIPS32-NEXT: and $2, $1, $2 3854; MIPS32-NEXT: andi $1, $1, 3 3855; MIPS32-NEXT: sll $3, $1, 3 3856; MIPS32-NEXT: ori $1, $zero, 255 3857; MIPS32-NEXT: sllv $5, $1, $3 3858; MIPS32-NEXT: nor $6, $zero, $5 3859; MIPS32-NEXT: sllv $4, $4, $3 3860; MIPS32-NEXT: $BB11_1: # %entry 3861; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 3862; MIPS32-NEXT: ll $7, 0($2) 3863; MIPS32-NEXT: and $8, $4, $5 3864; MIPS32-NEXT: and $9, $7, $6 3865; MIPS32-NEXT: or $9, $9, $8 3866; MIPS32-NEXT: sc $9, 0($2) 3867; MIPS32-NEXT: beqz $9, $BB11_1 3868; MIPS32-NEXT: nop 3869; MIPS32-NEXT: # %bb.2: # %entry 3870; MIPS32-NEXT: and $1, $7, $5 3871; MIPS32-NEXT: srlv $1, $1, $3 3872; MIPS32-NEXT: sll $1, $1, 24 3873; MIPS32-NEXT: sra $1, $1, 24 3874; MIPS32-NEXT: # %bb.3: # %entry 3875; MIPS32-NEXT: sll $1, $1, 24 3876; MIPS32-NEXT: jr $ra 3877; MIPS32-NEXT: sra $2, $1, 24 3878; 3879; MIPS32O0-LABEL: AtomicSwap8: 3880; MIPS32O0: # %bb.0: # %entry 3881; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 3882; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3883; MIPS32O0-NEXT: addiu $sp, $sp, -8 3884; MIPS32O0-NEXT: addu $1, $2, $25 3885; MIPS32O0-NEXT: lw $1, %got(y)($1) 3886; MIPS32O0-NEXT: addiu $2, $zero, -4 3887; MIPS32O0-NEXT: and $2, $1, $2 3888; MIPS32O0-NEXT: andi $1, $1, 3 3889; MIPS32O0-NEXT: sll $1, $1, 3 3890; MIPS32O0-NEXT: ori $3, $zero, 255 3891; MIPS32O0-NEXT: sllv $3, $3, $1 3892; MIPS32O0-NEXT: nor $5, $zero, $3 3893; MIPS32O0-NEXT: sllv $4, $4, $1 3894; MIPS32O0-NEXT: $BB11_1: # %entry 3895; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 3896; MIPS32O0-NEXT: ll $7, 0($2) 3897; MIPS32O0-NEXT: and $8, $4, $3 3898; MIPS32O0-NEXT: and $9, $7, $5 3899; MIPS32O0-NEXT: or $9, $9, $8 3900; MIPS32O0-NEXT: sc $9, 0($2) 3901; MIPS32O0-NEXT: beqz $9, $BB11_1 3902; MIPS32O0-NEXT: nop 3903; MIPS32O0-NEXT: # %bb.2: # %entry 3904; MIPS32O0-NEXT: and $6, $7, $3 3905; MIPS32O0-NEXT: srlv $6, $6, $1 3906; MIPS32O0-NEXT: sll $6, $6, 24 3907; MIPS32O0-NEXT: sra $6, $6, 24 3908; MIPS32O0-NEXT: # %bb.3: # %entry 3909; MIPS32O0-NEXT: sw $6, 4($sp) # 4-byte Folded Spill 3910; MIPS32O0-NEXT: # %bb.4: # %entry 3911; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 3912; MIPS32O0-NEXT: sll $2, $1, 24 3913; MIPS32O0-NEXT: sra $2, $2, 24 3914; MIPS32O0-NEXT: addiu $sp, $sp, 8 3915; MIPS32O0-NEXT: jr $ra 3916; MIPS32O0-NEXT: nop 3917; 3918; MIPS32R2-LABEL: AtomicSwap8: 3919; MIPS32R2: # %bb.0: # %entry 3920; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 3921; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 3922; MIPS32R2-NEXT: addu $1, $2, $25 3923; MIPS32R2-NEXT: lw $1, %got(y)($1) 3924; MIPS32R2-NEXT: addiu $2, $zero, -4 3925; MIPS32R2-NEXT: and $2, $1, $2 3926; MIPS32R2-NEXT: andi $1, $1, 3 3927; MIPS32R2-NEXT: sll $3, $1, 3 3928; MIPS32R2-NEXT: ori $1, $zero, 255 3929; MIPS32R2-NEXT: sllv $5, $1, $3 3930; MIPS32R2-NEXT: nor $6, $zero, $5 3931; MIPS32R2-NEXT: sllv $4, $4, $3 3932; MIPS32R2-NEXT: $BB11_1: # %entry 3933; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 3934; MIPS32R2-NEXT: ll $7, 0($2) 3935; MIPS32R2-NEXT: and $8, $4, $5 3936; MIPS32R2-NEXT: and $9, $7, $6 3937; MIPS32R2-NEXT: or $9, $9, $8 3938; MIPS32R2-NEXT: sc $9, 0($2) 3939; MIPS32R2-NEXT: beqz $9, $BB11_1 3940; MIPS32R2-NEXT: nop 3941; MIPS32R2-NEXT: # %bb.2: # %entry 3942; MIPS32R2-NEXT: and $1, $7, $5 3943; MIPS32R2-NEXT: srlv $1, $1, $3 3944; MIPS32R2-NEXT: seb $1, $1 3945; MIPS32R2-NEXT: # %bb.3: # %entry 3946; MIPS32R2-NEXT: jr $ra 3947; MIPS32R2-NEXT: seb $2, $1 3948; 3949; MIPS32R6-LABEL: AtomicSwap8: 3950; MIPS32R6: # %bb.0: # %entry 3951; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 3952; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 3953; MIPS32R6-NEXT: addu $1, $2, $25 3954; MIPS32R6-NEXT: lw $1, %got(y)($1) 3955; MIPS32R6-NEXT: addiu $2, $zero, -4 3956; MIPS32R6-NEXT: and $2, $1, $2 3957; MIPS32R6-NEXT: andi $1, $1, 3 3958; MIPS32R6-NEXT: sll $3, $1, 3 3959; MIPS32R6-NEXT: ori $1, $zero, 255 3960; MIPS32R6-NEXT: sllv $5, $1, $3 3961; MIPS32R6-NEXT: nor $6, $zero, $5 3962; MIPS32R6-NEXT: sllv $4, $4, $3 3963; MIPS32R6-NEXT: $BB11_1: # %entry 3964; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 3965; MIPS32R6-NEXT: ll $7, 0($2) 3966; MIPS32R6-NEXT: and $8, $4, $5 3967; MIPS32R6-NEXT: and $9, $7, $6 3968; MIPS32R6-NEXT: or $9, $9, $8 3969; MIPS32R6-NEXT: sc $9, 0($2) 3970; MIPS32R6-NEXT: beqzc $9, $BB11_1 3971; MIPS32R6-NEXT: # %bb.2: # %entry 3972; MIPS32R6-NEXT: and $1, $7, $5 3973; MIPS32R6-NEXT: srlv $1, $1, $3 3974; MIPS32R6-NEXT: seb $1, $1 3975; MIPS32R6-NEXT: # %bb.3: # %entry 3976; MIPS32R6-NEXT: jr $ra 3977; MIPS32R6-NEXT: seb $2, $1 3978; 3979; MIPS32R6O0-LABEL: AtomicSwap8: 3980; MIPS32R6O0: # %bb.0: # %entry 3981; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 3982; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3983; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 3984; MIPS32R6O0-NEXT: addu $1, $2, $25 3985; MIPS32R6O0-NEXT: move $2, $4 3986; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 3987; MIPS32R6O0-NEXT: addiu $3, $zero, -4 3988; MIPS32R6O0-NEXT: and $3, $1, $3 3989; MIPS32R6O0-NEXT: andi $1, $1, 3 3990; MIPS32R6O0-NEXT: sll $1, $1, 3 3991; MIPS32R6O0-NEXT: ori $5, $zero, 255 3992; MIPS32R6O0-NEXT: sllv $5, $5, $1 3993; MIPS32R6O0-NEXT: nor $6, $zero, $5 3994; MIPS32R6O0-NEXT: sllv $4, $4, $1 3995; MIPS32R6O0-NEXT: $BB11_1: # %entry 3996; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3997; MIPS32R6O0-NEXT: ll $8, 0($3) 3998; MIPS32R6O0-NEXT: and $9, $4, $5 3999; MIPS32R6O0-NEXT: and $10, $8, $6 4000; MIPS32R6O0-NEXT: or $10, $10, $9 4001; MIPS32R6O0-NEXT: sc $10, 0($3) 4002; MIPS32R6O0-NEXT: beqzc $10, $BB11_1 4003; MIPS32R6O0-NEXT: # %bb.2: # %entry 4004; MIPS32R6O0-NEXT: and $7, $8, $5 4005; MIPS32R6O0-NEXT: srlv $7, $7, $1 4006; MIPS32R6O0-NEXT: seb $7, $7 4007; MIPS32R6O0-NEXT: # %bb.3: # %entry 4008; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 4009; MIPS32R6O0-NEXT: sw $7, 0($sp) # 4-byte Folded Spill 4010; MIPS32R6O0-NEXT: # %bb.4: # %entry 4011; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 4012; MIPS32R6O0-NEXT: seb $2, $1 4013; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 4014; MIPS32R6O0-NEXT: jrc $ra 4015; 4016; MIPS4-LABEL: AtomicSwap8: 4017; MIPS4: # %bb.0: # %entry 4018; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4019; MIPS4-NEXT: daddu $1, $1, $25 4020; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4021; MIPS4-NEXT: ld $1, %got_disp(y)($1) 4022; MIPS4-NEXT: daddiu $2, $zero, -4 4023; MIPS4-NEXT: and $2, $1, $2 4024; MIPS4-NEXT: andi $1, $1, 3 4025; MIPS4-NEXT: sll $3, $1, 3 4026; MIPS4-NEXT: ori $1, $zero, 255 4027; MIPS4-NEXT: sllv $5, $1, $3 4028; MIPS4-NEXT: nor $6, $zero, $5 4029; MIPS4-NEXT: sllv $4, $4, $3 4030; MIPS4-NEXT: .LBB11_1: # %entry 4031; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 4032; MIPS4-NEXT: ll $7, 0($2) 4033; MIPS4-NEXT: and $8, $4, $5 4034; MIPS4-NEXT: and $9, $7, $6 4035; MIPS4-NEXT: or $9, $9, $8 4036; MIPS4-NEXT: sc $9, 0($2) 4037; MIPS4-NEXT: beqz $9, .LBB11_1 4038; MIPS4-NEXT: nop 4039; MIPS4-NEXT: # %bb.2: # %entry 4040; MIPS4-NEXT: and $1, $7, $5 4041; MIPS4-NEXT: srlv $1, $1, $3 4042; MIPS4-NEXT: sll $1, $1, 24 4043; MIPS4-NEXT: sra $1, $1, 24 4044; MIPS4-NEXT: # %bb.3: # %entry 4045; MIPS4-NEXT: sll $1, $1, 24 4046; MIPS4-NEXT: jr $ra 4047; MIPS4-NEXT: sra $2, $1, 24 4048; 4049; MIPS64-LABEL: AtomicSwap8: 4050; MIPS64: # %bb.0: # %entry 4051; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4052; MIPS64-NEXT: daddu $1, $1, $25 4053; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4054; MIPS64-NEXT: ld $1, %got_disp(y)($1) 4055; MIPS64-NEXT: daddiu $2, $zero, -4 4056; MIPS64-NEXT: and $2, $1, $2 4057; MIPS64-NEXT: andi $1, $1, 3 4058; MIPS64-NEXT: sll $3, $1, 3 4059; MIPS64-NEXT: ori $1, $zero, 255 4060; MIPS64-NEXT: sllv $5, $1, $3 4061; MIPS64-NEXT: nor $6, $zero, $5 4062; MIPS64-NEXT: sllv $4, $4, $3 4063; MIPS64-NEXT: .LBB11_1: # %entry 4064; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 4065; MIPS64-NEXT: ll $7, 0($2) 4066; MIPS64-NEXT: and $8, $4, $5 4067; MIPS64-NEXT: and $9, $7, $6 4068; MIPS64-NEXT: or $9, $9, $8 4069; MIPS64-NEXT: sc $9, 0($2) 4070; MIPS64-NEXT: beqz $9, .LBB11_1 4071; MIPS64-NEXT: nop 4072; MIPS64-NEXT: # %bb.2: # %entry 4073; MIPS64-NEXT: and $1, $7, $5 4074; MIPS64-NEXT: srlv $1, $1, $3 4075; MIPS64-NEXT: sll $1, $1, 24 4076; MIPS64-NEXT: sra $1, $1, 24 4077; MIPS64-NEXT: # %bb.3: # %entry 4078; MIPS64-NEXT: sll $1, $1, 24 4079; MIPS64-NEXT: jr $ra 4080; MIPS64-NEXT: sra $2, $1, 24 4081; 4082; MIPS64R2-LABEL: AtomicSwap8: 4083; MIPS64R2: # %bb.0: # %entry 4084; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4085; MIPS64R2-NEXT: daddu $1, $1, $25 4086; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4087; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 4088; MIPS64R2-NEXT: daddiu $2, $zero, -4 4089; MIPS64R2-NEXT: and $2, $1, $2 4090; MIPS64R2-NEXT: andi $1, $1, 3 4091; MIPS64R2-NEXT: sll $3, $1, 3 4092; MIPS64R2-NEXT: ori $1, $zero, 255 4093; MIPS64R2-NEXT: sllv $5, $1, $3 4094; MIPS64R2-NEXT: nor $6, $zero, $5 4095; MIPS64R2-NEXT: sllv $4, $4, $3 4096; MIPS64R2-NEXT: .LBB11_1: # %entry 4097; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 4098; MIPS64R2-NEXT: ll $7, 0($2) 4099; MIPS64R2-NEXT: and $8, $4, $5 4100; MIPS64R2-NEXT: and $9, $7, $6 4101; MIPS64R2-NEXT: or $9, $9, $8 4102; MIPS64R2-NEXT: sc $9, 0($2) 4103; MIPS64R2-NEXT: beqz $9, .LBB11_1 4104; MIPS64R2-NEXT: nop 4105; MIPS64R2-NEXT: # %bb.2: # %entry 4106; MIPS64R2-NEXT: and $1, $7, $5 4107; MIPS64R2-NEXT: srlv $1, $1, $3 4108; MIPS64R2-NEXT: seb $1, $1 4109; MIPS64R2-NEXT: # %bb.3: # %entry 4110; MIPS64R2-NEXT: jr $ra 4111; MIPS64R2-NEXT: seb $2, $1 4112; 4113; MIPS64R6-LABEL: AtomicSwap8: 4114; MIPS64R6: # %bb.0: # %entry 4115; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4116; MIPS64R6-NEXT: daddu $1, $1, $25 4117; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4118; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 4119; MIPS64R6-NEXT: daddiu $2, $zero, -4 4120; MIPS64R6-NEXT: and $2, $1, $2 4121; MIPS64R6-NEXT: andi $1, $1, 3 4122; MIPS64R6-NEXT: sll $3, $1, 3 4123; MIPS64R6-NEXT: ori $1, $zero, 255 4124; MIPS64R6-NEXT: sllv $5, $1, $3 4125; MIPS64R6-NEXT: nor $6, $zero, $5 4126; MIPS64R6-NEXT: sllv $4, $4, $3 4127; MIPS64R6-NEXT: .LBB11_1: # %entry 4128; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 4129; MIPS64R6-NEXT: ll $7, 0($2) 4130; MIPS64R6-NEXT: and $8, $4, $5 4131; MIPS64R6-NEXT: and $9, $7, $6 4132; MIPS64R6-NEXT: or $9, $9, $8 4133; MIPS64R6-NEXT: sc $9, 0($2) 4134; MIPS64R6-NEXT: beqzc $9, .LBB11_1 4135; MIPS64R6-NEXT: # %bb.2: # %entry 4136; MIPS64R6-NEXT: and $1, $7, $5 4137; MIPS64R6-NEXT: srlv $1, $1, $3 4138; MIPS64R6-NEXT: seb $1, $1 4139; MIPS64R6-NEXT: # %bb.3: # %entry 4140; MIPS64R6-NEXT: jr $ra 4141; MIPS64R6-NEXT: seb $2, $1 4142; 4143; MIPS64R6O0-LABEL: AtomicSwap8: 4144; MIPS64R6O0: # %bb.0: # %entry 4145; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 4146; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4147; MIPS64R6O0-NEXT: daddu $1, $1, $25 4148; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4149; MIPS64R6O0-NEXT: move $2, $4 4150; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 4151; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 4152; MIPS64R6O0-NEXT: and $3, $1, $3 4153; MIPS64R6O0-NEXT: andi $5, $1, 3 4154; MIPS64R6O0-NEXT: xori $5, $5, 3 4155; MIPS64R6O0-NEXT: sll $5, $5, 3 4156; MIPS64R6O0-NEXT: ori $6, $zero, 255 4157; MIPS64R6O0-NEXT: sllv $6, $6, $5 4158; MIPS64R6O0-NEXT: nor $7, $zero, $6 4159; MIPS64R6O0-NEXT: sllv $2, $2, $5 4160; MIPS64R6O0-NEXT: .LBB11_1: # %entry 4161; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4162; MIPS64R6O0-NEXT: ll $9, 0($3) 4163; MIPS64R6O0-NEXT: and $10, $2, $6 4164; MIPS64R6O0-NEXT: and $11, $9, $7 4165; MIPS64R6O0-NEXT: or $11, $11, $10 4166; MIPS64R6O0-NEXT: sc $11, 0($3) 4167; MIPS64R6O0-NEXT: beqzc $11, .LBB11_1 4168; MIPS64R6O0-NEXT: # %bb.2: # %entry 4169; MIPS64R6O0-NEXT: and $8, $9, $6 4170; MIPS64R6O0-NEXT: srlv $8, $8, $5 4171; MIPS64R6O0-NEXT: seb $8, $8 4172; MIPS64R6O0-NEXT: # %bb.3: # %entry 4173; MIPS64R6O0-NEXT: sw $8, 12($sp) # 4-byte Folded Spill 4174; MIPS64R6O0-NEXT: # %bb.4: # %entry 4175; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 4176; MIPS64R6O0-NEXT: seb $2, $1 4177; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 4178; MIPS64R6O0-NEXT: jrc $ra 4179; 4180; MM32-LABEL: AtomicSwap8: 4181; MM32: # %bb.0: # %entry 4182; MM32-NEXT: lui $2, %hi(_gp_disp) 4183; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 4184; MM32-NEXT: addu $2, $2, $25 4185; MM32-NEXT: lw $1, %got(y)($2) 4186; MM32-NEXT: addiu $2, $zero, -4 4187; MM32-NEXT: and $2, $1, $2 4188; MM32-NEXT: andi $1, $1, 3 4189; MM32-NEXT: sll $3, $1, 3 4190; MM32-NEXT: ori $1, $zero, 255 4191; MM32-NEXT: sllv $5, $1, $3 4192; MM32-NEXT: nor $6, $zero, $5 4193; MM32-NEXT: sllv $4, $4, $3 4194; MM32-NEXT: $BB11_1: # %entry 4195; MM32-NEXT: # =>This Inner Loop Header: Depth=1 4196; MM32-NEXT: ll $7, 0($2) 4197; MM32-NEXT: and $8, $4, $5 4198; MM32-NEXT: and $9, $7, $6 4199; MM32-NEXT: or $9, $9, $8 4200; MM32-NEXT: sc $9, 0($2) 4201; MM32-NEXT: beqzc $9, $BB11_1 4202; MM32-NEXT: # %bb.2: # %entry 4203; MM32-NEXT: and $1, $7, $5 4204; MM32-NEXT: srlv $1, $1, $3 4205; MM32-NEXT: seb $1, $1 4206; MM32-NEXT: # %bb.3: # %entry 4207; MM32-NEXT: jr $ra 4208; MM32-NEXT: seb $2, $1 4209; 4210; O1-LABEL: AtomicSwap8: 4211; O1: # %bb.0: # %entry 4212; O1-NEXT: lui $2, %hi(_gp_disp) 4213; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 4214; O1-NEXT: addu $1, $2, $25 4215; O1-NEXT: lw $1, %got(y)($1) 4216; O1-NEXT: addiu $2, $zero, -4 4217; O1-NEXT: and $2, $1, $2 4218; O1-NEXT: andi $1, $1, 3 4219; O1-NEXT: sll $3, $1, 3 4220; O1-NEXT: ori $1, $zero, 255 4221; O1-NEXT: sllv $5, $1, $3 4222; O1-NEXT: nor $6, $zero, $5 4223; O1-NEXT: sllv $4, $4, $3 4224; O1-NEXT: $BB11_1: # %entry 4225; O1-NEXT: # =>This Inner Loop Header: Depth=1 4226; O1-NEXT: ll $7, 0($2) 4227; O1-NEXT: and $8, $4, $5 4228; O1-NEXT: and $9, $7, $6 4229; O1-NEXT: or $9, $9, $8 4230; O1-NEXT: sc $9, 0($2) 4231; O1-NEXT: beqz $9, $BB11_1 4232; O1-NEXT: nop 4233; O1-NEXT: # %bb.2: # %entry 4234; O1-NEXT: and $1, $7, $5 4235; O1-NEXT: srlv $1, $1, $3 4236; O1-NEXT: sll $1, $1, 24 4237; O1-NEXT: sra $1, $1, 24 4238; O1-NEXT: # %bb.3: # %entry 4239; O1-NEXT: sll $1, $1, 24 4240; O1-NEXT: jr $ra 4241; O1-NEXT: sra $2, $1, 24 4242; 4243; O2-LABEL: AtomicSwap8: 4244; O2: # %bb.0: # %entry 4245; O2-NEXT: lui $2, %hi(_gp_disp) 4246; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 4247; O2-NEXT: addu $1, $2, $25 4248; O2-NEXT: lw $1, %got(y)($1) 4249; O2-NEXT: addiu $2, $zero, -4 4250; O2-NEXT: and $2, $1, $2 4251; O2-NEXT: andi $1, $1, 3 4252; O2-NEXT: sll $3, $1, 3 4253; O2-NEXT: ori $1, $zero, 255 4254; O2-NEXT: sllv $5, $1, $3 4255; O2-NEXT: nor $6, $zero, $5 4256; O2-NEXT: sllv $4, $4, $3 4257; O2-NEXT: $BB11_1: # %entry 4258; O2-NEXT: # =>This Inner Loop Header: Depth=1 4259; O2-NEXT: ll $7, 0($2) 4260; O2-NEXT: and $8, $4, $5 4261; O2-NEXT: and $9, $7, $6 4262; O2-NEXT: or $9, $9, $8 4263; O2-NEXT: sc $9, 0($2) 4264; O2-NEXT: beqz $9, $BB11_1 4265; O2-NEXT: nop 4266; O2-NEXT: # %bb.2: # %entry 4267; O2-NEXT: and $1, $7, $5 4268; O2-NEXT: srlv $1, $1, $3 4269; O2-NEXT: sll $1, $1, 24 4270; O2-NEXT: sra $1, $1, 24 4271; O2-NEXT: # %bb.3: # %entry 4272; O2-NEXT: sll $1, $1, 24 4273; O2-NEXT: jr $ra 4274; O2-NEXT: sra $2, $1, 24 4275; 4276; O3-LABEL: AtomicSwap8: 4277; O3: # %bb.0: # %entry 4278; O3-NEXT: lui $2, %hi(_gp_disp) 4279; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 4280; O3-NEXT: addu $1, $2, $25 4281; O3-NEXT: addiu $2, $zero, -4 4282; O3-NEXT: lw $1, %got(y)($1) 4283; O3-NEXT: and $2, $1, $2 4284; O3-NEXT: andi $1, $1, 3 4285; O3-NEXT: sll $3, $1, 3 4286; O3-NEXT: ori $1, $zero, 255 4287; O3-NEXT: sllv $5, $1, $3 4288; O3-NEXT: sllv $4, $4, $3 4289; O3-NEXT: nor $6, $zero, $5 4290; O3-NEXT: $BB11_1: # %entry 4291; O3-NEXT: # =>This Inner Loop Header: Depth=1 4292; O3-NEXT: ll $7, 0($2) 4293; O3-NEXT: and $8, $4, $5 4294; O3-NEXT: and $9, $7, $6 4295; O3-NEXT: or $9, $9, $8 4296; O3-NEXT: sc $9, 0($2) 4297; O3-NEXT: beqz $9, $BB11_1 4298; O3-NEXT: nop 4299; O3-NEXT: # %bb.2: # %entry 4300; O3-NEXT: and $1, $7, $5 4301; O3-NEXT: srlv $1, $1, $3 4302; O3-NEXT: sll $1, $1, 24 4303; O3-NEXT: sra $1, $1, 24 4304; O3-NEXT: # %bb.3: # %entry 4305; O3-NEXT: sll $1, $1, 24 4306; O3-NEXT: jr $ra 4307; O3-NEXT: sra $2, $1, 24 4308; 4309; MIPS32EB-LABEL: AtomicSwap8: 4310; MIPS32EB: # %bb.0: # %entry 4311; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 4312; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 4313; MIPS32EB-NEXT: addu $1, $2, $25 4314; MIPS32EB-NEXT: lw $1, %got(y)($1) 4315; MIPS32EB-NEXT: addiu $2, $zero, -4 4316; MIPS32EB-NEXT: and $2, $1, $2 4317; MIPS32EB-NEXT: andi $1, $1, 3 4318; MIPS32EB-NEXT: xori $1, $1, 3 4319; MIPS32EB-NEXT: sll $3, $1, 3 4320; MIPS32EB-NEXT: ori $1, $zero, 255 4321; MIPS32EB-NEXT: sllv $5, $1, $3 4322; MIPS32EB-NEXT: nor $6, $zero, $5 4323; MIPS32EB-NEXT: sllv $4, $4, $3 4324; MIPS32EB-NEXT: $BB11_1: # %entry 4325; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 4326; MIPS32EB-NEXT: ll $7, 0($2) 4327; MIPS32EB-NEXT: and $8, $4, $5 4328; MIPS32EB-NEXT: and $9, $7, $6 4329; MIPS32EB-NEXT: or $9, $9, $8 4330; MIPS32EB-NEXT: sc $9, 0($2) 4331; MIPS32EB-NEXT: beqz $9, $BB11_1 4332; MIPS32EB-NEXT: nop 4333; MIPS32EB-NEXT: # %bb.2: # %entry 4334; MIPS32EB-NEXT: and $1, $7, $5 4335; MIPS32EB-NEXT: srlv $1, $1, $3 4336; MIPS32EB-NEXT: sll $1, $1, 24 4337; MIPS32EB-NEXT: sra $1, $1, 24 4338; MIPS32EB-NEXT: # %bb.3: # %entry 4339; MIPS32EB-NEXT: sll $1, $1, 24 4340; MIPS32EB-NEXT: jr $ra 4341; MIPS32EB-NEXT: sra $2, $1, 24 4342entry: 4343 %0 = atomicrmw xchg i8* @y, i8 %newval monotonic 4344 ret i8 %0 4345} 4346 4347define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind { 4348; MIPS32-LABEL: AtomicCmpSwap8: 4349; MIPS32: # %bb.0: # %entry 4350; MIPS32-NEXT: lui $2, %hi(_gp_disp) 4351; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 4352; MIPS32-NEXT: addu $1, $2, $25 4353; MIPS32-NEXT: lw $1, %got(y)($1) 4354; MIPS32-NEXT: addiu $2, $zero, -4 4355; MIPS32-NEXT: and $2, $1, $2 4356; MIPS32-NEXT: andi $1, $1, 3 4357; MIPS32-NEXT: sll $3, $1, 3 4358; MIPS32-NEXT: ori $1, $zero, 255 4359; MIPS32-NEXT: sllv $6, $1, $3 4360; MIPS32-NEXT: nor $7, $zero, $6 4361; MIPS32-NEXT: andi $1, $4, 255 4362; MIPS32-NEXT: sllv $4, $1, $3 4363; MIPS32-NEXT: andi $1, $5, 255 4364; MIPS32-NEXT: sllv $5, $1, $3 4365; MIPS32-NEXT: $BB12_1: # %entry 4366; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 4367; MIPS32-NEXT: ll $8, 0($2) 4368; MIPS32-NEXT: and $9, $8, $6 4369; MIPS32-NEXT: bne $9, $4, $BB12_3 4370; MIPS32-NEXT: nop 4371; MIPS32-NEXT: # %bb.2: # %entry 4372; MIPS32-NEXT: # in Loop: Header=BB12_1 Depth=1 4373; MIPS32-NEXT: and $8, $8, $7 4374; MIPS32-NEXT: or $8, $8, $5 4375; MIPS32-NEXT: sc $8, 0($2) 4376; MIPS32-NEXT: beqz $8, $BB12_1 4377; MIPS32-NEXT: nop 4378; MIPS32-NEXT: $BB12_3: # %entry 4379; MIPS32-NEXT: srlv $1, $9, $3 4380; MIPS32-NEXT: sll $1, $1, 24 4381; MIPS32-NEXT: sra $1, $1, 24 4382; MIPS32-NEXT: # %bb.4: # %entry 4383; MIPS32-NEXT: sll $1, $1, 24 4384; MIPS32-NEXT: jr $ra 4385; MIPS32-NEXT: sra $2, $1, 24 4386; 4387; MIPS32O0-LABEL: AtomicCmpSwap8: 4388; MIPS32O0: # %bb.0: # %entry 4389; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 4390; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 4391; MIPS32O0-NEXT: addiu $sp, $sp, -8 4392; MIPS32O0-NEXT: addu $1, $2, $25 4393; MIPS32O0-NEXT: lw $1, %got(y)($1) 4394; MIPS32O0-NEXT: addiu $2, $zero, -4 4395; MIPS32O0-NEXT: and $2, $1, $2 4396; MIPS32O0-NEXT: andi $1, $1, 3 4397; MIPS32O0-NEXT: sll $1, $1, 3 4398; MIPS32O0-NEXT: ori $3, $zero, 255 4399; MIPS32O0-NEXT: sllv $3, $3, $1 4400; MIPS32O0-NEXT: nor $6, $zero, $3 4401; MIPS32O0-NEXT: andi $4, $4, 255 4402; MIPS32O0-NEXT: sllv $4, $4, $1 4403; MIPS32O0-NEXT: andi $5, $5, 255 4404; MIPS32O0-NEXT: sllv $5, $5, $1 4405; MIPS32O0-NEXT: $BB12_1: # %entry 4406; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 4407; MIPS32O0-NEXT: ll $8, 0($2) 4408; MIPS32O0-NEXT: and $9, $8, $3 4409; MIPS32O0-NEXT: bne $9, $4, $BB12_3 4410; MIPS32O0-NEXT: nop 4411; MIPS32O0-NEXT: # %bb.2: # %entry 4412; MIPS32O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4413; MIPS32O0-NEXT: and $8, $8, $6 4414; MIPS32O0-NEXT: or $8, $8, $5 4415; MIPS32O0-NEXT: sc $8, 0($2) 4416; MIPS32O0-NEXT: beqz $8, $BB12_1 4417; MIPS32O0-NEXT: nop 4418; MIPS32O0-NEXT: $BB12_3: # %entry 4419; MIPS32O0-NEXT: srlv $7, $9, $1 4420; MIPS32O0-NEXT: sll $7, $7, 24 4421; MIPS32O0-NEXT: sra $7, $7, 24 4422; MIPS32O0-NEXT: # %bb.4: # %entry 4423; MIPS32O0-NEXT: sw $7, 4($sp) # 4-byte Folded Spill 4424; MIPS32O0-NEXT: # %bb.5: # %entry 4425; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 4426; MIPS32O0-NEXT: sll $2, $1, 24 4427; MIPS32O0-NEXT: sra $2, $2, 24 4428; MIPS32O0-NEXT: addiu $sp, $sp, 8 4429; MIPS32O0-NEXT: jr $ra 4430; MIPS32O0-NEXT: nop 4431; 4432; MIPS32R2-LABEL: AtomicCmpSwap8: 4433; MIPS32R2: # %bb.0: # %entry 4434; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 4435; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 4436; MIPS32R2-NEXT: addu $1, $2, $25 4437; MIPS32R2-NEXT: lw $1, %got(y)($1) 4438; MIPS32R2-NEXT: addiu $2, $zero, -4 4439; MIPS32R2-NEXT: and $3, $1, $2 4440; MIPS32R2-NEXT: andi $1, $1, 3 4441; MIPS32R2-NEXT: sll $1, $1, 3 4442; MIPS32R2-NEXT: ori $2, $zero, 255 4443; MIPS32R2-NEXT: sllv $6, $2, $1 4444; MIPS32R2-NEXT: nor $7, $zero, $6 4445; MIPS32R2-NEXT: andi $2, $4, 255 4446; MIPS32R2-NEXT: sllv $4, $2, $1 4447; MIPS32R2-NEXT: andi $2, $5, 255 4448; MIPS32R2-NEXT: sllv $5, $2, $1 4449; MIPS32R2-NEXT: $BB12_1: # %entry 4450; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 4451; MIPS32R2-NEXT: ll $8, 0($3) 4452; MIPS32R2-NEXT: and $9, $8, $6 4453; MIPS32R2-NEXT: bne $9, $4, $BB12_3 4454; MIPS32R2-NEXT: nop 4455; MIPS32R2-NEXT: # %bb.2: # %entry 4456; MIPS32R2-NEXT: # in Loop: Header=BB12_1 Depth=1 4457; MIPS32R2-NEXT: and $8, $8, $7 4458; MIPS32R2-NEXT: or $8, $8, $5 4459; MIPS32R2-NEXT: sc $8, 0($3) 4460; MIPS32R2-NEXT: beqz $8, $BB12_1 4461; MIPS32R2-NEXT: nop 4462; MIPS32R2-NEXT: $BB12_3: # %entry 4463; MIPS32R2-NEXT: srlv $2, $9, $1 4464; MIPS32R2-NEXT: seb $2, $2 4465; MIPS32R2-NEXT: # %bb.4: # %entry 4466; MIPS32R2-NEXT: jr $ra 4467; MIPS32R2-NEXT: nop 4468; 4469; MIPS32R6-LABEL: AtomicCmpSwap8: 4470; MIPS32R6: # %bb.0: # %entry 4471; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 4472; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 4473; MIPS32R6-NEXT: addu $1, $2, $25 4474; MIPS32R6-NEXT: lw $1, %got(y)($1) 4475; MIPS32R6-NEXT: addiu $2, $zero, -4 4476; MIPS32R6-NEXT: and $3, $1, $2 4477; MIPS32R6-NEXT: andi $1, $1, 3 4478; MIPS32R6-NEXT: sll $1, $1, 3 4479; MIPS32R6-NEXT: ori $2, $zero, 255 4480; MIPS32R6-NEXT: sllv $6, $2, $1 4481; MIPS32R6-NEXT: nor $7, $zero, $6 4482; MIPS32R6-NEXT: andi $2, $4, 255 4483; MIPS32R6-NEXT: sllv $4, $2, $1 4484; MIPS32R6-NEXT: andi $2, $5, 255 4485; MIPS32R6-NEXT: sllv $5, $2, $1 4486; MIPS32R6-NEXT: $BB12_1: # %entry 4487; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 4488; MIPS32R6-NEXT: ll $8, 0($3) 4489; MIPS32R6-NEXT: and $9, $8, $6 4490; MIPS32R6-NEXT: bnec $9, $4, $BB12_3 4491; MIPS32R6-NEXT: # %bb.2: # %entry 4492; MIPS32R6-NEXT: # in Loop: Header=BB12_1 Depth=1 4493; MIPS32R6-NEXT: and $8, $8, $7 4494; MIPS32R6-NEXT: or $8, $8, $5 4495; MIPS32R6-NEXT: sc $8, 0($3) 4496; MIPS32R6-NEXT: beqzc $8, $BB12_1 4497; MIPS32R6-NEXT: $BB12_3: # %entry 4498; MIPS32R6-NEXT: srlv $2, $9, $1 4499; MIPS32R6-NEXT: seb $2, $2 4500; MIPS32R6-NEXT: # %bb.4: # %entry 4501; MIPS32R6-NEXT: jrc $ra 4502; 4503; MIPS32R6O0-LABEL: AtomicCmpSwap8: 4504; MIPS32R6O0: # %bb.0: # %entry 4505; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 4506; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 4507; MIPS32R6O0-NEXT: addiu $sp, $sp, -16 4508; MIPS32R6O0-NEXT: addu $1, $2, $25 4509; MIPS32R6O0-NEXT: move $2, $5 4510; MIPS32R6O0-NEXT: move $3, $4 4511; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 4512; MIPS32R6O0-NEXT: addiu $6, $zero, -4 4513; MIPS32R6O0-NEXT: and $6, $1, $6 4514; MIPS32R6O0-NEXT: andi $1, $1, 3 4515; MIPS32R6O0-NEXT: sll $1, $1, 3 4516; MIPS32R6O0-NEXT: ori $7, $zero, 255 4517; MIPS32R6O0-NEXT: sllv $7, $7, $1 4518; MIPS32R6O0-NEXT: nor $8, $zero, $7 4519; MIPS32R6O0-NEXT: andi $4, $4, 255 4520; MIPS32R6O0-NEXT: sllv $4, $4, $1 4521; MIPS32R6O0-NEXT: andi $5, $5, 255 4522; MIPS32R6O0-NEXT: sllv $5, $5, $1 4523; MIPS32R6O0-NEXT: $BB12_1: # %entry 4524; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4525; MIPS32R6O0-NEXT: ll $10, 0($6) 4526; MIPS32R6O0-NEXT: and $11, $10, $7 4527; MIPS32R6O0-NEXT: bnec $11, $4, $BB12_3 4528; MIPS32R6O0-NEXT: # %bb.2: # %entry 4529; MIPS32R6O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4530; MIPS32R6O0-NEXT: and $10, $10, $8 4531; MIPS32R6O0-NEXT: or $10, $10, $5 4532; MIPS32R6O0-NEXT: sc $10, 0($6) 4533; MIPS32R6O0-NEXT: beqzc $10, $BB12_1 4534; MIPS32R6O0-NEXT: $BB12_3: # %entry 4535; MIPS32R6O0-NEXT: srlv $9, $11, $1 4536; MIPS32R6O0-NEXT: seb $9, $9 4537; MIPS32R6O0-NEXT: # %bb.4: # %entry 4538; MIPS32R6O0-NEXT: sw $2, 12($sp) # 4-byte Folded Spill 4539; MIPS32R6O0-NEXT: sw $3, 8($sp) # 4-byte Folded Spill 4540; MIPS32R6O0-NEXT: sw $9, 4($sp) # 4-byte Folded Spill 4541; MIPS32R6O0-NEXT: # %bb.5: # %entry 4542; MIPS32R6O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 4543; MIPS32R6O0-NEXT: addiu $sp, $sp, 16 4544; MIPS32R6O0-NEXT: jrc $ra 4545; 4546; MIPS4-LABEL: AtomicCmpSwap8: 4547; MIPS4: # %bb.0: # %entry 4548; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4549; MIPS4-NEXT: daddu $1, $1, $25 4550; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4551; MIPS4-NEXT: ld $1, %got_disp(y)($1) 4552; MIPS4-NEXT: daddiu $2, $zero, -4 4553; MIPS4-NEXT: and $2, $1, $2 4554; MIPS4-NEXT: andi $1, $1, 3 4555; MIPS4-NEXT: sll $3, $1, 3 4556; MIPS4-NEXT: ori $1, $zero, 255 4557; MIPS4-NEXT: sllv $6, $1, $3 4558; MIPS4-NEXT: nor $7, $zero, $6 4559; MIPS4-NEXT: andi $1, $4, 255 4560; MIPS4-NEXT: sllv $4, $1, $3 4561; MIPS4-NEXT: andi $1, $5, 255 4562; MIPS4-NEXT: sllv $5, $1, $3 4563; MIPS4-NEXT: .LBB12_1: # %entry 4564; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 4565; MIPS4-NEXT: ll $8, 0($2) 4566; MIPS4-NEXT: and $9, $8, $6 4567; MIPS4-NEXT: bne $9, $4, .LBB12_3 4568; MIPS4-NEXT: nop 4569; MIPS4-NEXT: # %bb.2: # %entry 4570; MIPS4-NEXT: # in Loop: Header=BB12_1 Depth=1 4571; MIPS4-NEXT: and $8, $8, $7 4572; MIPS4-NEXT: or $8, $8, $5 4573; MIPS4-NEXT: sc $8, 0($2) 4574; MIPS4-NEXT: beqz $8, .LBB12_1 4575; MIPS4-NEXT: nop 4576; MIPS4-NEXT: .LBB12_3: # %entry 4577; MIPS4-NEXT: srlv $1, $9, $3 4578; MIPS4-NEXT: sll $1, $1, 24 4579; MIPS4-NEXT: sra $1, $1, 24 4580; MIPS4-NEXT: # %bb.4: # %entry 4581; MIPS4-NEXT: sll $1, $1, 24 4582; MIPS4-NEXT: jr $ra 4583; MIPS4-NEXT: sra $2, $1, 24 4584; 4585; MIPS64-LABEL: AtomicCmpSwap8: 4586; MIPS64: # %bb.0: # %entry 4587; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4588; MIPS64-NEXT: daddu $1, $1, $25 4589; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4590; MIPS64-NEXT: ld $1, %got_disp(y)($1) 4591; MIPS64-NEXT: daddiu $2, $zero, -4 4592; MIPS64-NEXT: and $2, $1, $2 4593; MIPS64-NEXT: andi $1, $1, 3 4594; MIPS64-NEXT: sll $3, $1, 3 4595; MIPS64-NEXT: ori $1, $zero, 255 4596; MIPS64-NEXT: sllv $6, $1, $3 4597; MIPS64-NEXT: nor $7, $zero, $6 4598; MIPS64-NEXT: andi $1, $4, 255 4599; MIPS64-NEXT: sllv $4, $1, $3 4600; MIPS64-NEXT: andi $1, $5, 255 4601; MIPS64-NEXT: sllv $5, $1, $3 4602; MIPS64-NEXT: .LBB12_1: # %entry 4603; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 4604; MIPS64-NEXT: ll $8, 0($2) 4605; MIPS64-NEXT: and $9, $8, $6 4606; MIPS64-NEXT: bne $9, $4, .LBB12_3 4607; MIPS64-NEXT: nop 4608; MIPS64-NEXT: # %bb.2: # %entry 4609; MIPS64-NEXT: # in Loop: Header=BB12_1 Depth=1 4610; MIPS64-NEXT: and $8, $8, $7 4611; MIPS64-NEXT: or $8, $8, $5 4612; MIPS64-NEXT: sc $8, 0($2) 4613; MIPS64-NEXT: beqz $8, .LBB12_1 4614; MIPS64-NEXT: nop 4615; MIPS64-NEXT: .LBB12_3: # %entry 4616; MIPS64-NEXT: srlv $1, $9, $3 4617; MIPS64-NEXT: sll $1, $1, 24 4618; MIPS64-NEXT: sra $1, $1, 24 4619; MIPS64-NEXT: # %bb.4: # %entry 4620; MIPS64-NEXT: sll $1, $1, 24 4621; MIPS64-NEXT: jr $ra 4622; MIPS64-NEXT: sra $2, $1, 24 4623; 4624; MIPS64R2-LABEL: AtomicCmpSwap8: 4625; MIPS64R2: # %bb.0: # %entry 4626; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4627; MIPS64R2-NEXT: daddu $1, $1, $25 4628; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4629; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 4630; MIPS64R2-NEXT: daddiu $2, $zero, -4 4631; MIPS64R2-NEXT: and $3, $1, $2 4632; MIPS64R2-NEXT: andi $1, $1, 3 4633; MIPS64R2-NEXT: sll $1, $1, 3 4634; MIPS64R2-NEXT: ori $2, $zero, 255 4635; MIPS64R2-NEXT: sllv $6, $2, $1 4636; MIPS64R2-NEXT: nor $7, $zero, $6 4637; MIPS64R2-NEXT: andi $2, $4, 255 4638; MIPS64R2-NEXT: sllv $4, $2, $1 4639; MIPS64R2-NEXT: andi $2, $5, 255 4640; MIPS64R2-NEXT: sllv $5, $2, $1 4641; MIPS64R2-NEXT: .LBB12_1: # %entry 4642; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 4643; MIPS64R2-NEXT: ll $8, 0($3) 4644; MIPS64R2-NEXT: and $9, $8, $6 4645; MIPS64R2-NEXT: bne $9, $4, .LBB12_3 4646; MIPS64R2-NEXT: nop 4647; MIPS64R2-NEXT: # %bb.2: # %entry 4648; MIPS64R2-NEXT: # in Loop: Header=BB12_1 Depth=1 4649; MIPS64R2-NEXT: and $8, $8, $7 4650; MIPS64R2-NEXT: or $8, $8, $5 4651; MIPS64R2-NEXT: sc $8, 0($3) 4652; MIPS64R2-NEXT: beqz $8, .LBB12_1 4653; MIPS64R2-NEXT: nop 4654; MIPS64R2-NEXT: .LBB12_3: # %entry 4655; MIPS64R2-NEXT: srlv $2, $9, $1 4656; MIPS64R2-NEXT: seb $2, $2 4657; MIPS64R2-NEXT: # %bb.4: # %entry 4658; MIPS64R2-NEXT: jr $ra 4659; MIPS64R2-NEXT: nop 4660; 4661; MIPS64R6-LABEL: AtomicCmpSwap8: 4662; MIPS64R6: # %bb.0: # %entry 4663; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4664; MIPS64R6-NEXT: daddu $1, $1, $25 4665; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4666; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 4667; MIPS64R6-NEXT: daddiu $2, $zero, -4 4668; MIPS64R6-NEXT: and $3, $1, $2 4669; MIPS64R6-NEXT: andi $1, $1, 3 4670; MIPS64R6-NEXT: sll $1, $1, 3 4671; MIPS64R6-NEXT: ori $2, $zero, 255 4672; MIPS64R6-NEXT: sllv $6, $2, $1 4673; MIPS64R6-NEXT: nor $7, $zero, $6 4674; MIPS64R6-NEXT: andi $2, $4, 255 4675; MIPS64R6-NEXT: sllv $4, $2, $1 4676; MIPS64R6-NEXT: andi $2, $5, 255 4677; MIPS64R6-NEXT: sllv $5, $2, $1 4678; MIPS64R6-NEXT: .LBB12_1: # %entry 4679; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 4680; MIPS64R6-NEXT: ll $8, 0($3) 4681; MIPS64R6-NEXT: and $9, $8, $6 4682; MIPS64R6-NEXT: bnec $9, $4, .LBB12_3 4683; MIPS64R6-NEXT: # %bb.2: # %entry 4684; MIPS64R6-NEXT: # in Loop: Header=BB12_1 Depth=1 4685; MIPS64R6-NEXT: and $8, $8, $7 4686; MIPS64R6-NEXT: or $8, $8, $5 4687; MIPS64R6-NEXT: sc $8, 0($3) 4688; MIPS64R6-NEXT: beqzc $8, .LBB12_1 4689; MIPS64R6-NEXT: .LBB12_3: # %entry 4690; MIPS64R6-NEXT: srlv $2, $9, $1 4691; MIPS64R6-NEXT: seb $2, $2 4692; MIPS64R6-NEXT: # %bb.4: # %entry 4693; MIPS64R6-NEXT: jrc $ra 4694; 4695; MIPS64R6O0-LABEL: AtomicCmpSwap8: 4696; MIPS64R6O0: # %bb.0: # %entry 4697; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 4698; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4699; MIPS64R6O0-NEXT: daddu $1, $1, $25 4700; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4701; MIPS64R6O0-NEXT: move $2, $5 4702; MIPS64R6O0-NEXT: move $3, $4 4703; MIPS64R6O0-NEXT: ld $1, %got_disp(y)($1) 4704; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 4705; MIPS64R6O0-NEXT: and $4, $1, $4 4706; MIPS64R6O0-NEXT: andi $6, $1, 3 4707; MIPS64R6O0-NEXT: xori $6, $6, 3 4708; MIPS64R6O0-NEXT: sll $6, $6, 3 4709; MIPS64R6O0-NEXT: ori $7, $zero, 255 4710; MIPS64R6O0-NEXT: sllv $7, $7, $6 4711; MIPS64R6O0-NEXT: nor $8, $zero, $7 4712; MIPS64R6O0-NEXT: andi $3, $3, 255 4713; MIPS64R6O0-NEXT: sllv $3, $3, $6 4714; MIPS64R6O0-NEXT: andi $2, $2, 255 4715; MIPS64R6O0-NEXT: sllv $2, $2, $6 4716; MIPS64R6O0-NEXT: .LBB12_1: # %entry 4717; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4718; MIPS64R6O0-NEXT: ll $10, 0($4) 4719; MIPS64R6O0-NEXT: and $11, $10, $7 4720; MIPS64R6O0-NEXT: bnec $11, $3, .LBB12_3 4721; MIPS64R6O0-NEXT: # %bb.2: # %entry 4722; MIPS64R6O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4723; MIPS64R6O0-NEXT: and $10, $10, $8 4724; MIPS64R6O0-NEXT: or $10, $10, $2 4725; MIPS64R6O0-NEXT: sc $10, 0($4) 4726; MIPS64R6O0-NEXT: beqzc $10, .LBB12_1 4727; MIPS64R6O0-NEXT: .LBB12_3: # %entry 4728; MIPS64R6O0-NEXT: srlv $9, $11, $6 4729; MIPS64R6O0-NEXT: seb $9, $9 4730; MIPS64R6O0-NEXT: # %bb.4: # %entry 4731; MIPS64R6O0-NEXT: sw $9, 12($sp) # 4-byte Folded Spill 4732; MIPS64R6O0-NEXT: # %bb.5: # %entry 4733; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 4734; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 4735; MIPS64R6O0-NEXT: jrc $ra 4736; 4737; MM32-LABEL: AtomicCmpSwap8: 4738; MM32: # %bb.0: # %entry 4739; MM32-NEXT: lui $2, %hi(_gp_disp) 4740; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 4741; MM32-NEXT: addu $2, $2, $25 4742; MM32-NEXT: lw $1, %got(y)($2) 4743; MM32-NEXT: addiu $2, $zero, -4 4744; MM32-NEXT: and $3, $1, $2 4745; MM32-NEXT: andi $1, $1, 3 4746; MM32-NEXT: sll $1, $1, 3 4747; MM32-NEXT: ori $2, $zero, 255 4748; MM32-NEXT: sllv $6, $2, $1 4749; MM32-NEXT: nor $7, $zero, $6 4750; MM32-NEXT: andi $2, $4, 255 4751; MM32-NEXT: sllv $4, $2, $1 4752; MM32-NEXT: andi $2, $5, 255 4753; MM32-NEXT: sllv $5, $2, $1 4754; MM32-NEXT: $BB12_1: # %entry 4755; MM32-NEXT: # =>This Inner Loop Header: Depth=1 4756; MM32-NEXT: ll $8, 0($3) 4757; MM32-NEXT: and $9, $8, $6 4758; MM32-NEXT: bne $9, $4, $BB12_3 4759; MM32-NEXT: nop 4760; MM32-NEXT: # %bb.2: # %entry 4761; MM32-NEXT: # in Loop: Header=BB12_1 Depth=1 4762; MM32-NEXT: and $8, $8, $7 4763; MM32-NEXT: or $8, $8, $5 4764; MM32-NEXT: sc $8, 0($3) 4765; MM32-NEXT: beqzc $8, $BB12_1 4766; MM32-NEXT: $BB12_3: # %entry 4767; MM32-NEXT: srlv $2, $9, $1 4768; MM32-NEXT: seb $2, $2 4769; MM32-NEXT: # %bb.4: # %entry 4770; MM32-NEXT: jrc $ra 4771; 4772; O1-LABEL: AtomicCmpSwap8: 4773; O1: # %bb.0: # %entry 4774; O1-NEXT: lui $2, %hi(_gp_disp) 4775; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 4776; O1-NEXT: addu $1, $2, $25 4777; O1-NEXT: lw $1, %got(y)($1) 4778; O1-NEXT: addiu $2, $zero, -4 4779; O1-NEXT: and $2, $1, $2 4780; O1-NEXT: andi $1, $1, 3 4781; O1-NEXT: sll $3, $1, 3 4782; O1-NEXT: ori $1, $zero, 255 4783; O1-NEXT: sllv $6, $1, $3 4784; O1-NEXT: nor $7, $zero, $6 4785; O1-NEXT: andi $1, $4, 255 4786; O1-NEXT: sllv $4, $1, $3 4787; O1-NEXT: andi $1, $5, 255 4788; O1-NEXT: sllv $5, $1, $3 4789; O1-NEXT: $BB12_1: # %entry 4790; O1-NEXT: # =>This Inner Loop Header: Depth=1 4791; O1-NEXT: ll $8, 0($2) 4792; O1-NEXT: and $9, $8, $6 4793; O1-NEXT: bne $9, $4, $BB12_3 4794; O1-NEXT: nop 4795; O1-NEXT: # %bb.2: # %entry 4796; O1-NEXT: # in Loop: Header=BB12_1 Depth=1 4797; O1-NEXT: and $8, $8, $7 4798; O1-NEXT: or $8, $8, $5 4799; O1-NEXT: sc $8, 0($2) 4800; O1-NEXT: beqz $8, $BB12_1 4801; O1-NEXT: nop 4802; O1-NEXT: $BB12_3: # %entry 4803; O1-NEXT: srlv $1, $9, $3 4804; O1-NEXT: sll $1, $1, 24 4805; O1-NEXT: sra $1, $1, 24 4806; O1-NEXT: # %bb.4: # %entry 4807; O1-NEXT: sll $1, $1, 24 4808; O1-NEXT: jr $ra 4809; O1-NEXT: sra $2, $1, 24 4810; 4811; O2-LABEL: AtomicCmpSwap8: 4812; O2: # %bb.0: # %entry 4813; O2-NEXT: lui $2, %hi(_gp_disp) 4814; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 4815; O2-NEXT: addu $1, $2, $25 4816; O2-NEXT: lw $1, %got(y)($1) 4817; O2-NEXT: addiu $2, $zero, -4 4818; O2-NEXT: and $2, $1, $2 4819; O2-NEXT: andi $1, $1, 3 4820; O2-NEXT: sll $3, $1, 3 4821; O2-NEXT: ori $1, $zero, 255 4822; O2-NEXT: sllv $6, $1, $3 4823; O2-NEXT: nor $7, $zero, $6 4824; O2-NEXT: andi $1, $4, 255 4825; O2-NEXT: sllv $4, $1, $3 4826; O2-NEXT: andi $1, $5, 255 4827; O2-NEXT: sllv $5, $1, $3 4828; O2-NEXT: $BB12_1: # %entry 4829; O2-NEXT: # =>This Inner Loop Header: Depth=1 4830; O2-NEXT: ll $8, 0($2) 4831; O2-NEXT: and $9, $8, $6 4832; O2-NEXT: bne $9, $4, $BB12_3 4833; O2-NEXT: nop 4834; O2-NEXT: # %bb.2: # %entry 4835; O2-NEXT: # in Loop: Header=BB12_1 Depth=1 4836; O2-NEXT: and $8, $8, $7 4837; O2-NEXT: or $8, $8, $5 4838; O2-NEXT: sc $8, 0($2) 4839; O2-NEXT: beqz $8, $BB12_1 4840; O2-NEXT: nop 4841; O2-NEXT: $BB12_3: # %entry 4842; O2-NEXT: srlv $1, $9, $3 4843; O2-NEXT: sll $1, $1, 24 4844; O2-NEXT: sra $1, $1, 24 4845; O2-NEXT: # %bb.4: # %entry 4846; O2-NEXT: sll $1, $1, 24 4847; O2-NEXT: jr $ra 4848; O2-NEXT: sra $2, $1, 24 4849; 4850; O3-LABEL: AtomicCmpSwap8: 4851; O3: # %bb.0: # %entry 4852; O3-NEXT: lui $2, %hi(_gp_disp) 4853; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 4854; O3-NEXT: addu $1, $2, $25 4855; O3-NEXT: addiu $2, $zero, -4 4856; O3-NEXT: lw $1, %got(y)($1) 4857; O3-NEXT: and $2, $1, $2 4858; O3-NEXT: andi $1, $1, 3 4859; O3-NEXT: sll $3, $1, 3 4860; O3-NEXT: ori $1, $zero, 255 4861; O3-NEXT: sllv $6, $1, $3 4862; O3-NEXT: andi $1, $4, 255 4863; O3-NEXT: sllv $4, $1, $3 4864; O3-NEXT: andi $1, $5, 255 4865; O3-NEXT: nor $7, $zero, $6 4866; O3-NEXT: sllv $5, $1, $3 4867; O3-NEXT: $BB12_1: # %entry 4868; O3-NEXT: # =>This Inner Loop Header: Depth=1 4869; O3-NEXT: ll $8, 0($2) 4870; O3-NEXT: and $9, $8, $6 4871; O3-NEXT: bne $9, $4, $BB12_3 4872; O3-NEXT: nop 4873; O3-NEXT: # %bb.2: # %entry 4874; O3-NEXT: # in Loop: Header=BB12_1 Depth=1 4875; O3-NEXT: and $8, $8, $7 4876; O3-NEXT: or $8, $8, $5 4877; O3-NEXT: sc $8, 0($2) 4878; O3-NEXT: beqz $8, $BB12_1 4879; O3-NEXT: nop 4880; O3-NEXT: $BB12_3: # %entry 4881; O3-NEXT: srlv $1, $9, $3 4882; O3-NEXT: sll $1, $1, 24 4883; O3-NEXT: sra $1, $1, 24 4884; O3-NEXT: # %bb.4: # %entry 4885; O3-NEXT: sll $1, $1, 24 4886; O3-NEXT: jr $ra 4887; O3-NEXT: sra $2, $1, 24 4888; 4889; MIPS32EB-LABEL: AtomicCmpSwap8: 4890; MIPS32EB: # %bb.0: # %entry 4891; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 4892; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 4893; MIPS32EB-NEXT: addu $1, $2, $25 4894; MIPS32EB-NEXT: lw $1, %got(y)($1) 4895; MIPS32EB-NEXT: addiu $2, $zero, -4 4896; MIPS32EB-NEXT: and $2, $1, $2 4897; MIPS32EB-NEXT: andi $1, $1, 3 4898; MIPS32EB-NEXT: xori $1, $1, 3 4899; MIPS32EB-NEXT: sll $3, $1, 3 4900; MIPS32EB-NEXT: ori $1, $zero, 255 4901; MIPS32EB-NEXT: sllv $6, $1, $3 4902; MIPS32EB-NEXT: nor $7, $zero, $6 4903; MIPS32EB-NEXT: andi $1, $4, 255 4904; MIPS32EB-NEXT: sllv $4, $1, $3 4905; MIPS32EB-NEXT: andi $1, $5, 255 4906; MIPS32EB-NEXT: sllv $5, $1, $3 4907; MIPS32EB-NEXT: $BB12_1: # %entry 4908; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 4909; MIPS32EB-NEXT: ll $8, 0($2) 4910; MIPS32EB-NEXT: and $9, $8, $6 4911; MIPS32EB-NEXT: bne $9, $4, $BB12_3 4912; MIPS32EB-NEXT: nop 4913; MIPS32EB-NEXT: # %bb.2: # %entry 4914; MIPS32EB-NEXT: # in Loop: Header=BB12_1 Depth=1 4915; MIPS32EB-NEXT: and $8, $8, $7 4916; MIPS32EB-NEXT: or $8, $8, $5 4917; MIPS32EB-NEXT: sc $8, 0($2) 4918; MIPS32EB-NEXT: beqz $8, $BB12_1 4919; MIPS32EB-NEXT: nop 4920; MIPS32EB-NEXT: $BB12_3: # %entry 4921; MIPS32EB-NEXT: srlv $1, $9, $3 4922; MIPS32EB-NEXT: sll $1, $1, 24 4923; MIPS32EB-NEXT: sra $1, $1, 24 4924; MIPS32EB-NEXT: # %bb.4: # %entry 4925; MIPS32EB-NEXT: sll $1, $1, 24 4926; MIPS32EB-NEXT: jr $ra 4927; MIPS32EB-NEXT: sra $2, $1, 24 4928entry: 4929 %pair0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic monotonic 4930 %0 = extractvalue { i8, i1 } %pair0, 0 4931 ret i8 %0 4932} 4933 4934define i1 @AtomicCmpSwapRes8(i8* %ptr, i8 signext %oldval, i8 signext %newval) nounwind { 4935; MIPS32-LABEL: AtomicCmpSwapRes8: 4936; MIPS32: # %bb.0: # %entry 4937; MIPS32-NEXT: addiu $1, $zero, -4 4938; MIPS32-NEXT: and $2, $4, $1 4939; MIPS32-NEXT: andi $1, $4, 3 4940; MIPS32-NEXT: sll $3, $1, 3 4941; MIPS32-NEXT: ori $1, $zero, 255 4942; MIPS32-NEXT: sllv $4, $1, $3 4943; MIPS32-NEXT: nor $7, $zero, $4 4944; MIPS32-NEXT: andi $1, $5, 255 4945; MIPS32-NEXT: sllv $8, $1, $3 4946; MIPS32-NEXT: andi $1, $6, 255 4947; MIPS32-NEXT: sllv $6, $1, $3 4948; MIPS32-NEXT: $BB13_1: # %entry 4949; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 4950; MIPS32-NEXT: ll $9, 0($2) 4951; MIPS32-NEXT: and $10, $9, $4 4952; MIPS32-NEXT: bne $10, $8, $BB13_3 4953; MIPS32-NEXT: nop 4954; MIPS32-NEXT: # %bb.2: # %entry 4955; MIPS32-NEXT: # in Loop: Header=BB13_1 Depth=1 4956; MIPS32-NEXT: and $9, $9, $7 4957; MIPS32-NEXT: or $9, $9, $6 4958; MIPS32-NEXT: sc $9, 0($2) 4959; MIPS32-NEXT: beqz $9, $BB13_1 4960; MIPS32-NEXT: nop 4961; MIPS32-NEXT: $BB13_3: # %entry 4962; MIPS32-NEXT: srlv $1, $10, $3 4963; MIPS32-NEXT: sll $1, $1, 24 4964; MIPS32-NEXT: sra $1, $1, 24 4965; MIPS32-NEXT: # %bb.4: # %entry 4966; MIPS32-NEXT: sll $2, $5, 24 4967; MIPS32-NEXT: sra $2, $2, 24 4968; MIPS32-NEXT: xor $1, $1, $2 4969; MIPS32-NEXT: jr $ra 4970; MIPS32-NEXT: sltiu $2, $1, 1 4971; 4972; MIPS32O0-LABEL: AtomicCmpSwapRes8: 4973; MIPS32O0: # %bb.0: # %entry 4974; MIPS32O0-NEXT: addiu $sp, $sp, -8 4975; MIPS32O0-NEXT: addiu $1, $zero, -4 4976; MIPS32O0-NEXT: and $1, $4, $1 4977; MIPS32O0-NEXT: andi $2, $4, 3 4978; MIPS32O0-NEXT: sll $2, $2, 3 4979; MIPS32O0-NEXT: ori $3, $zero, 255 4980; MIPS32O0-NEXT: sllv $3, $3, $2 4981; MIPS32O0-NEXT: nor $4, $zero, $3 4982; MIPS32O0-NEXT: andi $7, $5, 255 4983; MIPS32O0-NEXT: sllv $7, $7, $2 4984; MIPS32O0-NEXT: andi $6, $6, 255 4985; MIPS32O0-NEXT: sllv $6, $6, $2 4986; MIPS32O0-NEXT: $BB13_1: # %entry 4987; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 4988; MIPS32O0-NEXT: ll $9, 0($1) 4989; MIPS32O0-NEXT: and $10, $9, $3 4990; MIPS32O0-NEXT: bne $10, $7, $BB13_3 4991; MIPS32O0-NEXT: nop 4992; MIPS32O0-NEXT: # %bb.2: # %entry 4993; MIPS32O0-NEXT: # in Loop: Header=BB13_1 Depth=1 4994; MIPS32O0-NEXT: and $9, $9, $4 4995; MIPS32O0-NEXT: or $9, $9, $6 4996; MIPS32O0-NEXT: sc $9, 0($1) 4997; MIPS32O0-NEXT: beqz $9, $BB13_1 4998; MIPS32O0-NEXT: nop 4999; MIPS32O0-NEXT: $BB13_3: # %entry 5000; MIPS32O0-NEXT: srlv $8, $10, $2 5001; MIPS32O0-NEXT: sll $8, $8, 24 5002; MIPS32O0-NEXT: sra $8, $8, 24 5003; MIPS32O0-NEXT: # %bb.4: # %entry 5004; MIPS32O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 5005; MIPS32O0-NEXT: sw $8, 0($sp) # 4-byte Folded Spill 5006; MIPS32O0-NEXT: # %bb.5: # %entry 5007; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 5008; MIPS32O0-NEXT: sll $2, $1, 24 5009; MIPS32O0-NEXT: sra $2, $2, 24 5010; MIPS32O0-NEXT: lw $3, 0($sp) # 4-byte Folded Reload 5011; MIPS32O0-NEXT: xor $2, $3, $2 5012; MIPS32O0-NEXT: sltiu $2, $2, 1 5013; MIPS32O0-NEXT: addiu $sp, $sp, 8 5014; MIPS32O0-NEXT: jr $ra 5015; MIPS32O0-NEXT: nop 5016; 5017; MIPS32R2-LABEL: AtomicCmpSwapRes8: 5018; MIPS32R2: # %bb.0: # %entry 5019; MIPS32R2-NEXT: addiu $1, $zero, -4 5020; MIPS32R2-NEXT: and $2, $4, $1 5021; MIPS32R2-NEXT: andi $1, $4, 3 5022; MIPS32R2-NEXT: sll $3, $1, 3 5023; MIPS32R2-NEXT: ori $1, $zero, 255 5024; MIPS32R2-NEXT: sllv $4, $1, $3 5025; MIPS32R2-NEXT: nor $7, $zero, $4 5026; MIPS32R2-NEXT: andi $1, $5, 255 5027; MIPS32R2-NEXT: sllv $8, $1, $3 5028; MIPS32R2-NEXT: andi $1, $6, 255 5029; MIPS32R2-NEXT: sllv $6, $1, $3 5030; MIPS32R2-NEXT: $BB13_1: # %entry 5031; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 5032; MIPS32R2-NEXT: ll $9, 0($2) 5033; MIPS32R2-NEXT: and $10, $9, $4 5034; MIPS32R2-NEXT: bne $10, $8, $BB13_3 5035; MIPS32R2-NEXT: nop 5036; MIPS32R2-NEXT: # %bb.2: # %entry 5037; MIPS32R2-NEXT: # in Loop: Header=BB13_1 Depth=1 5038; MIPS32R2-NEXT: and $9, $9, $7 5039; MIPS32R2-NEXT: or $9, $9, $6 5040; MIPS32R2-NEXT: sc $9, 0($2) 5041; MIPS32R2-NEXT: beqz $9, $BB13_1 5042; MIPS32R2-NEXT: nop 5043; MIPS32R2-NEXT: $BB13_3: # %entry 5044; MIPS32R2-NEXT: srlv $1, $10, $3 5045; MIPS32R2-NEXT: seb $1, $1 5046; MIPS32R2-NEXT: # %bb.4: # %entry 5047; MIPS32R2-NEXT: xor $1, $1, $5 5048; MIPS32R2-NEXT: jr $ra 5049; MIPS32R2-NEXT: sltiu $2, $1, 1 5050; 5051; MIPS32R6-LABEL: AtomicCmpSwapRes8: 5052; MIPS32R6: # %bb.0: # %entry 5053; MIPS32R6-NEXT: addiu $1, $zero, -4 5054; MIPS32R6-NEXT: and $2, $4, $1 5055; MIPS32R6-NEXT: andi $1, $4, 3 5056; MIPS32R6-NEXT: sll $3, $1, 3 5057; MIPS32R6-NEXT: ori $1, $zero, 255 5058; MIPS32R6-NEXT: sllv $4, $1, $3 5059; MIPS32R6-NEXT: nor $7, $zero, $4 5060; MIPS32R6-NEXT: andi $1, $5, 255 5061; MIPS32R6-NEXT: sllv $8, $1, $3 5062; MIPS32R6-NEXT: andi $1, $6, 255 5063; MIPS32R6-NEXT: sllv $6, $1, $3 5064; MIPS32R6-NEXT: $BB13_1: # %entry 5065; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 5066; MIPS32R6-NEXT: ll $9, 0($2) 5067; MIPS32R6-NEXT: and $10, $9, $4 5068; MIPS32R6-NEXT: bnec $10, $8, $BB13_3 5069; MIPS32R6-NEXT: # %bb.2: # %entry 5070; MIPS32R6-NEXT: # in Loop: Header=BB13_1 Depth=1 5071; MIPS32R6-NEXT: and $9, $9, $7 5072; MIPS32R6-NEXT: or $9, $9, $6 5073; MIPS32R6-NEXT: sc $9, 0($2) 5074; MIPS32R6-NEXT: beqzc $9, $BB13_1 5075; MIPS32R6-NEXT: $BB13_3: # %entry 5076; MIPS32R6-NEXT: srlv $1, $10, $3 5077; MIPS32R6-NEXT: seb $1, $1 5078; MIPS32R6-NEXT: # %bb.4: # %entry 5079; MIPS32R6-NEXT: xor $1, $1, $5 5080; MIPS32R6-NEXT: jr $ra 5081; MIPS32R6-NEXT: sltiu $2, $1, 1 5082; 5083; MIPS32R6O0-LABEL: AtomicCmpSwapRes8: 5084; MIPS32R6O0: # %bb.0: # %entry 5085; MIPS32R6O0-NEXT: addiu $sp, $sp, -24 5086; MIPS32R6O0-NEXT: move $1, $6 5087; MIPS32R6O0-NEXT: move $2, $5 5088; MIPS32R6O0-NEXT: move $3, $4 5089; MIPS32R6O0-NEXT: addiu $7, $zero, -4 5090; MIPS32R6O0-NEXT: and $7, $4, $7 5091; MIPS32R6O0-NEXT: andi $4, $4, 3 5092; MIPS32R6O0-NEXT: sll $4, $4, 3 5093; MIPS32R6O0-NEXT: ori $8, $zero, 255 5094; MIPS32R6O0-NEXT: sllv $8, $8, $4 5095; MIPS32R6O0-NEXT: nor $9, $zero, $8 5096; MIPS32R6O0-NEXT: andi $10, $5, 255 5097; MIPS32R6O0-NEXT: sllv $10, $10, $4 5098; MIPS32R6O0-NEXT: andi $6, $6, 255 5099; MIPS32R6O0-NEXT: sllv $6, $6, $4 5100; MIPS32R6O0-NEXT: $BB13_1: # %entry 5101; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5102; MIPS32R6O0-NEXT: ll $12, 0($7) 5103; MIPS32R6O0-NEXT: and $13, $12, $8 5104; MIPS32R6O0-NEXT: bnec $13, $10, $BB13_3 5105; MIPS32R6O0-NEXT: # %bb.2: # %entry 5106; MIPS32R6O0-NEXT: # in Loop: Header=BB13_1 Depth=1 5107; MIPS32R6O0-NEXT: and $12, $12, $9 5108; MIPS32R6O0-NEXT: or $12, $12, $6 5109; MIPS32R6O0-NEXT: sc $12, 0($7) 5110; MIPS32R6O0-NEXT: beqzc $12, $BB13_1 5111; MIPS32R6O0-NEXT: $BB13_3: # %entry 5112; MIPS32R6O0-NEXT: srlv $11, $13, $4 5113; MIPS32R6O0-NEXT: seb $11, $11 5114; MIPS32R6O0-NEXT: # %bb.4: # %entry 5115; MIPS32R6O0-NEXT: sw $5, 20($sp) # 4-byte Folded Spill 5116; MIPS32R6O0-NEXT: sw $1, 16($sp) # 4-byte Folded Spill 5117; MIPS32R6O0-NEXT: sw $2, 12($sp) # 4-byte Folded Spill 5118; MIPS32R6O0-NEXT: sw $3, 8($sp) # 4-byte Folded Spill 5119; MIPS32R6O0-NEXT: sw $11, 4($sp) # 4-byte Folded Spill 5120; MIPS32R6O0-NEXT: # %bb.5: # %entry 5121; MIPS32R6O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 5122; MIPS32R6O0-NEXT: lw $2, 20($sp) # 4-byte Folded Reload 5123; MIPS32R6O0-NEXT: xor $1, $1, $2 5124; MIPS32R6O0-NEXT: sltiu $2, $1, 1 5125; MIPS32R6O0-NEXT: addiu $sp, $sp, 24 5126; MIPS32R6O0-NEXT: jrc $ra 5127; 5128; MIPS4-LABEL: AtomicCmpSwapRes8: 5129; MIPS4: # %bb.0: # %entry 5130; MIPS4-NEXT: daddiu $1, $zero, -4 5131; MIPS4-NEXT: and $2, $4, $1 5132; MIPS4-NEXT: andi $1, $4, 3 5133; MIPS4-NEXT: sll $3, $1, 3 5134; MIPS4-NEXT: ori $1, $zero, 255 5135; MIPS4-NEXT: sllv $4, $1, $3 5136; MIPS4-NEXT: nor $7, $zero, $4 5137; MIPS4-NEXT: andi $1, $5, 255 5138; MIPS4-NEXT: sllv $8, $1, $3 5139; MIPS4-NEXT: andi $1, $6, 255 5140; MIPS4-NEXT: sllv $6, $1, $3 5141; MIPS4-NEXT: .LBB13_1: # %entry 5142; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 5143; MIPS4-NEXT: ll $9, 0($2) 5144; MIPS4-NEXT: and $10, $9, $4 5145; MIPS4-NEXT: bne $10, $8, .LBB13_3 5146; MIPS4-NEXT: nop 5147; MIPS4-NEXT: # %bb.2: # %entry 5148; MIPS4-NEXT: # in Loop: Header=BB13_1 Depth=1 5149; MIPS4-NEXT: and $9, $9, $7 5150; MIPS4-NEXT: or $9, $9, $6 5151; MIPS4-NEXT: sc $9, 0($2) 5152; MIPS4-NEXT: beqz $9, .LBB13_1 5153; MIPS4-NEXT: nop 5154; MIPS4-NEXT: .LBB13_3: # %entry 5155; MIPS4-NEXT: srlv $1, $10, $3 5156; MIPS4-NEXT: sll $1, $1, 24 5157; MIPS4-NEXT: sra $1, $1, 24 5158; MIPS4-NEXT: # %bb.4: # %entry 5159; MIPS4-NEXT: sll $2, $5, 24 5160; MIPS4-NEXT: sra $2, $2, 24 5161; MIPS4-NEXT: xor $1, $1, $2 5162; MIPS4-NEXT: jr $ra 5163; MIPS4-NEXT: sltiu $2, $1, 1 5164; 5165; MIPS64-LABEL: AtomicCmpSwapRes8: 5166; MIPS64: # %bb.0: # %entry 5167; MIPS64-NEXT: daddiu $1, $zero, -4 5168; MIPS64-NEXT: and $2, $4, $1 5169; MIPS64-NEXT: andi $1, $4, 3 5170; MIPS64-NEXT: sll $3, $1, 3 5171; MIPS64-NEXT: ori $1, $zero, 255 5172; MIPS64-NEXT: sllv $4, $1, $3 5173; MIPS64-NEXT: nor $7, $zero, $4 5174; MIPS64-NEXT: andi $1, $5, 255 5175; MIPS64-NEXT: sllv $8, $1, $3 5176; MIPS64-NEXT: andi $1, $6, 255 5177; MIPS64-NEXT: sllv $6, $1, $3 5178; MIPS64-NEXT: .LBB13_1: # %entry 5179; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 5180; MIPS64-NEXT: ll $9, 0($2) 5181; MIPS64-NEXT: and $10, $9, $4 5182; MIPS64-NEXT: bne $10, $8, .LBB13_3 5183; MIPS64-NEXT: nop 5184; MIPS64-NEXT: # %bb.2: # %entry 5185; MIPS64-NEXT: # in Loop: Header=BB13_1 Depth=1 5186; MIPS64-NEXT: and $9, $9, $7 5187; MIPS64-NEXT: or $9, $9, $6 5188; MIPS64-NEXT: sc $9, 0($2) 5189; MIPS64-NEXT: beqz $9, .LBB13_1 5190; MIPS64-NEXT: nop 5191; MIPS64-NEXT: .LBB13_3: # %entry 5192; MIPS64-NEXT: srlv $1, $10, $3 5193; MIPS64-NEXT: sll $1, $1, 24 5194; MIPS64-NEXT: sra $1, $1, 24 5195; MIPS64-NEXT: # %bb.4: # %entry 5196; MIPS64-NEXT: sll $2, $5, 24 5197; MIPS64-NEXT: sra $2, $2, 24 5198; MIPS64-NEXT: xor $1, $1, $2 5199; MIPS64-NEXT: jr $ra 5200; MIPS64-NEXT: sltiu $2, $1, 1 5201; 5202; MIPS64R2-LABEL: AtomicCmpSwapRes8: 5203; MIPS64R2: # %bb.0: # %entry 5204; MIPS64R2-NEXT: daddiu $1, $zero, -4 5205; MIPS64R2-NEXT: and $2, $4, $1 5206; MIPS64R2-NEXT: andi $1, $4, 3 5207; MIPS64R2-NEXT: sll $3, $1, 3 5208; MIPS64R2-NEXT: ori $1, $zero, 255 5209; MIPS64R2-NEXT: sllv $4, $1, $3 5210; MIPS64R2-NEXT: nor $7, $zero, $4 5211; MIPS64R2-NEXT: andi $1, $5, 255 5212; MIPS64R2-NEXT: sllv $8, $1, $3 5213; MIPS64R2-NEXT: andi $1, $6, 255 5214; MIPS64R2-NEXT: sllv $6, $1, $3 5215; MIPS64R2-NEXT: .LBB13_1: # %entry 5216; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 5217; MIPS64R2-NEXT: ll $9, 0($2) 5218; MIPS64R2-NEXT: and $10, $9, $4 5219; MIPS64R2-NEXT: bne $10, $8, .LBB13_3 5220; MIPS64R2-NEXT: nop 5221; MIPS64R2-NEXT: # %bb.2: # %entry 5222; MIPS64R2-NEXT: # in Loop: Header=BB13_1 Depth=1 5223; MIPS64R2-NEXT: and $9, $9, $7 5224; MIPS64R2-NEXT: or $9, $9, $6 5225; MIPS64R2-NEXT: sc $9, 0($2) 5226; MIPS64R2-NEXT: beqz $9, .LBB13_1 5227; MIPS64R2-NEXT: nop 5228; MIPS64R2-NEXT: .LBB13_3: # %entry 5229; MIPS64R2-NEXT: srlv $1, $10, $3 5230; MIPS64R2-NEXT: seb $1, $1 5231; MIPS64R2-NEXT: # %bb.4: # %entry 5232; MIPS64R2-NEXT: xor $1, $1, $5 5233; MIPS64R2-NEXT: jr $ra 5234; MIPS64R2-NEXT: sltiu $2, $1, 1 5235; 5236; MIPS64R6-LABEL: AtomicCmpSwapRes8: 5237; MIPS64R6: # %bb.0: # %entry 5238; MIPS64R6-NEXT: daddiu $1, $zero, -4 5239; MIPS64R6-NEXT: and $2, $4, $1 5240; MIPS64R6-NEXT: andi $1, $4, 3 5241; MIPS64R6-NEXT: sll $3, $1, 3 5242; MIPS64R6-NEXT: ori $1, $zero, 255 5243; MIPS64R6-NEXT: sllv $4, $1, $3 5244; MIPS64R6-NEXT: nor $7, $zero, $4 5245; MIPS64R6-NEXT: andi $1, $5, 255 5246; MIPS64R6-NEXT: sllv $8, $1, $3 5247; MIPS64R6-NEXT: andi $1, $6, 255 5248; MIPS64R6-NEXT: sllv $6, $1, $3 5249; MIPS64R6-NEXT: .LBB13_1: # %entry 5250; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 5251; MIPS64R6-NEXT: ll $9, 0($2) 5252; MIPS64R6-NEXT: and $10, $9, $4 5253; MIPS64R6-NEXT: bnec $10, $8, .LBB13_3 5254; MIPS64R6-NEXT: # %bb.2: # %entry 5255; MIPS64R6-NEXT: # in Loop: Header=BB13_1 Depth=1 5256; MIPS64R6-NEXT: and $9, $9, $7 5257; MIPS64R6-NEXT: or $9, $9, $6 5258; MIPS64R6-NEXT: sc $9, 0($2) 5259; MIPS64R6-NEXT: beqzc $9, .LBB13_1 5260; MIPS64R6-NEXT: .LBB13_3: # %entry 5261; MIPS64R6-NEXT: srlv $1, $10, $3 5262; MIPS64R6-NEXT: seb $1, $1 5263; MIPS64R6-NEXT: # %bb.4: # %entry 5264; MIPS64R6-NEXT: xor $1, $1, $5 5265; MIPS64R6-NEXT: jr $ra 5266; MIPS64R6-NEXT: sltiu $2, $1, 1 5267; 5268; MIPS64R6O0-LABEL: AtomicCmpSwapRes8: 5269; MIPS64R6O0: # %bb.0: # %entry 5270; MIPS64R6O0-NEXT: daddiu $sp, $sp, -32 5271; MIPS64R6O0-NEXT: move $1, $6 5272; MIPS64R6O0-NEXT: move $2, $5 5273; MIPS64R6O0-NEXT: move $3, $4 5274; MIPS64R6O0-NEXT: daddiu $5, $zero, -4 5275; MIPS64R6O0-NEXT: and $5, $4, $5 5276; MIPS64R6O0-NEXT: andi $7, $4, 3 5277; MIPS64R6O0-NEXT: xori $7, $7, 3 5278; MIPS64R6O0-NEXT: sll $7, $7, 3 5279; MIPS64R6O0-NEXT: ori $8, $zero, 255 5280; MIPS64R6O0-NEXT: sllv $8, $8, $7 5281; MIPS64R6O0-NEXT: nor $9, $zero, $8 5282; MIPS64R6O0-NEXT: andi $10, $2, 255 5283; MIPS64R6O0-NEXT: sllv $10, $10, $7 5284; MIPS64R6O0-NEXT: andi $1, $1, 255 5285; MIPS64R6O0-NEXT: sllv $1, $1, $7 5286; MIPS64R6O0-NEXT: .LBB13_1: # %entry 5287; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5288; MIPS64R6O0-NEXT: ll $12, 0($5) 5289; MIPS64R6O0-NEXT: and $13, $12, $8 5290; MIPS64R6O0-NEXT: bnec $13, $10, .LBB13_3 5291; MIPS64R6O0-NEXT: # %bb.2: # %entry 5292; MIPS64R6O0-NEXT: # in Loop: Header=BB13_1 Depth=1 5293; MIPS64R6O0-NEXT: and $12, $12, $9 5294; MIPS64R6O0-NEXT: or $12, $12, $1 5295; MIPS64R6O0-NEXT: sc $12, 0($5) 5296; MIPS64R6O0-NEXT: beqzc $12, .LBB13_1 5297; MIPS64R6O0-NEXT: .LBB13_3: # %entry 5298; MIPS64R6O0-NEXT: srlv $11, $13, $7 5299; MIPS64R6O0-NEXT: seb $11, $11 5300; MIPS64R6O0-NEXT: # %bb.4: # %entry 5301; MIPS64R6O0-NEXT: sw $2, 28($sp) # 4-byte Folded Spill 5302; MIPS64R6O0-NEXT: sd $3, 16($sp) # 8-byte Folded Spill 5303; MIPS64R6O0-NEXT: sw $11, 12($sp) # 4-byte Folded Spill 5304; MIPS64R6O0-NEXT: # %bb.5: # %entry 5305; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 5306; MIPS64R6O0-NEXT: lw $2, 28($sp) # 4-byte Folded Reload 5307; MIPS64R6O0-NEXT: xor $1, $1, $2 5308; MIPS64R6O0-NEXT: sltiu $2, $1, 1 5309; MIPS64R6O0-NEXT: daddiu $sp, $sp, 32 5310; MIPS64R6O0-NEXT: jrc $ra 5311; 5312; MM32-LABEL: AtomicCmpSwapRes8: 5313; MM32: # %bb.0: # %entry 5314; MM32-NEXT: addiu $1, $zero, -4 5315; MM32-NEXT: and $2, $4, $1 5316; MM32-NEXT: andi $1, $4, 3 5317; MM32-NEXT: sll $3, $1, 3 5318; MM32-NEXT: ori $1, $zero, 255 5319; MM32-NEXT: sllv $4, $1, $3 5320; MM32-NEXT: nor $7, $zero, $4 5321; MM32-NEXT: andi $1, $5, 255 5322; MM32-NEXT: sllv $8, $1, $3 5323; MM32-NEXT: andi $1, $6, 255 5324; MM32-NEXT: sllv $6, $1, $3 5325; MM32-NEXT: $BB13_1: # %entry 5326; MM32-NEXT: # =>This Inner Loop Header: Depth=1 5327; MM32-NEXT: ll $9, 0($2) 5328; MM32-NEXT: and $10, $9, $4 5329; MM32-NEXT: bne $10, $8, $BB13_3 5330; MM32-NEXT: nop 5331; MM32-NEXT: # %bb.2: # %entry 5332; MM32-NEXT: # in Loop: Header=BB13_1 Depth=1 5333; MM32-NEXT: and $9, $9, $7 5334; MM32-NEXT: or $9, $9, $6 5335; MM32-NEXT: sc $9, 0($2) 5336; MM32-NEXT: beqzc $9, $BB13_1 5337; MM32-NEXT: $BB13_3: # %entry 5338; MM32-NEXT: srlv $1, $10, $3 5339; MM32-NEXT: seb $1, $1 5340; MM32-NEXT: # %bb.4: # %entry 5341; MM32-NEXT: xor $1, $1, $5 5342; MM32-NEXT: jr $ra 5343; MM32-NEXT: sltiu $2, $1, 1 5344; 5345; O1-LABEL: AtomicCmpSwapRes8: 5346; O1: # %bb.0: # %entry 5347; O1-NEXT: addiu $1, $zero, -4 5348; O1-NEXT: and $2, $4, $1 5349; O1-NEXT: andi $1, $4, 3 5350; O1-NEXT: sll $3, $1, 3 5351; O1-NEXT: ori $1, $zero, 255 5352; O1-NEXT: sllv $4, $1, $3 5353; O1-NEXT: nor $7, $zero, $4 5354; O1-NEXT: andi $1, $5, 255 5355; O1-NEXT: sllv $8, $1, $3 5356; O1-NEXT: andi $1, $6, 255 5357; O1-NEXT: sllv $6, $1, $3 5358; O1-NEXT: $BB13_1: # %entry 5359; O1-NEXT: # =>This Inner Loop Header: Depth=1 5360; O1-NEXT: ll $9, 0($2) 5361; O1-NEXT: and $10, $9, $4 5362; O1-NEXT: bne $10, $8, $BB13_3 5363; O1-NEXT: nop 5364; O1-NEXT: # %bb.2: # %entry 5365; O1-NEXT: # in Loop: Header=BB13_1 Depth=1 5366; O1-NEXT: and $9, $9, $7 5367; O1-NEXT: or $9, $9, $6 5368; O1-NEXT: sc $9, 0($2) 5369; O1-NEXT: beqz $9, $BB13_1 5370; O1-NEXT: nop 5371; O1-NEXT: $BB13_3: # %entry 5372; O1-NEXT: srlv $1, $10, $3 5373; O1-NEXT: sll $1, $1, 24 5374; O1-NEXT: sra $1, $1, 24 5375; O1-NEXT: # %bb.4: # %entry 5376; O1-NEXT: sll $2, $5, 24 5377; O1-NEXT: sra $2, $2, 24 5378; O1-NEXT: xor $1, $1, $2 5379; O1-NEXT: jr $ra 5380; O1-NEXT: sltiu $2, $1, 1 5381; 5382; O2-LABEL: AtomicCmpSwapRes8: 5383; O2: # %bb.0: # %entry 5384; O2-NEXT: addiu $1, $zero, -4 5385; O2-NEXT: and $2, $4, $1 5386; O2-NEXT: andi $1, $4, 3 5387; O2-NEXT: sll $3, $1, 3 5388; O2-NEXT: ori $1, $zero, 255 5389; O2-NEXT: sllv $4, $1, $3 5390; O2-NEXT: nor $7, $zero, $4 5391; O2-NEXT: andi $1, $5, 255 5392; O2-NEXT: sllv $8, $1, $3 5393; O2-NEXT: andi $1, $6, 255 5394; O2-NEXT: sllv $6, $1, $3 5395; O2-NEXT: $BB13_1: # %entry 5396; O2-NEXT: # =>This Inner Loop Header: Depth=1 5397; O2-NEXT: ll $9, 0($2) 5398; O2-NEXT: and $10, $9, $4 5399; O2-NEXT: bne $10, $8, $BB13_3 5400; O2-NEXT: nop 5401; O2-NEXT: # %bb.2: # %entry 5402; O2-NEXT: # in Loop: Header=BB13_1 Depth=1 5403; O2-NEXT: and $9, $9, $7 5404; O2-NEXT: or $9, $9, $6 5405; O2-NEXT: sc $9, 0($2) 5406; O2-NEXT: beqz $9, $BB13_1 5407; O2-NEXT: nop 5408; O2-NEXT: $BB13_3: # %entry 5409; O2-NEXT: srlv $1, $10, $3 5410; O2-NEXT: sll $1, $1, 24 5411; O2-NEXT: sra $1, $1, 24 5412; O2-NEXT: # %bb.4: # %entry 5413; O2-NEXT: sll $2, $5, 24 5414; O2-NEXT: sra $2, $2, 24 5415; O2-NEXT: xor $1, $1, $2 5416; O2-NEXT: jr $ra 5417; O2-NEXT: sltiu $2, $1, 1 5418; 5419; O3-LABEL: AtomicCmpSwapRes8: 5420; O3: # %bb.0: # %entry 5421; O3-NEXT: addiu $1, $zero, -4 5422; O3-NEXT: and $2, $4, $1 5423; O3-NEXT: andi $1, $4, 3 5424; O3-NEXT: sll $3, $1, 3 5425; O3-NEXT: ori $1, $zero, 255 5426; O3-NEXT: sllv $4, $1, $3 5427; O3-NEXT: andi $1, $5, 255 5428; O3-NEXT: sllv $8, $1, $3 5429; O3-NEXT: andi $1, $6, 255 5430; O3-NEXT: nor $7, $zero, $4 5431; O3-NEXT: sllv $6, $1, $3 5432; O3-NEXT: $BB13_1: # %entry 5433; O3-NEXT: # =>This Inner Loop Header: Depth=1 5434; O3-NEXT: ll $9, 0($2) 5435; O3-NEXT: and $10, $9, $4 5436; O3-NEXT: bne $10, $8, $BB13_3 5437; O3-NEXT: nop 5438; O3-NEXT: # %bb.2: # %entry 5439; O3-NEXT: # in Loop: Header=BB13_1 Depth=1 5440; O3-NEXT: and $9, $9, $7 5441; O3-NEXT: or $9, $9, $6 5442; O3-NEXT: sc $9, 0($2) 5443; O3-NEXT: beqz $9, $BB13_1 5444; O3-NEXT: nop 5445; O3-NEXT: $BB13_3: # %entry 5446; O3-NEXT: srlv $1, $10, $3 5447; O3-NEXT: sll $1, $1, 24 5448; O3-NEXT: sra $1, $1, 24 5449; O3-NEXT: # %bb.4: # %entry 5450; O3-NEXT: sll $2, $5, 24 5451; O3-NEXT: sra $2, $2, 24 5452; O3-NEXT: xor $1, $1, $2 5453; O3-NEXT: jr $ra 5454; O3-NEXT: sltiu $2, $1, 1 5455; 5456; MIPS32EB-LABEL: AtomicCmpSwapRes8: 5457; MIPS32EB: # %bb.0: # %entry 5458; MIPS32EB-NEXT: addiu $1, $zero, -4 5459; MIPS32EB-NEXT: and $2, $4, $1 5460; MIPS32EB-NEXT: andi $1, $4, 3 5461; MIPS32EB-NEXT: xori $1, $1, 3 5462; MIPS32EB-NEXT: sll $3, $1, 3 5463; MIPS32EB-NEXT: ori $1, $zero, 255 5464; MIPS32EB-NEXT: sllv $4, $1, $3 5465; MIPS32EB-NEXT: nor $7, $zero, $4 5466; MIPS32EB-NEXT: andi $1, $5, 255 5467; MIPS32EB-NEXT: sllv $8, $1, $3 5468; MIPS32EB-NEXT: andi $1, $6, 255 5469; MIPS32EB-NEXT: sllv $6, $1, $3 5470; MIPS32EB-NEXT: $BB13_1: # %entry 5471; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 5472; MIPS32EB-NEXT: ll $9, 0($2) 5473; MIPS32EB-NEXT: and $10, $9, $4 5474; MIPS32EB-NEXT: bne $10, $8, $BB13_3 5475; MIPS32EB-NEXT: nop 5476; MIPS32EB-NEXT: # %bb.2: # %entry 5477; MIPS32EB-NEXT: # in Loop: Header=BB13_1 Depth=1 5478; MIPS32EB-NEXT: and $9, $9, $7 5479; MIPS32EB-NEXT: or $9, $9, $6 5480; MIPS32EB-NEXT: sc $9, 0($2) 5481; MIPS32EB-NEXT: beqz $9, $BB13_1 5482; MIPS32EB-NEXT: nop 5483; MIPS32EB-NEXT: $BB13_3: # %entry 5484; MIPS32EB-NEXT: srlv $1, $10, $3 5485; MIPS32EB-NEXT: sll $1, $1, 24 5486; MIPS32EB-NEXT: sra $1, $1, 24 5487; MIPS32EB-NEXT: # %bb.4: # %entry 5488; MIPS32EB-NEXT: sll $2, $5, 24 5489; MIPS32EB-NEXT: sra $2, $2, 24 5490; MIPS32EB-NEXT: xor $1, $1, $2 5491; MIPS32EB-NEXT: jr $ra 5492; MIPS32EB-NEXT: sltiu $2, $1, 1 5493entry: 5494 %0 = cmpxchg i8* %ptr, i8 %oldval, i8 %newval monotonic monotonic 5495 %1 = extractvalue { i8, i1 } %0, 1 5496 ret i1 %1 5497; FIXME: -march=mips produces a redundant sign extension here... 5498; FIXME: ...Leading to this split check. 5499 5500} 5501 5502; Check one i16 so that we cover the seh sign extend 5503@z = common global i16 0, align 1 5504 5505define signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind { 5506; MIPS32-LABEL: AtomicLoadAdd16: 5507; MIPS32: # %bb.0: # %entry 5508; MIPS32-NEXT: lui $2, %hi(_gp_disp) 5509; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 5510; MIPS32-NEXT: addu $1, $2, $25 5511; MIPS32-NEXT: lw $1, %got(z)($1) 5512; MIPS32-NEXT: addiu $2, $zero, -4 5513; MIPS32-NEXT: and $2, $1, $2 5514; MIPS32-NEXT: andi $1, $1, 3 5515; MIPS32-NEXT: sll $3, $1, 3 5516; MIPS32-NEXT: ori $1, $zero, 65535 5517; MIPS32-NEXT: sllv $5, $1, $3 5518; MIPS32-NEXT: nor $6, $zero, $5 5519; MIPS32-NEXT: sllv $4, $4, $3 5520; MIPS32-NEXT: $BB14_1: # %entry 5521; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 5522; MIPS32-NEXT: ll $7, 0($2) 5523; MIPS32-NEXT: addu $8, $7, $4 5524; MIPS32-NEXT: and $8, $8, $5 5525; MIPS32-NEXT: and $9, $7, $6 5526; MIPS32-NEXT: or $9, $9, $8 5527; MIPS32-NEXT: sc $9, 0($2) 5528; MIPS32-NEXT: beqz $9, $BB14_1 5529; MIPS32-NEXT: nop 5530; MIPS32-NEXT: # %bb.2: # %entry 5531; MIPS32-NEXT: and $1, $7, $5 5532; MIPS32-NEXT: srlv $1, $1, $3 5533; MIPS32-NEXT: sll $1, $1, 16 5534; MIPS32-NEXT: sra $1, $1, 16 5535; MIPS32-NEXT: # %bb.3: # %entry 5536; MIPS32-NEXT: sll $1, $1, 16 5537; MIPS32-NEXT: jr $ra 5538; MIPS32-NEXT: sra $2, $1, 16 5539; 5540; MIPS32O0-LABEL: AtomicLoadAdd16: 5541; MIPS32O0: # %bb.0: # %entry 5542; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 5543; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 5544; MIPS32O0-NEXT: addiu $sp, $sp, -8 5545; MIPS32O0-NEXT: addu $1, $2, $25 5546; MIPS32O0-NEXT: lw $1, %got(z)($1) 5547; MIPS32O0-NEXT: addiu $2, $zero, -4 5548; MIPS32O0-NEXT: and $2, $1, $2 5549; MIPS32O0-NEXT: andi $1, $1, 3 5550; MIPS32O0-NEXT: sll $1, $1, 3 5551; MIPS32O0-NEXT: ori $3, $zero, 65535 5552; MIPS32O0-NEXT: sllv $3, $3, $1 5553; MIPS32O0-NEXT: nor $5, $zero, $3 5554; MIPS32O0-NEXT: sllv $4, $4, $1 5555; MIPS32O0-NEXT: $BB14_1: # %entry 5556; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 5557; MIPS32O0-NEXT: ll $7, 0($2) 5558; MIPS32O0-NEXT: addu $8, $7, $4 5559; MIPS32O0-NEXT: and $8, $8, $3 5560; MIPS32O0-NEXT: and $9, $7, $5 5561; MIPS32O0-NEXT: or $9, $9, $8 5562; MIPS32O0-NEXT: sc $9, 0($2) 5563; MIPS32O0-NEXT: beqz $9, $BB14_1 5564; MIPS32O0-NEXT: nop 5565; MIPS32O0-NEXT: # %bb.2: # %entry 5566; MIPS32O0-NEXT: and $6, $7, $3 5567; MIPS32O0-NEXT: srlv $6, $6, $1 5568; MIPS32O0-NEXT: sll $6, $6, 16 5569; MIPS32O0-NEXT: sra $6, $6, 16 5570; MIPS32O0-NEXT: # %bb.3: # %entry 5571; MIPS32O0-NEXT: sw $6, 4($sp) # 4-byte Folded Spill 5572; MIPS32O0-NEXT: # %bb.4: # %entry 5573; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 5574; MIPS32O0-NEXT: sll $2, $1, 16 5575; MIPS32O0-NEXT: sra $2, $2, 16 5576; MIPS32O0-NEXT: addiu $sp, $sp, 8 5577; MIPS32O0-NEXT: jr $ra 5578; MIPS32O0-NEXT: nop 5579; 5580; MIPS32R2-LABEL: AtomicLoadAdd16: 5581; MIPS32R2: # %bb.0: # %entry 5582; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 5583; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 5584; MIPS32R2-NEXT: addu $1, $2, $25 5585; MIPS32R2-NEXT: lw $1, %got(z)($1) 5586; MIPS32R2-NEXT: addiu $2, $zero, -4 5587; MIPS32R2-NEXT: and $2, $1, $2 5588; MIPS32R2-NEXT: andi $1, $1, 3 5589; MIPS32R2-NEXT: sll $3, $1, 3 5590; MIPS32R2-NEXT: ori $1, $zero, 65535 5591; MIPS32R2-NEXT: sllv $5, $1, $3 5592; MIPS32R2-NEXT: nor $6, $zero, $5 5593; MIPS32R2-NEXT: sllv $4, $4, $3 5594; MIPS32R2-NEXT: $BB14_1: # %entry 5595; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 5596; MIPS32R2-NEXT: ll $7, 0($2) 5597; MIPS32R2-NEXT: addu $8, $7, $4 5598; MIPS32R2-NEXT: and $8, $8, $5 5599; MIPS32R2-NEXT: and $9, $7, $6 5600; MIPS32R2-NEXT: or $9, $9, $8 5601; MIPS32R2-NEXT: sc $9, 0($2) 5602; MIPS32R2-NEXT: beqz $9, $BB14_1 5603; MIPS32R2-NEXT: nop 5604; MIPS32R2-NEXT: # %bb.2: # %entry 5605; MIPS32R2-NEXT: and $1, $7, $5 5606; MIPS32R2-NEXT: srlv $1, $1, $3 5607; MIPS32R2-NEXT: seh $1, $1 5608; MIPS32R2-NEXT: # %bb.3: # %entry 5609; MIPS32R2-NEXT: jr $ra 5610; MIPS32R2-NEXT: seh $2, $1 5611; 5612; MIPS32R6-LABEL: AtomicLoadAdd16: 5613; MIPS32R6: # %bb.0: # %entry 5614; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 5615; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 5616; MIPS32R6-NEXT: addu $1, $2, $25 5617; MIPS32R6-NEXT: lw $1, %got(z)($1) 5618; MIPS32R6-NEXT: addiu $2, $zero, -4 5619; MIPS32R6-NEXT: and $2, $1, $2 5620; MIPS32R6-NEXT: andi $1, $1, 3 5621; MIPS32R6-NEXT: sll $3, $1, 3 5622; MIPS32R6-NEXT: ori $1, $zero, 65535 5623; MIPS32R6-NEXT: sllv $5, $1, $3 5624; MIPS32R6-NEXT: nor $6, $zero, $5 5625; MIPS32R6-NEXT: sllv $4, $4, $3 5626; MIPS32R6-NEXT: $BB14_1: # %entry 5627; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 5628; MIPS32R6-NEXT: ll $7, 0($2) 5629; MIPS32R6-NEXT: addu $8, $7, $4 5630; MIPS32R6-NEXT: and $8, $8, $5 5631; MIPS32R6-NEXT: and $9, $7, $6 5632; MIPS32R6-NEXT: or $9, $9, $8 5633; MIPS32R6-NEXT: sc $9, 0($2) 5634; MIPS32R6-NEXT: beqzc $9, $BB14_1 5635; MIPS32R6-NEXT: # %bb.2: # %entry 5636; MIPS32R6-NEXT: and $1, $7, $5 5637; MIPS32R6-NEXT: srlv $1, $1, $3 5638; MIPS32R6-NEXT: seh $1, $1 5639; MIPS32R6-NEXT: # %bb.3: # %entry 5640; MIPS32R6-NEXT: jr $ra 5641; MIPS32R6-NEXT: seh $2, $1 5642; 5643; MIPS32R6O0-LABEL: AtomicLoadAdd16: 5644; MIPS32R6O0: # %bb.0: # %entry 5645; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 5646; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 5647; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 5648; MIPS32R6O0-NEXT: addu $1, $2, $25 5649; MIPS32R6O0-NEXT: move $2, $4 5650; MIPS32R6O0-NEXT: lw $1, %got(z)($1) 5651; MIPS32R6O0-NEXT: addiu $3, $zero, -4 5652; MIPS32R6O0-NEXT: and $3, $1, $3 5653; MIPS32R6O0-NEXT: andi $1, $1, 3 5654; MIPS32R6O0-NEXT: sll $1, $1, 3 5655; MIPS32R6O0-NEXT: ori $5, $zero, 65535 5656; MIPS32R6O0-NEXT: sllv $5, $5, $1 5657; MIPS32R6O0-NEXT: nor $6, $zero, $5 5658; MIPS32R6O0-NEXT: sllv $4, $4, $1 5659; MIPS32R6O0-NEXT: $BB14_1: # %entry 5660; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5661; MIPS32R6O0-NEXT: ll $8, 0($3) 5662; MIPS32R6O0-NEXT: addu $9, $8, $4 5663; MIPS32R6O0-NEXT: and $9, $9, $5 5664; MIPS32R6O0-NEXT: and $10, $8, $6 5665; MIPS32R6O0-NEXT: or $10, $10, $9 5666; MIPS32R6O0-NEXT: sc $10, 0($3) 5667; MIPS32R6O0-NEXT: beqzc $10, $BB14_1 5668; MIPS32R6O0-NEXT: # %bb.2: # %entry 5669; MIPS32R6O0-NEXT: and $7, $8, $5 5670; MIPS32R6O0-NEXT: srlv $7, $7, $1 5671; MIPS32R6O0-NEXT: seh $7, $7 5672; MIPS32R6O0-NEXT: # %bb.3: # %entry 5673; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 5674; MIPS32R6O0-NEXT: sw $7, 0($sp) # 4-byte Folded Spill 5675; MIPS32R6O0-NEXT: # %bb.4: # %entry 5676; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 5677; MIPS32R6O0-NEXT: seh $2, $1 5678; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 5679; MIPS32R6O0-NEXT: jrc $ra 5680; 5681; MIPS4-LABEL: AtomicLoadAdd16: 5682; MIPS4: # %bb.0: # %entry 5683; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5684; MIPS4-NEXT: daddu $1, $1, $25 5685; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5686; MIPS4-NEXT: ld $1, %got_disp(z)($1) 5687; MIPS4-NEXT: daddiu $2, $zero, -4 5688; MIPS4-NEXT: and $2, $1, $2 5689; MIPS4-NEXT: andi $1, $1, 3 5690; MIPS4-NEXT: sll $3, $1, 3 5691; MIPS4-NEXT: ori $1, $zero, 65535 5692; MIPS4-NEXT: sllv $5, $1, $3 5693; MIPS4-NEXT: nor $6, $zero, $5 5694; MIPS4-NEXT: sllv $4, $4, $3 5695; MIPS4-NEXT: .LBB14_1: # %entry 5696; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 5697; MIPS4-NEXT: ll $7, 0($2) 5698; MIPS4-NEXT: addu $8, $7, $4 5699; MIPS4-NEXT: and $8, $8, $5 5700; MIPS4-NEXT: and $9, $7, $6 5701; MIPS4-NEXT: or $9, $9, $8 5702; MIPS4-NEXT: sc $9, 0($2) 5703; MIPS4-NEXT: beqz $9, .LBB14_1 5704; MIPS4-NEXT: nop 5705; MIPS4-NEXT: # %bb.2: # %entry 5706; MIPS4-NEXT: and $1, $7, $5 5707; MIPS4-NEXT: srlv $1, $1, $3 5708; MIPS4-NEXT: sll $1, $1, 16 5709; MIPS4-NEXT: sra $1, $1, 16 5710; MIPS4-NEXT: # %bb.3: # %entry 5711; MIPS4-NEXT: sll $1, $1, 16 5712; MIPS4-NEXT: jr $ra 5713; MIPS4-NEXT: sra $2, $1, 16 5714; 5715; MIPS64-LABEL: AtomicLoadAdd16: 5716; MIPS64: # %bb.0: # %entry 5717; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5718; MIPS64-NEXT: daddu $1, $1, $25 5719; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5720; MIPS64-NEXT: ld $1, %got_disp(z)($1) 5721; MIPS64-NEXT: daddiu $2, $zero, -4 5722; MIPS64-NEXT: and $2, $1, $2 5723; MIPS64-NEXT: andi $1, $1, 3 5724; MIPS64-NEXT: sll $3, $1, 3 5725; MIPS64-NEXT: ori $1, $zero, 65535 5726; MIPS64-NEXT: sllv $5, $1, $3 5727; MIPS64-NEXT: nor $6, $zero, $5 5728; MIPS64-NEXT: sllv $4, $4, $3 5729; MIPS64-NEXT: .LBB14_1: # %entry 5730; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 5731; MIPS64-NEXT: ll $7, 0($2) 5732; MIPS64-NEXT: addu $8, $7, $4 5733; MIPS64-NEXT: and $8, $8, $5 5734; MIPS64-NEXT: and $9, $7, $6 5735; MIPS64-NEXT: or $9, $9, $8 5736; MIPS64-NEXT: sc $9, 0($2) 5737; MIPS64-NEXT: beqz $9, .LBB14_1 5738; MIPS64-NEXT: nop 5739; MIPS64-NEXT: # %bb.2: # %entry 5740; MIPS64-NEXT: and $1, $7, $5 5741; MIPS64-NEXT: srlv $1, $1, $3 5742; MIPS64-NEXT: sll $1, $1, 16 5743; MIPS64-NEXT: sra $1, $1, 16 5744; MIPS64-NEXT: # %bb.3: # %entry 5745; MIPS64-NEXT: sll $1, $1, 16 5746; MIPS64-NEXT: jr $ra 5747; MIPS64-NEXT: sra $2, $1, 16 5748; 5749; MIPS64R2-LABEL: AtomicLoadAdd16: 5750; MIPS64R2: # %bb.0: # %entry 5751; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5752; MIPS64R2-NEXT: daddu $1, $1, $25 5753; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5754; MIPS64R2-NEXT: ld $1, %got_disp(z)($1) 5755; MIPS64R2-NEXT: daddiu $2, $zero, -4 5756; MIPS64R2-NEXT: and $2, $1, $2 5757; MIPS64R2-NEXT: andi $1, $1, 3 5758; MIPS64R2-NEXT: sll $3, $1, 3 5759; MIPS64R2-NEXT: ori $1, $zero, 65535 5760; MIPS64R2-NEXT: sllv $5, $1, $3 5761; MIPS64R2-NEXT: nor $6, $zero, $5 5762; MIPS64R2-NEXT: sllv $4, $4, $3 5763; MIPS64R2-NEXT: .LBB14_1: # %entry 5764; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 5765; MIPS64R2-NEXT: ll $7, 0($2) 5766; MIPS64R2-NEXT: addu $8, $7, $4 5767; MIPS64R2-NEXT: and $8, $8, $5 5768; MIPS64R2-NEXT: and $9, $7, $6 5769; MIPS64R2-NEXT: or $9, $9, $8 5770; MIPS64R2-NEXT: sc $9, 0($2) 5771; MIPS64R2-NEXT: beqz $9, .LBB14_1 5772; MIPS64R2-NEXT: nop 5773; MIPS64R2-NEXT: # %bb.2: # %entry 5774; MIPS64R2-NEXT: and $1, $7, $5 5775; MIPS64R2-NEXT: srlv $1, $1, $3 5776; MIPS64R2-NEXT: seh $1, $1 5777; MIPS64R2-NEXT: # %bb.3: # %entry 5778; MIPS64R2-NEXT: jr $ra 5779; MIPS64R2-NEXT: seh $2, $1 5780; 5781; MIPS64R6-LABEL: AtomicLoadAdd16: 5782; MIPS64R6: # %bb.0: # %entry 5783; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5784; MIPS64R6-NEXT: daddu $1, $1, $25 5785; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5786; MIPS64R6-NEXT: ld $1, %got_disp(z)($1) 5787; MIPS64R6-NEXT: daddiu $2, $zero, -4 5788; MIPS64R6-NEXT: and $2, $1, $2 5789; MIPS64R6-NEXT: andi $1, $1, 3 5790; MIPS64R6-NEXT: sll $3, $1, 3 5791; MIPS64R6-NEXT: ori $1, $zero, 65535 5792; MIPS64R6-NEXT: sllv $5, $1, $3 5793; MIPS64R6-NEXT: nor $6, $zero, $5 5794; MIPS64R6-NEXT: sllv $4, $4, $3 5795; MIPS64R6-NEXT: .LBB14_1: # %entry 5796; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 5797; MIPS64R6-NEXT: ll $7, 0($2) 5798; MIPS64R6-NEXT: addu $8, $7, $4 5799; MIPS64R6-NEXT: and $8, $8, $5 5800; MIPS64R6-NEXT: and $9, $7, $6 5801; MIPS64R6-NEXT: or $9, $9, $8 5802; MIPS64R6-NEXT: sc $9, 0($2) 5803; MIPS64R6-NEXT: beqzc $9, .LBB14_1 5804; MIPS64R6-NEXT: # %bb.2: # %entry 5805; MIPS64R6-NEXT: and $1, $7, $5 5806; MIPS64R6-NEXT: srlv $1, $1, $3 5807; MIPS64R6-NEXT: seh $1, $1 5808; MIPS64R6-NEXT: # %bb.3: # %entry 5809; MIPS64R6-NEXT: jr $ra 5810; MIPS64R6-NEXT: seh $2, $1 5811; 5812; MIPS64R6O0-LABEL: AtomicLoadAdd16: 5813; MIPS64R6O0: # %bb.0: # %entry 5814; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 5815; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5816; MIPS64R6O0-NEXT: daddu $1, $1, $25 5817; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5818; MIPS64R6O0-NEXT: move $2, $4 5819; MIPS64R6O0-NEXT: ld $1, %got_disp(z)($1) 5820; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 5821; MIPS64R6O0-NEXT: and $3, $1, $3 5822; MIPS64R6O0-NEXT: andi $5, $1, 3 5823; MIPS64R6O0-NEXT: xori $5, $5, 2 5824; MIPS64R6O0-NEXT: sll $5, $5, 3 5825; MIPS64R6O0-NEXT: ori $6, $zero, 65535 5826; MIPS64R6O0-NEXT: sllv $6, $6, $5 5827; MIPS64R6O0-NEXT: nor $7, $zero, $6 5828; MIPS64R6O0-NEXT: sllv $2, $2, $5 5829; MIPS64R6O0-NEXT: .LBB14_1: # %entry 5830; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5831; MIPS64R6O0-NEXT: ll $9, 0($3) 5832; MIPS64R6O0-NEXT: addu $10, $9, $2 5833; MIPS64R6O0-NEXT: and $10, $10, $6 5834; MIPS64R6O0-NEXT: and $11, $9, $7 5835; MIPS64R6O0-NEXT: or $11, $11, $10 5836; MIPS64R6O0-NEXT: sc $11, 0($3) 5837; MIPS64R6O0-NEXT: beqzc $11, .LBB14_1 5838; MIPS64R6O0-NEXT: # %bb.2: # %entry 5839; MIPS64R6O0-NEXT: and $8, $9, $6 5840; MIPS64R6O0-NEXT: srlv $8, $8, $5 5841; MIPS64R6O0-NEXT: seh $8, $8 5842; MIPS64R6O0-NEXT: # %bb.3: # %entry 5843; MIPS64R6O0-NEXT: sw $8, 12($sp) # 4-byte Folded Spill 5844; MIPS64R6O0-NEXT: # %bb.4: # %entry 5845; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 5846; MIPS64R6O0-NEXT: seh $2, $1 5847; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 5848; MIPS64R6O0-NEXT: jrc $ra 5849; 5850; MM32-LABEL: AtomicLoadAdd16: 5851; MM32: # %bb.0: # %entry 5852; MM32-NEXT: lui $2, %hi(_gp_disp) 5853; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 5854; MM32-NEXT: addu $2, $2, $25 5855; MM32-NEXT: lw $1, %got(z)($2) 5856; MM32-NEXT: addiu $2, $zero, -4 5857; MM32-NEXT: and $2, $1, $2 5858; MM32-NEXT: andi $1, $1, 3 5859; MM32-NEXT: sll $3, $1, 3 5860; MM32-NEXT: ori $1, $zero, 65535 5861; MM32-NEXT: sllv $5, $1, $3 5862; MM32-NEXT: nor $6, $zero, $5 5863; MM32-NEXT: sllv $4, $4, $3 5864; MM32-NEXT: $BB14_1: # %entry 5865; MM32-NEXT: # =>This Inner Loop Header: Depth=1 5866; MM32-NEXT: ll $7, 0($2) 5867; MM32-NEXT: addu $8, $7, $4 5868; MM32-NEXT: and $8, $8, $5 5869; MM32-NEXT: and $9, $7, $6 5870; MM32-NEXT: or $9, $9, $8 5871; MM32-NEXT: sc $9, 0($2) 5872; MM32-NEXT: beqzc $9, $BB14_1 5873; MM32-NEXT: # %bb.2: # %entry 5874; MM32-NEXT: and $1, $7, $5 5875; MM32-NEXT: srlv $1, $1, $3 5876; MM32-NEXT: seh $1, $1 5877; MM32-NEXT: # %bb.3: # %entry 5878; MM32-NEXT: jr $ra 5879; MM32-NEXT: seh $2, $1 5880; 5881; O1-LABEL: AtomicLoadAdd16: 5882; O1: # %bb.0: # %entry 5883; O1-NEXT: lui $2, %hi(_gp_disp) 5884; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 5885; O1-NEXT: addu $1, $2, $25 5886; O1-NEXT: lw $1, %got(z)($1) 5887; O1-NEXT: addiu $2, $zero, -4 5888; O1-NEXT: and $2, $1, $2 5889; O1-NEXT: andi $1, $1, 3 5890; O1-NEXT: sll $3, $1, 3 5891; O1-NEXT: ori $1, $zero, 65535 5892; O1-NEXT: sllv $5, $1, $3 5893; O1-NEXT: nor $6, $zero, $5 5894; O1-NEXT: sllv $4, $4, $3 5895; O1-NEXT: $BB14_1: # %entry 5896; O1-NEXT: # =>This Inner Loop Header: Depth=1 5897; O1-NEXT: ll $7, 0($2) 5898; O1-NEXT: addu $8, $7, $4 5899; O1-NEXT: and $8, $8, $5 5900; O1-NEXT: and $9, $7, $6 5901; O1-NEXT: or $9, $9, $8 5902; O1-NEXT: sc $9, 0($2) 5903; O1-NEXT: beqz $9, $BB14_1 5904; O1-NEXT: nop 5905; O1-NEXT: # %bb.2: # %entry 5906; O1-NEXT: and $1, $7, $5 5907; O1-NEXT: srlv $1, $1, $3 5908; O1-NEXT: sll $1, $1, 16 5909; O1-NEXT: sra $1, $1, 16 5910; O1-NEXT: # %bb.3: # %entry 5911; O1-NEXT: sll $1, $1, 16 5912; O1-NEXT: jr $ra 5913; O1-NEXT: sra $2, $1, 16 5914; 5915; O2-LABEL: AtomicLoadAdd16: 5916; O2: # %bb.0: # %entry 5917; O2-NEXT: lui $2, %hi(_gp_disp) 5918; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 5919; O2-NEXT: addu $1, $2, $25 5920; O2-NEXT: lw $1, %got(z)($1) 5921; O2-NEXT: addiu $2, $zero, -4 5922; O2-NEXT: and $2, $1, $2 5923; O2-NEXT: andi $1, $1, 3 5924; O2-NEXT: sll $3, $1, 3 5925; O2-NEXT: ori $1, $zero, 65535 5926; O2-NEXT: sllv $5, $1, $3 5927; O2-NEXT: nor $6, $zero, $5 5928; O2-NEXT: sllv $4, $4, $3 5929; O2-NEXT: $BB14_1: # %entry 5930; O2-NEXT: # =>This Inner Loop Header: Depth=1 5931; O2-NEXT: ll $7, 0($2) 5932; O2-NEXT: addu $8, $7, $4 5933; O2-NEXT: and $8, $8, $5 5934; O2-NEXT: and $9, $7, $6 5935; O2-NEXT: or $9, $9, $8 5936; O2-NEXT: sc $9, 0($2) 5937; O2-NEXT: beqz $9, $BB14_1 5938; O2-NEXT: nop 5939; O2-NEXT: # %bb.2: # %entry 5940; O2-NEXT: and $1, $7, $5 5941; O2-NEXT: srlv $1, $1, $3 5942; O2-NEXT: sll $1, $1, 16 5943; O2-NEXT: sra $1, $1, 16 5944; O2-NEXT: # %bb.3: # %entry 5945; O2-NEXT: sll $1, $1, 16 5946; O2-NEXT: jr $ra 5947; O2-NEXT: sra $2, $1, 16 5948; 5949; O3-LABEL: AtomicLoadAdd16: 5950; O3: # %bb.0: # %entry 5951; O3-NEXT: lui $2, %hi(_gp_disp) 5952; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 5953; O3-NEXT: addu $1, $2, $25 5954; O3-NEXT: addiu $2, $zero, -4 5955; O3-NEXT: lw $1, %got(z)($1) 5956; O3-NEXT: and $2, $1, $2 5957; O3-NEXT: andi $1, $1, 3 5958; O3-NEXT: sll $3, $1, 3 5959; O3-NEXT: ori $1, $zero, 65535 5960; O3-NEXT: sllv $5, $1, $3 5961; O3-NEXT: sllv $4, $4, $3 5962; O3-NEXT: nor $6, $zero, $5 5963; O3-NEXT: $BB14_1: # %entry 5964; O3-NEXT: # =>This Inner Loop Header: Depth=1 5965; O3-NEXT: ll $7, 0($2) 5966; O3-NEXT: addu $8, $7, $4 5967; O3-NEXT: and $8, $8, $5 5968; O3-NEXT: and $9, $7, $6 5969; O3-NEXT: or $9, $9, $8 5970; O3-NEXT: sc $9, 0($2) 5971; O3-NEXT: beqz $9, $BB14_1 5972; O3-NEXT: nop 5973; O3-NEXT: # %bb.2: # %entry 5974; O3-NEXT: and $1, $7, $5 5975; O3-NEXT: srlv $1, $1, $3 5976; O3-NEXT: sll $1, $1, 16 5977; O3-NEXT: sra $1, $1, 16 5978; O3-NEXT: # %bb.3: # %entry 5979; O3-NEXT: sll $1, $1, 16 5980; O3-NEXT: jr $ra 5981; O3-NEXT: sra $2, $1, 16 5982; 5983; MIPS32EB-LABEL: AtomicLoadAdd16: 5984; MIPS32EB: # %bb.0: # %entry 5985; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 5986; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 5987; MIPS32EB-NEXT: addu $1, $2, $25 5988; MIPS32EB-NEXT: lw $1, %got(z)($1) 5989; MIPS32EB-NEXT: addiu $2, $zero, -4 5990; MIPS32EB-NEXT: and $2, $1, $2 5991; MIPS32EB-NEXT: andi $1, $1, 3 5992; MIPS32EB-NEXT: xori $1, $1, 2 5993; MIPS32EB-NEXT: sll $3, $1, 3 5994; MIPS32EB-NEXT: ori $1, $zero, 65535 5995; MIPS32EB-NEXT: sllv $5, $1, $3 5996; MIPS32EB-NEXT: nor $6, $zero, $5 5997; MIPS32EB-NEXT: sllv $4, $4, $3 5998; MIPS32EB-NEXT: $BB14_1: # %entry 5999; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 6000; MIPS32EB-NEXT: ll $7, 0($2) 6001; MIPS32EB-NEXT: addu $8, $7, $4 6002; MIPS32EB-NEXT: and $8, $8, $5 6003; MIPS32EB-NEXT: and $9, $7, $6 6004; MIPS32EB-NEXT: or $9, $9, $8 6005; MIPS32EB-NEXT: sc $9, 0($2) 6006; MIPS32EB-NEXT: beqz $9, $BB14_1 6007; MIPS32EB-NEXT: nop 6008; MIPS32EB-NEXT: # %bb.2: # %entry 6009; MIPS32EB-NEXT: and $1, $7, $5 6010; MIPS32EB-NEXT: srlv $1, $1, $3 6011; MIPS32EB-NEXT: sll $1, $1, 16 6012; MIPS32EB-NEXT: sra $1, $1, 16 6013; MIPS32EB-NEXT: # %bb.3: # %entry 6014; MIPS32EB-NEXT: sll $1, $1, 16 6015; MIPS32EB-NEXT: jr $ra 6016; MIPS32EB-NEXT: sra $2, $1, 16 6017entry: 6018 %0 = atomicrmw add i16* @z, i16 %incr monotonic 6019 ret i16 %0 6020 6021} 6022 6023; Test that the i16 return value from cmpxchg is recognised as signed, 6024; so that setCC doesn't end up comparing an unsigned value to a signed 6025; value. 6026; The rest of the functions here are testing the atomic expansion, so 6027; we just match the end of the function. 6028define {i16, i1} @foo(i16* %addr, i16 %l, i16 %r, i16 %new) { 6029; MIPS32-LABEL: foo: 6030; MIPS32: # %bb.0: 6031; MIPS32-NEXT: addu $1, $5, $6 6032; MIPS32-NEXT: sync 6033; MIPS32-NEXT: addiu $2, $zero, -4 6034; MIPS32-NEXT: and $3, $4, $2 6035; MIPS32-NEXT: andi $2, $4, 3 6036; MIPS32-NEXT: sll $4, $2, 3 6037; MIPS32-NEXT: ori $2, $zero, 65535 6038; MIPS32-NEXT: sllv $5, $2, $4 6039; MIPS32-NEXT: nor $6, $zero, $5 6040; MIPS32-NEXT: andi $2, $1, 65535 6041; MIPS32-NEXT: sllv $8, $2, $4 6042; MIPS32-NEXT: andi $2, $7, 65535 6043; MIPS32-NEXT: sllv $7, $2, $4 6044; MIPS32-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6045; MIPS32-NEXT: ll $9, 0($3) 6046; MIPS32-NEXT: and $10, $9, $5 6047; MIPS32-NEXT: bne $10, $8, $BB15_3 6048; MIPS32-NEXT: nop 6049; MIPS32-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6050; MIPS32-NEXT: and $9, $9, $6 6051; MIPS32-NEXT: or $9, $9, $7 6052; MIPS32-NEXT: sc $9, 0($3) 6053; MIPS32-NEXT: beqz $9, $BB15_1 6054; MIPS32-NEXT: nop 6055; MIPS32-NEXT: $BB15_3: 6056; MIPS32-NEXT: srlv $2, $10, $4 6057; MIPS32-NEXT: sll $2, $2, 16 6058; MIPS32-NEXT: sra $2, $2, 16 6059; MIPS32-NEXT: # %bb.4: 6060; MIPS32-NEXT: sll $1, $1, 16 6061; MIPS32-NEXT: sra $1, $1, 16 6062; MIPS32-NEXT: xor $1, $2, $1 6063; MIPS32-NEXT: sltiu $3, $1, 1 6064; MIPS32-NEXT: sync 6065; MIPS32-NEXT: jr $ra 6066; MIPS32-NEXT: nop 6067; 6068; MIPS32O0-LABEL: foo: 6069; MIPS32O0: # %bb.0: 6070; MIPS32O0-NEXT: addiu $sp, $sp, -8 6071; MIPS32O0-NEXT: .cfi_def_cfa_offset 8 6072; MIPS32O0-NEXT: addu $1, $5, $6 6073; MIPS32O0-NEXT: sync 6074; MIPS32O0-NEXT: addiu $2, $zero, -4 6075; MIPS32O0-NEXT: and $2, $4, $2 6076; MIPS32O0-NEXT: andi $3, $4, 3 6077; MIPS32O0-NEXT: sll $3, $3, 3 6078; MIPS32O0-NEXT: ori $4, $zero, 65535 6079; MIPS32O0-NEXT: sllv $4, $4, $3 6080; MIPS32O0-NEXT: nor $5, $zero, $4 6081; MIPS32O0-NEXT: andi $6, $1, 65535 6082; MIPS32O0-NEXT: sllv $6, $6, $3 6083; MIPS32O0-NEXT: andi $7, $7, 65535 6084; MIPS32O0-NEXT: sllv $7, $7, $3 6085; MIPS32O0-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6086; MIPS32O0-NEXT: ll $9, 0($2) 6087; MIPS32O0-NEXT: and $10, $9, $4 6088; MIPS32O0-NEXT: bne $10, $6, $BB15_3 6089; MIPS32O0-NEXT: nop 6090; MIPS32O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6091; MIPS32O0-NEXT: and $9, $9, $5 6092; MIPS32O0-NEXT: or $9, $9, $7 6093; MIPS32O0-NEXT: sc $9, 0($2) 6094; MIPS32O0-NEXT: beqz $9, $BB15_1 6095; MIPS32O0-NEXT: nop 6096; MIPS32O0-NEXT: $BB15_3: 6097; MIPS32O0-NEXT: srlv $8, $10, $3 6098; MIPS32O0-NEXT: sll $8, $8, 16 6099; MIPS32O0-NEXT: sra $8, $8, 16 6100; MIPS32O0-NEXT: # %bb.4: 6101; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 6102; MIPS32O0-NEXT: sw $8, 0($sp) # 4-byte Folded Spill 6103; MIPS32O0-NEXT: # %bb.5: 6104; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 6105; MIPS32O0-NEXT: sll $2, $1, 16 6106; MIPS32O0-NEXT: sra $2, $2, 16 6107; MIPS32O0-NEXT: lw $3, 0($sp) # 4-byte Folded Reload 6108; MIPS32O0-NEXT: xor $2, $3, $2 6109; MIPS32O0-NEXT: sltiu $3, $2, 1 6110; MIPS32O0-NEXT: sync 6111; MIPS32O0-NEXT: lw $2, 0($sp) # 4-byte Folded Reload 6112; MIPS32O0-NEXT: addiu $sp, $sp, 8 6113; MIPS32O0-NEXT: jr $ra 6114; MIPS32O0-NEXT: nop 6115; 6116; MIPS32R2-LABEL: foo: 6117; MIPS32R2: # %bb.0: 6118; MIPS32R2-NEXT: addu $1, $5, $6 6119; MIPS32R2-NEXT: sync 6120; MIPS32R2-NEXT: addiu $2, $zero, -4 6121; MIPS32R2-NEXT: and $3, $4, $2 6122; MIPS32R2-NEXT: andi $2, $4, 3 6123; MIPS32R2-NEXT: sll $4, $2, 3 6124; MIPS32R2-NEXT: ori $2, $zero, 65535 6125; MIPS32R2-NEXT: sllv $5, $2, $4 6126; MIPS32R2-NEXT: nor $6, $zero, $5 6127; MIPS32R2-NEXT: andi $2, $1, 65535 6128; MIPS32R2-NEXT: sllv $8, $2, $4 6129; MIPS32R2-NEXT: andi $2, $7, 65535 6130; MIPS32R2-NEXT: sllv $7, $2, $4 6131; MIPS32R2-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6132; MIPS32R2-NEXT: ll $9, 0($3) 6133; MIPS32R2-NEXT: and $10, $9, $5 6134; MIPS32R2-NEXT: bne $10, $8, $BB15_3 6135; MIPS32R2-NEXT: nop 6136; MIPS32R2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6137; MIPS32R2-NEXT: and $9, $9, $6 6138; MIPS32R2-NEXT: or $9, $9, $7 6139; MIPS32R2-NEXT: sc $9, 0($3) 6140; MIPS32R2-NEXT: beqz $9, $BB15_1 6141; MIPS32R2-NEXT: nop 6142; MIPS32R2-NEXT: $BB15_3: 6143; MIPS32R2-NEXT: srlv $2, $10, $4 6144; MIPS32R2-NEXT: seh $2, $2 6145; MIPS32R2-NEXT: # %bb.4: 6146; MIPS32R2-NEXT: seh $1, $1 6147; MIPS32R2-NEXT: xor $1, $2, $1 6148; MIPS32R2-NEXT: sltiu $3, $1, 1 6149; MIPS32R2-NEXT: sync 6150; MIPS32R2-NEXT: jr $ra 6151; MIPS32R2-NEXT: nop 6152; 6153; MIPS32R6-LABEL: foo: 6154; MIPS32R6: # %bb.0: 6155; MIPS32R6-NEXT: addu $1, $5, $6 6156; MIPS32R6-NEXT: sync 6157; MIPS32R6-NEXT: addiu $2, $zero, -4 6158; MIPS32R6-NEXT: and $3, $4, $2 6159; MIPS32R6-NEXT: andi $2, $4, 3 6160; MIPS32R6-NEXT: sll $4, $2, 3 6161; MIPS32R6-NEXT: ori $2, $zero, 65535 6162; MIPS32R6-NEXT: sllv $5, $2, $4 6163; MIPS32R6-NEXT: nor $6, $zero, $5 6164; MIPS32R6-NEXT: andi $2, $1, 65535 6165; MIPS32R6-NEXT: sllv $8, $2, $4 6166; MIPS32R6-NEXT: andi $2, $7, 65535 6167; MIPS32R6-NEXT: sllv $7, $2, $4 6168; MIPS32R6-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6169; MIPS32R6-NEXT: ll $9, 0($3) 6170; MIPS32R6-NEXT: and $10, $9, $5 6171; MIPS32R6-NEXT: bnec $10, $8, $BB15_3 6172; MIPS32R6-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6173; MIPS32R6-NEXT: and $9, $9, $6 6174; MIPS32R6-NEXT: or $9, $9, $7 6175; MIPS32R6-NEXT: sc $9, 0($3) 6176; MIPS32R6-NEXT: beqzc $9, $BB15_1 6177; MIPS32R6-NEXT: $BB15_3: 6178; MIPS32R6-NEXT: srlv $2, $10, $4 6179; MIPS32R6-NEXT: seh $2, $2 6180; MIPS32R6-NEXT: # %bb.4: 6181; MIPS32R6-NEXT: seh $1, $1 6182; MIPS32R6-NEXT: xor $1, $2, $1 6183; MIPS32R6-NEXT: sltiu $3, $1, 1 6184; MIPS32R6-NEXT: sync 6185; MIPS32R6-NEXT: jrc $ra 6186; 6187; MIPS32R6O0-LABEL: foo: 6188; MIPS32R6O0: # %bb.0: 6189; MIPS32R6O0-NEXT: addiu $sp, $sp, -24 6190; MIPS32R6O0-NEXT: .cfi_def_cfa_offset 24 6191; MIPS32R6O0-NEXT: move $1, $7 6192; MIPS32R6O0-NEXT: move $2, $6 6193; MIPS32R6O0-NEXT: move $3, $5 6194; MIPS32R6O0-NEXT: move $8, $4 6195; MIPS32R6O0-NEXT: addu $5, $5, $6 6196; MIPS32R6O0-NEXT: sync 6197; MIPS32R6O0-NEXT: addiu $6, $zero, -4 6198; MIPS32R6O0-NEXT: and $6, $4, $6 6199; MIPS32R6O0-NEXT: andi $4, $4, 3 6200; MIPS32R6O0-NEXT: sll $4, $4, 3 6201; MIPS32R6O0-NEXT: ori $9, $zero, 65535 6202; MIPS32R6O0-NEXT: sllv $9, $9, $4 6203; MIPS32R6O0-NEXT: nor $10, $zero, $9 6204; MIPS32R6O0-NEXT: andi $11, $5, 65535 6205; MIPS32R6O0-NEXT: sllv $11, $11, $4 6206; MIPS32R6O0-NEXT: andi $7, $7, 65535 6207; MIPS32R6O0-NEXT: sllv $7, $7, $4 6208; MIPS32R6O0-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6209; MIPS32R6O0-NEXT: ll $13, 0($6) 6210; MIPS32R6O0-NEXT: and $14, $13, $9 6211; MIPS32R6O0-NEXT: bnec $14, $11, $BB15_3 6212; MIPS32R6O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6213; MIPS32R6O0-NEXT: and $13, $13, $10 6214; MIPS32R6O0-NEXT: or $13, $13, $7 6215; MIPS32R6O0-NEXT: sc $13, 0($6) 6216; MIPS32R6O0-NEXT: beqzc $13, $BB15_1 6217; MIPS32R6O0-NEXT: $BB15_3: 6218; MIPS32R6O0-NEXT: srlv $12, $14, $4 6219; MIPS32R6O0-NEXT: seh $12, $12 6220; MIPS32R6O0-NEXT: # %bb.4: 6221; MIPS32R6O0-NEXT: sw $1, 20($sp) # 4-byte Folded Spill 6222; MIPS32R6O0-NEXT: sw $2, 16($sp) # 4-byte Folded Spill 6223; MIPS32R6O0-NEXT: sw $3, 12($sp) # 4-byte Folded Spill 6224; MIPS32R6O0-NEXT: sw $8, 8($sp) # 4-byte Folded Spill 6225; MIPS32R6O0-NEXT: sw $5, 4($sp) # 4-byte Folded Spill 6226; MIPS32R6O0-NEXT: sw $12, 0($sp) # 4-byte Folded Spill 6227; MIPS32R6O0-NEXT: # %bb.5: 6228; MIPS32R6O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 6229; MIPS32R6O0-NEXT: seh $2, $1 6230; MIPS32R6O0-NEXT: lw $3, 0($sp) # 4-byte Folded Reload 6231; MIPS32R6O0-NEXT: xor $2, $3, $2 6232; MIPS32R6O0-NEXT: sltiu $3, $2, 1 6233; MIPS32R6O0-NEXT: sync 6234; MIPS32R6O0-NEXT: lw $2, 0($sp) # 4-byte Folded Reload 6235; MIPS32R6O0-NEXT: addiu $sp, $sp, 24 6236; MIPS32R6O0-NEXT: jrc $ra 6237; 6238; MIPS4-LABEL: foo: 6239; MIPS4: # %bb.0: 6240; MIPS4-NEXT: sll $1, $6, 0 6241; MIPS4-NEXT: sll $2, $5, 0 6242; MIPS4-NEXT: addu $1, $2, $1 6243; MIPS4-NEXT: sync 6244; MIPS4-NEXT: sll $2, $7, 0 6245; MIPS4-NEXT: daddiu $3, $zero, -4 6246; MIPS4-NEXT: and $3, $4, $3 6247; MIPS4-NEXT: andi $4, $4, 3 6248; MIPS4-NEXT: sll $4, $4, 3 6249; MIPS4-NEXT: ori $5, $zero, 65535 6250; MIPS4-NEXT: sllv $5, $5, $4 6251; MIPS4-NEXT: nor $6, $zero, $5 6252; MIPS4-NEXT: andi $7, $1, 65535 6253; MIPS4-NEXT: sllv $7, $7, $4 6254; MIPS4-NEXT: andi $2, $2, 65535 6255; MIPS4-NEXT: sllv $8, $2, $4 6256; MIPS4-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6257; MIPS4-NEXT: ll $9, 0($3) 6258; MIPS4-NEXT: and $10, $9, $5 6259; MIPS4-NEXT: bne $10, $7, .LBB15_3 6260; MIPS4-NEXT: nop 6261; MIPS4-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6262; MIPS4-NEXT: and $9, $9, $6 6263; MIPS4-NEXT: or $9, $9, $8 6264; MIPS4-NEXT: sc $9, 0($3) 6265; MIPS4-NEXT: beqz $9, .LBB15_1 6266; MIPS4-NEXT: nop 6267; MIPS4-NEXT: .LBB15_3: 6268; MIPS4-NEXT: srlv $2, $10, $4 6269; MIPS4-NEXT: sll $2, $2, 16 6270; MIPS4-NEXT: sra $2, $2, 16 6271; MIPS4-NEXT: # %bb.4: 6272; MIPS4-NEXT: sll $1, $1, 16 6273; MIPS4-NEXT: sra $1, $1, 16 6274; MIPS4-NEXT: xor $1, $2, $1 6275; MIPS4-NEXT: sltiu $3, $1, 1 6276; MIPS4-NEXT: sync 6277; MIPS4-NEXT: jr $ra 6278; MIPS4-NEXT: nop 6279; 6280; MIPS64-LABEL: foo: 6281; MIPS64: # %bb.0: 6282; MIPS64-NEXT: sll $1, $6, 0 6283; MIPS64-NEXT: sll $2, $5, 0 6284; MIPS64-NEXT: addu $1, $2, $1 6285; MIPS64-NEXT: sync 6286; MIPS64-NEXT: sll $2, $7, 0 6287; MIPS64-NEXT: daddiu $3, $zero, -4 6288; MIPS64-NEXT: and $3, $4, $3 6289; MIPS64-NEXT: andi $4, $4, 3 6290; MIPS64-NEXT: sll $4, $4, 3 6291; MIPS64-NEXT: ori $5, $zero, 65535 6292; MIPS64-NEXT: sllv $5, $5, $4 6293; MIPS64-NEXT: nor $6, $zero, $5 6294; MIPS64-NEXT: andi $7, $1, 65535 6295; MIPS64-NEXT: sllv $7, $7, $4 6296; MIPS64-NEXT: andi $2, $2, 65535 6297; MIPS64-NEXT: sllv $8, $2, $4 6298; MIPS64-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6299; MIPS64-NEXT: ll $9, 0($3) 6300; MIPS64-NEXT: and $10, $9, $5 6301; MIPS64-NEXT: bne $10, $7, .LBB15_3 6302; MIPS64-NEXT: nop 6303; MIPS64-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6304; MIPS64-NEXT: and $9, $9, $6 6305; MIPS64-NEXT: or $9, $9, $8 6306; MIPS64-NEXT: sc $9, 0($3) 6307; MIPS64-NEXT: beqz $9, .LBB15_1 6308; MIPS64-NEXT: nop 6309; MIPS64-NEXT: .LBB15_3: 6310; MIPS64-NEXT: srlv $2, $10, $4 6311; MIPS64-NEXT: sll $2, $2, 16 6312; MIPS64-NEXT: sra $2, $2, 16 6313; MIPS64-NEXT: # %bb.4: 6314; MIPS64-NEXT: sll $1, $1, 16 6315; MIPS64-NEXT: sra $1, $1, 16 6316; MIPS64-NEXT: xor $1, $2, $1 6317; MIPS64-NEXT: sltiu $3, $1, 1 6318; MIPS64-NEXT: sync 6319; MIPS64-NEXT: jr $ra 6320; MIPS64-NEXT: nop 6321; 6322; MIPS64R2-LABEL: foo: 6323; MIPS64R2: # %bb.0: 6324; MIPS64R2-NEXT: sll $1, $6, 0 6325; MIPS64R2-NEXT: sll $2, $5, 0 6326; MIPS64R2-NEXT: addu $1, $2, $1 6327; MIPS64R2-NEXT: sync 6328; MIPS64R2-NEXT: sll $2, $7, 0 6329; MIPS64R2-NEXT: daddiu $3, $zero, -4 6330; MIPS64R2-NEXT: and $3, $4, $3 6331; MIPS64R2-NEXT: andi $4, $4, 3 6332; MIPS64R2-NEXT: sll $4, $4, 3 6333; MIPS64R2-NEXT: ori $5, $zero, 65535 6334; MIPS64R2-NEXT: sllv $5, $5, $4 6335; MIPS64R2-NEXT: nor $6, $zero, $5 6336; MIPS64R2-NEXT: andi $7, $1, 65535 6337; MIPS64R2-NEXT: sllv $7, $7, $4 6338; MIPS64R2-NEXT: andi $2, $2, 65535 6339; MIPS64R2-NEXT: sllv $8, $2, $4 6340; MIPS64R2-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6341; MIPS64R2-NEXT: ll $9, 0($3) 6342; MIPS64R2-NEXT: and $10, $9, $5 6343; MIPS64R2-NEXT: bne $10, $7, .LBB15_3 6344; MIPS64R2-NEXT: nop 6345; MIPS64R2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6346; MIPS64R2-NEXT: and $9, $9, $6 6347; MIPS64R2-NEXT: or $9, $9, $8 6348; MIPS64R2-NEXT: sc $9, 0($3) 6349; MIPS64R2-NEXT: beqz $9, .LBB15_1 6350; MIPS64R2-NEXT: nop 6351; MIPS64R2-NEXT: .LBB15_3: 6352; MIPS64R2-NEXT: srlv $2, $10, $4 6353; MIPS64R2-NEXT: seh $2, $2 6354; MIPS64R2-NEXT: # %bb.4: 6355; MIPS64R2-NEXT: seh $1, $1 6356; MIPS64R2-NEXT: xor $1, $2, $1 6357; MIPS64R2-NEXT: sltiu $3, $1, 1 6358; MIPS64R2-NEXT: sync 6359; MIPS64R2-NEXT: jr $ra 6360; MIPS64R2-NEXT: nop 6361; 6362; MIPS64R6-LABEL: foo: 6363; MIPS64R6: # %bb.0: 6364; MIPS64R6-NEXT: sll $1, $6, 0 6365; MIPS64R6-NEXT: sll $2, $5, 0 6366; MIPS64R6-NEXT: addu $1, $2, $1 6367; MIPS64R6-NEXT: sync 6368; MIPS64R6-NEXT: sll $2, $7, 0 6369; MIPS64R6-NEXT: daddiu $3, $zero, -4 6370; MIPS64R6-NEXT: and $3, $4, $3 6371; MIPS64R6-NEXT: andi $4, $4, 3 6372; MIPS64R6-NEXT: sll $4, $4, 3 6373; MIPS64R6-NEXT: ori $5, $zero, 65535 6374; MIPS64R6-NEXT: sllv $5, $5, $4 6375; MIPS64R6-NEXT: nor $6, $zero, $5 6376; MIPS64R6-NEXT: andi $7, $1, 65535 6377; MIPS64R6-NEXT: sllv $7, $7, $4 6378; MIPS64R6-NEXT: andi $2, $2, 65535 6379; MIPS64R6-NEXT: sllv $8, $2, $4 6380; MIPS64R6-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6381; MIPS64R6-NEXT: ll $9, 0($3) 6382; MIPS64R6-NEXT: and $10, $9, $5 6383; MIPS64R6-NEXT: bnec $10, $7, .LBB15_3 6384; MIPS64R6-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6385; MIPS64R6-NEXT: and $9, $9, $6 6386; MIPS64R6-NEXT: or $9, $9, $8 6387; MIPS64R6-NEXT: sc $9, 0($3) 6388; MIPS64R6-NEXT: beqzc $9, .LBB15_1 6389; MIPS64R6-NEXT: .LBB15_3: 6390; MIPS64R6-NEXT: srlv $2, $10, $4 6391; MIPS64R6-NEXT: seh $2, $2 6392; MIPS64R6-NEXT: # %bb.4: 6393; MIPS64R6-NEXT: seh $1, $1 6394; MIPS64R6-NEXT: xor $1, $2, $1 6395; MIPS64R6-NEXT: sltiu $3, $1, 1 6396; MIPS64R6-NEXT: sync 6397; MIPS64R6-NEXT: jrc $ra 6398; 6399; MIPS64R6O0-LABEL: foo: 6400; MIPS64R6O0: # %bb.0: 6401; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 6402; MIPS64R6O0-NEXT: .cfi_def_cfa_offset 16 6403; MIPS64R6O0-NEXT: move $1, $7 6404; MIPS64R6O0-NEXT: sll $1, $1, 0 6405; MIPS64R6O0-NEXT: move $2, $6 6406; MIPS64R6O0-NEXT: sll $2, $2, 0 6407; MIPS64R6O0-NEXT: move $3, $5 6408; MIPS64R6O0-NEXT: sll $3, $3, 0 6409; MIPS64R6O0-NEXT: move $5, $4 6410; MIPS64R6O0-NEXT: addu $2, $3, $2 6411; MIPS64R6O0-NEXT: sync 6412; MIPS64R6O0-NEXT: daddiu $6, $zero, -4 6413; MIPS64R6O0-NEXT: and $6, $4, $6 6414; MIPS64R6O0-NEXT: andi $3, $4, 3 6415; MIPS64R6O0-NEXT: xori $3, $3, 2 6416; MIPS64R6O0-NEXT: sll $3, $3, 3 6417; MIPS64R6O0-NEXT: ori $8, $zero, 65535 6418; MIPS64R6O0-NEXT: sllv $8, $8, $3 6419; MIPS64R6O0-NEXT: nor $9, $zero, $8 6420; MIPS64R6O0-NEXT: andi $10, $2, 65535 6421; MIPS64R6O0-NEXT: sllv $10, $10, $3 6422; MIPS64R6O0-NEXT: andi $1, $1, 65535 6423; MIPS64R6O0-NEXT: sllv $1, $1, $3 6424; MIPS64R6O0-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6425; MIPS64R6O0-NEXT: ll $12, 0($6) 6426; MIPS64R6O0-NEXT: and $13, $12, $8 6427; MIPS64R6O0-NEXT: bnec $13, $10, .LBB15_3 6428; MIPS64R6O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6429; MIPS64R6O0-NEXT: and $12, $12, $9 6430; MIPS64R6O0-NEXT: or $12, $12, $1 6431; MIPS64R6O0-NEXT: sc $12, 0($6) 6432; MIPS64R6O0-NEXT: beqzc $12, .LBB15_1 6433; MIPS64R6O0-NEXT: .LBB15_3: 6434; MIPS64R6O0-NEXT: srlv $11, $13, $3 6435; MIPS64R6O0-NEXT: seh $11, $11 6436; MIPS64R6O0-NEXT: # %bb.4: 6437; MIPS64R6O0-NEXT: sd $5, 8($sp) # 8-byte Folded Spill 6438; MIPS64R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 6439; MIPS64R6O0-NEXT: sw $11, 0($sp) # 4-byte Folded Spill 6440; MIPS64R6O0-NEXT: # %bb.5: 6441; MIPS64R6O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 6442; MIPS64R6O0-NEXT: seh $2, $1 6443; MIPS64R6O0-NEXT: lw $3, 0($sp) # 4-byte Folded Reload 6444; MIPS64R6O0-NEXT: xor $2, $3, $2 6445; MIPS64R6O0-NEXT: sltiu $3, $2, 1 6446; MIPS64R6O0-NEXT: sync 6447; MIPS64R6O0-NEXT: lw $2, 0($sp) # 4-byte Folded Reload 6448; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 6449; MIPS64R6O0-NEXT: jrc $ra 6450; 6451; MM32-LABEL: foo: 6452; MM32: # %bb.0: 6453; MM32-NEXT: addu16 $3, $5, $6 6454; MM32-NEXT: sync 6455; MM32-NEXT: addiu $1, $zero, -4 6456; MM32-NEXT: and $1, $4, $1 6457; MM32-NEXT: andi $2, $4, 3 6458; MM32-NEXT: sll $4, $2, 3 6459; MM32-NEXT: ori $2, $zero, 65535 6460; MM32-NEXT: sllv $5, $2, $4 6461; MM32-NEXT: nor $6, $zero, $5 6462; MM32-NEXT: andi $2, $3, 65535 6463; MM32-NEXT: sllv $8, $2, $4 6464; MM32-NEXT: andi $2, $7, 65535 6465; MM32-NEXT: sllv $7, $2, $4 6466; MM32-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6467; MM32-NEXT: ll $9, 0($1) 6468; MM32-NEXT: and $10, $9, $5 6469; MM32-NEXT: bne $10, $8, $BB15_3 6470; MM32-NEXT: nop 6471; MM32-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6472; MM32-NEXT: and $9, $9, $6 6473; MM32-NEXT: or $9, $9, $7 6474; MM32-NEXT: sc $9, 0($1) 6475; MM32-NEXT: beqzc $9, $BB15_1 6476; MM32-NEXT: $BB15_3: 6477; MM32-NEXT: srlv $2, $10, $4 6478; MM32-NEXT: seh $2, $2 6479; MM32-NEXT: # %bb.4: 6480; MM32-NEXT: seh $1, $3 6481; MM32-NEXT: xor $1, $2, $1 6482; MM32-NEXT: sltiu $3, $1, 1 6483; MM32-NEXT: sync 6484; MM32-NEXT: jrc $ra 6485; 6486; O1-LABEL: foo: 6487; O1: # %bb.0: 6488; O1-NEXT: addu $1, $5, $6 6489; O1-NEXT: sync 6490; O1-NEXT: addiu $2, $zero, -4 6491; O1-NEXT: and $3, $4, $2 6492; O1-NEXT: andi $2, $4, 3 6493; O1-NEXT: sll $4, $2, 3 6494; O1-NEXT: ori $2, $zero, 65535 6495; O1-NEXT: sllv $5, $2, $4 6496; O1-NEXT: nor $6, $zero, $5 6497; O1-NEXT: andi $2, $1, 65535 6498; O1-NEXT: sllv $8, $2, $4 6499; O1-NEXT: andi $2, $7, 65535 6500; O1-NEXT: sllv $7, $2, $4 6501; O1-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6502; O1-NEXT: ll $9, 0($3) 6503; O1-NEXT: and $10, $9, $5 6504; O1-NEXT: bne $10, $8, $BB15_3 6505; O1-NEXT: nop 6506; O1-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6507; O1-NEXT: and $9, $9, $6 6508; O1-NEXT: or $9, $9, $7 6509; O1-NEXT: sc $9, 0($3) 6510; O1-NEXT: beqz $9, $BB15_1 6511; O1-NEXT: nop 6512; O1-NEXT: $BB15_3: 6513; O1-NEXT: srlv $2, $10, $4 6514; O1-NEXT: sll $2, $2, 16 6515; O1-NEXT: sra $2, $2, 16 6516; O1-NEXT: # %bb.4: 6517; O1-NEXT: sll $1, $1, 16 6518; O1-NEXT: sra $1, $1, 16 6519; O1-NEXT: xor $1, $2, $1 6520; O1-NEXT: sltiu $3, $1, 1 6521; O1-NEXT: sync 6522; O1-NEXT: jr $ra 6523; O1-NEXT: nop 6524; 6525; O2-LABEL: foo: 6526; O2: # %bb.0: 6527; O2-NEXT: addu $1, $5, $6 6528; O2-NEXT: sync 6529; O2-NEXT: addiu $2, $zero, -4 6530; O2-NEXT: and $3, $4, $2 6531; O2-NEXT: andi $2, $4, 3 6532; O2-NEXT: sll $4, $2, 3 6533; O2-NEXT: ori $2, $zero, 65535 6534; O2-NEXT: sllv $5, $2, $4 6535; O2-NEXT: nor $6, $zero, $5 6536; O2-NEXT: andi $2, $1, 65535 6537; O2-NEXT: sllv $8, $2, $4 6538; O2-NEXT: andi $2, $7, 65535 6539; O2-NEXT: sllv $7, $2, $4 6540; O2-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6541; O2-NEXT: ll $9, 0($3) 6542; O2-NEXT: and $10, $9, $5 6543; O2-NEXT: bne $10, $8, $BB15_3 6544; O2-NEXT: nop 6545; O2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6546; O2-NEXT: and $9, $9, $6 6547; O2-NEXT: or $9, $9, $7 6548; O2-NEXT: sc $9, 0($3) 6549; O2-NEXT: beqz $9, $BB15_1 6550; O2-NEXT: nop 6551; O2-NEXT: $BB15_3: 6552; O2-NEXT: srlv $2, $10, $4 6553; O2-NEXT: sll $2, $2, 16 6554; O2-NEXT: sra $2, $2, 16 6555; O2-NEXT: # %bb.4: 6556; O2-NEXT: sll $1, $1, 16 6557; O2-NEXT: sra $1, $1, 16 6558; O2-NEXT: xor $1, $2, $1 6559; O2-NEXT: sltiu $3, $1, 1 6560; O2-NEXT: sync 6561; O2-NEXT: jr $ra 6562; O2-NEXT: nop 6563; 6564; O3-LABEL: foo: 6565; O3: # %bb.0: 6566; O3-NEXT: addiu $2, $zero, -4 6567; O3-NEXT: addu $1, $5, $6 6568; O3-NEXT: sync 6569; O3-NEXT: and $3, $4, $2 6570; O3-NEXT: andi $2, $4, 3 6571; O3-NEXT: sll $4, $2, 3 6572; O3-NEXT: ori $2, $zero, 65535 6573; O3-NEXT: sllv $5, $2, $4 6574; O3-NEXT: andi $2, $1, 65535 6575; O3-NEXT: sll $1, $1, 16 6576; O3-NEXT: sllv $8, $2, $4 6577; O3-NEXT: andi $2, $7, 65535 6578; O3-NEXT: nor $6, $zero, $5 6579; O3-NEXT: sra $1, $1, 16 6580; O3-NEXT: sllv $7, $2, $4 6581; O3-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6582; O3-NEXT: ll $9, 0($3) 6583; O3-NEXT: and $10, $9, $5 6584; O3-NEXT: bne $10, $8, $BB15_3 6585; O3-NEXT: nop 6586; O3-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6587; O3-NEXT: and $9, $9, $6 6588; O3-NEXT: or $9, $9, $7 6589; O3-NEXT: sc $9, 0($3) 6590; O3-NEXT: beqz $9, $BB15_1 6591; O3-NEXT: nop 6592; O3-NEXT: $BB15_3: 6593; O3-NEXT: srlv $2, $10, $4 6594; O3-NEXT: sll $2, $2, 16 6595; O3-NEXT: sra $2, $2, 16 6596; O3-NEXT: # %bb.4: 6597; O3-NEXT: sync 6598; O3-NEXT: xor $1, $2, $1 6599; O3-NEXT: jr $ra 6600; O3-NEXT: sltiu $3, $1, 1 6601; 6602; MIPS32EB-LABEL: foo: 6603; MIPS32EB: # %bb.0: 6604; MIPS32EB-NEXT: addu $1, $5, $6 6605; MIPS32EB-NEXT: sync 6606; MIPS32EB-NEXT: addiu $2, $zero, -4 6607; MIPS32EB-NEXT: and $3, $4, $2 6608; MIPS32EB-NEXT: andi $2, $4, 3 6609; MIPS32EB-NEXT: xori $2, $2, 2 6610; MIPS32EB-NEXT: sll $4, $2, 3 6611; MIPS32EB-NEXT: ori $2, $zero, 65535 6612; MIPS32EB-NEXT: sllv $5, $2, $4 6613; MIPS32EB-NEXT: nor $6, $zero, $5 6614; MIPS32EB-NEXT: andi $2, $1, 65535 6615; MIPS32EB-NEXT: sllv $8, $2, $4 6616; MIPS32EB-NEXT: andi $2, $7, 65535 6617; MIPS32EB-NEXT: sllv $7, $2, $4 6618; MIPS32EB-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6619; MIPS32EB-NEXT: ll $9, 0($3) 6620; MIPS32EB-NEXT: and $10, $9, $5 6621; MIPS32EB-NEXT: bne $10, $8, $BB15_3 6622; MIPS32EB-NEXT: nop 6623; MIPS32EB-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6624; MIPS32EB-NEXT: and $9, $9, $6 6625; MIPS32EB-NEXT: or $9, $9, $7 6626; MIPS32EB-NEXT: sc $9, 0($3) 6627; MIPS32EB-NEXT: beqz $9, $BB15_1 6628; MIPS32EB-NEXT: nop 6629; MIPS32EB-NEXT: $BB15_3: 6630; MIPS32EB-NEXT: srlv $2, $10, $4 6631; MIPS32EB-NEXT: sll $2, $2, 16 6632; MIPS32EB-NEXT: sra $2, $2, 16 6633; MIPS32EB-NEXT: # %bb.4: 6634; MIPS32EB-NEXT: sll $1, $1, 16 6635; MIPS32EB-NEXT: sra $1, $1, 16 6636; MIPS32EB-NEXT: xor $1, $2, $1 6637; MIPS32EB-NEXT: sltiu $3, $1, 1 6638; MIPS32EB-NEXT: sync 6639; MIPS32EB-NEXT: jr $ra 6640; MIPS32EB-NEXT: nop 6641 %desired = add i16 %l, %r 6642 %res = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst 6643 ret {i16, i1} %res 6644} 6645 6646@countsint = common global i32 0, align 4 6647 6648define i32 @CheckSync(i32 signext %v) nounwind noinline { 6649; MIPS32-LABEL: CheckSync: 6650; MIPS32: # %bb.0: # %entry 6651; MIPS32-NEXT: lui $2, %hi(_gp_disp) 6652; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 6653; MIPS32-NEXT: addu $1, $2, $25 6654; MIPS32-NEXT: sync 6655; MIPS32-NEXT: lw $1, %got(countsint)($1) 6656; MIPS32-NEXT: $BB16_1: # %entry 6657; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 6658; MIPS32-NEXT: ll $2, 0($1) 6659; MIPS32-NEXT: addu $3, $2, $4 6660; MIPS32-NEXT: sc $3, 0($1) 6661; MIPS32-NEXT: beqz $3, $BB16_1 6662; MIPS32-NEXT: nop 6663; MIPS32-NEXT: # %bb.2: # %entry 6664; MIPS32-NEXT: sync 6665; MIPS32-NEXT: jr $ra 6666; MIPS32-NEXT: nop 6667; 6668; MIPS32O0-LABEL: CheckSync: 6669; MIPS32O0: # %bb.0: # %entry 6670; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 6671; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6672; MIPS32O0-NEXT: addu $1, $2, $25 6673; MIPS32O0-NEXT: sync 6674; MIPS32O0-NEXT: lw $1, %got(countsint)($1) 6675; MIPS32O0-NEXT: $BB16_1: # %entry 6676; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 6677; MIPS32O0-NEXT: ll $2, 0($1) 6678; MIPS32O0-NEXT: addu $3, $2, $4 6679; MIPS32O0-NEXT: sc $3, 0($1) 6680; MIPS32O0-NEXT: beqz $3, $BB16_1 6681; MIPS32O0-NEXT: nop 6682; MIPS32O0-NEXT: # %bb.2: # %entry 6683; MIPS32O0-NEXT: sync 6684; MIPS32O0-NEXT: jr $ra 6685; MIPS32O0-NEXT: nop 6686; 6687; MIPS32R2-LABEL: CheckSync: 6688; MIPS32R2: # %bb.0: # %entry 6689; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 6690; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 6691; MIPS32R2-NEXT: addu $1, $2, $25 6692; MIPS32R2-NEXT: sync 6693; MIPS32R2-NEXT: lw $1, %got(countsint)($1) 6694; MIPS32R2-NEXT: $BB16_1: # %entry 6695; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 6696; MIPS32R2-NEXT: ll $2, 0($1) 6697; MIPS32R2-NEXT: addu $3, $2, $4 6698; MIPS32R2-NEXT: sc $3, 0($1) 6699; MIPS32R2-NEXT: beqz $3, $BB16_1 6700; MIPS32R2-NEXT: nop 6701; MIPS32R2-NEXT: # %bb.2: # %entry 6702; MIPS32R2-NEXT: sync 6703; MIPS32R2-NEXT: jr $ra 6704; MIPS32R2-NEXT: nop 6705; 6706; MIPS32R6-LABEL: CheckSync: 6707; MIPS32R6: # %bb.0: # %entry 6708; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 6709; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 6710; MIPS32R6-NEXT: addu $1, $2, $25 6711; MIPS32R6-NEXT: sync 6712; MIPS32R6-NEXT: lw $1, %got(countsint)($1) 6713; MIPS32R6-NEXT: $BB16_1: # %entry 6714; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 6715; MIPS32R6-NEXT: ll $2, 0($1) 6716; MIPS32R6-NEXT: addu $3, $2, $4 6717; MIPS32R6-NEXT: sc $3, 0($1) 6718; MIPS32R6-NEXT: beqzc $3, $BB16_1 6719; MIPS32R6-NEXT: # %bb.2: # %entry 6720; MIPS32R6-NEXT: sync 6721; MIPS32R6-NEXT: jrc $ra 6722; 6723; MIPS32R6O0-LABEL: CheckSync: 6724; MIPS32R6O0: # %bb.0: # %entry 6725; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 6726; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6727; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 6728; MIPS32R6O0-NEXT: addu $1, $2, $25 6729; MIPS32R6O0-NEXT: move $2, $4 6730; MIPS32R6O0-NEXT: sync 6731; MIPS32R6O0-NEXT: lw $1, %got(countsint)($1) 6732; MIPS32R6O0-NEXT: $BB16_1: # %entry 6733; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 6734; MIPS32R6O0-NEXT: ll $3, 0($1) 6735; MIPS32R6O0-NEXT: addu $5, $3, $4 6736; MIPS32R6O0-NEXT: sc $5, 0($1) 6737; MIPS32R6O0-NEXT: beqzc $5, $BB16_1 6738; MIPS32R6O0-NEXT: # %bb.2: # %entry 6739; MIPS32R6O0-NEXT: sync 6740; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 6741; MIPS32R6O0-NEXT: move $2, $3 6742; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 6743; MIPS32R6O0-NEXT: jrc $ra 6744; 6745; MIPS4-LABEL: CheckSync: 6746; MIPS4: # %bb.0: # %entry 6747; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6748; MIPS4-NEXT: daddu $1, $1, $25 6749; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6750; MIPS4-NEXT: sync 6751; MIPS4-NEXT: ld $1, %got_disp(countsint)($1) 6752; MIPS4-NEXT: .LBB16_1: # %entry 6753; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 6754; MIPS4-NEXT: ll $2, 0($1) 6755; MIPS4-NEXT: addu $3, $2, $4 6756; MIPS4-NEXT: sc $3, 0($1) 6757; MIPS4-NEXT: beqz $3, .LBB16_1 6758; MIPS4-NEXT: nop 6759; MIPS4-NEXT: # %bb.2: # %entry 6760; MIPS4-NEXT: sync 6761; MIPS4-NEXT: jr $ra 6762; MIPS4-NEXT: nop 6763; 6764; MIPS64-LABEL: CheckSync: 6765; MIPS64: # %bb.0: # %entry 6766; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6767; MIPS64-NEXT: daddu $1, $1, $25 6768; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6769; MIPS64-NEXT: sync 6770; MIPS64-NEXT: ld $1, %got_disp(countsint)($1) 6771; MIPS64-NEXT: .LBB16_1: # %entry 6772; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 6773; MIPS64-NEXT: ll $2, 0($1) 6774; MIPS64-NEXT: addu $3, $2, $4 6775; MIPS64-NEXT: sc $3, 0($1) 6776; MIPS64-NEXT: beqz $3, .LBB16_1 6777; MIPS64-NEXT: nop 6778; MIPS64-NEXT: # %bb.2: # %entry 6779; MIPS64-NEXT: sync 6780; MIPS64-NEXT: jr $ra 6781; MIPS64-NEXT: nop 6782; 6783; MIPS64R2-LABEL: CheckSync: 6784; MIPS64R2: # %bb.0: # %entry 6785; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6786; MIPS64R2-NEXT: daddu $1, $1, $25 6787; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6788; MIPS64R2-NEXT: sync 6789; MIPS64R2-NEXT: ld $1, %got_disp(countsint)($1) 6790; MIPS64R2-NEXT: .LBB16_1: # %entry 6791; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 6792; MIPS64R2-NEXT: ll $2, 0($1) 6793; MIPS64R2-NEXT: addu $3, $2, $4 6794; MIPS64R2-NEXT: sc $3, 0($1) 6795; MIPS64R2-NEXT: beqz $3, .LBB16_1 6796; MIPS64R2-NEXT: nop 6797; MIPS64R2-NEXT: # %bb.2: # %entry 6798; MIPS64R2-NEXT: sync 6799; MIPS64R2-NEXT: jr $ra 6800; MIPS64R2-NEXT: nop 6801; 6802; MIPS64R6-LABEL: CheckSync: 6803; MIPS64R6: # %bb.0: # %entry 6804; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6805; MIPS64R6-NEXT: daddu $1, $1, $25 6806; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6807; MIPS64R6-NEXT: sync 6808; MIPS64R6-NEXT: ld $1, %got_disp(countsint)($1) 6809; MIPS64R6-NEXT: .LBB16_1: # %entry 6810; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 6811; MIPS64R6-NEXT: ll $2, 0($1) 6812; MIPS64R6-NEXT: addu $3, $2, $4 6813; MIPS64R6-NEXT: sc $3, 0($1) 6814; MIPS64R6-NEXT: beqzc $3, .LBB16_1 6815; MIPS64R6-NEXT: # %bb.2: # %entry 6816; MIPS64R6-NEXT: sync 6817; MIPS64R6-NEXT: jrc $ra 6818; 6819; MIPS64R6O0-LABEL: CheckSync: 6820; MIPS64R6O0: # %bb.0: # %entry 6821; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6822; MIPS64R6O0-NEXT: daddu $1, $1, $25 6823; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6824; MIPS64R6O0-NEXT: move $2, $4 6825; MIPS64R6O0-NEXT: sync 6826; MIPS64R6O0-NEXT: ld $1, %got_disp(countsint)($1) 6827; MIPS64R6O0-NEXT: .LBB16_1: # %entry 6828; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 6829; MIPS64R6O0-NEXT: ll $3, 0($1) 6830; MIPS64R6O0-NEXT: addu $5, $3, $2 6831; MIPS64R6O0-NEXT: sc $5, 0($1) 6832; MIPS64R6O0-NEXT: beqzc $5, .LBB16_1 6833; MIPS64R6O0-NEXT: # %bb.2: # %entry 6834; MIPS64R6O0-NEXT: sync 6835; MIPS64R6O0-NEXT: move $2, $3 6836; MIPS64R6O0-NEXT: jrc $ra 6837; 6838; MM32-LABEL: CheckSync: 6839; MM32: # %bb.0: # %entry 6840; MM32-NEXT: lui $2, %hi(_gp_disp) 6841; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 6842; MM32-NEXT: addu $2, $2, $25 6843; MM32-NEXT: sync 6844; MM32-NEXT: lw $1, %got(countsint)($2) 6845; MM32-NEXT: $BB16_1: # %entry 6846; MM32-NEXT: # =>This Inner Loop Header: Depth=1 6847; MM32-NEXT: ll $2, 0($1) 6848; MM32-NEXT: addu16 $3, $2, $4 6849; MM32-NEXT: sc $3, 0($1) 6850; MM32-NEXT: beqzc $3, $BB16_1 6851; MM32-NEXT: # %bb.2: # %entry 6852; MM32-NEXT: sync 6853; MM32-NEXT: jrc $ra 6854; 6855; O1-LABEL: CheckSync: 6856; O1: # %bb.0: # %entry 6857; O1-NEXT: lui $2, %hi(_gp_disp) 6858; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 6859; O1-NEXT: addu $1, $2, $25 6860; O1-NEXT: sync 6861; O1-NEXT: lw $1, %got(countsint)($1) 6862; O1-NEXT: $BB16_1: # %entry 6863; O1-NEXT: # =>This Inner Loop Header: Depth=1 6864; O1-NEXT: ll $2, 0($1) 6865; O1-NEXT: addu $3, $2, $4 6866; O1-NEXT: sc $3, 0($1) 6867; O1-NEXT: beqz $3, $BB16_1 6868; O1-NEXT: nop 6869; O1-NEXT: # %bb.2: # %entry 6870; O1-NEXT: sync 6871; O1-NEXT: jr $ra 6872; O1-NEXT: nop 6873; 6874; O2-LABEL: CheckSync: 6875; O2: # %bb.0: # %entry 6876; O2-NEXT: lui $2, %hi(_gp_disp) 6877; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 6878; O2-NEXT: addu $1, $2, $25 6879; O2-NEXT: sync 6880; O2-NEXT: lw $1, %got(countsint)($1) 6881; O2-NEXT: $BB16_1: # %entry 6882; O2-NEXT: # =>This Inner Loop Header: Depth=1 6883; O2-NEXT: ll $2, 0($1) 6884; O2-NEXT: addu $3, $2, $4 6885; O2-NEXT: sc $3, 0($1) 6886; O2-NEXT: beqz $3, $BB16_1 6887; O2-NEXT: nop 6888; O2-NEXT: # %bb.2: # %entry 6889; O2-NEXT: sync 6890; O2-NEXT: jr $ra 6891; O2-NEXT: nop 6892; 6893; O3-LABEL: CheckSync: 6894; O3: # %bb.0: # %entry 6895; O3-NEXT: lui $2, %hi(_gp_disp) 6896; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 6897; O3-NEXT: addu $1, $2, $25 6898; O3-NEXT: sync 6899; O3-NEXT: lw $1, %got(countsint)($1) 6900; O3-NEXT: $BB16_1: # %entry 6901; O3-NEXT: # =>This Inner Loop Header: Depth=1 6902; O3-NEXT: ll $2, 0($1) 6903; O3-NEXT: addu $3, $2, $4 6904; O3-NEXT: sc $3, 0($1) 6905; O3-NEXT: beqz $3, $BB16_1 6906; O3-NEXT: nop 6907; O3-NEXT: # %bb.2: # %entry 6908; O3-NEXT: sync 6909; O3-NEXT: jr $ra 6910; O3-NEXT: nop 6911; 6912; MIPS32EB-LABEL: CheckSync: 6913; MIPS32EB: # %bb.0: # %entry 6914; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 6915; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 6916; MIPS32EB-NEXT: addu $1, $2, $25 6917; MIPS32EB-NEXT: sync 6918; MIPS32EB-NEXT: lw $1, %got(countsint)($1) 6919; MIPS32EB-NEXT: $BB16_1: # %entry 6920; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 6921; MIPS32EB-NEXT: ll $2, 0($1) 6922; MIPS32EB-NEXT: addu $3, $2, $4 6923; MIPS32EB-NEXT: sc $3, 0($1) 6924; MIPS32EB-NEXT: beqz $3, $BB16_1 6925; MIPS32EB-NEXT: nop 6926; MIPS32EB-NEXT: # %bb.2: # %entry 6927; MIPS32EB-NEXT: sync 6928; MIPS32EB-NEXT: jr $ra 6929; MIPS32EB-NEXT: nop 6930entry: 6931 %0 = atomicrmw add i32* @countsint, i32 %v seq_cst 6932 ret i32 %0 6933} 6934 6935; make sure that this assertion in 6936; TwoAddressInstructionPass::TryInstructionTransform does not fail: 6937; 6938; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) && 6939; 6940; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an 6941; operand of an atomic instruction with register $zero. 6942@a = external global i32 6943 6944define i32 @zeroreg() nounwind { 6945; MIPS32-LABEL: zeroreg: 6946; MIPS32: # %bb.0: # %entry 6947; MIPS32-NEXT: lui $2, %hi(_gp_disp) 6948; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 6949; MIPS32-NEXT: addu $1, $2, $25 6950; MIPS32-NEXT: sync 6951; MIPS32-NEXT: addiu $2, $zero, 0 6952; MIPS32-NEXT: addiu $3, $zero, 1 6953; MIPS32-NEXT: lw $1, %got(a)($1) 6954; MIPS32-NEXT: $BB17_1: # %entry 6955; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 6956; MIPS32-NEXT: ll $4, 0($1) 6957; MIPS32-NEXT: bne $4, $3, $BB17_3 6958; MIPS32-NEXT: nop 6959; MIPS32-NEXT: # %bb.2: # %entry 6960; MIPS32-NEXT: # in Loop: Header=BB17_1 Depth=1 6961; MIPS32-NEXT: move $5, $2 6962; MIPS32-NEXT: sc $5, 0($1) 6963; MIPS32-NEXT: beqz $5, $BB17_1 6964; MIPS32-NEXT: nop 6965; MIPS32-NEXT: $BB17_3: # %entry 6966; MIPS32-NEXT: xor $1, $4, $3 6967; MIPS32-NEXT: sltiu $2, $1, 1 6968; MIPS32-NEXT: sync 6969; MIPS32-NEXT: jr $ra 6970; MIPS32-NEXT: nop 6971; 6972; MIPS32O0-LABEL: zeroreg: 6973; MIPS32O0: # %bb.0: # %entry 6974; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 6975; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6976; MIPS32O0-NEXT: addiu $sp, $sp, -8 6977; MIPS32O0-NEXT: addu $1, $2, $25 6978; MIPS32O0-NEXT: sync 6979; MIPS32O0-NEXT: lw $1, %got(a)($1) 6980; MIPS32O0-NEXT: addiu $2, $zero, 0 6981; MIPS32O0-NEXT: addiu $3, $zero, 1 6982; MIPS32O0-NEXT: move $4, $3 6983; MIPS32O0-NEXT: $BB17_1: # %entry 6984; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 6985; MIPS32O0-NEXT: ll $5, 0($1) 6986; MIPS32O0-NEXT: bne $5, $4, $BB17_3 6987; MIPS32O0-NEXT: nop 6988; MIPS32O0-NEXT: # %bb.2: # %entry 6989; MIPS32O0-NEXT: # in Loop: Header=BB17_1 Depth=1 6990; MIPS32O0-NEXT: move $6, $2 6991; MIPS32O0-NEXT: sc $6, 0($1) 6992; MIPS32O0-NEXT: beqz $6, $BB17_1 6993; MIPS32O0-NEXT: nop 6994; MIPS32O0-NEXT: $BB17_3: # %entry 6995; MIPS32O0-NEXT: xor $1, $5, $3 6996; MIPS32O0-NEXT: sltiu $1, $1, 1 6997; MIPS32O0-NEXT: sync 6998; MIPS32O0-NEXT: addiu $2, $zero, 1 6999; MIPS32O0-NEXT: xor $2, $5, $2 7000; MIPS32O0-NEXT: sltiu $2, $2, 1 7001; MIPS32O0-NEXT: andi $2, $2, 1 7002; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 7003; MIPS32O0-NEXT: addiu $sp, $sp, 8 7004; MIPS32O0-NEXT: jr $ra 7005; MIPS32O0-NEXT: nop 7006; 7007; MIPS32R2-LABEL: zeroreg: 7008; MIPS32R2: # %bb.0: # %entry 7009; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 7010; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 7011; MIPS32R2-NEXT: addu $1, $2, $25 7012; MIPS32R2-NEXT: sync 7013; MIPS32R2-NEXT: addiu $2, $zero, 0 7014; MIPS32R2-NEXT: addiu $3, $zero, 1 7015; MIPS32R2-NEXT: lw $1, %got(a)($1) 7016; MIPS32R2-NEXT: $BB17_1: # %entry 7017; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 7018; MIPS32R2-NEXT: ll $4, 0($1) 7019; MIPS32R2-NEXT: bne $4, $3, $BB17_3 7020; MIPS32R2-NEXT: nop 7021; MIPS32R2-NEXT: # %bb.2: # %entry 7022; MIPS32R2-NEXT: # in Loop: Header=BB17_1 Depth=1 7023; MIPS32R2-NEXT: move $5, $2 7024; MIPS32R2-NEXT: sc $5, 0($1) 7025; MIPS32R2-NEXT: beqz $5, $BB17_1 7026; MIPS32R2-NEXT: nop 7027; MIPS32R2-NEXT: $BB17_3: # %entry 7028; MIPS32R2-NEXT: xor $1, $4, $3 7029; MIPS32R2-NEXT: sltiu $2, $1, 1 7030; MIPS32R2-NEXT: sync 7031; MIPS32R2-NEXT: jr $ra 7032; MIPS32R2-NEXT: nop 7033; 7034; MIPS32R6-LABEL: zeroreg: 7035; MIPS32R6: # %bb.0: # %entry 7036; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 7037; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 7038; MIPS32R6-NEXT: addu $1, $2, $25 7039; MIPS32R6-NEXT: sync 7040; MIPS32R6-NEXT: addiu $2, $zero, 0 7041; MIPS32R6-NEXT: addiu $3, $zero, 1 7042; MIPS32R6-NEXT: lw $1, %got(a)($1) 7043; MIPS32R6-NEXT: $BB17_1: # %entry 7044; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 7045; MIPS32R6-NEXT: ll $4, 0($1) 7046; MIPS32R6-NEXT: bnec $4, $3, $BB17_3 7047; MIPS32R6-NEXT: # %bb.2: # %entry 7048; MIPS32R6-NEXT: # in Loop: Header=BB17_1 Depth=1 7049; MIPS32R6-NEXT: move $5, $2 7050; MIPS32R6-NEXT: sc $5, 0($1) 7051; MIPS32R6-NEXT: beqzc $5, $BB17_1 7052; MIPS32R6-NEXT: $BB17_3: # %entry 7053; MIPS32R6-NEXT: xor $1, $4, $3 7054; MIPS32R6-NEXT: sltiu $2, $1, 1 7055; MIPS32R6-NEXT: sync 7056; MIPS32R6-NEXT: jrc $ra 7057; 7058; MIPS32R6O0-LABEL: zeroreg: 7059; MIPS32R6O0: # %bb.0: # %entry 7060; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 7061; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 7062; MIPS32R6O0-NEXT: addu $1, $2, $25 7063; MIPS32R6O0-NEXT: sync 7064; MIPS32R6O0-NEXT: lw $1, %got(a)($1) 7065; MIPS32R6O0-NEXT: addiu $2, $zero, 0 7066; MIPS32R6O0-NEXT: addiu $3, $zero, 1 7067; MIPS32R6O0-NEXT: move $4, $3 7068; MIPS32R6O0-NEXT: $BB17_1: # %entry 7069; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7070; MIPS32R6O0-NEXT: ll $5, 0($1) 7071; MIPS32R6O0-NEXT: bnec $5, $4, $BB17_3 7072; MIPS32R6O0-NEXT: # %bb.2: # %entry 7073; MIPS32R6O0-NEXT: # in Loop: Header=BB17_1 Depth=1 7074; MIPS32R6O0-NEXT: move $6, $2 7075; MIPS32R6O0-NEXT: sc $6, 0($1) 7076; MIPS32R6O0-NEXT: beqzc $6, $BB17_1 7077; MIPS32R6O0-NEXT: $BB17_3: # %entry 7078; MIPS32R6O0-NEXT: xor $1, $5, $3 7079; MIPS32R6O0-NEXT: sltiu $2, $1, 1 7080; MIPS32R6O0-NEXT: sync 7081; MIPS32R6O0-NEXT: jrc $ra 7082; 7083; MIPS4-LABEL: zeroreg: 7084; MIPS4: # %bb.0: # %entry 7085; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7086; MIPS4-NEXT: daddu $1, $1, $25 7087; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7088; MIPS4-NEXT: sync 7089; MIPS4-NEXT: addiu $2, $zero, 0 7090; MIPS4-NEXT: addiu $3, $zero, 1 7091; MIPS4-NEXT: ld $1, %got_disp(a)($1) 7092; MIPS4-NEXT: .LBB17_1: # %entry 7093; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 7094; MIPS4-NEXT: ll $4, 0($1) 7095; MIPS4-NEXT: bne $4, $3, .LBB17_3 7096; MIPS4-NEXT: nop 7097; MIPS4-NEXT: # %bb.2: # %entry 7098; MIPS4-NEXT: # in Loop: Header=BB17_1 Depth=1 7099; MIPS4-NEXT: move $5, $2 7100; MIPS4-NEXT: sc $5, 0($1) 7101; MIPS4-NEXT: beqz $5, .LBB17_1 7102; MIPS4-NEXT: nop 7103; MIPS4-NEXT: .LBB17_3: # %entry 7104; MIPS4-NEXT: xor $1, $4, $3 7105; MIPS4-NEXT: sltiu $2, $1, 1 7106; MIPS4-NEXT: sync 7107; MIPS4-NEXT: jr $ra 7108; MIPS4-NEXT: nop 7109; 7110; MIPS64-LABEL: zeroreg: 7111; MIPS64: # %bb.0: # %entry 7112; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7113; MIPS64-NEXT: daddu $1, $1, $25 7114; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7115; MIPS64-NEXT: sync 7116; MIPS64-NEXT: addiu $2, $zero, 0 7117; MIPS64-NEXT: addiu $3, $zero, 1 7118; MIPS64-NEXT: ld $1, %got_disp(a)($1) 7119; MIPS64-NEXT: .LBB17_1: # %entry 7120; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 7121; MIPS64-NEXT: ll $4, 0($1) 7122; MIPS64-NEXT: bne $4, $3, .LBB17_3 7123; MIPS64-NEXT: nop 7124; MIPS64-NEXT: # %bb.2: # %entry 7125; MIPS64-NEXT: # in Loop: Header=BB17_1 Depth=1 7126; MIPS64-NEXT: move $5, $2 7127; MIPS64-NEXT: sc $5, 0($1) 7128; MIPS64-NEXT: beqz $5, .LBB17_1 7129; MIPS64-NEXT: nop 7130; MIPS64-NEXT: .LBB17_3: # %entry 7131; MIPS64-NEXT: xor $1, $4, $3 7132; MIPS64-NEXT: sltiu $2, $1, 1 7133; MIPS64-NEXT: sync 7134; MIPS64-NEXT: jr $ra 7135; MIPS64-NEXT: nop 7136; 7137; MIPS64R2-LABEL: zeroreg: 7138; MIPS64R2: # %bb.0: # %entry 7139; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7140; MIPS64R2-NEXT: daddu $1, $1, $25 7141; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7142; MIPS64R2-NEXT: sync 7143; MIPS64R2-NEXT: addiu $2, $zero, 0 7144; MIPS64R2-NEXT: addiu $3, $zero, 1 7145; MIPS64R2-NEXT: ld $1, %got_disp(a)($1) 7146; MIPS64R2-NEXT: .LBB17_1: # %entry 7147; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 7148; MIPS64R2-NEXT: ll $4, 0($1) 7149; MIPS64R2-NEXT: bne $4, $3, .LBB17_3 7150; MIPS64R2-NEXT: nop 7151; MIPS64R2-NEXT: # %bb.2: # %entry 7152; MIPS64R2-NEXT: # in Loop: Header=BB17_1 Depth=1 7153; MIPS64R2-NEXT: move $5, $2 7154; MIPS64R2-NEXT: sc $5, 0($1) 7155; MIPS64R2-NEXT: beqz $5, .LBB17_1 7156; MIPS64R2-NEXT: nop 7157; MIPS64R2-NEXT: .LBB17_3: # %entry 7158; MIPS64R2-NEXT: xor $1, $4, $3 7159; MIPS64R2-NEXT: sltiu $2, $1, 1 7160; MIPS64R2-NEXT: sync 7161; MIPS64R2-NEXT: jr $ra 7162; MIPS64R2-NEXT: nop 7163; 7164; MIPS64R6-LABEL: zeroreg: 7165; MIPS64R6: # %bb.0: # %entry 7166; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7167; MIPS64R6-NEXT: daddu $1, $1, $25 7168; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7169; MIPS64R6-NEXT: sync 7170; MIPS64R6-NEXT: addiu $2, $zero, 0 7171; MIPS64R6-NEXT: addiu $3, $zero, 1 7172; MIPS64R6-NEXT: ld $1, %got_disp(a)($1) 7173; MIPS64R6-NEXT: .LBB17_1: # %entry 7174; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 7175; MIPS64R6-NEXT: ll $4, 0($1) 7176; MIPS64R6-NEXT: bnec $4, $3, .LBB17_3 7177; MIPS64R6-NEXT: # %bb.2: # %entry 7178; MIPS64R6-NEXT: # in Loop: Header=BB17_1 Depth=1 7179; MIPS64R6-NEXT: move $5, $2 7180; MIPS64R6-NEXT: sc $5, 0($1) 7181; MIPS64R6-NEXT: beqzc $5, .LBB17_1 7182; MIPS64R6-NEXT: .LBB17_3: # %entry 7183; MIPS64R6-NEXT: xor $1, $4, $3 7184; MIPS64R6-NEXT: sltiu $2, $1, 1 7185; MIPS64R6-NEXT: sync 7186; MIPS64R6-NEXT: jrc $ra 7187; 7188; MIPS64R6O0-LABEL: zeroreg: 7189; MIPS64R6O0: # %bb.0: # %entry 7190; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7191; MIPS64R6O0-NEXT: daddu $1, $1, $25 7192; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7193; MIPS64R6O0-NEXT: sync 7194; MIPS64R6O0-NEXT: ld $1, %got_disp(a)($1) 7195; MIPS64R6O0-NEXT: addiu $2, $zero, 0 7196; MIPS64R6O0-NEXT: addiu $3, $zero, 1 7197; MIPS64R6O0-NEXT: move $4, $3 7198; MIPS64R6O0-NEXT: .LBB17_1: # %entry 7199; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7200; MIPS64R6O0-NEXT: ll $5, 0($1) 7201; MIPS64R6O0-NEXT: bnec $5, $4, .LBB17_3 7202; MIPS64R6O0-NEXT: # %bb.2: # %entry 7203; MIPS64R6O0-NEXT: # in Loop: Header=BB17_1 Depth=1 7204; MIPS64R6O0-NEXT: move $6, $2 7205; MIPS64R6O0-NEXT: sc $6, 0($1) 7206; MIPS64R6O0-NEXT: beqzc $6, .LBB17_1 7207; MIPS64R6O0-NEXT: .LBB17_3: # %entry 7208; MIPS64R6O0-NEXT: xor $2, $5, $3 7209; MIPS64R6O0-NEXT: sltiu $2, $2, 1 7210; MIPS64R6O0-NEXT: sync 7211; MIPS64R6O0-NEXT: jrc $ra 7212; 7213; MM32-LABEL: zeroreg: 7214; MM32: # %bb.0: # %entry 7215; MM32-NEXT: lui $2, %hi(_gp_disp) 7216; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 7217; MM32-NEXT: addu $2, $2, $25 7218; MM32-NEXT: sync 7219; MM32-NEXT: li16 $3, 0 7220; MM32-NEXT: li16 $4, 1 7221; MM32-NEXT: lw $1, %got(a)($2) 7222; MM32-NEXT: $BB17_1: # %entry 7223; MM32-NEXT: # =>This Inner Loop Header: Depth=1 7224; MM32-NEXT: ll $2, 0($1) 7225; MM32-NEXT: bne $2, $4, $BB17_3 7226; MM32-NEXT: nop 7227; MM32-NEXT: # %bb.2: # %entry 7228; MM32-NEXT: # in Loop: Header=BB17_1 Depth=1 7229; MM32-NEXT: move $5, $3 7230; MM32-NEXT: sc $5, 0($1) 7231; MM32-NEXT: beqzc $5, $BB17_1 7232; MM32-NEXT: $BB17_3: # %entry 7233; MM32-NEXT: xor $1, $2, $4 7234; MM32-NEXT: sltiu $2, $1, 1 7235; MM32-NEXT: sync 7236; MM32-NEXT: jrc $ra 7237; 7238; O1-LABEL: zeroreg: 7239; O1: # %bb.0: # %entry 7240; O1-NEXT: lui $2, %hi(_gp_disp) 7241; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 7242; O1-NEXT: addu $1, $2, $25 7243; O1-NEXT: sync 7244; O1-NEXT: addiu $2, $zero, 0 7245; O1-NEXT: addiu $3, $zero, 1 7246; O1-NEXT: lw $1, %got(a)($1) 7247; O1-NEXT: $BB17_1: # %entry 7248; O1-NEXT: # =>This Inner Loop Header: Depth=1 7249; O1-NEXT: ll $4, 0($1) 7250; O1-NEXT: bne $4, $3, $BB17_3 7251; O1-NEXT: nop 7252; O1-NEXT: # %bb.2: # %entry 7253; O1-NEXT: # in Loop: Header=BB17_1 Depth=1 7254; O1-NEXT: move $5, $2 7255; O1-NEXT: sc $5, 0($1) 7256; O1-NEXT: beqz $5, $BB17_1 7257; O1-NEXT: nop 7258; O1-NEXT: $BB17_3: # %entry 7259; O1-NEXT: xor $1, $4, $3 7260; O1-NEXT: sltiu $2, $1, 1 7261; O1-NEXT: sync 7262; O1-NEXT: jr $ra 7263; O1-NEXT: nop 7264; 7265; O2-LABEL: zeroreg: 7266; O2: # %bb.0: # %entry 7267; O2-NEXT: lui $2, %hi(_gp_disp) 7268; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 7269; O2-NEXT: addu $1, $2, $25 7270; O2-NEXT: sync 7271; O2-NEXT: addiu $2, $zero, 0 7272; O2-NEXT: addiu $3, $zero, 1 7273; O2-NEXT: lw $1, %got(a)($1) 7274; O2-NEXT: $BB17_1: # %entry 7275; O2-NEXT: # =>This Inner Loop Header: Depth=1 7276; O2-NEXT: ll $4, 0($1) 7277; O2-NEXT: bne $4, $3, $BB17_3 7278; O2-NEXT: nop 7279; O2-NEXT: # %bb.2: # %entry 7280; O2-NEXT: # in Loop: Header=BB17_1 Depth=1 7281; O2-NEXT: move $5, $2 7282; O2-NEXT: sc $5, 0($1) 7283; O2-NEXT: beqz $5, $BB17_1 7284; O2-NEXT: nop 7285; O2-NEXT: $BB17_3: # %entry 7286; O2-NEXT: xor $1, $4, $3 7287; O2-NEXT: sltiu $2, $1, 1 7288; O2-NEXT: sync 7289; O2-NEXT: jr $ra 7290; O2-NEXT: nop 7291; 7292; O3-LABEL: zeroreg: 7293; O3: # %bb.0: # %entry 7294; O3-NEXT: lui $2, %hi(_gp_disp) 7295; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 7296; O3-NEXT: addu $1, $2, $25 7297; O3-NEXT: addiu $2, $zero, 0 7298; O3-NEXT: addiu $3, $zero, 1 7299; O3-NEXT: sync 7300; O3-NEXT: lw $1, %got(a)($1) 7301; O3-NEXT: $BB17_1: # %entry 7302; O3-NEXT: # =>This Inner Loop Header: Depth=1 7303; O3-NEXT: ll $4, 0($1) 7304; O3-NEXT: bne $4, $3, $BB17_3 7305; O3-NEXT: nop 7306; O3-NEXT: # %bb.2: # %entry 7307; O3-NEXT: # in Loop: Header=BB17_1 Depth=1 7308; O3-NEXT: move $5, $2 7309; O3-NEXT: sc $5, 0($1) 7310; O3-NEXT: beqz $5, $BB17_1 7311; O3-NEXT: nop 7312; O3-NEXT: $BB17_3: # %entry 7313; O3-NEXT: sync 7314; O3-NEXT: xor $1, $4, $3 7315; O3-NEXT: jr $ra 7316; O3-NEXT: sltiu $2, $1, 1 7317; 7318; MIPS32EB-LABEL: zeroreg: 7319; MIPS32EB: # %bb.0: # %entry 7320; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 7321; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 7322; MIPS32EB-NEXT: addu $1, $2, $25 7323; MIPS32EB-NEXT: sync 7324; MIPS32EB-NEXT: addiu $2, $zero, 0 7325; MIPS32EB-NEXT: addiu $3, $zero, 1 7326; MIPS32EB-NEXT: lw $1, %got(a)($1) 7327; MIPS32EB-NEXT: $BB17_1: # %entry 7328; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 7329; MIPS32EB-NEXT: ll $4, 0($1) 7330; MIPS32EB-NEXT: bne $4, $3, $BB17_3 7331; MIPS32EB-NEXT: nop 7332; MIPS32EB-NEXT: # %bb.2: # %entry 7333; MIPS32EB-NEXT: # in Loop: Header=BB17_1 Depth=1 7334; MIPS32EB-NEXT: move $5, $2 7335; MIPS32EB-NEXT: sc $5, 0($1) 7336; MIPS32EB-NEXT: beqz $5, $BB17_1 7337; MIPS32EB-NEXT: nop 7338; MIPS32EB-NEXT: $BB17_3: # %entry 7339; MIPS32EB-NEXT: xor $1, $4, $3 7340; MIPS32EB-NEXT: sltiu $2, $1, 1 7341; MIPS32EB-NEXT: sync 7342; MIPS32EB-NEXT: jr $ra 7343; MIPS32EB-NEXT: nop 7344entry: 7345 %pair0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst seq_cst 7346 %0 = extractvalue { i32, i1 } %pair0, 0 7347 %1 = icmp eq i32 %0, 1 7348 %conv = zext i1 %1 to i32 7349 ret i32 %conv 7350} 7351 7352; Check that MIPS32R6 has the correct offset range. 7353; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store. 7354define i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind { 7355; MIPS32-LABEL: AtomicLoadAdd32_OffGt9Bit: 7356; MIPS32: # %bb.0: # %entry 7357; MIPS32-NEXT: lui $2, %hi(_gp_disp) 7358; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 7359; MIPS32-NEXT: addu $1, $2, $25 7360; MIPS32-NEXT: lw $1, %got(x)($1) 7361; MIPS32-NEXT: addiu $1, $1, 1024 7362; MIPS32-NEXT: $BB18_1: # %entry 7363; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 7364; MIPS32-NEXT: ll $2, 0($1) 7365; MIPS32-NEXT: addu $3, $2, $4 7366; MIPS32-NEXT: sc $3, 0($1) 7367; MIPS32-NEXT: beqz $3, $BB18_1 7368; MIPS32-NEXT: nop 7369; MIPS32-NEXT: # %bb.2: # %entry 7370; MIPS32-NEXT: jr $ra 7371; MIPS32-NEXT: nop 7372; 7373; MIPS32O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7374; MIPS32O0: # %bb.0: # %entry 7375; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 7376; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 7377; MIPS32O0-NEXT: addu $1, $2, $25 7378; MIPS32O0-NEXT: lw $1, %got(x)($1) 7379; MIPS32O0-NEXT: addiu $1, $1, 1024 7380; MIPS32O0-NEXT: $BB18_1: # %entry 7381; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 7382; MIPS32O0-NEXT: ll $2, 0($1) 7383; MIPS32O0-NEXT: addu $3, $2, $4 7384; MIPS32O0-NEXT: sc $3, 0($1) 7385; MIPS32O0-NEXT: beqz $3, $BB18_1 7386; MIPS32O0-NEXT: nop 7387; MIPS32O0-NEXT: # %bb.2: # %entry 7388; MIPS32O0-NEXT: jr $ra 7389; MIPS32O0-NEXT: nop 7390; 7391; MIPS32R2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7392; MIPS32R2: # %bb.0: # %entry 7393; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 7394; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 7395; MIPS32R2-NEXT: addu $1, $2, $25 7396; MIPS32R2-NEXT: lw $1, %got(x)($1) 7397; MIPS32R2-NEXT: addiu $1, $1, 1024 7398; MIPS32R2-NEXT: $BB18_1: # %entry 7399; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 7400; MIPS32R2-NEXT: ll $2, 0($1) 7401; MIPS32R2-NEXT: addu $3, $2, $4 7402; MIPS32R2-NEXT: sc $3, 0($1) 7403; MIPS32R2-NEXT: beqz $3, $BB18_1 7404; MIPS32R2-NEXT: nop 7405; MIPS32R2-NEXT: # %bb.2: # %entry 7406; MIPS32R2-NEXT: jr $ra 7407; MIPS32R2-NEXT: nop 7408; 7409; MIPS32R6-LABEL: AtomicLoadAdd32_OffGt9Bit: 7410; MIPS32R6: # %bb.0: # %entry 7411; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 7412; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 7413; MIPS32R6-NEXT: addu $1, $2, $25 7414; MIPS32R6-NEXT: lw $1, %got(x)($1) 7415; MIPS32R6-NEXT: addiu $1, $1, 1024 7416; MIPS32R6-NEXT: $BB18_1: # %entry 7417; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 7418; MIPS32R6-NEXT: ll $2, 0($1) 7419; MIPS32R6-NEXT: addu $3, $2, $4 7420; MIPS32R6-NEXT: sc $3, 0($1) 7421; MIPS32R6-NEXT: beqzc $3, $BB18_1 7422; MIPS32R6-NEXT: nop 7423; MIPS32R6-NEXT: # %bb.2: # %entry 7424; MIPS32R6-NEXT: jrc $ra 7425; 7426; MIPS32R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7427; MIPS32R6O0: # %bb.0: # %entry 7428; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 7429; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 7430; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 7431; MIPS32R6O0-NEXT: addu $1, $2, $25 7432; MIPS32R6O0-NEXT: move $2, $4 7433; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 7434; MIPS32R6O0-NEXT: addiu $1, $1, 1024 7435; MIPS32R6O0-NEXT: $BB18_1: # %entry 7436; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7437; MIPS32R6O0-NEXT: ll $3, 0($1) 7438; MIPS32R6O0-NEXT: addu $5, $3, $4 7439; MIPS32R6O0-NEXT: sc $5, 0($1) 7440; MIPS32R6O0-NEXT: beqzc $5, $BB18_1 7441; MIPS32R6O0-NEXT: # %bb.2: # %entry 7442; MIPS32R6O0-NEXT: sw $2, 4($sp) # 4-byte Folded Spill 7443; MIPS32R6O0-NEXT: move $2, $3 7444; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 7445; MIPS32R6O0-NEXT: jrc $ra 7446; 7447; MIPS4-LABEL: AtomicLoadAdd32_OffGt9Bit: 7448; MIPS4: # %bb.0: # %entry 7449; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7450; MIPS4-NEXT: daddu $1, $1, $25 7451; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7452; MIPS4-NEXT: ld $1, %got_disp(x)($1) 7453; MIPS4-NEXT: daddiu $1, $1, 1024 7454; MIPS4-NEXT: .LBB18_1: # %entry 7455; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 7456; MIPS4-NEXT: ll $2, 0($1) 7457; MIPS4-NEXT: addu $3, $2, $4 7458; MIPS4-NEXT: sc $3, 0($1) 7459; MIPS4-NEXT: beqz $3, .LBB18_1 7460; MIPS4-NEXT: nop 7461; MIPS4-NEXT: # %bb.2: # %entry 7462; MIPS4-NEXT: jr $ra 7463; MIPS4-NEXT: nop 7464; 7465; MIPS64-LABEL: AtomicLoadAdd32_OffGt9Bit: 7466; MIPS64: # %bb.0: # %entry 7467; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7468; MIPS64-NEXT: daddu $1, $1, $25 7469; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7470; MIPS64-NEXT: ld $1, %got_disp(x)($1) 7471; MIPS64-NEXT: daddiu $1, $1, 1024 7472; MIPS64-NEXT: .LBB18_1: # %entry 7473; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 7474; MIPS64-NEXT: ll $2, 0($1) 7475; MIPS64-NEXT: addu $3, $2, $4 7476; MIPS64-NEXT: sc $3, 0($1) 7477; MIPS64-NEXT: beqz $3, .LBB18_1 7478; MIPS64-NEXT: nop 7479; MIPS64-NEXT: # %bb.2: # %entry 7480; MIPS64-NEXT: jr $ra 7481; MIPS64-NEXT: nop 7482; 7483; MIPS64R2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7484; MIPS64R2: # %bb.0: # %entry 7485; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7486; MIPS64R2-NEXT: daddu $1, $1, $25 7487; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7488; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 7489; MIPS64R2-NEXT: daddiu $1, $1, 1024 7490; MIPS64R2-NEXT: .LBB18_1: # %entry 7491; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 7492; MIPS64R2-NEXT: ll $2, 0($1) 7493; MIPS64R2-NEXT: addu $3, $2, $4 7494; MIPS64R2-NEXT: sc $3, 0($1) 7495; MIPS64R2-NEXT: beqz $3, .LBB18_1 7496; MIPS64R2-NEXT: nop 7497; MIPS64R2-NEXT: # %bb.2: # %entry 7498; MIPS64R2-NEXT: jr $ra 7499; MIPS64R2-NEXT: nop 7500; 7501; MIPS64R6-LABEL: AtomicLoadAdd32_OffGt9Bit: 7502; MIPS64R6: # %bb.0: # %entry 7503; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7504; MIPS64R6-NEXT: daddu $1, $1, $25 7505; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7506; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 7507; MIPS64R6-NEXT: daddiu $1, $1, 1024 7508; MIPS64R6-NEXT: .LBB18_1: # %entry 7509; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 7510; MIPS64R6-NEXT: ll $2, 0($1) 7511; MIPS64R6-NEXT: addu $3, $2, $4 7512; MIPS64R6-NEXT: sc $3, 0($1) 7513; MIPS64R6-NEXT: beqzc $3, .LBB18_1 7514; MIPS64R6-NEXT: nop 7515; MIPS64R6-NEXT: # %bb.2: # %entry 7516; MIPS64R6-NEXT: jrc $ra 7517; 7518; MIPS64R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7519; MIPS64R6O0: # %bb.0: # %entry 7520; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7521; MIPS64R6O0-NEXT: daddu $1, $1, $25 7522; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7523; MIPS64R6O0-NEXT: move $2, $4 7524; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 7525; MIPS64R6O0-NEXT: daddiu $1, $1, 1024 7526; MIPS64R6O0-NEXT: .LBB18_1: # %entry 7527; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7528; MIPS64R6O0-NEXT: ll $3, 0($1) 7529; MIPS64R6O0-NEXT: addu $5, $3, $2 7530; MIPS64R6O0-NEXT: sc $5, 0($1) 7531; MIPS64R6O0-NEXT: beqzc $5, .LBB18_1 7532; MIPS64R6O0-NEXT: # %bb.2: # %entry 7533; MIPS64R6O0-NEXT: move $2, $3 7534; MIPS64R6O0-NEXT: jrc $ra 7535; 7536; MM32-LABEL: AtomicLoadAdd32_OffGt9Bit: 7537; MM32: # %bb.0: # %entry 7538; MM32-NEXT: lui $2, %hi(_gp_disp) 7539; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 7540; MM32-NEXT: addu $2, $2, $25 7541; MM32-NEXT: lw $1, %got(x)($2) 7542; MM32-NEXT: addiu $1, $1, 1024 7543; MM32-NEXT: $BB18_1: # %entry 7544; MM32-NEXT: # =>This Inner Loop Header: Depth=1 7545; MM32-NEXT: ll $2, 0($1) 7546; MM32-NEXT: addu16 $3, $2, $4 7547; MM32-NEXT: sc $3, 0($1) 7548; MM32-NEXT: beqzc $3, $BB18_1 7549; MM32-NEXT: # %bb.2: # %entry 7550; MM32-NEXT: jrc $ra 7551; 7552; O1-LABEL: AtomicLoadAdd32_OffGt9Bit: 7553; O1: # %bb.0: # %entry 7554; O1-NEXT: lui $2, %hi(_gp_disp) 7555; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 7556; O1-NEXT: addu $1, $2, $25 7557; O1-NEXT: lw $1, %got(x)($1) 7558; O1-NEXT: addiu $1, $1, 1024 7559; O1-NEXT: $BB18_1: # %entry 7560; O1-NEXT: # =>This Inner Loop Header: Depth=1 7561; O1-NEXT: ll $2, 0($1) 7562; O1-NEXT: addu $3, $2, $4 7563; O1-NEXT: sc $3, 0($1) 7564; O1-NEXT: beqz $3, $BB18_1 7565; O1-NEXT: nop 7566; O1-NEXT: # %bb.2: # %entry 7567; O1-NEXT: jr $ra 7568; O1-NEXT: nop 7569; 7570; O2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7571; O2: # %bb.0: # %entry 7572; O2-NEXT: lui $2, %hi(_gp_disp) 7573; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 7574; O2-NEXT: addu $1, $2, $25 7575; O2-NEXT: lw $1, %got(x)($1) 7576; O2-NEXT: addiu $1, $1, 1024 7577; O2-NEXT: $BB18_1: # %entry 7578; O2-NEXT: # =>This Inner Loop Header: Depth=1 7579; O2-NEXT: ll $2, 0($1) 7580; O2-NEXT: addu $3, $2, $4 7581; O2-NEXT: sc $3, 0($1) 7582; O2-NEXT: beqz $3, $BB18_1 7583; O2-NEXT: nop 7584; O2-NEXT: # %bb.2: # %entry 7585; O2-NEXT: jr $ra 7586; O2-NEXT: nop 7587; 7588; O3-LABEL: AtomicLoadAdd32_OffGt9Bit: 7589; O3: # %bb.0: # %entry 7590; O3-NEXT: lui $2, %hi(_gp_disp) 7591; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 7592; O3-NEXT: addu $1, $2, $25 7593; O3-NEXT: lw $1, %got(x)($1) 7594; O3-NEXT: addiu $1, $1, 1024 7595; O3-NEXT: $BB18_1: # %entry 7596; O3-NEXT: # =>This Inner Loop Header: Depth=1 7597; O3-NEXT: ll $2, 0($1) 7598; O3-NEXT: addu $3, $2, $4 7599; O3-NEXT: sc $3, 0($1) 7600; O3-NEXT: beqz $3, $BB18_1 7601; O3-NEXT: nop 7602; O3-NEXT: # %bb.2: # %entry 7603; O3-NEXT: jr $ra 7604; O3-NEXT: nop 7605; 7606; MIPS32EB-LABEL: AtomicLoadAdd32_OffGt9Bit: 7607; MIPS32EB: # %bb.0: # %entry 7608; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 7609; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 7610; MIPS32EB-NEXT: addu $1, $2, $25 7611; MIPS32EB-NEXT: lw $1, %got(x)($1) 7612; MIPS32EB-NEXT: addiu $1, $1, 1024 7613; MIPS32EB-NEXT: $BB18_1: # %entry 7614; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 7615; MIPS32EB-NEXT: ll $2, 0($1) 7616; MIPS32EB-NEXT: addu $3, $2, $4 7617; MIPS32EB-NEXT: sc $3, 0($1) 7618; MIPS32EB-NEXT: beqz $3, $BB18_1 7619; MIPS32EB-NEXT: nop 7620; MIPS32EB-NEXT: # %bb.2: # %entry 7621; MIPS32EB-NEXT: jr $ra 7622; MIPS32EB-NEXT: nop 7623entry: 7624 %0 = atomicrmw add i32* getelementptr(i32, i32* @x, i32 256), i32 %incr monotonic 7625 ret i32 %0 7626 7627} 7628