brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.4 KiB · 3d80d69 Raw
1038 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+32s,+d,+lam-bh < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 --mattr=+d,+lam-bh < %s | FileCheck %s --check-prefix=LA644 5;; We need to ensure that even if lam-bh is enabled6;; it will not generate the am*.b/h instruction on loongarch32.7 8define i8 @atomicrmw_xchg_i8_acquire(ptr %a, i8 %b) nounwind {9; LA32-LABEL: atomicrmw_xchg_i8_acquire:10; LA32:       # %bb.0:11; LA32-NEXT:    slli.w $a2, $a0, 312; LA32-NEXT:    bstrins.w $a0, $zero, 1, 013; LA32-NEXT:    ori $a3, $zero, 25514; LA32-NEXT:    sll.w $a3, $a3, $a215; LA32-NEXT:    andi $a1, $a1, 25516; LA32-NEXT:    sll.w $a1, $a1, $a217; LA32-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=118; LA32-NEXT:    ll.w $a4, $a0, 019; LA32-NEXT:    addi.w $a5, $a1, 020; LA32-NEXT:    xor $a5, $a4, $a521; LA32-NEXT:    and $a5, $a5, $a322; LA32-NEXT:    xor $a5, $a4, $a523; LA32-NEXT:    sc.w $a5, $a0, 024; LA32-NEXT:    beq $a5, $zero, .LBB0_125; LA32-NEXT:  # %bb.2:26; LA32-NEXT:    srl.w $a0, $a4, $a227; LA32-NEXT:    ret28;29; LA64-LABEL: atomicrmw_xchg_i8_acquire:30; LA64:       # %bb.0:31; LA64-NEXT:    amswap_db.b $a2, $a1, $a032; LA64-NEXT:    move $a0, $a233; LA64-NEXT:    ret34  %1 = atomicrmw xchg ptr %a, i8 %b acquire35  ret i8 %136}37 38define i8 @atomicrmw_xchg_0_i8_acquire(ptr %a) nounwind {39; LA32-LABEL: atomicrmw_xchg_0_i8_acquire:40; LA32:       # %bb.0:41; LA32-NEXT:    slli.w $a1, $a0, 342; LA32-NEXT:    bstrins.w $a0, $zero, 1, 043; LA32-NEXT:    ori $a2, $zero, 25544; LA32-NEXT:    sll.w $a2, $a2, $a145; LA32-NEXT:    nor $a2, $a2, $zero46; LA32-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=147; LA32-NEXT:    ll.w $a3, $a0, 048; LA32-NEXT:    and $a4, $a3, $a249; LA32-NEXT:    sc.w $a4, $a0, 050; LA32-NEXT:    beq $a4, $zero, .LBB1_151; LA32-NEXT:  # %bb.2:52; LA32-NEXT:    srl.w $a0, $a3, $a153; LA32-NEXT:    ret54;55; LA64-LABEL: atomicrmw_xchg_0_i8_acquire:56; LA64:       # %bb.0:57; LA64-NEXT:    amswap_db.b $a1, $zero, $a058; LA64-NEXT:    move $a0, $a159; LA64-NEXT:    ret60  %1 = atomicrmw xchg ptr %a, i8 0 acquire61  ret i8 %162}63 64define i8 @atomicrmw_xchg_minus_1_i8_acquire(ptr %a) nounwind {65; LA32-LABEL: atomicrmw_xchg_minus_1_i8_acquire:66; LA32:       # %bb.0:67; LA32-NEXT:    slli.w $a1, $a0, 368; LA32-NEXT:    bstrins.w $a0, $zero, 1, 069; LA32-NEXT:    ori $a2, $zero, 25570; LA32-NEXT:    sll.w $a2, $a2, $a171; LA32-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=172; LA32-NEXT:    ll.w $a3, $a0, 073; LA32-NEXT:    or $a4, $a3, $a274; LA32-NEXT:    sc.w $a4, $a0, 075; LA32-NEXT:    beq $a4, $zero, .LBB2_176; LA32-NEXT:  # %bb.2:77; LA32-NEXT:    srl.w $a0, $a3, $a178; LA32-NEXT:    ret79;80; LA64-LABEL: atomicrmw_xchg_minus_1_i8_acquire:81; LA64:       # %bb.0:82; LA64-NEXT:    addi.w $a2, $zero, -183; LA64-NEXT:    amswap_db.b $a1, $a2, $a084; LA64-NEXT:    move $a0, $a185; LA64-NEXT:    ret86  %1 = atomicrmw xchg ptr %a, i8 -1 acquire87  ret i8 %188}89 90define i16 @atomicrmw_xchg_i16_acquire(ptr %a, i16 %b) nounwind {91; LA32-LABEL: atomicrmw_xchg_i16_acquire:92; LA32:       # %bb.0:93; LA32-NEXT:    slli.w $a2, $a0, 394; LA32-NEXT:    bstrins.w $a0, $zero, 1, 095; LA32-NEXT:    lu12i.w $a3, 1596; LA32-NEXT:    ori $a3, $a3, 409597; LA32-NEXT:    sll.w $a3, $a3, $a298; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 099; LA32-NEXT:    sll.w $a1, $a1, $a2100; LA32-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1101; LA32-NEXT:    ll.w $a4, $a0, 0102; LA32-NEXT:    addi.w $a5, $a1, 0103; LA32-NEXT:    xor $a5, $a4, $a5104; LA32-NEXT:    and $a5, $a5, $a3105; LA32-NEXT:    xor $a5, $a4, $a5106; LA32-NEXT:    sc.w $a5, $a0, 0107; LA32-NEXT:    beq $a5, $zero, .LBB3_1108; LA32-NEXT:  # %bb.2:109; LA32-NEXT:    srl.w $a0, $a4, $a2110; LA32-NEXT:    ret111;112; LA64-LABEL: atomicrmw_xchg_i16_acquire:113; LA64:       # %bb.0:114; LA64-NEXT:    amswap_db.h $a2, $a1, $a0115; LA64-NEXT:    move $a0, $a2116; LA64-NEXT:    ret117  %1 = atomicrmw xchg ptr %a, i16 %b acquire118  ret i16 %1119}120 121define i16 @atomicrmw_xchg_0_i16_acquire(ptr %a) nounwind {122; LA32-LABEL: atomicrmw_xchg_0_i16_acquire:123; LA32:       # %bb.0:124; LA32-NEXT:    slli.w $a1, $a0, 3125; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0126; LA32-NEXT:    lu12i.w $a2, 15127; LA32-NEXT:    ori $a2, $a2, 4095128; LA32-NEXT:    sll.w $a2, $a2, $a1129; LA32-NEXT:    nor $a2, $a2, $zero130; LA32-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1131; LA32-NEXT:    ll.w $a3, $a0, 0132; LA32-NEXT:    and $a4, $a3, $a2133; LA32-NEXT:    sc.w $a4, $a0, 0134; LA32-NEXT:    beq $a4, $zero, .LBB4_1135; LA32-NEXT:  # %bb.2:136; LA32-NEXT:    srl.w $a0, $a3, $a1137; LA32-NEXT:    ret138;139; LA64-LABEL: atomicrmw_xchg_0_i16_acquire:140; LA64:       # %bb.0:141; LA64-NEXT:    amswap_db.h $a1, $zero, $a0142; LA64-NEXT:    move $a0, $a1143; LA64-NEXT:    ret144  %1 = atomicrmw xchg ptr %a, i16 0 acquire145  ret i16 %1146}147 148define i16 @atomicrmw_xchg_minus_1_i16_acquire(ptr %a) nounwind {149; LA32-LABEL: atomicrmw_xchg_minus_1_i16_acquire:150; LA32:       # %bb.0:151; LA32-NEXT:    slli.w $a1, $a0, 3152; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0153; LA32-NEXT:    lu12i.w $a2, 15154; LA32-NEXT:    ori $a2, $a2, 4095155; LA32-NEXT:    sll.w $a2, $a2, $a1156; LA32-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1157; LA32-NEXT:    ll.w $a3, $a0, 0158; LA32-NEXT:    or $a4, $a3, $a2159; LA32-NEXT:    sc.w $a4, $a0, 0160; LA32-NEXT:    beq $a4, $zero, .LBB5_1161; LA32-NEXT:  # %bb.2:162; LA32-NEXT:    srl.w $a0, $a3, $a1163; LA32-NEXT:    ret164;165; LA64-LABEL: atomicrmw_xchg_minus_1_i16_acquire:166; LA64:       # %bb.0:167; LA64-NEXT:    addi.w $a2, $zero, -1168; LA64-NEXT:    amswap_db.h $a1, $a2, $a0169; LA64-NEXT:    move $a0, $a1170; LA64-NEXT:    ret171  %1 = atomicrmw xchg ptr %a, i16 -1 acquire172  ret i16 %1173}174 175define i8 @atomicrmw_xchg_i8_release(ptr %a, i8 %b) nounwind {176; LA32-LABEL: atomicrmw_xchg_i8_release:177; LA32:       # %bb.0:178; LA32-NEXT:    slli.w $a2, $a0, 3179; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0180; LA32-NEXT:    ori $a3, $zero, 255181; LA32-NEXT:    sll.w $a3, $a3, $a2182; LA32-NEXT:    andi $a1, $a1, 255183; LA32-NEXT:    sll.w $a1, $a1, $a2184; LA32-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1185; LA32-NEXT:    ll.w $a4, $a0, 0186; LA32-NEXT:    addi.w $a5, $a1, 0187; LA32-NEXT:    xor $a5, $a4, $a5188; LA32-NEXT:    and $a5, $a5, $a3189; LA32-NEXT:    xor $a5, $a4, $a5190; LA32-NEXT:    sc.w $a5, $a0, 0191; LA32-NEXT:    beq $a5, $zero, .LBB6_1192; LA32-NEXT:  # %bb.2:193; LA32-NEXT:    srl.w $a0, $a4, $a2194; LA32-NEXT:    ret195;196; LA64-LABEL: atomicrmw_xchg_i8_release:197; LA64:       # %bb.0:198; LA64-NEXT:    amswap_db.b $a2, $a1, $a0199; LA64-NEXT:    move $a0, $a2200; LA64-NEXT:    ret201  %1 = atomicrmw xchg ptr %a, i8 %b release202  ret i8 %1203}204 205define i16 @atomicrmw_xchg_i16_release(ptr %a, i16 %b) nounwind {206; LA32-LABEL: atomicrmw_xchg_i16_release:207; LA32:       # %bb.0:208; LA32-NEXT:    slli.w $a2, $a0, 3209; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0210; LA32-NEXT:    lu12i.w $a3, 15211; LA32-NEXT:    ori $a3, $a3, 4095212; LA32-NEXT:    sll.w $a3, $a3, $a2213; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0214; LA32-NEXT:    sll.w $a1, $a1, $a2215; LA32-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1216; LA32-NEXT:    ll.w $a4, $a0, 0217; LA32-NEXT:    addi.w $a5, $a1, 0218; LA32-NEXT:    xor $a5, $a4, $a5219; LA32-NEXT:    and $a5, $a5, $a3220; LA32-NEXT:    xor $a5, $a4, $a5221; LA32-NEXT:    sc.w $a5, $a0, 0222; LA32-NEXT:    beq $a5, $zero, .LBB7_1223; LA32-NEXT:  # %bb.2:224; LA32-NEXT:    srl.w $a0, $a4, $a2225; LA32-NEXT:    ret226;227; LA64-LABEL: atomicrmw_xchg_i16_release:228; LA64:       # %bb.0:229; LA64-NEXT:    amswap_db.h $a2, $a1, $a0230; LA64-NEXT:    move $a0, $a2231; LA64-NEXT:    ret232  %1 = atomicrmw xchg ptr %a, i16 %b release233  ret i16 %1234}235 236define i8 @atomicrmw_xchg_i8_acq_rel(ptr %a, i8 %b) nounwind {237; LA32-LABEL: atomicrmw_xchg_i8_acq_rel:238; LA32:       # %bb.0:239; LA32-NEXT:    slli.w $a2, $a0, 3240; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0241; LA32-NEXT:    ori $a3, $zero, 255242; LA32-NEXT:    sll.w $a3, $a3, $a2243; LA32-NEXT:    andi $a1, $a1, 255244; LA32-NEXT:    sll.w $a1, $a1, $a2245; LA32-NEXT:  .LBB8_1: # =>This Inner Loop Header: Depth=1246; LA32-NEXT:    ll.w $a4, $a0, 0247; LA32-NEXT:    addi.w $a5, $a1, 0248; LA32-NEXT:    xor $a5, $a4, $a5249; LA32-NEXT:    and $a5, $a5, $a3250; LA32-NEXT:    xor $a5, $a4, $a5251; LA32-NEXT:    sc.w $a5, $a0, 0252; LA32-NEXT:    beq $a5, $zero, .LBB8_1253; LA32-NEXT:  # %bb.2:254; LA32-NEXT:    srl.w $a0, $a4, $a2255; LA32-NEXT:    ret256;257; LA64-LABEL: atomicrmw_xchg_i8_acq_rel:258; LA64:       # %bb.0:259; LA64-NEXT:    amswap_db.b $a2, $a1, $a0260; LA64-NEXT:    move $a0, $a2261; LA64-NEXT:    ret262  %1 = atomicrmw xchg ptr %a, i8 %b acq_rel263  ret i8 %1264}265 266define i16 @atomicrmw_xchg_i16_acq_rel(ptr %a, i16 %b) nounwind {267; LA32-LABEL: atomicrmw_xchg_i16_acq_rel:268; LA32:       # %bb.0:269; LA32-NEXT:    slli.w $a2, $a0, 3270; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0271; LA32-NEXT:    lu12i.w $a3, 15272; LA32-NEXT:    ori $a3, $a3, 4095273; LA32-NEXT:    sll.w $a3, $a3, $a2274; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0275; LA32-NEXT:    sll.w $a1, $a1, $a2276; LA32-NEXT:  .LBB9_1: # =>This Inner Loop Header: Depth=1277; LA32-NEXT:    ll.w $a4, $a0, 0278; LA32-NEXT:    addi.w $a5, $a1, 0279; LA32-NEXT:    xor $a5, $a4, $a5280; LA32-NEXT:    and $a5, $a5, $a3281; LA32-NEXT:    xor $a5, $a4, $a5282; LA32-NEXT:    sc.w $a5, $a0, 0283; LA32-NEXT:    beq $a5, $zero, .LBB9_1284; LA32-NEXT:  # %bb.2:285; LA32-NEXT:    srl.w $a0, $a4, $a2286; LA32-NEXT:    ret287;288; LA64-LABEL: atomicrmw_xchg_i16_acq_rel:289; LA64:       # %bb.0:290; LA64-NEXT:    amswap_db.h $a2, $a1, $a0291; LA64-NEXT:    move $a0, $a2292; LA64-NEXT:    ret293  %1 = atomicrmw xchg ptr %a, i16 %b acq_rel294  ret i16 %1295}296 297define i8 @atomicrmw_xchg_i8_seq_cst(ptr %a, i8 %b) nounwind {298; LA32-LABEL: atomicrmw_xchg_i8_seq_cst:299; LA32:       # %bb.0:300; LA32-NEXT:    slli.w $a2, $a0, 3301; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0302; LA32-NEXT:    ori $a3, $zero, 255303; LA32-NEXT:    sll.w $a3, $a3, $a2304; LA32-NEXT:    andi $a1, $a1, 255305; LA32-NEXT:    sll.w $a1, $a1, $a2306; LA32-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1307; LA32-NEXT:    ll.w $a4, $a0, 0308; LA32-NEXT:    addi.w $a5, $a1, 0309; LA32-NEXT:    xor $a5, $a4, $a5310; LA32-NEXT:    and $a5, $a5, $a3311; LA32-NEXT:    xor $a5, $a4, $a5312; LA32-NEXT:    sc.w $a5, $a0, 0313; LA32-NEXT:    beq $a5, $zero, .LBB10_1314; LA32-NEXT:  # %bb.2:315; LA32-NEXT:    srl.w $a0, $a4, $a2316; LA32-NEXT:    ret317;318; LA64-LABEL: atomicrmw_xchg_i8_seq_cst:319; LA64:       # %bb.0:320; LA64-NEXT:    amswap_db.b $a2, $a1, $a0321; LA64-NEXT:    move $a0, $a2322; LA64-NEXT:    ret323  %1 = atomicrmw xchg ptr %a, i8 %b seq_cst324  ret i8 %1325}326 327define i16 @atomicrmw_xchg_i16_seq_cst(ptr %a, i16 %b) nounwind {328; LA32-LABEL: atomicrmw_xchg_i16_seq_cst:329; LA32:       # %bb.0:330; LA32-NEXT:    slli.w $a2, $a0, 3331; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0332; LA32-NEXT:    lu12i.w $a3, 15333; LA32-NEXT:    ori $a3, $a3, 4095334; LA32-NEXT:    sll.w $a3, $a3, $a2335; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0336; LA32-NEXT:    sll.w $a1, $a1, $a2337; LA32-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1338; LA32-NEXT:    ll.w $a4, $a0, 0339; LA32-NEXT:    addi.w $a5, $a1, 0340; LA32-NEXT:    xor $a5, $a4, $a5341; LA32-NEXT:    and $a5, $a5, $a3342; LA32-NEXT:    xor $a5, $a4, $a5343; LA32-NEXT:    sc.w $a5, $a0, 0344; LA32-NEXT:    beq $a5, $zero, .LBB11_1345; LA32-NEXT:  # %bb.2:346; LA32-NEXT:    srl.w $a0, $a4, $a2347; LA32-NEXT:    ret348;349; LA64-LABEL: atomicrmw_xchg_i16_seq_cst:350; LA64:       # %bb.0:351; LA64-NEXT:    amswap_db.h $a2, $a1, $a0352; LA64-NEXT:    move $a0, $a2353; LA64-NEXT:    ret354  %1 = atomicrmw xchg ptr %a, i16 %b seq_cst355  ret i16 %1356}357 358define i8 @atomicrmw_xchg_i8_monotonic(ptr %a, i8 %b) nounwind {359; LA32-LABEL: atomicrmw_xchg_i8_monotonic:360; LA32:       # %bb.0:361; LA32-NEXT:    slli.w $a2, $a0, 3362; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0363; LA32-NEXT:    ori $a3, $zero, 255364; LA32-NEXT:    sll.w $a3, $a3, $a2365; LA32-NEXT:    andi $a1, $a1, 255366; LA32-NEXT:    sll.w $a1, $a1, $a2367; LA32-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1368; LA32-NEXT:    ll.w $a4, $a0, 0369; LA32-NEXT:    addi.w $a5, $a1, 0370; LA32-NEXT:    xor $a5, $a4, $a5371; LA32-NEXT:    and $a5, $a5, $a3372; LA32-NEXT:    xor $a5, $a4, $a5373; LA32-NEXT:    sc.w $a5, $a0, 0374; LA32-NEXT:    beq $a5, $zero, .LBB12_1375; LA32-NEXT:  # %bb.2:376; LA32-NEXT:    srl.w $a0, $a4, $a2377; LA32-NEXT:    ret378;379; LA64-LABEL: atomicrmw_xchg_i8_monotonic:380; LA64:       # %bb.0:381; LA64-NEXT:    amswap.b $a2, $a1, $a0382; LA64-NEXT:    move $a0, $a2383; LA64-NEXT:    ret384  %1 = atomicrmw xchg ptr %a, i8 %b monotonic385  ret i8 %1386}387 388define i16 @atomicrmw_xchg_i16_monotonic(ptr %a, i16 %b) nounwind {389; LA32-LABEL: atomicrmw_xchg_i16_monotonic:390; LA32:       # %bb.0:391; LA32-NEXT:    slli.w $a2, $a0, 3392; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0393; LA32-NEXT:    lu12i.w $a3, 15394; LA32-NEXT:    ori $a3, $a3, 4095395; LA32-NEXT:    sll.w $a3, $a3, $a2396; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0397; LA32-NEXT:    sll.w $a1, $a1, $a2398; LA32-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1399; LA32-NEXT:    ll.w $a4, $a0, 0400; LA32-NEXT:    addi.w $a5, $a1, 0401; LA32-NEXT:    xor $a5, $a4, $a5402; LA32-NEXT:    and $a5, $a5, $a3403; LA32-NEXT:    xor $a5, $a4, $a5404; LA32-NEXT:    sc.w $a5, $a0, 0405; LA32-NEXT:    beq $a5, $zero, .LBB13_1406; LA32-NEXT:  # %bb.2:407; LA32-NEXT:    srl.w $a0, $a4, $a2408; LA32-NEXT:    ret409;410; LA64-LABEL: atomicrmw_xchg_i16_monotonic:411; LA64:       # %bb.0:412; LA64-NEXT:    amswap.h $a2, $a1, $a0413; LA64-NEXT:    move $a0, $a2414; LA64-NEXT:    ret415  %1 = atomicrmw xchg ptr %a, i16 %b monotonic416  ret i16 %1417}418 419define i8 @atomicrmw_add_i8_acquire(ptr %a, i8 %b) nounwind {420; LA32-LABEL: atomicrmw_add_i8_acquire:421; LA32:       # %bb.0:422; LA32-NEXT:    slli.w $a2, $a0, 3423; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0424; LA32-NEXT:    ori $a3, $zero, 255425; LA32-NEXT:    sll.w $a3, $a3, $a2426; LA32-NEXT:    andi $a1, $a1, 255427; LA32-NEXT:    sll.w $a1, $a1, $a2428; LA32-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1429; LA32-NEXT:    ll.w $a4, $a0, 0430; LA32-NEXT:    add.w $a5, $a4, $a1431; LA32-NEXT:    xor $a5, $a4, $a5432; LA32-NEXT:    and $a5, $a5, $a3433; LA32-NEXT:    xor $a5, $a4, $a5434; LA32-NEXT:    sc.w $a5, $a0, 0435; LA32-NEXT:    beq $a5, $zero, .LBB14_1436; LA32-NEXT:  # %bb.2:437; LA32-NEXT:    srl.w $a0, $a4, $a2438; LA32-NEXT:    ret439;440; LA64-LABEL: atomicrmw_add_i8_acquire:441; LA64:       # %bb.0:442; LA64-NEXT:    amadd_db.b $a2, $a1, $a0443; LA64-NEXT:    move $a0, $a2444; LA64-NEXT:    ret445  %1 = atomicrmw add ptr %a, i8 %b acquire446  ret i8 %1447}448 449define i16 @atomicrmw_add_i16_acquire(ptr %a, i16 %b) nounwind {450; LA32-LABEL: atomicrmw_add_i16_acquire:451; LA32:       # %bb.0:452; LA32-NEXT:    slli.w $a2, $a0, 3453; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0454; LA32-NEXT:    lu12i.w $a3, 15455; LA32-NEXT:    ori $a3, $a3, 4095456; LA32-NEXT:    sll.w $a3, $a3, $a2457; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0458; LA32-NEXT:    sll.w $a1, $a1, $a2459; LA32-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1460; LA32-NEXT:    ll.w $a4, $a0, 0461; LA32-NEXT:    add.w $a5, $a4, $a1462; LA32-NEXT:    xor $a5, $a4, $a5463; LA32-NEXT:    and $a5, $a5, $a3464; LA32-NEXT:    xor $a5, $a4, $a5465; LA32-NEXT:    sc.w $a5, $a0, 0466; LA32-NEXT:    beq $a5, $zero, .LBB15_1467; LA32-NEXT:  # %bb.2:468; LA32-NEXT:    srl.w $a0, $a4, $a2469; LA32-NEXT:    ret470;471; LA64-LABEL: atomicrmw_add_i16_acquire:472; LA64:       # %bb.0:473; LA64-NEXT:    amadd_db.h $a2, $a1, $a0474; LA64-NEXT:    move $a0, $a2475; LA64-NEXT:    ret476  %1 = atomicrmw add ptr %a, i16 %b acquire477  ret i16 %1478}479 480define i8 @atomicrmw_add_i8_release(ptr %a, i8 %b) nounwind {481; LA32-LABEL: atomicrmw_add_i8_release:482; LA32:       # %bb.0:483; LA32-NEXT:    slli.w $a2, $a0, 3484; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0485; LA32-NEXT:    ori $a3, $zero, 255486; LA32-NEXT:    sll.w $a3, $a3, $a2487; LA32-NEXT:    andi $a1, $a1, 255488; LA32-NEXT:    sll.w $a1, $a1, $a2489; LA32-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1490; LA32-NEXT:    ll.w $a4, $a0, 0491; LA32-NEXT:    add.w $a5, $a4, $a1492; LA32-NEXT:    xor $a5, $a4, $a5493; LA32-NEXT:    and $a5, $a5, $a3494; LA32-NEXT:    xor $a5, $a4, $a5495; LA32-NEXT:    sc.w $a5, $a0, 0496; LA32-NEXT:    beq $a5, $zero, .LBB16_1497; LA32-NEXT:  # %bb.2:498; LA32-NEXT:    srl.w $a0, $a4, $a2499; LA32-NEXT:    ret500;501; LA64-LABEL: atomicrmw_add_i8_release:502; LA64:       # %bb.0:503; LA64-NEXT:    amadd_db.b $a2, $a1, $a0504; LA64-NEXT:    move $a0, $a2505; LA64-NEXT:    ret506  %1 = atomicrmw add ptr %a, i8 %b release507  ret i8 %1508}509 510define i16 @atomicrmw_add_i16_release(ptr %a, i16 %b) nounwind {511; LA32-LABEL: atomicrmw_add_i16_release:512; LA32:       # %bb.0:513; LA32-NEXT:    slli.w $a2, $a0, 3514; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0515; LA32-NEXT:    lu12i.w $a3, 15516; LA32-NEXT:    ori $a3, $a3, 4095517; LA32-NEXT:    sll.w $a3, $a3, $a2518; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0519; LA32-NEXT:    sll.w $a1, $a1, $a2520; LA32-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1521; LA32-NEXT:    ll.w $a4, $a0, 0522; LA32-NEXT:    add.w $a5, $a4, $a1523; LA32-NEXT:    xor $a5, $a4, $a5524; LA32-NEXT:    and $a5, $a5, $a3525; LA32-NEXT:    xor $a5, $a4, $a5526; LA32-NEXT:    sc.w $a5, $a0, 0527; LA32-NEXT:    beq $a5, $zero, .LBB17_1528; LA32-NEXT:  # %bb.2:529; LA32-NEXT:    srl.w $a0, $a4, $a2530; LA32-NEXT:    ret531;532; LA64-LABEL: atomicrmw_add_i16_release:533; LA64:       # %bb.0:534; LA64-NEXT:    amadd_db.h $a2, $a1, $a0535; LA64-NEXT:    move $a0, $a2536; LA64-NEXT:    ret537  %1 = atomicrmw add ptr %a, i16 %b release538  ret i16 %1539}540 541define i8 @atomicrmw_add_i8_acq_rel(ptr %a, i8 %b) nounwind {542; LA32-LABEL: atomicrmw_add_i8_acq_rel:543; LA32:       # %bb.0:544; LA32-NEXT:    slli.w $a2, $a0, 3545; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0546; LA32-NEXT:    ori $a3, $zero, 255547; LA32-NEXT:    sll.w $a3, $a3, $a2548; LA32-NEXT:    andi $a1, $a1, 255549; LA32-NEXT:    sll.w $a1, $a1, $a2550; LA32-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1551; LA32-NEXT:    ll.w $a4, $a0, 0552; LA32-NEXT:    add.w $a5, $a4, $a1553; LA32-NEXT:    xor $a5, $a4, $a5554; LA32-NEXT:    and $a5, $a5, $a3555; LA32-NEXT:    xor $a5, $a4, $a5556; LA32-NEXT:    sc.w $a5, $a0, 0557; LA32-NEXT:    beq $a5, $zero, .LBB18_1558; LA32-NEXT:  # %bb.2:559; LA32-NEXT:    srl.w $a0, $a4, $a2560; LA32-NEXT:    ret561;562; LA64-LABEL: atomicrmw_add_i8_acq_rel:563; LA64:       # %bb.0:564; LA64-NEXT:    amadd_db.b $a2, $a1, $a0565; LA64-NEXT:    move $a0, $a2566; LA64-NEXT:    ret567  %1 = atomicrmw add ptr %a, i8 %b acq_rel568  ret i8 %1569}570 571define i16 @atomicrmw_add_i16_acq_rel(ptr %a, i16 %b) nounwind {572; LA32-LABEL: atomicrmw_add_i16_acq_rel:573; LA32:       # %bb.0:574; LA32-NEXT:    slli.w $a2, $a0, 3575; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0576; LA32-NEXT:    lu12i.w $a3, 15577; LA32-NEXT:    ori $a3, $a3, 4095578; LA32-NEXT:    sll.w $a3, $a3, $a2579; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0580; LA32-NEXT:    sll.w $a1, $a1, $a2581; LA32-NEXT:  .LBB19_1: # =>This Inner Loop Header: Depth=1582; LA32-NEXT:    ll.w $a4, $a0, 0583; LA32-NEXT:    add.w $a5, $a4, $a1584; LA32-NEXT:    xor $a5, $a4, $a5585; LA32-NEXT:    and $a5, $a5, $a3586; LA32-NEXT:    xor $a5, $a4, $a5587; LA32-NEXT:    sc.w $a5, $a0, 0588; LA32-NEXT:    beq $a5, $zero, .LBB19_1589; LA32-NEXT:  # %bb.2:590; LA32-NEXT:    srl.w $a0, $a4, $a2591; LA32-NEXT:    ret592;593; LA64-LABEL: atomicrmw_add_i16_acq_rel:594; LA64:       # %bb.0:595; LA64-NEXT:    amadd_db.h $a2, $a1, $a0596; LA64-NEXT:    move $a0, $a2597; LA64-NEXT:    ret598  %1 = atomicrmw add ptr %a, i16 %b acq_rel599  ret i16 %1600}601 602define i8 @atomicrmw_add_i8_seq_cst(ptr %a, i8 %b) nounwind {603; LA32-LABEL: atomicrmw_add_i8_seq_cst:604; LA32:       # %bb.0:605; LA32-NEXT:    slli.w $a2, $a0, 3606; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0607; LA32-NEXT:    ori $a3, $zero, 255608; LA32-NEXT:    sll.w $a3, $a3, $a2609; LA32-NEXT:    andi $a1, $a1, 255610; LA32-NEXT:    sll.w $a1, $a1, $a2611; LA32-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1612; LA32-NEXT:    ll.w $a4, $a0, 0613; LA32-NEXT:    add.w $a5, $a4, $a1614; LA32-NEXT:    xor $a5, $a4, $a5615; LA32-NEXT:    and $a5, $a5, $a3616; LA32-NEXT:    xor $a5, $a4, $a5617; LA32-NEXT:    sc.w $a5, $a0, 0618; LA32-NEXT:    beq $a5, $zero, .LBB20_1619; LA32-NEXT:  # %bb.2:620; LA32-NEXT:    srl.w $a0, $a4, $a2621; LA32-NEXT:    ret622;623; LA64-LABEL: atomicrmw_add_i8_seq_cst:624; LA64:       # %bb.0:625; LA64-NEXT:    amadd_db.b $a2, $a1, $a0626; LA64-NEXT:    move $a0, $a2627; LA64-NEXT:    ret628  %1 = atomicrmw add ptr %a, i8 %b seq_cst629  ret i8 %1630}631 632define i16 @atomicrmw_add_i16_seq_cst(ptr %a, i16 %b) nounwind {633; LA32-LABEL: atomicrmw_add_i16_seq_cst:634; LA32:       # %bb.0:635; LA32-NEXT:    slli.w $a2, $a0, 3636; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0637; LA32-NEXT:    lu12i.w $a3, 15638; LA32-NEXT:    ori $a3, $a3, 4095639; LA32-NEXT:    sll.w $a3, $a3, $a2640; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0641; LA32-NEXT:    sll.w $a1, $a1, $a2642; LA32-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1643; LA32-NEXT:    ll.w $a4, $a0, 0644; LA32-NEXT:    add.w $a5, $a4, $a1645; LA32-NEXT:    xor $a5, $a4, $a5646; LA32-NEXT:    and $a5, $a5, $a3647; LA32-NEXT:    xor $a5, $a4, $a5648; LA32-NEXT:    sc.w $a5, $a0, 0649; LA32-NEXT:    beq $a5, $zero, .LBB21_1650; LA32-NEXT:  # %bb.2:651; LA32-NEXT:    srl.w $a0, $a4, $a2652; LA32-NEXT:    ret653;654; LA64-LABEL: atomicrmw_add_i16_seq_cst:655; LA64:       # %bb.0:656; LA64-NEXT:    amadd_db.h $a2, $a1, $a0657; LA64-NEXT:    move $a0, $a2658; LA64-NEXT:    ret659  %1 = atomicrmw add ptr %a, i16 %b seq_cst660  ret i16 %1661}662 663define i8 @atomicrmw_add_i8_monotonic(ptr %a, i8 %b) nounwind {664; LA32-LABEL: atomicrmw_add_i8_monotonic:665; LA32:       # %bb.0:666; LA32-NEXT:    slli.w $a2, $a0, 3667; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0668; LA32-NEXT:    ori $a3, $zero, 255669; LA32-NEXT:    sll.w $a3, $a3, $a2670; LA32-NEXT:    andi $a1, $a1, 255671; LA32-NEXT:    sll.w $a1, $a1, $a2672; LA32-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1673; LA32-NEXT:    ll.w $a4, $a0, 0674; LA32-NEXT:    add.w $a5, $a4, $a1675; LA32-NEXT:    xor $a5, $a4, $a5676; LA32-NEXT:    and $a5, $a5, $a3677; LA32-NEXT:    xor $a5, $a4, $a5678; LA32-NEXT:    sc.w $a5, $a0, 0679; LA32-NEXT:    beq $a5, $zero, .LBB22_1680; LA32-NEXT:  # %bb.2:681; LA32-NEXT:    srl.w $a0, $a4, $a2682; LA32-NEXT:    ret683;684; LA64-LABEL: atomicrmw_add_i8_monotonic:685; LA64:       # %bb.0:686; LA64-NEXT:    amadd.b $a2, $a1, $a0687; LA64-NEXT:    move $a0, $a2688; LA64-NEXT:    ret689  %1 = atomicrmw add ptr %a, i8 %b monotonic690  ret i8 %1691}692 693define i16 @atomicrmw_add_i16_monotonic(ptr %a, i16 %b) nounwind {694; LA32-LABEL: atomicrmw_add_i16_monotonic:695; LA32:       # %bb.0:696; LA32-NEXT:    slli.w $a2, $a0, 3697; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0698; LA32-NEXT:    lu12i.w $a3, 15699; LA32-NEXT:    ori $a3, $a3, 4095700; LA32-NEXT:    sll.w $a3, $a3, $a2701; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0702; LA32-NEXT:    sll.w $a1, $a1, $a2703; LA32-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1704; LA32-NEXT:    ll.w $a4, $a0, 0705; LA32-NEXT:    add.w $a5, $a4, $a1706; LA32-NEXT:    xor $a5, $a4, $a5707; LA32-NEXT:    and $a5, $a5, $a3708; LA32-NEXT:    xor $a5, $a4, $a5709; LA32-NEXT:    sc.w $a5, $a0, 0710; LA32-NEXT:    beq $a5, $zero, .LBB23_1711; LA32-NEXT:  # %bb.2:712; LA32-NEXT:    srl.w $a0, $a4, $a2713; LA32-NEXT:    ret714;715; LA64-LABEL: atomicrmw_add_i16_monotonic:716; LA64:       # %bb.0:717; LA64-NEXT:    amadd.h $a2, $a1, $a0718; LA64-NEXT:    move $a0, $a2719; LA64-NEXT:    ret720  %1 = atomicrmw add ptr %a, i16 %b monotonic721  ret i16 %1722}723 724define i8 @atomicrmw_sub_i8_acquire(ptr %a, i8 %b) nounwind {725; LA32-LABEL: atomicrmw_sub_i8_acquire:726; LA32:       # %bb.0:727; LA32-NEXT:    slli.w $a2, $a0, 3728; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0729; LA32-NEXT:    ori $a3, $zero, 255730; LA32-NEXT:    sll.w $a3, $a3, $a2731; LA32-NEXT:    andi $a1, $a1, 255732; LA32-NEXT:    sll.w $a1, $a1, $a2733; LA32-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1734; LA32-NEXT:    ll.w $a4, $a0, 0735; LA32-NEXT:    sub.w $a5, $a4, $a1736; LA32-NEXT:    xor $a5, $a4, $a5737; LA32-NEXT:    and $a5, $a5, $a3738; LA32-NEXT:    xor $a5, $a4, $a5739; LA32-NEXT:    sc.w $a5, $a0, 0740; LA32-NEXT:    beq $a5, $zero, .LBB24_1741; LA32-NEXT:  # %bb.2:742; LA32-NEXT:    srl.w $a0, $a4, $a2743; LA32-NEXT:    ret744;745; LA64-LABEL: atomicrmw_sub_i8_acquire:746; LA64:       # %bb.0:747; LA64-NEXT:    sub.w $a2, $zero, $a1748; LA64-NEXT:    amadd_db.b $a1, $a2, $a0749; LA64-NEXT:    move $a0, $a1750; LA64-NEXT:    ret751  %1 = atomicrmw sub ptr %a, i8 %b acquire752  ret i8 %1753}754 755define i16 @atomicrmw_sub_i16_acquire(ptr %a, i16 %b) nounwind {756; LA32-LABEL: atomicrmw_sub_i16_acquire:757; LA32:       # %bb.0:758; LA32-NEXT:    slli.w $a2, $a0, 3759; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0760; LA32-NEXT:    lu12i.w $a3, 15761; LA32-NEXT:    ori $a3, $a3, 4095762; LA32-NEXT:    sll.w $a3, $a3, $a2763; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0764; LA32-NEXT:    sll.w $a1, $a1, $a2765; LA32-NEXT:  .LBB25_1: # =>This Inner Loop Header: Depth=1766; LA32-NEXT:    ll.w $a4, $a0, 0767; LA32-NEXT:    sub.w $a5, $a4, $a1768; LA32-NEXT:    xor $a5, $a4, $a5769; LA32-NEXT:    and $a5, $a5, $a3770; LA32-NEXT:    xor $a5, $a4, $a5771; LA32-NEXT:    sc.w $a5, $a0, 0772; LA32-NEXT:    beq $a5, $zero, .LBB25_1773; LA32-NEXT:  # %bb.2:774; LA32-NEXT:    srl.w $a0, $a4, $a2775; LA32-NEXT:    ret776;777; LA64-LABEL: atomicrmw_sub_i16_acquire:778; LA64:       # %bb.0:779; LA64-NEXT:    sub.w $a2, $zero, $a1780; LA64-NEXT:    amadd_db.h $a1, $a2, $a0781; LA64-NEXT:    move $a0, $a1782; LA64-NEXT:    ret783  %1 = atomicrmw sub ptr %a, i16 %b acquire784  ret i16 %1785}786 787define i8 @atomicrmw_sub_i8_release(ptr %a, i8 %b) nounwind {788; LA32-LABEL: atomicrmw_sub_i8_release:789; LA32:       # %bb.0:790; LA32-NEXT:    slli.w $a2, $a0, 3791; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0792; LA32-NEXT:    ori $a3, $zero, 255793; LA32-NEXT:    sll.w $a3, $a3, $a2794; LA32-NEXT:    andi $a1, $a1, 255795; LA32-NEXT:    sll.w $a1, $a1, $a2796; LA32-NEXT:  .LBB26_1: # =>This Inner Loop Header: Depth=1797; LA32-NEXT:    ll.w $a4, $a0, 0798; LA32-NEXT:    sub.w $a5, $a4, $a1799; LA32-NEXT:    xor $a5, $a4, $a5800; LA32-NEXT:    and $a5, $a5, $a3801; LA32-NEXT:    xor $a5, $a4, $a5802; LA32-NEXT:    sc.w $a5, $a0, 0803; LA32-NEXT:    beq $a5, $zero, .LBB26_1804; LA32-NEXT:  # %bb.2:805; LA32-NEXT:    srl.w $a0, $a4, $a2806; LA32-NEXT:    ret807;808; LA64-LABEL: atomicrmw_sub_i8_release:809; LA64:       # %bb.0:810; LA64-NEXT:    sub.w $a2, $zero, $a1811; LA64-NEXT:    amadd_db.b $a1, $a2, $a0812; LA64-NEXT:    move $a0, $a1813; LA64-NEXT:    ret814  %1 = atomicrmw sub ptr %a, i8 %b release815  ret i8 %1816}817 818define i16 @atomicrmw_sub_i16_release(ptr %a, i16 %b) nounwind {819; LA32-LABEL: atomicrmw_sub_i16_release:820; LA32:       # %bb.0:821; LA32-NEXT:    slli.w $a2, $a0, 3822; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0823; LA32-NEXT:    lu12i.w $a3, 15824; LA32-NEXT:    ori $a3, $a3, 4095825; LA32-NEXT:    sll.w $a3, $a3, $a2826; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0827; LA32-NEXT:    sll.w $a1, $a1, $a2828; LA32-NEXT:  .LBB27_1: # =>This Inner Loop Header: Depth=1829; LA32-NEXT:    ll.w $a4, $a0, 0830; LA32-NEXT:    sub.w $a5, $a4, $a1831; LA32-NEXT:    xor $a5, $a4, $a5832; LA32-NEXT:    and $a5, $a5, $a3833; LA32-NEXT:    xor $a5, $a4, $a5834; LA32-NEXT:    sc.w $a5, $a0, 0835; LA32-NEXT:    beq $a5, $zero, .LBB27_1836; LA32-NEXT:  # %bb.2:837; LA32-NEXT:    srl.w $a0, $a4, $a2838; LA32-NEXT:    ret839;840; LA64-LABEL: atomicrmw_sub_i16_release:841; LA64:       # %bb.0:842; LA64-NEXT:    sub.w $a2, $zero, $a1843; LA64-NEXT:    amadd_db.h $a1, $a2, $a0844; LA64-NEXT:    move $a0, $a1845; LA64-NEXT:    ret846  %1 = atomicrmw sub ptr %a, i16 %b release847  ret i16 %1848}849 850define i8 @atomicrmw_sub_i8_acq_rel(ptr %a, i8 %b) nounwind {851; LA32-LABEL: atomicrmw_sub_i8_acq_rel:852; LA32:       # %bb.0:853; LA32-NEXT:    slli.w $a2, $a0, 3854; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0855; LA32-NEXT:    ori $a3, $zero, 255856; LA32-NEXT:    sll.w $a3, $a3, $a2857; LA32-NEXT:    andi $a1, $a1, 255858; LA32-NEXT:    sll.w $a1, $a1, $a2859; LA32-NEXT:  .LBB28_1: # =>This Inner Loop Header: Depth=1860; LA32-NEXT:    ll.w $a4, $a0, 0861; LA32-NEXT:    sub.w $a5, $a4, $a1862; LA32-NEXT:    xor $a5, $a4, $a5863; LA32-NEXT:    and $a5, $a5, $a3864; LA32-NEXT:    xor $a5, $a4, $a5865; LA32-NEXT:    sc.w $a5, $a0, 0866; LA32-NEXT:    beq $a5, $zero, .LBB28_1867; LA32-NEXT:  # %bb.2:868; LA32-NEXT:    srl.w $a0, $a4, $a2869; LA32-NEXT:    ret870;871; LA64-LABEL: atomicrmw_sub_i8_acq_rel:872; LA64:       # %bb.0:873; LA64-NEXT:    sub.w $a2, $zero, $a1874; LA64-NEXT:    amadd_db.b $a1, $a2, $a0875; LA64-NEXT:    move $a0, $a1876; LA64-NEXT:    ret877  %1 = atomicrmw sub ptr %a, i8 %b acq_rel878  ret i8 %1879}880 881define i16 @atomicrmw_sub_i16_acq_rel(ptr %a, i16 %b) nounwind {882; LA32-LABEL: atomicrmw_sub_i16_acq_rel:883; LA32:       # %bb.0:884; LA32-NEXT:    slli.w $a2, $a0, 3885; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0886; LA32-NEXT:    lu12i.w $a3, 15887; LA32-NEXT:    ori $a3, $a3, 4095888; LA32-NEXT:    sll.w $a3, $a3, $a2889; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0890; LA32-NEXT:    sll.w $a1, $a1, $a2891; LA32-NEXT:  .LBB29_1: # =>This Inner Loop Header: Depth=1892; LA32-NEXT:    ll.w $a4, $a0, 0893; LA32-NEXT:    sub.w $a5, $a4, $a1894; LA32-NEXT:    xor $a5, $a4, $a5895; LA32-NEXT:    and $a5, $a5, $a3896; LA32-NEXT:    xor $a5, $a4, $a5897; LA32-NEXT:    sc.w $a5, $a0, 0898; LA32-NEXT:    beq $a5, $zero, .LBB29_1899; LA32-NEXT:  # %bb.2:900; LA32-NEXT:    srl.w $a0, $a4, $a2901; LA32-NEXT:    ret902;903; LA64-LABEL: atomicrmw_sub_i16_acq_rel:904; LA64:       # %bb.0:905; LA64-NEXT:    sub.w $a2, $zero, $a1906; LA64-NEXT:    amadd_db.h $a1, $a2, $a0907; LA64-NEXT:    move $a0, $a1908; LA64-NEXT:    ret909  %1 = atomicrmw sub ptr %a, i16 %b acq_rel910  ret i16 %1911}912 913define i8 @atomicrmw_sub_i8_seq_cst(ptr %a, i8 %b) nounwind {914; LA32-LABEL: atomicrmw_sub_i8_seq_cst:915; LA32:       # %bb.0:916; LA32-NEXT:    slli.w $a2, $a0, 3917; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0918; LA32-NEXT:    ori $a3, $zero, 255919; LA32-NEXT:    sll.w $a3, $a3, $a2920; LA32-NEXT:    andi $a1, $a1, 255921; LA32-NEXT:    sll.w $a1, $a1, $a2922; LA32-NEXT:  .LBB30_1: # =>This Inner Loop Header: Depth=1923; LA32-NEXT:    ll.w $a4, $a0, 0924; LA32-NEXT:    sub.w $a5, $a4, $a1925; LA32-NEXT:    xor $a5, $a4, $a5926; LA32-NEXT:    and $a5, $a5, $a3927; LA32-NEXT:    xor $a5, $a4, $a5928; LA32-NEXT:    sc.w $a5, $a0, 0929; LA32-NEXT:    beq $a5, $zero, .LBB30_1930; LA32-NEXT:  # %bb.2:931; LA32-NEXT:    srl.w $a0, $a4, $a2932; LA32-NEXT:    ret933;934; LA64-LABEL: atomicrmw_sub_i8_seq_cst:935; LA64:       # %bb.0:936; LA64-NEXT:    sub.w $a2, $zero, $a1937; LA64-NEXT:    amadd_db.b $a1, $a2, $a0938; LA64-NEXT:    move $a0, $a1939; LA64-NEXT:    ret940  %1 = atomicrmw sub ptr %a, i8 %b seq_cst941  ret i8 %1942}943 944define i16 @atomicrmw_sub_i16_seq_cst(ptr %a, i16 %b) nounwind {945; LA32-LABEL: atomicrmw_sub_i16_seq_cst:946; LA32:       # %bb.0:947; LA32-NEXT:    slli.w $a2, $a0, 3948; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0949; LA32-NEXT:    lu12i.w $a3, 15950; LA32-NEXT:    ori $a3, $a3, 4095951; LA32-NEXT:    sll.w $a3, $a3, $a2952; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0953; LA32-NEXT:    sll.w $a1, $a1, $a2954; LA32-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1955; LA32-NEXT:    ll.w $a4, $a0, 0956; LA32-NEXT:    sub.w $a5, $a4, $a1957; LA32-NEXT:    xor $a5, $a4, $a5958; LA32-NEXT:    and $a5, $a5, $a3959; LA32-NEXT:    xor $a5, $a4, $a5960; LA32-NEXT:    sc.w $a5, $a0, 0961; LA32-NEXT:    beq $a5, $zero, .LBB31_1962; LA32-NEXT:  # %bb.2:963; LA32-NEXT:    srl.w $a0, $a4, $a2964; LA32-NEXT:    ret965;966; LA64-LABEL: atomicrmw_sub_i16_seq_cst:967; LA64:       # %bb.0:968; LA64-NEXT:    sub.w $a2, $zero, $a1969; LA64-NEXT:    amadd_db.h $a1, $a2, $a0970; LA64-NEXT:    move $a0, $a1971; LA64-NEXT:    ret972  %1 = atomicrmw sub ptr %a, i16 %b seq_cst973  ret i16 %1974}975 976define i8 @atomicrmw_sub_i8_monotonic(ptr %a, i8 %b) nounwind {977; LA32-LABEL: atomicrmw_sub_i8_monotonic:978; LA32:       # %bb.0:979; LA32-NEXT:    slli.w $a2, $a0, 3980; LA32-NEXT:    bstrins.w $a0, $zero, 1, 0981; LA32-NEXT:    ori $a3, $zero, 255982; LA32-NEXT:    sll.w $a3, $a3, $a2983; LA32-NEXT:    andi $a1, $a1, 255984; LA32-NEXT:    sll.w $a1, $a1, $a2985; LA32-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1986; LA32-NEXT:    ll.w $a4, $a0, 0987; LA32-NEXT:    sub.w $a5, $a4, $a1988; LA32-NEXT:    xor $a5, $a4, $a5989; LA32-NEXT:    and $a5, $a5, $a3990; LA32-NEXT:    xor $a5, $a4, $a5991; LA32-NEXT:    sc.w $a5, $a0, 0992; LA32-NEXT:    beq $a5, $zero, .LBB32_1993; LA32-NEXT:  # %bb.2:994; LA32-NEXT:    srl.w $a0, $a4, $a2995; LA32-NEXT:    ret996;997; LA64-LABEL: atomicrmw_sub_i8_monotonic:998; LA64:       # %bb.0:999; LA64-NEXT:    sub.w $a2, $zero, $a11000; LA64-NEXT:    amadd.b $a1, $a2, $a01001; LA64-NEXT:    move $a0, $a11002; LA64-NEXT:    ret1003  %1 = atomicrmw sub ptr %a, i8 %b monotonic1004  ret i8 %11005}1006 1007define i16 @atomicrmw_sub_i16_monotonic(ptr %a, i16 %b) nounwind {1008; LA32-LABEL: atomicrmw_sub_i16_monotonic:1009; LA32:       # %bb.0:1010; LA32-NEXT:    slli.w $a2, $a0, 31011; LA32-NEXT:    bstrins.w $a0, $zero, 1, 01012; LA32-NEXT:    lu12i.w $a3, 151013; LA32-NEXT:    ori $a3, $a3, 40951014; LA32-NEXT:    sll.w $a3, $a3, $a21015; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 01016; LA32-NEXT:    sll.w $a1, $a1, $a21017; LA32-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=11018; LA32-NEXT:    ll.w $a4, $a0, 01019; LA32-NEXT:    sub.w $a5, $a4, $a11020; LA32-NEXT:    xor $a5, $a4, $a51021; LA32-NEXT:    and $a5, $a5, $a31022; LA32-NEXT:    xor $a5, $a4, $a51023; LA32-NEXT:    sc.w $a5, $a0, 01024; LA32-NEXT:    beq $a5, $zero, .LBB33_11025; LA32-NEXT:  # %bb.2:1026; LA32-NEXT:    srl.w $a0, $a4, $a21027; LA32-NEXT:    ret1028;1029; LA64-LABEL: atomicrmw_sub_i16_monotonic:1030; LA64:       # %bb.0:1031; LA64-NEXT:    sub.w $a2, $zero, $a11032; LA64-NEXT:    amadd.h $a1, $a2, $a01033; LA64-NEXT:    move $a0, $a11034; LA64-NEXT:    ret1035  %1 = atomicrmw sub ptr %a, i16 %b monotonic1036  ret i16 %11037}1038