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 $3, %got(x)($1) 61; MIPS32O0-NEXT: $BB0_1: # %entry 62; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 63; MIPS32O0-NEXT: ll $2, 0($3) 64; MIPS32O0-NEXT: addu $1, $2, $4 65; MIPS32O0-NEXT: sc $1, 0($3) 66; MIPS32O0-NEXT: beqz $1, $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: addu $1, $2, $25 110; MIPS32R6O0-NEXT: lw $3, %got(x)($1) 111; MIPS32R6O0-NEXT: $BB0_1: # %entry 112; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 113; MIPS32R6O0-NEXT: ll $2, 0($3) 114; MIPS32R6O0-NEXT: addu $1, $2, $4 115; MIPS32R6O0-NEXT: sc $1, 0($3) 116; MIPS32R6O0-NEXT: beqzc $1, $BB0_1 117; MIPS32R6O0-NEXT: nop 118; MIPS32R6O0-NEXT: # %bb.2: # %entry 119; MIPS32R6O0-NEXT: jrc $ra 120; 121; MIPS4-LABEL: AtomicLoadAdd32: 122; MIPS4: # %bb.0: # %entry 123; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 124; MIPS4-NEXT: daddu $1, $1, $25 125; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 126; MIPS4-NEXT: ld $1, %got_disp(x)($1) 127; MIPS4-NEXT: .LBB0_1: # %entry 128; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 129; MIPS4-NEXT: ll $2, 0($1) 130; MIPS4-NEXT: addu $3, $2, $4 131; MIPS4-NEXT: sc $3, 0($1) 132; MIPS4-NEXT: beqz $3, .LBB0_1 133; MIPS4-NEXT: nop 134; MIPS4-NEXT: # %bb.2: # %entry 135; MIPS4-NEXT: jr $ra 136; MIPS4-NEXT: nop 137; 138; MIPS64-LABEL: AtomicLoadAdd32: 139; MIPS64: # %bb.0: # %entry 140; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 141; MIPS64-NEXT: daddu $1, $1, $25 142; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 143; MIPS64-NEXT: ld $1, %got_disp(x)($1) 144; MIPS64-NEXT: .LBB0_1: # %entry 145; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 146; MIPS64-NEXT: ll $2, 0($1) 147; MIPS64-NEXT: addu $3, $2, $4 148; MIPS64-NEXT: sc $3, 0($1) 149; MIPS64-NEXT: beqz $3, .LBB0_1 150; MIPS64-NEXT: nop 151; MIPS64-NEXT: # %bb.2: # %entry 152; MIPS64-NEXT: jr $ra 153; MIPS64-NEXT: nop 154; 155; MIPS64R2-LABEL: AtomicLoadAdd32: 156; MIPS64R2: # %bb.0: # %entry 157; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 158; MIPS64R2-NEXT: daddu $1, $1, $25 159; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 160; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 161; MIPS64R2-NEXT: .LBB0_1: # %entry 162; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 163; MIPS64R2-NEXT: ll $2, 0($1) 164; MIPS64R2-NEXT: addu $3, $2, $4 165; MIPS64R2-NEXT: sc $3, 0($1) 166; MIPS64R2-NEXT: beqz $3, .LBB0_1 167; MIPS64R2-NEXT: nop 168; MIPS64R2-NEXT: # %bb.2: # %entry 169; MIPS64R2-NEXT: jr $ra 170; MIPS64R2-NEXT: nop 171; 172; MIPS64R6-LABEL: AtomicLoadAdd32: 173; MIPS64R6: # %bb.0: # %entry 174; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 175; MIPS64R6-NEXT: daddu $1, $1, $25 176; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 177; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 178; MIPS64R6-NEXT: .LBB0_1: # %entry 179; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 180; MIPS64R6-NEXT: ll $2, 0($1) 181; MIPS64R6-NEXT: addu $3, $2, $4 182; MIPS64R6-NEXT: sc $3, 0($1) 183; MIPS64R6-NEXT: beqzc $3, .LBB0_1 184; MIPS64R6-NEXT: nop 185; MIPS64R6-NEXT: # %bb.2: # %entry 186; MIPS64R6-NEXT: jrc $ra 187; 188; MIPS64R6O0-LABEL: AtomicLoadAdd32: 189; MIPS64R6O0: # %bb.0: # %entry 190; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32))) 191; MIPS64R6O0-NEXT: daddu $1, $1, $25 192; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32))) 193; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 194; MIPS64R6O0-NEXT: ld $3, %got_disp(x)($1) 195; MIPS64R6O0-NEXT: .LBB0_1: # %entry 196; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 197; MIPS64R6O0-NEXT: ll $2, 0($3) 198; MIPS64R6O0-NEXT: addu $1, $2, $4 199; MIPS64R6O0-NEXT: sc $1, 0($3) 200; MIPS64R6O0-NEXT: beqzc $1, .LBB0_1 201; MIPS64R6O0-NEXT: nop 202; MIPS64R6O0-NEXT: # %bb.2: # %entry 203; MIPS64R6O0-NEXT: jrc $ra 204; 205; MM32-LABEL: AtomicLoadAdd32: 206; MM32: # %bb.0: # %entry 207; MM32-NEXT: lui $2, %hi(_gp_disp) 208; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 209; MM32-NEXT: addu $2, $2, $25 210; MM32-NEXT: lw $1, %got(x)($2) 211; MM32-NEXT: $BB0_1: # %entry 212; MM32-NEXT: # =>This Inner Loop Header: Depth=1 213; MM32-NEXT: ll $2, 0($1) 214; MM32-NEXT: addu16 $3, $2, $4 215; MM32-NEXT: sc $3, 0($1) 216; MM32-NEXT: beqzc $3, $BB0_1 217; MM32-NEXT: # %bb.2: # %entry 218; MM32-NEXT: jrc $ra 219; 220; O1-LABEL: AtomicLoadAdd32: 221; O1: # %bb.0: # %entry 222; O1-NEXT: lui $2, %hi(_gp_disp) 223; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 224; O1-NEXT: addu $1, $2, $25 225; O1-NEXT: lw $1, %got(x)($1) 226; O1-NEXT: $BB0_1: # %entry 227; O1-NEXT: # =>This Inner Loop Header: Depth=1 228; O1-NEXT: ll $2, 0($1) 229; O1-NEXT: addu $3, $2, $4 230; O1-NEXT: sc $3, 0($1) 231; O1-NEXT: beqz $3, $BB0_1 232; O1-NEXT: nop 233; O1-NEXT: # %bb.2: # %entry 234; O1-NEXT: jr $ra 235; O1-NEXT: nop 236; 237; O2-LABEL: AtomicLoadAdd32: 238; O2: # %bb.0: # %entry 239; O2-NEXT: lui $2, %hi(_gp_disp) 240; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 241; O2-NEXT: addu $1, $2, $25 242; O2-NEXT: lw $1, %got(x)($1) 243; O2-NEXT: $BB0_1: # %entry 244; O2-NEXT: # =>This Inner Loop Header: Depth=1 245; O2-NEXT: ll $2, 0($1) 246; O2-NEXT: addu $3, $2, $4 247; O2-NEXT: sc $3, 0($1) 248; O2-NEXT: beqz $3, $BB0_1 249; O2-NEXT: nop 250; O2-NEXT: # %bb.2: # %entry 251; O2-NEXT: jr $ra 252; O2-NEXT: nop 253; 254; O3-LABEL: AtomicLoadAdd32: 255; O3: # %bb.0: # %entry 256; O3-NEXT: lui $2, %hi(_gp_disp) 257; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 258; O3-NEXT: addu $1, $2, $25 259; O3-NEXT: lw $1, %got(x)($1) 260; O3-NEXT: $BB0_1: # %entry 261; O3-NEXT: # =>This Inner Loop Header: Depth=1 262; O3-NEXT: ll $2, 0($1) 263; O3-NEXT: addu $3, $2, $4 264; O3-NEXT: sc $3, 0($1) 265; O3-NEXT: beqz $3, $BB0_1 266; O3-NEXT: nop 267; O3-NEXT: # %bb.2: # %entry 268; O3-NEXT: jr $ra 269; O3-NEXT: nop 270; 271; MIPS32EB-LABEL: AtomicLoadAdd32: 272; MIPS32EB: # %bb.0: # %entry 273; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 274; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 275; MIPS32EB-NEXT: addu $1, $2, $25 276; MIPS32EB-NEXT: lw $1, %got(x)($1) 277; MIPS32EB-NEXT: $BB0_1: # %entry 278; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 279; MIPS32EB-NEXT: ll $2, 0($1) 280; MIPS32EB-NEXT: addu $3, $2, $4 281; MIPS32EB-NEXT: sc $3, 0($1) 282; MIPS32EB-NEXT: beqz $3, $BB0_1 283; MIPS32EB-NEXT: nop 284; MIPS32EB-NEXT: # %bb.2: # %entry 285; MIPS32EB-NEXT: jr $ra 286; MIPS32EB-NEXT: nop 287entry: 288 %0 = atomicrmw add ptr @x, i32 %incr monotonic 289 ret i32 %0 290 291} 292 293define i32 @AtomicLoadSub32(i32 signext %incr) nounwind { 294; MIPS32-LABEL: AtomicLoadSub32: 295; MIPS32: # %bb.0: # %entry 296; MIPS32-NEXT: lui $2, %hi(_gp_disp) 297; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 298; MIPS32-NEXT: addu $1, $2, $25 299; MIPS32-NEXT: lw $1, %got(x)($1) 300; MIPS32-NEXT: $BB1_1: # %entry 301; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 302; MIPS32-NEXT: ll $2, 0($1) 303; MIPS32-NEXT: subu $3, $2, $4 304; MIPS32-NEXT: sc $3, 0($1) 305; MIPS32-NEXT: beqz $3, $BB1_1 306; MIPS32-NEXT: nop 307; MIPS32-NEXT: # %bb.2: # %entry 308; MIPS32-NEXT: jr $ra 309; MIPS32-NEXT: nop 310; 311; MIPS32O0-LABEL: AtomicLoadSub32: 312; MIPS32O0: # %bb.0: # %entry 313; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 314; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 315; MIPS32O0-NEXT: addu $1, $2, $25 316; MIPS32O0-NEXT: lw $3, %got(x)($1) 317; MIPS32O0-NEXT: $BB1_1: # %entry 318; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 319; MIPS32O0-NEXT: ll $2, 0($3) 320; MIPS32O0-NEXT: subu $1, $2, $4 321; MIPS32O0-NEXT: sc $1, 0($3) 322; MIPS32O0-NEXT: beqz $1, $BB1_1 323; MIPS32O0-NEXT: nop 324; MIPS32O0-NEXT: # %bb.2: # %entry 325; MIPS32O0-NEXT: jr $ra 326; MIPS32O0-NEXT: nop 327; 328; MIPS32R2-LABEL: AtomicLoadSub32: 329; MIPS32R2: # %bb.0: # %entry 330; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 331; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 332; MIPS32R2-NEXT: addu $1, $2, $25 333; MIPS32R2-NEXT: lw $1, %got(x)($1) 334; MIPS32R2-NEXT: $BB1_1: # %entry 335; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 336; MIPS32R2-NEXT: ll $2, 0($1) 337; MIPS32R2-NEXT: subu $3, $2, $4 338; MIPS32R2-NEXT: sc $3, 0($1) 339; MIPS32R2-NEXT: beqz $3, $BB1_1 340; MIPS32R2-NEXT: nop 341; MIPS32R2-NEXT: # %bb.2: # %entry 342; MIPS32R2-NEXT: jr $ra 343; MIPS32R2-NEXT: nop 344; 345; MIPS32R6-LABEL: AtomicLoadSub32: 346; MIPS32R6: # %bb.0: # %entry 347; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 348; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 349; MIPS32R6-NEXT: addu $1, $2, $25 350; MIPS32R6-NEXT: lw $1, %got(x)($1) 351; MIPS32R6-NEXT: $BB1_1: # %entry 352; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 353; MIPS32R6-NEXT: ll $2, 0($1) 354; MIPS32R6-NEXT: subu $3, $2, $4 355; MIPS32R6-NEXT: sc $3, 0($1) 356; MIPS32R6-NEXT: beqzc $3, $BB1_1 357; MIPS32R6-NEXT: nop 358; MIPS32R6-NEXT: # %bb.2: # %entry 359; MIPS32R6-NEXT: jrc $ra 360; 361; MIPS32R6O0-LABEL: AtomicLoadSub32: 362; MIPS32R6O0: # %bb.0: # %entry 363; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 364; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 365; MIPS32R6O0-NEXT: addu $1, $2, $25 366; MIPS32R6O0-NEXT: lw $3, %got(x)($1) 367; MIPS32R6O0-NEXT: $BB1_1: # %entry 368; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 369; MIPS32R6O0-NEXT: ll $2, 0($3) 370; MIPS32R6O0-NEXT: subu $1, $2, $4 371; MIPS32R6O0-NEXT: sc $1, 0($3) 372; MIPS32R6O0-NEXT: beqzc $1, $BB1_1 373; MIPS32R6O0-NEXT: nop 374; MIPS32R6O0-NEXT: # %bb.2: # %entry 375; MIPS32R6O0-NEXT: jrc $ra 376; 377; MIPS4-LABEL: AtomicLoadSub32: 378; MIPS4: # %bb.0: # %entry 379; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 380; MIPS4-NEXT: daddu $1, $1, $25 381; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 382; MIPS4-NEXT: ld $1, %got_disp(x)($1) 383; MIPS4-NEXT: .LBB1_1: # %entry 384; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 385; MIPS4-NEXT: ll $2, 0($1) 386; MIPS4-NEXT: subu $3, $2, $4 387; MIPS4-NEXT: sc $3, 0($1) 388; MIPS4-NEXT: beqz $3, .LBB1_1 389; MIPS4-NEXT: nop 390; MIPS4-NEXT: # %bb.2: # %entry 391; MIPS4-NEXT: jr $ra 392; MIPS4-NEXT: nop 393; 394; MIPS64-LABEL: AtomicLoadSub32: 395; MIPS64: # %bb.0: # %entry 396; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 397; MIPS64-NEXT: daddu $1, $1, $25 398; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 399; MIPS64-NEXT: ld $1, %got_disp(x)($1) 400; MIPS64-NEXT: .LBB1_1: # %entry 401; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 402; MIPS64-NEXT: ll $2, 0($1) 403; MIPS64-NEXT: subu $3, $2, $4 404; MIPS64-NEXT: sc $3, 0($1) 405; MIPS64-NEXT: beqz $3, .LBB1_1 406; MIPS64-NEXT: nop 407; MIPS64-NEXT: # %bb.2: # %entry 408; MIPS64-NEXT: jr $ra 409; MIPS64-NEXT: nop 410; 411; MIPS64R2-LABEL: AtomicLoadSub32: 412; MIPS64R2: # %bb.0: # %entry 413; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 414; MIPS64R2-NEXT: daddu $1, $1, $25 415; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 416; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 417; MIPS64R2-NEXT: .LBB1_1: # %entry 418; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 419; MIPS64R2-NEXT: ll $2, 0($1) 420; MIPS64R2-NEXT: subu $3, $2, $4 421; MIPS64R2-NEXT: sc $3, 0($1) 422; MIPS64R2-NEXT: beqz $3, .LBB1_1 423; MIPS64R2-NEXT: nop 424; MIPS64R2-NEXT: # %bb.2: # %entry 425; MIPS64R2-NEXT: jr $ra 426; MIPS64R2-NEXT: nop 427; 428; MIPS64R6-LABEL: AtomicLoadSub32: 429; MIPS64R6: # %bb.0: # %entry 430; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 431; MIPS64R6-NEXT: daddu $1, $1, $25 432; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 433; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 434; MIPS64R6-NEXT: .LBB1_1: # %entry 435; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 436; MIPS64R6-NEXT: ll $2, 0($1) 437; MIPS64R6-NEXT: subu $3, $2, $4 438; MIPS64R6-NEXT: sc $3, 0($1) 439; MIPS64R6-NEXT: beqzc $3, .LBB1_1 440; MIPS64R6-NEXT: nop 441; MIPS64R6-NEXT: # %bb.2: # %entry 442; MIPS64R6-NEXT: jrc $ra 443; 444; MIPS64R6O0-LABEL: AtomicLoadSub32: 445; MIPS64R6O0: # %bb.0: # %entry 446; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32))) 447; MIPS64R6O0-NEXT: daddu $1, $1, $25 448; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32))) 449; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 450; MIPS64R6O0-NEXT: ld $3, %got_disp(x)($1) 451; MIPS64R6O0-NEXT: .LBB1_1: # %entry 452; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 453; MIPS64R6O0-NEXT: ll $2, 0($3) 454; MIPS64R6O0-NEXT: subu $1, $2, $4 455; MIPS64R6O0-NEXT: sc $1, 0($3) 456; MIPS64R6O0-NEXT: beqzc $1, .LBB1_1 457; MIPS64R6O0-NEXT: nop 458; MIPS64R6O0-NEXT: # %bb.2: # %entry 459; MIPS64R6O0-NEXT: jrc $ra 460; 461; MM32-LABEL: AtomicLoadSub32: 462; MM32: # %bb.0: # %entry 463; MM32-NEXT: lui $2, %hi(_gp_disp) 464; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 465; MM32-NEXT: addu $2, $2, $25 466; MM32-NEXT: lw $1, %got(x)($2) 467; MM32-NEXT: $BB1_1: # %entry 468; MM32-NEXT: # =>This Inner Loop Header: Depth=1 469; MM32-NEXT: ll $2, 0($1) 470; MM32-NEXT: subu16 $3, $2, $4 471; MM32-NEXT: sc $3, 0($1) 472; MM32-NEXT: beqzc $3, $BB1_1 473; MM32-NEXT: # %bb.2: # %entry 474; MM32-NEXT: jrc $ra 475; 476; O1-LABEL: AtomicLoadSub32: 477; O1: # %bb.0: # %entry 478; O1-NEXT: lui $2, %hi(_gp_disp) 479; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 480; O1-NEXT: addu $1, $2, $25 481; O1-NEXT: lw $1, %got(x)($1) 482; O1-NEXT: $BB1_1: # %entry 483; O1-NEXT: # =>This Inner Loop Header: Depth=1 484; O1-NEXT: ll $2, 0($1) 485; O1-NEXT: subu $3, $2, $4 486; O1-NEXT: sc $3, 0($1) 487; O1-NEXT: beqz $3, $BB1_1 488; O1-NEXT: nop 489; O1-NEXT: # %bb.2: # %entry 490; O1-NEXT: jr $ra 491; O1-NEXT: nop 492; 493; O2-LABEL: AtomicLoadSub32: 494; O2: # %bb.0: # %entry 495; O2-NEXT: lui $2, %hi(_gp_disp) 496; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 497; O2-NEXT: addu $1, $2, $25 498; O2-NEXT: lw $1, %got(x)($1) 499; O2-NEXT: $BB1_1: # %entry 500; O2-NEXT: # =>This Inner Loop Header: Depth=1 501; O2-NEXT: ll $2, 0($1) 502; O2-NEXT: subu $3, $2, $4 503; O2-NEXT: sc $3, 0($1) 504; O2-NEXT: beqz $3, $BB1_1 505; O2-NEXT: nop 506; O2-NEXT: # %bb.2: # %entry 507; O2-NEXT: jr $ra 508; O2-NEXT: nop 509; 510; O3-LABEL: AtomicLoadSub32: 511; O3: # %bb.0: # %entry 512; O3-NEXT: lui $2, %hi(_gp_disp) 513; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 514; O3-NEXT: addu $1, $2, $25 515; O3-NEXT: lw $1, %got(x)($1) 516; O3-NEXT: $BB1_1: # %entry 517; O3-NEXT: # =>This Inner Loop Header: Depth=1 518; O3-NEXT: ll $2, 0($1) 519; O3-NEXT: subu $3, $2, $4 520; O3-NEXT: sc $3, 0($1) 521; O3-NEXT: beqz $3, $BB1_1 522; O3-NEXT: nop 523; O3-NEXT: # %bb.2: # %entry 524; O3-NEXT: jr $ra 525; O3-NEXT: nop 526; 527; MIPS32EB-LABEL: AtomicLoadSub32: 528; MIPS32EB: # %bb.0: # %entry 529; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 530; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 531; MIPS32EB-NEXT: addu $1, $2, $25 532; MIPS32EB-NEXT: lw $1, %got(x)($1) 533; MIPS32EB-NEXT: $BB1_1: # %entry 534; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 535; MIPS32EB-NEXT: ll $2, 0($1) 536; MIPS32EB-NEXT: subu $3, $2, $4 537; MIPS32EB-NEXT: sc $3, 0($1) 538; MIPS32EB-NEXT: beqz $3, $BB1_1 539; MIPS32EB-NEXT: nop 540; MIPS32EB-NEXT: # %bb.2: # %entry 541; MIPS32EB-NEXT: jr $ra 542; MIPS32EB-NEXT: nop 543entry: 544 %0 = atomicrmw sub ptr @x, i32 %incr monotonic 545 ret i32 %0 546 547} 548 549define i32 @AtomicLoadXor32(i32 signext %incr) nounwind { 550; MIPS32-LABEL: AtomicLoadXor32: 551; MIPS32: # %bb.0: # %entry 552; MIPS32-NEXT: lui $2, %hi(_gp_disp) 553; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 554; MIPS32-NEXT: addu $1, $2, $25 555; MIPS32-NEXT: lw $1, %got(x)($1) 556; MIPS32-NEXT: $BB2_1: # %entry 557; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 558; MIPS32-NEXT: ll $2, 0($1) 559; MIPS32-NEXT: xor $3, $2, $4 560; MIPS32-NEXT: sc $3, 0($1) 561; MIPS32-NEXT: beqz $3, $BB2_1 562; MIPS32-NEXT: nop 563; MIPS32-NEXT: # %bb.2: # %entry 564; MIPS32-NEXT: jr $ra 565; MIPS32-NEXT: nop 566; 567; MIPS32O0-LABEL: AtomicLoadXor32: 568; MIPS32O0: # %bb.0: # %entry 569; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 570; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 571; MIPS32O0-NEXT: addu $1, $2, $25 572; MIPS32O0-NEXT: lw $3, %got(x)($1) 573; MIPS32O0-NEXT: $BB2_1: # %entry 574; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 575; MIPS32O0-NEXT: ll $2, 0($3) 576; MIPS32O0-NEXT: xor $1, $2, $4 577; MIPS32O0-NEXT: sc $1, 0($3) 578; MIPS32O0-NEXT: beqz $1, $BB2_1 579; MIPS32O0-NEXT: nop 580; MIPS32O0-NEXT: # %bb.2: # %entry 581; MIPS32O0-NEXT: jr $ra 582; MIPS32O0-NEXT: nop 583; 584; MIPS32R2-LABEL: AtomicLoadXor32: 585; MIPS32R2: # %bb.0: # %entry 586; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 587; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 588; MIPS32R2-NEXT: addu $1, $2, $25 589; MIPS32R2-NEXT: lw $1, %got(x)($1) 590; MIPS32R2-NEXT: $BB2_1: # %entry 591; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 592; MIPS32R2-NEXT: ll $2, 0($1) 593; MIPS32R2-NEXT: xor $3, $2, $4 594; MIPS32R2-NEXT: sc $3, 0($1) 595; MIPS32R2-NEXT: beqz $3, $BB2_1 596; MIPS32R2-NEXT: nop 597; MIPS32R2-NEXT: # %bb.2: # %entry 598; MIPS32R2-NEXT: jr $ra 599; MIPS32R2-NEXT: nop 600; 601; MIPS32R6-LABEL: AtomicLoadXor32: 602; MIPS32R6: # %bb.0: # %entry 603; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 604; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 605; MIPS32R6-NEXT: addu $1, $2, $25 606; MIPS32R6-NEXT: lw $1, %got(x)($1) 607; MIPS32R6-NEXT: $BB2_1: # %entry 608; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 609; MIPS32R6-NEXT: ll $2, 0($1) 610; MIPS32R6-NEXT: xor $3, $2, $4 611; MIPS32R6-NEXT: sc $3, 0($1) 612; MIPS32R6-NEXT: beqzc $3, $BB2_1 613; MIPS32R6-NEXT: nop 614; MIPS32R6-NEXT: # %bb.2: # %entry 615; MIPS32R6-NEXT: jrc $ra 616; 617; MIPS32R6O0-LABEL: AtomicLoadXor32: 618; MIPS32R6O0: # %bb.0: # %entry 619; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 620; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 621; MIPS32R6O0-NEXT: addu $1, $2, $25 622; MIPS32R6O0-NEXT: lw $3, %got(x)($1) 623; MIPS32R6O0-NEXT: $BB2_1: # %entry 624; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 625; MIPS32R6O0-NEXT: ll $2, 0($3) 626; MIPS32R6O0-NEXT: xor $1, $2, $4 627; MIPS32R6O0-NEXT: sc $1, 0($3) 628; MIPS32R6O0-NEXT: beqzc $1, $BB2_1 629; MIPS32R6O0-NEXT: nop 630; MIPS32R6O0-NEXT: # %bb.2: # %entry 631; MIPS32R6O0-NEXT: jrc $ra 632; 633; MIPS4-LABEL: AtomicLoadXor32: 634; MIPS4: # %bb.0: # %entry 635; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 636; MIPS4-NEXT: daddu $1, $1, $25 637; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 638; MIPS4-NEXT: ld $1, %got_disp(x)($1) 639; MIPS4-NEXT: .LBB2_1: # %entry 640; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 641; MIPS4-NEXT: ll $2, 0($1) 642; MIPS4-NEXT: xor $3, $2, $4 643; MIPS4-NEXT: sc $3, 0($1) 644; MIPS4-NEXT: beqz $3, .LBB2_1 645; MIPS4-NEXT: nop 646; MIPS4-NEXT: # %bb.2: # %entry 647; MIPS4-NEXT: jr $ra 648; MIPS4-NEXT: nop 649; 650; MIPS64-LABEL: AtomicLoadXor32: 651; MIPS64: # %bb.0: # %entry 652; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 653; MIPS64-NEXT: daddu $1, $1, $25 654; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 655; MIPS64-NEXT: ld $1, %got_disp(x)($1) 656; MIPS64-NEXT: .LBB2_1: # %entry 657; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 658; MIPS64-NEXT: ll $2, 0($1) 659; MIPS64-NEXT: xor $3, $2, $4 660; MIPS64-NEXT: sc $3, 0($1) 661; MIPS64-NEXT: beqz $3, .LBB2_1 662; MIPS64-NEXT: nop 663; MIPS64-NEXT: # %bb.2: # %entry 664; MIPS64-NEXT: jr $ra 665; MIPS64-NEXT: nop 666; 667; MIPS64R2-LABEL: AtomicLoadXor32: 668; MIPS64R2: # %bb.0: # %entry 669; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 670; MIPS64R2-NEXT: daddu $1, $1, $25 671; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 672; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 673; MIPS64R2-NEXT: .LBB2_1: # %entry 674; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 675; MIPS64R2-NEXT: ll $2, 0($1) 676; MIPS64R2-NEXT: xor $3, $2, $4 677; MIPS64R2-NEXT: sc $3, 0($1) 678; MIPS64R2-NEXT: beqz $3, .LBB2_1 679; MIPS64R2-NEXT: nop 680; MIPS64R2-NEXT: # %bb.2: # %entry 681; MIPS64R2-NEXT: jr $ra 682; MIPS64R2-NEXT: nop 683; 684; MIPS64R6-LABEL: AtomicLoadXor32: 685; MIPS64R6: # %bb.0: # %entry 686; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 687; MIPS64R6-NEXT: daddu $1, $1, $25 688; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 689; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 690; MIPS64R6-NEXT: .LBB2_1: # %entry 691; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 692; MIPS64R6-NEXT: ll $2, 0($1) 693; MIPS64R6-NEXT: xor $3, $2, $4 694; MIPS64R6-NEXT: sc $3, 0($1) 695; MIPS64R6-NEXT: beqzc $3, .LBB2_1 696; MIPS64R6-NEXT: nop 697; MIPS64R6-NEXT: # %bb.2: # %entry 698; MIPS64R6-NEXT: jrc $ra 699; 700; MIPS64R6O0-LABEL: AtomicLoadXor32: 701; MIPS64R6O0: # %bb.0: # %entry 702; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32))) 703; MIPS64R6O0-NEXT: daddu $1, $1, $25 704; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32))) 705; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 706; MIPS64R6O0-NEXT: ld $3, %got_disp(x)($1) 707; MIPS64R6O0-NEXT: .LBB2_1: # %entry 708; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 709; MIPS64R6O0-NEXT: ll $2, 0($3) 710; MIPS64R6O0-NEXT: xor $1, $2, $4 711; MIPS64R6O0-NEXT: sc $1, 0($3) 712; MIPS64R6O0-NEXT: beqzc $1, .LBB2_1 713; MIPS64R6O0-NEXT: nop 714; MIPS64R6O0-NEXT: # %bb.2: # %entry 715; MIPS64R6O0-NEXT: jrc $ra 716; 717; MM32-LABEL: AtomicLoadXor32: 718; MM32: # %bb.0: # %entry 719; MM32-NEXT: lui $2, %hi(_gp_disp) 720; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 721; MM32-NEXT: addu $2, $2, $25 722; MM32-NEXT: lw $1, %got(x)($2) 723; MM32-NEXT: $BB2_1: # %entry 724; MM32-NEXT: # =>This Inner Loop Header: Depth=1 725; MM32-NEXT: ll $2, 0($1) 726; MM32-NEXT: xor $3, $2, $4 727; MM32-NEXT: sc $3, 0($1) 728; MM32-NEXT: beqzc $3, $BB2_1 729; MM32-NEXT: # %bb.2: # %entry 730; MM32-NEXT: jrc $ra 731; 732; O1-LABEL: AtomicLoadXor32: 733; O1: # %bb.0: # %entry 734; O1-NEXT: lui $2, %hi(_gp_disp) 735; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 736; O1-NEXT: addu $1, $2, $25 737; O1-NEXT: lw $1, %got(x)($1) 738; O1-NEXT: $BB2_1: # %entry 739; O1-NEXT: # =>This Inner Loop Header: Depth=1 740; O1-NEXT: ll $2, 0($1) 741; O1-NEXT: xor $3, $2, $4 742; O1-NEXT: sc $3, 0($1) 743; O1-NEXT: beqz $3, $BB2_1 744; O1-NEXT: nop 745; O1-NEXT: # %bb.2: # %entry 746; O1-NEXT: jr $ra 747; O1-NEXT: nop 748; 749; O2-LABEL: AtomicLoadXor32: 750; O2: # %bb.0: # %entry 751; O2-NEXT: lui $2, %hi(_gp_disp) 752; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 753; O2-NEXT: addu $1, $2, $25 754; O2-NEXT: lw $1, %got(x)($1) 755; O2-NEXT: $BB2_1: # %entry 756; O2-NEXT: # =>This Inner Loop Header: Depth=1 757; O2-NEXT: ll $2, 0($1) 758; O2-NEXT: xor $3, $2, $4 759; O2-NEXT: sc $3, 0($1) 760; O2-NEXT: beqz $3, $BB2_1 761; O2-NEXT: nop 762; O2-NEXT: # %bb.2: # %entry 763; O2-NEXT: jr $ra 764; O2-NEXT: nop 765; 766; O3-LABEL: AtomicLoadXor32: 767; O3: # %bb.0: # %entry 768; O3-NEXT: lui $2, %hi(_gp_disp) 769; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 770; O3-NEXT: addu $1, $2, $25 771; O3-NEXT: lw $1, %got(x)($1) 772; O3-NEXT: $BB2_1: # %entry 773; O3-NEXT: # =>This Inner Loop Header: Depth=1 774; O3-NEXT: ll $2, 0($1) 775; O3-NEXT: xor $3, $2, $4 776; O3-NEXT: sc $3, 0($1) 777; O3-NEXT: beqz $3, $BB2_1 778; O3-NEXT: nop 779; O3-NEXT: # %bb.2: # %entry 780; O3-NEXT: jr $ra 781; O3-NEXT: nop 782; 783; MIPS32EB-LABEL: AtomicLoadXor32: 784; MIPS32EB: # %bb.0: # %entry 785; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 786; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 787; MIPS32EB-NEXT: addu $1, $2, $25 788; MIPS32EB-NEXT: lw $1, %got(x)($1) 789; MIPS32EB-NEXT: $BB2_1: # %entry 790; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 791; MIPS32EB-NEXT: ll $2, 0($1) 792; MIPS32EB-NEXT: xor $3, $2, $4 793; MIPS32EB-NEXT: sc $3, 0($1) 794; MIPS32EB-NEXT: beqz $3, $BB2_1 795; MIPS32EB-NEXT: nop 796; MIPS32EB-NEXT: # %bb.2: # %entry 797; MIPS32EB-NEXT: jr $ra 798; MIPS32EB-NEXT: nop 799entry: 800 %0 = atomicrmw xor ptr @x, i32 %incr monotonic 801 ret i32 %0 802} 803 804define i32 @AtomicLoadOr32(i32 signext %incr) nounwind { 805; MIPS32-LABEL: AtomicLoadOr32: 806; MIPS32: # %bb.0: # %entry 807; MIPS32-NEXT: lui $2, %hi(_gp_disp) 808; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 809; MIPS32-NEXT: addu $1, $2, $25 810; MIPS32-NEXT: lw $1, %got(x)($1) 811; MIPS32-NEXT: $BB3_1: # %entry 812; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 813; MIPS32-NEXT: ll $2, 0($1) 814; MIPS32-NEXT: or $3, $2, $4 815; MIPS32-NEXT: sc $3, 0($1) 816; MIPS32-NEXT: beqz $3, $BB3_1 817; MIPS32-NEXT: nop 818; MIPS32-NEXT: # %bb.2: # %entry 819; MIPS32-NEXT: jr $ra 820; MIPS32-NEXT: nop 821; 822; MIPS32O0-LABEL: AtomicLoadOr32: 823; MIPS32O0: # %bb.0: # %entry 824; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 825; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 826; MIPS32O0-NEXT: addu $1, $2, $25 827; MIPS32O0-NEXT: lw $3, %got(x)($1) 828; MIPS32O0-NEXT: $BB3_1: # %entry 829; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 830; MIPS32O0-NEXT: ll $2, 0($3) 831; MIPS32O0-NEXT: or $1, $2, $4 832; MIPS32O0-NEXT: sc $1, 0($3) 833; MIPS32O0-NEXT: beqz $1, $BB3_1 834; MIPS32O0-NEXT: nop 835; MIPS32O0-NEXT: # %bb.2: # %entry 836; MIPS32O0-NEXT: jr $ra 837; MIPS32O0-NEXT: nop 838; 839; MIPS32R2-LABEL: AtomicLoadOr32: 840; MIPS32R2: # %bb.0: # %entry 841; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 842; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 843; MIPS32R2-NEXT: addu $1, $2, $25 844; MIPS32R2-NEXT: lw $1, %got(x)($1) 845; MIPS32R2-NEXT: $BB3_1: # %entry 846; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 847; MIPS32R2-NEXT: ll $2, 0($1) 848; MIPS32R2-NEXT: or $3, $2, $4 849; MIPS32R2-NEXT: sc $3, 0($1) 850; MIPS32R2-NEXT: beqz $3, $BB3_1 851; MIPS32R2-NEXT: nop 852; MIPS32R2-NEXT: # %bb.2: # %entry 853; MIPS32R2-NEXT: jr $ra 854; MIPS32R2-NEXT: nop 855; 856; MIPS32R6-LABEL: AtomicLoadOr32: 857; MIPS32R6: # %bb.0: # %entry 858; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 859; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 860; MIPS32R6-NEXT: addu $1, $2, $25 861; MIPS32R6-NEXT: lw $1, %got(x)($1) 862; MIPS32R6-NEXT: $BB3_1: # %entry 863; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 864; MIPS32R6-NEXT: ll $2, 0($1) 865; MIPS32R6-NEXT: or $3, $2, $4 866; MIPS32R6-NEXT: sc $3, 0($1) 867; MIPS32R6-NEXT: beqzc $3, $BB3_1 868; MIPS32R6-NEXT: nop 869; MIPS32R6-NEXT: # %bb.2: # %entry 870; MIPS32R6-NEXT: jrc $ra 871; 872; MIPS32R6O0-LABEL: AtomicLoadOr32: 873; MIPS32R6O0: # %bb.0: # %entry 874; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 875; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 876; MIPS32R6O0-NEXT: addu $1, $2, $25 877; MIPS32R6O0-NEXT: lw $3, %got(x)($1) 878; MIPS32R6O0-NEXT: $BB3_1: # %entry 879; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 880; MIPS32R6O0-NEXT: ll $2, 0($3) 881; MIPS32R6O0-NEXT: or $1, $2, $4 882; MIPS32R6O0-NEXT: sc $1, 0($3) 883; MIPS32R6O0-NEXT: beqzc $1, $BB3_1 884; MIPS32R6O0-NEXT: nop 885; MIPS32R6O0-NEXT: # %bb.2: # %entry 886; MIPS32R6O0-NEXT: jrc $ra 887; 888; MIPS4-LABEL: AtomicLoadOr32: 889; MIPS4: # %bb.0: # %entry 890; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 891; MIPS4-NEXT: daddu $1, $1, $25 892; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 893; MIPS4-NEXT: ld $1, %got_disp(x)($1) 894; MIPS4-NEXT: .LBB3_1: # %entry 895; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 896; MIPS4-NEXT: ll $2, 0($1) 897; MIPS4-NEXT: or $3, $2, $4 898; MIPS4-NEXT: sc $3, 0($1) 899; MIPS4-NEXT: beqz $3, .LBB3_1 900; MIPS4-NEXT: nop 901; MIPS4-NEXT: # %bb.2: # %entry 902; MIPS4-NEXT: jr $ra 903; MIPS4-NEXT: nop 904; 905; MIPS64-LABEL: AtomicLoadOr32: 906; MIPS64: # %bb.0: # %entry 907; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 908; MIPS64-NEXT: daddu $1, $1, $25 909; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 910; MIPS64-NEXT: ld $1, %got_disp(x)($1) 911; MIPS64-NEXT: .LBB3_1: # %entry 912; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 913; MIPS64-NEXT: ll $2, 0($1) 914; MIPS64-NEXT: or $3, $2, $4 915; MIPS64-NEXT: sc $3, 0($1) 916; MIPS64-NEXT: beqz $3, .LBB3_1 917; MIPS64-NEXT: nop 918; MIPS64-NEXT: # %bb.2: # %entry 919; MIPS64-NEXT: jr $ra 920; MIPS64-NEXT: nop 921; 922; MIPS64R2-LABEL: AtomicLoadOr32: 923; MIPS64R2: # %bb.0: # %entry 924; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 925; MIPS64R2-NEXT: daddu $1, $1, $25 926; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 927; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 928; MIPS64R2-NEXT: .LBB3_1: # %entry 929; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 930; MIPS64R2-NEXT: ll $2, 0($1) 931; MIPS64R2-NEXT: or $3, $2, $4 932; MIPS64R2-NEXT: sc $3, 0($1) 933; MIPS64R2-NEXT: beqz $3, .LBB3_1 934; MIPS64R2-NEXT: nop 935; MIPS64R2-NEXT: # %bb.2: # %entry 936; MIPS64R2-NEXT: jr $ra 937; MIPS64R2-NEXT: nop 938; 939; MIPS64R6-LABEL: AtomicLoadOr32: 940; MIPS64R6: # %bb.0: # %entry 941; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 942; MIPS64R6-NEXT: daddu $1, $1, $25 943; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 944; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 945; MIPS64R6-NEXT: .LBB3_1: # %entry 946; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 947; MIPS64R6-NEXT: ll $2, 0($1) 948; MIPS64R6-NEXT: or $3, $2, $4 949; MIPS64R6-NEXT: sc $3, 0($1) 950; MIPS64R6-NEXT: beqzc $3, .LBB3_1 951; MIPS64R6-NEXT: nop 952; MIPS64R6-NEXT: # %bb.2: # %entry 953; MIPS64R6-NEXT: jrc $ra 954; 955; MIPS64R6O0-LABEL: AtomicLoadOr32: 956; MIPS64R6O0: # %bb.0: # %entry 957; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32))) 958; MIPS64R6O0-NEXT: daddu $1, $1, $25 959; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32))) 960; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 961; MIPS64R6O0-NEXT: ld $3, %got_disp(x)($1) 962; MIPS64R6O0-NEXT: .LBB3_1: # %entry 963; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 964; MIPS64R6O0-NEXT: ll $2, 0($3) 965; MIPS64R6O0-NEXT: or $1, $2, $4 966; MIPS64R6O0-NEXT: sc $1, 0($3) 967; MIPS64R6O0-NEXT: beqzc $1, .LBB3_1 968; MIPS64R6O0-NEXT: nop 969; MIPS64R6O0-NEXT: # %bb.2: # %entry 970; MIPS64R6O0-NEXT: jrc $ra 971; 972; MM32-LABEL: AtomicLoadOr32: 973; MM32: # %bb.0: # %entry 974; MM32-NEXT: lui $2, %hi(_gp_disp) 975; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 976; MM32-NEXT: addu $2, $2, $25 977; MM32-NEXT: lw $1, %got(x)($2) 978; MM32-NEXT: $BB3_1: # %entry 979; MM32-NEXT: # =>This Inner Loop Header: Depth=1 980; MM32-NEXT: ll $2, 0($1) 981; MM32-NEXT: or $3, $2, $4 982; MM32-NEXT: sc $3, 0($1) 983; MM32-NEXT: beqzc $3, $BB3_1 984; MM32-NEXT: # %bb.2: # %entry 985; MM32-NEXT: jrc $ra 986; 987; O1-LABEL: AtomicLoadOr32: 988; O1: # %bb.0: # %entry 989; O1-NEXT: lui $2, %hi(_gp_disp) 990; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 991; O1-NEXT: addu $1, $2, $25 992; O1-NEXT: lw $1, %got(x)($1) 993; O1-NEXT: $BB3_1: # %entry 994; O1-NEXT: # =>This Inner Loop Header: Depth=1 995; O1-NEXT: ll $2, 0($1) 996; O1-NEXT: or $3, $2, $4 997; O1-NEXT: sc $3, 0($1) 998; O1-NEXT: beqz $3, $BB3_1 999; O1-NEXT: nop 1000; O1-NEXT: # %bb.2: # %entry 1001; O1-NEXT: jr $ra 1002; O1-NEXT: nop 1003; 1004; O2-LABEL: AtomicLoadOr32: 1005; O2: # %bb.0: # %entry 1006; O2-NEXT: lui $2, %hi(_gp_disp) 1007; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1008; O2-NEXT: addu $1, $2, $25 1009; O2-NEXT: lw $1, %got(x)($1) 1010; O2-NEXT: $BB3_1: # %entry 1011; O2-NEXT: # =>This Inner Loop Header: Depth=1 1012; O2-NEXT: ll $2, 0($1) 1013; O2-NEXT: or $3, $2, $4 1014; O2-NEXT: sc $3, 0($1) 1015; O2-NEXT: beqz $3, $BB3_1 1016; O2-NEXT: nop 1017; O2-NEXT: # %bb.2: # %entry 1018; O2-NEXT: jr $ra 1019; O2-NEXT: nop 1020; 1021; O3-LABEL: AtomicLoadOr32: 1022; O3: # %bb.0: # %entry 1023; O3-NEXT: lui $2, %hi(_gp_disp) 1024; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1025; O3-NEXT: addu $1, $2, $25 1026; O3-NEXT: lw $1, %got(x)($1) 1027; O3-NEXT: $BB3_1: # %entry 1028; O3-NEXT: # =>This Inner Loop Header: Depth=1 1029; O3-NEXT: ll $2, 0($1) 1030; O3-NEXT: or $3, $2, $4 1031; O3-NEXT: sc $3, 0($1) 1032; O3-NEXT: beqz $3, $BB3_1 1033; O3-NEXT: nop 1034; O3-NEXT: # %bb.2: # %entry 1035; O3-NEXT: jr $ra 1036; O3-NEXT: nop 1037; 1038; MIPS32EB-LABEL: AtomicLoadOr32: 1039; MIPS32EB: # %bb.0: # %entry 1040; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1041; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1042; MIPS32EB-NEXT: addu $1, $2, $25 1043; MIPS32EB-NEXT: lw $1, %got(x)($1) 1044; MIPS32EB-NEXT: $BB3_1: # %entry 1045; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1046; MIPS32EB-NEXT: ll $2, 0($1) 1047; MIPS32EB-NEXT: or $3, $2, $4 1048; MIPS32EB-NEXT: sc $3, 0($1) 1049; MIPS32EB-NEXT: beqz $3, $BB3_1 1050; MIPS32EB-NEXT: nop 1051; MIPS32EB-NEXT: # %bb.2: # %entry 1052; MIPS32EB-NEXT: jr $ra 1053; MIPS32EB-NEXT: nop 1054entry: 1055 %0 = atomicrmw or ptr @x, i32 %incr monotonic 1056 ret i32 %0 1057} 1058 1059define i32 @AtomicLoadAnd32(i32 signext %incr) nounwind { 1060; MIPS32-LABEL: AtomicLoadAnd32: 1061; MIPS32: # %bb.0: # %entry 1062; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1063; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1064; MIPS32-NEXT: addu $1, $2, $25 1065; MIPS32-NEXT: lw $1, %got(x)($1) 1066; MIPS32-NEXT: $BB4_1: # %entry 1067; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1068; MIPS32-NEXT: ll $2, 0($1) 1069; MIPS32-NEXT: and $3, $2, $4 1070; MIPS32-NEXT: sc $3, 0($1) 1071; MIPS32-NEXT: beqz $3, $BB4_1 1072; MIPS32-NEXT: nop 1073; MIPS32-NEXT: # %bb.2: # %entry 1074; MIPS32-NEXT: jr $ra 1075; MIPS32-NEXT: nop 1076; 1077; MIPS32O0-LABEL: AtomicLoadAnd32: 1078; MIPS32O0: # %bb.0: # %entry 1079; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1080; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1081; MIPS32O0-NEXT: addu $1, $2, $25 1082; MIPS32O0-NEXT: lw $3, %got(x)($1) 1083; MIPS32O0-NEXT: $BB4_1: # %entry 1084; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1085; MIPS32O0-NEXT: ll $2, 0($3) 1086; MIPS32O0-NEXT: and $1, $2, $4 1087; MIPS32O0-NEXT: sc $1, 0($3) 1088; MIPS32O0-NEXT: beqz $1, $BB4_1 1089; MIPS32O0-NEXT: nop 1090; MIPS32O0-NEXT: # %bb.2: # %entry 1091; MIPS32O0-NEXT: jr $ra 1092; MIPS32O0-NEXT: nop 1093; 1094; MIPS32R2-LABEL: AtomicLoadAnd32: 1095; MIPS32R2: # %bb.0: # %entry 1096; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1097; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1098; MIPS32R2-NEXT: addu $1, $2, $25 1099; MIPS32R2-NEXT: lw $1, %got(x)($1) 1100; MIPS32R2-NEXT: $BB4_1: # %entry 1101; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1102; MIPS32R2-NEXT: ll $2, 0($1) 1103; MIPS32R2-NEXT: and $3, $2, $4 1104; MIPS32R2-NEXT: sc $3, 0($1) 1105; MIPS32R2-NEXT: beqz $3, $BB4_1 1106; MIPS32R2-NEXT: nop 1107; MIPS32R2-NEXT: # %bb.2: # %entry 1108; MIPS32R2-NEXT: jr $ra 1109; MIPS32R2-NEXT: nop 1110; 1111; MIPS32R6-LABEL: AtomicLoadAnd32: 1112; MIPS32R6: # %bb.0: # %entry 1113; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1114; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1115; MIPS32R6-NEXT: addu $1, $2, $25 1116; MIPS32R6-NEXT: lw $1, %got(x)($1) 1117; MIPS32R6-NEXT: $BB4_1: # %entry 1118; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1119; MIPS32R6-NEXT: ll $2, 0($1) 1120; MIPS32R6-NEXT: and $3, $2, $4 1121; MIPS32R6-NEXT: sc $3, 0($1) 1122; MIPS32R6-NEXT: beqzc $3, $BB4_1 1123; MIPS32R6-NEXT: nop 1124; MIPS32R6-NEXT: # %bb.2: # %entry 1125; MIPS32R6-NEXT: jrc $ra 1126; 1127; MIPS32R6O0-LABEL: AtomicLoadAnd32: 1128; MIPS32R6O0: # %bb.0: # %entry 1129; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1130; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1131; MIPS32R6O0-NEXT: addu $1, $2, $25 1132; MIPS32R6O0-NEXT: lw $3, %got(x)($1) 1133; MIPS32R6O0-NEXT: $BB4_1: # %entry 1134; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1135; MIPS32R6O0-NEXT: ll $2, 0($3) 1136; MIPS32R6O0-NEXT: and $1, $2, $4 1137; MIPS32R6O0-NEXT: sc $1, 0($3) 1138; MIPS32R6O0-NEXT: beqzc $1, $BB4_1 1139; MIPS32R6O0-NEXT: nop 1140; MIPS32R6O0-NEXT: # %bb.2: # %entry 1141; MIPS32R6O0-NEXT: jrc $ra 1142; 1143; MIPS4-LABEL: AtomicLoadAnd32: 1144; MIPS4: # %bb.0: # %entry 1145; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1146; MIPS4-NEXT: daddu $1, $1, $25 1147; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1148; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1149; MIPS4-NEXT: .LBB4_1: # %entry 1150; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1151; MIPS4-NEXT: ll $2, 0($1) 1152; MIPS4-NEXT: and $3, $2, $4 1153; MIPS4-NEXT: sc $3, 0($1) 1154; MIPS4-NEXT: beqz $3, .LBB4_1 1155; MIPS4-NEXT: nop 1156; MIPS4-NEXT: # %bb.2: # %entry 1157; MIPS4-NEXT: jr $ra 1158; MIPS4-NEXT: nop 1159; 1160; MIPS64-LABEL: AtomicLoadAnd32: 1161; MIPS64: # %bb.0: # %entry 1162; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1163; MIPS64-NEXT: daddu $1, $1, $25 1164; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1165; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1166; MIPS64-NEXT: .LBB4_1: # %entry 1167; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1168; MIPS64-NEXT: ll $2, 0($1) 1169; MIPS64-NEXT: and $3, $2, $4 1170; MIPS64-NEXT: sc $3, 0($1) 1171; MIPS64-NEXT: beqz $3, .LBB4_1 1172; MIPS64-NEXT: nop 1173; MIPS64-NEXT: # %bb.2: # %entry 1174; MIPS64-NEXT: jr $ra 1175; MIPS64-NEXT: nop 1176; 1177; MIPS64R2-LABEL: AtomicLoadAnd32: 1178; MIPS64R2: # %bb.0: # %entry 1179; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1180; MIPS64R2-NEXT: daddu $1, $1, $25 1181; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1182; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1183; MIPS64R2-NEXT: .LBB4_1: # %entry 1184; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1185; MIPS64R2-NEXT: ll $2, 0($1) 1186; MIPS64R2-NEXT: and $3, $2, $4 1187; MIPS64R2-NEXT: sc $3, 0($1) 1188; MIPS64R2-NEXT: beqz $3, .LBB4_1 1189; MIPS64R2-NEXT: nop 1190; MIPS64R2-NEXT: # %bb.2: # %entry 1191; MIPS64R2-NEXT: jr $ra 1192; MIPS64R2-NEXT: nop 1193; 1194; MIPS64R6-LABEL: AtomicLoadAnd32: 1195; MIPS64R6: # %bb.0: # %entry 1196; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1197; MIPS64R6-NEXT: daddu $1, $1, $25 1198; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1199; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1200; MIPS64R6-NEXT: .LBB4_1: # %entry 1201; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1202; MIPS64R6-NEXT: ll $2, 0($1) 1203; MIPS64R6-NEXT: and $3, $2, $4 1204; MIPS64R6-NEXT: sc $3, 0($1) 1205; MIPS64R6-NEXT: beqzc $3, .LBB4_1 1206; MIPS64R6-NEXT: nop 1207; MIPS64R6-NEXT: # %bb.2: # %entry 1208; MIPS64R6-NEXT: jrc $ra 1209; 1210; MIPS64R6O0-LABEL: AtomicLoadAnd32: 1211; MIPS64R6O0: # %bb.0: # %entry 1212; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32))) 1213; MIPS64R6O0-NEXT: daddu $1, $1, $25 1214; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32))) 1215; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 1216; MIPS64R6O0-NEXT: ld $3, %got_disp(x)($1) 1217; MIPS64R6O0-NEXT: .LBB4_1: # %entry 1218; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1219; MIPS64R6O0-NEXT: ll $2, 0($3) 1220; MIPS64R6O0-NEXT: and $1, $2, $4 1221; MIPS64R6O0-NEXT: sc $1, 0($3) 1222; MIPS64R6O0-NEXT: beqzc $1, .LBB4_1 1223; MIPS64R6O0-NEXT: nop 1224; MIPS64R6O0-NEXT: # %bb.2: # %entry 1225; MIPS64R6O0-NEXT: jrc $ra 1226; 1227; MM32-LABEL: AtomicLoadAnd32: 1228; MM32: # %bb.0: # %entry 1229; MM32-NEXT: lui $2, %hi(_gp_disp) 1230; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1231; MM32-NEXT: addu $2, $2, $25 1232; MM32-NEXT: lw $1, %got(x)($2) 1233; MM32-NEXT: $BB4_1: # %entry 1234; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1235; MM32-NEXT: ll $2, 0($1) 1236; MM32-NEXT: and $3, $2, $4 1237; MM32-NEXT: sc $3, 0($1) 1238; MM32-NEXT: beqzc $3, $BB4_1 1239; MM32-NEXT: # %bb.2: # %entry 1240; MM32-NEXT: jrc $ra 1241; 1242; O1-LABEL: AtomicLoadAnd32: 1243; O1: # %bb.0: # %entry 1244; O1-NEXT: lui $2, %hi(_gp_disp) 1245; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1246; O1-NEXT: addu $1, $2, $25 1247; O1-NEXT: lw $1, %got(x)($1) 1248; O1-NEXT: $BB4_1: # %entry 1249; O1-NEXT: # =>This Inner Loop Header: Depth=1 1250; O1-NEXT: ll $2, 0($1) 1251; O1-NEXT: and $3, $2, $4 1252; O1-NEXT: sc $3, 0($1) 1253; O1-NEXT: beqz $3, $BB4_1 1254; O1-NEXT: nop 1255; O1-NEXT: # %bb.2: # %entry 1256; O1-NEXT: jr $ra 1257; O1-NEXT: nop 1258; 1259; O2-LABEL: AtomicLoadAnd32: 1260; O2: # %bb.0: # %entry 1261; O2-NEXT: lui $2, %hi(_gp_disp) 1262; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1263; O2-NEXT: addu $1, $2, $25 1264; O2-NEXT: lw $1, %got(x)($1) 1265; O2-NEXT: $BB4_1: # %entry 1266; O2-NEXT: # =>This Inner Loop Header: Depth=1 1267; O2-NEXT: ll $2, 0($1) 1268; O2-NEXT: and $3, $2, $4 1269; O2-NEXT: sc $3, 0($1) 1270; O2-NEXT: beqz $3, $BB4_1 1271; O2-NEXT: nop 1272; O2-NEXT: # %bb.2: # %entry 1273; O2-NEXT: jr $ra 1274; O2-NEXT: nop 1275; 1276; O3-LABEL: AtomicLoadAnd32: 1277; O3: # %bb.0: # %entry 1278; O3-NEXT: lui $2, %hi(_gp_disp) 1279; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1280; O3-NEXT: addu $1, $2, $25 1281; O3-NEXT: lw $1, %got(x)($1) 1282; O3-NEXT: $BB4_1: # %entry 1283; O3-NEXT: # =>This Inner Loop Header: Depth=1 1284; O3-NEXT: ll $2, 0($1) 1285; O3-NEXT: and $3, $2, $4 1286; O3-NEXT: sc $3, 0($1) 1287; O3-NEXT: beqz $3, $BB4_1 1288; O3-NEXT: nop 1289; O3-NEXT: # %bb.2: # %entry 1290; O3-NEXT: jr $ra 1291; O3-NEXT: nop 1292; 1293; MIPS32EB-LABEL: AtomicLoadAnd32: 1294; MIPS32EB: # %bb.0: # %entry 1295; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1296; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1297; MIPS32EB-NEXT: addu $1, $2, $25 1298; MIPS32EB-NEXT: lw $1, %got(x)($1) 1299; MIPS32EB-NEXT: $BB4_1: # %entry 1300; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1301; MIPS32EB-NEXT: ll $2, 0($1) 1302; MIPS32EB-NEXT: and $3, $2, $4 1303; MIPS32EB-NEXT: sc $3, 0($1) 1304; MIPS32EB-NEXT: beqz $3, $BB4_1 1305; MIPS32EB-NEXT: nop 1306; MIPS32EB-NEXT: # %bb.2: # %entry 1307; MIPS32EB-NEXT: jr $ra 1308; MIPS32EB-NEXT: nop 1309entry: 1310 %0 = atomicrmw and ptr @x, i32 %incr monotonic 1311 ret i32 %0 1312} 1313 1314define i32 @AtomicLoadNand32(i32 signext %incr) nounwind { 1315; MIPS32-LABEL: AtomicLoadNand32: 1316; MIPS32: # %bb.0: # %entry 1317; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1318; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1319; MIPS32-NEXT: addu $1, $2, $25 1320; MIPS32-NEXT: lw $1, %got(x)($1) 1321; MIPS32-NEXT: $BB5_1: # %entry 1322; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1323; MIPS32-NEXT: ll $2, 0($1) 1324; MIPS32-NEXT: and $3, $2, $4 1325; MIPS32-NEXT: nor $3, $zero, $3 1326; MIPS32-NEXT: sc $3, 0($1) 1327; MIPS32-NEXT: beqz $3, $BB5_1 1328; MIPS32-NEXT: nop 1329; MIPS32-NEXT: # %bb.2: # %entry 1330; MIPS32-NEXT: jr $ra 1331; MIPS32-NEXT: nop 1332; 1333; MIPS32O0-LABEL: AtomicLoadNand32: 1334; MIPS32O0: # %bb.0: # %entry 1335; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1336; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1337; MIPS32O0-NEXT: addu $1, $2, $25 1338; MIPS32O0-NEXT: lw $3, %got(x)($1) 1339; MIPS32O0-NEXT: $BB5_1: # %entry 1340; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1341; MIPS32O0-NEXT: ll $2, 0($3) 1342; MIPS32O0-NEXT: and $1, $2, $4 1343; MIPS32O0-NEXT: nor $1, $zero, $1 1344; MIPS32O0-NEXT: sc $1, 0($3) 1345; MIPS32O0-NEXT: beqz $1, $BB5_1 1346; MIPS32O0-NEXT: nop 1347; MIPS32O0-NEXT: # %bb.2: # %entry 1348; MIPS32O0-NEXT: jr $ra 1349; MIPS32O0-NEXT: nop 1350; 1351; MIPS32R2-LABEL: AtomicLoadNand32: 1352; MIPS32R2: # %bb.0: # %entry 1353; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1354; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1355; MIPS32R2-NEXT: addu $1, $2, $25 1356; MIPS32R2-NEXT: lw $1, %got(x)($1) 1357; MIPS32R2-NEXT: $BB5_1: # %entry 1358; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1359; MIPS32R2-NEXT: ll $2, 0($1) 1360; MIPS32R2-NEXT: and $3, $2, $4 1361; MIPS32R2-NEXT: nor $3, $zero, $3 1362; MIPS32R2-NEXT: sc $3, 0($1) 1363; MIPS32R2-NEXT: beqz $3, $BB5_1 1364; MIPS32R2-NEXT: nop 1365; MIPS32R2-NEXT: # %bb.2: # %entry 1366; MIPS32R2-NEXT: jr $ra 1367; MIPS32R2-NEXT: nop 1368; 1369; MIPS32R6-LABEL: AtomicLoadNand32: 1370; MIPS32R6: # %bb.0: # %entry 1371; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1372; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1373; MIPS32R6-NEXT: addu $1, $2, $25 1374; MIPS32R6-NEXT: lw $1, %got(x)($1) 1375; MIPS32R6-NEXT: $BB5_1: # %entry 1376; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1377; MIPS32R6-NEXT: ll $2, 0($1) 1378; MIPS32R6-NEXT: and $3, $2, $4 1379; MIPS32R6-NEXT: nor $3, $zero, $3 1380; MIPS32R6-NEXT: sc $3, 0($1) 1381; MIPS32R6-NEXT: beqzc $3, $BB5_1 1382; MIPS32R6-NEXT: nop 1383; MIPS32R6-NEXT: # %bb.2: # %entry 1384; MIPS32R6-NEXT: jrc $ra 1385; 1386; MIPS32R6O0-LABEL: AtomicLoadNand32: 1387; MIPS32R6O0: # %bb.0: # %entry 1388; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1389; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1390; MIPS32R6O0-NEXT: addu $1, $2, $25 1391; MIPS32R6O0-NEXT: lw $3, %got(x)($1) 1392; MIPS32R6O0-NEXT: $BB5_1: # %entry 1393; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1394; MIPS32R6O0-NEXT: ll $2, 0($3) 1395; MIPS32R6O0-NEXT: and $1, $2, $4 1396; MIPS32R6O0-NEXT: nor $1, $zero, $1 1397; MIPS32R6O0-NEXT: sc $1, 0($3) 1398; MIPS32R6O0-NEXT: beqzc $1, $BB5_1 1399; MIPS32R6O0-NEXT: nop 1400; MIPS32R6O0-NEXT: # %bb.2: # %entry 1401; MIPS32R6O0-NEXT: jrc $ra 1402; 1403; MIPS4-LABEL: AtomicLoadNand32: 1404; MIPS4: # %bb.0: # %entry 1405; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1406; MIPS4-NEXT: daddu $1, $1, $25 1407; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1408; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1409; MIPS4-NEXT: .LBB5_1: # %entry 1410; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1411; MIPS4-NEXT: ll $2, 0($1) 1412; MIPS4-NEXT: and $3, $2, $4 1413; MIPS4-NEXT: nor $3, $zero, $3 1414; MIPS4-NEXT: sc $3, 0($1) 1415; MIPS4-NEXT: beqz $3, .LBB5_1 1416; MIPS4-NEXT: nop 1417; MIPS4-NEXT: # %bb.2: # %entry 1418; MIPS4-NEXT: jr $ra 1419; MIPS4-NEXT: nop 1420; 1421; MIPS64-LABEL: AtomicLoadNand32: 1422; MIPS64: # %bb.0: # %entry 1423; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1424; MIPS64-NEXT: daddu $1, $1, $25 1425; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1426; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1427; MIPS64-NEXT: .LBB5_1: # %entry 1428; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1429; MIPS64-NEXT: ll $2, 0($1) 1430; MIPS64-NEXT: and $3, $2, $4 1431; MIPS64-NEXT: nor $3, $zero, $3 1432; MIPS64-NEXT: sc $3, 0($1) 1433; MIPS64-NEXT: beqz $3, .LBB5_1 1434; MIPS64-NEXT: nop 1435; MIPS64-NEXT: # %bb.2: # %entry 1436; MIPS64-NEXT: jr $ra 1437; MIPS64-NEXT: nop 1438; 1439; MIPS64R2-LABEL: AtomicLoadNand32: 1440; MIPS64R2: # %bb.0: # %entry 1441; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1442; MIPS64R2-NEXT: daddu $1, $1, $25 1443; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1444; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1445; MIPS64R2-NEXT: .LBB5_1: # %entry 1446; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1447; MIPS64R2-NEXT: ll $2, 0($1) 1448; MIPS64R2-NEXT: and $3, $2, $4 1449; MIPS64R2-NEXT: nor $3, $zero, $3 1450; MIPS64R2-NEXT: sc $3, 0($1) 1451; MIPS64R2-NEXT: beqz $3, .LBB5_1 1452; MIPS64R2-NEXT: nop 1453; MIPS64R2-NEXT: # %bb.2: # %entry 1454; MIPS64R2-NEXT: jr $ra 1455; MIPS64R2-NEXT: nop 1456; 1457; MIPS64R6-LABEL: AtomicLoadNand32: 1458; MIPS64R6: # %bb.0: # %entry 1459; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1460; MIPS64R6-NEXT: daddu $1, $1, $25 1461; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1462; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1463; MIPS64R6-NEXT: .LBB5_1: # %entry 1464; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1465; MIPS64R6-NEXT: ll $2, 0($1) 1466; MIPS64R6-NEXT: and $3, $2, $4 1467; MIPS64R6-NEXT: nor $3, $zero, $3 1468; MIPS64R6-NEXT: sc $3, 0($1) 1469; MIPS64R6-NEXT: beqzc $3, .LBB5_1 1470; MIPS64R6-NEXT: nop 1471; MIPS64R6-NEXT: # %bb.2: # %entry 1472; MIPS64R6-NEXT: jrc $ra 1473; 1474; MIPS64R6O0-LABEL: AtomicLoadNand32: 1475; MIPS64R6O0: # %bb.0: # %entry 1476; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32))) 1477; MIPS64R6O0-NEXT: daddu $1, $1, $25 1478; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32))) 1479; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 1480; MIPS64R6O0-NEXT: ld $3, %got_disp(x)($1) 1481; MIPS64R6O0-NEXT: .LBB5_1: # %entry 1482; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1483; MIPS64R6O0-NEXT: ll $2, 0($3) 1484; MIPS64R6O0-NEXT: and $1, $2, $4 1485; MIPS64R6O0-NEXT: nor $1, $zero, $1 1486; MIPS64R6O0-NEXT: sc $1, 0($3) 1487; MIPS64R6O0-NEXT: beqzc $1, .LBB5_1 1488; MIPS64R6O0-NEXT: nop 1489; MIPS64R6O0-NEXT: # %bb.2: # %entry 1490; MIPS64R6O0-NEXT: jrc $ra 1491; 1492; MM32-LABEL: AtomicLoadNand32: 1493; MM32: # %bb.0: # %entry 1494; MM32-NEXT: lui $2, %hi(_gp_disp) 1495; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1496; MM32-NEXT: addu $2, $2, $25 1497; MM32-NEXT: lw $1, %got(x)($2) 1498; MM32-NEXT: $BB5_1: # %entry 1499; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1500; MM32-NEXT: ll $2, 0($1) 1501; MM32-NEXT: and $3, $2, $4 1502; MM32-NEXT: nor $3, $zero, $3 1503; MM32-NEXT: sc $3, 0($1) 1504; MM32-NEXT: beqzc $3, $BB5_1 1505; MM32-NEXT: # %bb.2: # %entry 1506; MM32-NEXT: jrc $ra 1507; 1508; O1-LABEL: AtomicLoadNand32: 1509; O1: # %bb.0: # %entry 1510; O1-NEXT: lui $2, %hi(_gp_disp) 1511; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1512; O1-NEXT: addu $1, $2, $25 1513; O1-NEXT: lw $1, %got(x)($1) 1514; O1-NEXT: $BB5_1: # %entry 1515; O1-NEXT: # =>This Inner Loop Header: Depth=1 1516; O1-NEXT: ll $2, 0($1) 1517; O1-NEXT: and $3, $2, $4 1518; O1-NEXT: nor $3, $zero, $3 1519; O1-NEXT: sc $3, 0($1) 1520; O1-NEXT: beqz $3, $BB5_1 1521; O1-NEXT: nop 1522; O1-NEXT: # %bb.2: # %entry 1523; O1-NEXT: jr $ra 1524; O1-NEXT: nop 1525; 1526; O2-LABEL: AtomicLoadNand32: 1527; O2: # %bb.0: # %entry 1528; O2-NEXT: lui $2, %hi(_gp_disp) 1529; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1530; O2-NEXT: addu $1, $2, $25 1531; O2-NEXT: lw $1, %got(x)($1) 1532; O2-NEXT: $BB5_1: # %entry 1533; O2-NEXT: # =>This Inner Loop Header: Depth=1 1534; O2-NEXT: ll $2, 0($1) 1535; O2-NEXT: and $3, $2, $4 1536; O2-NEXT: nor $3, $zero, $3 1537; O2-NEXT: sc $3, 0($1) 1538; O2-NEXT: beqz $3, $BB5_1 1539; O2-NEXT: nop 1540; O2-NEXT: # %bb.2: # %entry 1541; O2-NEXT: jr $ra 1542; O2-NEXT: nop 1543; 1544; O3-LABEL: AtomicLoadNand32: 1545; O3: # %bb.0: # %entry 1546; O3-NEXT: lui $2, %hi(_gp_disp) 1547; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1548; O3-NEXT: addu $1, $2, $25 1549; O3-NEXT: lw $1, %got(x)($1) 1550; O3-NEXT: $BB5_1: # %entry 1551; O3-NEXT: # =>This Inner Loop Header: Depth=1 1552; O3-NEXT: ll $2, 0($1) 1553; O3-NEXT: and $3, $2, $4 1554; O3-NEXT: nor $3, $zero, $3 1555; O3-NEXT: sc $3, 0($1) 1556; O3-NEXT: beqz $3, $BB5_1 1557; O3-NEXT: nop 1558; O3-NEXT: # %bb.2: # %entry 1559; O3-NEXT: jr $ra 1560; O3-NEXT: nop 1561; 1562; MIPS32EB-LABEL: AtomicLoadNand32: 1563; MIPS32EB: # %bb.0: # %entry 1564; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1565; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1566; MIPS32EB-NEXT: addu $1, $2, $25 1567; MIPS32EB-NEXT: lw $1, %got(x)($1) 1568; MIPS32EB-NEXT: $BB5_1: # %entry 1569; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1570; MIPS32EB-NEXT: ll $2, 0($1) 1571; MIPS32EB-NEXT: and $3, $2, $4 1572; MIPS32EB-NEXT: nor $3, $zero, $3 1573; MIPS32EB-NEXT: sc $3, 0($1) 1574; MIPS32EB-NEXT: beqz $3, $BB5_1 1575; MIPS32EB-NEXT: nop 1576; MIPS32EB-NEXT: # %bb.2: # %entry 1577; MIPS32EB-NEXT: jr $ra 1578; MIPS32EB-NEXT: nop 1579entry: 1580 %0 = atomicrmw nand ptr @x, i32 %incr monotonic 1581 ret i32 %0 1582 1583} 1584 1585define i32 @AtomicSwap32(i32 signext %newval) nounwind { 1586; MIPS32-LABEL: AtomicSwap32: 1587; MIPS32: # %bb.0: # %entry 1588; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1589; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1590; MIPS32-NEXT: addiu $sp, $sp, -8 1591; MIPS32-NEXT: addu $1, $2, $25 1592; MIPS32-NEXT: sw $4, 4($sp) 1593; MIPS32-NEXT: lw $1, %got(x)($1) 1594; MIPS32-NEXT: $BB6_1: # %entry 1595; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1596; MIPS32-NEXT: ll $2, 0($1) 1597; MIPS32-NEXT: move $3, $4 1598; MIPS32-NEXT: sc $3, 0($1) 1599; MIPS32-NEXT: beqz $3, $BB6_1 1600; MIPS32-NEXT: nop 1601; MIPS32-NEXT: # %bb.2: # %entry 1602; MIPS32-NEXT: jr $ra 1603; MIPS32-NEXT: addiu $sp, $sp, 8 1604; 1605; MIPS32O0-LABEL: AtomicSwap32: 1606; MIPS32O0: # %bb.0: # %entry 1607; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1608; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1609; MIPS32O0-NEXT: addiu $sp, $sp, -8 1610; MIPS32O0-NEXT: addu $1, $2, $25 1611; MIPS32O0-NEXT: sw $4, 4($sp) 1612; MIPS32O0-NEXT: lw $4, 4($sp) 1613; MIPS32O0-NEXT: lw $3, %got(x)($1) 1614; MIPS32O0-NEXT: $BB6_1: # %entry 1615; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1616; MIPS32O0-NEXT: ll $2, 0($3) 1617; MIPS32O0-NEXT: move $1, $4 1618; MIPS32O0-NEXT: sc $1, 0($3) 1619; MIPS32O0-NEXT: beqz $1, $BB6_1 1620; MIPS32O0-NEXT: nop 1621; MIPS32O0-NEXT: # %bb.2: # %entry 1622; MIPS32O0-NEXT: addiu $sp, $sp, 8 1623; MIPS32O0-NEXT: jr $ra 1624; MIPS32O0-NEXT: nop 1625; 1626; MIPS32R2-LABEL: AtomicSwap32: 1627; MIPS32R2: # %bb.0: # %entry 1628; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1629; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1630; MIPS32R2-NEXT: addiu $sp, $sp, -8 1631; MIPS32R2-NEXT: addu $1, $2, $25 1632; MIPS32R2-NEXT: sw $4, 4($sp) 1633; MIPS32R2-NEXT: lw $1, %got(x)($1) 1634; MIPS32R2-NEXT: $BB6_1: # %entry 1635; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1636; MIPS32R2-NEXT: ll $2, 0($1) 1637; MIPS32R2-NEXT: move $3, $4 1638; MIPS32R2-NEXT: sc $3, 0($1) 1639; MIPS32R2-NEXT: beqz $3, $BB6_1 1640; MIPS32R2-NEXT: nop 1641; MIPS32R2-NEXT: # %bb.2: # %entry 1642; MIPS32R2-NEXT: jr $ra 1643; MIPS32R2-NEXT: addiu $sp, $sp, 8 1644; 1645; MIPS32R6-LABEL: AtomicSwap32: 1646; MIPS32R6: # %bb.0: # %entry 1647; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1648; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1649; MIPS32R6-NEXT: addiu $sp, $sp, -8 1650; MIPS32R6-NEXT: addu $1, $2, $25 1651; MIPS32R6-NEXT: sw $4, 4($sp) 1652; MIPS32R6-NEXT: lw $1, %got(x)($1) 1653; MIPS32R6-NEXT: $BB6_1: # %entry 1654; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1655; MIPS32R6-NEXT: ll $2, 0($1) 1656; MIPS32R6-NEXT: move $3, $4 1657; MIPS32R6-NEXT: sc $3, 0($1) 1658; MIPS32R6-NEXT: beqzc $3, $BB6_1 1659; MIPS32R6-NEXT: nop 1660; MIPS32R6-NEXT: # %bb.2: # %entry 1661; MIPS32R6-NEXT: jr $ra 1662; MIPS32R6-NEXT: addiu $sp, $sp, 8 1663; 1664; MIPS32R6O0-LABEL: AtomicSwap32: 1665; MIPS32R6O0: # %bb.0: # %entry 1666; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1667; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1668; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 1669; MIPS32R6O0-NEXT: addu $1, $2, $25 1670; MIPS32R6O0-NEXT: sw $4, 4($sp) 1671; MIPS32R6O0-NEXT: lw $4, 4($sp) 1672; MIPS32R6O0-NEXT: lw $3, %got(x)($1) 1673; MIPS32R6O0-NEXT: $BB6_1: # %entry 1674; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1675; MIPS32R6O0-NEXT: ll $2, 0($3) 1676; MIPS32R6O0-NEXT: move $1, $4 1677; MIPS32R6O0-NEXT: sc $1, 0($3) 1678; MIPS32R6O0-NEXT: beqzc $1, $BB6_1 1679; MIPS32R6O0-NEXT: # %bb.2: # %entry 1680; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 1681; MIPS32R6O0-NEXT: jrc $ra 1682; 1683; MIPS4-LABEL: AtomicSwap32: 1684; MIPS4: # %bb.0: # %entry 1685; MIPS4-NEXT: daddiu $sp, $sp, -16 1686; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1687; MIPS4-NEXT: daddu $1, $1, $25 1688; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1689; MIPS4-NEXT: sw $4, 12($sp) 1690; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1691; MIPS4-NEXT: .LBB6_1: # %entry 1692; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1693; MIPS4-NEXT: ll $2, 0($1) 1694; MIPS4-NEXT: move $3, $4 1695; MIPS4-NEXT: sc $3, 0($1) 1696; MIPS4-NEXT: beqz $3, .LBB6_1 1697; MIPS4-NEXT: nop 1698; MIPS4-NEXT: # %bb.2: # %entry 1699; MIPS4-NEXT: jr $ra 1700; MIPS4-NEXT: daddiu $sp, $sp, 16 1701; 1702; MIPS64-LABEL: AtomicSwap32: 1703; MIPS64: # %bb.0: # %entry 1704; MIPS64-NEXT: daddiu $sp, $sp, -16 1705; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1706; MIPS64-NEXT: daddu $1, $1, $25 1707; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1708; MIPS64-NEXT: sw $4, 12($sp) 1709; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1710; MIPS64-NEXT: .LBB6_1: # %entry 1711; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1712; MIPS64-NEXT: ll $2, 0($1) 1713; MIPS64-NEXT: move $3, $4 1714; MIPS64-NEXT: sc $3, 0($1) 1715; MIPS64-NEXT: beqz $3, .LBB6_1 1716; MIPS64-NEXT: nop 1717; MIPS64-NEXT: # %bb.2: # %entry 1718; MIPS64-NEXT: jr $ra 1719; MIPS64-NEXT: daddiu $sp, $sp, 16 1720; 1721; MIPS64R2-LABEL: AtomicSwap32: 1722; MIPS64R2: # %bb.0: # %entry 1723; MIPS64R2-NEXT: daddiu $sp, $sp, -16 1724; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1725; MIPS64R2-NEXT: daddu $1, $1, $25 1726; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1727; MIPS64R2-NEXT: sw $4, 12($sp) 1728; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1729; MIPS64R2-NEXT: .LBB6_1: # %entry 1730; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1731; MIPS64R2-NEXT: ll $2, 0($1) 1732; MIPS64R2-NEXT: move $3, $4 1733; MIPS64R2-NEXT: sc $3, 0($1) 1734; MIPS64R2-NEXT: beqz $3, .LBB6_1 1735; MIPS64R2-NEXT: nop 1736; MIPS64R2-NEXT: # %bb.2: # %entry 1737; MIPS64R2-NEXT: jr $ra 1738; MIPS64R2-NEXT: daddiu $sp, $sp, 16 1739; 1740; MIPS64R6-LABEL: AtomicSwap32: 1741; MIPS64R6: # %bb.0: # %entry 1742; MIPS64R6-NEXT: daddiu $sp, $sp, -16 1743; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1744; MIPS64R6-NEXT: daddu $1, $1, $25 1745; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1746; MIPS64R6-NEXT: sw $4, 12($sp) 1747; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1748; MIPS64R6-NEXT: .LBB6_1: # %entry 1749; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1750; MIPS64R6-NEXT: ll $2, 0($1) 1751; MIPS64R6-NEXT: move $3, $4 1752; MIPS64R6-NEXT: sc $3, 0($1) 1753; MIPS64R6-NEXT: beqzc $3, .LBB6_1 1754; MIPS64R6-NEXT: nop 1755; MIPS64R6-NEXT: # %bb.2: # %entry 1756; MIPS64R6-NEXT: jr $ra 1757; MIPS64R6-NEXT: daddiu $sp, $sp, 16 1758; 1759; MIPS64R6O0-LABEL: AtomicSwap32: 1760; MIPS64R6O0: # %bb.0: # %entry 1761; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 1762; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap32))) 1763; MIPS64R6O0-NEXT: daddu $1, $1, $25 1764; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32))) 1765; MIPS64R6O0-NEXT: move $2, $4 1766; MIPS64R6O0-NEXT: sw $2, 12($sp) 1767; MIPS64R6O0-NEXT: lw $4, 12($sp) 1768; MIPS64R6O0-NEXT: ld $3, %got_disp(x)($1) 1769; MIPS64R6O0-NEXT: .LBB6_1: # %entry 1770; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1771; MIPS64R6O0-NEXT: ll $2, 0($3) 1772; MIPS64R6O0-NEXT: move $1, $4 1773; MIPS64R6O0-NEXT: sc $1, 0($3) 1774; MIPS64R6O0-NEXT: beqzc $1, .LBB6_1 1775; MIPS64R6O0-NEXT: # %bb.2: # %entry 1776; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 1777; MIPS64R6O0-NEXT: jrc $ra 1778; 1779; MM32-LABEL: AtomicSwap32: 1780; MM32: # %bb.0: # %entry 1781; MM32-NEXT: lui $2, %hi(_gp_disp) 1782; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 1783; MM32-NEXT: addiu $sp, $sp, -8 1784; MM32-NEXT: addu $2, $2, $25 1785; MM32-NEXT: sw $4, 4($sp) 1786; MM32-NEXT: lw $1, %got(x)($2) 1787; MM32-NEXT: $BB6_1: # %entry 1788; MM32-NEXT: # =>This Inner Loop Header: Depth=1 1789; MM32-NEXT: ll $2, 0($1) 1790; MM32-NEXT: or $3, $4, $zero 1791; MM32-NEXT: sc $3, 0($1) 1792; MM32-NEXT: beqzc $3, $BB6_1 1793; MM32-NEXT: # %bb.2: # %entry 1794; MM32-NEXT: addiusp 8 1795; MM32-NEXT: jrc $ra 1796; 1797; O1-LABEL: AtomicSwap32: 1798; O1: # %bb.0: # %entry 1799; O1-NEXT: lui $2, %hi(_gp_disp) 1800; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 1801; O1-NEXT: addiu $sp, $sp, -8 1802; O1-NEXT: addu $1, $2, $25 1803; O1-NEXT: sw $4, 4($sp) 1804; O1-NEXT: lw $1, %got(x)($1) 1805; O1-NEXT: $BB6_1: # %entry 1806; O1-NEXT: # =>This Inner Loop Header: Depth=1 1807; O1-NEXT: ll $2, 0($1) 1808; O1-NEXT: move $3, $4 1809; O1-NEXT: sc $3, 0($1) 1810; O1-NEXT: beqz $3, $BB6_1 1811; O1-NEXT: nop 1812; O1-NEXT: # %bb.2: # %entry 1813; O1-NEXT: jr $ra 1814; O1-NEXT: addiu $sp, $sp, 8 1815; 1816; O2-LABEL: AtomicSwap32: 1817; O2: # %bb.0: # %entry 1818; O2-NEXT: lui $2, %hi(_gp_disp) 1819; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 1820; O2-NEXT: addiu $sp, $sp, -8 1821; O2-NEXT: addu $1, $2, $25 1822; O2-NEXT: sw $4, 4($sp) 1823; O2-NEXT: lw $1, %got(x)($1) 1824; O2-NEXT: $BB6_1: # %entry 1825; O2-NEXT: # =>This Inner Loop Header: Depth=1 1826; O2-NEXT: ll $2, 0($1) 1827; O2-NEXT: move $3, $4 1828; O2-NEXT: sc $3, 0($1) 1829; O2-NEXT: beqz $3, $BB6_1 1830; O2-NEXT: nop 1831; O2-NEXT: # %bb.2: # %entry 1832; O2-NEXT: jr $ra 1833; O2-NEXT: addiu $sp, $sp, 8 1834; 1835; O3-LABEL: AtomicSwap32: 1836; O3: # %bb.0: # %entry 1837; O3-NEXT: lui $2, %hi(_gp_disp) 1838; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 1839; O3-NEXT: addiu $sp, $sp, -8 1840; O3-NEXT: addu $1, $2, $25 1841; O3-NEXT: sw $4, 4($sp) 1842; O3-NEXT: lw $1, %got(x)($1) 1843; O3-NEXT: $BB6_1: # %entry 1844; O3-NEXT: # =>This Inner Loop Header: Depth=1 1845; O3-NEXT: ll $2, 0($1) 1846; O3-NEXT: move $3, $4 1847; O3-NEXT: sc $3, 0($1) 1848; O3-NEXT: beqz $3, $BB6_1 1849; O3-NEXT: nop 1850; O3-NEXT: # %bb.2: # %entry 1851; O3-NEXT: jr $ra 1852; O3-NEXT: addiu $sp, $sp, 8 1853; 1854; MIPS32EB-LABEL: AtomicSwap32: 1855; MIPS32EB: # %bb.0: # %entry 1856; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 1857; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 1858; MIPS32EB-NEXT: addiu $sp, $sp, -8 1859; MIPS32EB-NEXT: addu $1, $2, $25 1860; MIPS32EB-NEXT: sw $4, 4($sp) 1861; MIPS32EB-NEXT: lw $1, %got(x)($1) 1862; MIPS32EB-NEXT: $BB6_1: # %entry 1863; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 1864; MIPS32EB-NEXT: ll $2, 0($1) 1865; MIPS32EB-NEXT: move $3, $4 1866; MIPS32EB-NEXT: sc $3, 0($1) 1867; MIPS32EB-NEXT: beqz $3, $BB6_1 1868; MIPS32EB-NEXT: nop 1869; MIPS32EB-NEXT: # %bb.2: # %entry 1870; MIPS32EB-NEXT: jr $ra 1871; MIPS32EB-NEXT: addiu $sp, $sp, 8 1872entry: 1873 %newval.addr = alloca i32, align 4 1874 store i32 %newval, ptr %newval.addr, align 4 1875 %tmp = load i32, ptr %newval.addr, align 4 1876 %0 = atomicrmw xchg ptr @x, i32 %tmp monotonic 1877 ret i32 %0 1878 1879} 1880 1881define i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind { 1882; MIPS32-LABEL: AtomicCmpSwap32: 1883; MIPS32: # %bb.0: # %entry 1884; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1885; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1886; MIPS32-NEXT: addiu $sp, $sp, -8 1887; MIPS32-NEXT: addu $1, $2, $25 1888; MIPS32-NEXT: sw $5, 4($sp) 1889; MIPS32-NEXT: lw $1, %got(x)($1) 1890; MIPS32-NEXT: $BB7_1: # %entry 1891; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 1892; MIPS32-NEXT: ll $2, 0($1) 1893; MIPS32-NEXT: bne $2, $4, $BB7_3 1894; MIPS32-NEXT: nop 1895; MIPS32-NEXT: # %bb.2: # %entry 1896; MIPS32-NEXT: # in Loop: Header=BB7_1 Depth=1 1897; MIPS32-NEXT: move $3, $5 1898; MIPS32-NEXT: sc $3, 0($1) 1899; MIPS32-NEXT: beqz $3, $BB7_1 1900; MIPS32-NEXT: nop 1901; MIPS32-NEXT: $BB7_3: # %entry 1902; MIPS32-NEXT: jr $ra 1903; MIPS32-NEXT: addiu $sp, $sp, 8 1904; 1905; MIPS32O0-LABEL: AtomicCmpSwap32: 1906; MIPS32O0: # %bb.0: # %entry 1907; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 1908; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1909; MIPS32O0-NEXT: addiu $sp, $sp, -8 1910; MIPS32O0-NEXT: addu $1, $2, $25 1911; MIPS32O0-NEXT: sw $5, 4($sp) 1912; MIPS32O0-NEXT: lw $6, 4($sp) 1913; MIPS32O0-NEXT: lw $3, %got(x)($1) 1914; MIPS32O0-NEXT: move $5, $4 1915; MIPS32O0-NEXT: $BB7_1: # %entry 1916; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 1917; MIPS32O0-NEXT: ll $2, 0($3) 1918; MIPS32O0-NEXT: bne $2, $5, $BB7_3 1919; MIPS32O0-NEXT: nop 1920; MIPS32O0-NEXT: # %bb.2: # %entry 1921; MIPS32O0-NEXT: # in Loop: Header=BB7_1 Depth=1 1922; MIPS32O0-NEXT: move $1, $6 1923; MIPS32O0-NEXT: sc $1, 0($3) 1924; MIPS32O0-NEXT: beqz $1, $BB7_1 1925; MIPS32O0-NEXT: nop 1926; MIPS32O0-NEXT: $BB7_3: # %entry 1927; MIPS32O0-NEXT: xor $1, $2, $4 1928; MIPS32O0-NEXT: sltiu $1, $1, 1 1929; MIPS32O0-NEXT: addiu $sp, $sp, 8 1930; MIPS32O0-NEXT: jr $ra 1931; MIPS32O0-NEXT: nop 1932; 1933; MIPS32R2-LABEL: AtomicCmpSwap32: 1934; MIPS32R2: # %bb.0: # %entry 1935; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 1936; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 1937; MIPS32R2-NEXT: addiu $sp, $sp, -8 1938; MIPS32R2-NEXT: addu $1, $2, $25 1939; MIPS32R2-NEXT: sw $5, 4($sp) 1940; MIPS32R2-NEXT: lw $1, %got(x)($1) 1941; MIPS32R2-NEXT: $BB7_1: # %entry 1942; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 1943; MIPS32R2-NEXT: ll $2, 0($1) 1944; MIPS32R2-NEXT: bne $2, $4, $BB7_3 1945; MIPS32R2-NEXT: nop 1946; MIPS32R2-NEXT: # %bb.2: # %entry 1947; MIPS32R2-NEXT: # in Loop: Header=BB7_1 Depth=1 1948; MIPS32R2-NEXT: move $3, $5 1949; MIPS32R2-NEXT: sc $3, 0($1) 1950; MIPS32R2-NEXT: beqz $3, $BB7_1 1951; MIPS32R2-NEXT: nop 1952; MIPS32R2-NEXT: $BB7_3: # %entry 1953; MIPS32R2-NEXT: jr $ra 1954; MIPS32R2-NEXT: addiu $sp, $sp, 8 1955; 1956; MIPS32R6-LABEL: AtomicCmpSwap32: 1957; MIPS32R6: # %bb.0: # %entry 1958; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 1959; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 1960; MIPS32R6-NEXT: addiu $sp, $sp, -8 1961; MIPS32R6-NEXT: addu $1, $2, $25 1962; MIPS32R6-NEXT: sw $5, 4($sp) 1963; MIPS32R6-NEXT: lw $1, %got(x)($1) 1964; MIPS32R6-NEXT: $BB7_1: # %entry 1965; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 1966; MIPS32R6-NEXT: ll $2, 0($1) 1967; MIPS32R6-NEXT: bnec $2, $4, $BB7_3 1968; MIPS32R6-NEXT: # %bb.2: # %entry 1969; MIPS32R6-NEXT: # in Loop: Header=BB7_1 Depth=1 1970; MIPS32R6-NEXT: move $3, $5 1971; MIPS32R6-NEXT: sc $3, 0($1) 1972; MIPS32R6-NEXT: beqzc $3, $BB7_1 1973; MIPS32R6-NEXT: nop 1974; MIPS32R6-NEXT: $BB7_3: # %entry 1975; MIPS32R6-NEXT: jr $ra 1976; MIPS32R6-NEXT: addiu $sp, $sp, 8 1977; 1978; MIPS32R6O0-LABEL: AtomicCmpSwap32: 1979; MIPS32R6O0: # %bb.0: # %entry 1980; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 1981; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 1982; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 1983; MIPS32R6O0-NEXT: addu $1, $2, $25 1984; MIPS32R6O0-NEXT: sw $5, 4($sp) 1985; MIPS32R6O0-NEXT: lw $5, 4($sp) 1986; MIPS32R6O0-NEXT: lw $3, %got(x)($1) 1987; MIPS32R6O0-NEXT: $BB7_1: # %entry 1988; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1989; MIPS32R6O0-NEXT: ll $2, 0($3) 1990; MIPS32R6O0-NEXT: bnec $2, $4, $BB7_3 1991; MIPS32R6O0-NEXT: # %bb.2: # %entry 1992; MIPS32R6O0-NEXT: # in Loop: Header=BB7_1 Depth=1 1993; MIPS32R6O0-NEXT: move $1, $5 1994; MIPS32R6O0-NEXT: sc $1, 0($3) 1995; MIPS32R6O0-NEXT: beqzc $1, $BB7_1 1996; MIPS32R6O0-NEXT: $BB7_3: # %entry 1997; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 1998; MIPS32R6O0-NEXT: jrc $ra 1999; 2000; MIPS4-LABEL: AtomicCmpSwap32: 2001; MIPS4: # %bb.0: # %entry 2002; MIPS4-NEXT: daddiu $sp, $sp, -16 2003; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2004; MIPS4-NEXT: daddu $1, $1, $25 2005; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2006; MIPS4-NEXT: sw $5, 12($sp) 2007; MIPS4-NEXT: ld $1, %got_disp(x)($1) 2008; MIPS4-NEXT: .LBB7_1: # %entry 2009; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 2010; MIPS4-NEXT: ll $2, 0($1) 2011; MIPS4-NEXT: bne $2, $4, .LBB7_3 2012; MIPS4-NEXT: nop 2013; MIPS4-NEXT: # %bb.2: # %entry 2014; MIPS4-NEXT: # in Loop: Header=BB7_1 Depth=1 2015; MIPS4-NEXT: move $3, $5 2016; MIPS4-NEXT: sc $3, 0($1) 2017; MIPS4-NEXT: beqz $3, .LBB7_1 2018; MIPS4-NEXT: nop 2019; MIPS4-NEXT: .LBB7_3: # %entry 2020; MIPS4-NEXT: jr $ra 2021; MIPS4-NEXT: daddiu $sp, $sp, 16 2022; 2023; MIPS64-LABEL: AtomicCmpSwap32: 2024; MIPS64: # %bb.0: # %entry 2025; MIPS64-NEXT: daddiu $sp, $sp, -16 2026; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2027; MIPS64-NEXT: daddu $1, $1, $25 2028; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2029; MIPS64-NEXT: sw $5, 12($sp) 2030; MIPS64-NEXT: ld $1, %got_disp(x)($1) 2031; MIPS64-NEXT: .LBB7_1: # %entry 2032; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 2033; MIPS64-NEXT: ll $2, 0($1) 2034; MIPS64-NEXT: bne $2, $4, .LBB7_3 2035; MIPS64-NEXT: nop 2036; MIPS64-NEXT: # %bb.2: # %entry 2037; MIPS64-NEXT: # in Loop: Header=BB7_1 Depth=1 2038; MIPS64-NEXT: move $3, $5 2039; MIPS64-NEXT: sc $3, 0($1) 2040; MIPS64-NEXT: beqz $3, .LBB7_1 2041; MIPS64-NEXT: nop 2042; MIPS64-NEXT: .LBB7_3: # %entry 2043; MIPS64-NEXT: jr $ra 2044; MIPS64-NEXT: daddiu $sp, $sp, 16 2045; 2046; MIPS64R2-LABEL: AtomicCmpSwap32: 2047; MIPS64R2: # %bb.0: # %entry 2048; MIPS64R2-NEXT: daddiu $sp, $sp, -16 2049; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2050; MIPS64R2-NEXT: daddu $1, $1, $25 2051; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2052; MIPS64R2-NEXT: sw $5, 12($sp) 2053; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 2054; MIPS64R2-NEXT: .LBB7_1: # %entry 2055; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 2056; MIPS64R2-NEXT: ll $2, 0($1) 2057; MIPS64R2-NEXT: bne $2, $4, .LBB7_3 2058; MIPS64R2-NEXT: nop 2059; MIPS64R2-NEXT: # %bb.2: # %entry 2060; MIPS64R2-NEXT: # in Loop: Header=BB7_1 Depth=1 2061; MIPS64R2-NEXT: move $3, $5 2062; MIPS64R2-NEXT: sc $3, 0($1) 2063; MIPS64R2-NEXT: beqz $3, .LBB7_1 2064; MIPS64R2-NEXT: nop 2065; MIPS64R2-NEXT: .LBB7_3: # %entry 2066; MIPS64R2-NEXT: jr $ra 2067; MIPS64R2-NEXT: daddiu $sp, $sp, 16 2068; 2069; MIPS64R6-LABEL: AtomicCmpSwap32: 2070; MIPS64R6: # %bb.0: # %entry 2071; MIPS64R6-NEXT: daddiu $sp, $sp, -16 2072; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2073; MIPS64R6-NEXT: daddu $1, $1, $25 2074; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2075; MIPS64R6-NEXT: sw $5, 12($sp) 2076; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 2077; MIPS64R6-NEXT: .LBB7_1: # %entry 2078; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 2079; MIPS64R6-NEXT: ll $2, 0($1) 2080; MIPS64R6-NEXT: bnec $2, $4, .LBB7_3 2081; MIPS64R6-NEXT: # %bb.2: # %entry 2082; MIPS64R6-NEXT: # in Loop: Header=BB7_1 Depth=1 2083; MIPS64R6-NEXT: move $3, $5 2084; MIPS64R6-NEXT: sc $3, 0($1) 2085; MIPS64R6-NEXT: beqzc $3, .LBB7_1 2086; MIPS64R6-NEXT: nop 2087; MIPS64R6-NEXT: .LBB7_3: # %entry 2088; MIPS64R6-NEXT: jr $ra 2089; MIPS64R6-NEXT: daddiu $sp, $sp, 16 2090; 2091; MIPS64R6O0-LABEL: AtomicCmpSwap32: 2092; MIPS64R6O0: # %bb.0: # %entry 2093; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 2094; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32))) 2095; MIPS64R6O0-NEXT: daddu $1, $1, $25 2096; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32))) 2097; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 2098; MIPS64R6O0-NEXT: move $2, $5 2099; MIPS64R6O0-NEXT: sw $2, 12($sp) 2100; MIPS64R6O0-NEXT: lw $5, 12($sp) 2101; MIPS64R6O0-NEXT: ld $3, %got_disp(x)($1) 2102; MIPS64R6O0-NEXT: .LBB7_1: # %entry 2103; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2104; MIPS64R6O0-NEXT: ll $2, 0($3) 2105; MIPS64R6O0-NEXT: bnec $2, $4, .LBB7_3 2106; MIPS64R6O0-NEXT: # %bb.2: # %entry 2107; MIPS64R6O0-NEXT: # in Loop: Header=BB7_1 Depth=1 2108; MIPS64R6O0-NEXT: move $1, $5 2109; MIPS64R6O0-NEXT: sc $1, 0($3) 2110; MIPS64R6O0-NEXT: beqzc $1, .LBB7_1 2111; MIPS64R6O0-NEXT: .LBB7_3: # %entry 2112; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 2113; MIPS64R6O0-NEXT: jrc $ra 2114; 2115; MM32-LABEL: AtomicCmpSwap32: 2116; MM32: # %bb.0: # %entry 2117; MM32-NEXT: lui $2, %hi(_gp_disp) 2118; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 2119; MM32-NEXT: addiu $sp, $sp, -8 2120; MM32-NEXT: addu $2, $2, $25 2121; MM32-NEXT: sw $5, 4($sp) 2122; MM32-NEXT: lw $1, %got(x)($2) 2123; MM32-NEXT: $BB7_1: # %entry 2124; MM32-NEXT: # =>This Inner Loop Header: Depth=1 2125; MM32-NEXT: ll $2, 0($1) 2126; MM32-NEXT: bne $2, $4, $BB7_3 2127; MM32-NEXT: nop 2128; MM32-NEXT: # %bb.2: # %entry 2129; MM32-NEXT: # in Loop: Header=BB7_1 Depth=1 2130; MM32-NEXT: move $3, $5 2131; MM32-NEXT: sc $3, 0($1) 2132; MM32-NEXT: beqzc $3, $BB7_1 2133; MM32-NEXT: $BB7_3: # %entry 2134; MM32-NEXT: addiusp 8 2135; MM32-NEXT: jrc $ra 2136; 2137; O1-LABEL: AtomicCmpSwap32: 2138; O1: # %bb.0: # %entry 2139; O1-NEXT: lui $2, %hi(_gp_disp) 2140; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 2141; O1-NEXT: addiu $sp, $sp, -8 2142; O1-NEXT: addu $1, $2, $25 2143; O1-NEXT: sw $5, 4($sp) 2144; O1-NEXT: lw $1, %got(x)($1) 2145; O1-NEXT: $BB7_1: # %entry 2146; O1-NEXT: # =>This Inner Loop Header: Depth=1 2147; O1-NEXT: ll $2, 0($1) 2148; O1-NEXT: bne $2, $4, $BB7_3 2149; O1-NEXT: nop 2150; O1-NEXT: # %bb.2: # %entry 2151; O1-NEXT: # in Loop: Header=BB7_1 Depth=1 2152; O1-NEXT: move $3, $5 2153; O1-NEXT: sc $3, 0($1) 2154; O1-NEXT: beqz $3, $BB7_1 2155; O1-NEXT: nop 2156; O1-NEXT: $BB7_3: # %entry 2157; O1-NEXT: jr $ra 2158; O1-NEXT: addiu $sp, $sp, 8 2159; 2160; O2-LABEL: AtomicCmpSwap32: 2161; O2: # %bb.0: # %entry 2162; O2-NEXT: lui $2, %hi(_gp_disp) 2163; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 2164; O2-NEXT: addiu $sp, $sp, -8 2165; O2-NEXT: addu $1, $2, $25 2166; O2-NEXT: sw $5, 4($sp) 2167; O2-NEXT: lw $1, %got(x)($1) 2168; O2-NEXT: $BB7_1: # %entry 2169; O2-NEXT: # =>This Inner Loop Header: Depth=1 2170; O2-NEXT: ll $2, 0($1) 2171; O2-NEXT: bne $2, $4, $BB7_3 2172; O2-NEXT: nop 2173; O2-NEXT: # %bb.2: # %entry 2174; O2-NEXT: # in Loop: Header=BB7_1 Depth=1 2175; O2-NEXT: move $3, $5 2176; O2-NEXT: sc $3, 0($1) 2177; O2-NEXT: beqz $3, $BB7_1 2178; O2-NEXT: nop 2179; O2-NEXT: $BB7_3: # %entry 2180; O2-NEXT: jr $ra 2181; O2-NEXT: addiu $sp, $sp, 8 2182; 2183; O3-LABEL: AtomicCmpSwap32: 2184; O3: # %bb.0: # %entry 2185; O3-NEXT: lui $2, %hi(_gp_disp) 2186; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 2187; O3-NEXT: addiu $sp, $sp, -8 2188; O3-NEXT: addu $1, $2, $25 2189; O3-NEXT: sw $5, 4($sp) 2190; O3-NEXT: lw $1, %got(x)($1) 2191; O3-NEXT: $BB7_1: # %entry 2192; O3-NEXT: # =>This Inner Loop Header: Depth=1 2193; O3-NEXT: ll $2, 0($1) 2194; O3-NEXT: bne $2, $4, $BB7_3 2195; O3-NEXT: nop 2196; O3-NEXT: # %bb.2: # %entry 2197; O3-NEXT: # in Loop: Header=BB7_1 Depth=1 2198; O3-NEXT: move $3, $5 2199; O3-NEXT: sc $3, 0($1) 2200; O3-NEXT: beqz $3, $BB7_1 2201; O3-NEXT: nop 2202; O3-NEXT: $BB7_3: # %entry 2203; O3-NEXT: jr $ra 2204; O3-NEXT: addiu $sp, $sp, 8 2205; 2206; MIPS32EB-LABEL: AtomicCmpSwap32: 2207; MIPS32EB: # %bb.0: # %entry 2208; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 2209; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 2210; MIPS32EB-NEXT: addiu $sp, $sp, -8 2211; MIPS32EB-NEXT: addu $1, $2, $25 2212; MIPS32EB-NEXT: sw $5, 4($sp) 2213; MIPS32EB-NEXT: lw $1, %got(x)($1) 2214; MIPS32EB-NEXT: $BB7_1: # %entry 2215; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 2216; MIPS32EB-NEXT: ll $2, 0($1) 2217; MIPS32EB-NEXT: bne $2, $4, $BB7_3 2218; MIPS32EB-NEXT: nop 2219; MIPS32EB-NEXT: # %bb.2: # %entry 2220; MIPS32EB-NEXT: # in Loop: Header=BB7_1 Depth=1 2221; MIPS32EB-NEXT: move $3, $5 2222; MIPS32EB-NEXT: sc $3, 0($1) 2223; MIPS32EB-NEXT: beqz $3, $BB7_1 2224; MIPS32EB-NEXT: nop 2225; MIPS32EB-NEXT: $BB7_3: # %entry 2226; MIPS32EB-NEXT: jr $ra 2227; MIPS32EB-NEXT: addiu $sp, $sp, 8 2228entry: 2229 %newval.addr = alloca i32, align 4 2230 store i32 %newval, ptr %newval.addr, align 4 2231 %tmp = load i32, ptr %newval.addr, align 4 2232 %0 = cmpxchg ptr @x, i32 %oldval, i32 %tmp monotonic monotonic 2233 %1 = extractvalue { i32, i1 } %0, 0 2234 ret i32 %1 2235 2236} 2237 2238@y = common global i8 0, align 1 2239 2240define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind { 2241; MIPS32-LABEL: AtomicLoadAdd8: 2242; MIPS32: # %bb.0: # %entry 2243; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2244; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2245; MIPS32-NEXT: addu $1, $2, $25 2246; MIPS32-NEXT: lw $1, %got(y)($1) 2247; MIPS32-NEXT: addiu $2, $zero, -4 2248; MIPS32-NEXT: and $3, $1, $2 2249; MIPS32-NEXT: andi $1, $1, 3 2250; MIPS32-NEXT: sll $1, $1, 3 2251; MIPS32-NEXT: ori $2, $zero, 255 2252; MIPS32-NEXT: sllv $5, $2, $1 2253; MIPS32-NEXT: nor $6, $zero, $5 2254; MIPS32-NEXT: sllv $4, $4, $1 2255; MIPS32-NEXT: $BB8_1: # %entry 2256; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 2257; MIPS32-NEXT: ll $7, 0($3) 2258; MIPS32-NEXT: addu $8, $7, $4 2259; MIPS32-NEXT: and $8, $8, $5 2260; MIPS32-NEXT: and $9, $7, $6 2261; MIPS32-NEXT: or $9, $9, $8 2262; MIPS32-NEXT: sc $9, 0($3) 2263; MIPS32-NEXT: beqz $9, $BB8_1 2264; MIPS32-NEXT: nop 2265; MIPS32-NEXT: # %bb.2: # %entry 2266; MIPS32-NEXT: and $2, $7, $5 2267; MIPS32-NEXT: srlv $2, $2, $1 2268; MIPS32-NEXT: sll $2, $2, 24 2269; MIPS32-NEXT: sra $2, $2, 24 2270; MIPS32-NEXT: # %bb.3: # %entry 2271; MIPS32-NEXT: jr $ra 2272; MIPS32-NEXT: nop 2273; 2274; MIPS32O0-LABEL: AtomicLoadAdd8: 2275; MIPS32O0: # %bb.0: # %entry 2276; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 2277; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2278; MIPS32O0-NEXT: addiu $sp, $sp, -8 2279; MIPS32O0-NEXT: addu $1, $2, $25 2280; MIPS32O0-NEXT: lw $1, %got(y)($1) 2281; MIPS32O0-NEXT: addiu $2, $zero, -4 2282; MIPS32O0-NEXT: and $5, $1, $2 2283; MIPS32O0-NEXT: andi $1, $1, 3 2284; MIPS32O0-NEXT: sll $9, $1, 3 2285; MIPS32O0-NEXT: ori $1, $zero, 255 2286; MIPS32O0-NEXT: sllv $7, $1, $9 2287; MIPS32O0-NEXT: nor $8, $zero, $7 2288; MIPS32O0-NEXT: sllv $6, $4, $9 2289; MIPS32O0-NEXT: $BB8_1: # %entry 2290; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 2291; MIPS32O0-NEXT: ll $2, 0($5) 2292; MIPS32O0-NEXT: addu $3, $2, $6 2293; MIPS32O0-NEXT: and $3, $3, $7 2294; MIPS32O0-NEXT: and $4, $2, $8 2295; MIPS32O0-NEXT: or $4, $4, $3 2296; MIPS32O0-NEXT: sc $4, 0($5) 2297; MIPS32O0-NEXT: beqz $4, $BB8_1 2298; MIPS32O0-NEXT: nop 2299; MIPS32O0-NEXT: # %bb.2: # %entry 2300; MIPS32O0-NEXT: and $1, $2, $7 2301; MIPS32O0-NEXT: srlv $1, $1, $9 2302; MIPS32O0-NEXT: sll $1, $1, 24 2303; MIPS32O0-NEXT: sra $1, $1, 24 2304; MIPS32O0-NEXT: # %bb.3: # %entry 2305; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 2306; MIPS32O0-NEXT: # %bb.4: # %entry 2307; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 2308; MIPS32O0-NEXT: sll $1, $1, 24 2309; MIPS32O0-NEXT: sra $2, $1, 24 2310; MIPS32O0-NEXT: addiu $sp, $sp, 8 2311; MIPS32O0-NEXT: jr $ra 2312; MIPS32O0-NEXT: nop 2313; 2314; MIPS32R2-LABEL: AtomicLoadAdd8: 2315; MIPS32R2: # %bb.0: # %entry 2316; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 2317; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 2318; MIPS32R2-NEXT: addu $1, $2, $25 2319; MIPS32R2-NEXT: lw $1, %got(y)($1) 2320; MIPS32R2-NEXT: addiu $2, $zero, -4 2321; MIPS32R2-NEXT: and $3, $1, $2 2322; MIPS32R2-NEXT: andi $1, $1, 3 2323; MIPS32R2-NEXT: sll $1, $1, 3 2324; MIPS32R2-NEXT: ori $2, $zero, 255 2325; MIPS32R2-NEXT: sllv $5, $2, $1 2326; MIPS32R2-NEXT: nor $6, $zero, $5 2327; MIPS32R2-NEXT: sllv $4, $4, $1 2328; MIPS32R2-NEXT: $BB8_1: # %entry 2329; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 2330; MIPS32R2-NEXT: ll $7, 0($3) 2331; MIPS32R2-NEXT: addu $8, $7, $4 2332; MIPS32R2-NEXT: and $8, $8, $5 2333; MIPS32R2-NEXT: and $9, $7, $6 2334; MIPS32R2-NEXT: or $9, $9, $8 2335; MIPS32R2-NEXT: sc $9, 0($3) 2336; MIPS32R2-NEXT: beqz $9, $BB8_1 2337; MIPS32R2-NEXT: nop 2338; MIPS32R2-NEXT: # %bb.2: # %entry 2339; MIPS32R2-NEXT: and $2, $7, $5 2340; MIPS32R2-NEXT: srlv $2, $2, $1 2341; MIPS32R2-NEXT: seb $2, $2 2342; MIPS32R2-NEXT: # %bb.3: # %entry 2343; MIPS32R2-NEXT: jr $ra 2344; MIPS32R2-NEXT: nop 2345; 2346; MIPS32R6-LABEL: AtomicLoadAdd8: 2347; MIPS32R6: # %bb.0: # %entry 2348; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 2349; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 2350; MIPS32R6-NEXT: addu $1, $2, $25 2351; MIPS32R6-NEXT: lw $1, %got(y)($1) 2352; MIPS32R6-NEXT: addiu $2, $zero, -4 2353; MIPS32R6-NEXT: and $3, $1, $2 2354; MIPS32R6-NEXT: andi $1, $1, 3 2355; MIPS32R6-NEXT: sll $1, $1, 3 2356; MIPS32R6-NEXT: ori $2, $zero, 255 2357; MIPS32R6-NEXT: sllv $5, $2, $1 2358; MIPS32R6-NEXT: nor $6, $zero, $5 2359; MIPS32R6-NEXT: sllv $4, $4, $1 2360; MIPS32R6-NEXT: $BB8_1: # %entry 2361; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 2362; MIPS32R6-NEXT: ll $7, 0($3) 2363; MIPS32R6-NEXT: addu $8, $7, $4 2364; MIPS32R6-NEXT: and $8, $8, $5 2365; MIPS32R6-NEXT: and $9, $7, $6 2366; MIPS32R6-NEXT: or $9, $9, $8 2367; MIPS32R6-NEXT: sc $9, 0($3) 2368; MIPS32R6-NEXT: beqzc $9, $BB8_1 2369; MIPS32R6-NEXT: # %bb.2: # %entry 2370; MIPS32R6-NEXT: and $2, $7, $5 2371; MIPS32R6-NEXT: srlv $2, $2, $1 2372; MIPS32R6-NEXT: seb $2, $2 2373; MIPS32R6-NEXT: # %bb.3: # %entry 2374; MIPS32R6-NEXT: jrc $ra 2375; 2376; MIPS32R6O0-LABEL: AtomicLoadAdd8: 2377; MIPS32R6O0: # %bb.0: # %entry 2378; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 2379; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2380; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 2381; MIPS32R6O0-NEXT: addu $1, $2, $25 2382; MIPS32R6O0-NEXT: # kill: def $v0 killed $a0 2383; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 2384; MIPS32R6O0-NEXT: addiu $2, $zero, -4 2385; MIPS32R6O0-NEXT: and $5, $1, $2 2386; MIPS32R6O0-NEXT: andi $1, $1, 3 2387; MIPS32R6O0-NEXT: sll $9, $1, 3 2388; MIPS32R6O0-NEXT: ori $1, $zero, 255 2389; MIPS32R6O0-NEXT: sllv $7, $1, $9 2390; MIPS32R6O0-NEXT: nor $8, $zero, $7 2391; MIPS32R6O0-NEXT: sllv $6, $4, $9 2392; MIPS32R6O0-NEXT: $BB8_1: # %entry 2393; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2394; MIPS32R6O0-NEXT: ll $2, 0($5) 2395; MIPS32R6O0-NEXT: addu $3, $2, $6 2396; MIPS32R6O0-NEXT: and $3, $3, $7 2397; MIPS32R6O0-NEXT: and $4, $2, $8 2398; MIPS32R6O0-NEXT: or $4, $4, $3 2399; MIPS32R6O0-NEXT: sc $4, 0($5) 2400; MIPS32R6O0-NEXT: beqzc $4, $BB8_1 2401; MIPS32R6O0-NEXT: # %bb.2: # %entry 2402; MIPS32R6O0-NEXT: and $1, $2, $7 2403; MIPS32R6O0-NEXT: srlv $1, $1, $9 2404; MIPS32R6O0-NEXT: seb $1, $1 2405; MIPS32R6O0-NEXT: # %bb.3: # %entry 2406; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 2407; MIPS32R6O0-NEXT: # %bb.4: # %entry 2408; MIPS32R6O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 2409; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 2410; MIPS32R6O0-NEXT: jrc $ra 2411; 2412; MIPS4-LABEL: AtomicLoadAdd8: 2413; MIPS4: # %bb.0: # %entry 2414; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2415; MIPS4-NEXT: daddu $1, $1, $25 2416; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2417; MIPS4-NEXT: ld $1, %got_disp(y)($1) 2418; MIPS4-NEXT: daddiu $2, $zero, -4 2419; MIPS4-NEXT: and $3, $1, $2 2420; MIPS4-NEXT: andi $1, $1, 3 2421; MIPS4-NEXT: sll $1, $1, 3 2422; MIPS4-NEXT: ori $2, $zero, 255 2423; MIPS4-NEXT: sllv $5, $2, $1 2424; MIPS4-NEXT: nor $6, $zero, $5 2425; MIPS4-NEXT: sllv $4, $4, $1 2426; MIPS4-NEXT: .LBB8_1: # %entry 2427; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 2428; MIPS4-NEXT: ll $7, 0($3) 2429; MIPS4-NEXT: addu $8, $7, $4 2430; MIPS4-NEXT: and $8, $8, $5 2431; MIPS4-NEXT: and $9, $7, $6 2432; MIPS4-NEXT: or $9, $9, $8 2433; MIPS4-NEXT: sc $9, 0($3) 2434; MIPS4-NEXT: beqz $9, .LBB8_1 2435; MIPS4-NEXT: nop 2436; MIPS4-NEXT: # %bb.2: # %entry 2437; MIPS4-NEXT: and $2, $7, $5 2438; MIPS4-NEXT: srlv $2, $2, $1 2439; MIPS4-NEXT: sll $2, $2, 24 2440; MIPS4-NEXT: sra $2, $2, 24 2441; MIPS4-NEXT: # %bb.3: # %entry 2442; MIPS4-NEXT: jr $ra 2443; MIPS4-NEXT: nop 2444; 2445; MIPS64-LABEL: AtomicLoadAdd8: 2446; MIPS64: # %bb.0: # %entry 2447; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2448; MIPS64-NEXT: daddu $1, $1, $25 2449; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2450; MIPS64-NEXT: ld $1, %got_disp(y)($1) 2451; MIPS64-NEXT: daddiu $2, $zero, -4 2452; MIPS64-NEXT: and $3, $1, $2 2453; MIPS64-NEXT: andi $1, $1, 3 2454; MIPS64-NEXT: sll $1, $1, 3 2455; MIPS64-NEXT: ori $2, $zero, 255 2456; MIPS64-NEXT: sllv $5, $2, $1 2457; MIPS64-NEXT: nor $6, $zero, $5 2458; MIPS64-NEXT: sllv $4, $4, $1 2459; MIPS64-NEXT: .LBB8_1: # %entry 2460; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 2461; MIPS64-NEXT: ll $7, 0($3) 2462; MIPS64-NEXT: addu $8, $7, $4 2463; MIPS64-NEXT: and $8, $8, $5 2464; MIPS64-NEXT: and $9, $7, $6 2465; MIPS64-NEXT: or $9, $9, $8 2466; MIPS64-NEXT: sc $9, 0($3) 2467; MIPS64-NEXT: beqz $9, .LBB8_1 2468; MIPS64-NEXT: nop 2469; MIPS64-NEXT: # %bb.2: # %entry 2470; MIPS64-NEXT: and $2, $7, $5 2471; MIPS64-NEXT: srlv $2, $2, $1 2472; MIPS64-NEXT: sll $2, $2, 24 2473; MIPS64-NEXT: sra $2, $2, 24 2474; MIPS64-NEXT: # %bb.3: # %entry 2475; MIPS64-NEXT: jr $ra 2476; MIPS64-NEXT: nop 2477; 2478; MIPS64R2-LABEL: AtomicLoadAdd8: 2479; MIPS64R2: # %bb.0: # %entry 2480; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2481; MIPS64R2-NEXT: daddu $1, $1, $25 2482; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2483; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 2484; MIPS64R2-NEXT: daddiu $2, $zero, -4 2485; MIPS64R2-NEXT: and $3, $1, $2 2486; MIPS64R2-NEXT: andi $1, $1, 3 2487; MIPS64R2-NEXT: sll $1, $1, 3 2488; MIPS64R2-NEXT: ori $2, $zero, 255 2489; MIPS64R2-NEXT: sllv $5, $2, $1 2490; MIPS64R2-NEXT: nor $6, $zero, $5 2491; MIPS64R2-NEXT: sllv $4, $4, $1 2492; MIPS64R2-NEXT: .LBB8_1: # %entry 2493; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 2494; MIPS64R2-NEXT: ll $7, 0($3) 2495; MIPS64R2-NEXT: addu $8, $7, $4 2496; MIPS64R2-NEXT: and $8, $8, $5 2497; MIPS64R2-NEXT: and $9, $7, $6 2498; MIPS64R2-NEXT: or $9, $9, $8 2499; MIPS64R2-NEXT: sc $9, 0($3) 2500; MIPS64R2-NEXT: beqz $9, .LBB8_1 2501; MIPS64R2-NEXT: nop 2502; MIPS64R2-NEXT: # %bb.2: # %entry 2503; MIPS64R2-NEXT: and $2, $7, $5 2504; MIPS64R2-NEXT: srlv $2, $2, $1 2505; MIPS64R2-NEXT: seb $2, $2 2506; MIPS64R2-NEXT: # %bb.3: # %entry 2507; MIPS64R2-NEXT: jr $ra 2508; MIPS64R2-NEXT: nop 2509; 2510; MIPS64R6-LABEL: AtomicLoadAdd8: 2511; MIPS64R6: # %bb.0: # %entry 2512; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2513; MIPS64R6-NEXT: daddu $1, $1, $25 2514; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2515; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 2516; MIPS64R6-NEXT: daddiu $2, $zero, -4 2517; MIPS64R6-NEXT: and $3, $1, $2 2518; MIPS64R6-NEXT: andi $1, $1, 3 2519; MIPS64R6-NEXT: sll $1, $1, 3 2520; MIPS64R6-NEXT: ori $2, $zero, 255 2521; MIPS64R6-NEXT: sllv $5, $2, $1 2522; MIPS64R6-NEXT: nor $6, $zero, $5 2523; MIPS64R6-NEXT: sllv $4, $4, $1 2524; MIPS64R6-NEXT: .LBB8_1: # %entry 2525; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 2526; MIPS64R6-NEXT: ll $7, 0($3) 2527; MIPS64R6-NEXT: addu $8, $7, $4 2528; MIPS64R6-NEXT: and $8, $8, $5 2529; MIPS64R6-NEXT: and $9, $7, $6 2530; MIPS64R6-NEXT: or $9, $9, $8 2531; MIPS64R6-NEXT: sc $9, 0($3) 2532; MIPS64R6-NEXT: beqzc $9, .LBB8_1 2533; MIPS64R6-NEXT: # %bb.2: # %entry 2534; MIPS64R6-NEXT: and $2, $7, $5 2535; MIPS64R6-NEXT: srlv $2, $2, $1 2536; MIPS64R6-NEXT: seb $2, $2 2537; MIPS64R6-NEXT: # %bb.3: # %entry 2538; MIPS64R6-NEXT: jrc $ra 2539; 2540; MIPS64R6O0-LABEL: AtomicLoadAdd8: 2541; MIPS64R6O0: # %bb.0: # %entry 2542; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 2543; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8))) 2544; MIPS64R6O0-NEXT: daddu $1, $1, $25 2545; MIPS64R6O0-NEXT: daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8))) 2546; MIPS64R6O0-NEXT: move $1, $4 2547; MIPS64R6O0-NEXT: ld $2, %got_disp(y)($2) 2548; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 2549; MIPS64R6O0-NEXT: and $5, $2, $3 2550; MIPS64R6O0-NEXT: andi $2, $2, 3 2551; MIPS64R6O0-NEXT: xori $2, $2, 3 2552; MIPS64R6O0-NEXT: sll $9, $2, 3 2553; MIPS64R6O0-NEXT: ori $2, $zero, 255 2554; MIPS64R6O0-NEXT: sllv $7, $2, $9 2555; MIPS64R6O0-NEXT: nor $8, $zero, $7 2556; MIPS64R6O0-NEXT: sllv $6, $1, $9 2557; MIPS64R6O0-NEXT: .LBB8_1: # %entry 2558; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2559; MIPS64R6O0-NEXT: ll $2, 0($5) 2560; MIPS64R6O0-NEXT: addu $3, $2, $6 2561; MIPS64R6O0-NEXT: and $3, $3, $7 2562; MIPS64R6O0-NEXT: and $4, $2, $8 2563; MIPS64R6O0-NEXT: or $4, $4, $3 2564; MIPS64R6O0-NEXT: sc $4, 0($5) 2565; MIPS64R6O0-NEXT: beqzc $4, .LBB8_1 2566; MIPS64R6O0-NEXT: # %bb.2: # %entry 2567; MIPS64R6O0-NEXT: and $1, $2, $7 2568; MIPS64R6O0-NEXT: srlv $1, $1, $9 2569; MIPS64R6O0-NEXT: seb $1, $1 2570; MIPS64R6O0-NEXT: # %bb.3: # %entry 2571; MIPS64R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 2572; MIPS64R6O0-NEXT: # %bb.4: # %entry 2573; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 2574; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 2575; MIPS64R6O0-NEXT: jrc $ra 2576; 2577; MM32-LABEL: AtomicLoadAdd8: 2578; MM32: # %bb.0: # %entry 2579; MM32-NEXT: lui $2, %hi(_gp_disp) 2580; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 2581; MM32-NEXT: addu $2, $2, $25 2582; MM32-NEXT: lw $1, %got(y)($2) 2583; MM32-NEXT: addiu $2, $zero, -4 2584; MM32-NEXT: and $3, $1, $2 2585; MM32-NEXT: andi $1, $1, 3 2586; MM32-NEXT: sll $1, $1, 3 2587; MM32-NEXT: ori $2, $zero, 255 2588; MM32-NEXT: sllv $5, $2, $1 2589; MM32-NEXT: nor $6, $zero, $5 2590; MM32-NEXT: sllv $4, $4, $1 2591; MM32-NEXT: $BB8_1: # %entry 2592; MM32-NEXT: # =>This Inner Loop Header: Depth=1 2593; MM32-NEXT: ll $7, 0($3) 2594; MM32-NEXT: addu $8, $7, $4 2595; MM32-NEXT: and $8, $8, $5 2596; MM32-NEXT: and $9, $7, $6 2597; MM32-NEXT: or $9, $9, $8 2598; MM32-NEXT: sc $9, 0($3) 2599; MM32-NEXT: beqzc $9, $BB8_1 2600; MM32-NEXT: # %bb.2: # %entry 2601; MM32-NEXT: and $2, $7, $5 2602; MM32-NEXT: srlv $2, $2, $1 2603; MM32-NEXT: seb $2, $2 2604; MM32-NEXT: # %bb.3: # %entry 2605; MM32-NEXT: jrc $ra 2606; 2607; O1-LABEL: AtomicLoadAdd8: 2608; O1: # %bb.0: # %entry 2609; O1-NEXT: lui $2, %hi(_gp_disp) 2610; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 2611; O1-NEXT: addu $1, $2, $25 2612; O1-NEXT: lw $1, %got(y)($1) 2613; O1-NEXT: addiu $2, $zero, -4 2614; O1-NEXT: and $3, $1, $2 2615; O1-NEXT: andi $1, $1, 3 2616; O1-NEXT: sll $1, $1, 3 2617; O1-NEXT: ori $2, $zero, 255 2618; O1-NEXT: sllv $5, $2, $1 2619; O1-NEXT: nor $6, $zero, $5 2620; O1-NEXT: sllv $4, $4, $1 2621; O1-NEXT: $BB8_1: # %entry 2622; O1-NEXT: # =>This Inner Loop Header: Depth=1 2623; O1-NEXT: ll $7, 0($3) 2624; O1-NEXT: addu $8, $7, $4 2625; O1-NEXT: and $8, $8, $5 2626; O1-NEXT: and $9, $7, $6 2627; O1-NEXT: or $9, $9, $8 2628; O1-NEXT: sc $9, 0($3) 2629; O1-NEXT: beqz $9, $BB8_1 2630; O1-NEXT: nop 2631; O1-NEXT: # %bb.2: # %entry 2632; O1-NEXT: and $2, $7, $5 2633; O1-NEXT: srlv $2, $2, $1 2634; O1-NEXT: sll $2, $2, 24 2635; O1-NEXT: sra $2, $2, 24 2636; O1-NEXT: # %bb.3: # %entry 2637; O1-NEXT: jr $ra 2638; O1-NEXT: nop 2639; 2640; O2-LABEL: AtomicLoadAdd8: 2641; O2: # %bb.0: # %entry 2642; O2-NEXT: lui $2, %hi(_gp_disp) 2643; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 2644; O2-NEXT: addu $1, $2, $25 2645; O2-NEXT: lw $1, %got(y)($1) 2646; O2-NEXT: addiu $2, $zero, -4 2647; O2-NEXT: and $3, $1, $2 2648; O2-NEXT: andi $1, $1, 3 2649; O2-NEXT: sll $1, $1, 3 2650; O2-NEXT: ori $2, $zero, 255 2651; O2-NEXT: sllv $5, $2, $1 2652; O2-NEXT: nor $6, $zero, $5 2653; O2-NEXT: sllv $4, $4, $1 2654; O2-NEXT: $BB8_1: # %entry 2655; O2-NEXT: # =>This Inner Loop Header: Depth=1 2656; O2-NEXT: ll $7, 0($3) 2657; O2-NEXT: addu $8, $7, $4 2658; O2-NEXT: and $8, $8, $5 2659; O2-NEXT: and $9, $7, $6 2660; O2-NEXT: or $9, $9, $8 2661; O2-NEXT: sc $9, 0($3) 2662; O2-NEXT: beqz $9, $BB8_1 2663; O2-NEXT: nop 2664; O2-NEXT: # %bb.2: # %entry 2665; O2-NEXT: and $2, $7, $5 2666; O2-NEXT: srlv $2, $2, $1 2667; O2-NEXT: sll $2, $2, 24 2668; O2-NEXT: sra $2, $2, 24 2669; O2-NEXT: # %bb.3: # %entry 2670; O2-NEXT: jr $ra 2671; O2-NEXT: nop 2672; 2673; O3-LABEL: AtomicLoadAdd8: 2674; O3: # %bb.0: # %entry 2675; O3-NEXT: lui $2, %hi(_gp_disp) 2676; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 2677; O3-NEXT: addu $1, $2, $25 2678; O3-NEXT: addiu $2, $zero, -4 2679; O3-NEXT: lw $1, %got(y)($1) 2680; O3-NEXT: and $3, $1, $2 2681; O3-NEXT: andi $1, $1, 3 2682; O3-NEXT: ori $2, $zero, 255 2683; O3-NEXT: sll $1, $1, 3 2684; O3-NEXT: sllv $5, $2, $1 2685; O3-NEXT: sllv $4, $4, $1 2686; O3-NEXT: nor $6, $zero, $5 2687; O3-NEXT: $BB8_1: # %entry 2688; O3-NEXT: # =>This Inner Loop Header: Depth=1 2689; O3-NEXT: ll $7, 0($3) 2690; O3-NEXT: addu $8, $7, $4 2691; O3-NEXT: and $8, $8, $5 2692; O3-NEXT: and $9, $7, $6 2693; O3-NEXT: or $9, $9, $8 2694; O3-NEXT: sc $9, 0($3) 2695; O3-NEXT: beqz $9, $BB8_1 2696; O3-NEXT: nop 2697; O3-NEXT: # %bb.2: # %entry 2698; O3-NEXT: and $2, $7, $5 2699; O3-NEXT: srlv $2, $2, $1 2700; O3-NEXT: sll $2, $2, 24 2701; O3-NEXT: sra $2, $2, 24 2702; O3-NEXT: # %bb.3: # %entry 2703; O3-NEXT: jr $ra 2704; O3-NEXT: nop 2705; 2706; MIPS32EB-LABEL: AtomicLoadAdd8: 2707; MIPS32EB: # %bb.0: # %entry 2708; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 2709; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 2710; MIPS32EB-NEXT: addu $1, $2, $25 2711; MIPS32EB-NEXT: lw $1, %got(y)($1) 2712; MIPS32EB-NEXT: addiu $2, $zero, -4 2713; MIPS32EB-NEXT: and $3, $1, $2 2714; MIPS32EB-NEXT: andi $1, $1, 3 2715; MIPS32EB-NEXT: xori $1, $1, 3 2716; MIPS32EB-NEXT: sll $1, $1, 3 2717; MIPS32EB-NEXT: ori $2, $zero, 255 2718; MIPS32EB-NEXT: sllv $5, $2, $1 2719; MIPS32EB-NEXT: nor $6, $zero, $5 2720; MIPS32EB-NEXT: sllv $4, $4, $1 2721; MIPS32EB-NEXT: $BB8_1: # %entry 2722; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 2723; MIPS32EB-NEXT: ll $7, 0($3) 2724; MIPS32EB-NEXT: addu $8, $7, $4 2725; MIPS32EB-NEXT: and $8, $8, $5 2726; MIPS32EB-NEXT: and $9, $7, $6 2727; MIPS32EB-NEXT: or $9, $9, $8 2728; MIPS32EB-NEXT: sc $9, 0($3) 2729; MIPS32EB-NEXT: beqz $9, $BB8_1 2730; MIPS32EB-NEXT: nop 2731; MIPS32EB-NEXT: # %bb.2: # %entry 2732; MIPS32EB-NEXT: and $2, $7, $5 2733; MIPS32EB-NEXT: srlv $2, $2, $1 2734; MIPS32EB-NEXT: sll $2, $2, 24 2735; MIPS32EB-NEXT: sra $2, $2, 24 2736; MIPS32EB-NEXT: # %bb.3: # %entry 2737; MIPS32EB-NEXT: jr $ra 2738; MIPS32EB-NEXT: nop 2739entry: 2740 %0 = atomicrmw add ptr @y, i8 %incr monotonic 2741 ret i8 %0 2742} 2743 2744define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind { 2745; MIPS32-LABEL: AtomicLoadSub8: 2746; MIPS32: # %bb.0: # %entry 2747; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2748; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2749; MIPS32-NEXT: addu $1, $2, $25 2750; MIPS32-NEXT: lw $1, %got(y)($1) 2751; MIPS32-NEXT: addiu $2, $zero, -4 2752; MIPS32-NEXT: and $3, $1, $2 2753; MIPS32-NEXT: andi $1, $1, 3 2754; MIPS32-NEXT: sll $1, $1, 3 2755; MIPS32-NEXT: ori $2, $zero, 255 2756; MIPS32-NEXT: sllv $5, $2, $1 2757; MIPS32-NEXT: nor $6, $zero, $5 2758; MIPS32-NEXT: sllv $4, $4, $1 2759; MIPS32-NEXT: $BB9_1: # %entry 2760; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 2761; MIPS32-NEXT: ll $7, 0($3) 2762; MIPS32-NEXT: subu $8, $7, $4 2763; MIPS32-NEXT: and $8, $8, $5 2764; MIPS32-NEXT: and $9, $7, $6 2765; MIPS32-NEXT: or $9, $9, $8 2766; MIPS32-NEXT: sc $9, 0($3) 2767; MIPS32-NEXT: beqz $9, $BB9_1 2768; MIPS32-NEXT: nop 2769; MIPS32-NEXT: # %bb.2: # %entry 2770; MIPS32-NEXT: and $2, $7, $5 2771; MIPS32-NEXT: srlv $2, $2, $1 2772; MIPS32-NEXT: sll $2, $2, 24 2773; MIPS32-NEXT: sra $2, $2, 24 2774; MIPS32-NEXT: # %bb.3: # %entry 2775; MIPS32-NEXT: jr $ra 2776; MIPS32-NEXT: nop 2777; 2778; MIPS32O0-LABEL: AtomicLoadSub8: 2779; MIPS32O0: # %bb.0: # %entry 2780; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 2781; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2782; MIPS32O0-NEXT: addiu $sp, $sp, -8 2783; MIPS32O0-NEXT: addu $1, $2, $25 2784; MIPS32O0-NEXT: lw $1, %got(y)($1) 2785; MIPS32O0-NEXT: addiu $2, $zero, -4 2786; MIPS32O0-NEXT: and $5, $1, $2 2787; MIPS32O0-NEXT: andi $1, $1, 3 2788; MIPS32O0-NEXT: sll $9, $1, 3 2789; MIPS32O0-NEXT: ori $1, $zero, 255 2790; MIPS32O0-NEXT: sllv $7, $1, $9 2791; MIPS32O0-NEXT: nor $8, $zero, $7 2792; MIPS32O0-NEXT: sllv $6, $4, $9 2793; MIPS32O0-NEXT: $BB9_1: # %entry 2794; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 2795; MIPS32O0-NEXT: ll $2, 0($5) 2796; MIPS32O0-NEXT: subu $3, $2, $6 2797; MIPS32O0-NEXT: and $3, $3, $7 2798; MIPS32O0-NEXT: and $4, $2, $8 2799; MIPS32O0-NEXT: or $4, $4, $3 2800; MIPS32O0-NEXT: sc $4, 0($5) 2801; MIPS32O0-NEXT: beqz $4, $BB9_1 2802; MIPS32O0-NEXT: nop 2803; MIPS32O0-NEXT: # %bb.2: # %entry 2804; MIPS32O0-NEXT: and $1, $2, $7 2805; MIPS32O0-NEXT: srlv $1, $1, $9 2806; MIPS32O0-NEXT: sll $1, $1, 24 2807; MIPS32O0-NEXT: sra $1, $1, 24 2808; MIPS32O0-NEXT: # %bb.3: # %entry 2809; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 2810; MIPS32O0-NEXT: # %bb.4: # %entry 2811; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 2812; MIPS32O0-NEXT: sll $1, $1, 24 2813; MIPS32O0-NEXT: sra $2, $1, 24 2814; MIPS32O0-NEXT: addiu $sp, $sp, 8 2815; MIPS32O0-NEXT: jr $ra 2816; MIPS32O0-NEXT: nop 2817; 2818; MIPS32R2-LABEL: AtomicLoadSub8: 2819; MIPS32R2: # %bb.0: # %entry 2820; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 2821; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 2822; MIPS32R2-NEXT: addu $1, $2, $25 2823; MIPS32R2-NEXT: lw $1, %got(y)($1) 2824; MIPS32R2-NEXT: addiu $2, $zero, -4 2825; MIPS32R2-NEXT: and $3, $1, $2 2826; MIPS32R2-NEXT: andi $1, $1, 3 2827; MIPS32R2-NEXT: sll $1, $1, 3 2828; MIPS32R2-NEXT: ori $2, $zero, 255 2829; MIPS32R2-NEXT: sllv $5, $2, $1 2830; MIPS32R2-NEXT: nor $6, $zero, $5 2831; MIPS32R2-NEXT: sllv $4, $4, $1 2832; MIPS32R2-NEXT: $BB9_1: # %entry 2833; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 2834; MIPS32R2-NEXT: ll $7, 0($3) 2835; MIPS32R2-NEXT: subu $8, $7, $4 2836; MIPS32R2-NEXT: and $8, $8, $5 2837; MIPS32R2-NEXT: and $9, $7, $6 2838; MIPS32R2-NEXT: or $9, $9, $8 2839; MIPS32R2-NEXT: sc $9, 0($3) 2840; MIPS32R2-NEXT: beqz $9, $BB9_1 2841; MIPS32R2-NEXT: nop 2842; MIPS32R2-NEXT: # %bb.2: # %entry 2843; MIPS32R2-NEXT: and $2, $7, $5 2844; MIPS32R2-NEXT: srlv $2, $2, $1 2845; MIPS32R2-NEXT: seb $2, $2 2846; MIPS32R2-NEXT: # %bb.3: # %entry 2847; MIPS32R2-NEXT: jr $ra 2848; MIPS32R2-NEXT: nop 2849; 2850; MIPS32R6-LABEL: AtomicLoadSub8: 2851; MIPS32R6: # %bb.0: # %entry 2852; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 2853; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 2854; MIPS32R6-NEXT: addu $1, $2, $25 2855; MIPS32R6-NEXT: lw $1, %got(y)($1) 2856; MIPS32R6-NEXT: addiu $2, $zero, -4 2857; MIPS32R6-NEXT: and $3, $1, $2 2858; MIPS32R6-NEXT: andi $1, $1, 3 2859; MIPS32R6-NEXT: sll $1, $1, 3 2860; MIPS32R6-NEXT: ori $2, $zero, 255 2861; MIPS32R6-NEXT: sllv $5, $2, $1 2862; MIPS32R6-NEXT: nor $6, $zero, $5 2863; MIPS32R6-NEXT: sllv $4, $4, $1 2864; MIPS32R6-NEXT: $BB9_1: # %entry 2865; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 2866; MIPS32R6-NEXT: ll $7, 0($3) 2867; MIPS32R6-NEXT: subu $8, $7, $4 2868; MIPS32R6-NEXT: and $8, $8, $5 2869; MIPS32R6-NEXT: and $9, $7, $6 2870; MIPS32R6-NEXT: or $9, $9, $8 2871; MIPS32R6-NEXT: sc $9, 0($3) 2872; MIPS32R6-NEXT: beqzc $9, $BB9_1 2873; MIPS32R6-NEXT: # %bb.2: # %entry 2874; MIPS32R6-NEXT: and $2, $7, $5 2875; MIPS32R6-NEXT: srlv $2, $2, $1 2876; MIPS32R6-NEXT: seb $2, $2 2877; MIPS32R6-NEXT: # %bb.3: # %entry 2878; MIPS32R6-NEXT: jrc $ra 2879; 2880; MIPS32R6O0-LABEL: AtomicLoadSub8: 2881; MIPS32R6O0: # %bb.0: # %entry 2882; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 2883; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 2884; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 2885; MIPS32R6O0-NEXT: addu $1, $2, $25 2886; MIPS32R6O0-NEXT: # kill: def $v0 killed $a0 2887; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 2888; MIPS32R6O0-NEXT: addiu $2, $zero, -4 2889; MIPS32R6O0-NEXT: and $5, $1, $2 2890; MIPS32R6O0-NEXT: andi $1, $1, 3 2891; MIPS32R6O0-NEXT: sll $9, $1, 3 2892; MIPS32R6O0-NEXT: ori $1, $zero, 255 2893; MIPS32R6O0-NEXT: sllv $7, $1, $9 2894; MIPS32R6O0-NEXT: nor $8, $zero, $7 2895; MIPS32R6O0-NEXT: sllv $6, $4, $9 2896; MIPS32R6O0-NEXT: $BB9_1: # %entry 2897; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 2898; MIPS32R6O0-NEXT: ll $2, 0($5) 2899; MIPS32R6O0-NEXT: subu $3, $2, $6 2900; MIPS32R6O0-NEXT: and $3, $3, $7 2901; MIPS32R6O0-NEXT: and $4, $2, $8 2902; MIPS32R6O0-NEXT: or $4, $4, $3 2903; MIPS32R6O0-NEXT: sc $4, 0($5) 2904; MIPS32R6O0-NEXT: beqzc $4, $BB9_1 2905; MIPS32R6O0-NEXT: # %bb.2: # %entry 2906; MIPS32R6O0-NEXT: and $1, $2, $7 2907; MIPS32R6O0-NEXT: srlv $1, $1, $9 2908; MIPS32R6O0-NEXT: seb $1, $1 2909; MIPS32R6O0-NEXT: # %bb.3: # %entry 2910; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 2911; MIPS32R6O0-NEXT: # %bb.4: # %entry 2912; MIPS32R6O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 2913; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 2914; MIPS32R6O0-NEXT: jrc $ra 2915; 2916; MIPS4-LABEL: AtomicLoadSub8: 2917; MIPS4: # %bb.0: # %entry 2918; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 2919; MIPS4-NEXT: daddu $1, $1, $25 2920; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 2921; MIPS4-NEXT: ld $1, %got_disp(y)($1) 2922; MIPS4-NEXT: daddiu $2, $zero, -4 2923; MIPS4-NEXT: and $3, $1, $2 2924; MIPS4-NEXT: andi $1, $1, 3 2925; MIPS4-NEXT: sll $1, $1, 3 2926; MIPS4-NEXT: ori $2, $zero, 255 2927; MIPS4-NEXT: sllv $5, $2, $1 2928; MIPS4-NEXT: nor $6, $zero, $5 2929; MIPS4-NEXT: sllv $4, $4, $1 2930; MIPS4-NEXT: .LBB9_1: # %entry 2931; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 2932; MIPS4-NEXT: ll $7, 0($3) 2933; MIPS4-NEXT: subu $8, $7, $4 2934; MIPS4-NEXT: and $8, $8, $5 2935; MIPS4-NEXT: and $9, $7, $6 2936; MIPS4-NEXT: or $9, $9, $8 2937; MIPS4-NEXT: sc $9, 0($3) 2938; MIPS4-NEXT: beqz $9, .LBB9_1 2939; MIPS4-NEXT: nop 2940; MIPS4-NEXT: # %bb.2: # %entry 2941; MIPS4-NEXT: and $2, $7, $5 2942; MIPS4-NEXT: srlv $2, $2, $1 2943; MIPS4-NEXT: sll $2, $2, 24 2944; MIPS4-NEXT: sra $2, $2, 24 2945; MIPS4-NEXT: # %bb.3: # %entry 2946; MIPS4-NEXT: jr $ra 2947; MIPS4-NEXT: nop 2948; 2949; MIPS64-LABEL: AtomicLoadSub8: 2950; MIPS64: # %bb.0: # %entry 2951; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 2952; MIPS64-NEXT: daddu $1, $1, $25 2953; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 2954; MIPS64-NEXT: ld $1, %got_disp(y)($1) 2955; MIPS64-NEXT: daddiu $2, $zero, -4 2956; MIPS64-NEXT: and $3, $1, $2 2957; MIPS64-NEXT: andi $1, $1, 3 2958; MIPS64-NEXT: sll $1, $1, 3 2959; MIPS64-NEXT: ori $2, $zero, 255 2960; MIPS64-NEXT: sllv $5, $2, $1 2961; MIPS64-NEXT: nor $6, $zero, $5 2962; MIPS64-NEXT: sllv $4, $4, $1 2963; MIPS64-NEXT: .LBB9_1: # %entry 2964; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 2965; MIPS64-NEXT: ll $7, 0($3) 2966; MIPS64-NEXT: subu $8, $7, $4 2967; MIPS64-NEXT: and $8, $8, $5 2968; MIPS64-NEXT: and $9, $7, $6 2969; MIPS64-NEXT: or $9, $9, $8 2970; MIPS64-NEXT: sc $9, 0($3) 2971; MIPS64-NEXT: beqz $9, .LBB9_1 2972; MIPS64-NEXT: nop 2973; MIPS64-NEXT: # %bb.2: # %entry 2974; MIPS64-NEXT: and $2, $7, $5 2975; MIPS64-NEXT: srlv $2, $2, $1 2976; MIPS64-NEXT: sll $2, $2, 24 2977; MIPS64-NEXT: sra $2, $2, 24 2978; MIPS64-NEXT: # %bb.3: # %entry 2979; MIPS64-NEXT: jr $ra 2980; MIPS64-NEXT: nop 2981; 2982; MIPS64R2-LABEL: AtomicLoadSub8: 2983; MIPS64R2: # %bb.0: # %entry 2984; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 2985; MIPS64R2-NEXT: daddu $1, $1, $25 2986; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 2987; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 2988; MIPS64R2-NEXT: daddiu $2, $zero, -4 2989; MIPS64R2-NEXT: and $3, $1, $2 2990; MIPS64R2-NEXT: andi $1, $1, 3 2991; MIPS64R2-NEXT: sll $1, $1, 3 2992; MIPS64R2-NEXT: ori $2, $zero, 255 2993; MIPS64R2-NEXT: sllv $5, $2, $1 2994; MIPS64R2-NEXT: nor $6, $zero, $5 2995; MIPS64R2-NEXT: sllv $4, $4, $1 2996; MIPS64R2-NEXT: .LBB9_1: # %entry 2997; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 2998; MIPS64R2-NEXT: ll $7, 0($3) 2999; MIPS64R2-NEXT: subu $8, $7, $4 3000; MIPS64R2-NEXT: and $8, $8, $5 3001; MIPS64R2-NEXT: and $9, $7, $6 3002; MIPS64R2-NEXT: or $9, $9, $8 3003; MIPS64R2-NEXT: sc $9, 0($3) 3004; MIPS64R2-NEXT: beqz $9, .LBB9_1 3005; MIPS64R2-NEXT: nop 3006; MIPS64R2-NEXT: # %bb.2: # %entry 3007; MIPS64R2-NEXT: and $2, $7, $5 3008; MIPS64R2-NEXT: srlv $2, $2, $1 3009; MIPS64R2-NEXT: seb $2, $2 3010; MIPS64R2-NEXT: # %bb.3: # %entry 3011; MIPS64R2-NEXT: jr $ra 3012; MIPS64R2-NEXT: nop 3013; 3014; MIPS64R6-LABEL: AtomicLoadSub8: 3015; MIPS64R6: # %bb.0: # %entry 3016; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3017; MIPS64R6-NEXT: daddu $1, $1, $25 3018; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3019; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 3020; MIPS64R6-NEXT: daddiu $2, $zero, -4 3021; MIPS64R6-NEXT: and $3, $1, $2 3022; MIPS64R6-NEXT: andi $1, $1, 3 3023; MIPS64R6-NEXT: sll $1, $1, 3 3024; MIPS64R6-NEXT: ori $2, $zero, 255 3025; MIPS64R6-NEXT: sllv $5, $2, $1 3026; MIPS64R6-NEXT: nor $6, $zero, $5 3027; MIPS64R6-NEXT: sllv $4, $4, $1 3028; MIPS64R6-NEXT: .LBB9_1: # %entry 3029; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 3030; MIPS64R6-NEXT: ll $7, 0($3) 3031; MIPS64R6-NEXT: subu $8, $7, $4 3032; MIPS64R6-NEXT: and $8, $8, $5 3033; MIPS64R6-NEXT: and $9, $7, $6 3034; MIPS64R6-NEXT: or $9, $9, $8 3035; MIPS64R6-NEXT: sc $9, 0($3) 3036; MIPS64R6-NEXT: beqzc $9, .LBB9_1 3037; MIPS64R6-NEXT: # %bb.2: # %entry 3038; MIPS64R6-NEXT: and $2, $7, $5 3039; MIPS64R6-NEXT: srlv $2, $2, $1 3040; MIPS64R6-NEXT: seb $2, $2 3041; MIPS64R6-NEXT: # %bb.3: # %entry 3042; MIPS64R6-NEXT: jrc $ra 3043; 3044; MIPS64R6O0-LABEL: AtomicLoadSub8: 3045; MIPS64R6O0: # %bb.0: # %entry 3046; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 3047; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8))) 3048; MIPS64R6O0-NEXT: daddu $1, $1, $25 3049; MIPS64R6O0-NEXT: daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadSub8))) 3050; MIPS64R6O0-NEXT: move $1, $4 3051; MIPS64R6O0-NEXT: ld $2, %got_disp(y)($2) 3052; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 3053; MIPS64R6O0-NEXT: and $5, $2, $3 3054; MIPS64R6O0-NEXT: andi $2, $2, 3 3055; MIPS64R6O0-NEXT: xori $2, $2, 3 3056; MIPS64R6O0-NEXT: sll $9, $2, 3 3057; MIPS64R6O0-NEXT: ori $2, $zero, 255 3058; MIPS64R6O0-NEXT: sllv $7, $2, $9 3059; MIPS64R6O0-NEXT: nor $8, $zero, $7 3060; MIPS64R6O0-NEXT: sllv $6, $1, $9 3061; MIPS64R6O0-NEXT: .LBB9_1: # %entry 3062; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3063; MIPS64R6O0-NEXT: ll $2, 0($5) 3064; MIPS64R6O0-NEXT: subu $3, $2, $6 3065; MIPS64R6O0-NEXT: and $3, $3, $7 3066; MIPS64R6O0-NEXT: and $4, $2, $8 3067; MIPS64R6O0-NEXT: or $4, $4, $3 3068; MIPS64R6O0-NEXT: sc $4, 0($5) 3069; MIPS64R6O0-NEXT: beqzc $4, .LBB9_1 3070; MIPS64R6O0-NEXT: # %bb.2: # %entry 3071; MIPS64R6O0-NEXT: and $1, $2, $7 3072; MIPS64R6O0-NEXT: srlv $1, $1, $9 3073; MIPS64R6O0-NEXT: seb $1, $1 3074; MIPS64R6O0-NEXT: # %bb.3: # %entry 3075; MIPS64R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 3076; MIPS64R6O0-NEXT: # %bb.4: # %entry 3077; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 3078; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 3079; MIPS64R6O0-NEXT: jrc $ra 3080; 3081; MM32-LABEL: AtomicLoadSub8: 3082; MM32: # %bb.0: # %entry 3083; MM32-NEXT: lui $2, %hi(_gp_disp) 3084; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 3085; MM32-NEXT: addu $2, $2, $25 3086; MM32-NEXT: lw $1, %got(y)($2) 3087; MM32-NEXT: addiu $2, $zero, -4 3088; MM32-NEXT: and $3, $1, $2 3089; MM32-NEXT: andi $1, $1, 3 3090; MM32-NEXT: sll $1, $1, 3 3091; MM32-NEXT: ori $2, $zero, 255 3092; MM32-NEXT: sllv $5, $2, $1 3093; MM32-NEXT: nor $6, $zero, $5 3094; MM32-NEXT: sllv $4, $4, $1 3095; MM32-NEXT: $BB9_1: # %entry 3096; MM32-NEXT: # =>This Inner Loop Header: Depth=1 3097; MM32-NEXT: ll $7, 0($3) 3098; MM32-NEXT: subu $8, $7, $4 3099; MM32-NEXT: and $8, $8, $5 3100; MM32-NEXT: and $9, $7, $6 3101; MM32-NEXT: or $9, $9, $8 3102; MM32-NEXT: sc $9, 0($3) 3103; MM32-NEXT: beqzc $9, $BB9_1 3104; MM32-NEXT: # %bb.2: # %entry 3105; MM32-NEXT: and $2, $7, $5 3106; MM32-NEXT: srlv $2, $2, $1 3107; MM32-NEXT: seb $2, $2 3108; MM32-NEXT: # %bb.3: # %entry 3109; MM32-NEXT: jrc $ra 3110; 3111; O1-LABEL: AtomicLoadSub8: 3112; O1: # %bb.0: # %entry 3113; O1-NEXT: lui $2, %hi(_gp_disp) 3114; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 3115; O1-NEXT: addu $1, $2, $25 3116; O1-NEXT: lw $1, %got(y)($1) 3117; O1-NEXT: addiu $2, $zero, -4 3118; O1-NEXT: and $3, $1, $2 3119; O1-NEXT: andi $1, $1, 3 3120; O1-NEXT: sll $1, $1, 3 3121; O1-NEXT: ori $2, $zero, 255 3122; O1-NEXT: sllv $5, $2, $1 3123; O1-NEXT: nor $6, $zero, $5 3124; O1-NEXT: sllv $4, $4, $1 3125; O1-NEXT: $BB9_1: # %entry 3126; O1-NEXT: # =>This Inner Loop Header: Depth=1 3127; O1-NEXT: ll $7, 0($3) 3128; O1-NEXT: subu $8, $7, $4 3129; O1-NEXT: and $8, $8, $5 3130; O1-NEXT: and $9, $7, $6 3131; O1-NEXT: or $9, $9, $8 3132; O1-NEXT: sc $9, 0($3) 3133; O1-NEXT: beqz $9, $BB9_1 3134; O1-NEXT: nop 3135; O1-NEXT: # %bb.2: # %entry 3136; O1-NEXT: and $2, $7, $5 3137; O1-NEXT: srlv $2, $2, $1 3138; O1-NEXT: sll $2, $2, 24 3139; O1-NEXT: sra $2, $2, 24 3140; O1-NEXT: # %bb.3: # %entry 3141; O1-NEXT: jr $ra 3142; O1-NEXT: nop 3143; 3144; O2-LABEL: AtomicLoadSub8: 3145; O2: # %bb.0: # %entry 3146; O2-NEXT: lui $2, %hi(_gp_disp) 3147; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 3148; O2-NEXT: addu $1, $2, $25 3149; O2-NEXT: lw $1, %got(y)($1) 3150; O2-NEXT: addiu $2, $zero, -4 3151; O2-NEXT: and $3, $1, $2 3152; O2-NEXT: andi $1, $1, 3 3153; O2-NEXT: sll $1, $1, 3 3154; O2-NEXT: ori $2, $zero, 255 3155; O2-NEXT: sllv $5, $2, $1 3156; O2-NEXT: nor $6, $zero, $5 3157; O2-NEXT: sllv $4, $4, $1 3158; O2-NEXT: $BB9_1: # %entry 3159; O2-NEXT: # =>This Inner Loop Header: Depth=1 3160; O2-NEXT: ll $7, 0($3) 3161; O2-NEXT: subu $8, $7, $4 3162; O2-NEXT: and $8, $8, $5 3163; O2-NEXT: and $9, $7, $6 3164; O2-NEXT: or $9, $9, $8 3165; O2-NEXT: sc $9, 0($3) 3166; O2-NEXT: beqz $9, $BB9_1 3167; O2-NEXT: nop 3168; O2-NEXT: # %bb.2: # %entry 3169; O2-NEXT: and $2, $7, $5 3170; O2-NEXT: srlv $2, $2, $1 3171; O2-NEXT: sll $2, $2, 24 3172; O2-NEXT: sra $2, $2, 24 3173; O2-NEXT: # %bb.3: # %entry 3174; O2-NEXT: jr $ra 3175; O2-NEXT: nop 3176; 3177; O3-LABEL: AtomicLoadSub8: 3178; O3: # %bb.0: # %entry 3179; O3-NEXT: lui $2, %hi(_gp_disp) 3180; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 3181; O3-NEXT: addu $1, $2, $25 3182; O3-NEXT: addiu $2, $zero, -4 3183; O3-NEXT: lw $1, %got(y)($1) 3184; O3-NEXT: and $3, $1, $2 3185; O3-NEXT: andi $1, $1, 3 3186; O3-NEXT: ori $2, $zero, 255 3187; O3-NEXT: sll $1, $1, 3 3188; O3-NEXT: sllv $5, $2, $1 3189; O3-NEXT: sllv $4, $4, $1 3190; O3-NEXT: nor $6, $zero, $5 3191; O3-NEXT: $BB9_1: # %entry 3192; O3-NEXT: # =>This Inner Loop Header: Depth=1 3193; O3-NEXT: ll $7, 0($3) 3194; O3-NEXT: subu $8, $7, $4 3195; O3-NEXT: and $8, $8, $5 3196; O3-NEXT: and $9, $7, $6 3197; O3-NEXT: or $9, $9, $8 3198; O3-NEXT: sc $9, 0($3) 3199; O3-NEXT: beqz $9, $BB9_1 3200; O3-NEXT: nop 3201; O3-NEXT: # %bb.2: # %entry 3202; O3-NEXT: and $2, $7, $5 3203; O3-NEXT: srlv $2, $2, $1 3204; O3-NEXT: sll $2, $2, 24 3205; O3-NEXT: sra $2, $2, 24 3206; O3-NEXT: # %bb.3: # %entry 3207; O3-NEXT: jr $ra 3208; O3-NEXT: nop 3209; 3210; MIPS32EB-LABEL: AtomicLoadSub8: 3211; MIPS32EB: # %bb.0: # %entry 3212; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 3213; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 3214; MIPS32EB-NEXT: addu $1, $2, $25 3215; MIPS32EB-NEXT: lw $1, %got(y)($1) 3216; MIPS32EB-NEXT: addiu $2, $zero, -4 3217; MIPS32EB-NEXT: and $3, $1, $2 3218; MIPS32EB-NEXT: andi $1, $1, 3 3219; MIPS32EB-NEXT: xori $1, $1, 3 3220; MIPS32EB-NEXT: sll $1, $1, 3 3221; MIPS32EB-NEXT: ori $2, $zero, 255 3222; MIPS32EB-NEXT: sllv $5, $2, $1 3223; MIPS32EB-NEXT: nor $6, $zero, $5 3224; MIPS32EB-NEXT: sllv $4, $4, $1 3225; MIPS32EB-NEXT: $BB9_1: # %entry 3226; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 3227; MIPS32EB-NEXT: ll $7, 0($3) 3228; MIPS32EB-NEXT: subu $8, $7, $4 3229; MIPS32EB-NEXT: and $8, $8, $5 3230; MIPS32EB-NEXT: and $9, $7, $6 3231; MIPS32EB-NEXT: or $9, $9, $8 3232; MIPS32EB-NEXT: sc $9, 0($3) 3233; MIPS32EB-NEXT: beqz $9, $BB9_1 3234; MIPS32EB-NEXT: nop 3235; MIPS32EB-NEXT: # %bb.2: # %entry 3236; MIPS32EB-NEXT: and $2, $7, $5 3237; MIPS32EB-NEXT: srlv $2, $2, $1 3238; MIPS32EB-NEXT: sll $2, $2, 24 3239; MIPS32EB-NEXT: sra $2, $2, 24 3240; MIPS32EB-NEXT: # %bb.3: # %entry 3241; MIPS32EB-NEXT: jr $ra 3242; MIPS32EB-NEXT: nop 3243entry: 3244 %0 = atomicrmw sub ptr @y, i8 %incr monotonic 3245 ret i8 %0 3246 3247} 3248 3249define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind { 3250; MIPS32-LABEL: AtomicLoadNand8: 3251; MIPS32: # %bb.0: # %entry 3252; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3253; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3254; MIPS32-NEXT: addu $1, $2, $25 3255; MIPS32-NEXT: lw $1, %got(y)($1) 3256; MIPS32-NEXT: addiu $2, $zero, -4 3257; MIPS32-NEXT: and $3, $1, $2 3258; MIPS32-NEXT: andi $1, $1, 3 3259; MIPS32-NEXT: sll $1, $1, 3 3260; MIPS32-NEXT: ori $2, $zero, 255 3261; MIPS32-NEXT: sllv $5, $2, $1 3262; MIPS32-NEXT: nor $6, $zero, $5 3263; MIPS32-NEXT: sllv $4, $4, $1 3264; MIPS32-NEXT: $BB10_1: # %entry 3265; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 3266; MIPS32-NEXT: ll $7, 0($3) 3267; MIPS32-NEXT: and $8, $7, $4 3268; MIPS32-NEXT: nor $8, $zero, $8 3269; MIPS32-NEXT: and $8, $8, $5 3270; MIPS32-NEXT: and $9, $7, $6 3271; MIPS32-NEXT: or $9, $9, $8 3272; MIPS32-NEXT: sc $9, 0($3) 3273; MIPS32-NEXT: beqz $9, $BB10_1 3274; MIPS32-NEXT: nop 3275; MIPS32-NEXT: # %bb.2: # %entry 3276; MIPS32-NEXT: and $2, $7, $5 3277; MIPS32-NEXT: srlv $2, $2, $1 3278; MIPS32-NEXT: sll $2, $2, 24 3279; MIPS32-NEXT: sra $2, $2, 24 3280; MIPS32-NEXT: # %bb.3: # %entry 3281; MIPS32-NEXT: jr $ra 3282; MIPS32-NEXT: nop 3283; 3284; MIPS32O0-LABEL: AtomicLoadNand8: 3285; MIPS32O0: # %bb.0: # %entry 3286; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 3287; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3288; MIPS32O0-NEXT: addiu $sp, $sp, -8 3289; MIPS32O0-NEXT: addu $1, $2, $25 3290; MIPS32O0-NEXT: lw $1, %got(y)($1) 3291; MIPS32O0-NEXT: addiu $2, $zero, -4 3292; MIPS32O0-NEXT: and $5, $1, $2 3293; MIPS32O0-NEXT: andi $1, $1, 3 3294; MIPS32O0-NEXT: sll $9, $1, 3 3295; MIPS32O0-NEXT: ori $1, $zero, 255 3296; MIPS32O0-NEXT: sllv $7, $1, $9 3297; MIPS32O0-NEXT: nor $8, $zero, $7 3298; MIPS32O0-NEXT: sllv $6, $4, $9 3299; MIPS32O0-NEXT: $BB10_1: # %entry 3300; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 3301; MIPS32O0-NEXT: ll $2, 0($5) 3302; MIPS32O0-NEXT: and $3, $2, $6 3303; MIPS32O0-NEXT: nor $3, $zero, $3 3304; MIPS32O0-NEXT: and $3, $3, $7 3305; MIPS32O0-NEXT: and $4, $2, $8 3306; MIPS32O0-NEXT: or $4, $4, $3 3307; MIPS32O0-NEXT: sc $4, 0($5) 3308; MIPS32O0-NEXT: beqz $4, $BB10_1 3309; MIPS32O0-NEXT: nop 3310; MIPS32O0-NEXT: # %bb.2: # %entry 3311; MIPS32O0-NEXT: and $1, $2, $7 3312; MIPS32O0-NEXT: srlv $1, $1, $9 3313; MIPS32O0-NEXT: sll $1, $1, 24 3314; MIPS32O0-NEXT: sra $1, $1, 24 3315; MIPS32O0-NEXT: # %bb.3: # %entry 3316; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 3317; MIPS32O0-NEXT: # %bb.4: # %entry 3318; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 3319; MIPS32O0-NEXT: sll $1, $1, 24 3320; MIPS32O0-NEXT: sra $2, $1, 24 3321; MIPS32O0-NEXT: addiu $sp, $sp, 8 3322; MIPS32O0-NEXT: jr $ra 3323; MIPS32O0-NEXT: nop 3324; 3325; MIPS32R2-LABEL: AtomicLoadNand8: 3326; MIPS32R2: # %bb.0: # %entry 3327; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 3328; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 3329; MIPS32R2-NEXT: addu $1, $2, $25 3330; MIPS32R2-NEXT: lw $1, %got(y)($1) 3331; MIPS32R2-NEXT: addiu $2, $zero, -4 3332; MIPS32R2-NEXT: and $3, $1, $2 3333; MIPS32R2-NEXT: andi $1, $1, 3 3334; MIPS32R2-NEXT: sll $1, $1, 3 3335; MIPS32R2-NEXT: ori $2, $zero, 255 3336; MIPS32R2-NEXT: sllv $5, $2, $1 3337; MIPS32R2-NEXT: nor $6, $zero, $5 3338; MIPS32R2-NEXT: sllv $4, $4, $1 3339; MIPS32R2-NEXT: $BB10_1: # %entry 3340; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 3341; MIPS32R2-NEXT: ll $7, 0($3) 3342; MIPS32R2-NEXT: and $8, $7, $4 3343; MIPS32R2-NEXT: nor $8, $zero, $8 3344; MIPS32R2-NEXT: and $8, $8, $5 3345; MIPS32R2-NEXT: and $9, $7, $6 3346; MIPS32R2-NEXT: or $9, $9, $8 3347; MIPS32R2-NEXT: sc $9, 0($3) 3348; MIPS32R2-NEXT: beqz $9, $BB10_1 3349; MIPS32R2-NEXT: nop 3350; MIPS32R2-NEXT: # %bb.2: # %entry 3351; MIPS32R2-NEXT: and $2, $7, $5 3352; MIPS32R2-NEXT: srlv $2, $2, $1 3353; MIPS32R2-NEXT: seb $2, $2 3354; MIPS32R2-NEXT: # %bb.3: # %entry 3355; MIPS32R2-NEXT: jr $ra 3356; MIPS32R2-NEXT: nop 3357; 3358; MIPS32R6-LABEL: AtomicLoadNand8: 3359; MIPS32R6: # %bb.0: # %entry 3360; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 3361; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 3362; MIPS32R6-NEXT: addu $1, $2, $25 3363; MIPS32R6-NEXT: lw $1, %got(y)($1) 3364; MIPS32R6-NEXT: addiu $2, $zero, -4 3365; MIPS32R6-NEXT: and $3, $1, $2 3366; MIPS32R6-NEXT: andi $1, $1, 3 3367; MIPS32R6-NEXT: sll $1, $1, 3 3368; MIPS32R6-NEXT: ori $2, $zero, 255 3369; MIPS32R6-NEXT: sllv $5, $2, $1 3370; MIPS32R6-NEXT: nor $6, $zero, $5 3371; MIPS32R6-NEXT: sllv $4, $4, $1 3372; MIPS32R6-NEXT: $BB10_1: # %entry 3373; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 3374; MIPS32R6-NEXT: ll $7, 0($3) 3375; MIPS32R6-NEXT: and $8, $7, $4 3376; MIPS32R6-NEXT: nor $8, $zero, $8 3377; MIPS32R6-NEXT: and $8, $8, $5 3378; MIPS32R6-NEXT: and $9, $7, $6 3379; MIPS32R6-NEXT: or $9, $9, $8 3380; MIPS32R6-NEXT: sc $9, 0($3) 3381; MIPS32R6-NEXT: beqzc $9, $BB10_1 3382; MIPS32R6-NEXT: # %bb.2: # %entry 3383; MIPS32R6-NEXT: and $2, $7, $5 3384; MIPS32R6-NEXT: srlv $2, $2, $1 3385; MIPS32R6-NEXT: seb $2, $2 3386; MIPS32R6-NEXT: # %bb.3: # %entry 3387; MIPS32R6-NEXT: jrc $ra 3388; 3389; MIPS32R6O0-LABEL: AtomicLoadNand8: 3390; MIPS32R6O0: # %bb.0: # %entry 3391; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 3392; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3393; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 3394; MIPS32R6O0-NEXT: addu $1, $2, $25 3395; MIPS32R6O0-NEXT: # kill: def $v0 killed $a0 3396; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 3397; MIPS32R6O0-NEXT: addiu $2, $zero, -4 3398; MIPS32R6O0-NEXT: and $5, $1, $2 3399; MIPS32R6O0-NEXT: andi $1, $1, 3 3400; MIPS32R6O0-NEXT: sll $9, $1, 3 3401; MIPS32R6O0-NEXT: ori $1, $zero, 255 3402; MIPS32R6O0-NEXT: sllv $7, $1, $9 3403; MIPS32R6O0-NEXT: nor $8, $zero, $7 3404; MIPS32R6O0-NEXT: sllv $6, $4, $9 3405; MIPS32R6O0-NEXT: $BB10_1: # %entry 3406; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3407; MIPS32R6O0-NEXT: ll $2, 0($5) 3408; MIPS32R6O0-NEXT: and $3, $2, $6 3409; MIPS32R6O0-NEXT: nor $3, $zero, $3 3410; MIPS32R6O0-NEXT: and $3, $3, $7 3411; MIPS32R6O0-NEXT: and $4, $2, $8 3412; MIPS32R6O0-NEXT: or $4, $4, $3 3413; MIPS32R6O0-NEXT: sc $4, 0($5) 3414; MIPS32R6O0-NEXT: beqzc $4, $BB10_1 3415; MIPS32R6O0-NEXT: # %bb.2: # %entry 3416; MIPS32R6O0-NEXT: and $1, $2, $7 3417; MIPS32R6O0-NEXT: srlv $1, $1, $9 3418; MIPS32R6O0-NEXT: seb $1, $1 3419; MIPS32R6O0-NEXT: # %bb.3: # %entry 3420; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 3421; MIPS32R6O0-NEXT: # %bb.4: # %entry 3422; MIPS32R6O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 3423; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 3424; MIPS32R6O0-NEXT: jrc $ra 3425; 3426; MIPS4-LABEL: AtomicLoadNand8: 3427; MIPS4: # %bb.0: # %entry 3428; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3429; MIPS4-NEXT: daddu $1, $1, $25 3430; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3431; MIPS4-NEXT: ld $1, %got_disp(y)($1) 3432; MIPS4-NEXT: daddiu $2, $zero, -4 3433; MIPS4-NEXT: and $3, $1, $2 3434; MIPS4-NEXT: andi $1, $1, 3 3435; MIPS4-NEXT: sll $1, $1, 3 3436; MIPS4-NEXT: ori $2, $zero, 255 3437; MIPS4-NEXT: sllv $5, $2, $1 3438; MIPS4-NEXT: nor $6, $zero, $5 3439; MIPS4-NEXT: sllv $4, $4, $1 3440; MIPS4-NEXT: .LBB10_1: # %entry 3441; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 3442; MIPS4-NEXT: ll $7, 0($3) 3443; MIPS4-NEXT: and $8, $7, $4 3444; MIPS4-NEXT: nor $8, $zero, $8 3445; MIPS4-NEXT: and $8, $8, $5 3446; MIPS4-NEXT: and $9, $7, $6 3447; MIPS4-NEXT: or $9, $9, $8 3448; MIPS4-NEXT: sc $9, 0($3) 3449; MIPS4-NEXT: beqz $9, .LBB10_1 3450; MIPS4-NEXT: nop 3451; MIPS4-NEXT: # %bb.2: # %entry 3452; MIPS4-NEXT: and $2, $7, $5 3453; MIPS4-NEXT: srlv $2, $2, $1 3454; MIPS4-NEXT: sll $2, $2, 24 3455; MIPS4-NEXT: sra $2, $2, 24 3456; MIPS4-NEXT: # %bb.3: # %entry 3457; MIPS4-NEXT: jr $ra 3458; MIPS4-NEXT: nop 3459; 3460; MIPS64-LABEL: AtomicLoadNand8: 3461; MIPS64: # %bb.0: # %entry 3462; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3463; MIPS64-NEXT: daddu $1, $1, $25 3464; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3465; MIPS64-NEXT: ld $1, %got_disp(y)($1) 3466; MIPS64-NEXT: daddiu $2, $zero, -4 3467; MIPS64-NEXT: and $3, $1, $2 3468; MIPS64-NEXT: andi $1, $1, 3 3469; MIPS64-NEXT: sll $1, $1, 3 3470; MIPS64-NEXT: ori $2, $zero, 255 3471; MIPS64-NEXT: sllv $5, $2, $1 3472; MIPS64-NEXT: nor $6, $zero, $5 3473; MIPS64-NEXT: sllv $4, $4, $1 3474; MIPS64-NEXT: .LBB10_1: # %entry 3475; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 3476; MIPS64-NEXT: ll $7, 0($3) 3477; MIPS64-NEXT: and $8, $7, $4 3478; MIPS64-NEXT: nor $8, $zero, $8 3479; MIPS64-NEXT: and $8, $8, $5 3480; MIPS64-NEXT: and $9, $7, $6 3481; MIPS64-NEXT: or $9, $9, $8 3482; MIPS64-NEXT: sc $9, 0($3) 3483; MIPS64-NEXT: beqz $9, .LBB10_1 3484; MIPS64-NEXT: nop 3485; MIPS64-NEXT: # %bb.2: # %entry 3486; MIPS64-NEXT: and $2, $7, $5 3487; MIPS64-NEXT: srlv $2, $2, $1 3488; MIPS64-NEXT: sll $2, $2, 24 3489; MIPS64-NEXT: sra $2, $2, 24 3490; MIPS64-NEXT: # %bb.3: # %entry 3491; MIPS64-NEXT: jr $ra 3492; MIPS64-NEXT: nop 3493; 3494; MIPS64R2-LABEL: AtomicLoadNand8: 3495; MIPS64R2: # %bb.0: # %entry 3496; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3497; MIPS64R2-NEXT: daddu $1, $1, $25 3498; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3499; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 3500; MIPS64R2-NEXT: daddiu $2, $zero, -4 3501; MIPS64R2-NEXT: and $3, $1, $2 3502; MIPS64R2-NEXT: andi $1, $1, 3 3503; MIPS64R2-NEXT: sll $1, $1, 3 3504; MIPS64R2-NEXT: ori $2, $zero, 255 3505; MIPS64R2-NEXT: sllv $5, $2, $1 3506; MIPS64R2-NEXT: nor $6, $zero, $5 3507; MIPS64R2-NEXT: sllv $4, $4, $1 3508; MIPS64R2-NEXT: .LBB10_1: # %entry 3509; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 3510; MIPS64R2-NEXT: ll $7, 0($3) 3511; MIPS64R2-NEXT: and $8, $7, $4 3512; MIPS64R2-NEXT: nor $8, $zero, $8 3513; MIPS64R2-NEXT: and $8, $8, $5 3514; MIPS64R2-NEXT: and $9, $7, $6 3515; MIPS64R2-NEXT: or $9, $9, $8 3516; MIPS64R2-NEXT: sc $9, 0($3) 3517; MIPS64R2-NEXT: beqz $9, .LBB10_1 3518; MIPS64R2-NEXT: nop 3519; MIPS64R2-NEXT: # %bb.2: # %entry 3520; MIPS64R2-NEXT: and $2, $7, $5 3521; MIPS64R2-NEXT: srlv $2, $2, $1 3522; MIPS64R2-NEXT: seb $2, $2 3523; MIPS64R2-NEXT: # %bb.3: # %entry 3524; MIPS64R2-NEXT: jr $ra 3525; MIPS64R2-NEXT: nop 3526; 3527; MIPS64R6-LABEL: AtomicLoadNand8: 3528; MIPS64R6: # %bb.0: # %entry 3529; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3530; MIPS64R6-NEXT: daddu $1, $1, $25 3531; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3532; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 3533; MIPS64R6-NEXT: daddiu $2, $zero, -4 3534; MIPS64R6-NEXT: and $3, $1, $2 3535; MIPS64R6-NEXT: andi $1, $1, 3 3536; MIPS64R6-NEXT: sll $1, $1, 3 3537; MIPS64R6-NEXT: ori $2, $zero, 255 3538; MIPS64R6-NEXT: sllv $5, $2, $1 3539; MIPS64R6-NEXT: nor $6, $zero, $5 3540; MIPS64R6-NEXT: sllv $4, $4, $1 3541; MIPS64R6-NEXT: .LBB10_1: # %entry 3542; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 3543; MIPS64R6-NEXT: ll $7, 0($3) 3544; MIPS64R6-NEXT: and $8, $7, $4 3545; MIPS64R6-NEXT: nor $8, $zero, $8 3546; MIPS64R6-NEXT: and $8, $8, $5 3547; MIPS64R6-NEXT: and $9, $7, $6 3548; MIPS64R6-NEXT: or $9, $9, $8 3549; MIPS64R6-NEXT: sc $9, 0($3) 3550; MIPS64R6-NEXT: beqzc $9, .LBB10_1 3551; MIPS64R6-NEXT: # %bb.2: # %entry 3552; MIPS64R6-NEXT: and $2, $7, $5 3553; MIPS64R6-NEXT: srlv $2, $2, $1 3554; MIPS64R6-NEXT: seb $2, $2 3555; MIPS64R6-NEXT: # %bb.3: # %entry 3556; MIPS64R6-NEXT: jrc $ra 3557; 3558; MIPS64R6O0-LABEL: AtomicLoadNand8: 3559; MIPS64R6O0: # %bb.0: # %entry 3560; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 3561; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8))) 3562; MIPS64R6O0-NEXT: daddu $1, $1, $25 3563; MIPS64R6O0-NEXT: daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadNand8))) 3564; MIPS64R6O0-NEXT: move $1, $4 3565; MIPS64R6O0-NEXT: ld $2, %got_disp(y)($2) 3566; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 3567; MIPS64R6O0-NEXT: and $5, $2, $3 3568; MIPS64R6O0-NEXT: andi $2, $2, 3 3569; MIPS64R6O0-NEXT: xori $2, $2, 3 3570; MIPS64R6O0-NEXT: sll $9, $2, 3 3571; MIPS64R6O0-NEXT: ori $2, $zero, 255 3572; MIPS64R6O0-NEXT: sllv $7, $2, $9 3573; MIPS64R6O0-NEXT: nor $8, $zero, $7 3574; MIPS64R6O0-NEXT: sllv $6, $1, $9 3575; MIPS64R6O0-NEXT: .LBB10_1: # %entry 3576; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3577; MIPS64R6O0-NEXT: ll $2, 0($5) 3578; MIPS64R6O0-NEXT: and $3, $2, $6 3579; MIPS64R6O0-NEXT: nor $3, $zero, $3 3580; MIPS64R6O0-NEXT: and $3, $3, $7 3581; MIPS64R6O0-NEXT: and $4, $2, $8 3582; MIPS64R6O0-NEXT: or $4, $4, $3 3583; MIPS64R6O0-NEXT: sc $4, 0($5) 3584; MIPS64R6O0-NEXT: beqzc $4, .LBB10_1 3585; MIPS64R6O0-NEXT: # %bb.2: # %entry 3586; MIPS64R6O0-NEXT: and $1, $2, $7 3587; MIPS64R6O0-NEXT: srlv $1, $1, $9 3588; MIPS64R6O0-NEXT: seb $1, $1 3589; MIPS64R6O0-NEXT: # %bb.3: # %entry 3590; MIPS64R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 3591; MIPS64R6O0-NEXT: # %bb.4: # %entry 3592; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 3593; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 3594; MIPS64R6O0-NEXT: jrc $ra 3595; 3596; MM32-LABEL: AtomicLoadNand8: 3597; MM32: # %bb.0: # %entry 3598; MM32-NEXT: lui $2, %hi(_gp_disp) 3599; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 3600; MM32-NEXT: addu $2, $2, $25 3601; MM32-NEXT: lw $1, %got(y)($2) 3602; MM32-NEXT: addiu $2, $zero, -4 3603; MM32-NEXT: and $3, $1, $2 3604; MM32-NEXT: andi $1, $1, 3 3605; MM32-NEXT: sll $1, $1, 3 3606; MM32-NEXT: ori $2, $zero, 255 3607; MM32-NEXT: sllv $5, $2, $1 3608; MM32-NEXT: nor $6, $zero, $5 3609; MM32-NEXT: sllv $4, $4, $1 3610; MM32-NEXT: $BB10_1: # %entry 3611; MM32-NEXT: # =>This Inner Loop Header: Depth=1 3612; MM32-NEXT: ll $7, 0($3) 3613; MM32-NEXT: and $8, $7, $4 3614; MM32-NEXT: nor $8, $zero, $8 3615; MM32-NEXT: and $8, $8, $5 3616; MM32-NEXT: and $9, $7, $6 3617; MM32-NEXT: or $9, $9, $8 3618; MM32-NEXT: sc $9, 0($3) 3619; MM32-NEXT: beqzc $9, $BB10_1 3620; MM32-NEXT: # %bb.2: # %entry 3621; MM32-NEXT: and $2, $7, $5 3622; MM32-NEXT: srlv $2, $2, $1 3623; MM32-NEXT: seb $2, $2 3624; MM32-NEXT: # %bb.3: # %entry 3625; MM32-NEXT: jrc $ra 3626; 3627; O1-LABEL: AtomicLoadNand8: 3628; O1: # %bb.0: # %entry 3629; O1-NEXT: lui $2, %hi(_gp_disp) 3630; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 3631; O1-NEXT: addu $1, $2, $25 3632; O1-NEXT: lw $1, %got(y)($1) 3633; O1-NEXT: addiu $2, $zero, -4 3634; O1-NEXT: and $3, $1, $2 3635; O1-NEXT: andi $1, $1, 3 3636; O1-NEXT: sll $1, $1, 3 3637; O1-NEXT: ori $2, $zero, 255 3638; O1-NEXT: sllv $5, $2, $1 3639; O1-NEXT: nor $6, $zero, $5 3640; O1-NEXT: sllv $4, $4, $1 3641; O1-NEXT: $BB10_1: # %entry 3642; O1-NEXT: # =>This Inner Loop Header: Depth=1 3643; O1-NEXT: ll $7, 0($3) 3644; O1-NEXT: and $8, $7, $4 3645; O1-NEXT: nor $8, $zero, $8 3646; O1-NEXT: and $8, $8, $5 3647; O1-NEXT: and $9, $7, $6 3648; O1-NEXT: or $9, $9, $8 3649; O1-NEXT: sc $9, 0($3) 3650; O1-NEXT: beqz $9, $BB10_1 3651; O1-NEXT: nop 3652; O1-NEXT: # %bb.2: # %entry 3653; O1-NEXT: and $2, $7, $5 3654; O1-NEXT: srlv $2, $2, $1 3655; O1-NEXT: sll $2, $2, 24 3656; O1-NEXT: sra $2, $2, 24 3657; O1-NEXT: # %bb.3: # %entry 3658; O1-NEXT: jr $ra 3659; O1-NEXT: nop 3660; 3661; O2-LABEL: AtomicLoadNand8: 3662; O2: # %bb.0: # %entry 3663; O2-NEXT: lui $2, %hi(_gp_disp) 3664; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 3665; O2-NEXT: addu $1, $2, $25 3666; O2-NEXT: lw $1, %got(y)($1) 3667; O2-NEXT: addiu $2, $zero, -4 3668; O2-NEXT: and $3, $1, $2 3669; O2-NEXT: andi $1, $1, 3 3670; O2-NEXT: sll $1, $1, 3 3671; O2-NEXT: ori $2, $zero, 255 3672; O2-NEXT: sllv $5, $2, $1 3673; O2-NEXT: nor $6, $zero, $5 3674; O2-NEXT: sllv $4, $4, $1 3675; O2-NEXT: $BB10_1: # %entry 3676; O2-NEXT: # =>This Inner Loop Header: Depth=1 3677; O2-NEXT: ll $7, 0($3) 3678; O2-NEXT: and $8, $7, $4 3679; O2-NEXT: nor $8, $zero, $8 3680; O2-NEXT: and $8, $8, $5 3681; O2-NEXT: and $9, $7, $6 3682; O2-NEXT: or $9, $9, $8 3683; O2-NEXT: sc $9, 0($3) 3684; O2-NEXT: beqz $9, $BB10_1 3685; O2-NEXT: nop 3686; O2-NEXT: # %bb.2: # %entry 3687; O2-NEXT: and $2, $7, $5 3688; O2-NEXT: srlv $2, $2, $1 3689; O2-NEXT: sll $2, $2, 24 3690; O2-NEXT: sra $2, $2, 24 3691; O2-NEXT: # %bb.3: # %entry 3692; O2-NEXT: jr $ra 3693; O2-NEXT: nop 3694; 3695; O3-LABEL: AtomicLoadNand8: 3696; O3: # %bb.0: # %entry 3697; O3-NEXT: lui $2, %hi(_gp_disp) 3698; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 3699; O3-NEXT: addu $1, $2, $25 3700; O3-NEXT: addiu $2, $zero, -4 3701; O3-NEXT: lw $1, %got(y)($1) 3702; O3-NEXT: and $3, $1, $2 3703; O3-NEXT: andi $1, $1, 3 3704; O3-NEXT: ori $2, $zero, 255 3705; O3-NEXT: sll $1, $1, 3 3706; O3-NEXT: sllv $5, $2, $1 3707; O3-NEXT: sllv $4, $4, $1 3708; O3-NEXT: nor $6, $zero, $5 3709; O3-NEXT: $BB10_1: # %entry 3710; O3-NEXT: # =>This Inner Loop Header: Depth=1 3711; O3-NEXT: ll $7, 0($3) 3712; O3-NEXT: and $8, $7, $4 3713; O3-NEXT: nor $8, $zero, $8 3714; O3-NEXT: and $8, $8, $5 3715; O3-NEXT: and $9, $7, $6 3716; O3-NEXT: or $9, $9, $8 3717; O3-NEXT: sc $9, 0($3) 3718; O3-NEXT: beqz $9, $BB10_1 3719; O3-NEXT: nop 3720; O3-NEXT: # %bb.2: # %entry 3721; O3-NEXT: and $2, $7, $5 3722; O3-NEXT: srlv $2, $2, $1 3723; O3-NEXT: sll $2, $2, 24 3724; O3-NEXT: sra $2, $2, 24 3725; O3-NEXT: # %bb.3: # %entry 3726; O3-NEXT: jr $ra 3727; O3-NEXT: nop 3728; 3729; MIPS32EB-LABEL: AtomicLoadNand8: 3730; MIPS32EB: # %bb.0: # %entry 3731; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 3732; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 3733; MIPS32EB-NEXT: addu $1, $2, $25 3734; MIPS32EB-NEXT: lw $1, %got(y)($1) 3735; MIPS32EB-NEXT: addiu $2, $zero, -4 3736; MIPS32EB-NEXT: and $3, $1, $2 3737; MIPS32EB-NEXT: andi $1, $1, 3 3738; MIPS32EB-NEXT: xori $1, $1, 3 3739; MIPS32EB-NEXT: sll $1, $1, 3 3740; MIPS32EB-NEXT: ori $2, $zero, 255 3741; MIPS32EB-NEXT: sllv $5, $2, $1 3742; MIPS32EB-NEXT: nor $6, $zero, $5 3743; MIPS32EB-NEXT: sllv $4, $4, $1 3744; MIPS32EB-NEXT: $BB10_1: # %entry 3745; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 3746; MIPS32EB-NEXT: ll $7, 0($3) 3747; MIPS32EB-NEXT: and $8, $7, $4 3748; MIPS32EB-NEXT: nor $8, $zero, $8 3749; MIPS32EB-NEXT: and $8, $8, $5 3750; MIPS32EB-NEXT: and $9, $7, $6 3751; MIPS32EB-NEXT: or $9, $9, $8 3752; MIPS32EB-NEXT: sc $9, 0($3) 3753; MIPS32EB-NEXT: beqz $9, $BB10_1 3754; MIPS32EB-NEXT: nop 3755; MIPS32EB-NEXT: # %bb.2: # %entry 3756; MIPS32EB-NEXT: and $2, $7, $5 3757; MIPS32EB-NEXT: srlv $2, $2, $1 3758; MIPS32EB-NEXT: sll $2, $2, 24 3759; MIPS32EB-NEXT: sra $2, $2, 24 3760; MIPS32EB-NEXT: # %bb.3: # %entry 3761; MIPS32EB-NEXT: jr $ra 3762; MIPS32EB-NEXT: nop 3763entry: 3764 %0 = atomicrmw nand ptr @y, i8 %incr monotonic 3765 ret i8 %0 3766 3767} 3768 3769define signext i8 @AtomicSwap8(i8 signext %newval) nounwind { 3770; MIPS32-LABEL: AtomicSwap8: 3771; MIPS32: # %bb.0: # %entry 3772; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3773; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3774; MIPS32-NEXT: addu $1, $2, $25 3775; MIPS32-NEXT: lw $1, %got(y)($1) 3776; MIPS32-NEXT: addiu $2, $zero, -4 3777; MIPS32-NEXT: and $3, $1, $2 3778; MIPS32-NEXT: andi $1, $1, 3 3779; MIPS32-NEXT: sll $1, $1, 3 3780; MIPS32-NEXT: ori $2, $zero, 255 3781; MIPS32-NEXT: sllv $5, $2, $1 3782; MIPS32-NEXT: nor $6, $zero, $5 3783; MIPS32-NEXT: sllv $4, $4, $1 3784; MIPS32-NEXT: $BB11_1: # %entry 3785; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 3786; MIPS32-NEXT: ll $7, 0($3) 3787; MIPS32-NEXT: and $8, $4, $5 3788; MIPS32-NEXT: and $9, $7, $6 3789; MIPS32-NEXT: or $9, $9, $8 3790; MIPS32-NEXT: sc $9, 0($3) 3791; MIPS32-NEXT: beqz $9, $BB11_1 3792; MIPS32-NEXT: nop 3793; MIPS32-NEXT: # %bb.2: # %entry 3794; MIPS32-NEXT: and $2, $7, $5 3795; MIPS32-NEXT: srlv $2, $2, $1 3796; MIPS32-NEXT: sll $2, $2, 24 3797; MIPS32-NEXT: sra $2, $2, 24 3798; MIPS32-NEXT: # %bb.3: # %entry 3799; MIPS32-NEXT: jr $ra 3800; MIPS32-NEXT: nop 3801; 3802; MIPS32O0-LABEL: AtomicSwap8: 3803; MIPS32O0: # %bb.0: # %entry 3804; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 3805; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3806; MIPS32O0-NEXT: addiu $sp, $sp, -8 3807; MIPS32O0-NEXT: addu $1, $2, $25 3808; MIPS32O0-NEXT: lw $1, %got(y)($1) 3809; MIPS32O0-NEXT: addiu $2, $zero, -4 3810; MIPS32O0-NEXT: and $5, $1, $2 3811; MIPS32O0-NEXT: andi $1, $1, 3 3812; MIPS32O0-NEXT: sll $9, $1, 3 3813; MIPS32O0-NEXT: ori $1, $zero, 255 3814; MIPS32O0-NEXT: sllv $7, $1, $9 3815; MIPS32O0-NEXT: nor $8, $zero, $7 3816; MIPS32O0-NEXT: sllv $6, $4, $9 3817; MIPS32O0-NEXT: $BB11_1: # %entry 3818; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 3819; MIPS32O0-NEXT: ll $2, 0($5) 3820; MIPS32O0-NEXT: and $3, $6, $7 3821; MIPS32O0-NEXT: and $4, $2, $8 3822; MIPS32O0-NEXT: or $4, $4, $3 3823; MIPS32O0-NEXT: sc $4, 0($5) 3824; MIPS32O0-NEXT: beqz $4, $BB11_1 3825; MIPS32O0-NEXT: nop 3826; MIPS32O0-NEXT: # %bb.2: # %entry 3827; MIPS32O0-NEXT: and $1, $2, $7 3828; MIPS32O0-NEXT: srlv $1, $1, $9 3829; MIPS32O0-NEXT: sll $1, $1, 24 3830; MIPS32O0-NEXT: sra $1, $1, 24 3831; MIPS32O0-NEXT: # %bb.3: # %entry 3832; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 3833; MIPS32O0-NEXT: # %bb.4: # %entry 3834; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 3835; MIPS32O0-NEXT: sll $1, $1, 24 3836; MIPS32O0-NEXT: sra $2, $1, 24 3837; MIPS32O0-NEXT: addiu $sp, $sp, 8 3838; MIPS32O0-NEXT: jr $ra 3839; MIPS32O0-NEXT: nop 3840; 3841; MIPS32R2-LABEL: AtomicSwap8: 3842; MIPS32R2: # %bb.0: # %entry 3843; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 3844; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 3845; MIPS32R2-NEXT: addu $1, $2, $25 3846; MIPS32R2-NEXT: lw $1, %got(y)($1) 3847; MIPS32R2-NEXT: addiu $2, $zero, -4 3848; MIPS32R2-NEXT: and $3, $1, $2 3849; MIPS32R2-NEXT: andi $1, $1, 3 3850; MIPS32R2-NEXT: sll $1, $1, 3 3851; MIPS32R2-NEXT: ori $2, $zero, 255 3852; MIPS32R2-NEXT: sllv $5, $2, $1 3853; MIPS32R2-NEXT: nor $6, $zero, $5 3854; MIPS32R2-NEXT: sllv $4, $4, $1 3855; MIPS32R2-NEXT: $BB11_1: # %entry 3856; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 3857; MIPS32R2-NEXT: ll $7, 0($3) 3858; MIPS32R2-NEXT: and $8, $4, $5 3859; MIPS32R2-NEXT: and $9, $7, $6 3860; MIPS32R2-NEXT: or $9, $9, $8 3861; MIPS32R2-NEXT: sc $9, 0($3) 3862; MIPS32R2-NEXT: beqz $9, $BB11_1 3863; MIPS32R2-NEXT: nop 3864; MIPS32R2-NEXT: # %bb.2: # %entry 3865; MIPS32R2-NEXT: and $2, $7, $5 3866; MIPS32R2-NEXT: srlv $2, $2, $1 3867; MIPS32R2-NEXT: seb $2, $2 3868; MIPS32R2-NEXT: # %bb.3: # %entry 3869; MIPS32R2-NEXT: jr $ra 3870; MIPS32R2-NEXT: nop 3871; 3872; MIPS32R6-LABEL: AtomicSwap8: 3873; MIPS32R6: # %bb.0: # %entry 3874; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 3875; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 3876; MIPS32R6-NEXT: addu $1, $2, $25 3877; MIPS32R6-NEXT: lw $1, %got(y)($1) 3878; MIPS32R6-NEXT: addiu $2, $zero, -4 3879; MIPS32R6-NEXT: and $3, $1, $2 3880; MIPS32R6-NEXT: andi $1, $1, 3 3881; MIPS32R6-NEXT: sll $1, $1, 3 3882; MIPS32R6-NEXT: ori $2, $zero, 255 3883; MIPS32R6-NEXT: sllv $5, $2, $1 3884; MIPS32R6-NEXT: nor $6, $zero, $5 3885; MIPS32R6-NEXT: sllv $4, $4, $1 3886; MIPS32R6-NEXT: $BB11_1: # %entry 3887; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 3888; MIPS32R6-NEXT: ll $7, 0($3) 3889; MIPS32R6-NEXT: and $8, $4, $5 3890; MIPS32R6-NEXT: and $9, $7, $6 3891; MIPS32R6-NEXT: or $9, $9, $8 3892; MIPS32R6-NEXT: sc $9, 0($3) 3893; MIPS32R6-NEXT: beqzc $9, $BB11_1 3894; MIPS32R6-NEXT: # %bb.2: # %entry 3895; MIPS32R6-NEXT: and $2, $7, $5 3896; MIPS32R6-NEXT: srlv $2, $2, $1 3897; MIPS32R6-NEXT: seb $2, $2 3898; MIPS32R6-NEXT: # %bb.3: # %entry 3899; MIPS32R6-NEXT: jrc $ra 3900; 3901; MIPS32R6O0-LABEL: AtomicSwap8: 3902; MIPS32R6O0: # %bb.0: # %entry 3903; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 3904; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 3905; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 3906; MIPS32R6O0-NEXT: addu $1, $2, $25 3907; MIPS32R6O0-NEXT: # kill: def $v0 killed $a0 3908; MIPS32R6O0-NEXT: lw $1, %got(y)($1) 3909; MIPS32R6O0-NEXT: addiu $2, $zero, -4 3910; MIPS32R6O0-NEXT: and $5, $1, $2 3911; MIPS32R6O0-NEXT: andi $1, $1, 3 3912; MIPS32R6O0-NEXT: sll $9, $1, 3 3913; MIPS32R6O0-NEXT: ori $1, $zero, 255 3914; MIPS32R6O0-NEXT: sllv $7, $1, $9 3915; MIPS32R6O0-NEXT: nor $8, $zero, $7 3916; MIPS32R6O0-NEXT: sllv $6, $4, $9 3917; MIPS32R6O0-NEXT: $BB11_1: # %entry 3918; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 3919; MIPS32R6O0-NEXT: ll $2, 0($5) 3920; MIPS32R6O0-NEXT: and $3, $6, $7 3921; MIPS32R6O0-NEXT: and $4, $2, $8 3922; MIPS32R6O0-NEXT: or $4, $4, $3 3923; MIPS32R6O0-NEXT: sc $4, 0($5) 3924; MIPS32R6O0-NEXT: beqzc $4, $BB11_1 3925; MIPS32R6O0-NEXT: # %bb.2: # %entry 3926; MIPS32R6O0-NEXT: and $1, $2, $7 3927; MIPS32R6O0-NEXT: srlv $1, $1, $9 3928; MIPS32R6O0-NEXT: seb $1, $1 3929; MIPS32R6O0-NEXT: # %bb.3: # %entry 3930; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 3931; MIPS32R6O0-NEXT: # %bb.4: # %entry 3932; MIPS32R6O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 3933; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 3934; MIPS32R6O0-NEXT: jrc $ra 3935; 3936; MIPS4-LABEL: AtomicSwap8: 3937; MIPS4: # %bb.0: # %entry 3938; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 3939; MIPS4-NEXT: daddu $1, $1, $25 3940; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 3941; MIPS4-NEXT: ld $1, %got_disp(y)($1) 3942; MIPS4-NEXT: daddiu $2, $zero, -4 3943; MIPS4-NEXT: and $3, $1, $2 3944; MIPS4-NEXT: andi $1, $1, 3 3945; MIPS4-NEXT: sll $1, $1, 3 3946; MIPS4-NEXT: ori $2, $zero, 255 3947; MIPS4-NEXT: sllv $5, $2, $1 3948; MIPS4-NEXT: nor $6, $zero, $5 3949; MIPS4-NEXT: sllv $4, $4, $1 3950; MIPS4-NEXT: .LBB11_1: # %entry 3951; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 3952; MIPS4-NEXT: ll $7, 0($3) 3953; MIPS4-NEXT: and $8, $4, $5 3954; MIPS4-NEXT: and $9, $7, $6 3955; MIPS4-NEXT: or $9, $9, $8 3956; MIPS4-NEXT: sc $9, 0($3) 3957; MIPS4-NEXT: beqz $9, .LBB11_1 3958; MIPS4-NEXT: nop 3959; MIPS4-NEXT: # %bb.2: # %entry 3960; MIPS4-NEXT: and $2, $7, $5 3961; MIPS4-NEXT: srlv $2, $2, $1 3962; MIPS4-NEXT: sll $2, $2, 24 3963; MIPS4-NEXT: sra $2, $2, 24 3964; MIPS4-NEXT: # %bb.3: # %entry 3965; MIPS4-NEXT: jr $ra 3966; MIPS4-NEXT: nop 3967; 3968; MIPS64-LABEL: AtomicSwap8: 3969; MIPS64: # %bb.0: # %entry 3970; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 3971; MIPS64-NEXT: daddu $1, $1, $25 3972; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 3973; MIPS64-NEXT: ld $1, %got_disp(y)($1) 3974; MIPS64-NEXT: daddiu $2, $zero, -4 3975; MIPS64-NEXT: and $3, $1, $2 3976; MIPS64-NEXT: andi $1, $1, 3 3977; MIPS64-NEXT: sll $1, $1, 3 3978; MIPS64-NEXT: ori $2, $zero, 255 3979; MIPS64-NEXT: sllv $5, $2, $1 3980; MIPS64-NEXT: nor $6, $zero, $5 3981; MIPS64-NEXT: sllv $4, $4, $1 3982; MIPS64-NEXT: .LBB11_1: # %entry 3983; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 3984; MIPS64-NEXT: ll $7, 0($3) 3985; MIPS64-NEXT: and $8, $4, $5 3986; MIPS64-NEXT: and $9, $7, $6 3987; MIPS64-NEXT: or $9, $9, $8 3988; MIPS64-NEXT: sc $9, 0($3) 3989; MIPS64-NEXT: beqz $9, .LBB11_1 3990; MIPS64-NEXT: nop 3991; MIPS64-NEXT: # %bb.2: # %entry 3992; MIPS64-NEXT: and $2, $7, $5 3993; MIPS64-NEXT: srlv $2, $2, $1 3994; MIPS64-NEXT: sll $2, $2, 24 3995; MIPS64-NEXT: sra $2, $2, 24 3996; MIPS64-NEXT: # %bb.3: # %entry 3997; MIPS64-NEXT: jr $ra 3998; MIPS64-NEXT: nop 3999; 4000; MIPS64R2-LABEL: AtomicSwap8: 4001; MIPS64R2: # %bb.0: # %entry 4002; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4003; MIPS64R2-NEXT: daddu $1, $1, $25 4004; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4005; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 4006; MIPS64R2-NEXT: daddiu $2, $zero, -4 4007; MIPS64R2-NEXT: and $3, $1, $2 4008; MIPS64R2-NEXT: andi $1, $1, 3 4009; MIPS64R2-NEXT: sll $1, $1, 3 4010; MIPS64R2-NEXT: ori $2, $zero, 255 4011; MIPS64R2-NEXT: sllv $5, $2, $1 4012; MIPS64R2-NEXT: nor $6, $zero, $5 4013; MIPS64R2-NEXT: sllv $4, $4, $1 4014; MIPS64R2-NEXT: .LBB11_1: # %entry 4015; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 4016; MIPS64R2-NEXT: ll $7, 0($3) 4017; MIPS64R2-NEXT: and $8, $4, $5 4018; MIPS64R2-NEXT: and $9, $7, $6 4019; MIPS64R2-NEXT: or $9, $9, $8 4020; MIPS64R2-NEXT: sc $9, 0($3) 4021; MIPS64R2-NEXT: beqz $9, .LBB11_1 4022; MIPS64R2-NEXT: nop 4023; MIPS64R2-NEXT: # %bb.2: # %entry 4024; MIPS64R2-NEXT: and $2, $7, $5 4025; MIPS64R2-NEXT: srlv $2, $2, $1 4026; MIPS64R2-NEXT: seb $2, $2 4027; MIPS64R2-NEXT: # %bb.3: # %entry 4028; MIPS64R2-NEXT: jr $ra 4029; MIPS64R2-NEXT: nop 4030; 4031; MIPS64R6-LABEL: AtomicSwap8: 4032; MIPS64R6: # %bb.0: # %entry 4033; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4034; MIPS64R6-NEXT: daddu $1, $1, $25 4035; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4036; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 4037; MIPS64R6-NEXT: daddiu $2, $zero, -4 4038; MIPS64R6-NEXT: and $3, $1, $2 4039; MIPS64R6-NEXT: andi $1, $1, 3 4040; MIPS64R6-NEXT: sll $1, $1, 3 4041; MIPS64R6-NEXT: ori $2, $zero, 255 4042; MIPS64R6-NEXT: sllv $5, $2, $1 4043; MIPS64R6-NEXT: nor $6, $zero, $5 4044; MIPS64R6-NEXT: sllv $4, $4, $1 4045; MIPS64R6-NEXT: .LBB11_1: # %entry 4046; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 4047; MIPS64R6-NEXT: ll $7, 0($3) 4048; MIPS64R6-NEXT: and $8, $4, $5 4049; MIPS64R6-NEXT: and $9, $7, $6 4050; MIPS64R6-NEXT: or $9, $9, $8 4051; MIPS64R6-NEXT: sc $9, 0($3) 4052; MIPS64R6-NEXT: beqzc $9, .LBB11_1 4053; MIPS64R6-NEXT: # %bb.2: # %entry 4054; MIPS64R6-NEXT: and $2, $7, $5 4055; MIPS64R6-NEXT: srlv $2, $2, $1 4056; MIPS64R6-NEXT: seb $2, $2 4057; MIPS64R6-NEXT: # %bb.3: # %entry 4058; MIPS64R6-NEXT: jrc $ra 4059; 4060; MIPS64R6O0-LABEL: AtomicSwap8: 4061; MIPS64R6O0: # %bb.0: # %entry 4062; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 4063; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap8))) 4064; MIPS64R6O0-NEXT: daddu $1, $1, $25 4065; MIPS64R6O0-NEXT: daddiu $2, $1, %lo(%neg(%gp_rel(AtomicSwap8))) 4066; MIPS64R6O0-NEXT: move $1, $4 4067; MIPS64R6O0-NEXT: ld $2, %got_disp(y)($2) 4068; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 4069; MIPS64R6O0-NEXT: and $5, $2, $3 4070; MIPS64R6O0-NEXT: andi $2, $2, 3 4071; MIPS64R6O0-NEXT: xori $2, $2, 3 4072; MIPS64R6O0-NEXT: sll $9, $2, 3 4073; MIPS64R6O0-NEXT: ori $2, $zero, 255 4074; MIPS64R6O0-NEXT: sllv $7, $2, $9 4075; MIPS64R6O0-NEXT: nor $8, $zero, $7 4076; MIPS64R6O0-NEXT: sllv $6, $1, $9 4077; MIPS64R6O0-NEXT: .LBB11_1: # %entry 4078; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4079; MIPS64R6O0-NEXT: ll $2, 0($5) 4080; MIPS64R6O0-NEXT: and $3, $6, $7 4081; MIPS64R6O0-NEXT: and $4, $2, $8 4082; MIPS64R6O0-NEXT: or $4, $4, $3 4083; MIPS64R6O0-NEXT: sc $4, 0($5) 4084; MIPS64R6O0-NEXT: beqzc $4, .LBB11_1 4085; MIPS64R6O0-NEXT: # %bb.2: # %entry 4086; MIPS64R6O0-NEXT: and $1, $2, $7 4087; MIPS64R6O0-NEXT: srlv $1, $1, $9 4088; MIPS64R6O0-NEXT: seb $1, $1 4089; MIPS64R6O0-NEXT: # %bb.3: # %entry 4090; MIPS64R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 4091; MIPS64R6O0-NEXT: # %bb.4: # %entry 4092; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 4093; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 4094; MIPS64R6O0-NEXT: jrc $ra 4095; 4096; MM32-LABEL: AtomicSwap8: 4097; MM32: # %bb.0: # %entry 4098; MM32-NEXT: lui $2, %hi(_gp_disp) 4099; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 4100; MM32-NEXT: addu $2, $2, $25 4101; MM32-NEXT: lw $1, %got(y)($2) 4102; MM32-NEXT: addiu $2, $zero, -4 4103; MM32-NEXT: and $3, $1, $2 4104; MM32-NEXT: andi $1, $1, 3 4105; MM32-NEXT: sll $1, $1, 3 4106; MM32-NEXT: ori $2, $zero, 255 4107; MM32-NEXT: sllv $5, $2, $1 4108; MM32-NEXT: nor $6, $zero, $5 4109; MM32-NEXT: sllv $4, $4, $1 4110; MM32-NEXT: $BB11_1: # %entry 4111; MM32-NEXT: # =>This Inner Loop Header: Depth=1 4112; MM32-NEXT: ll $7, 0($3) 4113; MM32-NEXT: and $8, $4, $5 4114; MM32-NEXT: and $9, $7, $6 4115; MM32-NEXT: or $9, $9, $8 4116; MM32-NEXT: sc $9, 0($3) 4117; MM32-NEXT: beqzc $9, $BB11_1 4118; MM32-NEXT: # %bb.2: # %entry 4119; MM32-NEXT: and $2, $7, $5 4120; MM32-NEXT: srlv $2, $2, $1 4121; MM32-NEXT: seb $2, $2 4122; MM32-NEXT: # %bb.3: # %entry 4123; MM32-NEXT: jrc $ra 4124; 4125; O1-LABEL: AtomicSwap8: 4126; O1: # %bb.0: # %entry 4127; O1-NEXT: lui $2, %hi(_gp_disp) 4128; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 4129; O1-NEXT: addu $1, $2, $25 4130; O1-NEXT: lw $1, %got(y)($1) 4131; O1-NEXT: addiu $2, $zero, -4 4132; O1-NEXT: and $3, $1, $2 4133; O1-NEXT: andi $1, $1, 3 4134; O1-NEXT: sll $1, $1, 3 4135; O1-NEXT: ori $2, $zero, 255 4136; O1-NEXT: sllv $5, $2, $1 4137; O1-NEXT: nor $6, $zero, $5 4138; O1-NEXT: sllv $4, $4, $1 4139; O1-NEXT: $BB11_1: # %entry 4140; O1-NEXT: # =>This Inner Loop Header: Depth=1 4141; O1-NEXT: ll $7, 0($3) 4142; O1-NEXT: and $8, $4, $5 4143; O1-NEXT: and $9, $7, $6 4144; O1-NEXT: or $9, $9, $8 4145; O1-NEXT: sc $9, 0($3) 4146; O1-NEXT: beqz $9, $BB11_1 4147; O1-NEXT: nop 4148; O1-NEXT: # %bb.2: # %entry 4149; O1-NEXT: and $2, $7, $5 4150; O1-NEXT: srlv $2, $2, $1 4151; O1-NEXT: sll $2, $2, 24 4152; O1-NEXT: sra $2, $2, 24 4153; O1-NEXT: # %bb.3: # %entry 4154; O1-NEXT: jr $ra 4155; O1-NEXT: nop 4156; 4157; O2-LABEL: AtomicSwap8: 4158; O2: # %bb.0: # %entry 4159; O2-NEXT: lui $2, %hi(_gp_disp) 4160; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 4161; O2-NEXT: addu $1, $2, $25 4162; O2-NEXT: lw $1, %got(y)($1) 4163; O2-NEXT: addiu $2, $zero, -4 4164; O2-NEXT: and $3, $1, $2 4165; O2-NEXT: andi $1, $1, 3 4166; O2-NEXT: sll $1, $1, 3 4167; O2-NEXT: ori $2, $zero, 255 4168; O2-NEXT: sllv $5, $2, $1 4169; O2-NEXT: nor $6, $zero, $5 4170; O2-NEXT: sllv $4, $4, $1 4171; O2-NEXT: $BB11_1: # %entry 4172; O2-NEXT: # =>This Inner Loop Header: Depth=1 4173; O2-NEXT: ll $7, 0($3) 4174; O2-NEXT: and $8, $4, $5 4175; O2-NEXT: and $9, $7, $6 4176; O2-NEXT: or $9, $9, $8 4177; O2-NEXT: sc $9, 0($3) 4178; O2-NEXT: beqz $9, $BB11_1 4179; O2-NEXT: nop 4180; O2-NEXT: # %bb.2: # %entry 4181; O2-NEXT: and $2, $7, $5 4182; O2-NEXT: srlv $2, $2, $1 4183; O2-NEXT: sll $2, $2, 24 4184; O2-NEXT: sra $2, $2, 24 4185; O2-NEXT: # %bb.3: # %entry 4186; O2-NEXT: jr $ra 4187; O2-NEXT: nop 4188; 4189; O3-LABEL: AtomicSwap8: 4190; O3: # %bb.0: # %entry 4191; O3-NEXT: lui $2, %hi(_gp_disp) 4192; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 4193; O3-NEXT: addu $1, $2, $25 4194; O3-NEXT: addiu $2, $zero, -4 4195; O3-NEXT: lw $1, %got(y)($1) 4196; O3-NEXT: and $3, $1, $2 4197; O3-NEXT: andi $1, $1, 3 4198; O3-NEXT: ori $2, $zero, 255 4199; O3-NEXT: sll $1, $1, 3 4200; O3-NEXT: sllv $5, $2, $1 4201; O3-NEXT: sllv $4, $4, $1 4202; O3-NEXT: nor $6, $zero, $5 4203; O3-NEXT: $BB11_1: # %entry 4204; O3-NEXT: # =>This Inner Loop Header: Depth=1 4205; O3-NEXT: ll $7, 0($3) 4206; O3-NEXT: and $8, $4, $5 4207; O3-NEXT: and $9, $7, $6 4208; O3-NEXT: or $9, $9, $8 4209; O3-NEXT: sc $9, 0($3) 4210; O3-NEXT: beqz $9, $BB11_1 4211; O3-NEXT: nop 4212; O3-NEXT: # %bb.2: # %entry 4213; O3-NEXT: and $2, $7, $5 4214; O3-NEXT: srlv $2, $2, $1 4215; O3-NEXT: sll $2, $2, 24 4216; O3-NEXT: sra $2, $2, 24 4217; O3-NEXT: # %bb.3: # %entry 4218; O3-NEXT: jr $ra 4219; O3-NEXT: nop 4220; 4221; MIPS32EB-LABEL: AtomicSwap8: 4222; MIPS32EB: # %bb.0: # %entry 4223; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 4224; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 4225; MIPS32EB-NEXT: addu $1, $2, $25 4226; MIPS32EB-NEXT: lw $1, %got(y)($1) 4227; MIPS32EB-NEXT: addiu $2, $zero, -4 4228; MIPS32EB-NEXT: and $3, $1, $2 4229; MIPS32EB-NEXT: andi $1, $1, 3 4230; MIPS32EB-NEXT: xori $1, $1, 3 4231; MIPS32EB-NEXT: sll $1, $1, 3 4232; MIPS32EB-NEXT: ori $2, $zero, 255 4233; MIPS32EB-NEXT: sllv $5, $2, $1 4234; MIPS32EB-NEXT: nor $6, $zero, $5 4235; MIPS32EB-NEXT: sllv $4, $4, $1 4236; MIPS32EB-NEXT: $BB11_1: # %entry 4237; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 4238; MIPS32EB-NEXT: ll $7, 0($3) 4239; MIPS32EB-NEXT: and $8, $4, $5 4240; MIPS32EB-NEXT: and $9, $7, $6 4241; MIPS32EB-NEXT: or $9, $9, $8 4242; MIPS32EB-NEXT: sc $9, 0($3) 4243; MIPS32EB-NEXT: beqz $9, $BB11_1 4244; MIPS32EB-NEXT: nop 4245; MIPS32EB-NEXT: # %bb.2: # %entry 4246; MIPS32EB-NEXT: and $2, $7, $5 4247; MIPS32EB-NEXT: srlv $2, $2, $1 4248; MIPS32EB-NEXT: sll $2, $2, 24 4249; MIPS32EB-NEXT: sra $2, $2, 24 4250; MIPS32EB-NEXT: # %bb.3: # %entry 4251; MIPS32EB-NEXT: jr $ra 4252; MIPS32EB-NEXT: nop 4253entry: 4254 %0 = atomicrmw xchg ptr @y, i8 %newval monotonic 4255 ret i8 %0 4256} 4257 4258define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind { 4259; MIPS32-LABEL: AtomicCmpSwap8: 4260; MIPS32: # %bb.0: # %entry 4261; MIPS32-NEXT: lui $2, %hi(_gp_disp) 4262; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 4263; MIPS32-NEXT: addu $1, $2, $25 4264; MIPS32-NEXT: lw $1, %got(y)($1) 4265; MIPS32-NEXT: addiu $2, $zero, -4 4266; MIPS32-NEXT: and $3, $1, $2 4267; MIPS32-NEXT: andi $1, $1, 3 4268; MIPS32-NEXT: sll $1, $1, 3 4269; MIPS32-NEXT: ori $2, $zero, 255 4270; MIPS32-NEXT: sllv $6, $2, $1 4271; MIPS32-NEXT: nor $7, $zero, $6 4272; MIPS32-NEXT: andi $2, $4, 255 4273; MIPS32-NEXT: sllv $4, $2, $1 4274; MIPS32-NEXT: andi $2, $5, 255 4275; MIPS32-NEXT: sllv $5, $2, $1 4276; MIPS32-NEXT: $BB12_1: # %entry 4277; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 4278; MIPS32-NEXT: ll $8, 0($3) 4279; MIPS32-NEXT: and $9, $8, $6 4280; MIPS32-NEXT: bne $9, $4, $BB12_3 4281; MIPS32-NEXT: nop 4282; MIPS32-NEXT: # %bb.2: # %entry 4283; MIPS32-NEXT: # in Loop: Header=BB12_1 Depth=1 4284; MIPS32-NEXT: and $8, $8, $7 4285; MIPS32-NEXT: or $8, $8, $5 4286; MIPS32-NEXT: sc $8, 0($3) 4287; MIPS32-NEXT: beqz $8, $BB12_1 4288; MIPS32-NEXT: nop 4289; MIPS32-NEXT: $BB12_3: # %entry 4290; MIPS32-NEXT: srlv $2, $9, $1 4291; MIPS32-NEXT: sll $2, $2, 24 4292; MIPS32-NEXT: sra $2, $2, 24 4293; MIPS32-NEXT: # %bb.4: # %entry 4294; MIPS32-NEXT: jr $ra 4295; MIPS32-NEXT: nop 4296; 4297; MIPS32O0-LABEL: AtomicCmpSwap8: 4298; MIPS32O0: # %bb.0: # %entry 4299; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 4300; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 4301; MIPS32O0-NEXT: addiu $sp, $sp, -8 4302; MIPS32O0-NEXT: addu $3, $2, $25 4303; MIPS32O0-NEXT: move $1, $5 4304; MIPS32O0-NEXT: move $2, $4 4305; MIPS32O0-NEXT: lw $3, %got(y)($3) 4306; MIPS32O0-NEXT: addiu $4, $zero, -4 4307; MIPS32O0-NEXT: and $4, $3, $4 4308; MIPS32O0-NEXT: andi $3, $3, 3 4309; MIPS32O0-NEXT: sll $9, $3, 3 4310; MIPS32O0-NEXT: ori $3, $zero, 255 4311; MIPS32O0-NEXT: sllv $5, $3, $9 4312; MIPS32O0-NEXT: nor $7, $zero, $5 4313; MIPS32O0-NEXT: andi $2, $2, 255 4314; MIPS32O0-NEXT: sllv $6, $2, $9 4315; MIPS32O0-NEXT: andi $1, $1, 255 4316; MIPS32O0-NEXT: sllv $8, $1, $9 4317; MIPS32O0-NEXT: $BB12_1: # %entry 4318; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 4319; MIPS32O0-NEXT: ll $2, 0($4) 4320; MIPS32O0-NEXT: and $3, $2, $5 4321; MIPS32O0-NEXT: bne $3, $6, $BB12_3 4322; MIPS32O0-NEXT: nop 4323; MIPS32O0-NEXT: # %bb.2: # %entry 4324; MIPS32O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4325; MIPS32O0-NEXT: and $2, $2, $7 4326; MIPS32O0-NEXT: or $2, $2, $8 4327; MIPS32O0-NEXT: sc $2, 0($4) 4328; MIPS32O0-NEXT: beqz $2, $BB12_1 4329; MIPS32O0-NEXT: nop 4330; MIPS32O0-NEXT: $BB12_3: # %entry 4331; MIPS32O0-NEXT: srlv $1, $3, $9 4332; MIPS32O0-NEXT: sll $1, $1, 24 4333; MIPS32O0-NEXT: sra $1, $1, 24 4334; MIPS32O0-NEXT: # %bb.4: # %entry 4335; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 4336; MIPS32O0-NEXT: # %bb.5: # %entry 4337; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 4338; MIPS32O0-NEXT: sll $1, $1, 24 4339; MIPS32O0-NEXT: sra $2, $1, 24 4340; MIPS32O0-NEXT: addiu $sp, $sp, 8 4341; MIPS32O0-NEXT: jr $ra 4342; MIPS32O0-NEXT: nop 4343; 4344; MIPS32R2-LABEL: AtomicCmpSwap8: 4345; MIPS32R2: # %bb.0: # %entry 4346; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 4347; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 4348; MIPS32R2-NEXT: addu $1, $2, $25 4349; MIPS32R2-NEXT: lw $1, %got(y)($1) 4350; MIPS32R2-NEXT: addiu $2, $zero, -4 4351; MIPS32R2-NEXT: and $3, $1, $2 4352; MIPS32R2-NEXT: andi $1, $1, 3 4353; MIPS32R2-NEXT: sll $1, $1, 3 4354; MIPS32R2-NEXT: ori $2, $zero, 255 4355; MIPS32R2-NEXT: sllv $6, $2, $1 4356; MIPS32R2-NEXT: nor $7, $zero, $6 4357; MIPS32R2-NEXT: andi $2, $4, 255 4358; MIPS32R2-NEXT: sllv $4, $2, $1 4359; MIPS32R2-NEXT: andi $2, $5, 255 4360; MIPS32R2-NEXT: sllv $5, $2, $1 4361; MIPS32R2-NEXT: $BB12_1: # %entry 4362; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 4363; MIPS32R2-NEXT: ll $8, 0($3) 4364; MIPS32R2-NEXT: and $9, $8, $6 4365; MIPS32R2-NEXT: bne $9, $4, $BB12_3 4366; MIPS32R2-NEXT: nop 4367; MIPS32R2-NEXT: # %bb.2: # %entry 4368; MIPS32R2-NEXT: # in Loop: Header=BB12_1 Depth=1 4369; MIPS32R2-NEXT: and $8, $8, $7 4370; MIPS32R2-NEXT: or $8, $8, $5 4371; MIPS32R2-NEXT: sc $8, 0($3) 4372; MIPS32R2-NEXT: beqz $8, $BB12_1 4373; MIPS32R2-NEXT: nop 4374; MIPS32R2-NEXT: $BB12_3: # %entry 4375; MIPS32R2-NEXT: srlv $2, $9, $1 4376; MIPS32R2-NEXT: seb $2, $2 4377; MIPS32R2-NEXT: # %bb.4: # %entry 4378; MIPS32R2-NEXT: jr $ra 4379; MIPS32R2-NEXT: nop 4380; 4381; MIPS32R6-LABEL: AtomicCmpSwap8: 4382; MIPS32R6: # %bb.0: # %entry 4383; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 4384; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 4385; MIPS32R6-NEXT: addu $1, $2, $25 4386; MIPS32R6-NEXT: lw $1, %got(y)($1) 4387; MIPS32R6-NEXT: addiu $2, $zero, -4 4388; MIPS32R6-NEXT: and $3, $1, $2 4389; MIPS32R6-NEXT: andi $1, $1, 3 4390; MIPS32R6-NEXT: sll $1, $1, 3 4391; MIPS32R6-NEXT: ori $2, $zero, 255 4392; MIPS32R6-NEXT: sllv $6, $2, $1 4393; MIPS32R6-NEXT: nor $7, $zero, $6 4394; MIPS32R6-NEXT: andi $2, $4, 255 4395; MIPS32R6-NEXT: sllv $4, $2, $1 4396; MIPS32R6-NEXT: andi $2, $5, 255 4397; MIPS32R6-NEXT: sllv $5, $2, $1 4398; MIPS32R6-NEXT: $BB12_1: # %entry 4399; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 4400; MIPS32R6-NEXT: ll $8, 0($3) 4401; MIPS32R6-NEXT: and $9, $8, $6 4402; MIPS32R6-NEXT: bnec $9, $4, $BB12_3 4403; MIPS32R6-NEXT: # %bb.2: # %entry 4404; MIPS32R6-NEXT: # in Loop: Header=BB12_1 Depth=1 4405; MIPS32R6-NEXT: and $8, $8, $7 4406; MIPS32R6-NEXT: or $8, $8, $5 4407; MIPS32R6-NEXT: sc $8, 0($3) 4408; MIPS32R6-NEXT: beqzc $8, $BB12_1 4409; MIPS32R6-NEXT: $BB12_3: # %entry 4410; MIPS32R6-NEXT: srlv $2, $9, $1 4411; MIPS32R6-NEXT: seb $2, $2 4412; MIPS32R6-NEXT: # %bb.4: # %entry 4413; MIPS32R6-NEXT: jrc $ra 4414; 4415; MIPS32R6O0-LABEL: AtomicCmpSwap8: 4416; MIPS32R6O0: # %bb.0: # %entry 4417; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 4418; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 4419; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 4420; MIPS32R6O0-NEXT: addu $3, $2, $25 4421; MIPS32R6O0-NEXT: move $1, $5 4422; MIPS32R6O0-NEXT: move $2, $4 4423; MIPS32R6O0-NEXT: # kill: def $a1 killed $at 4424; MIPS32R6O0-NEXT: # kill: def $a0 killed $v0 4425; MIPS32R6O0-NEXT: lw $3, %got(y)($3) 4426; MIPS32R6O0-NEXT: addiu $4, $zero, -4 4427; MIPS32R6O0-NEXT: and $4, $3, $4 4428; MIPS32R6O0-NEXT: andi $3, $3, 3 4429; MIPS32R6O0-NEXT: sll $9, $3, 3 4430; MIPS32R6O0-NEXT: ori $3, $zero, 255 4431; MIPS32R6O0-NEXT: sllv $5, $3, $9 4432; MIPS32R6O0-NEXT: nor $7, $zero, $5 4433; MIPS32R6O0-NEXT: andi $2, $2, 255 4434; MIPS32R6O0-NEXT: sllv $6, $2, $9 4435; MIPS32R6O0-NEXT: andi $1, $1, 255 4436; MIPS32R6O0-NEXT: sllv $8, $1, $9 4437; MIPS32R6O0-NEXT: $BB12_1: # %entry 4438; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4439; MIPS32R6O0-NEXT: ll $2, 0($4) 4440; MIPS32R6O0-NEXT: and $3, $2, $5 4441; MIPS32R6O0-NEXT: bnec $3, $6, $BB12_3 4442; MIPS32R6O0-NEXT: # %bb.2: # %entry 4443; MIPS32R6O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4444; MIPS32R6O0-NEXT: and $2, $2, $7 4445; MIPS32R6O0-NEXT: or $2, $2, $8 4446; MIPS32R6O0-NEXT: sc $2, 0($4) 4447; MIPS32R6O0-NEXT: beqzc $2, $BB12_1 4448; MIPS32R6O0-NEXT: $BB12_3: # %entry 4449; MIPS32R6O0-NEXT: srlv $1, $3, $9 4450; MIPS32R6O0-NEXT: seb $1, $1 4451; MIPS32R6O0-NEXT: # %bb.4: # %entry 4452; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 4453; MIPS32R6O0-NEXT: # %bb.5: # %entry 4454; MIPS32R6O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 4455; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 4456; MIPS32R6O0-NEXT: jrc $ra 4457; 4458; MIPS4-LABEL: AtomicCmpSwap8: 4459; MIPS4: # %bb.0: # %entry 4460; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4461; MIPS4-NEXT: daddu $1, $1, $25 4462; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4463; MIPS4-NEXT: ld $1, %got_disp(y)($1) 4464; MIPS4-NEXT: daddiu $2, $zero, -4 4465; MIPS4-NEXT: and $3, $1, $2 4466; MIPS4-NEXT: andi $1, $1, 3 4467; MIPS4-NEXT: sll $1, $1, 3 4468; MIPS4-NEXT: ori $2, $zero, 255 4469; MIPS4-NEXT: sllv $6, $2, $1 4470; MIPS4-NEXT: nor $7, $zero, $6 4471; MIPS4-NEXT: andi $2, $4, 255 4472; MIPS4-NEXT: sllv $4, $2, $1 4473; MIPS4-NEXT: andi $2, $5, 255 4474; MIPS4-NEXT: sllv $5, $2, $1 4475; MIPS4-NEXT: .LBB12_1: # %entry 4476; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 4477; MIPS4-NEXT: ll $8, 0($3) 4478; MIPS4-NEXT: and $9, $8, $6 4479; MIPS4-NEXT: bne $9, $4, .LBB12_3 4480; MIPS4-NEXT: nop 4481; MIPS4-NEXT: # %bb.2: # %entry 4482; MIPS4-NEXT: # in Loop: Header=BB12_1 Depth=1 4483; MIPS4-NEXT: and $8, $8, $7 4484; MIPS4-NEXT: or $8, $8, $5 4485; MIPS4-NEXT: sc $8, 0($3) 4486; MIPS4-NEXT: beqz $8, .LBB12_1 4487; MIPS4-NEXT: nop 4488; MIPS4-NEXT: .LBB12_3: # %entry 4489; MIPS4-NEXT: srlv $2, $9, $1 4490; MIPS4-NEXT: sll $2, $2, 24 4491; MIPS4-NEXT: sra $2, $2, 24 4492; MIPS4-NEXT: # %bb.4: # %entry 4493; MIPS4-NEXT: jr $ra 4494; MIPS4-NEXT: nop 4495; 4496; MIPS64-LABEL: AtomicCmpSwap8: 4497; MIPS64: # %bb.0: # %entry 4498; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4499; MIPS64-NEXT: daddu $1, $1, $25 4500; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4501; MIPS64-NEXT: ld $1, %got_disp(y)($1) 4502; MIPS64-NEXT: daddiu $2, $zero, -4 4503; MIPS64-NEXT: and $3, $1, $2 4504; MIPS64-NEXT: andi $1, $1, 3 4505; MIPS64-NEXT: sll $1, $1, 3 4506; MIPS64-NEXT: ori $2, $zero, 255 4507; MIPS64-NEXT: sllv $6, $2, $1 4508; MIPS64-NEXT: nor $7, $zero, $6 4509; MIPS64-NEXT: andi $2, $4, 255 4510; MIPS64-NEXT: sllv $4, $2, $1 4511; MIPS64-NEXT: andi $2, $5, 255 4512; MIPS64-NEXT: sllv $5, $2, $1 4513; MIPS64-NEXT: .LBB12_1: # %entry 4514; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 4515; MIPS64-NEXT: ll $8, 0($3) 4516; MIPS64-NEXT: and $9, $8, $6 4517; MIPS64-NEXT: bne $9, $4, .LBB12_3 4518; MIPS64-NEXT: nop 4519; MIPS64-NEXT: # %bb.2: # %entry 4520; MIPS64-NEXT: # in Loop: Header=BB12_1 Depth=1 4521; MIPS64-NEXT: and $8, $8, $7 4522; MIPS64-NEXT: or $8, $8, $5 4523; MIPS64-NEXT: sc $8, 0($3) 4524; MIPS64-NEXT: beqz $8, .LBB12_1 4525; MIPS64-NEXT: nop 4526; MIPS64-NEXT: .LBB12_3: # %entry 4527; MIPS64-NEXT: srlv $2, $9, $1 4528; MIPS64-NEXT: sll $2, $2, 24 4529; MIPS64-NEXT: sra $2, $2, 24 4530; MIPS64-NEXT: # %bb.4: # %entry 4531; MIPS64-NEXT: jr $ra 4532; MIPS64-NEXT: nop 4533; 4534; MIPS64R2-LABEL: AtomicCmpSwap8: 4535; MIPS64R2: # %bb.0: # %entry 4536; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4537; MIPS64R2-NEXT: daddu $1, $1, $25 4538; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4539; MIPS64R2-NEXT: ld $1, %got_disp(y)($1) 4540; MIPS64R2-NEXT: daddiu $2, $zero, -4 4541; MIPS64R2-NEXT: and $3, $1, $2 4542; MIPS64R2-NEXT: andi $1, $1, 3 4543; MIPS64R2-NEXT: sll $1, $1, 3 4544; MIPS64R2-NEXT: ori $2, $zero, 255 4545; MIPS64R2-NEXT: sllv $6, $2, $1 4546; MIPS64R2-NEXT: nor $7, $zero, $6 4547; MIPS64R2-NEXT: andi $2, $4, 255 4548; MIPS64R2-NEXT: sllv $4, $2, $1 4549; MIPS64R2-NEXT: andi $2, $5, 255 4550; MIPS64R2-NEXT: sllv $5, $2, $1 4551; MIPS64R2-NEXT: .LBB12_1: # %entry 4552; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 4553; MIPS64R2-NEXT: ll $8, 0($3) 4554; MIPS64R2-NEXT: and $9, $8, $6 4555; MIPS64R2-NEXT: bne $9, $4, .LBB12_3 4556; MIPS64R2-NEXT: nop 4557; MIPS64R2-NEXT: # %bb.2: # %entry 4558; MIPS64R2-NEXT: # in Loop: Header=BB12_1 Depth=1 4559; MIPS64R2-NEXT: and $8, $8, $7 4560; MIPS64R2-NEXT: or $8, $8, $5 4561; MIPS64R2-NEXT: sc $8, 0($3) 4562; MIPS64R2-NEXT: beqz $8, .LBB12_1 4563; MIPS64R2-NEXT: nop 4564; MIPS64R2-NEXT: .LBB12_3: # %entry 4565; MIPS64R2-NEXT: srlv $2, $9, $1 4566; MIPS64R2-NEXT: seb $2, $2 4567; MIPS64R2-NEXT: # %bb.4: # %entry 4568; MIPS64R2-NEXT: jr $ra 4569; MIPS64R2-NEXT: nop 4570; 4571; MIPS64R6-LABEL: AtomicCmpSwap8: 4572; MIPS64R6: # %bb.0: # %entry 4573; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4574; MIPS64R6-NEXT: daddu $1, $1, $25 4575; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4576; MIPS64R6-NEXT: ld $1, %got_disp(y)($1) 4577; MIPS64R6-NEXT: daddiu $2, $zero, -4 4578; MIPS64R6-NEXT: and $3, $1, $2 4579; MIPS64R6-NEXT: andi $1, $1, 3 4580; MIPS64R6-NEXT: sll $1, $1, 3 4581; MIPS64R6-NEXT: ori $2, $zero, 255 4582; MIPS64R6-NEXT: sllv $6, $2, $1 4583; MIPS64R6-NEXT: nor $7, $zero, $6 4584; MIPS64R6-NEXT: andi $2, $4, 255 4585; MIPS64R6-NEXT: sllv $4, $2, $1 4586; MIPS64R6-NEXT: andi $2, $5, 255 4587; MIPS64R6-NEXT: sllv $5, $2, $1 4588; MIPS64R6-NEXT: .LBB12_1: # %entry 4589; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 4590; MIPS64R6-NEXT: ll $8, 0($3) 4591; MIPS64R6-NEXT: and $9, $8, $6 4592; MIPS64R6-NEXT: bnec $9, $4, .LBB12_3 4593; MIPS64R6-NEXT: # %bb.2: # %entry 4594; MIPS64R6-NEXT: # in Loop: Header=BB12_1 Depth=1 4595; MIPS64R6-NEXT: and $8, $8, $7 4596; MIPS64R6-NEXT: or $8, $8, $5 4597; MIPS64R6-NEXT: sc $8, 0($3) 4598; MIPS64R6-NEXT: beqzc $8, .LBB12_1 4599; MIPS64R6-NEXT: .LBB12_3: # %entry 4600; MIPS64R6-NEXT: srlv $2, $9, $1 4601; MIPS64R6-NEXT: seb $2, $2 4602; MIPS64R6-NEXT: # %bb.4: # %entry 4603; MIPS64R6-NEXT: jrc $ra 4604; 4605; MIPS64R6O0-LABEL: AtomicCmpSwap8: 4606; MIPS64R6O0: # %bb.0: # %entry 4607; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 4608; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8))) 4609; MIPS64R6O0-NEXT: daddu $1, $1, $25 4610; MIPS64R6O0-NEXT: daddiu $3, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8))) 4611; MIPS64R6O0-NEXT: move $1, $5 4612; MIPS64R6O0-NEXT: move $2, $4 4613; MIPS64R6O0-NEXT: ld $3, %got_disp(y)($3) 4614; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 4615; MIPS64R6O0-NEXT: and $4, $3, $4 4616; MIPS64R6O0-NEXT: andi $3, $3, 3 4617; MIPS64R6O0-NEXT: xori $3, $3, 3 4618; MIPS64R6O0-NEXT: sll $9, $3, 3 4619; MIPS64R6O0-NEXT: ori $3, $zero, 255 4620; MIPS64R6O0-NEXT: sllv $5, $3, $9 4621; MIPS64R6O0-NEXT: nor $7, $zero, $5 4622; MIPS64R6O0-NEXT: andi $2, $2, 255 4623; MIPS64R6O0-NEXT: sllv $6, $2, $9 4624; MIPS64R6O0-NEXT: andi $1, $1, 255 4625; MIPS64R6O0-NEXT: sllv $8, $1, $9 4626; MIPS64R6O0-NEXT: .LBB12_1: # %entry 4627; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 4628; MIPS64R6O0-NEXT: ll $2, 0($4) 4629; MIPS64R6O0-NEXT: and $3, $2, $5 4630; MIPS64R6O0-NEXT: bnec $3, $6, .LBB12_3 4631; MIPS64R6O0-NEXT: # %bb.2: # %entry 4632; MIPS64R6O0-NEXT: # in Loop: Header=BB12_1 Depth=1 4633; MIPS64R6O0-NEXT: and $2, $2, $7 4634; MIPS64R6O0-NEXT: or $2, $2, $8 4635; MIPS64R6O0-NEXT: sc $2, 0($4) 4636; MIPS64R6O0-NEXT: beqzc $2, .LBB12_1 4637; MIPS64R6O0-NEXT: .LBB12_3: # %entry 4638; MIPS64R6O0-NEXT: srlv $1, $3, $9 4639; MIPS64R6O0-NEXT: seb $1, $1 4640; MIPS64R6O0-NEXT: # %bb.4: # %entry 4641; MIPS64R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 4642; MIPS64R6O0-NEXT: # %bb.5: # %entry 4643; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 4644; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 4645; MIPS64R6O0-NEXT: jrc $ra 4646; 4647; MM32-LABEL: AtomicCmpSwap8: 4648; MM32: # %bb.0: # %entry 4649; MM32-NEXT: lui $2, %hi(_gp_disp) 4650; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 4651; MM32-NEXT: addu $2, $2, $25 4652; MM32-NEXT: lw $1, %got(y)($2) 4653; MM32-NEXT: addiu $2, $zero, -4 4654; MM32-NEXT: and $3, $1, $2 4655; MM32-NEXT: andi $1, $1, 3 4656; MM32-NEXT: sll $1, $1, 3 4657; MM32-NEXT: ori $2, $zero, 255 4658; MM32-NEXT: sllv $6, $2, $1 4659; MM32-NEXT: nor $7, $zero, $6 4660; MM32-NEXT: andi $2, $4, 255 4661; MM32-NEXT: sllv $4, $2, $1 4662; MM32-NEXT: andi $2, $5, 255 4663; MM32-NEXT: sllv $5, $2, $1 4664; MM32-NEXT: $BB12_1: # %entry 4665; MM32-NEXT: # =>This Inner Loop Header: Depth=1 4666; MM32-NEXT: ll $8, 0($3) 4667; MM32-NEXT: and $9, $8, $6 4668; MM32-NEXT: bne $9, $4, $BB12_3 4669; MM32-NEXT: nop 4670; MM32-NEXT: # %bb.2: # %entry 4671; MM32-NEXT: # in Loop: Header=BB12_1 Depth=1 4672; MM32-NEXT: and $8, $8, $7 4673; MM32-NEXT: or $8, $8, $5 4674; MM32-NEXT: sc $8, 0($3) 4675; MM32-NEXT: beqzc $8, $BB12_1 4676; MM32-NEXT: $BB12_3: # %entry 4677; MM32-NEXT: srlv $2, $9, $1 4678; MM32-NEXT: seb $2, $2 4679; MM32-NEXT: # %bb.4: # %entry 4680; MM32-NEXT: jrc $ra 4681; 4682; O1-LABEL: AtomicCmpSwap8: 4683; O1: # %bb.0: # %entry 4684; O1-NEXT: lui $2, %hi(_gp_disp) 4685; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 4686; O1-NEXT: addu $1, $2, $25 4687; O1-NEXT: lw $1, %got(y)($1) 4688; O1-NEXT: addiu $2, $zero, -4 4689; O1-NEXT: and $3, $1, $2 4690; O1-NEXT: andi $1, $1, 3 4691; O1-NEXT: sll $1, $1, 3 4692; O1-NEXT: ori $2, $zero, 255 4693; O1-NEXT: sllv $6, $2, $1 4694; O1-NEXT: nor $7, $zero, $6 4695; O1-NEXT: andi $2, $4, 255 4696; O1-NEXT: sllv $4, $2, $1 4697; O1-NEXT: andi $2, $5, 255 4698; O1-NEXT: sllv $5, $2, $1 4699; O1-NEXT: $BB12_1: # %entry 4700; O1-NEXT: # =>This Inner Loop Header: Depth=1 4701; O1-NEXT: ll $8, 0($3) 4702; O1-NEXT: and $9, $8, $6 4703; O1-NEXT: bne $9, $4, $BB12_3 4704; O1-NEXT: nop 4705; O1-NEXT: # %bb.2: # %entry 4706; O1-NEXT: # in Loop: Header=BB12_1 Depth=1 4707; O1-NEXT: and $8, $8, $7 4708; O1-NEXT: or $8, $8, $5 4709; O1-NEXT: sc $8, 0($3) 4710; O1-NEXT: beqz $8, $BB12_1 4711; O1-NEXT: nop 4712; O1-NEXT: $BB12_3: # %entry 4713; O1-NEXT: srlv $2, $9, $1 4714; O1-NEXT: sll $2, $2, 24 4715; O1-NEXT: sra $2, $2, 24 4716; O1-NEXT: # %bb.4: # %entry 4717; O1-NEXT: jr $ra 4718; O1-NEXT: nop 4719; 4720; O2-LABEL: AtomicCmpSwap8: 4721; O2: # %bb.0: # %entry 4722; O2-NEXT: lui $2, %hi(_gp_disp) 4723; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 4724; O2-NEXT: addu $1, $2, $25 4725; O2-NEXT: lw $1, %got(y)($1) 4726; O2-NEXT: addiu $2, $zero, -4 4727; O2-NEXT: and $3, $1, $2 4728; O2-NEXT: andi $1, $1, 3 4729; O2-NEXT: sll $1, $1, 3 4730; O2-NEXT: ori $2, $zero, 255 4731; O2-NEXT: sllv $6, $2, $1 4732; O2-NEXT: nor $7, $zero, $6 4733; O2-NEXT: andi $2, $4, 255 4734; O2-NEXT: sllv $4, $2, $1 4735; O2-NEXT: andi $2, $5, 255 4736; O2-NEXT: sllv $5, $2, $1 4737; O2-NEXT: $BB12_1: # %entry 4738; O2-NEXT: # =>This Inner Loop Header: Depth=1 4739; O2-NEXT: ll $8, 0($3) 4740; O2-NEXT: and $9, $8, $6 4741; O2-NEXT: bne $9, $4, $BB12_3 4742; O2-NEXT: nop 4743; O2-NEXT: # %bb.2: # %entry 4744; O2-NEXT: # in Loop: Header=BB12_1 Depth=1 4745; O2-NEXT: and $8, $8, $7 4746; O2-NEXT: or $8, $8, $5 4747; O2-NEXT: sc $8, 0($3) 4748; O2-NEXT: beqz $8, $BB12_1 4749; O2-NEXT: nop 4750; O2-NEXT: $BB12_3: # %entry 4751; O2-NEXT: srlv $2, $9, $1 4752; O2-NEXT: sll $2, $2, 24 4753; O2-NEXT: sra $2, $2, 24 4754; O2-NEXT: # %bb.4: # %entry 4755; O2-NEXT: jr $ra 4756; O2-NEXT: nop 4757; 4758; O3-LABEL: AtomicCmpSwap8: 4759; O3: # %bb.0: # %entry 4760; O3-NEXT: lui $2, %hi(_gp_disp) 4761; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 4762; O3-NEXT: addu $1, $2, $25 4763; O3-NEXT: addiu $2, $zero, -4 4764; O3-NEXT: lw $1, %got(y)($1) 4765; O3-NEXT: and $3, $1, $2 4766; O3-NEXT: andi $1, $1, 3 4767; O3-NEXT: ori $2, $zero, 255 4768; O3-NEXT: sll $1, $1, 3 4769; O3-NEXT: sllv $6, $2, $1 4770; O3-NEXT: andi $2, $4, 255 4771; O3-NEXT: sllv $4, $2, $1 4772; O3-NEXT: andi $2, $5, 255 4773; O3-NEXT: nor $7, $zero, $6 4774; O3-NEXT: sllv $5, $2, $1 4775; O3-NEXT: $BB12_1: # %entry 4776; O3-NEXT: # =>This Inner Loop Header: Depth=1 4777; O3-NEXT: ll $8, 0($3) 4778; O3-NEXT: and $9, $8, $6 4779; O3-NEXT: bne $9, $4, $BB12_3 4780; O3-NEXT: nop 4781; O3-NEXT: # %bb.2: # %entry 4782; O3-NEXT: # in Loop: Header=BB12_1 Depth=1 4783; O3-NEXT: and $8, $8, $7 4784; O3-NEXT: or $8, $8, $5 4785; O3-NEXT: sc $8, 0($3) 4786; O3-NEXT: beqz $8, $BB12_1 4787; O3-NEXT: nop 4788; O3-NEXT: $BB12_3: # %entry 4789; O3-NEXT: srlv $2, $9, $1 4790; O3-NEXT: sll $2, $2, 24 4791; O3-NEXT: sra $2, $2, 24 4792; O3-NEXT: # %bb.4: # %entry 4793; O3-NEXT: jr $ra 4794; O3-NEXT: nop 4795; 4796; MIPS32EB-LABEL: AtomicCmpSwap8: 4797; MIPS32EB: # %bb.0: # %entry 4798; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 4799; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 4800; MIPS32EB-NEXT: addu $1, $2, $25 4801; MIPS32EB-NEXT: lw $1, %got(y)($1) 4802; MIPS32EB-NEXT: addiu $2, $zero, -4 4803; MIPS32EB-NEXT: and $3, $1, $2 4804; MIPS32EB-NEXT: andi $1, $1, 3 4805; MIPS32EB-NEXT: xori $1, $1, 3 4806; MIPS32EB-NEXT: sll $1, $1, 3 4807; MIPS32EB-NEXT: ori $2, $zero, 255 4808; MIPS32EB-NEXT: sllv $6, $2, $1 4809; MIPS32EB-NEXT: nor $7, $zero, $6 4810; MIPS32EB-NEXT: andi $2, $4, 255 4811; MIPS32EB-NEXT: sllv $4, $2, $1 4812; MIPS32EB-NEXT: andi $2, $5, 255 4813; MIPS32EB-NEXT: sllv $5, $2, $1 4814; MIPS32EB-NEXT: $BB12_1: # %entry 4815; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 4816; MIPS32EB-NEXT: ll $8, 0($3) 4817; MIPS32EB-NEXT: and $9, $8, $6 4818; MIPS32EB-NEXT: bne $9, $4, $BB12_3 4819; MIPS32EB-NEXT: nop 4820; MIPS32EB-NEXT: # %bb.2: # %entry 4821; MIPS32EB-NEXT: # in Loop: Header=BB12_1 Depth=1 4822; MIPS32EB-NEXT: and $8, $8, $7 4823; MIPS32EB-NEXT: or $8, $8, $5 4824; MIPS32EB-NEXT: sc $8, 0($3) 4825; MIPS32EB-NEXT: beqz $8, $BB12_1 4826; MIPS32EB-NEXT: nop 4827; MIPS32EB-NEXT: $BB12_3: # %entry 4828; MIPS32EB-NEXT: srlv $2, $9, $1 4829; MIPS32EB-NEXT: sll $2, $2, 24 4830; MIPS32EB-NEXT: sra $2, $2, 24 4831; MIPS32EB-NEXT: # %bb.4: # %entry 4832; MIPS32EB-NEXT: jr $ra 4833; MIPS32EB-NEXT: nop 4834entry: 4835 %pair0 = cmpxchg ptr @y, i8 %oldval, i8 %newval monotonic monotonic 4836 %0 = extractvalue { i8, i1 } %pair0, 0 4837 ret i8 %0 4838} 4839 4840define i1 @AtomicCmpSwapRes8(ptr %ptr, i8 signext %oldval, i8 signext %newval) nounwind { 4841; MIPS32-LABEL: AtomicCmpSwapRes8: 4842; MIPS32: # %bb.0: # %entry 4843; MIPS32-NEXT: addiu $1, $zero, -4 4844; MIPS32-NEXT: and $2, $4, $1 4845; MIPS32-NEXT: andi $1, $4, 3 4846; MIPS32-NEXT: sll $3, $1, 3 4847; MIPS32-NEXT: ori $1, $zero, 255 4848; MIPS32-NEXT: sllv $4, $1, $3 4849; MIPS32-NEXT: nor $7, $zero, $4 4850; MIPS32-NEXT: andi $1, $5, 255 4851; MIPS32-NEXT: sllv $8, $1, $3 4852; MIPS32-NEXT: andi $1, $6, 255 4853; MIPS32-NEXT: sllv $6, $1, $3 4854; MIPS32-NEXT: $BB13_1: # %entry 4855; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 4856; MIPS32-NEXT: ll $9, 0($2) 4857; MIPS32-NEXT: and $10, $9, $4 4858; MIPS32-NEXT: bne $10, $8, $BB13_3 4859; MIPS32-NEXT: nop 4860; MIPS32-NEXT: # %bb.2: # %entry 4861; MIPS32-NEXT: # in Loop: Header=BB13_1 Depth=1 4862; MIPS32-NEXT: and $9, $9, $7 4863; MIPS32-NEXT: or $9, $9, $6 4864; MIPS32-NEXT: sc $9, 0($2) 4865; MIPS32-NEXT: beqz $9, $BB13_1 4866; MIPS32-NEXT: nop 4867; MIPS32-NEXT: $BB13_3: # %entry 4868; MIPS32-NEXT: srlv $1, $10, $3 4869; MIPS32-NEXT: sll $1, $1, 24 4870; MIPS32-NEXT: sra $1, $1, 24 4871; MIPS32-NEXT: # %bb.4: # %entry 4872; MIPS32-NEXT: xor $1, $1, $5 4873; MIPS32-NEXT: jr $ra 4874; MIPS32-NEXT: sltiu $2, $1, 1 4875; 4876; MIPS32O0-LABEL: AtomicCmpSwapRes8: 4877; MIPS32O0: # %bb.0: # %entry 4878; MIPS32O0-NEXT: addiu $sp, $sp, -8 4879; MIPS32O0-NEXT: move $1, $6 4880; MIPS32O0-NEXT: move $2, $5 4881; MIPS32O0-NEXT: move $3, $4 4882; MIPS32O0-NEXT: sw $2, 0($sp) # 4-byte Folded Spill 4883; MIPS32O0-NEXT: addiu $4, $zero, -4 4884; MIPS32O0-NEXT: and $4, $3, $4 4885; MIPS32O0-NEXT: andi $3, $3, 3 4886; MIPS32O0-NEXT: sll $9, $3, 3 4887; MIPS32O0-NEXT: ori $3, $zero, 255 4888; MIPS32O0-NEXT: sllv $5, $3, $9 4889; MIPS32O0-NEXT: nor $7, $zero, $5 4890; MIPS32O0-NEXT: andi $2, $2, 255 4891; MIPS32O0-NEXT: sllv $6, $2, $9 4892; MIPS32O0-NEXT: andi $1, $1, 255 4893; MIPS32O0-NEXT: sllv $8, $1, $9 4894; MIPS32O0-NEXT: $BB13_1: # %entry 4895; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 4896; MIPS32O0-NEXT: ll $2, 0($4) 4897; MIPS32O0-NEXT: and $3, $2, $5 4898; MIPS32O0-NEXT: bne $3, $6, $BB13_3 4899; MIPS32O0-NEXT: nop 4900; MIPS32O0-NEXT: # %bb.2: # %entry 4901; MIPS32O0-NEXT: # in Loop: Header=BB13_1 Depth=1 4902; MIPS32O0-NEXT: and $2, $2, $7 4903; MIPS32O0-NEXT: or $2, $2, $8 4904; MIPS32O0-NEXT: sc $2, 0($4) 4905; MIPS32O0-NEXT: beqz $2, $BB13_1 4906; MIPS32O0-NEXT: nop 4907; MIPS32O0-NEXT: $BB13_3: # %entry 4908; MIPS32O0-NEXT: srlv $1, $3, $9 4909; MIPS32O0-NEXT: sll $1, $1, 24 4910; MIPS32O0-NEXT: sra $1, $1, 24 4911; MIPS32O0-NEXT: # %bb.4: # %entry 4912; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 4913; MIPS32O0-NEXT: # %bb.5: # %entry 4914; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 4915; MIPS32O0-NEXT: lw $2, 0($sp) # 4-byte Folded Reload 4916; MIPS32O0-NEXT: sll $2, $2, 24 4917; MIPS32O0-NEXT: sra $2, $2, 24 4918; MIPS32O0-NEXT: xor $1, $1, $2 4919; MIPS32O0-NEXT: sltiu $2, $1, 1 4920; MIPS32O0-NEXT: addiu $sp, $sp, 8 4921; MIPS32O0-NEXT: jr $ra 4922; MIPS32O0-NEXT: nop 4923; 4924; MIPS32R2-LABEL: AtomicCmpSwapRes8: 4925; MIPS32R2: # %bb.0: # %entry 4926; MIPS32R2-NEXT: addiu $1, $zero, -4 4927; MIPS32R2-NEXT: and $2, $4, $1 4928; MIPS32R2-NEXT: andi $1, $4, 3 4929; MIPS32R2-NEXT: sll $3, $1, 3 4930; MIPS32R2-NEXT: ori $1, $zero, 255 4931; MIPS32R2-NEXT: sllv $4, $1, $3 4932; MIPS32R2-NEXT: nor $7, $zero, $4 4933; MIPS32R2-NEXT: andi $1, $5, 255 4934; MIPS32R2-NEXT: sllv $8, $1, $3 4935; MIPS32R2-NEXT: andi $1, $6, 255 4936; MIPS32R2-NEXT: sllv $6, $1, $3 4937; MIPS32R2-NEXT: $BB13_1: # %entry 4938; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 4939; MIPS32R2-NEXT: ll $9, 0($2) 4940; MIPS32R2-NEXT: and $10, $9, $4 4941; MIPS32R2-NEXT: bne $10, $8, $BB13_3 4942; MIPS32R2-NEXT: nop 4943; MIPS32R2-NEXT: # %bb.2: # %entry 4944; MIPS32R2-NEXT: # in Loop: Header=BB13_1 Depth=1 4945; MIPS32R2-NEXT: and $9, $9, $7 4946; MIPS32R2-NEXT: or $9, $9, $6 4947; MIPS32R2-NEXT: sc $9, 0($2) 4948; MIPS32R2-NEXT: beqz $9, $BB13_1 4949; MIPS32R2-NEXT: nop 4950; MIPS32R2-NEXT: $BB13_3: # %entry 4951; MIPS32R2-NEXT: srlv $1, $10, $3 4952; MIPS32R2-NEXT: seb $1, $1 4953; MIPS32R2-NEXT: # %bb.4: # %entry 4954; MIPS32R2-NEXT: xor $1, $1, $5 4955; MIPS32R2-NEXT: jr $ra 4956; MIPS32R2-NEXT: sltiu $2, $1, 1 4957; 4958; MIPS32R6-LABEL: AtomicCmpSwapRes8: 4959; MIPS32R6: # %bb.0: # %entry 4960; MIPS32R6-NEXT: addiu $1, $zero, -4 4961; MIPS32R6-NEXT: and $2, $4, $1 4962; MIPS32R6-NEXT: andi $1, $4, 3 4963; MIPS32R6-NEXT: sll $3, $1, 3 4964; MIPS32R6-NEXT: ori $1, $zero, 255 4965; MIPS32R6-NEXT: sllv $4, $1, $3 4966; MIPS32R6-NEXT: nor $7, $zero, $4 4967; MIPS32R6-NEXT: andi $1, $5, 255 4968; MIPS32R6-NEXT: sllv $8, $1, $3 4969; MIPS32R6-NEXT: andi $1, $6, 255 4970; MIPS32R6-NEXT: sllv $6, $1, $3 4971; MIPS32R6-NEXT: $BB13_1: # %entry 4972; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 4973; MIPS32R6-NEXT: ll $9, 0($2) 4974; MIPS32R6-NEXT: and $10, $9, $4 4975; MIPS32R6-NEXT: bnec $10, $8, $BB13_3 4976; MIPS32R6-NEXT: # %bb.2: # %entry 4977; MIPS32R6-NEXT: # in Loop: Header=BB13_1 Depth=1 4978; MIPS32R6-NEXT: and $9, $9, $7 4979; MIPS32R6-NEXT: or $9, $9, $6 4980; MIPS32R6-NEXT: sc $9, 0($2) 4981; MIPS32R6-NEXT: beqzc $9, $BB13_1 4982; MIPS32R6-NEXT: $BB13_3: # %entry 4983; MIPS32R6-NEXT: srlv $1, $10, $3 4984; MIPS32R6-NEXT: seb $1, $1 4985; MIPS32R6-NEXT: # %bb.4: # %entry 4986; MIPS32R6-NEXT: xor $1, $1, $5 4987; MIPS32R6-NEXT: jr $ra 4988; MIPS32R6-NEXT: sltiu $2, $1, 1 4989; 4990; MIPS32R6O0-LABEL: AtomicCmpSwapRes8: 4991; MIPS32R6O0: # %bb.0: # %entry 4992; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 4993; MIPS32R6O0-NEXT: move $1, $6 4994; MIPS32R6O0-NEXT: move $2, $5 4995; MIPS32R6O0-NEXT: sw $2, 0($sp) # 4-byte Folded Spill 4996; MIPS32R6O0-NEXT: move $3, $4 4997; MIPS32R6O0-NEXT: # kill: def $a2 killed $at 4998; MIPS32R6O0-NEXT: # kill: def $a1 killed $v0 4999; MIPS32R6O0-NEXT: addiu $4, $zero, -4 5000; MIPS32R6O0-NEXT: and $4, $3, $4 5001; MIPS32R6O0-NEXT: andi $3, $3, 3 5002; MIPS32R6O0-NEXT: sll $9, $3, 3 5003; MIPS32R6O0-NEXT: ori $3, $zero, 255 5004; MIPS32R6O0-NEXT: sllv $5, $3, $9 5005; MIPS32R6O0-NEXT: nor $7, $zero, $5 5006; MIPS32R6O0-NEXT: andi $2, $2, 255 5007; MIPS32R6O0-NEXT: sllv $6, $2, $9 5008; MIPS32R6O0-NEXT: andi $1, $1, 255 5009; MIPS32R6O0-NEXT: sllv $8, $1, $9 5010; MIPS32R6O0-NEXT: $BB13_1: # %entry 5011; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5012; MIPS32R6O0-NEXT: ll $2, 0($4) 5013; MIPS32R6O0-NEXT: and $3, $2, $5 5014; MIPS32R6O0-NEXT: bnec $3, $6, $BB13_3 5015; MIPS32R6O0-NEXT: # %bb.2: # %entry 5016; MIPS32R6O0-NEXT: # in Loop: Header=BB13_1 Depth=1 5017; MIPS32R6O0-NEXT: and $2, $2, $7 5018; MIPS32R6O0-NEXT: or $2, $2, $8 5019; MIPS32R6O0-NEXT: sc $2, 0($4) 5020; MIPS32R6O0-NEXT: beqzc $2, $BB13_1 5021; MIPS32R6O0-NEXT: $BB13_3: # %entry 5022; MIPS32R6O0-NEXT: srlv $1, $3, $9 5023; MIPS32R6O0-NEXT: seb $1, $1 5024; MIPS32R6O0-NEXT: # %bb.4: # %entry 5025; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 5026; MIPS32R6O0-NEXT: # %bb.5: # %entry 5027; MIPS32R6O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 5028; MIPS32R6O0-NEXT: lw $2, 0($sp) # 4-byte Folded Reload 5029; MIPS32R6O0-NEXT: xor $1, $1, $2 5030; MIPS32R6O0-NEXT: sltiu $2, $1, 1 5031; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 5032; MIPS32R6O0-NEXT: jrc $ra 5033; 5034; MIPS4-LABEL: AtomicCmpSwapRes8: 5035; MIPS4: # %bb.0: # %entry 5036; MIPS4-NEXT: daddiu $1, $zero, -4 5037; MIPS4-NEXT: and $2, $4, $1 5038; MIPS4-NEXT: andi $1, $4, 3 5039; MIPS4-NEXT: sll $3, $1, 3 5040; MIPS4-NEXT: ori $1, $zero, 255 5041; MIPS4-NEXT: sllv $4, $1, $3 5042; MIPS4-NEXT: nor $7, $zero, $4 5043; MIPS4-NEXT: andi $1, $5, 255 5044; MIPS4-NEXT: sllv $8, $1, $3 5045; MIPS4-NEXT: andi $1, $6, 255 5046; MIPS4-NEXT: sllv $6, $1, $3 5047; MIPS4-NEXT: .LBB13_1: # %entry 5048; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 5049; MIPS4-NEXT: ll $9, 0($2) 5050; MIPS4-NEXT: and $10, $9, $4 5051; MIPS4-NEXT: bne $10, $8, .LBB13_3 5052; MIPS4-NEXT: nop 5053; MIPS4-NEXT: # %bb.2: # %entry 5054; MIPS4-NEXT: # in Loop: Header=BB13_1 Depth=1 5055; MIPS4-NEXT: and $9, $9, $7 5056; MIPS4-NEXT: or $9, $9, $6 5057; MIPS4-NEXT: sc $9, 0($2) 5058; MIPS4-NEXT: beqz $9, .LBB13_1 5059; MIPS4-NEXT: nop 5060; MIPS4-NEXT: .LBB13_3: # %entry 5061; MIPS4-NEXT: srlv $1, $10, $3 5062; MIPS4-NEXT: sll $1, $1, 24 5063; MIPS4-NEXT: sra $1, $1, 24 5064; MIPS4-NEXT: # %bb.4: # %entry 5065; MIPS4-NEXT: xor $1, $1, $5 5066; MIPS4-NEXT: jr $ra 5067; MIPS4-NEXT: sltiu $2, $1, 1 5068; 5069; MIPS64-LABEL: AtomicCmpSwapRes8: 5070; MIPS64: # %bb.0: # %entry 5071; MIPS64-NEXT: daddiu $1, $zero, -4 5072; MIPS64-NEXT: and $2, $4, $1 5073; MIPS64-NEXT: andi $1, $4, 3 5074; MIPS64-NEXT: sll $3, $1, 3 5075; MIPS64-NEXT: ori $1, $zero, 255 5076; MIPS64-NEXT: sllv $4, $1, $3 5077; MIPS64-NEXT: nor $7, $zero, $4 5078; MIPS64-NEXT: andi $1, $5, 255 5079; MIPS64-NEXT: sllv $8, $1, $3 5080; MIPS64-NEXT: andi $1, $6, 255 5081; MIPS64-NEXT: sllv $6, $1, $3 5082; MIPS64-NEXT: .LBB13_1: # %entry 5083; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 5084; MIPS64-NEXT: ll $9, 0($2) 5085; MIPS64-NEXT: and $10, $9, $4 5086; MIPS64-NEXT: bne $10, $8, .LBB13_3 5087; MIPS64-NEXT: nop 5088; MIPS64-NEXT: # %bb.2: # %entry 5089; MIPS64-NEXT: # in Loop: Header=BB13_1 Depth=1 5090; MIPS64-NEXT: and $9, $9, $7 5091; MIPS64-NEXT: or $9, $9, $6 5092; MIPS64-NEXT: sc $9, 0($2) 5093; MIPS64-NEXT: beqz $9, .LBB13_1 5094; MIPS64-NEXT: nop 5095; MIPS64-NEXT: .LBB13_3: # %entry 5096; MIPS64-NEXT: srlv $1, $10, $3 5097; MIPS64-NEXT: sll $1, $1, 24 5098; MIPS64-NEXT: sra $1, $1, 24 5099; MIPS64-NEXT: # %bb.4: # %entry 5100; MIPS64-NEXT: xor $1, $1, $5 5101; MIPS64-NEXT: jr $ra 5102; MIPS64-NEXT: sltiu $2, $1, 1 5103; 5104; MIPS64R2-LABEL: AtomicCmpSwapRes8: 5105; MIPS64R2: # %bb.0: # %entry 5106; MIPS64R2-NEXT: daddiu $1, $zero, -4 5107; MIPS64R2-NEXT: and $2, $4, $1 5108; MIPS64R2-NEXT: andi $1, $4, 3 5109; MIPS64R2-NEXT: sll $3, $1, 3 5110; MIPS64R2-NEXT: ori $1, $zero, 255 5111; MIPS64R2-NEXT: sllv $4, $1, $3 5112; MIPS64R2-NEXT: nor $7, $zero, $4 5113; MIPS64R2-NEXT: andi $1, $5, 255 5114; MIPS64R2-NEXT: sllv $8, $1, $3 5115; MIPS64R2-NEXT: andi $1, $6, 255 5116; MIPS64R2-NEXT: sllv $6, $1, $3 5117; MIPS64R2-NEXT: .LBB13_1: # %entry 5118; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 5119; MIPS64R2-NEXT: ll $9, 0($2) 5120; MIPS64R2-NEXT: and $10, $9, $4 5121; MIPS64R2-NEXT: bne $10, $8, .LBB13_3 5122; MIPS64R2-NEXT: nop 5123; MIPS64R2-NEXT: # %bb.2: # %entry 5124; MIPS64R2-NEXT: # in Loop: Header=BB13_1 Depth=1 5125; MIPS64R2-NEXT: and $9, $9, $7 5126; MIPS64R2-NEXT: or $9, $9, $6 5127; MIPS64R2-NEXT: sc $9, 0($2) 5128; MIPS64R2-NEXT: beqz $9, .LBB13_1 5129; MIPS64R2-NEXT: nop 5130; MIPS64R2-NEXT: .LBB13_3: # %entry 5131; MIPS64R2-NEXT: srlv $1, $10, $3 5132; MIPS64R2-NEXT: seb $1, $1 5133; MIPS64R2-NEXT: # %bb.4: # %entry 5134; MIPS64R2-NEXT: xor $1, $1, $5 5135; MIPS64R2-NEXT: jr $ra 5136; MIPS64R2-NEXT: sltiu $2, $1, 1 5137; 5138; MIPS64R6-LABEL: AtomicCmpSwapRes8: 5139; MIPS64R6: # %bb.0: # %entry 5140; MIPS64R6-NEXT: daddiu $1, $zero, -4 5141; MIPS64R6-NEXT: and $2, $4, $1 5142; MIPS64R6-NEXT: andi $1, $4, 3 5143; MIPS64R6-NEXT: sll $3, $1, 3 5144; MIPS64R6-NEXT: ori $1, $zero, 255 5145; MIPS64R6-NEXT: sllv $4, $1, $3 5146; MIPS64R6-NEXT: nor $7, $zero, $4 5147; MIPS64R6-NEXT: andi $1, $5, 255 5148; MIPS64R6-NEXT: sllv $8, $1, $3 5149; MIPS64R6-NEXT: andi $1, $6, 255 5150; MIPS64R6-NEXT: sllv $6, $1, $3 5151; MIPS64R6-NEXT: .LBB13_1: # %entry 5152; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 5153; MIPS64R6-NEXT: ll $9, 0($2) 5154; MIPS64R6-NEXT: and $10, $9, $4 5155; MIPS64R6-NEXT: bnec $10, $8, .LBB13_3 5156; MIPS64R6-NEXT: # %bb.2: # %entry 5157; MIPS64R6-NEXT: # in Loop: Header=BB13_1 Depth=1 5158; MIPS64R6-NEXT: and $9, $9, $7 5159; MIPS64R6-NEXT: or $9, $9, $6 5160; MIPS64R6-NEXT: sc $9, 0($2) 5161; MIPS64R6-NEXT: beqzc $9, .LBB13_1 5162; MIPS64R6-NEXT: .LBB13_3: # %entry 5163; MIPS64R6-NEXT: srlv $1, $10, $3 5164; MIPS64R6-NEXT: seb $1, $1 5165; MIPS64R6-NEXT: # %bb.4: # %entry 5166; MIPS64R6-NEXT: xor $1, $1, $5 5167; MIPS64R6-NEXT: jr $ra 5168; MIPS64R6-NEXT: sltiu $2, $1, 1 5169; 5170; MIPS64R6O0-LABEL: AtomicCmpSwapRes8: 5171; MIPS64R6O0: # %bb.0: # %entry 5172; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 5173; MIPS64R6O0-NEXT: move $3, $4 5174; MIPS64R6O0-NEXT: move $1, $6 5175; MIPS64R6O0-NEXT: move $2, $5 5176; MIPS64R6O0-NEXT: sw $2, 8($sp) # 4-byte Folded Spill 5177; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 5178; MIPS64R6O0-NEXT: and $4, $3, $4 5179; MIPS64R6O0-NEXT: andi $3, $3, 3 5180; MIPS64R6O0-NEXT: xori $3, $3, 3 5181; MIPS64R6O0-NEXT: sll $9, $3, 3 5182; MIPS64R6O0-NEXT: ori $3, $zero, 255 5183; MIPS64R6O0-NEXT: sllv $5, $3, $9 5184; MIPS64R6O0-NEXT: nor $7, $zero, $5 5185; MIPS64R6O0-NEXT: andi $2, $2, 255 5186; MIPS64R6O0-NEXT: sllv $6, $2, $9 5187; MIPS64R6O0-NEXT: andi $1, $1, 255 5188; MIPS64R6O0-NEXT: sllv $8, $1, $9 5189; MIPS64R6O0-NEXT: .LBB13_1: # %entry 5190; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5191; MIPS64R6O0-NEXT: ll $2, 0($4) 5192; MIPS64R6O0-NEXT: and $3, $2, $5 5193; MIPS64R6O0-NEXT: bnec $3, $6, .LBB13_3 5194; MIPS64R6O0-NEXT: # %bb.2: # %entry 5195; MIPS64R6O0-NEXT: # in Loop: Header=BB13_1 Depth=1 5196; MIPS64R6O0-NEXT: and $2, $2, $7 5197; MIPS64R6O0-NEXT: or $2, $2, $8 5198; MIPS64R6O0-NEXT: sc $2, 0($4) 5199; MIPS64R6O0-NEXT: beqzc $2, .LBB13_1 5200; MIPS64R6O0-NEXT: .LBB13_3: # %entry 5201; MIPS64R6O0-NEXT: srlv $1, $3, $9 5202; MIPS64R6O0-NEXT: seb $1, $1 5203; MIPS64R6O0-NEXT: # %bb.4: # %entry 5204; MIPS64R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 5205; MIPS64R6O0-NEXT: # %bb.5: # %entry 5206; MIPS64R6O0-NEXT: lw $1, 12($sp) # 4-byte Folded Reload 5207; MIPS64R6O0-NEXT: lw $2, 8($sp) # 4-byte Folded Reload 5208; MIPS64R6O0-NEXT: xor $1, $1, $2 5209; MIPS64R6O0-NEXT: sltiu $2, $1, 1 5210; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 5211; MIPS64R6O0-NEXT: jrc $ra 5212; 5213; MM32-LABEL: AtomicCmpSwapRes8: 5214; MM32: # %bb.0: # %entry 5215; MM32-NEXT: addiu $1, $zero, -4 5216; MM32-NEXT: and $2, $4, $1 5217; MM32-NEXT: andi $1, $4, 3 5218; MM32-NEXT: sll $3, $1, 3 5219; MM32-NEXT: ori $1, $zero, 255 5220; MM32-NEXT: sllv $4, $1, $3 5221; MM32-NEXT: nor $7, $zero, $4 5222; MM32-NEXT: andi $1, $5, 255 5223; MM32-NEXT: sllv $8, $1, $3 5224; MM32-NEXT: andi $1, $6, 255 5225; MM32-NEXT: sllv $6, $1, $3 5226; MM32-NEXT: $BB13_1: # %entry 5227; MM32-NEXT: # =>This Inner Loop Header: Depth=1 5228; MM32-NEXT: ll $9, 0($2) 5229; MM32-NEXT: and $10, $9, $4 5230; MM32-NEXT: bne $10, $8, $BB13_3 5231; MM32-NEXT: nop 5232; MM32-NEXT: # %bb.2: # %entry 5233; MM32-NEXT: # in Loop: Header=BB13_1 Depth=1 5234; MM32-NEXT: and $9, $9, $7 5235; MM32-NEXT: or $9, $9, $6 5236; MM32-NEXT: sc $9, 0($2) 5237; MM32-NEXT: beqzc $9, $BB13_1 5238; MM32-NEXT: $BB13_3: # %entry 5239; MM32-NEXT: srlv $1, $10, $3 5240; MM32-NEXT: seb $1, $1 5241; MM32-NEXT: # %bb.4: # %entry 5242; MM32-NEXT: xor $1, $1, $5 5243; MM32-NEXT: jr $ra 5244; MM32-NEXT: sltiu $2, $1, 1 5245; 5246; O1-LABEL: AtomicCmpSwapRes8: 5247; O1: # %bb.0: # %entry 5248; O1-NEXT: addiu $1, $zero, -4 5249; O1-NEXT: and $2, $4, $1 5250; O1-NEXT: andi $1, $4, 3 5251; O1-NEXT: sll $3, $1, 3 5252; O1-NEXT: ori $1, $zero, 255 5253; O1-NEXT: sllv $4, $1, $3 5254; O1-NEXT: nor $7, $zero, $4 5255; O1-NEXT: andi $1, $5, 255 5256; O1-NEXT: sllv $8, $1, $3 5257; O1-NEXT: andi $1, $6, 255 5258; O1-NEXT: sllv $6, $1, $3 5259; O1-NEXT: $BB13_1: # %entry 5260; O1-NEXT: # =>This Inner Loop Header: Depth=1 5261; O1-NEXT: ll $9, 0($2) 5262; O1-NEXT: and $10, $9, $4 5263; O1-NEXT: bne $10, $8, $BB13_3 5264; O1-NEXT: nop 5265; O1-NEXT: # %bb.2: # %entry 5266; O1-NEXT: # in Loop: Header=BB13_1 Depth=1 5267; O1-NEXT: and $9, $9, $7 5268; O1-NEXT: or $9, $9, $6 5269; O1-NEXT: sc $9, 0($2) 5270; O1-NEXT: beqz $9, $BB13_1 5271; O1-NEXT: nop 5272; O1-NEXT: $BB13_3: # %entry 5273; O1-NEXT: srlv $1, $10, $3 5274; O1-NEXT: sll $1, $1, 24 5275; O1-NEXT: sra $1, $1, 24 5276; O1-NEXT: # %bb.4: # %entry 5277; O1-NEXT: xor $1, $1, $5 5278; O1-NEXT: jr $ra 5279; O1-NEXT: sltiu $2, $1, 1 5280; 5281; O2-LABEL: AtomicCmpSwapRes8: 5282; O2: # %bb.0: # %entry 5283; O2-NEXT: addiu $1, $zero, -4 5284; O2-NEXT: and $2, $4, $1 5285; O2-NEXT: andi $1, $4, 3 5286; O2-NEXT: sll $3, $1, 3 5287; O2-NEXT: ori $1, $zero, 255 5288; O2-NEXT: sllv $4, $1, $3 5289; O2-NEXT: nor $7, $zero, $4 5290; O2-NEXT: andi $1, $5, 255 5291; O2-NEXT: sllv $8, $1, $3 5292; O2-NEXT: andi $1, $6, 255 5293; O2-NEXT: sllv $6, $1, $3 5294; O2-NEXT: $BB13_1: # %entry 5295; O2-NEXT: # =>This Inner Loop Header: Depth=1 5296; O2-NEXT: ll $9, 0($2) 5297; O2-NEXT: and $10, $9, $4 5298; O2-NEXT: bne $10, $8, $BB13_3 5299; O2-NEXT: nop 5300; O2-NEXT: # %bb.2: # %entry 5301; O2-NEXT: # in Loop: Header=BB13_1 Depth=1 5302; O2-NEXT: and $9, $9, $7 5303; O2-NEXT: or $9, $9, $6 5304; O2-NEXT: sc $9, 0($2) 5305; O2-NEXT: beqz $9, $BB13_1 5306; O2-NEXT: nop 5307; O2-NEXT: $BB13_3: # %entry 5308; O2-NEXT: srlv $1, $10, $3 5309; O2-NEXT: sll $1, $1, 24 5310; O2-NEXT: sra $1, $1, 24 5311; O2-NEXT: # %bb.4: # %entry 5312; O2-NEXT: xor $1, $1, $5 5313; O2-NEXT: jr $ra 5314; O2-NEXT: sltiu $2, $1, 1 5315; 5316; O3-LABEL: AtomicCmpSwapRes8: 5317; O3: # %bb.0: # %entry 5318; O3-NEXT: addiu $1, $zero, -4 5319; O3-NEXT: and $2, $4, $1 5320; O3-NEXT: andi $1, $4, 3 5321; O3-NEXT: sll $3, $1, 3 5322; O3-NEXT: ori $1, $zero, 255 5323; O3-NEXT: sllv $4, $1, $3 5324; O3-NEXT: andi $1, $5, 255 5325; O3-NEXT: sllv $8, $1, $3 5326; O3-NEXT: andi $1, $6, 255 5327; O3-NEXT: nor $7, $zero, $4 5328; O3-NEXT: sllv $6, $1, $3 5329; O3-NEXT: $BB13_1: # %entry 5330; O3-NEXT: # =>This Inner Loop Header: Depth=1 5331; O3-NEXT: ll $9, 0($2) 5332; O3-NEXT: and $10, $9, $4 5333; O3-NEXT: bne $10, $8, $BB13_3 5334; O3-NEXT: nop 5335; O3-NEXT: # %bb.2: # %entry 5336; O3-NEXT: # in Loop: Header=BB13_1 Depth=1 5337; O3-NEXT: and $9, $9, $7 5338; O3-NEXT: or $9, $9, $6 5339; O3-NEXT: sc $9, 0($2) 5340; O3-NEXT: beqz $9, $BB13_1 5341; O3-NEXT: nop 5342; O3-NEXT: $BB13_3: # %entry 5343; O3-NEXT: srlv $1, $10, $3 5344; O3-NEXT: sll $1, $1, 24 5345; O3-NEXT: sra $1, $1, 24 5346; O3-NEXT: # %bb.4: # %entry 5347; O3-NEXT: xor $1, $1, $5 5348; O3-NEXT: jr $ra 5349; O3-NEXT: sltiu $2, $1, 1 5350; 5351; MIPS32EB-LABEL: AtomicCmpSwapRes8: 5352; MIPS32EB: # %bb.0: # %entry 5353; MIPS32EB-NEXT: addiu $1, $zero, -4 5354; MIPS32EB-NEXT: and $2, $4, $1 5355; MIPS32EB-NEXT: andi $1, $4, 3 5356; MIPS32EB-NEXT: xori $1, $1, 3 5357; MIPS32EB-NEXT: sll $3, $1, 3 5358; MIPS32EB-NEXT: ori $1, $zero, 255 5359; MIPS32EB-NEXT: sllv $4, $1, $3 5360; MIPS32EB-NEXT: nor $7, $zero, $4 5361; MIPS32EB-NEXT: andi $1, $5, 255 5362; MIPS32EB-NEXT: sllv $8, $1, $3 5363; MIPS32EB-NEXT: andi $1, $6, 255 5364; MIPS32EB-NEXT: sllv $6, $1, $3 5365; MIPS32EB-NEXT: $BB13_1: # %entry 5366; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 5367; MIPS32EB-NEXT: ll $9, 0($2) 5368; MIPS32EB-NEXT: and $10, $9, $4 5369; MIPS32EB-NEXT: bne $10, $8, $BB13_3 5370; MIPS32EB-NEXT: nop 5371; MIPS32EB-NEXT: # %bb.2: # %entry 5372; MIPS32EB-NEXT: # in Loop: Header=BB13_1 Depth=1 5373; MIPS32EB-NEXT: and $9, $9, $7 5374; MIPS32EB-NEXT: or $9, $9, $6 5375; MIPS32EB-NEXT: sc $9, 0($2) 5376; MIPS32EB-NEXT: beqz $9, $BB13_1 5377; MIPS32EB-NEXT: nop 5378; MIPS32EB-NEXT: $BB13_3: # %entry 5379; MIPS32EB-NEXT: srlv $1, $10, $3 5380; MIPS32EB-NEXT: sll $1, $1, 24 5381; MIPS32EB-NEXT: sra $1, $1, 24 5382; MIPS32EB-NEXT: # %bb.4: # %entry 5383; MIPS32EB-NEXT: xor $1, $1, $5 5384; MIPS32EB-NEXT: jr $ra 5385; MIPS32EB-NEXT: sltiu $2, $1, 1 5386entry: 5387 %0 = cmpxchg ptr %ptr, i8 %oldval, i8 %newval monotonic monotonic 5388 %1 = extractvalue { i8, i1 } %0, 1 5389 ret i1 %1 5390; FIXME: -march=mips produces a redundant sign extension here... 5391; FIXME: ...Leading to this split check. 5392 5393} 5394 5395; Check one i16 so that we cover the seh sign extend 5396@z = common global i16 0, align 1 5397 5398define signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind { 5399; MIPS32-LABEL: AtomicLoadAdd16: 5400; MIPS32: # %bb.0: # %entry 5401; MIPS32-NEXT: lui $2, %hi(_gp_disp) 5402; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 5403; MIPS32-NEXT: addu $1, $2, $25 5404; MIPS32-NEXT: lw $1, %got(z)($1) 5405; MIPS32-NEXT: addiu $2, $zero, -4 5406; MIPS32-NEXT: and $3, $1, $2 5407; MIPS32-NEXT: andi $1, $1, 3 5408; MIPS32-NEXT: sll $1, $1, 3 5409; MIPS32-NEXT: ori $2, $zero, 65535 5410; MIPS32-NEXT: sllv $5, $2, $1 5411; MIPS32-NEXT: nor $6, $zero, $5 5412; MIPS32-NEXT: sllv $4, $4, $1 5413; MIPS32-NEXT: $BB14_1: # %entry 5414; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 5415; MIPS32-NEXT: ll $7, 0($3) 5416; MIPS32-NEXT: addu $8, $7, $4 5417; MIPS32-NEXT: and $8, $8, $5 5418; MIPS32-NEXT: and $9, $7, $6 5419; MIPS32-NEXT: or $9, $9, $8 5420; MIPS32-NEXT: sc $9, 0($3) 5421; MIPS32-NEXT: beqz $9, $BB14_1 5422; MIPS32-NEXT: nop 5423; MIPS32-NEXT: # %bb.2: # %entry 5424; MIPS32-NEXT: and $2, $7, $5 5425; MIPS32-NEXT: srlv $2, $2, $1 5426; MIPS32-NEXT: sll $2, $2, 16 5427; MIPS32-NEXT: sra $2, $2, 16 5428; MIPS32-NEXT: # %bb.3: # %entry 5429; MIPS32-NEXT: jr $ra 5430; MIPS32-NEXT: nop 5431; 5432; MIPS32O0-LABEL: AtomicLoadAdd16: 5433; MIPS32O0: # %bb.0: # %entry 5434; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 5435; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 5436; MIPS32O0-NEXT: addiu $sp, $sp, -8 5437; MIPS32O0-NEXT: addu $1, $2, $25 5438; MIPS32O0-NEXT: lw $1, %got(z)($1) 5439; MIPS32O0-NEXT: addiu $2, $zero, -4 5440; MIPS32O0-NEXT: and $5, $1, $2 5441; MIPS32O0-NEXT: andi $1, $1, 3 5442; MIPS32O0-NEXT: sll $9, $1, 3 5443; MIPS32O0-NEXT: ori $1, $zero, 65535 5444; MIPS32O0-NEXT: sllv $7, $1, $9 5445; MIPS32O0-NEXT: nor $8, $zero, $7 5446; MIPS32O0-NEXT: sllv $6, $4, $9 5447; MIPS32O0-NEXT: $BB14_1: # %entry 5448; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 5449; MIPS32O0-NEXT: ll $2, 0($5) 5450; MIPS32O0-NEXT: addu $3, $2, $6 5451; MIPS32O0-NEXT: and $3, $3, $7 5452; MIPS32O0-NEXT: and $4, $2, $8 5453; MIPS32O0-NEXT: or $4, $4, $3 5454; MIPS32O0-NEXT: sc $4, 0($5) 5455; MIPS32O0-NEXT: beqz $4, $BB14_1 5456; MIPS32O0-NEXT: nop 5457; MIPS32O0-NEXT: # %bb.2: # %entry 5458; MIPS32O0-NEXT: and $1, $2, $7 5459; MIPS32O0-NEXT: srlv $1, $1, $9 5460; MIPS32O0-NEXT: sll $1, $1, 16 5461; MIPS32O0-NEXT: sra $1, $1, 16 5462; MIPS32O0-NEXT: # %bb.3: # %entry 5463; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 5464; MIPS32O0-NEXT: # %bb.4: # %entry 5465; MIPS32O0-NEXT: lw $1, 4($sp) # 4-byte Folded Reload 5466; MIPS32O0-NEXT: sll $1, $1, 16 5467; MIPS32O0-NEXT: sra $2, $1, 16 5468; MIPS32O0-NEXT: addiu $sp, $sp, 8 5469; MIPS32O0-NEXT: jr $ra 5470; MIPS32O0-NEXT: nop 5471; 5472; MIPS32R2-LABEL: AtomicLoadAdd16: 5473; MIPS32R2: # %bb.0: # %entry 5474; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 5475; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 5476; MIPS32R2-NEXT: addu $1, $2, $25 5477; MIPS32R2-NEXT: lw $1, %got(z)($1) 5478; MIPS32R2-NEXT: addiu $2, $zero, -4 5479; MIPS32R2-NEXT: and $3, $1, $2 5480; MIPS32R2-NEXT: andi $1, $1, 3 5481; MIPS32R2-NEXT: sll $1, $1, 3 5482; MIPS32R2-NEXT: ori $2, $zero, 65535 5483; MIPS32R2-NEXT: sllv $5, $2, $1 5484; MIPS32R2-NEXT: nor $6, $zero, $5 5485; MIPS32R2-NEXT: sllv $4, $4, $1 5486; MIPS32R2-NEXT: $BB14_1: # %entry 5487; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 5488; MIPS32R2-NEXT: ll $7, 0($3) 5489; MIPS32R2-NEXT: addu $8, $7, $4 5490; MIPS32R2-NEXT: and $8, $8, $5 5491; MIPS32R2-NEXT: and $9, $7, $6 5492; MIPS32R2-NEXT: or $9, $9, $8 5493; MIPS32R2-NEXT: sc $9, 0($3) 5494; MIPS32R2-NEXT: beqz $9, $BB14_1 5495; MIPS32R2-NEXT: nop 5496; MIPS32R2-NEXT: # %bb.2: # %entry 5497; MIPS32R2-NEXT: and $2, $7, $5 5498; MIPS32R2-NEXT: srlv $2, $2, $1 5499; MIPS32R2-NEXT: seh $2, $2 5500; MIPS32R2-NEXT: # %bb.3: # %entry 5501; MIPS32R2-NEXT: jr $ra 5502; MIPS32R2-NEXT: nop 5503; 5504; MIPS32R6-LABEL: AtomicLoadAdd16: 5505; MIPS32R6: # %bb.0: # %entry 5506; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 5507; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 5508; MIPS32R6-NEXT: addu $1, $2, $25 5509; MIPS32R6-NEXT: lw $1, %got(z)($1) 5510; MIPS32R6-NEXT: addiu $2, $zero, -4 5511; MIPS32R6-NEXT: and $3, $1, $2 5512; MIPS32R6-NEXT: andi $1, $1, 3 5513; MIPS32R6-NEXT: sll $1, $1, 3 5514; MIPS32R6-NEXT: ori $2, $zero, 65535 5515; MIPS32R6-NEXT: sllv $5, $2, $1 5516; MIPS32R6-NEXT: nor $6, $zero, $5 5517; MIPS32R6-NEXT: sllv $4, $4, $1 5518; MIPS32R6-NEXT: $BB14_1: # %entry 5519; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 5520; MIPS32R6-NEXT: ll $7, 0($3) 5521; MIPS32R6-NEXT: addu $8, $7, $4 5522; MIPS32R6-NEXT: and $8, $8, $5 5523; MIPS32R6-NEXT: and $9, $7, $6 5524; MIPS32R6-NEXT: or $9, $9, $8 5525; MIPS32R6-NEXT: sc $9, 0($3) 5526; MIPS32R6-NEXT: beqzc $9, $BB14_1 5527; MIPS32R6-NEXT: # %bb.2: # %entry 5528; MIPS32R6-NEXT: and $2, $7, $5 5529; MIPS32R6-NEXT: srlv $2, $2, $1 5530; MIPS32R6-NEXT: seh $2, $2 5531; MIPS32R6-NEXT: # %bb.3: # %entry 5532; MIPS32R6-NEXT: jrc $ra 5533; 5534; MIPS32R6O0-LABEL: AtomicLoadAdd16: 5535; MIPS32R6O0: # %bb.0: # %entry 5536; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 5537; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 5538; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 5539; MIPS32R6O0-NEXT: addu $1, $2, $25 5540; MIPS32R6O0-NEXT: # kill: def $v0 killed $a0 5541; MIPS32R6O0-NEXT: lw $1, %got(z)($1) 5542; MIPS32R6O0-NEXT: addiu $2, $zero, -4 5543; MIPS32R6O0-NEXT: and $5, $1, $2 5544; MIPS32R6O0-NEXT: andi $1, $1, 3 5545; MIPS32R6O0-NEXT: sll $9, $1, 3 5546; MIPS32R6O0-NEXT: ori $1, $zero, 65535 5547; MIPS32R6O0-NEXT: sllv $7, $1, $9 5548; MIPS32R6O0-NEXT: nor $8, $zero, $7 5549; MIPS32R6O0-NEXT: sllv $6, $4, $9 5550; MIPS32R6O0-NEXT: $BB14_1: # %entry 5551; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5552; MIPS32R6O0-NEXT: ll $2, 0($5) 5553; MIPS32R6O0-NEXT: addu $3, $2, $6 5554; MIPS32R6O0-NEXT: and $3, $3, $7 5555; MIPS32R6O0-NEXT: and $4, $2, $8 5556; MIPS32R6O0-NEXT: or $4, $4, $3 5557; MIPS32R6O0-NEXT: sc $4, 0($5) 5558; MIPS32R6O0-NEXT: beqzc $4, $BB14_1 5559; MIPS32R6O0-NEXT: # %bb.2: # %entry 5560; MIPS32R6O0-NEXT: and $1, $2, $7 5561; MIPS32R6O0-NEXT: srlv $1, $1, $9 5562; MIPS32R6O0-NEXT: seh $1, $1 5563; MIPS32R6O0-NEXT: # %bb.3: # %entry 5564; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 5565; MIPS32R6O0-NEXT: # %bb.4: # %entry 5566; MIPS32R6O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 5567; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 5568; MIPS32R6O0-NEXT: jrc $ra 5569; 5570; MIPS4-LABEL: AtomicLoadAdd16: 5571; MIPS4: # %bb.0: # %entry 5572; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5573; MIPS4-NEXT: daddu $1, $1, $25 5574; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5575; MIPS4-NEXT: ld $1, %got_disp(z)($1) 5576; MIPS4-NEXT: daddiu $2, $zero, -4 5577; MIPS4-NEXT: and $3, $1, $2 5578; MIPS4-NEXT: andi $1, $1, 3 5579; MIPS4-NEXT: sll $1, $1, 3 5580; MIPS4-NEXT: ori $2, $zero, 65535 5581; MIPS4-NEXT: sllv $5, $2, $1 5582; MIPS4-NEXT: nor $6, $zero, $5 5583; MIPS4-NEXT: sllv $4, $4, $1 5584; MIPS4-NEXT: .LBB14_1: # %entry 5585; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 5586; MIPS4-NEXT: ll $7, 0($3) 5587; MIPS4-NEXT: addu $8, $7, $4 5588; MIPS4-NEXT: and $8, $8, $5 5589; MIPS4-NEXT: and $9, $7, $6 5590; MIPS4-NEXT: or $9, $9, $8 5591; MIPS4-NEXT: sc $9, 0($3) 5592; MIPS4-NEXT: beqz $9, .LBB14_1 5593; MIPS4-NEXT: nop 5594; MIPS4-NEXT: # %bb.2: # %entry 5595; MIPS4-NEXT: and $2, $7, $5 5596; MIPS4-NEXT: srlv $2, $2, $1 5597; MIPS4-NEXT: sll $2, $2, 16 5598; MIPS4-NEXT: sra $2, $2, 16 5599; MIPS4-NEXT: # %bb.3: # %entry 5600; MIPS4-NEXT: jr $ra 5601; MIPS4-NEXT: nop 5602; 5603; MIPS64-LABEL: AtomicLoadAdd16: 5604; MIPS64: # %bb.0: # %entry 5605; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5606; MIPS64-NEXT: daddu $1, $1, $25 5607; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5608; MIPS64-NEXT: ld $1, %got_disp(z)($1) 5609; MIPS64-NEXT: daddiu $2, $zero, -4 5610; MIPS64-NEXT: and $3, $1, $2 5611; MIPS64-NEXT: andi $1, $1, 3 5612; MIPS64-NEXT: sll $1, $1, 3 5613; MIPS64-NEXT: ori $2, $zero, 65535 5614; MIPS64-NEXT: sllv $5, $2, $1 5615; MIPS64-NEXT: nor $6, $zero, $5 5616; MIPS64-NEXT: sllv $4, $4, $1 5617; MIPS64-NEXT: .LBB14_1: # %entry 5618; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 5619; MIPS64-NEXT: ll $7, 0($3) 5620; MIPS64-NEXT: addu $8, $7, $4 5621; MIPS64-NEXT: and $8, $8, $5 5622; MIPS64-NEXT: and $9, $7, $6 5623; MIPS64-NEXT: or $9, $9, $8 5624; MIPS64-NEXT: sc $9, 0($3) 5625; MIPS64-NEXT: beqz $9, .LBB14_1 5626; MIPS64-NEXT: nop 5627; MIPS64-NEXT: # %bb.2: # %entry 5628; MIPS64-NEXT: and $2, $7, $5 5629; MIPS64-NEXT: srlv $2, $2, $1 5630; MIPS64-NEXT: sll $2, $2, 16 5631; MIPS64-NEXT: sra $2, $2, 16 5632; MIPS64-NEXT: # %bb.3: # %entry 5633; MIPS64-NEXT: jr $ra 5634; MIPS64-NEXT: nop 5635; 5636; MIPS64R2-LABEL: AtomicLoadAdd16: 5637; MIPS64R2: # %bb.0: # %entry 5638; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5639; MIPS64R2-NEXT: daddu $1, $1, $25 5640; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5641; MIPS64R2-NEXT: ld $1, %got_disp(z)($1) 5642; MIPS64R2-NEXT: daddiu $2, $zero, -4 5643; MIPS64R2-NEXT: and $3, $1, $2 5644; MIPS64R2-NEXT: andi $1, $1, 3 5645; MIPS64R2-NEXT: sll $1, $1, 3 5646; MIPS64R2-NEXT: ori $2, $zero, 65535 5647; MIPS64R2-NEXT: sllv $5, $2, $1 5648; MIPS64R2-NEXT: nor $6, $zero, $5 5649; MIPS64R2-NEXT: sllv $4, $4, $1 5650; MIPS64R2-NEXT: .LBB14_1: # %entry 5651; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 5652; MIPS64R2-NEXT: ll $7, 0($3) 5653; MIPS64R2-NEXT: addu $8, $7, $4 5654; MIPS64R2-NEXT: and $8, $8, $5 5655; MIPS64R2-NEXT: and $9, $7, $6 5656; MIPS64R2-NEXT: or $9, $9, $8 5657; MIPS64R2-NEXT: sc $9, 0($3) 5658; MIPS64R2-NEXT: beqz $9, .LBB14_1 5659; MIPS64R2-NEXT: nop 5660; MIPS64R2-NEXT: # %bb.2: # %entry 5661; MIPS64R2-NEXT: and $2, $7, $5 5662; MIPS64R2-NEXT: srlv $2, $2, $1 5663; MIPS64R2-NEXT: seh $2, $2 5664; MIPS64R2-NEXT: # %bb.3: # %entry 5665; MIPS64R2-NEXT: jr $ra 5666; MIPS64R2-NEXT: nop 5667; 5668; MIPS64R6-LABEL: AtomicLoadAdd16: 5669; MIPS64R6: # %bb.0: # %entry 5670; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5671; MIPS64R6-NEXT: daddu $1, $1, $25 5672; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5673; MIPS64R6-NEXT: ld $1, %got_disp(z)($1) 5674; MIPS64R6-NEXT: daddiu $2, $zero, -4 5675; MIPS64R6-NEXT: and $3, $1, $2 5676; MIPS64R6-NEXT: andi $1, $1, 3 5677; MIPS64R6-NEXT: sll $1, $1, 3 5678; MIPS64R6-NEXT: ori $2, $zero, 65535 5679; MIPS64R6-NEXT: sllv $5, $2, $1 5680; MIPS64R6-NEXT: nor $6, $zero, $5 5681; MIPS64R6-NEXT: sllv $4, $4, $1 5682; MIPS64R6-NEXT: .LBB14_1: # %entry 5683; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 5684; MIPS64R6-NEXT: ll $7, 0($3) 5685; MIPS64R6-NEXT: addu $8, $7, $4 5686; MIPS64R6-NEXT: and $8, $8, $5 5687; MIPS64R6-NEXT: and $9, $7, $6 5688; MIPS64R6-NEXT: or $9, $9, $8 5689; MIPS64R6-NEXT: sc $9, 0($3) 5690; MIPS64R6-NEXT: beqzc $9, .LBB14_1 5691; MIPS64R6-NEXT: # %bb.2: # %entry 5692; MIPS64R6-NEXT: and $2, $7, $5 5693; MIPS64R6-NEXT: srlv $2, $2, $1 5694; MIPS64R6-NEXT: seh $2, $2 5695; MIPS64R6-NEXT: # %bb.3: # %entry 5696; MIPS64R6-NEXT: jrc $ra 5697; 5698; MIPS64R6O0-LABEL: AtomicLoadAdd16: 5699; MIPS64R6O0: # %bb.0: # %entry 5700; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 5701; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16))) 5702; MIPS64R6O0-NEXT: daddu $1, $1, $25 5703; MIPS64R6O0-NEXT: daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16))) 5704; MIPS64R6O0-NEXT: move $1, $4 5705; MIPS64R6O0-NEXT: ld $2, %got_disp(z)($2) 5706; MIPS64R6O0-NEXT: daddiu $3, $zero, -4 5707; MIPS64R6O0-NEXT: and $5, $2, $3 5708; MIPS64R6O0-NEXT: andi $2, $2, 3 5709; MIPS64R6O0-NEXT: xori $2, $2, 2 5710; MIPS64R6O0-NEXT: sll $9, $2, 3 5711; MIPS64R6O0-NEXT: ori $2, $zero, 65535 5712; MIPS64R6O0-NEXT: sllv $7, $2, $9 5713; MIPS64R6O0-NEXT: nor $8, $zero, $7 5714; MIPS64R6O0-NEXT: sllv $6, $1, $9 5715; MIPS64R6O0-NEXT: .LBB14_1: # %entry 5716; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 5717; MIPS64R6O0-NEXT: ll $2, 0($5) 5718; MIPS64R6O0-NEXT: addu $3, $2, $6 5719; MIPS64R6O0-NEXT: and $3, $3, $7 5720; MIPS64R6O0-NEXT: and $4, $2, $8 5721; MIPS64R6O0-NEXT: or $4, $4, $3 5722; MIPS64R6O0-NEXT: sc $4, 0($5) 5723; MIPS64R6O0-NEXT: beqzc $4, .LBB14_1 5724; MIPS64R6O0-NEXT: # %bb.2: # %entry 5725; MIPS64R6O0-NEXT: and $1, $2, $7 5726; MIPS64R6O0-NEXT: srlv $1, $1, $9 5727; MIPS64R6O0-NEXT: seh $1, $1 5728; MIPS64R6O0-NEXT: # %bb.3: # %entry 5729; MIPS64R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 5730; MIPS64R6O0-NEXT: # %bb.4: # %entry 5731; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 5732; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 5733; MIPS64R6O0-NEXT: jrc $ra 5734; 5735; MM32-LABEL: AtomicLoadAdd16: 5736; MM32: # %bb.0: # %entry 5737; MM32-NEXT: lui $2, %hi(_gp_disp) 5738; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 5739; MM32-NEXT: addu $2, $2, $25 5740; MM32-NEXT: lw $1, %got(z)($2) 5741; MM32-NEXT: addiu $2, $zero, -4 5742; MM32-NEXT: and $3, $1, $2 5743; MM32-NEXT: andi $1, $1, 3 5744; MM32-NEXT: sll $1, $1, 3 5745; MM32-NEXT: ori $2, $zero, 65535 5746; MM32-NEXT: sllv $5, $2, $1 5747; MM32-NEXT: nor $6, $zero, $5 5748; MM32-NEXT: sllv $4, $4, $1 5749; MM32-NEXT: $BB14_1: # %entry 5750; MM32-NEXT: # =>This Inner Loop Header: Depth=1 5751; MM32-NEXT: ll $7, 0($3) 5752; MM32-NEXT: addu $8, $7, $4 5753; MM32-NEXT: and $8, $8, $5 5754; MM32-NEXT: and $9, $7, $6 5755; MM32-NEXT: or $9, $9, $8 5756; MM32-NEXT: sc $9, 0($3) 5757; MM32-NEXT: beqzc $9, $BB14_1 5758; MM32-NEXT: # %bb.2: # %entry 5759; MM32-NEXT: and $2, $7, $5 5760; MM32-NEXT: srlv $2, $2, $1 5761; MM32-NEXT: seh $2, $2 5762; MM32-NEXT: # %bb.3: # %entry 5763; MM32-NEXT: jrc $ra 5764; 5765; O1-LABEL: AtomicLoadAdd16: 5766; O1: # %bb.0: # %entry 5767; O1-NEXT: lui $2, %hi(_gp_disp) 5768; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 5769; O1-NEXT: addu $1, $2, $25 5770; O1-NEXT: lw $1, %got(z)($1) 5771; O1-NEXT: addiu $2, $zero, -4 5772; O1-NEXT: and $3, $1, $2 5773; O1-NEXT: andi $1, $1, 3 5774; O1-NEXT: sll $1, $1, 3 5775; O1-NEXT: ori $2, $zero, 65535 5776; O1-NEXT: sllv $5, $2, $1 5777; O1-NEXT: nor $6, $zero, $5 5778; O1-NEXT: sllv $4, $4, $1 5779; O1-NEXT: $BB14_1: # %entry 5780; O1-NEXT: # =>This Inner Loop Header: Depth=1 5781; O1-NEXT: ll $7, 0($3) 5782; O1-NEXT: addu $8, $7, $4 5783; O1-NEXT: and $8, $8, $5 5784; O1-NEXT: and $9, $7, $6 5785; O1-NEXT: or $9, $9, $8 5786; O1-NEXT: sc $9, 0($3) 5787; O1-NEXT: beqz $9, $BB14_1 5788; O1-NEXT: nop 5789; O1-NEXT: # %bb.2: # %entry 5790; O1-NEXT: and $2, $7, $5 5791; O1-NEXT: srlv $2, $2, $1 5792; O1-NEXT: sll $2, $2, 16 5793; O1-NEXT: sra $2, $2, 16 5794; O1-NEXT: # %bb.3: # %entry 5795; O1-NEXT: jr $ra 5796; O1-NEXT: nop 5797; 5798; O2-LABEL: AtomicLoadAdd16: 5799; O2: # %bb.0: # %entry 5800; O2-NEXT: lui $2, %hi(_gp_disp) 5801; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 5802; O2-NEXT: addu $1, $2, $25 5803; O2-NEXT: lw $1, %got(z)($1) 5804; O2-NEXT: addiu $2, $zero, -4 5805; O2-NEXT: and $3, $1, $2 5806; O2-NEXT: andi $1, $1, 3 5807; O2-NEXT: sll $1, $1, 3 5808; O2-NEXT: ori $2, $zero, 65535 5809; O2-NEXT: sllv $5, $2, $1 5810; O2-NEXT: nor $6, $zero, $5 5811; O2-NEXT: sllv $4, $4, $1 5812; O2-NEXT: $BB14_1: # %entry 5813; O2-NEXT: # =>This Inner Loop Header: Depth=1 5814; O2-NEXT: ll $7, 0($3) 5815; O2-NEXT: addu $8, $7, $4 5816; O2-NEXT: and $8, $8, $5 5817; O2-NEXT: and $9, $7, $6 5818; O2-NEXT: or $9, $9, $8 5819; O2-NEXT: sc $9, 0($3) 5820; O2-NEXT: beqz $9, $BB14_1 5821; O2-NEXT: nop 5822; O2-NEXT: # %bb.2: # %entry 5823; O2-NEXT: and $2, $7, $5 5824; O2-NEXT: srlv $2, $2, $1 5825; O2-NEXT: sll $2, $2, 16 5826; O2-NEXT: sra $2, $2, 16 5827; O2-NEXT: # %bb.3: # %entry 5828; O2-NEXT: jr $ra 5829; O2-NEXT: nop 5830; 5831; O3-LABEL: AtomicLoadAdd16: 5832; O3: # %bb.0: # %entry 5833; O3-NEXT: lui $2, %hi(_gp_disp) 5834; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 5835; O3-NEXT: addu $1, $2, $25 5836; O3-NEXT: addiu $2, $zero, -4 5837; O3-NEXT: lw $1, %got(z)($1) 5838; O3-NEXT: and $3, $1, $2 5839; O3-NEXT: andi $1, $1, 3 5840; O3-NEXT: ori $2, $zero, 65535 5841; O3-NEXT: sll $1, $1, 3 5842; O3-NEXT: sllv $5, $2, $1 5843; O3-NEXT: sllv $4, $4, $1 5844; O3-NEXT: nor $6, $zero, $5 5845; O3-NEXT: $BB14_1: # %entry 5846; O3-NEXT: # =>This Inner Loop Header: Depth=1 5847; O3-NEXT: ll $7, 0($3) 5848; O3-NEXT: addu $8, $7, $4 5849; O3-NEXT: and $8, $8, $5 5850; O3-NEXT: and $9, $7, $6 5851; O3-NEXT: or $9, $9, $8 5852; O3-NEXT: sc $9, 0($3) 5853; O3-NEXT: beqz $9, $BB14_1 5854; O3-NEXT: nop 5855; O3-NEXT: # %bb.2: # %entry 5856; O3-NEXT: and $2, $7, $5 5857; O3-NEXT: srlv $2, $2, $1 5858; O3-NEXT: sll $2, $2, 16 5859; O3-NEXT: sra $2, $2, 16 5860; O3-NEXT: # %bb.3: # %entry 5861; O3-NEXT: jr $ra 5862; O3-NEXT: nop 5863; 5864; MIPS32EB-LABEL: AtomicLoadAdd16: 5865; MIPS32EB: # %bb.0: # %entry 5866; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 5867; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 5868; MIPS32EB-NEXT: addu $1, $2, $25 5869; MIPS32EB-NEXT: lw $1, %got(z)($1) 5870; MIPS32EB-NEXT: addiu $2, $zero, -4 5871; MIPS32EB-NEXT: and $3, $1, $2 5872; MIPS32EB-NEXT: andi $1, $1, 3 5873; MIPS32EB-NEXT: xori $1, $1, 2 5874; MIPS32EB-NEXT: sll $1, $1, 3 5875; MIPS32EB-NEXT: ori $2, $zero, 65535 5876; MIPS32EB-NEXT: sllv $5, $2, $1 5877; MIPS32EB-NEXT: nor $6, $zero, $5 5878; MIPS32EB-NEXT: sllv $4, $4, $1 5879; MIPS32EB-NEXT: $BB14_1: # %entry 5880; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 5881; MIPS32EB-NEXT: ll $7, 0($3) 5882; MIPS32EB-NEXT: addu $8, $7, $4 5883; MIPS32EB-NEXT: and $8, $8, $5 5884; MIPS32EB-NEXT: and $9, $7, $6 5885; MIPS32EB-NEXT: or $9, $9, $8 5886; MIPS32EB-NEXT: sc $9, 0($3) 5887; MIPS32EB-NEXT: beqz $9, $BB14_1 5888; MIPS32EB-NEXT: nop 5889; MIPS32EB-NEXT: # %bb.2: # %entry 5890; MIPS32EB-NEXT: and $2, $7, $5 5891; MIPS32EB-NEXT: srlv $2, $2, $1 5892; MIPS32EB-NEXT: sll $2, $2, 16 5893; MIPS32EB-NEXT: sra $2, $2, 16 5894; MIPS32EB-NEXT: # %bb.3: # %entry 5895; MIPS32EB-NEXT: jr $ra 5896; MIPS32EB-NEXT: nop 5897entry: 5898 %0 = atomicrmw add ptr @z, i16 %incr monotonic 5899 ret i16 %0 5900 5901} 5902 5903; Test that the i16 return value from cmpxchg is recognised as signed, 5904; so that setCC doesn't end up comparing an unsigned value to a signed 5905; value. 5906; The rest of the functions here are testing the atomic expansion, so 5907; we just match the end of the function. 5908define {i16, i1} @foo(ptr %addr, i16 %l, i16 %r, i16 %new) { 5909; MIPS32-LABEL: foo: 5910; MIPS32: # %bb.0: 5911; MIPS32-NEXT: addu $1, $5, $6 5912; MIPS32-NEXT: sync 5913; MIPS32-NEXT: addiu $2, $zero, -4 5914; MIPS32-NEXT: and $3, $4, $2 5915; MIPS32-NEXT: andi $2, $4, 3 5916; MIPS32-NEXT: sll $4, $2, 3 5917; MIPS32-NEXT: ori $2, $zero, 65535 5918; MIPS32-NEXT: sllv $5, $2, $4 5919; MIPS32-NEXT: nor $6, $zero, $5 5920; MIPS32-NEXT: andi $2, $1, 65535 5921; MIPS32-NEXT: sllv $8, $2, $4 5922; MIPS32-NEXT: andi $2, $7, 65535 5923; MIPS32-NEXT: sllv $7, $2, $4 5924; MIPS32-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 5925; MIPS32-NEXT: ll $9, 0($3) 5926; MIPS32-NEXT: and $10, $9, $5 5927; MIPS32-NEXT: bne $10, $8, $BB15_3 5928; MIPS32-NEXT: nop 5929; MIPS32-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 5930; MIPS32-NEXT: and $9, $9, $6 5931; MIPS32-NEXT: or $9, $9, $7 5932; MIPS32-NEXT: sc $9, 0($3) 5933; MIPS32-NEXT: beqz $9, $BB15_1 5934; MIPS32-NEXT: nop 5935; MIPS32-NEXT: $BB15_3: 5936; MIPS32-NEXT: srlv $2, $10, $4 5937; MIPS32-NEXT: sll $2, $2, 16 5938; MIPS32-NEXT: sra $2, $2, 16 5939; MIPS32-NEXT: # %bb.4: 5940; MIPS32-NEXT: sll $1, $1, 16 5941; MIPS32-NEXT: sra $1, $1, 16 5942; MIPS32-NEXT: xor $1, $2, $1 5943; MIPS32-NEXT: sltiu $3, $1, 1 5944; MIPS32-NEXT: sync 5945; MIPS32-NEXT: jr $ra 5946; MIPS32-NEXT: nop 5947; 5948; MIPS32O0-LABEL: foo: 5949; MIPS32O0: # %bb.0: 5950; MIPS32O0-NEXT: addiu $sp, $sp, -8 5951; MIPS32O0-NEXT: .cfi_def_cfa_offset 8 5952; MIPS32O0-NEXT: move $1, $7 5953; MIPS32O0-NEXT: move $3, $4 5954; MIPS32O0-NEXT: addu $2, $5, $6 5955; MIPS32O0-NEXT: sw $2, 0($sp) # 4-byte Folded Spill 5956; MIPS32O0-NEXT: sync 5957; MIPS32O0-NEXT: addiu $4, $zero, -4 5958; MIPS32O0-NEXT: and $4, $3, $4 5959; MIPS32O0-NEXT: andi $3, $3, 3 5960; MIPS32O0-NEXT: sll $9, $3, 3 5961; MIPS32O0-NEXT: ori $3, $zero, 65535 5962; MIPS32O0-NEXT: sllv $5, $3, $9 5963; MIPS32O0-NEXT: nor $7, $zero, $5 5964; MIPS32O0-NEXT: andi $2, $2, 65535 5965; MIPS32O0-NEXT: sllv $6, $2, $9 5966; MIPS32O0-NEXT: andi $1, $1, 65535 5967; MIPS32O0-NEXT: sllv $8, $1, $9 5968; MIPS32O0-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 5969; MIPS32O0-NEXT: ll $2, 0($4) 5970; MIPS32O0-NEXT: and $3, $2, $5 5971; MIPS32O0-NEXT: bne $3, $6, $BB15_3 5972; MIPS32O0-NEXT: nop 5973; MIPS32O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 5974; MIPS32O0-NEXT: and $2, $2, $7 5975; MIPS32O0-NEXT: or $2, $2, $8 5976; MIPS32O0-NEXT: sc $2, 0($4) 5977; MIPS32O0-NEXT: beqz $2, $BB15_1 5978; MIPS32O0-NEXT: nop 5979; MIPS32O0-NEXT: $BB15_3: 5980; MIPS32O0-NEXT: srlv $1, $3, $9 5981; MIPS32O0-NEXT: sll $1, $1, 16 5982; MIPS32O0-NEXT: sra $1, $1, 16 5983; MIPS32O0-NEXT: # %bb.4: 5984; MIPS32O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 5985; MIPS32O0-NEXT: # %bb.5: 5986; MIPS32O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 5987; MIPS32O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 5988; MIPS32O0-NEXT: sll $1, $1, 16 5989; MIPS32O0-NEXT: sra $1, $1, 16 5990; MIPS32O0-NEXT: xor $1, $2, $1 5991; MIPS32O0-NEXT: sltiu $3, $1, 1 5992; MIPS32O0-NEXT: sync 5993; MIPS32O0-NEXT: addiu $sp, $sp, 8 5994; MIPS32O0-NEXT: jr $ra 5995; MIPS32O0-NEXT: nop 5996; 5997; MIPS32R2-LABEL: foo: 5998; MIPS32R2: # %bb.0: 5999; MIPS32R2-NEXT: addu $1, $5, $6 6000; MIPS32R2-NEXT: sync 6001; MIPS32R2-NEXT: addiu $2, $zero, -4 6002; MIPS32R2-NEXT: and $3, $4, $2 6003; MIPS32R2-NEXT: andi $2, $4, 3 6004; MIPS32R2-NEXT: sll $4, $2, 3 6005; MIPS32R2-NEXT: ori $2, $zero, 65535 6006; MIPS32R2-NEXT: sllv $5, $2, $4 6007; MIPS32R2-NEXT: nor $6, $zero, $5 6008; MIPS32R2-NEXT: andi $2, $1, 65535 6009; MIPS32R2-NEXT: sllv $8, $2, $4 6010; MIPS32R2-NEXT: andi $2, $7, 65535 6011; MIPS32R2-NEXT: sllv $7, $2, $4 6012; MIPS32R2-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6013; MIPS32R2-NEXT: ll $9, 0($3) 6014; MIPS32R2-NEXT: and $10, $9, $5 6015; MIPS32R2-NEXT: bne $10, $8, $BB15_3 6016; MIPS32R2-NEXT: nop 6017; MIPS32R2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6018; MIPS32R2-NEXT: and $9, $9, $6 6019; MIPS32R2-NEXT: or $9, $9, $7 6020; MIPS32R2-NEXT: sc $9, 0($3) 6021; MIPS32R2-NEXT: beqz $9, $BB15_1 6022; MIPS32R2-NEXT: nop 6023; MIPS32R2-NEXT: $BB15_3: 6024; MIPS32R2-NEXT: srlv $2, $10, $4 6025; MIPS32R2-NEXT: seh $2, $2 6026; MIPS32R2-NEXT: # %bb.4: 6027; MIPS32R2-NEXT: seh $1, $1 6028; MIPS32R2-NEXT: xor $1, $2, $1 6029; MIPS32R2-NEXT: sltiu $3, $1, 1 6030; MIPS32R2-NEXT: sync 6031; MIPS32R2-NEXT: jr $ra 6032; MIPS32R2-NEXT: nop 6033; 6034; MIPS32R6-LABEL: foo: 6035; MIPS32R6: # %bb.0: 6036; MIPS32R6-NEXT: addu $1, $5, $6 6037; MIPS32R6-NEXT: sync 6038; MIPS32R6-NEXT: addiu $2, $zero, -4 6039; MIPS32R6-NEXT: and $3, $4, $2 6040; MIPS32R6-NEXT: andi $2, $4, 3 6041; MIPS32R6-NEXT: sll $4, $2, 3 6042; MIPS32R6-NEXT: ori $2, $zero, 65535 6043; MIPS32R6-NEXT: sllv $5, $2, $4 6044; MIPS32R6-NEXT: nor $6, $zero, $5 6045; MIPS32R6-NEXT: andi $2, $1, 65535 6046; MIPS32R6-NEXT: sllv $8, $2, $4 6047; MIPS32R6-NEXT: andi $2, $7, 65535 6048; MIPS32R6-NEXT: sllv $7, $2, $4 6049; MIPS32R6-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6050; MIPS32R6-NEXT: ll $9, 0($3) 6051; MIPS32R6-NEXT: and $10, $9, $5 6052; MIPS32R6-NEXT: bnec $10, $8, $BB15_3 6053; MIPS32R6-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6054; MIPS32R6-NEXT: and $9, $9, $6 6055; MIPS32R6-NEXT: or $9, $9, $7 6056; MIPS32R6-NEXT: sc $9, 0($3) 6057; MIPS32R6-NEXT: beqzc $9, $BB15_1 6058; MIPS32R6-NEXT: $BB15_3: 6059; MIPS32R6-NEXT: srlv $2, $10, $4 6060; MIPS32R6-NEXT: seh $2, $2 6061; MIPS32R6-NEXT: # %bb.4: 6062; MIPS32R6-NEXT: seh $1, $1 6063; MIPS32R6-NEXT: xor $1, $2, $1 6064; MIPS32R6-NEXT: sltiu $3, $1, 1 6065; MIPS32R6-NEXT: sync 6066; MIPS32R6-NEXT: jrc $ra 6067; 6068; MIPS32R6O0-LABEL: foo: 6069; MIPS32R6O0: # %bb.0: 6070; MIPS32R6O0-NEXT: addiu $sp, $sp, -8 6071; MIPS32R6O0-NEXT: .cfi_def_cfa_offset 8 6072; MIPS32R6O0-NEXT: move $1, $7 6073; MIPS32R6O0-NEXT: move $3, $4 6074; MIPS32R6O0-NEXT: # kill: def $a3 killed $at 6075; MIPS32R6O0-NEXT: # kill: def $v0 killed $a2 6076; MIPS32R6O0-NEXT: # kill: def $v0 killed $a1 6077; MIPS32R6O0-NEXT: addu $2, $5, $6 6078; MIPS32R6O0-NEXT: sw $2, 0($sp) # 4-byte Folded Spill 6079; MIPS32R6O0-NEXT: sync 6080; MIPS32R6O0-NEXT: addiu $4, $zero, -4 6081; MIPS32R6O0-NEXT: and $4, $3, $4 6082; MIPS32R6O0-NEXT: andi $3, $3, 3 6083; MIPS32R6O0-NEXT: sll $9, $3, 3 6084; MIPS32R6O0-NEXT: ori $3, $zero, 65535 6085; MIPS32R6O0-NEXT: sllv $5, $3, $9 6086; MIPS32R6O0-NEXT: nor $7, $zero, $5 6087; MIPS32R6O0-NEXT: andi $2, $2, 65535 6088; MIPS32R6O0-NEXT: sllv $6, $2, $9 6089; MIPS32R6O0-NEXT: andi $1, $1, 65535 6090; MIPS32R6O0-NEXT: sllv $8, $1, $9 6091; MIPS32R6O0-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6092; MIPS32R6O0-NEXT: ll $2, 0($4) 6093; MIPS32R6O0-NEXT: and $3, $2, $5 6094; MIPS32R6O0-NEXT: bnec $3, $6, $BB15_3 6095; MIPS32R6O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6096; MIPS32R6O0-NEXT: and $2, $2, $7 6097; MIPS32R6O0-NEXT: or $2, $2, $8 6098; MIPS32R6O0-NEXT: sc $2, 0($4) 6099; MIPS32R6O0-NEXT: beqzc $2, $BB15_1 6100; MIPS32R6O0-NEXT: $BB15_3: 6101; MIPS32R6O0-NEXT: srlv $1, $3, $9 6102; MIPS32R6O0-NEXT: seh $1, $1 6103; MIPS32R6O0-NEXT: # %bb.4: 6104; MIPS32R6O0-NEXT: sw $1, 4($sp) # 4-byte Folded Spill 6105; MIPS32R6O0-NEXT: # %bb.5: 6106; MIPS32R6O0-NEXT: lw $2, 4($sp) # 4-byte Folded Reload 6107; MIPS32R6O0-NEXT: lw $1, 0($sp) # 4-byte Folded Reload 6108; MIPS32R6O0-NEXT: seh $1, $1 6109; MIPS32R6O0-NEXT: xor $1, $2, $1 6110; MIPS32R6O0-NEXT: sltiu $3, $1, 1 6111; MIPS32R6O0-NEXT: sync 6112; MIPS32R6O0-NEXT: addiu $sp, $sp, 8 6113; MIPS32R6O0-NEXT: jrc $ra 6114; 6115; MIPS4-LABEL: foo: 6116; MIPS4: # %bb.0: 6117; MIPS4-NEXT: sll $1, $6, 0 6118; MIPS4-NEXT: sll $2, $5, 0 6119; MIPS4-NEXT: addu $1, $2, $1 6120; MIPS4-NEXT: sync 6121; MIPS4-NEXT: sll $2, $7, 0 6122; MIPS4-NEXT: daddiu $3, $zero, -4 6123; MIPS4-NEXT: and $3, $4, $3 6124; MIPS4-NEXT: andi $4, $4, 3 6125; MIPS4-NEXT: sll $4, $4, 3 6126; MIPS4-NEXT: ori $5, $zero, 65535 6127; MIPS4-NEXT: sllv $5, $5, $4 6128; MIPS4-NEXT: nor $6, $zero, $5 6129; MIPS4-NEXT: andi $7, $1, 65535 6130; MIPS4-NEXT: sllv $7, $7, $4 6131; MIPS4-NEXT: andi $2, $2, 65535 6132; MIPS4-NEXT: sllv $8, $2, $4 6133; MIPS4-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6134; MIPS4-NEXT: ll $9, 0($3) 6135; MIPS4-NEXT: and $10, $9, $5 6136; MIPS4-NEXT: bne $10, $7, .LBB15_3 6137; MIPS4-NEXT: nop 6138; MIPS4-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6139; MIPS4-NEXT: and $9, $9, $6 6140; MIPS4-NEXT: or $9, $9, $8 6141; MIPS4-NEXT: sc $9, 0($3) 6142; MIPS4-NEXT: beqz $9, .LBB15_1 6143; MIPS4-NEXT: nop 6144; MIPS4-NEXT: .LBB15_3: 6145; MIPS4-NEXT: srlv $2, $10, $4 6146; MIPS4-NEXT: sll $2, $2, 16 6147; MIPS4-NEXT: sra $2, $2, 16 6148; MIPS4-NEXT: # %bb.4: 6149; MIPS4-NEXT: sll $1, $1, 16 6150; MIPS4-NEXT: sra $1, $1, 16 6151; MIPS4-NEXT: xor $1, $2, $1 6152; MIPS4-NEXT: sltiu $3, $1, 1 6153; MIPS4-NEXT: sync 6154; MIPS4-NEXT: jr $ra 6155; MIPS4-NEXT: nop 6156; 6157; MIPS64-LABEL: foo: 6158; MIPS64: # %bb.0: 6159; MIPS64-NEXT: sll $1, $6, 0 6160; MIPS64-NEXT: sll $2, $5, 0 6161; MIPS64-NEXT: addu $1, $2, $1 6162; MIPS64-NEXT: sync 6163; MIPS64-NEXT: sll $2, $7, 0 6164; MIPS64-NEXT: daddiu $3, $zero, -4 6165; MIPS64-NEXT: and $3, $4, $3 6166; MIPS64-NEXT: andi $4, $4, 3 6167; MIPS64-NEXT: sll $4, $4, 3 6168; MIPS64-NEXT: ori $5, $zero, 65535 6169; MIPS64-NEXT: sllv $5, $5, $4 6170; MIPS64-NEXT: nor $6, $zero, $5 6171; MIPS64-NEXT: andi $7, $1, 65535 6172; MIPS64-NEXT: sllv $7, $7, $4 6173; MIPS64-NEXT: andi $2, $2, 65535 6174; MIPS64-NEXT: sllv $8, $2, $4 6175; MIPS64-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6176; MIPS64-NEXT: ll $9, 0($3) 6177; MIPS64-NEXT: and $10, $9, $5 6178; MIPS64-NEXT: bne $10, $7, .LBB15_3 6179; MIPS64-NEXT: nop 6180; MIPS64-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6181; MIPS64-NEXT: and $9, $9, $6 6182; MIPS64-NEXT: or $9, $9, $8 6183; MIPS64-NEXT: sc $9, 0($3) 6184; MIPS64-NEXT: beqz $9, .LBB15_1 6185; MIPS64-NEXT: nop 6186; MIPS64-NEXT: .LBB15_3: 6187; MIPS64-NEXT: srlv $2, $10, $4 6188; MIPS64-NEXT: sll $2, $2, 16 6189; MIPS64-NEXT: sra $2, $2, 16 6190; MIPS64-NEXT: # %bb.4: 6191; MIPS64-NEXT: sll $1, $1, 16 6192; MIPS64-NEXT: sra $1, $1, 16 6193; MIPS64-NEXT: xor $1, $2, $1 6194; MIPS64-NEXT: sltiu $3, $1, 1 6195; MIPS64-NEXT: sync 6196; MIPS64-NEXT: jr $ra 6197; MIPS64-NEXT: nop 6198; 6199; MIPS64R2-LABEL: foo: 6200; MIPS64R2: # %bb.0: 6201; MIPS64R2-NEXT: sll $1, $6, 0 6202; MIPS64R2-NEXT: sll $2, $5, 0 6203; MIPS64R2-NEXT: addu $1, $2, $1 6204; MIPS64R2-NEXT: sync 6205; MIPS64R2-NEXT: sll $2, $7, 0 6206; MIPS64R2-NEXT: daddiu $3, $zero, -4 6207; MIPS64R2-NEXT: and $3, $4, $3 6208; MIPS64R2-NEXT: andi $4, $4, 3 6209; MIPS64R2-NEXT: sll $4, $4, 3 6210; MIPS64R2-NEXT: ori $5, $zero, 65535 6211; MIPS64R2-NEXT: sllv $5, $5, $4 6212; MIPS64R2-NEXT: nor $6, $zero, $5 6213; MIPS64R2-NEXT: andi $7, $1, 65535 6214; MIPS64R2-NEXT: sllv $7, $7, $4 6215; MIPS64R2-NEXT: andi $2, $2, 65535 6216; MIPS64R2-NEXT: sllv $8, $2, $4 6217; MIPS64R2-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6218; MIPS64R2-NEXT: ll $9, 0($3) 6219; MIPS64R2-NEXT: and $10, $9, $5 6220; MIPS64R2-NEXT: bne $10, $7, .LBB15_3 6221; MIPS64R2-NEXT: nop 6222; MIPS64R2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6223; MIPS64R2-NEXT: and $9, $9, $6 6224; MIPS64R2-NEXT: or $9, $9, $8 6225; MIPS64R2-NEXT: sc $9, 0($3) 6226; MIPS64R2-NEXT: beqz $9, .LBB15_1 6227; MIPS64R2-NEXT: nop 6228; MIPS64R2-NEXT: .LBB15_3: 6229; MIPS64R2-NEXT: srlv $2, $10, $4 6230; MIPS64R2-NEXT: seh $2, $2 6231; MIPS64R2-NEXT: # %bb.4: 6232; MIPS64R2-NEXT: seh $1, $1 6233; MIPS64R2-NEXT: xor $1, $2, $1 6234; MIPS64R2-NEXT: sltiu $3, $1, 1 6235; MIPS64R2-NEXT: sync 6236; MIPS64R2-NEXT: jr $ra 6237; MIPS64R2-NEXT: nop 6238; 6239; MIPS64R6-LABEL: foo: 6240; MIPS64R6: # %bb.0: 6241; MIPS64R6-NEXT: sll $1, $6, 0 6242; MIPS64R6-NEXT: sll $2, $5, 0 6243; MIPS64R6-NEXT: addu $1, $2, $1 6244; MIPS64R6-NEXT: sync 6245; MIPS64R6-NEXT: sll $2, $7, 0 6246; MIPS64R6-NEXT: daddiu $3, $zero, -4 6247; MIPS64R6-NEXT: and $3, $4, $3 6248; MIPS64R6-NEXT: andi $4, $4, 3 6249; MIPS64R6-NEXT: sll $4, $4, 3 6250; MIPS64R6-NEXT: ori $5, $zero, 65535 6251; MIPS64R6-NEXT: sllv $5, $5, $4 6252; MIPS64R6-NEXT: nor $6, $zero, $5 6253; MIPS64R6-NEXT: andi $7, $1, 65535 6254; MIPS64R6-NEXT: sllv $7, $7, $4 6255; MIPS64R6-NEXT: andi $2, $2, 65535 6256; MIPS64R6-NEXT: sllv $8, $2, $4 6257; MIPS64R6-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6258; MIPS64R6-NEXT: ll $9, 0($3) 6259; MIPS64R6-NEXT: and $10, $9, $5 6260; MIPS64R6-NEXT: bnec $10, $7, .LBB15_3 6261; MIPS64R6-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6262; MIPS64R6-NEXT: and $9, $9, $6 6263; MIPS64R6-NEXT: or $9, $9, $8 6264; MIPS64R6-NEXT: sc $9, 0($3) 6265; MIPS64R6-NEXT: beqzc $9, .LBB15_1 6266; MIPS64R6-NEXT: .LBB15_3: 6267; MIPS64R6-NEXT: srlv $2, $10, $4 6268; MIPS64R6-NEXT: seh $2, $2 6269; MIPS64R6-NEXT: # %bb.4: 6270; MIPS64R6-NEXT: seh $1, $1 6271; MIPS64R6-NEXT: xor $1, $2, $1 6272; MIPS64R6-NEXT: sltiu $3, $1, 1 6273; MIPS64R6-NEXT: sync 6274; MIPS64R6-NEXT: jrc $ra 6275; 6276; MIPS64R6O0-LABEL: foo: 6277; MIPS64R6O0: # %bb.0: 6278; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 6279; MIPS64R6O0-NEXT: .cfi_def_cfa_offset 16 6280; MIPS64R6O0-NEXT: move $3, $4 6281; MIPS64R6O0-NEXT: move $1, $7 6282; MIPS64R6O0-NEXT: sll $1, $1, 0 6283; MIPS64R6O0-NEXT: move $2, $6 6284; MIPS64R6O0-NEXT: sll $4, $2, 0 6285; MIPS64R6O0-NEXT: move $2, $5 6286; MIPS64R6O0-NEXT: sll $2, $2, 0 6287; MIPS64R6O0-NEXT: addu $2, $2, $4 6288; MIPS64R6O0-NEXT: sw $2, 8($sp) # 4-byte Folded Spill 6289; MIPS64R6O0-NEXT: sync 6290; MIPS64R6O0-NEXT: daddiu $4, $zero, -4 6291; MIPS64R6O0-NEXT: and $4, $3, $4 6292; MIPS64R6O0-NEXT: andi $3, $3, 3 6293; MIPS64R6O0-NEXT: xori $3, $3, 2 6294; MIPS64R6O0-NEXT: sll $9, $3, 3 6295; MIPS64R6O0-NEXT: ori $3, $zero, 65535 6296; MIPS64R6O0-NEXT: sllv $5, $3, $9 6297; MIPS64R6O0-NEXT: nor $7, $zero, $5 6298; MIPS64R6O0-NEXT: andi $2, $2, 65535 6299; MIPS64R6O0-NEXT: sllv $6, $2, $9 6300; MIPS64R6O0-NEXT: andi $1, $1, 65535 6301; MIPS64R6O0-NEXT: sllv $8, $1, $9 6302; MIPS64R6O0-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 6303; MIPS64R6O0-NEXT: ll $2, 0($4) 6304; MIPS64R6O0-NEXT: and $3, $2, $5 6305; MIPS64R6O0-NEXT: bnec $3, $6, .LBB15_3 6306; MIPS64R6O0-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6307; MIPS64R6O0-NEXT: and $2, $2, $7 6308; MIPS64R6O0-NEXT: or $2, $2, $8 6309; MIPS64R6O0-NEXT: sc $2, 0($4) 6310; MIPS64R6O0-NEXT: beqzc $2, .LBB15_1 6311; MIPS64R6O0-NEXT: .LBB15_3: 6312; MIPS64R6O0-NEXT: srlv $1, $3, $9 6313; MIPS64R6O0-NEXT: seh $1, $1 6314; MIPS64R6O0-NEXT: # %bb.4: 6315; MIPS64R6O0-NEXT: sw $1, 12($sp) # 4-byte Folded Spill 6316; MIPS64R6O0-NEXT: # %bb.5: 6317; MIPS64R6O0-NEXT: lw $2, 12($sp) # 4-byte Folded Reload 6318; MIPS64R6O0-NEXT: lw $1, 8($sp) # 4-byte Folded Reload 6319; MIPS64R6O0-NEXT: seh $1, $1 6320; MIPS64R6O0-NEXT: xor $1, $2, $1 6321; MIPS64R6O0-NEXT: sltiu $3, $1, 1 6322; MIPS64R6O0-NEXT: sync 6323; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 6324; MIPS64R6O0-NEXT: jrc $ra 6325; 6326; MM32-LABEL: foo: 6327; MM32: # %bb.0: 6328; MM32-NEXT: addu16 $3, $5, $6 6329; MM32-NEXT: sync 6330; MM32-NEXT: addiu $1, $zero, -4 6331; MM32-NEXT: and $1, $4, $1 6332; MM32-NEXT: andi $2, $4, 3 6333; MM32-NEXT: sll $4, $2, 3 6334; MM32-NEXT: ori $2, $zero, 65535 6335; MM32-NEXT: sllv $5, $2, $4 6336; MM32-NEXT: nor $6, $zero, $5 6337; MM32-NEXT: andi $2, $3, 65535 6338; MM32-NEXT: sllv $8, $2, $4 6339; MM32-NEXT: andi $2, $7, 65535 6340; MM32-NEXT: sllv $7, $2, $4 6341; MM32-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6342; MM32-NEXT: ll $9, 0($1) 6343; MM32-NEXT: and $10, $9, $5 6344; MM32-NEXT: bne $10, $8, $BB15_3 6345; MM32-NEXT: nop 6346; MM32-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6347; MM32-NEXT: and $9, $9, $6 6348; MM32-NEXT: or $9, $9, $7 6349; MM32-NEXT: sc $9, 0($1) 6350; MM32-NEXT: beqzc $9, $BB15_1 6351; MM32-NEXT: $BB15_3: 6352; MM32-NEXT: srlv $2, $10, $4 6353; MM32-NEXT: seh $2, $2 6354; MM32-NEXT: # %bb.4: 6355; MM32-NEXT: seh $1, $3 6356; MM32-NEXT: xor $1, $2, $1 6357; MM32-NEXT: sltiu $3, $1, 1 6358; MM32-NEXT: sync 6359; MM32-NEXT: jrc $ra 6360; 6361; O1-LABEL: foo: 6362; O1: # %bb.0: 6363; O1-NEXT: addu $1, $5, $6 6364; O1-NEXT: sync 6365; O1-NEXT: addiu $2, $zero, -4 6366; O1-NEXT: and $3, $4, $2 6367; O1-NEXT: andi $2, $4, 3 6368; O1-NEXT: sll $4, $2, 3 6369; O1-NEXT: ori $2, $zero, 65535 6370; O1-NEXT: sllv $5, $2, $4 6371; O1-NEXT: nor $6, $zero, $5 6372; O1-NEXT: andi $2, $1, 65535 6373; O1-NEXT: sllv $8, $2, $4 6374; O1-NEXT: andi $2, $7, 65535 6375; O1-NEXT: sllv $7, $2, $4 6376; O1-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6377; O1-NEXT: ll $9, 0($3) 6378; O1-NEXT: and $10, $9, $5 6379; O1-NEXT: bne $10, $8, $BB15_3 6380; O1-NEXT: nop 6381; O1-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6382; O1-NEXT: and $9, $9, $6 6383; O1-NEXT: or $9, $9, $7 6384; O1-NEXT: sc $9, 0($3) 6385; O1-NEXT: beqz $9, $BB15_1 6386; O1-NEXT: nop 6387; O1-NEXT: $BB15_3: 6388; O1-NEXT: srlv $2, $10, $4 6389; O1-NEXT: sll $2, $2, 16 6390; O1-NEXT: sra $2, $2, 16 6391; O1-NEXT: # %bb.4: 6392; O1-NEXT: sll $1, $1, 16 6393; O1-NEXT: sra $1, $1, 16 6394; O1-NEXT: xor $1, $2, $1 6395; O1-NEXT: sltiu $3, $1, 1 6396; O1-NEXT: sync 6397; O1-NEXT: jr $ra 6398; O1-NEXT: nop 6399; 6400; O2-LABEL: foo: 6401; O2: # %bb.0: 6402; O2-NEXT: addu $1, $5, $6 6403; O2-NEXT: sync 6404; O2-NEXT: addiu $2, $zero, -4 6405; O2-NEXT: and $3, $4, $2 6406; O2-NEXT: andi $2, $4, 3 6407; O2-NEXT: sll $4, $2, 3 6408; O2-NEXT: ori $2, $zero, 65535 6409; O2-NEXT: sllv $5, $2, $4 6410; O2-NEXT: nor $6, $zero, $5 6411; O2-NEXT: andi $2, $1, 65535 6412; O2-NEXT: sllv $8, $2, $4 6413; O2-NEXT: andi $2, $7, 65535 6414; O2-NEXT: sllv $7, $2, $4 6415; O2-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6416; O2-NEXT: ll $9, 0($3) 6417; O2-NEXT: and $10, $9, $5 6418; O2-NEXT: bne $10, $8, $BB15_3 6419; O2-NEXT: nop 6420; O2-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6421; O2-NEXT: and $9, $9, $6 6422; O2-NEXT: or $9, $9, $7 6423; O2-NEXT: sc $9, 0($3) 6424; O2-NEXT: beqz $9, $BB15_1 6425; O2-NEXT: nop 6426; O2-NEXT: $BB15_3: 6427; O2-NEXT: srlv $2, $10, $4 6428; O2-NEXT: sll $2, $2, 16 6429; O2-NEXT: sra $2, $2, 16 6430; O2-NEXT: # %bb.4: 6431; O2-NEXT: sll $1, $1, 16 6432; O2-NEXT: sra $1, $1, 16 6433; O2-NEXT: xor $1, $2, $1 6434; O2-NEXT: sltiu $3, $1, 1 6435; O2-NEXT: sync 6436; O2-NEXT: jr $ra 6437; O2-NEXT: nop 6438; 6439; O3-LABEL: foo: 6440; O3: # %bb.0: 6441; O3-NEXT: addiu $2, $zero, -4 6442; O3-NEXT: addu $1, $5, $6 6443; O3-NEXT: sync 6444; O3-NEXT: and $3, $4, $2 6445; O3-NEXT: andi $2, $4, 3 6446; O3-NEXT: sll $4, $2, 3 6447; O3-NEXT: ori $2, $zero, 65535 6448; O3-NEXT: sllv $5, $2, $4 6449; O3-NEXT: andi $2, $1, 65535 6450; O3-NEXT: sll $1, $1, 16 6451; O3-NEXT: sllv $8, $2, $4 6452; O3-NEXT: andi $2, $7, 65535 6453; O3-NEXT: nor $6, $zero, $5 6454; O3-NEXT: sra $1, $1, 16 6455; O3-NEXT: sllv $7, $2, $4 6456; O3-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6457; O3-NEXT: ll $9, 0($3) 6458; O3-NEXT: and $10, $9, $5 6459; O3-NEXT: bne $10, $8, $BB15_3 6460; O3-NEXT: nop 6461; O3-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6462; O3-NEXT: and $9, $9, $6 6463; O3-NEXT: or $9, $9, $7 6464; O3-NEXT: sc $9, 0($3) 6465; O3-NEXT: beqz $9, $BB15_1 6466; O3-NEXT: nop 6467; O3-NEXT: $BB15_3: 6468; O3-NEXT: srlv $2, $10, $4 6469; O3-NEXT: sll $2, $2, 16 6470; O3-NEXT: sra $2, $2, 16 6471; O3-NEXT: # %bb.4: 6472; O3-NEXT: sync 6473; O3-NEXT: xor $1, $2, $1 6474; O3-NEXT: jr $ra 6475; O3-NEXT: sltiu $3, $1, 1 6476; 6477; MIPS32EB-LABEL: foo: 6478; MIPS32EB: # %bb.0: 6479; MIPS32EB-NEXT: addu $1, $5, $6 6480; MIPS32EB-NEXT: sync 6481; MIPS32EB-NEXT: addiu $2, $zero, -4 6482; MIPS32EB-NEXT: and $3, $4, $2 6483; MIPS32EB-NEXT: andi $2, $4, 3 6484; MIPS32EB-NEXT: xori $2, $2, 2 6485; MIPS32EB-NEXT: sll $4, $2, 3 6486; MIPS32EB-NEXT: ori $2, $zero, 65535 6487; MIPS32EB-NEXT: sllv $5, $2, $4 6488; MIPS32EB-NEXT: nor $6, $zero, $5 6489; MIPS32EB-NEXT: andi $2, $1, 65535 6490; MIPS32EB-NEXT: sllv $8, $2, $4 6491; MIPS32EB-NEXT: andi $2, $7, 65535 6492; MIPS32EB-NEXT: sllv $7, $2, $4 6493; MIPS32EB-NEXT: $BB15_1: # =>This Inner Loop Header: Depth=1 6494; MIPS32EB-NEXT: ll $9, 0($3) 6495; MIPS32EB-NEXT: and $10, $9, $5 6496; MIPS32EB-NEXT: bne $10, $8, $BB15_3 6497; MIPS32EB-NEXT: nop 6498; MIPS32EB-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1 6499; MIPS32EB-NEXT: and $9, $9, $6 6500; MIPS32EB-NEXT: or $9, $9, $7 6501; MIPS32EB-NEXT: sc $9, 0($3) 6502; MIPS32EB-NEXT: beqz $9, $BB15_1 6503; MIPS32EB-NEXT: nop 6504; MIPS32EB-NEXT: $BB15_3: 6505; MIPS32EB-NEXT: srlv $2, $10, $4 6506; MIPS32EB-NEXT: sll $2, $2, 16 6507; MIPS32EB-NEXT: sra $2, $2, 16 6508; MIPS32EB-NEXT: # %bb.4: 6509; MIPS32EB-NEXT: sll $1, $1, 16 6510; MIPS32EB-NEXT: sra $1, $1, 16 6511; MIPS32EB-NEXT: xor $1, $2, $1 6512; MIPS32EB-NEXT: sltiu $3, $1, 1 6513; MIPS32EB-NEXT: sync 6514; MIPS32EB-NEXT: jr $ra 6515; MIPS32EB-NEXT: nop 6516 %desired = add i16 %l, %r 6517 %res = cmpxchg ptr %addr, i16 %desired, i16 %new seq_cst seq_cst 6518 ret {i16, i1} %res 6519} 6520 6521@countsint = common global i32 0, align 4 6522 6523define i32 @CheckSync(i32 signext %v) nounwind noinline { 6524; MIPS32-LABEL: CheckSync: 6525; MIPS32: # %bb.0: # %entry 6526; MIPS32-NEXT: lui $2, %hi(_gp_disp) 6527; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 6528; MIPS32-NEXT: addu $1, $2, $25 6529; MIPS32-NEXT: sync 6530; MIPS32-NEXT: lw $1, %got(countsint)($1) 6531; MIPS32-NEXT: $BB16_1: # %entry 6532; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 6533; MIPS32-NEXT: ll $2, 0($1) 6534; MIPS32-NEXT: addu $3, $2, $4 6535; MIPS32-NEXT: sc $3, 0($1) 6536; MIPS32-NEXT: beqz $3, $BB16_1 6537; MIPS32-NEXT: nop 6538; MIPS32-NEXT: # %bb.2: # %entry 6539; MIPS32-NEXT: sync 6540; MIPS32-NEXT: jr $ra 6541; MIPS32-NEXT: nop 6542; 6543; MIPS32O0-LABEL: CheckSync: 6544; MIPS32O0: # %bb.0: # %entry 6545; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 6546; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6547; MIPS32O0-NEXT: addu $1, $2, $25 6548; MIPS32O0-NEXT: sync 6549; MIPS32O0-NEXT: lw $3, %got(countsint)($1) 6550; MIPS32O0-NEXT: $BB16_1: # %entry 6551; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 6552; MIPS32O0-NEXT: ll $2, 0($3) 6553; MIPS32O0-NEXT: addu $1, $2, $4 6554; MIPS32O0-NEXT: sc $1, 0($3) 6555; MIPS32O0-NEXT: beqz $1, $BB16_1 6556; MIPS32O0-NEXT: nop 6557; MIPS32O0-NEXT: # %bb.2: # %entry 6558; MIPS32O0-NEXT: sync 6559; MIPS32O0-NEXT: jr $ra 6560; MIPS32O0-NEXT: nop 6561; 6562; MIPS32R2-LABEL: CheckSync: 6563; MIPS32R2: # %bb.0: # %entry 6564; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 6565; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 6566; MIPS32R2-NEXT: addu $1, $2, $25 6567; MIPS32R2-NEXT: sync 6568; MIPS32R2-NEXT: lw $1, %got(countsint)($1) 6569; MIPS32R2-NEXT: $BB16_1: # %entry 6570; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 6571; MIPS32R2-NEXT: ll $2, 0($1) 6572; MIPS32R2-NEXT: addu $3, $2, $4 6573; MIPS32R2-NEXT: sc $3, 0($1) 6574; MIPS32R2-NEXT: beqz $3, $BB16_1 6575; MIPS32R2-NEXT: nop 6576; MIPS32R2-NEXT: # %bb.2: # %entry 6577; MIPS32R2-NEXT: sync 6578; MIPS32R2-NEXT: jr $ra 6579; MIPS32R2-NEXT: nop 6580; 6581; MIPS32R6-LABEL: CheckSync: 6582; MIPS32R6: # %bb.0: # %entry 6583; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 6584; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 6585; MIPS32R6-NEXT: addu $1, $2, $25 6586; MIPS32R6-NEXT: sync 6587; MIPS32R6-NEXT: lw $1, %got(countsint)($1) 6588; MIPS32R6-NEXT: $BB16_1: # %entry 6589; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 6590; MIPS32R6-NEXT: ll $2, 0($1) 6591; MIPS32R6-NEXT: addu $3, $2, $4 6592; MIPS32R6-NEXT: sc $3, 0($1) 6593; MIPS32R6-NEXT: beqzc $3, $BB16_1 6594; MIPS32R6-NEXT: # %bb.2: # %entry 6595; MIPS32R6-NEXT: sync 6596; MIPS32R6-NEXT: jrc $ra 6597; 6598; MIPS32R6O0-LABEL: CheckSync: 6599; MIPS32R6O0: # %bb.0: # %entry 6600; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 6601; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6602; MIPS32R6O0-NEXT: addu $1, $2, $25 6603; MIPS32R6O0-NEXT: sync 6604; MIPS32R6O0-NEXT: lw $3, %got(countsint)($1) 6605; MIPS32R6O0-NEXT: $BB16_1: # %entry 6606; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 6607; MIPS32R6O0-NEXT: ll $2, 0($3) 6608; MIPS32R6O0-NEXT: addu $1, $2, $4 6609; MIPS32R6O0-NEXT: sc $1, 0($3) 6610; MIPS32R6O0-NEXT: beqzc $1, $BB16_1 6611; MIPS32R6O0-NEXT: # %bb.2: # %entry 6612; MIPS32R6O0-NEXT: sync 6613; MIPS32R6O0-NEXT: jrc $ra 6614; 6615; MIPS4-LABEL: CheckSync: 6616; MIPS4: # %bb.0: # %entry 6617; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6618; MIPS4-NEXT: daddu $1, $1, $25 6619; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6620; MIPS4-NEXT: sync 6621; MIPS4-NEXT: ld $1, %got_disp(countsint)($1) 6622; MIPS4-NEXT: .LBB16_1: # %entry 6623; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 6624; MIPS4-NEXT: ll $2, 0($1) 6625; MIPS4-NEXT: addu $3, $2, $4 6626; MIPS4-NEXT: sc $3, 0($1) 6627; MIPS4-NEXT: beqz $3, .LBB16_1 6628; MIPS4-NEXT: nop 6629; MIPS4-NEXT: # %bb.2: # %entry 6630; MIPS4-NEXT: sync 6631; MIPS4-NEXT: jr $ra 6632; MIPS4-NEXT: nop 6633; 6634; MIPS64-LABEL: CheckSync: 6635; MIPS64: # %bb.0: # %entry 6636; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6637; MIPS64-NEXT: daddu $1, $1, $25 6638; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6639; MIPS64-NEXT: sync 6640; MIPS64-NEXT: ld $1, %got_disp(countsint)($1) 6641; MIPS64-NEXT: .LBB16_1: # %entry 6642; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 6643; MIPS64-NEXT: ll $2, 0($1) 6644; MIPS64-NEXT: addu $3, $2, $4 6645; MIPS64-NEXT: sc $3, 0($1) 6646; MIPS64-NEXT: beqz $3, .LBB16_1 6647; MIPS64-NEXT: nop 6648; MIPS64-NEXT: # %bb.2: # %entry 6649; MIPS64-NEXT: sync 6650; MIPS64-NEXT: jr $ra 6651; MIPS64-NEXT: nop 6652; 6653; MIPS64R2-LABEL: CheckSync: 6654; MIPS64R2: # %bb.0: # %entry 6655; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6656; MIPS64R2-NEXT: daddu $1, $1, $25 6657; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6658; MIPS64R2-NEXT: sync 6659; MIPS64R2-NEXT: ld $1, %got_disp(countsint)($1) 6660; MIPS64R2-NEXT: .LBB16_1: # %entry 6661; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 6662; MIPS64R2-NEXT: ll $2, 0($1) 6663; MIPS64R2-NEXT: addu $3, $2, $4 6664; MIPS64R2-NEXT: sc $3, 0($1) 6665; MIPS64R2-NEXT: beqz $3, .LBB16_1 6666; MIPS64R2-NEXT: nop 6667; MIPS64R2-NEXT: # %bb.2: # %entry 6668; MIPS64R2-NEXT: sync 6669; MIPS64R2-NEXT: jr $ra 6670; MIPS64R2-NEXT: nop 6671; 6672; MIPS64R6-LABEL: CheckSync: 6673; MIPS64R6: # %bb.0: # %entry 6674; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6675; MIPS64R6-NEXT: daddu $1, $1, $25 6676; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6677; MIPS64R6-NEXT: sync 6678; MIPS64R6-NEXT: ld $1, %got_disp(countsint)($1) 6679; MIPS64R6-NEXT: .LBB16_1: # %entry 6680; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 6681; MIPS64R6-NEXT: ll $2, 0($1) 6682; MIPS64R6-NEXT: addu $3, $2, $4 6683; MIPS64R6-NEXT: sc $3, 0($1) 6684; MIPS64R6-NEXT: beqzc $3, .LBB16_1 6685; MIPS64R6-NEXT: # %bb.2: # %entry 6686; MIPS64R6-NEXT: sync 6687; MIPS64R6-NEXT: jrc $ra 6688; 6689; MIPS64R6O0-LABEL: CheckSync: 6690; MIPS64R6O0: # %bb.0: # %entry 6691; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(CheckSync))) 6692; MIPS64R6O0-NEXT: daddu $1, $1, $25 6693; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync))) 6694; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 6695; MIPS64R6O0-NEXT: sync 6696; MIPS64R6O0-NEXT: ld $3, %got_disp(countsint)($1) 6697; MIPS64R6O0-NEXT: .LBB16_1: # %entry 6698; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 6699; MIPS64R6O0-NEXT: ll $2, 0($3) 6700; MIPS64R6O0-NEXT: addu $1, $2, $4 6701; MIPS64R6O0-NEXT: sc $1, 0($3) 6702; MIPS64R6O0-NEXT: beqzc $1, .LBB16_1 6703; MIPS64R6O0-NEXT: # %bb.2: # %entry 6704; MIPS64R6O0-NEXT: sync 6705; MIPS64R6O0-NEXT: jrc $ra 6706; 6707; MM32-LABEL: CheckSync: 6708; MM32: # %bb.0: # %entry 6709; MM32-NEXT: lui $2, %hi(_gp_disp) 6710; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 6711; MM32-NEXT: addu $2, $2, $25 6712; MM32-NEXT: sync 6713; MM32-NEXT: lw $1, %got(countsint)($2) 6714; MM32-NEXT: $BB16_1: # %entry 6715; MM32-NEXT: # =>This Inner Loop Header: Depth=1 6716; MM32-NEXT: ll $2, 0($1) 6717; MM32-NEXT: addu16 $3, $2, $4 6718; MM32-NEXT: sc $3, 0($1) 6719; MM32-NEXT: beqzc $3, $BB16_1 6720; MM32-NEXT: # %bb.2: # %entry 6721; MM32-NEXT: sync 6722; MM32-NEXT: jrc $ra 6723; 6724; O1-LABEL: CheckSync: 6725; O1: # %bb.0: # %entry 6726; O1-NEXT: lui $2, %hi(_gp_disp) 6727; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 6728; O1-NEXT: addu $1, $2, $25 6729; O1-NEXT: sync 6730; O1-NEXT: lw $1, %got(countsint)($1) 6731; O1-NEXT: $BB16_1: # %entry 6732; O1-NEXT: # =>This Inner Loop Header: Depth=1 6733; O1-NEXT: ll $2, 0($1) 6734; O1-NEXT: addu $3, $2, $4 6735; O1-NEXT: sc $3, 0($1) 6736; O1-NEXT: beqz $3, $BB16_1 6737; O1-NEXT: nop 6738; O1-NEXT: # %bb.2: # %entry 6739; O1-NEXT: sync 6740; O1-NEXT: jr $ra 6741; O1-NEXT: nop 6742; 6743; O2-LABEL: CheckSync: 6744; O2: # %bb.0: # %entry 6745; O2-NEXT: lui $2, %hi(_gp_disp) 6746; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 6747; O2-NEXT: addu $1, $2, $25 6748; O2-NEXT: sync 6749; O2-NEXT: lw $1, %got(countsint)($1) 6750; O2-NEXT: $BB16_1: # %entry 6751; O2-NEXT: # =>This Inner Loop Header: Depth=1 6752; O2-NEXT: ll $2, 0($1) 6753; O2-NEXT: addu $3, $2, $4 6754; O2-NEXT: sc $3, 0($1) 6755; O2-NEXT: beqz $3, $BB16_1 6756; O2-NEXT: nop 6757; O2-NEXT: # %bb.2: # %entry 6758; O2-NEXT: sync 6759; O2-NEXT: jr $ra 6760; O2-NEXT: nop 6761; 6762; O3-LABEL: CheckSync: 6763; O3: # %bb.0: # %entry 6764; O3-NEXT: lui $2, %hi(_gp_disp) 6765; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 6766; O3-NEXT: addu $1, $2, $25 6767; O3-NEXT: sync 6768; O3-NEXT: lw $1, %got(countsint)($1) 6769; O3-NEXT: $BB16_1: # %entry 6770; O3-NEXT: # =>This Inner Loop Header: Depth=1 6771; O3-NEXT: ll $2, 0($1) 6772; O3-NEXT: addu $3, $2, $4 6773; O3-NEXT: sc $3, 0($1) 6774; O3-NEXT: beqz $3, $BB16_1 6775; O3-NEXT: nop 6776; O3-NEXT: # %bb.2: # %entry 6777; O3-NEXT: sync 6778; O3-NEXT: jr $ra 6779; O3-NEXT: nop 6780; 6781; MIPS32EB-LABEL: CheckSync: 6782; MIPS32EB: # %bb.0: # %entry 6783; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 6784; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 6785; MIPS32EB-NEXT: addu $1, $2, $25 6786; MIPS32EB-NEXT: sync 6787; MIPS32EB-NEXT: lw $1, %got(countsint)($1) 6788; MIPS32EB-NEXT: $BB16_1: # %entry 6789; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 6790; MIPS32EB-NEXT: ll $2, 0($1) 6791; MIPS32EB-NEXT: addu $3, $2, $4 6792; MIPS32EB-NEXT: sc $3, 0($1) 6793; MIPS32EB-NEXT: beqz $3, $BB16_1 6794; MIPS32EB-NEXT: nop 6795; MIPS32EB-NEXT: # %bb.2: # %entry 6796; MIPS32EB-NEXT: sync 6797; MIPS32EB-NEXT: jr $ra 6798; MIPS32EB-NEXT: nop 6799entry: 6800 %0 = atomicrmw add ptr @countsint, i32 %v seq_cst 6801 ret i32 %0 6802} 6803 6804; make sure that this assertion in 6805; TwoAddressInstructionPass::TryInstructionTransform does not fail: 6806; 6807; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) && 6808; 6809; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an 6810; operand of an atomic instruction with register $zero. 6811@a = external global i32 6812 6813define i32 @zeroreg() nounwind { 6814; MIPS32-LABEL: zeroreg: 6815; MIPS32: # %bb.0: # %entry 6816; MIPS32-NEXT: lui $2, %hi(_gp_disp) 6817; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 6818; MIPS32-NEXT: addu $1, $2, $25 6819; MIPS32-NEXT: sync 6820; MIPS32-NEXT: addiu $2, $zero, 0 6821; MIPS32-NEXT: addiu $3, $zero, 1 6822; MIPS32-NEXT: lw $1, %got(a)($1) 6823; MIPS32-NEXT: $BB17_1: # %entry 6824; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 6825; MIPS32-NEXT: ll $4, 0($1) 6826; MIPS32-NEXT: bne $4, $3, $BB17_3 6827; MIPS32-NEXT: nop 6828; MIPS32-NEXT: # %bb.2: # %entry 6829; MIPS32-NEXT: # in Loop: Header=BB17_1 Depth=1 6830; MIPS32-NEXT: move $5, $2 6831; MIPS32-NEXT: sc $5, 0($1) 6832; MIPS32-NEXT: beqz $5, $BB17_1 6833; MIPS32-NEXT: nop 6834; MIPS32-NEXT: $BB17_3: # %entry 6835; MIPS32-NEXT: xor $1, $4, $3 6836; MIPS32-NEXT: sltiu $2, $1, 1 6837; MIPS32-NEXT: sync 6838; MIPS32-NEXT: jr $ra 6839; MIPS32-NEXT: nop 6840; 6841; MIPS32O0-LABEL: zeroreg: 6842; MIPS32O0: # %bb.0: # %entry 6843; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 6844; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6845; MIPS32O0-NEXT: addu $1, $2, $25 6846; MIPS32O0-NEXT: sync 6847; MIPS32O0-NEXT: lw $4, %got(a)($1) 6848; MIPS32O0-NEXT: addiu $6, $zero, 0 6849; MIPS32O0-NEXT: addiu $2, $zero, 1 6850; MIPS32O0-NEXT: move $5, $2 6851; MIPS32O0-NEXT: $BB17_1: # %entry 6852; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 6853; MIPS32O0-NEXT: ll $1, 0($4) 6854; MIPS32O0-NEXT: bne $1, $5, $BB17_3 6855; MIPS32O0-NEXT: nop 6856; MIPS32O0-NEXT: # %bb.2: # %entry 6857; MIPS32O0-NEXT: # in Loop: Header=BB17_1 Depth=1 6858; MIPS32O0-NEXT: move $3, $6 6859; MIPS32O0-NEXT: sc $3, 0($4) 6860; MIPS32O0-NEXT: beqz $3, $BB17_1 6861; MIPS32O0-NEXT: nop 6862; MIPS32O0-NEXT: $BB17_3: # %entry 6863; MIPS32O0-NEXT: xor $2, $1, $2 6864; MIPS32O0-NEXT: sltiu $2, $2, 1 6865; MIPS32O0-NEXT: sync 6866; MIPS32O0-NEXT: addiu $2, $zero, 1 6867; MIPS32O0-NEXT: xor $1, $1, $2 6868; MIPS32O0-NEXT: sltiu $1, $1, 1 6869; MIPS32O0-NEXT: andi $2, $1, 1 6870; MIPS32O0-NEXT: jr $ra 6871; MIPS32O0-NEXT: nop 6872; 6873; MIPS32R2-LABEL: zeroreg: 6874; MIPS32R2: # %bb.0: # %entry 6875; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 6876; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 6877; MIPS32R2-NEXT: addu $1, $2, $25 6878; MIPS32R2-NEXT: sync 6879; MIPS32R2-NEXT: addiu $2, $zero, 0 6880; MIPS32R2-NEXT: addiu $3, $zero, 1 6881; MIPS32R2-NEXT: lw $1, %got(a)($1) 6882; MIPS32R2-NEXT: $BB17_1: # %entry 6883; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 6884; MIPS32R2-NEXT: ll $4, 0($1) 6885; MIPS32R2-NEXT: bne $4, $3, $BB17_3 6886; MIPS32R2-NEXT: nop 6887; MIPS32R2-NEXT: # %bb.2: # %entry 6888; MIPS32R2-NEXT: # in Loop: Header=BB17_1 Depth=1 6889; MIPS32R2-NEXT: move $5, $2 6890; MIPS32R2-NEXT: sc $5, 0($1) 6891; MIPS32R2-NEXT: beqz $5, $BB17_1 6892; MIPS32R2-NEXT: nop 6893; MIPS32R2-NEXT: $BB17_3: # %entry 6894; MIPS32R2-NEXT: xor $1, $4, $3 6895; MIPS32R2-NEXT: sltiu $2, $1, 1 6896; MIPS32R2-NEXT: sync 6897; MIPS32R2-NEXT: jr $ra 6898; MIPS32R2-NEXT: nop 6899; 6900; MIPS32R6-LABEL: zeroreg: 6901; MIPS32R6: # %bb.0: # %entry 6902; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 6903; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 6904; MIPS32R6-NEXT: addu $1, $2, $25 6905; MIPS32R6-NEXT: sync 6906; MIPS32R6-NEXT: addiu $2, $zero, 0 6907; MIPS32R6-NEXT: addiu $3, $zero, 1 6908; MIPS32R6-NEXT: lw $1, %got(a)($1) 6909; MIPS32R6-NEXT: $BB17_1: # %entry 6910; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 6911; MIPS32R6-NEXT: ll $4, 0($1) 6912; MIPS32R6-NEXT: bnec $4, $3, $BB17_3 6913; MIPS32R6-NEXT: # %bb.2: # %entry 6914; MIPS32R6-NEXT: # in Loop: Header=BB17_1 Depth=1 6915; MIPS32R6-NEXT: move $5, $2 6916; MIPS32R6-NEXT: sc $5, 0($1) 6917; MIPS32R6-NEXT: beqzc $5, $BB17_1 6918; MIPS32R6-NEXT: $BB17_3: # %entry 6919; MIPS32R6-NEXT: xor $1, $4, $3 6920; MIPS32R6-NEXT: sltiu $2, $1, 1 6921; MIPS32R6-NEXT: sync 6922; MIPS32R6-NEXT: jrc $ra 6923; 6924; MIPS32R6O0-LABEL: zeroreg: 6925; MIPS32R6O0: # %bb.0: # %entry 6926; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 6927; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 6928; MIPS32R6O0-NEXT: addu $1, $2, $25 6929; MIPS32R6O0-NEXT: sync 6930; MIPS32R6O0-NEXT: lw $4, %got(a)($1) 6931; MIPS32R6O0-NEXT: addiu $6, $zero, 0 6932; MIPS32R6O0-NEXT: addiu $2, $zero, 1 6933; MIPS32R6O0-NEXT: move $5, $2 6934; MIPS32R6O0-NEXT: $BB17_1: # %entry 6935; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 6936; MIPS32R6O0-NEXT: ll $1, 0($4) 6937; MIPS32R6O0-NEXT: bnec $1, $5, $BB17_3 6938; MIPS32R6O0-NEXT: # %bb.2: # %entry 6939; MIPS32R6O0-NEXT: # in Loop: Header=BB17_1 Depth=1 6940; MIPS32R6O0-NEXT: move $3, $6 6941; MIPS32R6O0-NEXT: sc $3, 0($4) 6942; MIPS32R6O0-NEXT: beqzc $3, $BB17_1 6943; MIPS32R6O0-NEXT: $BB17_3: # %entry 6944; MIPS32R6O0-NEXT: xor $1, $1, $2 6945; MIPS32R6O0-NEXT: sltiu $2, $1, 1 6946; MIPS32R6O0-NEXT: sync 6947; MIPS32R6O0-NEXT: jrc $ra 6948; 6949; MIPS4-LABEL: zeroreg: 6950; MIPS4: # %bb.0: # %entry 6951; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 6952; MIPS4-NEXT: daddu $1, $1, $25 6953; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 6954; MIPS4-NEXT: sync 6955; MIPS4-NEXT: addiu $2, $zero, 0 6956; MIPS4-NEXT: addiu $3, $zero, 1 6957; MIPS4-NEXT: ld $1, %got_disp(a)($1) 6958; MIPS4-NEXT: .LBB17_1: # %entry 6959; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 6960; MIPS4-NEXT: ll $4, 0($1) 6961; MIPS4-NEXT: bne $4, $3, .LBB17_3 6962; MIPS4-NEXT: nop 6963; MIPS4-NEXT: # %bb.2: # %entry 6964; MIPS4-NEXT: # in Loop: Header=BB17_1 Depth=1 6965; MIPS4-NEXT: move $5, $2 6966; MIPS4-NEXT: sc $5, 0($1) 6967; MIPS4-NEXT: beqz $5, .LBB17_1 6968; MIPS4-NEXT: nop 6969; MIPS4-NEXT: .LBB17_3: # %entry 6970; MIPS4-NEXT: xor $1, $4, $3 6971; MIPS4-NEXT: sltiu $2, $1, 1 6972; MIPS4-NEXT: sync 6973; MIPS4-NEXT: jr $ra 6974; MIPS4-NEXT: nop 6975; 6976; MIPS64-LABEL: zeroreg: 6977; MIPS64: # %bb.0: # %entry 6978; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 6979; MIPS64-NEXT: daddu $1, $1, $25 6980; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 6981; MIPS64-NEXT: sync 6982; MIPS64-NEXT: addiu $2, $zero, 0 6983; MIPS64-NEXT: addiu $3, $zero, 1 6984; MIPS64-NEXT: ld $1, %got_disp(a)($1) 6985; MIPS64-NEXT: .LBB17_1: # %entry 6986; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 6987; MIPS64-NEXT: ll $4, 0($1) 6988; MIPS64-NEXT: bne $4, $3, .LBB17_3 6989; MIPS64-NEXT: nop 6990; MIPS64-NEXT: # %bb.2: # %entry 6991; MIPS64-NEXT: # in Loop: Header=BB17_1 Depth=1 6992; MIPS64-NEXT: move $5, $2 6993; MIPS64-NEXT: sc $5, 0($1) 6994; MIPS64-NEXT: beqz $5, .LBB17_1 6995; MIPS64-NEXT: nop 6996; MIPS64-NEXT: .LBB17_3: # %entry 6997; MIPS64-NEXT: xor $1, $4, $3 6998; MIPS64-NEXT: sltiu $2, $1, 1 6999; MIPS64-NEXT: sync 7000; MIPS64-NEXT: jr $ra 7001; MIPS64-NEXT: nop 7002; 7003; MIPS64R2-LABEL: zeroreg: 7004; MIPS64R2: # %bb.0: # %entry 7005; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7006; MIPS64R2-NEXT: daddu $1, $1, $25 7007; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7008; MIPS64R2-NEXT: sync 7009; MIPS64R2-NEXT: addiu $2, $zero, 0 7010; MIPS64R2-NEXT: addiu $3, $zero, 1 7011; MIPS64R2-NEXT: ld $1, %got_disp(a)($1) 7012; MIPS64R2-NEXT: .LBB17_1: # %entry 7013; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 7014; MIPS64R2-NEXT: ll $4, 0($1) 7015; MIPS64R2-NEXT: bne $4, $3, .LBB17_3 7016; MIPS64R2-NEXT: nop 7017; MIPS64R2-NEXT: # %bb.2: # %entry 7018; MIPS64R2-NEXT: # in Loop: Header=BB17_1 Depth=1 7019; MIPS64R2-NEXT: move $5, $2 7020; MIPS64R2-NEXT: sc $5, 0($1) 7021; MIPS64R2-NEXT: beqz $5, .LBB17_1 7022; MIPS64R2-NEXT: nop 7023; MIPS64R2-NEXT: .LBB17_3: # %entry 7024; MIPS64R2-NEXT: xor $1, $4, $3 7025; MIPS64R2-NEXT: sltiu $2, $1, 1 7026; MIPS64R2-NEXT: sync 7027; MIPS64R2-NEXT: jr $ra 7028; MIPS64R2-NEXT: nop 7029; 7030; MIPS64R6-LABEL: zeroreg: 7031; MIPS64R6: # %bb.0: # %entry 7032; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7033; MIPS64R6-NEXT: daddu $1, $1, $25 7034; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7035; MIPS64R6-NEXT: sync 7036; MIPS64R6-NEXT: addiu $2, $zero, 0 7037; MIPS64R6-NEXT: addiu $3, $zero, 1 7038; MIPS64R6-NEXT: ld $1, %got_disp(a)($1) 7039; MIPS64R6-NEXT: .LBB17_1: # %entry 7040; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 7041; MIPS64R6-NEXT: ll $4, 0($1) 7042; MIPS64R6-NEXT: bnec $4, $3, .LBB17_3 7043; MIPS64R6-NEXT: # %bb.2: # %entry 7044; MIPS64R6-NEXT: # in Loop: Header=BB17_1 Depth=1 7045; MIPS64R6-NEXT: move $5, $2 7046; MIPS64R6-NEXT: sc $5, 0($1) 7047; MIPS64R6-NEXT: beqzc $5, .LBB17_1 7048; MIPS64R6-NEXT: .LBB17_3: # %entry 7049; MIPS64R6-NEXT: xor $1, $4, $3 7050; MIPS64R6-NEXT: sltiu $2, $1, 1 7051; MIPS64R6-NEXT: sync 7052; MIPS64R6-NEXT: jrc $ra 7053; 7054; MIPS64R6O0-LABEL: zeroreg: 7055; MIPS64R6O0: # %bb.0: # %entry 7056; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(zeroreg))) 7057; MIPS64R6O0-NEXT: daddu $1, $1, $25 7058; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg))) 7059; MIPS64R6O0-NEXT: sync 7060; MIPS64R6O0-NEXT: ld $4, %got_disp(a)($1) 7061; MIPS64R6O0-NEXT: addiu $6, $zero, 0 7062; MIPS64R6O0-NEXT: addiu $2, $zero, 1 7063; MIPS64R6O0-NEXT: move $5, $2 7064; MIPS64R6O0-NEXT: .LBB17_1: # %entry 7065; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7066; MIPS64R6O0-NEXT: ll $1, 0($4) 7067; MIPS64R6O0-NEXT: bnec $1, $5, .LBB17_3 7068; MIPS64R6O0-NEXT: # %bb.2: # %entry 7069; MIPS64R6O0-NEXT: # in Loop: Header=BB17_1 Depth=1 7070; MIPS64R6O0-NEXT: move $3, $6 7071; MIPS64R6O0-NEXT: sc $3, 0($4) 7072; MIPS64R6O0-NEXT: beqzc $3, .LBB17_1 7073; MIPS64R6O0-NEXT: .LBB17_3: # %entry 7074; MIPS64R6O0-NEXT: xor $1, $1, $2 7075; MIPS64R6O0-NEXT: sltiu $2, $1, 1 7076; MIPS64R6O0-NEXT: sync 7077; MIPS64R6O0-NEXT: jrc $ra 7078; 7079; MM32-LABEL: zeroreg: 7080; MM32: # %bb.0: # %entry 7081; MM32-NEXT: lui $2, %hi(_gp_disp) 7082; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 7083; MM32-NEXT: addu $2, $2, $25 7084; MM32-NEXT: sync 7085; MM32-NEXT: li16 $3, 0 7086; MM32-NEXT: li16 $4, 1 7087; MM32-NEXT: lw $1, %got(a)($2) 7088; MM32-NEXT: $BB17_1: # %entry 7089; MM32-NEXT: # =>This Inner Loop Header: Depth=1 7090; MM32-NEXT: ll $2, 0($1) 7091; MM32-NEXT: bne $2, $4, $BB17_3 7092; MM32-NEXT: nop 7093; MM32-NEXT: # %bb.2: # %entry 7094; MM32-NEXT: # in Loop: Header=BB17_1 Depth=1 7095; MM32-NEXT: move $5, $3 7096; MM32-NEXT: sc $5, 0($1) 7097; MM32-NEXT: beqzc $5, $BB17_1 7098; MM32-NEXT: $BB17_3: # %entry 7099; MM32-NEXT: xor $1, $2, $4 7100; MM32-NEXT: sltiu $2, $1, 1 7101; MM32-NEXT: sync 7102; MM32-NEXT: jrc $ra 7103; 7104; O1-LABEL: zeroreg: 7105; O1: # %bb.0: # %entry 7106; O1-NEXT: lui $2, %hi(_gp_disp) 7107; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 7108; O1-NEXT: addu $1, $2, $25 7109; O1-NEXT: sync 7110; O1-NEXT: addiu $2, $zero, 0 7111; O1-NEXT: addiu $3, $zero, 1 7112; O1-NEXT: lw $1, %got(a)($1) 7113; O1-NEXT: $BB17_1: # %entry 7114; O1-NEXT: # =>This Inner Loop Header: Depth=1 7115; O1-NEXT: ll $4, 0($1) 7116; O1-NEXT: bne $4, $3, $BB17_3 7117; O1-NEXT: nop 7118; O1-NEXT: # %bb.2: # %entry 7119; O1-NEXT: # in Loop: Header=BB17_1 Depth=1 7120; O1-NEXT: move $5, $2 7121; O1-NEXT: sc $5, 0($1) 7122; O1-NEXT: beqz $5, $BB17_1 7123; O1-NEXT: nop 7124; O1-NEXT: $BB17_3: # %entry 7125; O1-NEXT: xor $1, $4, $3 7126; O1-NEXT: sltiu $2, $1, 1 7127; O1-NEXT: sync 7128; O1-NEXT: jr $ra 7129; O1-NEXT: nop 7130; 7131; O2-LABEL: zeroreg: 7132; O2: # %bb.0: # %entry 7133; O2-NEXT: lui $2, %hi(_gp_disp) 7134; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 7135; O2-NEXT: addu $1, $2, $25 7136; O2-NEXT: sync 7137; O2-NEXT: addiu $2, $zero, 0 7138; O2-NEXT: addiu $3, $zero, 1 7139; O2-NEXT: lw $1, %got(a)($1) 7140; O2-NEXT: $BB17_1: # %entry 7141; O2-NEXT: # =>This Inner Loop Header: Depth=1 7142; O2-NEXT: ll $4, 0($1) 7143; O2-NEXT: bne $4, $3, $BB17_3 7144; O2-NEXT: nop 7145; O2-NEXT: # %bb.2: # %entry 7146; O2-NEXT: # in Loop: Header=BB17_1 Depth=1 7147; O2-NEXT: move $5, $2 7148; O2-NEXT: sc $5, 0($1) 7149; O2-NEXT: beqz $5, $BB17_1 7150; O2-NEXT: nop 7151; O2-NEXT: $BB17_3: # %entry 7152; O2-NEXT: xor $1, $4, $3 7153; O2-NEXT: sltiu $2, $1, 1 7154; O2-NEXT: sync 7155; O2-NEXT: jr $ra 7156; O2-NEXT: nop 7157; 7158; O3-LABEL: zeroreg: 7159; O3: # %bb.0: # %entry 7160; O3-NEXT: lui $2, %hi(_gp_disp) 7161; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 7162; O3-NEXT: addu $1, $2, $25 7163; O3-NEXT: addiu $2, $zero, 0 7164; O3-NEXT: addiu $3, $zero, 1 7165; O3-NEXT: sync 7166; O3-NEXT: lw $1, %got(a)($1) 7167; O3-NEXT: $BB17_1: # %entry 7168; O3-NEXT: # =>This Inner Loop Header: Depth=1 7169; O3-NEXT: ll $4, 0($1) 7170; O3-NEXT: bne $4, $3, $BB17_3 7171; O3-NEXT: nop 7172; O3-NEXT: # %bb.2: # %entry 7173; O3-NEXT: # in Loop: Header=BB17_1 Depth=1 7174; O3-NEXT: move $5, $2 7175; O3-NEXT: sc $5, 0($1) 7176; O3-NEXT: beqz $5, $BB17_1 7177; O3-NEXT: nop 7178; O3-NEXT: $BB17_3: # %entry 7179; O3-NEXT: sync 7180; O3-NEXT: xor $1, $4, $3 7181; O3-NEXT: jr $ra 7182; O3-NEXT: sltiu $2, $1, 1 7183; 7184; MIPS32EB-LABEL: zeroreg: 7185; MIPS32EB: # %bb.0: # %entry 7186; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 7187; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 7188; MIPS32EB-NEXT: addu $1, $2, $25 7189; MIPS32EB-NEXT: sync 7190; MIPS32EB-NEXT: addiu $2, $zero, 0 7191; MIPS32EB-NEXT: addiu $3, $zero, 1 7192; MIPS32EB-NEXT: lw $1, %got(a)($1) 7193; MIPS32EB-NEXT: $BB17_1: # %entry 7194; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 7195; MIPS32EB-NEXT: ll $4, 0($1) 7196; MIPS32EB-NEXT: bne $4, $3, $BB17_3 7197; MIPS32EB-NEXT: nop 7198; MIPS32EB-NEXT: # %bb.2: # %entry 7199; MIPS32EB-NEXT: # in Loop: Header=BB17_1 Depth=1 7200; MIPS32EB-NEXT: move $5, $2 7201; MIPS32EB-NEXT: sc $5, 0($1) 7202; MIPS32EB-NEXT: beqz $5, $BB17_1 7203; MIPS32EB-NEXT: nop 7204; MIPS32EB-NEXT: $BB17_3: # %entry 7205; MIPS32EB-NEXT: xor $1, $4, $3 7206; MIPS32EB-NEXT: sltiu $2, $1, 1 7207; MIPS32EB-NEXT: sync 7208; MIPS32EB-NEXT: jr $ra 7209; MIPS32EB-NEXT: nop 7210entry: 7211 %pair0 = cmpxchg ptr @a, i32 1, i32 0 seq_cst seq_cst 7212 %0 = extractvalue { i32, i1 } %pair0, 0 7213 %1 = icmp eq i32 %0, 1 7214 %conv = zext i1 %1 to i32 7215 ret i32 %conv 7216} 7217 7218; Check that MIPS32R6 has the correct offset range. 7219; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store. 7220define i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind { 7221; MIPS32-LABEL: AtomicLoadAdd32_OffGt9Bit: 7222; MIPS32: # %bb.0: # %entry 7223; MIPS32-NEXT: lui $2, %hi(_gp_disp) 7224; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 7225; MIPS32-NEXT: addu $1, $2, $25 7226; MIPS32-NEXT: lw $1, %got(x)($1) 7227; MIPS32-NEXT: addiu $1, $1, 1024 7228; MIPS32-NEXT: $BB18_1: # %entry 7229; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1 7230; MIPS32-NEXT: ll $2, 0($1) 7231; MIPS32-NEXT: addu $3, $2, $4 7232; MIPS32-NEXT: sc $3, 0($1) 7233; MIPS32-NEXT: beqz $3, $BB18_1 7234; MIPS32-NEXT: nop 7235; MIPS32-NEXT: # %bb.2: # %entry 7236; MIPS32-NEXT: jr $ra 7237; MIPS32-NEXT: nop 7238; 7239; MIPS32O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7240; MIPS32O0: # %bb.0: # %entry 7241; MIPS32O0-NEXT: lui $2, %hi(_gp_disp) 7242; MIPS32O0-NEXT: addiu $2, $2, %lo(_gp_disp) 7243; MIPS32O0-NEXT: addu $1, $2, $25 7244; MIPS32O0-NEXT: lw $1, %got(x)($1) 7245; MIPS32O0-NEXT: addiu $3, $1, 1024 7246; MIPS32O0-NEXT: $BB18_1: # %entry 7247; MIPS32O0-NEXT: # =>This Inner Loop Header: Depth=1 7248; MIPS32O0-NEXT: ll $2, 0($3) 7249; MIPS32O0-NEXT: addu $1, $2, $4 7250; MIPS32O0-NEXT: sc $1, 0($3) 7251; MIPS32O0-NEXT: beqz $1, $BB18_1 7252; MIPS32O0-NEXT: nop 7253; MIPS32O0-NEXT: # %bb.2: # %entry 7254; MIPS32O0-NEXT: jr $ra 7255; MIPS32O0-NEXT: nop 7256; 7257; MIPS32R2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7258; MIPS32R2: # %bb.0: # %entry 7259; MIPS32R2-NEXT: lui $2, %hi(_gp_disp) 7260; MIPS32R2-NEXT: addiu $2, $2, %lo(_gp_disp) 7261; MIPS32R2-NEXT: addu $1, $2, $25 7262; MIPS32R2-NEXT: lw $1, %got(x)($1) 7263; MIPS32R2-NEXT: addiu $1, $1, 1024 7264; MIPS32R2-NEXT: $BB18_1: # %entry 7265; MIPS32R2-NEXT: # =>This Inner Loop Header: Depth=1 7266; MIPS32R2-NEXT: ll $2, 0($1) 7267; MIPS32R2-NEXT: addu $3, $2, $4 7268; MIPS32R2-NEXT: sc $3, 0($1) 7269; MIPS32R2-NEXT: beqz $3, $BB18_1 7270; MIPS32R2-NEXT: nop 7271; MIPS32R2-NEXT: # %bb.2: # %entry 7272; MIPS32R2-NEXT: jr $ra 7273; MIPS32R2-NEXT: nop 7274; 7275; MIPS32R6-LABEL: AtomicLoadAdd32_OffGt9Bit: 7276; MIPS32R6: # %bb.0: # %entry 7277; MIPS32R6-NEXT: lui $2, %hi(_gp_disp) 7278; MIPS32R6-NEXT: addiu $2, $2, %lo(_gp_disp) 7279; MIPS32R6-NEXT: addu $1, $2, $25 7280; MIPS32R6-NEXT: lw $1, %got(x)($1) 7281; MIPS32R6-NEXT: addiu $1, $1, 1024 7282; MIPS32R6-NEXT: $BB18_1: # %entry 7283; MIPS32R6-NEXT: # =>This Inner Loop Header: Depth=1 7284; MIPS32R6-NEXT: ll $2, 0($1) 7285; MIPS32R6-NEXT: addu $3, $2, $4 7286; MIPS32R6-NEXT: sc $3, 0($1) 7287; MIPS32R6-NEXT: beqzc $3, $BB18_1 7288; MIPS32R6-NEXT: nop 7289; MIPS32R6-NEXT: # %bb.2: # %entry 7290; MIPS32R6-NEXT: jrc $ra 7291; 7292; MIPS32R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7293; MIPS32R6O0: # %bb.0: # %entry 7294; MIPS32R6O0-NEXT: lui $2, %hi(_gp_disp) 7295; MIPS32R6O0-NEXT: addiu $2, $2, %lo(_gp_disp) 7296; MIPS32R6O0-NEXT: addu $1, $2, $25 7297; MIPS32R6O0-NEXT: lw $1, %got(x)($1) 7298; MIPS32R6O0-NEXT: addiu $3, $1, 1024 7299; MIPS32R6O0-NEXT: $BB18_1: # %entry 7300; MIPS32R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7301; MIPS32R6O0-NEXT: ll $2, 0($3) 7302; MIPS32R6O0-NEXT: addu $1, $2, $4 7303; MIPS32R6O0-NEXT: sc $1, 0($3) 7304; MIPS32R6O0-NEXT: beqzc $1, $BB18_1 7305; MIPS32R6O0-NEXT: nop 7306; MIPS32R6O0-NEXT: # %bb.2: # %entry 7307; MIPS32R6O0-NEXT: jrc $ra 7308; 7309; MIPS4-LABEL: AtomicLoadAdd32_OffGt9Bit: 7310; MIPS4: # %bb.0: # %entry 7311; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7312; MIPS4-NEXT: daddu $1, $1, $25 7313; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7314; MIPS4-NEXT: ld $1, %got_disp(x)($1) 7315; MIPS4-NEXT: daddiu $1, $1, 1024 7316; MIPS4-NEXT: .LBB18_1: # %entry 7317; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 7318; MIPS4-NEXT: ll $2, 0($1) 7319; MIPS4-NEXT: addu $3, $2, $4 7320; MIPS4-NEXT: sc $3, 0($1) 7321; MIPS4-NEXT: beqz $3, .LBB18_1 7322; MIPS4-NEXT: nop 7323; MIPS4-NEXT: # %bb.2: # %entry 7324; MIPS4-NEXT: jr $ra 7325; MIPS4-NEXT: nop 7326; 7327; MIPS64-LABEL: AtomicLoadAdd32_OffGt9Bit: 7328; MIPS64: # %bb.0: # %entry 7329; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7330; MIPS64-NEXT: daddu $1, $1, $25 7331; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7332; MIPS64-NEXT: ld $1, %got_disp(x)($1) 7333; MIPS64-NEXT: daddiu $1, $1, 1024 7334; MIPS64-NEXT: .LBB18_1: # %entry 7335; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 7336; MIPS64-NEXT: ll $2, 0($1) 7337; MIPS64-NEXT: addu $3, $2, $4 7338; MIPS64-NEXT: sc $3, 0($1) 7339; MIPS64-NEXT: beqz $3, .LBB18_1 7340; MIPS64-NEXT: nop 7341; MIPS64-NEXT: # %bb.2: # %entry 7342; MIPS64-NEXT: jr $ra 7343; MIPS64-NEXT: nop 7344; 7345; MIPS64R2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7346; MIPS64R2: # %bb.0: # %entry 7347; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7348; MIPS64R2-NEXT: daddu $1, $1, $25 7349; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7350; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 7351; MIPS64R2-NEXT: daddiu $1, $1, 1024 7352; MIPS64R2-NEXT: .LBB18_1: # %entry 7353; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 7354; MIPS64R2-NEXT: ll $2, 0($1) 7355; MIPS64R2-NEXT: addu $3, $2, $4 7356; MIPS64R2-NEXT: sc $3, 0($1) 7357; MIPS64R2-NEXT: beqz $3, .LBB18_1 7358; MIPS64R2-NEXT: nop 7359; MIPS64R2-NEXT: # %bb.2: # %entry 7360; MIPS64R2-NEXT: jr $ra 7361; MIPS64R2-NEXT: nop 7362; 7363; MIPS64R6-LABEL: AtomicLoadAdd32_OffGt9Bit: 7364; MIPS64R6: # %bb.0: # %entry 7365; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7366; MIPS64R6-NEXT: daddu $1, $1, $25 7367; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7368; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 7369; MIPS64R6-NEXT: daddiu $1, $1, 1024 7370; MIPS64R6-NEXT: .LBB18_1: # %entry 7371; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 7372; MIPS64R6-NEXT: ll $2, 0($1) 7373; MIPS64R6-NEXT: addu $3, $2, $4 7374; MIPS64R6-NEXT: sc $3, 0($1) 7375; MIPS64R6-NEXT: beqzc $3, .LBB18_1 7376; MIPS64R6-NEXT: nop 7377; MIPS64R6-NEXT: # %bb.2: # %entry 7378; MIPS64R6-NEXT: jrc $ra 7379; 7380; MIPS64R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit: 7381; MIPS64R6O0: # %bb.0: # %entry 7382; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7383; MIPS64R6O0-NEXT: daddu $1, $1, $25 7384; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit))) 7385; MIPS64R6O0-NEXT: # kill: def $a0 killed $a0 killed $a0_64 7386; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 7387; MIPS64R6O0-NEXT: daddiu $3, $1, 1024 7388; MIPS64R6O0-NEXT: .LBB18_1: # %entry 7389; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 7390; MIPS64R6O0-NEXT: ll $2, 0($3) 7391; MIPS64R6O0-NEXT: addu $1, $2, $4 7392; MIPS64R6O0-NEXT: sc $1, 0($3) 7393; MIPS64R6O0-NEXT: beqzc $1, .LBB18_1 7394; MIPS64R6O0-NEXT: nop 7395; MIPS64R6O0-NEXT: # %bb.2: # %entry 7396; MIPS64R6O0-NEXT: jrc $ra 7397; 7398; MM32-LABEL: AtomicLoadAdd32_OffGt9Bit: 7399; MM32: # %bb.0: # %entry 7400; MM32-NEXT: lui $2, %hi(_gp_disp) 7401; MM32-NEXT: addiu $2, $2, %lo(_gp_disp) 7402; MM32-NEXT: addu $2, $2, $25 7403; MM32-NEXT: lw $1, %got(x)($2) 7404; MM32-NEXT: addiu $1, $1, 1024 7405; MM32-NEXT: $BB18_1: # %entry 7406; MM32-NEXT: # =>This Inner Loop Header: Depth=1 7407; MM32-NEXT: ll $2, 0($1) 7408; MM32-NEXT: addu16 $3, $2, $4 7409; MM32-NEXT: sc $3, 0($1) 7410; MM32-NEXT: beqzc $3, $BB18_1 7411; MM32-NEXT: # %bb.2: # %entry 7412; MM32-NEXT: jrc $ra 7413; 7414; O1-LABEL: AtomicLoadAdd32_OffGt9Bit: 7415; O1: # %bb.0: # %entry 7416; O1-NEXT: lui $2, %hi(_gp_disp) 7417; O1-NEXT: addiu $2, $2, %lo(_gp_disp) 7418; O1-NEXT: addu $1, $2, $25 7419; O1-NEXT: lw $1, %got(x)($1) 7420; O1-NEXT: addiu $1, $1, 1024 7421; O1-NEXT: $BB18_1: # %entry 7422; O1-NEXT: # =>This Inner Loop Header: Depth=1 7423; O1-NEXT: ll $2, 0($1) 7424; O1-NEXT: addu $3, $2, $4 7425; O1-NEXT: sc $3, 0($1) 7426; O1-NEXT: beqz $3, $BB18_1 7427; O1-NEXT: nop 7428; O1-NEXT: # %bb.2: # %entry 7429; O1-NEXT: jr $ra 7430; O1-NEXT: nop 7431; 7432; O2-LABEL: AtomicLoadAdd32_OffGt9Bit: 7433; O2: # %bb.0: # %entry 7434; O2-NEXT: lui $2, %hi(_gp_disp) 7435; O2-NEXT: addiu $2, $2, %lo(_gp_disp) 7436; O2-NEXT: addu $1, $2, $25 7437; O2-NEXT: lw $1, %got(x)($1) 7438; O2-NEXT: addiu $1, $1, 1024 7439; O2-NEXT: $BB18_1: # %entry 7440; O2-NEXT: # =>This Inner Loop Header: Depth=1 7441; O2-NEXT: ll $2, 0($1) 7442; O2-NEXT: addu $3, $2, $4 7443; O2-NEXT: sc $3, 0($1) 7444; O2-NEXT: beqz $3, $BB18_1 7445; O2-NEXT: nop 7446; O2-NEXT: # %bb.2: # %entry 7447; O2-NEXT: jr $ra 7448; O2-NEXT: nop 7449; 7450; O3-LABEL: AtomicLoadAdd32_OffGt9Bit: 7451; O3: # %bb.0: # %entry 7452; O3-NEXT: lui $2, %hi(_gp_disp) 7453; O3-NEXT: addiu $2, $2, %lo(_gp_disp) 7454; O3-NEXT: addu $1, $2, $25 7455; O3-NEXT: lw $1, %got(x)($1) 7456; O3-NEXT: addiu $1, $1, 1024 7457; O3-NEXT: $BB18_1: # %entry 7458; O3-NEXT: # =>This Inner Loop Header: Depth=1 7459; O3-NEXT: ll $2, 0($1) 7460; O3-NEXT: addu $3, $2, $4 7461; O3-NEXT: sc $3, 0($1) 7462; O3-NEXT: beqz $3, $BB18_1 7463; O3-NEXT: nop 7464; O3-NEXT: # %bb.2: # %entry 7465; O3-NEXT: jr $ra 7466; O3-NEXT: nop 7467; 7468; MIPS32EB-LABEL: AtomicLoadAdd32_OffGt9Bit: 7469; MIPS32EB: # %bb.0: # %entry 7470; MIPS32EB-NEXT: lui $2, %hi(_gp_disp) 7471; MIPS32EB-NEXT: addiu $2, $2, %lo(_gp_disp) 7472; MIPS32EB-NEXT: addu $1, $2, $25 7473; MIPS32EB-NEXT: lw $1, %got(x)($1) 7474; MIPS32EB-NEXT: addiu $1, $1, 1024 7475; MIPS32EB-NEXT: $BB18_1: # %entry 7476; MIPS32EB-NEXT: # =>This Inner Loop Header: Depth=1 7477; MIPS32EB-NEXT: ll $2, 0($1) 7478; MIPS32EB-NEXT: addu $3, $2, $4 7479; MIPS32EB-NEXT: sc $3, 0($1) 7480; MIPS32EB-NEXT: beqz $3, $BB18_1 7481; MIPS32EB-NEXT: nop 7482; MIPS32EB-NEXT: # %bb.2: # %entry 7483; MIPS32EB-NEXT: jr $ra 7484; MIPS32EB-NEXT: nop 7485entry: 7486 %0 = atomicrmw add ptr getelementptr(i32, ptr @x, i32 256), i32 %incr monotonic 7487 ret i32 %0 7488 7489} 7490