[Transforms] Silence a warning in SROA.cpp (NFC)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-trunc-stores.ll
blob13fcd94ea8a2606f722d92d1d16bb48c4f91e129
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s
4 ; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
7 target triple = "aarch64-unknown-linux-gnu"
9 define void @store_trunc_v8i16i8(ptr %ap, ptr %dest) {
10 ; CHECK-LABEL: store_trunc_v8i16i8:
11 ; CHECK:       // %bb.0:
12 ; CHECK-NEXT:    ptrue p0.h, vl8
13 ; CHECK-NEXT:    ldr q0, [x0]
14 ; CHECK-NEXT:    st1b { z0.h }, p0, [x1]
15 ; CHECK-NEXT:    ret
17 ; NONEON-NOSVE-LABEL: store_trunc_v8i16i8:
18 ; NONEON-NOSVE:       // %bb.0:
19 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
20 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
21 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
22 ; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
23 ; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
24 ; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
25 ; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
26 ; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
27 ; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
28 ; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
29 ; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
30 ; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
31 ; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
32 ; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
33 ; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
34 ; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
35 ; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
36 ; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
37 ; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
38 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
39 ; NONEON-NOSVE-NEXT:    str d0, [x1]
40 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
41 ; NONEON-NOSVE-NEXT:    ret
42   %a = load <8 x i16>, ptr %ap
43   %val = trunc <8 x i16> %a to <8 x i8>
44   store <8 x i8> %val, ptr %dest
45   ret void
48 define void @store_trunc_v4i32i8(ptr %ap, ptr %dest) {
49 ; CHECK-LABEL: store_trunc_v4i32i8:
50 ; CHECK:       // %bb.0:
51 ; CHECK-NEXT:    ptrue p0.s, vl4
52 ; CHECK-NEXT:    ldr q0, [x0]
53 ; CHECK-NEXT:    st1b { z0.s }, p0, [x1]
54 ; CHECK-NEXT:    ret
56 ; NONEON-NOSVE-LABEL: store_trunc_v4i32i8:
57 ; NONEON-NOSVE:       // %bb.0:
58 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
59 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-16]!
60 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
61 ; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #8]
62 ; NONEON-NOSVE-NEXT:    ldp w10, w11, [sp]
63 ; NONEON-NOSVE-NEXT:    strb w8, [x1, #3]
64 ; NONEON-NOSVE-NEXT:    strb w9, [x1, #2]
65 ; NONEON-NOSVE-NEXT:    strb w11, [x1, #1]
66 ; NONEON-NOSVE-NEXT:    strb w10, [x1]
67 ; NONEON-NOSVE-NEXT:    add sp, sp, #16
68 ; NONEON-NOSVE-NEXT:    ret
69   %a = load <4 x i32>, ptr %ap
70   %val = trunc <4 x i32> %a to <4 x i8>
71   store <4 x i8> %val, ptr %dest
72   ret void
75 define void @store_trunc_v4i32i16(ptr %ap, ptr %dest) {
76 ; CHECK-LABEL: store_trunc_v4i32i16:
77 ; CHECK:       // %bb.0:
78 ; CHECK-NEXT:    ptrue p0.s, vl4
79 ; CHECK-NEXT:    ldr q0, [x0]
80 ; CHECK-NEXT:    st1h { z0.s }, p0, [x1]
81 ; CHECK-NEXT:    ret
83 ; NONEON-NOSVE-LABEL: store_trunc_v4i32i16:
84 ; NONEON-NOSVE:       // %bb.0:
85 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
86 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
87 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
88 ; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
89 ; NONEON-NOSVE-NEXT:    strh w9, [sp, #30]
90 ; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
91 ; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
92 ; NONEON-NOSVE-NEXT:    strh w9, [sp, #26]
93 ; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
94 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
95 ; NONEON-NOSVE-NEXT:    str d0, [x1]
96 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
97 ; NONEON-NOSVE-NEXT:    ret
98   %a = load <4 x i32>, ptr %ap
99   %val = trunc <4 x i32> %a to <4 x i16>
100   store <4 x i16> %val, ptr %dest
101   ret void
104 define void @store_trunc_v2i64i8(ptr %ap, ptr %dest) {
105 ; CHECK-LABEL: store_trunc_v2i64i8:
106 ; CHECK:       // %bb.0:
107 ; CHECK-NEXT:    ptrue p0.d, vl2
108 ; CHECK-NEXT:    ldr q0, [x0]
109 ; CHECK-NEXT:    st1w { z0.d }, p0, [x1]
110 ; CHECK-NEXT:    ret
112 ; NONEON-NOSVE-LABEL: store_trunc_v2i64i8:
113 ; NONEON-NOSVE:       // %bb.0:
114 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
115 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
116 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
117 ; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
118 ; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
119 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
120 ; NONEON-NOSVE-NEXT:    str d0, [x1]
121 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
122 ; NONEON-NOSVE-NEXT:    ret
123   %a = load <2 x i64>, ptr %ap
124   %val = trunc <2 x i64> %a to <2 x i32>
125   store <2 x i32> %val, ptr %dest
126   ret void
129 define void @store_trunc_v2i256i64(ptr %ap, ptr %dest) {
130 ; CHECK-LABEL: store_trunc_v2i256i64:
131 ; CHECK:       // %bb.0:
132 ; CHECK-NEXT:    ldr d1, [x0, #32]
133 ; CHECK-NEXT:    ptrue p0.d, vl1
134 ; CHECK-NEXT:    ldr d0, [x0]
135 ; CHECK-NEXT:    splice z0.d, p0, { z0.d, z1.d }
136 ; CHECK-NEXT:    str q0, [x1]
137 ; CHECK-NEXT:    ret
139 ; NONEON-NOSVE-LABEL: store_trunc_v2i256i64:
140 ; NONEON-NOSVE:       // %bb.0:
141 ; NONEON-NOSVE-NEXT:    ldr x8, [x0, #32]
142 ; NONEON-NOSVE-NEXT:    ldr x9, [x0]
143 ; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #-32]!
144 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
145 ; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp]
146 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
147 ; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
148 ; NONEON-NOSVE-NEXT:    str q0, [x1]
149 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
150 ; NONEON-NOSVE-NEXT:    ret
151   %a = load <2 x i256>, ptr %ap
152   %val = trunc <2 x i256> %a to <2 x i64>
153   store <2 x i64> %val, ptr %dest
154   ret void