503 changes: 503 additions & 0 deletions llvm/test/CodeGen/AArch64/atomicrmw-fsub.ll
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=aarch64-- -O1 -fast-isel=0 -global-isel=false %s -o - | FileCheck -check-prefix=NOLSE %s
; RUN: llc -mtriple=aarch64-- -mattr=+lse -O1 -fast-isel=0 -global-isel=false %s -o - | FileCheck -check-prefix=LSE %s
; RUN: llc -mtriple=aarch64-none-eabi -mattr=-lse,-fp-armv8 < %s | FileCheck -check-prefix=SOFTFP-NOLSE %s

define half @test_atomicrmw_fsub_f16_seq_cst_align2(ptr %ptr, half %value) #0 {
; NOLSE-LABEL: test_atomicrmw_fsub_f16_seq_cst_align2:
Expand Down Expand Up @@ -55,6 +56,50 @@ define half @test_atomicrmw_fsub_f16_seq_cst_align2(ptr %ptr, half %value) #0 {
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: // kill: def $h0 killed $h0 killed $s0
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_f16_seq_cst_align2:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: stp x30, x23, [sp, #-48]! // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldrh w20, [x0]
; SOFTFP-NOLSE-NEXT: mov x19, x0
; SOFTFP-NOLSE-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov w21, w1
; SOFTFP-NOLSE-NEXT: b .LBB0_2
; SOFTFP-NOLSE-NEXT: .LBB0_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB0_2 Depth=1
; SOFTFP-NOLSE-NEXT: cmp w8, w23
; SOFTFP-NOLSE-NEXT: mov w20, w8
; SOFTFP-NOLSE-NEXT: b.eq .LBB0_5
; SOFTFP-NOLSE-NEXT: .LBB0_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB0_3 Depth 2
; SOFTFP-NOLSE-NEXT: and w0, w21, #0xffff
; SOFTFP-NOLSE-NEXT: bl __gnu_h2f_ieee
; SOFTFP-NOLSE-NEXT: and w23, w20, #0xffff
; SOFTFP-NOLSE-NEXT: mov w22, w0
; SOFTFP-NOLSE-NEXT: mov w0, w23
; SOFTFP-NOLSE-NEXT: bl __gnu_h2f_ieee
; SOFTFP-NOLSE-NEXT: mov w1, w22
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: bl __gnu_f2h_ieee
; SOFTFP-NOLSE-NEXT: .LBB0_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB0_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxrh w8, [x19]
; SOFTFP-NOLSE-NEXT: cmp w8, w20, uxth
; SOFTFP-NOLSE-NEXT: b.ne .LBB0_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB0_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxrh wzr, w0, [x19]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB0_3
; SOFTFP-NOLSE-NEXT: b .LBB0_1
; SOFTFP-NOLSE-NEXT: .LBB0_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov w0, w20
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x22, x21, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x30, x23, [sp], #48 // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, half %value seq_cst, align 2
ret half %res
}
Expand Down Expand Up @@ -112,6 +157,50 @@ define half @test_atomicrmw_fsub_f16_seq_cst_align4(ptr %ptr, half %value) #0 {
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: // kill: def $h0 killed $h0 killed $s0
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_f16_seq_cst_align4:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: stp x30, x23, [sp, #-48]! // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldrh w20, [x0]
; SOFTFP-NOLSE-NEXT: mov x19, x0
; SOFTFP-NOLSE-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov w21, w1
; SOFTFP-NOLSE-NEXT: b .LBB1_2
; SOFTFP-NOLSE-NEXT: .LBB1_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB1_2 Depth=1
; SOFTFP-NOLSE-NEXT: cmp w8, w23
; SOFTFP-NOLSE-NEXT: mov w20, w8
; SOFTFP-NOLSE-NEXT: b.eq .LBB1_5
; SOFTFP-NOLSE-NEXT: .LBB1_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB1_3 Depth 2
; SOFTFP-NOLSE-NEXT: and w0, w21, #0xffff
; SOFTFP-NOLSE-NEXT: bl __gnu_h2f_ieee
; SOFTFP-NOLSE-NEXT: and w23, w20, #0xffff
; SOFTFP-NOLSE-NEXT: mov w22, w0
; SOFTFP-NOLSE-NEXT: mov w0, w23
; SOFTFP-NOLSE-NEXT: bl __gnu_h2f_ieee
; SOFTFP-NOLSE-NEXT: mov w1, w22
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: bl __gnu_f2h_ieee
; SOFTFP-NOLSE-NEXT: .LBB1_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB1_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxrh w8, [x19]
; SOFTFP-NOLSE-NEXT: cmp w8, w20, uxth
; SOFTFP-NOLSE-NEXT: b.ne .LBB1_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB1_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxrh wzr, w0, [x19]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB1_3
; SOFTFP-NOLSE-NEXT: b .LBB1_1
; SOFTFP-NOLSE-NEXT: .LBB1_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov w0, w20
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x22, x21, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x30, x23, [sp], #48 // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, half %value seq_cst, align 4
ret half %res
}
Expand Down Expand Up @@ -189,6 +278,43 @@ define bfloat @test_atomicrmw_fsub_bf16_seq_cst_align2(ptr %ptr, bfloat %value)
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: // kill: def $h0 killed $h0 killed $s0
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_bf16_seq_cst_align2:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: stp x30, x21, [sp, #-32]! // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldrh w20, [x0]
; SOFTFP-NOLSE-NEXT: lsl w21, w1, #16
; SOFTFP-NOLSE-NEXT: mov x19, x0
; SOFTFP-NOLSE-NEXT: b .LBB2_2
; SOFTFP-NOLSE-NEXT: .LBB2_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB2_2 Depth=1
; SOFTFP-NOLSE-NEXT: cmp w8, w20, uxth
; SOFTFP-NOLSE-NEXT: mov w20, w8
; SOFTFP-NOLSE-NEXT: b.eq .LBB2_5
; SOFTFP-NOLSE-NEXT: .LBB2_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB2_3 Depth 2
; SOFTFP-NOLSE-NEXT: lsl w0, w20, #16
; SOFTFP-NOLSE-NEXT: mov w1, w21
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: bl __truncsfbf2
; SOFTFP-NOLSE-NEXT: .LBB2_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB2_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxrh w8, [x19]
; SOFTFP-NOLSE-NEXT: cmp w8, w20, uxth
; SOFTFP-NOLSE-NEXT: b.ne .LBB2_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB2_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxrh wzr, w0, [x19]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB2_3
; SOFTFP-NOLSE-NEXT: b .LBB2_1
; SOFTFP-NOLSE-NEXT: .LBB2_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov w0, w20
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x30, x21, [sp], #32 // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 2
ret bfloat %res
}
Expand Down Expand Up @@ -266,6 +392,43 @@ define bfloat @test_atomicrmw_fsub_bf16_seq_cst_align4(ptr %ptr, bfloat %value)
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: // kill: def $h0 killed $h0 killed $s0
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_bf16_seq_cst_align4:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: stp x30, x21, [sp, #-32]! // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldrh w20, [x0]
; SOFTFP-NOLSE-NEXT: lsl w21, w1, #16
; SOFTFP-NOLSE-NEXT: mov x19, x0
; SOFTFP-NOLSE-NEXT: b .LBB3_2
; SOFTFP-NOLSE-NEXT: .LBB3_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB3_2 Depth=1
; SOFTFP-NOLSE-NEXT: cmp w8, w20, uxth
; SOFTFP-NOLSE-NEXT: mov w20, w8
; SOFTFP-NOLSE-NEXT: b.eq .LBB3_5
; SOFTFP-NOLSE-NEXT: .LBB3_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB3_3 Depth 2
; SOFTFP-NOLSE-NEXT: lsl w0, w20, #16
; SOFTFP-NOLSE-NEXT: mov w1, w21
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: bl __truncsfbf2
; SOFTFP-NOLSE-NEXT: .LBB3_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB3_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxrh w8, [x19]
; SOFTFP-NOLSE-NEXT: cmp w8, w20, uxth
; SOFTFP-NOLSE-NEXT: b.ne .LBB3_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB3_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxrh wzr, w0, [x19]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB3_3
; SOFTFP-NOLSE-NEXT: b .LBB3_1
; SOFTFP-NOLSE-NEXT: .LBB3_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov w0, w20
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x30, x21, [sp], #32 // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 4
ret bfloat %res
}
Expand Down Expand Up @@ -317,6 +480,42 @@ define float @test_atomicrmw_fsub_f32_seq_cst_align4(ptr %ptr, float %value) #0
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: fmov s0, s1
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_f32_seq_cst_align4:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: stp x30, x21, [sp, #-32]! // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldr w20, [x0]
; SOFTFP-NOLSE-NEXT: mov x19, x0
; SOFTFP-NOLSE-NEXT: mov w21, w1
; SOFTFP-NOLSE-NEXT: b .LBB4_2
; SOFTFP-NOLSE-NEXT: .LBB4_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB4_2 Depth=1
; SOFTFP-NOLSE-NEXT: cmp w8, w20
; SOFTFP-NOLSE-NEXT: mov w20, w8
; SOFTFP-NOLSE-NEXT: b.eq .LBB4_5
; SOFTFP-NOLSE-NEXT: .LBB4_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB4_3 Depth 2
; SOFTFP-NOLSE-NEXT: mov w0, w20
; SOFTFP-NOLSE-NEXT: mov w1, w21
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: .LBB4_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB4_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxr w8, [x19]
; SOFTFP-NOLSE-NEXT: cmp w8, w20
; SOFTFP-NOLSE-NEXT: b.ne .LBB4_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB4_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxr wzr, w0, [x19]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB4_3
; SOFTFP-NOLSE-NEXT: b .LBB4_1
; SOFTFP-NOLSE-NEXT: .LBB4_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov w0, w20
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x30, x21, [sp], #32 // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, float %value seq_cst, align 4
ret float %res
}
Expand Down Expand Up @@ -368,6 +567,42 @@ define double @test_atomicrmw_fsub_f32_seq_cst_align8(ptr %ptr, double %value) #
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: fmov d0, d1
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_f32_seq_cst_align8:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: stp x30, x21, [sp, #-32]! // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldr x20, [x0]
; SOFTFP-NOLSE-NEXT: mov x19, x0
; SOFTFP-NOLSE-NEXT: mov x21, x1
; SOFTFP-NOLSE-NEXT: b .LBB5_2
; SOFTFP-NOLSE-NEXT: .LBB5_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB5_2 Depth=1
; SOFTFP-NOLSE-NEXT: cmp x8, x20
; SOFTFP-NOLSE-NEXT: mov x20, x8
; SOFTFP-NOLSE-NEXT: b.eq .LBB5_5
; SOFTFP-NOLSE-NEXT: .LBB5_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB5_3 Depth 2
; SOFTFP-NOLSE-NEXT: mov x0, x20
; SOFTFP-NOLSE-NEXT: mov x1, x21
; SOFTFP-NOLSE-NEXT: bl __subdf3
; SOFTFP-NOLSE-NEXT: .LBB5_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB5_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxr x8, [x19]
; SOFTFP-NOLSE-NEXT: cmp x8, x20
; SOFTFP-NOLSE-NEXT: b.ne .LBB5_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB5_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxr wzr, x0, [x19]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB5_3
; SOFTFP-NOLSE-NEXT: b .LBB5_1
; SOFTFP-NOLSE-NEXT: .LBB5_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov x0, x20
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x30, x21, [sp], #32 // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, double %value seq_cst, align 8
ret double %res
}
Expand Down Expand Up @@ -456,6 +691,56 @@ define fp128 @test_atomicrmw_fsub_fp128_seq_cst_align16(ptr %ptr, fp128 %value)
; LSE-NEXT: mov v0.16b, v1.16b
; LSE-NEXT: add sp, sp, #96
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_fp128_seq_cst_align16:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: stp x30, x23, [sp, #-48]! // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov x20, x0
; SOFTFP-NOLSE-NEXT: mov x19, x3
; SOFTFP-NOLSE-NEXT: ldp x0, x1, [x0]
; SOFTFP-NOLSE-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov x21, x2
; SOFTFP-NOLSE-NEXT: b .LBB6_2
; SOFTFP-NOLSE-NEXT: .LBB6_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB6_2 Depth=1
; SOFTFP-NOLSE-NEXT: cmp x1, x22
; SOFTFP-NOLSE-NEXT: ccmp x0, x23, #0, eq
; SOFTFP-NOLSE-NEXT: b.eq .LBB6_6
; SOFTFP-NOLSE-NEXT: .LBB6_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB6_3 Depth 2
; SOFTFP-NOLSE-NEXT: mov x2, x21
; SOFTFP-NOLSE-NEXT: mov x3, x19
; SOFTFP-NOLSE-NEXT: mov x22, x1
; SOFTFP-NOLSE-NEXT: mov x23, x0
; SOFTFP-NOLSE-NEXT: bl __subtf3
; SOFTFP-NOLSE-NEXT: mov x8, x0
; SOFTFP-NOLSE-NEXT: mov x9, x1
; SOFTFP-NOLSE-NEXT: .LBB6_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB6_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxp x0, x1, [x20]
; SOFTFP-NOLSE-NEXT: cmp x0, x23
; SOFTFP-NOLSE-NEXT: cset w10, ne
; SOFTFP-NOLSE-NEXT: cmp x1, x22
; SOFTFP-NOLSE-NEXT: cinc w10, w10, ne
; SOFTFP-NOLSE-NEXT: cbz w10, .LBB6_5
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB6_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxp w10, x0, x1, [x20]
; SOFTFP-NOLSE-NEXT: cbnz w10, .LBB6_3
; SOFTFP-NOLSE-NEXT: b .LBB6_1
; SOFTFP-NOLSE-NEXT: .LBB6_5: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB6_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxp w10, x8, x9, [x20]
; SOFTFP-NOLSE-NEXT: cbnz w10, .LBB6_3
; SOFTFP-NOLSE-NEXT: b .LBB6_1
; SOFTFP-NOLSE-NEXT: .LBB6_6: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x22, x21, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x30, x23, [sp], #48 // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, fp128 %value seq_cst, align 16
ret fp128 %res
}
Expand Down Expand Up @@ -513,6 +798,66 @@ define <2 x half> @test_atomicrmw_fsub_v2f16_seq_cst_align4(ptr %ptr, <2 x half>
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: // kill: def $d0 killed $d0 killed $q0
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_v2f16_seq_cst_align4:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: stp x30, x25, [sp, #-64]! // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x24, x23, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldrh w23, [x0, #2]
; SOFTFP-NOLSE-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldrh w21, [x0]
; SOFTFP-NOLSE-NEXT: mov w22, w1
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov w19, w2
; SOFTFP-NOLSE-NEXT: mov x20, x0
; SOFTFP-NOLSE-NEXT: b .LBB7_2
; SOFTFP-NOLSE-NEXT: .LBB7_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB7_2 Depth=1
; SOFTFP-NOLSE-NEXT: lsr w23, w8, #16
; SOFTFP-NOLSE-NEXT: cmp w8, w21
; SOFTFP-NOLSE-NEXT: mov w21, w8
; SOFTFP-NOLSE-NEXT: b.eq .LBB7_5
; SOFTFP-NOLSE-NEXT: .LBB7_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB7_3 Depth 2
; SOFTFP-NOLSE-NEXT: and w0, w19, #0xffff
; SOFTFP-NOLSE-NEXT: bl __gnu_h2f_ieee
; SOFTFP-NOLSE-NEXT: mov w24, w0
; SOFTFP-NOLSE-NEXT: and w0, w23, #0xffff
; SOFTFP-NOLSE-NEXT: bl __gnu_h2f_ieee
; SOFTFP-NOLSE-NEXT: mov w1, w24
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: bl __gnu_f2h_ieee
; SOFTFP-NOLSE-NEXT: mov w24, w0
; SOFTFP-NOLSE-NEXT: and w0, w22, #0xffff
; SOFTFP-NOLSE-NEXT: bl __gnu_h2f_ieee
; SOFTFP-NOLSE-NEXT: mov w25, w0
; SOFTFP-NOLSE-NEXT: and w0, w21, #0xffff
; SOFTFP-NOLSE-NEXT: bl __gnu_h2f_ieee
; SOFTFP-NOLSE-NEXT: mov w1, w25
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: bl __gnu_f2h_ieee
; SOFTFP-NOLSE-NEXT: bfi w21, w23, #16, #16
; SOFTFP-NOLSE-NEXT: bfi w0, w24, #16, #16
; SOFTFP-NOLSE-NEXT: .LBB7_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB7_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxr w8, [x20]
; SOFTFP-NOLSE-NEXT: cmp w8, w21
; SOFTFP-NOLSE-NEXT: b.ne .LBB7_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB7_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxr wzr, w0, [x20]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB7_3
; SOFTFP-NOLSE-NEXT: b .LBB7_1
; SOFTFP-NOLSE-NEXT: .LBB7_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov w0, w21
; SOFTFP-NOLSE-NEXT: mov w1, w23
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x24, x23, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x30, x25, [sp], #64 // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, <2 x half> %value seq_cst, align 4
ret <2 x half> %res
}
Expand Down Expand Up @@ -580,6 +925,58 @@ define <2 x bfloat> @test_atomicrmw_fsub_v2bf16_seq_cst_align4(ptr %ptr, <2 x bf
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: // kill: def $d0 killed $d0 killed $q0
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_v2bf16_seq_cst_align4:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: str x30, [sp, #-64]! // 8-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov w8, w1
; SOFTFP-NOLSE-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldrh w1, [x0, #2]
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: ldrh w21, [x0]
; SOFTFP-NOLSE-NEXT: lsl w20, w2, #16
; SOFTFP-NOLSE-NEXT: lsl w22, w8, #16
; SOFTFP-NOLSE-NEXT: mov x19, x0
; SOFTFP-NOLSE-NEXT: stp x24, x23, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: b .LBB8_2
; SOFTFP-NOLSE-NEXT: .LBB8_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB8_2 Depth=1
; SOFTFP-NOLSE-NEXT: lsr w1, w21, #16
; SOFTFP-NOLSE-NEXT: cmp w21, w23
; SOFTFP-NOLSE-NEXT: b.eq .LBB8_5
; SOFTFP-NOLSE-NEXT: .LBB8_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB8_3 Depth 2
; SOFTFP-NOLSE-NEXT: lsl w23, w1, #16
; SOFTFP-NOLSE-NEXT: mov w1, w20
; SOFTFP-NOLSE-NEXT: mov w0, w23
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: bl __truncsfbf2
; SOFTFP-NOLSE-NEXT: mov w24, w0
; SOFTFP-NOLSE-NEXT: lsl w0, w21, #16
; SOFTFP-NOLSE-NEXT: mov w1, w22
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: bl __truncsfbf2
; SOFTFP-NOLSE-NEXT: bfxil w23, w21, #0, #16
; SOFTFP-NOLSE-NEXT: bfi w0, w24, #16, #16
; SOFTFP-NOLSE-NEXT: .LBB8_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB8_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxr w21, [x19]
; SOFTFP-NOLSE-NEXT: cmp w21, w23
; SOFTFP-NOLSE-NEXT: b.ne .LBB8_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB8_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxr wzr, w0, [x19]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB8_3
; SOFTFP-NOLSE-NEXT: b .LBB8_1
; SOFTFP-NOLSE-NEXT: .LBB8_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov w0, w21
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x24, x23, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldr x30, [sp], #64 // 8-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, <2 x bfloat> %value seq_cst, align 4
ret <2 x bfloat> %res
}
Expand Down Expand Up @@ -631,6 +1028,57 @@ define <2 x float> @test_atomicrmw_fsub_v2f32_seq_cst_align8(ptr %ptr, <2 x floa
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: fmov d0, d1
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_v2f32_seq_cst_align8:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: str x30, [sp, #-64]! // 8-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x24, x23, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov w21, w1
; SOFTFP-NOLSE-NEXT: ldp w23, w22, [x0]
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov w19, w2
; SOFTFP-NOLSE-NEXT: mov x20, x0
; SOFTFP-NOLSE-NEXT: b .LBB9_2
; SOFTFP-NOLSE-NEXT: .LBB9_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB9_2 Depth=1
; SOFTFP-NOLSE-NEXT: lsr x22, x23, #32
; SOFTFP-NOLSE-NEXT: cmp x23, x8
; SOFTFP-NOLSE-NEXT: // kill: def $w22 killed $w22 killed $x22 def $x22
; SOFTFP-NOLSE-NEXT: b.eq .LBB9_5
; SOFTFP-NOLSE-NEXT: .LBB9_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB9_3 Depth 2
; SOFTFP-NOLSE-NEXT: mov w0, w22
; SOFTFP-NOLSE-NEXT: mov w1, w19
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: mov w24, w0
; SOFTFP-NOLSE-NEXT: mov w0, w23
; SOFTFP-NOLSE-NEXT: mov w1, w21
; SOFTFP-NOLSE-NEXT: bl __subsf3
; SOFTFP-NOLSE-NEXT: mov w8, w23
; SOFTFP-NOLSE-NEXT: mov w9, w0
; SOFTFP-NOLSE-NEXT: orr x9, x9, x24, lsl #32
; SOFTFP-NOLSE-NEXT: orr x8, x8, x22, lsl #32
; SOFTFP-NOLSE-NEXT: .LBB9_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB9_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxr x23, [x20]
; SOFTFP-NOLSE-NEXT: cmp x23, x8
; SOFTFP-NOLSE-NEXT: b.ne .LBB9_1
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB9_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxr wzr, x9, [x20]
; SOFTFP-NOLSE-NEXT: cbnz wzr, .LBB9_3
; SOFTFP-NOLSE-NEXT: b .LBB9_1
; SOFTFP-NOLSE-NEXT: .LBB9_5: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: mov w0, w23
; SOFTFP-NOLSE-NEXT: mov w1, w22
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x24, x23, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldr x30, [sp], #64 // 8-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, <2 x float> %value seq_cst, align 8
ret <2 x float> %res
}
Expand Down Expand Up @@ -699,6 +1147,61 @@ define <2 x double> @test_atomicrmw_fsub_v2f64_seq_cst_align8(ptr %ptr, <2 x dou
; LSE-NEXT: // %bb.2: // %atomicrmw.end
; LSE-NEXT: mov v0.16b, v1.16b
; LSE-NEXT: ret
;
; SOFTFP-NOLSE-LABEL: test_atomicrmw_fsub_v2f64_seq_cst_align8:
; SOFTFP-NOLSE: // %bb.0:
; SOFTFP-NOLSE-NEXT: str x30, [sp, #-64]! // 8-byte Folded Spill
; SOFTFP-NOLSE-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov x20, x0
; SOFTFP-NOLSE-NEXT: mov x19, x3
; SOFTFP-NOLSE-NEXT: ldp x0, x1, [x0]
; SOFTFP-NOLSE-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: mov x21, x2
; SOFTFP-NOLSE-NEXT: stp x24, x23, [sp, #16] // 16-byte Folded Spill
; SOFTFP-NOLSE-NEXT: b .LBB10_2
; SOFTFP-NOLSE-NEXT: .LBB10_1: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB10_2 Depth=1
; SOFTFP-NOLSE-NEXT: cmp x1, x22
; SOFTFP-NOLSE-NEXT: ccmp x0, x23, #0, eq
; SOFTFP-NOLSE-NEXT: b.eq .LBB10_6
; SOFTFP-NOLSE-NEXT: .LBB10_2: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // =>This Loop Header: Depth=1
; SOFTFP-NOLSE-NEXT: // Child Loop BB10_3 Depth 2
; SOFTFP-NOLSE-NEXT: mov x22, x1
; SOFTFP-NOLSE-NEXT: mov x23, x0
; SOFTFP-NOLSE-NEXT: mov x0, x1
; SOFTFP-NOLSE-NEXT: mov x1, x19
; SOFTFP-NOLSE-NEXT: bl __subdf3
; SOFTFP-NOLSE-NEXT: mov x24, x0
; SOFTFP-NOLSE-NEXT: mov x0, x23
; SOFTFP-NOLSE-NEXT: mov x1, x21
; SOFTFP-NOLSE-NEXT: bl __subdf3
; SOFTFP-NOLSE-NEXT: mov x8, x0
; SOFTFP-NOLSE-NEXT: .LBB10_3: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // Parent Loop BB10_2 Depth=1
; SOFTFP-NOLSE-NEXT: // => This Inner Loop Header: Depth=2
; SOFTFP-NOLSE-NEXT: ldaxp x0, x1, [x20]
; SOFTFP-NOLSE-NEXT: cmp x0, x23
; SOFTFP-NOLSE-NEXT: cset w9, ne
; SOFTFP-NOLSE-NEXT: cmp x1, x22
; SOFTFP-NOLSE-NEXT: cinc w9, w9, ne
; SOFTFP-NOLSE-NEXT: cbz w9, .LBB10_5
; SOFTFP-NOLSE-NEXT: // %bb.4: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB10_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxp w9, x0, x1, [x20]
; SOFTFP-NOLSE-NEXT: cbnz w9, .LBB10_3
; SOFTFP-NOLSE-NEXT: b .LBB10_1
; SOFTFP-NOLSE-NEXT: .LBB10_5: // %atomicrmw.start
; SOFTFP-NOLSE-NEXT: // in Loop: Header=BB10_3 Depth=2
; SOFTFP-NOLSE-NEXT: stlxp w9, x8, x24, [x20]
; SOFTFP-NOLSE-NEXT: cbnz w9, .LBB10_3
; SOFTFP-NOLSE-NEXT: b .LBB10_1
; SOFTFP-NOLSE-NEXT: .LBB10_6: // %atomicrmw.end
; SOFTFP-NOLSE-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldp x24, x23, [sp, #16] // 16-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ldr x30, [sp], #64 // 8-byte Folded Reload
; SOFTFP-NOLSE-NEXT: ret
%res = atomicrmw fsub ptr %ptr, <2 x double> %value seq_cst, align 16
ret <2 x double> %res
}
Expand Down