1b423e1f0SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2b423e1f0SYingwei Zheng; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3b423e1f0SYingwei Zheng; RUN: | FileCheck -check-prefix=RV32I %s 4b423e1f0SYingwei Zheng; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \ 5b423e1f0SYingwei Zheng; RUN: | FileCheck -check-prefixes=RV32IA %s 6b423e1f0SYingwei Zheng; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 7b423e1f0SYingwei Zheng; RUN: | FileCheck -check-prefix=RV64I %s 8b423e1f0SYingwei Zheng; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \ 9b423e1f0SYingwei Zheng; RUN: | FileCheck -check-prefixes=RV64IA %s 10b423e1f0SYingwei Zheng 11b423e1f0SYingwei Zhengdefine i32 @atomicrmw_sub_i32_constant(ptr %a) nounwind { 12b423e1f0SYingwei Zheng; RV32I-LABEL: atomicrmw_sub_i32_constant: 13b423e1f0SYingwei Zheng; RV32I: # %bb.0: 14b423e1f0SYingwei Zheng; RV32I-NEXT: addi sp, sp, -16 15b423e1f0SYingwei Zheng; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 16b423e1f0SYingwei Zheng; RV32I-NEXT: li a1, 1 17b423e1f0SYingwei Zheng; RV32I-NEXT: li a2, 5 18*eabaee0cSFangrui Song; RV32I-NEXT: call __atomic_fetch_sub_4 19b423e1f0SYingwei Zheng; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20b423e1f0SYingwei Zheng; RV32I-NEXT: addi sp, sp, 16 21b423e1f0SYingwei Zheng; RV32I-NEXT: ret 22b423e1f0SYingwei Zheng; 23b423e1f0SYingwei Zheng; RV32IA-LABEL: atomicrmw_sub_i32_constant: 24b423e1f0SYingwei Zheng; RV32IA: # %bb.0: 25b423e1f0SYingwei Zheng; RV32IA-NEXT: li a1, -1 26b423e1f0SYingwei Zheng; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 27b423e1f0SYingwei Zheng; RV32IA-NEXT: ret 28b423e1f0SYingwei Zheng; 29b423e1f0SYingwei Zheng; RV64I-LABEL: atomicrmw_sub_i32_constant: 30b423e1f0SYingwei Zheng; RV64I: # %bb.0: 31b423e1f0SYingwei Zheng; RV64I-NEXT: addi sp, sp, -16 32b423e1f0SYingwei Zheng; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 33b423e1f0SYingwei Zheng; RV64I-NEXT: li a1, 1 34b423e1f0SYingwei Zheng; RV64I-NEXT: li a2, 5 35*eabaee0cSFangrui Song; RV64I-NEXT: call __atomic_fetch_sub_4 36b423e1f0SYingwei Zheng; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 37b423e1f0SYingwei Zheng; RV64I-NEXT: addi sp, sp, 16 38b423e1f0SYingwei Zheng; RV64I-NEXT: ret 39b423e1f0SYingwei Zheng; 40b423e1f0SYingwei Zheng; RV64IA-LABEL: atomicrmw_sub_i32_constant: 41b423e1f0SYingwei Zheng; RV64IA: # %bb.0: 42b423e1f0SYingwei Zheng; RV64IA-NEXT: li a1, -1 43b423e1f0SYingwei Zheng; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 44b423e1f0SYingwei Zheng; RV64IA-NEXT: ret 45b423e1f0SYingwei Zheng %1 = atomicrmw sub ptr %a, i32 1 seq_cst 46b423e1f0SYingwei Zheng ret i32 %1 47b423e1f0SYingwei Zheng} 48b423e1f0SYingwei Zheng 49b423e1f0SYingwei Zhengdefine i64 @atomicrmw_sub_i64_constant(ptr %a) nounwind { 50b423e1f0SYingwei Zheng; RV32I-LABEL: atomicrmw_sub_i64_constant: 51b423e1f0SYingwei Zheng; RV32I: # %bb.0: 52b423e1f0SYingwei Zheng; RV32I-NEXT: addi sp, sp, -16 53b423e1f0SYingwei Zheng; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 54b423e1f0SYingwei Zheng; RV32I-NEXT: li a1, 1 55b423e1f0SYingwei Zheng; RV32I-NEXT: li a3, 5 56b423e1f0SYingwei Zheng; RV32I-NEXT: li a2, 0 57*eabaee0cSFangrui Song; RV32I-NEXT: call __atomic_fetch_sub_8 58b423e1f0SYingwei Zheng; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 59b423e1f0SYingwei Zheng; RV32I-NEXT: addi sp, sp, 16 60b423e1f0SYingwei Zheng; RV32I-NEXT: ret 61b423e1f0SYingwei Zheng; 62b423e1f0SYingwei Zheng; RV32IA-LABEL: atomicrmw_sub_i64_constant: 63b423e1f0SYingwei Zheng; RV32IA: # %bb.0: 64b423e1f0SYingwei Zheng; RV32IA-NEXT: addi sp, sp, -16 65b423e1f0SYingwei Zheng; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 66b423e1f0SYingwei Zheng; RV32IA-NEXT: li a1, 1 67b423e1f0SYingwei Zheng; RV32IA-NEXT: li a3, 5 68b423e1f0SYingwei Zheng; RV32IA-NEXT: li a2, 0 69*eabaee0cSFangrui Song; RV32IA-NEXT: call __atomic_fetch_sub_8 70b423e1f0SYingwei Zheng; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 71b423e1f0SYingwei Zheng; RV32IA-NEXT: addi sp, sp, 16 72b423e1f0SYingwei Zheng; RV32IA-NEXT: ret 73b423e1f0SYingwei Zheng; 74b423e1f0SYingwei Zheng; RV64I-LABEL: atomicrmw_sub_i64_constant: 75b423e1f0SYingwei Zheng; RV64I: # %bb.0: 76b423e1f0SYingwei Zheng; RV64I-NEXT: addi sp, sp, -16 77b423e1f0SYingwei Zheng; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 78b423e1f0SYingwei Zheng; RV64I-NEXT: li a1, 1 79b423e1f0SYingwei Zheng; RV64I-NEXT: li a2, 5 80*eabaee0cSFangrui Song; RV64I-NEXT: call __atomic_fetch_sub_8 81b423e1f0SYingwei Zheng; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 82b423e1f0SYingwei Zheng; RV64I-NEXT: addi sp, sp, 16 83b423e1f0SYingwei Zheng; RV64I-NEXT: ret 84b423e1f0SYingwei Zheng; 85b423e1f0SYingwei Zheng; RV64IA-LABEL: atomicrmw_sub_i64_constant: 86b423e1f0SYingwei Zheng; RV64IA: # %bb.0: 87b423e1f0SYingwei Zheng; RV64IA-NEXT: li a1, -1 88b423e1f0SYingwei Zheng; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 89b423e1f0SYingwei Zheng; RV64IA-NEXT: ret 90b423e1f0SYingwei Zheng %1 = atomicrmw sub ptr %a, i64 1 seq_cst 91b423e1f0SYingwei Zheng ret i64 %1 92b423e1f0SYingwei Zheng} 93b423e1f0SYingwei Zheng 94b423e1f0SYingwei Zhengdefine i32 @atomicrmw_sub_i32_neg(ptr %a, i32 %x, i32 %y) nounwind { 95b423e1f0SYingwei Zheng; RV32I-LABEL: atomicrmw_sub_i32_neg: 96b423e1f0SYingwei Zheng; RV32I: # %bb.0: 97b423e1f0SYingwei Zheng; RV32I-NEXT: addi sp, sp, -16 98b423e1f0SYingwei Zheng; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 99b423e1f0SYingwei Zheng; RV32I-NEXT: sub a1, a1, a2 100b423e1f0SYingwei Zheng; RV32I-NEXT: li a2, 5 101*eabaee0cSFangrui Song; RV32I-NEXT: call __atomic_fetch_sub_4 102b423e1f0SYingwei Zheng; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 103b423e1f0SYingwei Zheng; RV32I-NEXT: addi sp, sp, 16 104b423e1f0SYingwei Zheng; RV32I-NEXT: ret 105b423e1f0SYingwei Zheng; 106b423e1f0SYingwei Zheng; RV32IA-LABEL: atomicrmw_sub_i32_neg: 107b423e1f0SYingwei Zheng; RV32IA: # %bb.0: 108b423e1f0SYingwei Zheng; RV32IA-NEXT: sub a2, a2, a1 109b423e1f0SYingwei Zheng; RV32IA-NEXT: amoadd.w.aqrl a0, a2, (a0) 110b423e1f0SYingwei Zheng; RV32IA-NEXT: ret 111b423e1f0SYingwei Zheng; 112b423e1f0SYingwei Zheng; RV64I-LABEL: atomicrmw_sub_i32_neg: 113b423e1f0SYingwei Zheng; RV64I: # %bb.0: 114b423e1f0SYingwei Zheng; RV64I-NEXT: addi sp, sp, -16 115b423e1f0SYingwei Zheng; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 116b423e1f0SYingwei Zheng; RV64I-NEXT: subw a1, a1, a2 117b423e1f0SYingwei Zheng; RV64I-NEXT: li a2, 5 118*eabaee0cSFangrui Song; RV64I-NEXT: call __atomic_fetch_sub_4 119b423e1f0SYingwei Zheng; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 120b423e1f0SYingwei Zheng; RV64I-NEXT: addi sp, sp, 16 121b423e1f0SYingwei Zheng; RV64I-NEXT: ret 122b423e1f0SYingwei Zheng; 123b423e1f0SYingwei Zheng; RV64IA-LABEL: atomicrmw_sub_i32_neg: 124b423e1f0SYingwei Zheng; RV64IA: # %bb.0: 125b423e1f0SYingwei Zheng; RV64IA-NEXT: sub a2, a2, a1 126b423e1f0SYingwei Zheng; RV64IA-NEXT: amoadd.w.aqrl a0, a2, (a0) 127b423e1f0SYingwei Zheng; RV64IA-NEXT: ret 128b423e1f0SYingwei Zheng %b = sub i32 %x, %y 129b423e1f0SYingwei Zheng %1 = atomicrmw sub ptr %a, i32 %b seq_cst 130b423e1f0SYingwei Zheng ret i32 %1 131b423e1f0SYingwei Zheng} 132b423e1f0SYingwei Zheng 133b423e1f0SYingwei Zhengdefine i64 @atomicrmw_sub_i64_neg(ptr %a, i64 %x, i64 %y) nounwind { 134b423e1f0SYingwei Zheng; RV32I-LABEL: atomicrmw_sub_i64_neg: 135b423e1f0SYingwei Zheng; RV32I: # %bb.0: 136b423e1f0SYingwei Zheng; RV32I-NEXT: addi sp, sp, -16 137b423e1f0SYingwei Zheng; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 138b423e1f0SYingwei Zheng; RV32I-NEXT: sltu a5, a1, a3 139b423e1f0SYingwei Zheng; RV32I-NEXT: sub a2, a2, a4 140b423e1f0SYingwei Zheng; RV32I-NEXT: sub a2, a2, a5 141b423e1f0SYingwei Zheng; RV32I-NEXT: sub a1, a1, a3 142b423e1f0SYingwei Zheng; RV32I-NEXT: li a3, 5 143*eabaee0cSFangrui Song; RV32I-NEXT: call __atomic_fetch_sub_8 144b423e1f0SYingwei Zheng; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 145b423e1f0SYingwei Zheng; RV32I-NEXT: addi sp, sp, 16 146b423e1f0SYingwei Zheng; RV32I-NEXT: ret 147b423e1f0SYingwei Zheng; 148b423e1f0SYingwei Zheng; RV32IA-LABEL: atomicrmw_sub_i64_neg: 149b423e1f0SYingwei Zheng; RV32IA: # %bb.0: 150b423e1f0SYingwei Zheng; RV32IA-NEXT: addi sp, sp, -16 151b423e1f0SYingwei Zheng; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 152b423e1f0SYingwei Zheng; RV32IA-NEXT: sltu a5, a1, a3 153b423e1f0SYingwei Zheng; RV32IA-NEXT: sub a2, a2, a4 154b423e1f0SYingwei Zheng; RV32IA-NEXT: sub a2, a2, a5 155b423e1f0SYingwei Zheng; RV32IA-NEXT: sub a1, a1, a3 156b423e1f0SYingwei Zheng; RV32IA-NEXT: li a3, 5 157*eabaee0cSFangrui Song; RV32IA-NEXT: call __atomic_fetch_sub_8 158b423e1f0SYingwei Zheng; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 159b423e1f0SYingwei Zheng; RV32IA-NEXT: addi sp, sp, 16 160b423e1f0SYingwei Zheng; RV32IA-NEXT: ret 161b423e1f0SYingwei Zheng; 162b423e1f0SYingwei Zheng; RV64I-LABEL: atomicrmw_sub_i64_neg: 163b423e1f0SYingwei Zheng; RV64I: # %bb.0: 164b423e1f0SYingwei Zheng; RV64I-NEXT: addi sp, sp, -16 165b423e1f0SYingwei Zheng; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 166b423e1f0SYingwei Zheng; RV64I-NEXT: sub a1, a1, a2 167b423e1f0SYingwei Zheng; RV64I-NEXT: li a2, 5 168*eabaee0cSFangrui Song; RV64I-NEXT: call __atomic_fetch_sub_8 169b423e1f0SYingwei Zheng; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 170b423e1f0SYingwei Zheng; RV64I-NEXT: addi sp, sp, 16 171b423e1f0SYingwei Zheng; RV64I-NEXT: ret 172b423e1f0SYingwei Zheng; 173b423e1f0SYingwei Zheng; RV64IA-LABEL: atomicrmw_sub_i64_neg: 174b423e1f0SYingwei Zheng; RV64IA: # %bb.0: 175b423e1f0SYingwei Zheng; RV64IA-NEXT: sub a2, a2, a1 176b423e1f0SYingwei Zheng; RV64IA-NEXT: amoadd.d.aqrl a0, a2, (a0) 177b423e1f0SYingwei Zheng; RV64IA-NEXT: ret 178b423e1f0SYingwei Zheng %b = sub i64 %x, %y 179b423e1f0SYingwei Zheng %1 = atomicrmw sub ptr %a, i64 %b seq_cst 180b423e1f0SYingwei Zheng ret i64 %1 181b423e1f0SYingwei Zheng} 182