| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| //===----------------------------------------------------------------------===// | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 | ||
| // UNSUPPORTED: no-filesystem | ||
| // UNSUPPORTED: executor-has-no-bash | ||
| // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME | ||
|
|
||
| // FIXME PRINT How to test println on Windows? | ||
| // XFAIL: msvc, target={{.+}}-windows-gnu | ||
|
|
||
| // XFAIL: availability-fp_to_chars-missing | ||
|
|
||
| // <print> | ||
|
|
||
| // void println(); | ||
|
|
||
| // Testing this properly is quite hard; the function unconditionally | ||
| // writes to stdout. When stdout is redirected to a file it is no longer | ||
| // considered a terminal. The function is a small wrapper around | ||
| // | ||
| // template<class... Args> | ||
| // void println(FILE* stream, format_string<Args...> fmt, Args&&... args); | ||
| // | ||
| // So do minimal tests for this function and rely on the FILE* overload | ||
| // to do more testing. | ||
| // | ||
| // The testing is based on the testing for std::cout. | ||
|
|
||
| // TODO PRINT Use lit builtin echo | ||
|
|
||
| // FILE_DEPENDENCIES: echo.sh | ||
| // RUN: %{build} | ||
| // RUN: %{exec} bash echo.sh -ne "\n" > %t.expected | ||
| // RUN: %{exec} "%t.exe" > %t.actual | ||
| // RUN: diff -u %t.actual %t.expected | ||
|
|
||
| #include <print> | ||
|
|
||
| int main(int, char**) { | ||
| std::println(); | ||
|
|
||
| return 0; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| ; RUN: split-file %s %t --leading-lines | ||
| ; RUN: not llvm-as < %t/scalable_fp_vector_atomicrmw_xchg.ll 2>&1 | FileCheck -check-prefix=ERR0 %s | ||
| ; RUN: not llvm-as < %t/scalable_int_vector_atomicrmw_xchg.ll 2>&1 | FileCheck -check-prefix=ERR1 %s | ||
| ; RUN: not llvm-as < %t/scalable_ptr_vector_atomicrmw_xchg.ll 2>&1 | FileCheck -check-prefix=ERR2 %s | ||
| ; RUN: not llvm-as < %t/scalable_fp_vector_atomicrmw_fadd.ll 2>&1 | FileCheck -check-prefix=ERR3 %s | ||
| ; RUN: not llvm-as < %t/scalable_int_vector_atomicrmw_add.ll 2>&1 | FileCheck -check-prefix=ERR4 %s | ||
|
|
||
| ;--- scalable_fp_vector_atomicrmw_xchg.ll | ||
| define <vscale x 2 x half> @scalable_fp_vector_atomicrmw_xchg(ptr %x, <vscale x 2 x half> %val) { | ||
| ; ERR0: :41: error: atomicrmw operand may not be scalable | ||
| %atomic.xchg = atomicrmw xchg ptr %x, <vscale x 2 x half> %val seq_cst | ||
| ret <vscale x 2 x half> %atomic.xchg | ||
| } | ||
|
|
||
| ;--- scalable_int_vector_atomicrmw_xchg.ll | ||
| define <vscale x 2 x i16> @scalable_int_vector_atomicrmw_xchg(ptr %x, <vscale x 2 x i16> %val) { | ||
| ; ERR1: :41: error: atomicrmw operand may not be scalable | ||
| %atomic.xchg = atomicrmw xchg ptr %x, <vscale x 2 x i16> %val seq_cst | ||
| ret <vscale x 2 x i16> %atomic.xchg | ||
| } | ||
|
|
||
| ;--- scalable_ptr_vector_atomicrmw_xchg.ll | ||
| define <vscale x 2 x ptr> @scalable_ptr_vector_atomicrmw_xchg(ptr %x, <vscale x 2 x ptr> %val) { | ||
| ; ERR2: :41: error: atomicrmw operand may not be scalable | ||
| %atomic.xchg = atomicrmw xchg ptr %x, <vscale x 2 x ptr> %val seq_cst | ||
| ret <vscale x 2 x ptr> %atomic.xchg | ||
| } | ||
|
|
||
| ;--- scalable_fp_vector_atomicrmw_fadd.ll | ||
| define <vscale x 2 x half> @scalable_fp_vector_atomicrmw_fadd(ptr %x, <vscale x 2 x half> %val) { | ||
| ; ERR3: :41: error: atomicrmw operand may not be scalable | ||
| %atomic.fadd = atomicrmw fadd ptr %x, <vscale x 2 x half> %val seq_cst | ||
| ret <vscale x 2 x half> %atomic.fadd | ||
| } | ||
|
|
||
| ;--- scalable_int_vector_atomicrmw_add.ll | ||
| define <vscale x 2 x i16> @scalable_int_vector_atomicrmw_add(ptr %x, <vscale x 2 x i16> %val) { | ||
| ; ERR4: :39: error: atomicrmw operand may not be scalable | ||
| %atomic.add = atomicrmw add ptr %x, <vscale x 2 x i16> %val seq_cst | ||
| ret <vscale x 2 x i16> %atomic.add | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| ; RUN: not llvm-as -disable-output %s 2>&1 | FileCheck %s | ||
|
|
||
| ; CHECK: error: atomicrmw xchg operand must be an integer, floating point, or pointer type | ||
| define <2 x half> @fp_vector_atomicrmw(ptr %x, <2 x half> %val) { | ||
| %atomic.xchg = atomicrmw xchg ptr %x, <2 x half> %val seq_cst | ||
| ret <2 x half> %atomic.xchg | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,115 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 | ||
| ; RUN: llc -mtriple=aarch64-- -O1 -fast-isel=0 -global-isel=false %s -o - | FileCheck -check-prefixes=CHECK,NOLSE %s | ||
| ; RUN: llc -mtriple=aarch64-- -mattr=+lse -O1 -fast-isel=0 -global-isel=false %s -o - | FileCheck -check-prefixes=CHECK,LSE %s | ||
|
|
||
| define <2 x half> @test_atomicrmw_fadd_v2f16_align4(ptr addrspace(1) %ptr, <2 x half> %value) #0 { | ||
| ; NOLSE-LABEL: test_atomicrmw_fadd_v2f16_align4: | ||
| ; NOLSE: // %bb.0: | ||
| ; NOLSE-NEXT: fcvtl v1.4s, v0.4h | ||
| ; NOLSE-NEXT: ldr s0, [x0] | ||
| ; NOLSE-NEXT: b .LBB0_2 | ||
| ; NOLSE-NEXT: .LBB0_1: // %atomicrmw.start | ||
| ; NOLSE-NEXT: // in Loop: Header=BB0_2 Depth=1 | ||
| ; NOLSE-NEXT: fmov s0, w10 | ||
| ; NOLSE-NEXT: cmp w10, w9 | ||
| ; NOLSE-NEXT: b.eq .LBB0_5 | ||
| ; NOLSE-NEXT: .LBB0_2: // %atomicrmw.start | ||
| ; NOLSE-NEXT: // =>This Loop Header: Depth=1 | ||
| ; NOLSE-NEXT: // Child Loop BB0_3 Depth 2 | ||
| ; NOLSE-NEXT: fcvtl v2.4s, v0.4h | ||
| ; NOLSE-NEXT: fmov w9, s0 | ||
| ; NOLSE-NEXT: fadd v2.4s, v2.4s, v1.4s | ||
| ; NOLSE-NEXT: fcvtn v2.4h, v2.4s | ||
| ; NOLSE-NEXT: fmov w8, s2 | ||
| ; NOLSE-NEXT: .LBB0_3: // %atomicrmw.start | ||
| ; NOLSE-NEXT: // Parent Loop BB0_2 Depth=1 | ||
| ; NOLSE-NEXT: // => This Inner Loop Header: Depth=2 | ||
| ; NOLSE-NEXT: ldaxr w10, [x0] | ||
| ; NOLSE-NEXT: cmp w10, w9 | ||
| ; NOLSE-NEXT: b.ne .LBB0_1 | ||
| ; NOLSE-NEXT: // %bb.4: // %atomicrmw.start | ||
| ; NOLSE-NEXT: // in Loop: Header=BB0_3 Depth=2 | ||
| ; NOLSE-NEXT: stlxr wzr, w8, [x0] | ||
| ; NOLSE-NEXT: cbnz wzr, .LBB0_3 | ||
| ; NOLSE-NEXT: b .LBB0_1 | ||
| ; NOLSE-NEXT: .LBB0_5: // %atomicrmw.end | ||
| ; NOLSE-NEXT: // kill: def $d0 killed $d0 killed $q0 | ||
| ; NOLSE-NEXT: ret | ||
| ; | ||
| ; LSE-LABEL: test_atomicrmw_fadd_v2f16_align4: | ||
| ; LSE: // %bb.0: | ||
| ; LSE-NEXT: fcvtl v1.4s, v0.4h | ||
| ; LSE-NEXT: ldr s0, [x0] | ||
| ; LSE-NEXT: .LBB0_1: // %atomicrmw.start | ||
| ; LSE-NEXT: // =>This Inner Loop Header: Depth=1 | ||
| ; LSE-NEXT: fcvtl v2.4s, v0.4h | ||
| ; LSE-NEXT: fmov w8, s0 | ||
| ; LSE-NEXT: mov w10, w8 | ||
| ; LSE-NEXT: fadd v2.4s, v2.4s, v1.4s | ||
| ; LSE-NEXT: fcvtn v2.4h, v2.4s | ||
| ; LSE-NEXT: fmov w9, s2 | ||
| ; LSE-NEXT: casal w10, w9, [x0] | ||
| ; LSE-NEXT: fmov s0, w10 | ||
| ; LSE-NEXT: cmp w10, w8 | ||
| ; LSE-NEXT: b.ne .LBB0_1 | ||
| ; LSE-NEXT: // %bb.2: // %atomicrmw.end | ||
| ; LSE-NEXT: // kill: def $d0 killed $d0 killed $q0 | ||
| ; LSE-NEXT: ret | ||
| %res = atomicrmw fadd ptr addrspace(1) %ptr, <2 x half> %value seq_cst, align 4 | ||
| ret <2 x half> %res | ||
| } | ||
|
|
||
| define <2 x float> @test_atomicrmw_fadd_v2f32_align8(ptr addrspace(1) %ptr, <2 x float> %value) #0 { | ||
| ; NOLSE-LABEL: test_atomicrmw_fadd_v2f32_align8: | ||
| ; NOLSE: // %bb.0: | ||
| ; NOLSE-NEXT: ldr d1, [x0] | ||
| ; NOLSE-NEXT: b .LBB1_2 | ||
| ; NOLSE-NEXT: .LBB1_1: // %atomicrmw.start | ||
| ; NOLSE-NEXT: // in Loop: Header=BB1_2 Depth=1 | ||
| ; NOLSE-NEXT: fmov d1, x10 | ||
| ; NOLSE-NEXT: cmp x10, x9 | ||
| ; NOLSE-NEXT: b.eq .LBB1_5 | ||
| ; NOLSE-NEXT: .LBB1_2: // %atomicrmw.start | ||
| ; NOLSE-NEXT: // =>This Loop Header: Depth=1 | ||
| ; NOLSE-NEXT: // Child Loop BB1_3 Depth 2 | ||
| ; NOLSE-NEXT: fadd v2.2s, v1.2s, v0.2s | ||
| ; NOLSE-NEXT: fmov x9, d1 | ||
| ; NOLSE-NEXT: fmov x8, d2 | ||
| ; NOLSE-NEXT: .LBB1_3: // %atomicrmw.start | ||
| ; NOLSE-NEXT: // Parent Loop BB1_2 Depth=1 | ||
| ; NOLSE-NEXT: // => This Inner Loop Header: Depth=2 | ||
| ; NOLSE-NEXT: ldaxr x10, [x0] | ||
| ; NOLSE-NEXT: cmp x10, x9 | ||
| ; NOLSE-NEXT: b.ne .LBB1_1 | ||
| ; NOLSE-NEXT: // %bb.4: // %atomicrmw.start | ||
| ; NOLSE-NEXT: // in Loop: Header=BB1_3 Depth=2 | ||
| ; NOLSE-NEXT: stlxr wzr, x8, [x0] | ||
| ; NOLSE-NEXT: cbnz wzr, .LBB1_3 | ||
| ; NOLSE-NEXT: b .LBB1_1 | ||
| ; NOLSE-NEXT: .LBB1_5: // %atomicrmw.end | ||
| ; NOLSE-NEXT: fmov d0, d1 | ||
| ; NOLSE-NEXT: ret | ||
| ; | ||
| ; LSE-LABEL: test_atomicrmw_fadd_v2f32_align8: | ||
| ; LSE: // %bb.0: | ||
| ; LSE-NEXT: ldr d1, [x0] | ||
| ; LSE-NEXT: .LBB1_1: // %atomicrmw.start | ||
| ; LSE-NEXT: // =>This Inner Loop Header: Depth=1 | ||
| ; LSE-NEXT: fadd v2.2s, v1.2s, v0.2s | ||
| ; LSE-NEXT: fmov x8, d1 | ||
| ; LSE-NEXT: mov x10, x8 | ||
| ; LSE-NEXT: fmov x9, d2 | ||
| ; LSE-NEXT: casal x10, x9, [x0] | ||
| ; LSE-NEXT: fmov d1, x10 | ||
| ; LSE-NEXT: cmp x10, x8 | ||
| ; LSE-NEXT: b.ne .LBB1_1 | ||
| ; LSE-NEXT: // %bb.2: // %atomicrmw.end | ||
| ; LSE-NEXT: fmov d0, d1 | ||
| ; LSE-NEXT: ret | ||
| %res = atomicrmw fadd ptr addrspace(1) %ptr, <2 x float> %value seq_cst, align 8 | ||
| ret <2 x float> %res | ||
| } | ||
|
|
||
| attributes #0 = { nounwind } | ||
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | ||
| ; CHECK: {{.*}} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,307 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
| ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ | ||
| ; RUN: | FileCheck %s -check-prefixes=RV32,RV32I | ||
| ; RUN: llc -mtriple=riscv32 -verify-machineinstrs -mattr=+zba < %s \ | ||
| ; RUN: | FileCheck %s -check-prefixes=RV32,RV32ZBA | ||
| ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ | ||
| ; RUN: | FileCheck %s -check-prefixes=RV64,RV64I | ||
| ; RUN: llc -mtriple=riscv64 -verify-machineinstrs -mattr=+zba < %s \ | ||
| ; RUN: | FileCheck %s -check-prefixes=RV64,RV64ZBA | ||
|
|
||
| declare void @callee(ptr) | ||
|
|
||
| define void @frame_16b() { | ||
| ; RV32-LABEL: frame_16b: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -16 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | ||
| ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: li a0, 0 | ||
| ; RV32-NEXT: call callee | ||
| ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 16 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: frame_16b: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -16 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | ||
| ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: li a0, 0 | ||
| ; RV64-NEXT: call callee | ||
| ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 16 | ||
| ; RV64-NEXT: ret | ||
| call void @callee(ptr null) | ||
| ret void | ||
| } | ||
|
|
||
| define void @frame_1024b() { | ||
| ; RV32-LABEL: frame_1024b: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -1024 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 1024 | ||
| ; RV32-NEXT: sw ra, 1020(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: addi a0, sp, 12 | ||
| ; RV32-NEXT: call callee | ||
| ; RV32-NEXT: lw ra, 1020(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 1024 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: frame_1024b: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -1024 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 1024 | ||
| ; RV64-NEXT: sd ra, 1016(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: addi a0, sp, 8 | ||
| ; RV64-NEXT: call callee | ||
| ; RV64-NEXT: ld ra, 1016(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 1024 | ||
| ; RV64-NEXT: ret | ||
| %a = alloca [1008 x i8] | ||
| call void @callee(ptr %a) | ||
| ret void | ||
| } | ||
|
|
||
| define void @frame_2048b() { | ||
| ; RV32-LABEL: frame_2048b: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: addi sp, sp, -16 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2048 | ||
| ; RV32-NEXT: addi a0, sp, 12 | ||
| ; RV32-NEXT: call callee | ||
| ; RV32-NEXT: addi sp, sp, 16 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: frame_2048b: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: addi sp, sp, -16 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2048 | ||
| ; RV64-NEXT: addi a0, sp, 8 | ||
| ; RV64-NEXT: call callee | ||
| ; RV64-NEXT: addi sp, sp, 16 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %a = alloca [2032 x i8] | ||
| call void @callee(ptr %a) | ||
| ret void | ||
| } | ||
|
|
||
| define void @frame_4096b() { | ||
| ; RV32-LABEL: frame_4096b: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: addi sp, sp, -2048 | ||
| ; RV32-NEXT: addi sp, sp, -16 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 4096 | ||
| ; RV32-NEXT: addi a0, sp, 12 | ||
| ; RV32-NEXT: call callee | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: addi sp, sp, 32 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: frame_4096b: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: addi sp, sp, -2048 | ||
| ; RV64-NEXT: addi sp, sp, -16 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 4096 | ||
| ; RV64-NEXT: addi a0, sp, 8 | ||
| ; RV64-NEXT: call callee | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: addi sp, sp, 32 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %a = alloca [4080 x i8] | ||
| call void @callee(ptr %a) | ||
| ret void | ||
| } | ||
|
|
||
| ;; 2^12-16+2032 | ||
| define void @frame_4kb() { | ||
| ; RV32-LABEL: frame_4kb: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: lui a0, 1 | ||
| ; RV32-NEXT: sub sp, sp, a0 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 6128 | ||
| ; RV32-NEXT: addi a0, sp, 12 | ||
| ; RV32-NEXT: call callee | ||
| ; RV32-NEXT: lui a0, 1 | ||
| ; RV32-NEXT: add sp, sp, a0 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: frame_4kb: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: lui a0, 1 | ||
| ; RV64-NEXT: sub sp, sp, a0 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 6128 | ||
| ; RV64-NEXT: addi a0, sp, 8 | ||
| ; RV64-NEXT: call callee | ||
| ; RV64-NEXT: lui a0, 1 | ||
| ; RV64-NEXT: add sp, sp, a0 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %a = alloca [6112 x i8] | ||
| call void @callee(ptr %a) | ||
| ret void | ||
| } | ||
|
|
||
| ;; 2^13-16+2032 | ||
| define void @frame_8kb() { | ||
| ; RV32-LABEL: frame_8kb: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: lui a0, 2 | ||
| ; RV32-NEXT: sub sp, sp, a0 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 10224 | ||
| ; RV32-NEXT: addi a0, sp, 12 | ||
| ; RV32-NEXT: call callee | ||
| ; RV32-NEXT: lui a0, 2 | ||
| ; RV32-NEXT: add sp, sp, a0 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: frame_8kb: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: lui a0, 2 | ||
| ; RV64-NEXT: sub sp, sp, a0 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 10224 | ||
| ; RV64-NEXT: addi a0, sp, 8 | ||
| ; RV64-NEXT: call callee | ||
| ; RV64-NEXT: lui a0, 2 | ||
| ; RV64-NEXT: add sp, sp, a0 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %a = alloca [10208 x i8] | ||
| call void @callee(ptr %a) | ||
| ret void | ||
| } | ||
|
|
||
| ;; 2^14-16+2032 | ||
| define void @frame_16kb() { | ||
| ; RV32-LABEL: frame_16kb: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: lui a0, 4 | ||
| ; RV32-NEXT: sub sp, sp, a0 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 18416 | ||
| ; RV32-NEXT: addi a0, sp, 12 | ||
| ; RV32-NEXT: call callee | ||
| ; RV32-NEXT: lui a0, 4 | ||
| ; RV32-NEXT: add sp, sp, a0 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: frame_16kb: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: lui a0, 4 | ||
| ; RV64-NEXT: sub sp, sp, a0 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 18416 | ||
| ; RV64-NEXT: addi a0, sp, 8 | ||
| ; RV64-NEXT: call callee | ||
| ; RV64-NEXT: lui a0, 4 | ||
| ; RV64-NEXT: add sp, sp, a0 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %a = alloca [18400 x i8] | ||
| call void @callee(ptr %a) | ||
| ret void | ||
| } | ||
|
|
||
| ;; 2^15-16+2032 | ||
| define void @frame_32kb() { | ||
| ; RV32-LABEL: frame_32kb: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: lui a0, 8 | ||
| ; RV32-NEXT: sub sp, sp, a0 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 34800 | ||
| ; RV32-NEXT: addi a0, sp, 12 | ||
| ; RV32-NEXT: call callee | ||
| ; RV32-NEXT: lui a0, 8 | ||
| ; RV32-NEXT: add sp, sp, a0 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: frame_32kb: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: lui a0, 8 | ||
| ; RV64-NEXT: sub sp, sp, a0 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 34800 | ||
| ; RV64-NEXT: addi a0, sp, 8 | ||
| ; RV64-NEXT: call callee | ||
| ; RV64-NEXT: lui a0, 8 | ||
| ; RV64-NEXT: add sp, sp, a0 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %a = alloca [34784 x i8] | ||
| call void @callee(ptr %a) | ||
| ret void | ||
| } | ||
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | ||
| ; RV32I: {{.*}} | ||
| ; RV32ZBA: {{.*}} | ||
| ; RV64I: {{.*}} | ||
| ; RV64ZBA: {{.*}} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,259 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
| ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ | ||
| ; RUN: | FileCheck %s -check-prefixes=RV32,RV32I | ||
| ; RUN: llc -mtriple=riscv32 -verify-machineinstrs -mattr=+zba < %s \ | ||
| ; RUN: | FileCheck %s -check-prefixes=RV32,RV32ZBA | ||
| ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ | ||
| ; RUN: | FileCheck %s -check-prefixes=RV64,RV64I | ||
| ; RUN: llc -mtriple=riscv64 -verify-machineinstrs -mattr=+zba < %s \ | ||
| ; RUN: | FileCheck %s -check-prefixes=RV64,RV64ZBA | ||
|
|
||
| declare void @inspect(...) | ||
|
|
||
| define void @test() { | ||
| ; RV32-LABEL: test: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: addi sp, sp, -2048 | ||
| ; RV32-NEXT: addi sp, sp, -1120 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 5200 | ||
| ; RV32-NEXT: addi a0, sp, 12 | ||
| ; RV32-NEXT: addi a1, sp, 2047 | ||
| ; RV32-NEXT: addi a1, a1, 13 | ||
| ; RV32-NEXT: lui a2, 1 | ||
| ; RV32-NEXT: addi a2, a2, 12 | ||
| ; RV32-NEXT: add a2, sp, a2 | ||
| ; RV32-NEXT: lui a3, 1 | ||
| ; RV32-NEXT: addi a3, a3, 1036 | ||
| ; RV32-NEXT: add a3, sp, a3 | ||
| ; RV32-NEXT: call inspect | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: addi sp, sp, 1136 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: test: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: addi sp, sp, -2048 | ||
| ; RV64-NEXT: addi sp, sp, -1120 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 5200 | ||
| ; RV64-NEXT: addi a0, sp, 8 | ||
| ; RV64-NEXT: addi a1, sp, 2047 | ||
| ; RV64-NEXT: addi a1, a1, 9 | ||
| ; RV64-NEXT: lui a2, 1 | ||
| ; RV64-NEXT: addiw a2, a2, 8 | ||
| ; RV64-NEXT: add a2, sp, a2 | ||
| ; RV64-NEXT: lui a3, 1 | ||
| ; RV64-NEXT: addiw a3, a3, 1032 | ||
| ; RV64-NEXT: add a3, sp, a3 | ||
| ; RV64-NEXT: call inspect | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: addi sp, sp, 1136 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %p4 = alloca [64 x i8], align 1 | ||
| %p3 = alloca [1024 x i8], align 1 | ||
| %p2 = alloca [2048 x i8], align 1 | ||
| %p1 = alloca [2048 x i8], align 1 | ||
| call void (...) @inspect(ptr %p1, ptr %p2, ptr %p3, ptr %p4) | ||
| ret void | ||
| } | ||
|
|
||
| define void @align_8() { | ||
| ; RV32-LABEL: align_8: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: addi sp, sp, -2048 | ||
| ; RV32-NEXT: addi sp, sp, -32 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 4112 | ||
| ; RV32-NEXT: addi a0, sp, 7 | ||
| ; RV32-NEXT: lui a1, 1 | ||
| ; RV32-NEXT: addi a1, a1, 8 | ||
| ; RV32-NEXT: add a1, sp, a1 | ||
| ; RV32-NEXT: call inspect | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: addi sp, sp, 48 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: align_8: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: addi sp, sp, -2048 | ||
| ; RV64-NEXT: addi sp, sp, -48 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 4128 | ||
| ; RV64-NEXT: addi a0, sp, 15 | ||
| ; RV64-NEXT: lui a1, 1 | ||
| ; RV64-NEXT: addiw a1, a1, 16 | ||
| ; RV64-NEXT: add a1, sp, a1 | ||
| ; RV64-NEXT: call inspect | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: addi sp, sp, 64 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %p2 = alloca i8, align 8 | ||
| %p1 = alloca [4097 x i8], align 1 | ||
| call void (...) @inspect(ptr %p1, ptr %p2) | ||
| ret void | ||
| } | ||
|
|
||
| define void @align_4() { | ||
| ; RV32-LABEL: align_4: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: addi sp, sp, -2048 | ||
| ; RV32-NEXT: addi sp, sp, -32 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 4112 | ||
| ; RV32-NEXT: addi a0, sp, 7 | ||
| ; RV32-NEXT: lui a1, 1 | ||
| ; RV32-NEXT: addi a1, a1, 8 | ||
| ; RV32-NEXT: add a1, sp, a1 | ||
| ; RV32-NEXT: call inspect | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: addi sp, sp, 48 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: align_4: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: addi sp, sp, -2048 | ||
| ; RV64-NEXT: addi sp, sp, -48 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 4128 | ||
| ; RV64-NEXT: addi a0, sp, 19 | ||
| ; RV64-NEXT: lui a1, 1 | ||
| ; RV64-NEXT: addiw a1, a1, 20 | ||
| ; RV64-NEXT: add a1, sp, a1 | ||
| ; RV64-NEXT: call inspect | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: addi sp, sp, 64 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %p2 = alloca i8, align 4 | ||
| %p1 = alloca [4097 x i8], align 1 | ||
| call void (...) @inspect(ptr %p1, ptr %p2) | ||
| ret void | ||
| } | ||
|
|
||
| define void @align_2() { | ||
| ; RV32-LABEL: align_2: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: addi sp, sp, -2048 | ||
| ; RV32-NEXT: addi sp, sp, -32 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 4112 | ||
| ; RV32-NEXT: addi a0, sp, 9 | ||
| ; RV32-NEXT: lui a1, 1 | ||
| ; RV32-NEXT: addi a1, a1, 10 | ||
| ; RV32-NEXT: add a1, sp, a1 | ||
| ; RV32-NEXT: call inspect | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: addi sp, sp, 48 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: align_2: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: addi sp, sp, -2048 | ||
| ; RV64-NEXT: addi sp, sp, -48 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 4128 | ||
| ; RV64-NEXT: addi a0, sp, 21 | ||
| ; RV64-NEXT: lui a1, 1 | ||
| ; RV64-NEXT: addiw a1, a1, 22 | ||
| ; RV64-NEXT: add a1, sp, a1 | ||
| ; RV64-NEXT: call inspect | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: addi sp, sp, 64 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %p2 = alloca i8, align 2 | ||
| %p1 = alloca [4097 x i8], align 1 | ||
| call void (...) @inspect(ptr %p1, ptr %p2) | ||
| ret void | ||
| } | ||
|
|
||
|
|
||
| define void @align_1() { | ||
| ; RV32-LABEL: align_1: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -2032 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill | ||
| ; RV32-NEXT: .cfi_offset ra, -4 | ||
| ; RV32-NEXT: addi sp, sp, -2048 | ||
| ; RV32-NEXT: addi sp, sp, -32 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 4112 | ||
| ; RV32-NEXT: addi a0, sp, 10 | ||
| ; RV32-NEXT: lui a1, 1 | ||
| ; RV32-NEXT: addi a1, a1, 11 | ||
| ; RV32-NEXT: add a1, sp, a1 | ||
| ; RV32-NEXT: call inspect | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: addi sp, sp, 48 | ||
| ; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload | ||
| ; RV32-NEXT: addi sp, sp, 2032 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: align_1: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -2032 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 2032 | ||
| ; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill | ||
| ; RV64-NEXT: .cfi_offset ra, -8 | ||
| ; RV64-NEXT: addi sp, sp, -2048 | ||
| ; RV64-NEXT: addi sp, sp, -48 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 4128 | ||
| ; RV64-NEXT: addi a0, sp, 22 | ||
| ; RV64-NEXT: lui a1, 1 | ||
| ; RV64-NEXT: addiw a1, a1, 23 | ||
| ; RV64-NEXT: add a1, sp, a1 | ||
| ; RV64-NEXT: call inspect | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: addi sp, sp, 64 | ||
| ; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: addi sp, sp, 2032 | ||
| ; RV64-NEXT: ret | ||
| %p2 = alloca i8, align 1 | ||
| %p1 = alloca [4097 x i8], align 1 | ||
| call void (...) @inspect(ptr %p1, ptr %p2) | ||
| ret void | ||
| } | ||
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | ||
| ; RV32I: {{.*}} | ||
| ; RV32ZBA: {{.*}} | ||
| ; RV64I: {{.*}} | ||
| ; RV64ZBA: {{.*}} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,84 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 | ||
| ; RUN: llc -mtriple x86_64-pc-linux < %s | FileCheck %s | ||
|
|
||
| define <2 x half> @test_atomicrmw_fadd_v2f16_align4(ptr addrspace(1) %ptr, <2 x half> %value) #0 { | ||
| ; CHECK-LABEL: test_atomicrmw_fadd_v2f16_align4: | ||
| ; CHECK: # %bb.0: | ||
| ; CHECK-NEXT: pushq %rbp | ||
| ; CHECK-NEXT: pushq %rbx | ||
| ; CHECK-NEXT: subq $88, %rsp | ||
| ; CHECK-NEXT: movq %rdi, %rbx | ||
| ; CHECK-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | ||
| ; CHECK-NEXT: psrld $16, %xmm0 | ||
| ; CHECK-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | ||
| ; CHECK-NEXT: pinsrw $0, 2(%rdi), %xmm1 | ||
| ; CHECK-NEXT: pinsrw $0, (%rdi), %xmm0 | ||
| ; CHECK-NEXT: .p2align 4, 0x90 | ||
| ; CHECK-NEXT: .LBB0_1: # %atomicrmw.start | ||
| ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 | ||
| ; CHECK-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | ||
| ; CHECK-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | ||
| ; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | ||
| ; CHECK-NEXT: callq __extendhfsf2@PLT | ||
| ; CHECK-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill | ||
| ; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | ||
| ; CHECK-NEXT: callq __extendhfsf2@PLT | ||
| ; CHECK-NEXT: addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload | ||
| ; CHECK-NEXT: callq __truncsfhf2@PLT | ||
| ; CHECK-NEXT: pextrw $0, %xmm0, %eax | ||
| ; CHECK-NEXT: movzwl %ax, %ebp | ||
| ; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | ||
| ; CHECK-NEXT: callq __extendhfsf2@PLT | ||
| ; CHECK-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill | ||
| ; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | ||
| ; CHECK-NEXT: callq __extendhfsf2@PLT | ||
| ; CHECK-NEXT: addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload | ||
| ; CHECK-NEXT: callq __truncsfhf2@PLT | ||
| ; CHECK-NEXT: pextrw $0, %xmm0, %ecx | ||
| ; CHECK-NEXT: shll $16, %ecx | ||
| ; CHECK-NEXT: orl %ebp, %ecx | ||
| ; CHECK-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | ||
| ; CHECK-NEXT: pextrw $0, %xmm0, %edx | ||
| ; CHECK-NEXT: shll $16, %edx | ||
| ; CHECK-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | ||
| ; CHECK-NEXT: pextrw $0, %xmm0, %eax | ||
| ; CHECK-NEXT: movzwl %ax, %eax | ||
| ; CHECK-NEXT: orl %edx, %eax | ||
| ; CHECK-NEXT: lock cmpxchgl %ecx, (%rbx) | ||
| ; CHECK-NEXT: setne %cl | ||
| ; CHECK-NEXT: pinsrw $0, %eax, %xmm0 | ||
| ; CHECK-NEXT: shrl $16, %eax | ||
| ; CHECK-NEXT: pinsrw $0, %eax, %xmm1 | ||
| ; CHECK-NEXT: testb %cl, %cl | ||
| ; CHECK-NEXT: jne .LBB0_1 | ||
| ; CHECK-NEXT: # %bb.2: # %atomicrmw.end | ||
| ; CHECK-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] | ||
| ; CHECK-NEXT: addq $88, %rsp | ||
| ; CHECK-NEXT: popq %rbx | ||
| ; CHECK-NEXT: popq %rbp | ||
| ; CHECK-NEXT: retq | ||
| %res = atomicrmw fadd ptr addrspace(1) %ptr, <2 x half> %value seq_cst, align 4 | ||
| ret <2 x half> %res | ||
| } | ||
|
|
||
| define <2 x float> @test_atomicrmw_fadd_v2f32_align8(ptr addrspace(1) %ptr, <2 x float> %value) #0 { | ||
| ; CHECK-LABEL: test_atomicrmw_fadd_v2f32_align8: | ||
| ; CHECK: # %bb.0: | ||
| ; CHECK-NEXT: movq {{.*#+}} xmm1 = mem[0],zero | ||
| ; CHECK-NEXT: .p2align 4, 0x90 | ||
| ; CHECK-NEXT: .LBB1_1: # %atomicrmw.start | ||
| ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 | ||
| ; CHECK-NEXT: movq %xmm1, %rax | ||
| ; CHECK-NEXT: addps %xmm0, %xmm1 | ||
| ; CHECK-NEXT: movq %xmm1, %rcx | ||
| ; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) | ||
| ; CHECK-NEXT: movq %rax, %xmm1 | ||
| ; CHECK-NEXT: jne .LBB1_1 | ||
| ; CHECK-NEXT: # %bb.2: # %atomicrmw.end | ||
| ; CHECK-NEXT: movdqa %xmm1, %xmm0 | ||
| ; CHECK-NEXT: retq | ||
| %res = atomicrmw fadd ptr addrspace(1) %ptr, <2 x float> %value seq_cst, align 8 | ||
| ret <2 x float> %res | ||
| } | ||
|
|
||
| attributes #0 = { nounwind } |