|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
2 |
| -; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s |
| 2 | +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s --check-prefixes=CHECK,SVE |
| 3 | +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 < %s | FileCheck %s --check-prefixes=CHECK,SVE2 |
3 | 4 |
|
4 | 5 | ;
|
5 | 6 | ; CLASTA (Vectors)
|
@@ -570,13 +571,21 @@ define <vscale x 2 x double> @dupq_lane_f64(<vscale x 2 x double> %a, i64 %idx)
|
570 | 571 |
|
571 | 572 | ; NOTE: Index out of range (0-3)
|
572 | 573 | define <vscale x 2 x i64> @dupq_i64_range(<vscale x 2 x i64> %a) {
|
573 |
| -; CHECK-LABEL: dupq_i64_range: |
574 |
| -; CHECK: // %bb.0: |
575 |
| -; CHECK-NEXT: index z1.d, #0, #1 |
576 |
| -; CHECK-NEXT: and z1.d, z1.d, #0x1 |
577 |
| -; CHECK-NEXT: orr z1.d, z1.d, #0x8 |
578 |
| -; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d |
579 |
| -; CHECK-NEXT: ret |
| 574 | +; SVE-LABEL: dupq_i64_range: |
| 575 | +; SVE: // %bb.0: |
| 576 | +; SVE-NEXT: index z1.d, #0, #1 |
| 577 | +; SVE-NEXT: and z1.d, z1.d, #0x1 |
| 578 | +; SVE-NEXT: orr z1.d, z1.d, #0x8 |
| 579 | +; SVE-NEXT: tbl z0.d, { z0.d }, z1.d |
| 580 | +; SVE-NEXT: ret |
| 581 | +; |
| 582 | +; SVE2-LABEL: dupq_i64_range: |
| 583 | +; SVE2: // %bb.0: |
| 584 | +; SVE2-NEXT: index z1.d, #0, #1 |
| 585 | +; SVE2-NEXT: and z1.d, z1.d, #0x1 |
| 586 | +; SVE2-NEXT: add z1.d, z1.d, #8 // =0x8 |
| 587 | +; SVE2-NEXT: tbl z0.d, { z0.d }, z1.d |
| 588 | +; SVE2-NEXT: ret |
580 | 589 | %out = call <vscale x 2 x i64> @llvm.aarch64.sve.dupq.lane.nxv2i64(<vscale x 2 x i64> %a, i64 4)
|
581 | 590 | ret <vscale x 2 x i64> %out
|
582 | 591 | }
|
@@ -1082,87 +1091,143 @@ define <vscale x 2 x double> @rev_f64(<vscale x 2 x double> %a) {
|
1082 | 1091 | ;
|
1083 | 1092 |
|
1084 | 1093 | define <vscale x 16 x i8> @splice_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
|
1085 |
| -; CHECK-LABEL: splice_i8: |
1086 |
| -; CHECK: // %bb.0: |
1087 |
| -; CHECK-NEXT: splice z0.b, p0, z0.b, z1.b |
1088 |
| -; CHECK-NEXT: ret |
| 1094 | +; SVE-LABEL: splice_i8: |
| 1095 | +; SVE: // %bb.0: |
| 1096 | +; SVE-NEXT: splice z0.b, p0, z0.b, z1.b |
| 1097 | +; SVE-NEXT: ret |
| 1098 | +; |
| 1099 | +; SVE2-LABEL: splice_i8: |
| 1100 | +; SVE2: // %bb.0: |
| 1101 | +; SVE2-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1 |
| 1102 | +; SVE2-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1 |
| 1103 | +; SVE2-NEXT: splice z0.b, p0, { z0.b, z1.b } |
| 1104 | +; SVE2-NEXT: ret |
1089 | 1105 | %out = call <vscale x 16 x i8> @llvm.aarch64.sve.splice.nxv16i8(<vscale x 16 x i1> %pg,
|
1090 | 1106 | <vscale x 16 x i8> %a,
|
1091 | 1107 | <vscale x 16 x i8> %b)
|
1092 | 1108 | ret <vscale x 16 x i8> %out
|
1093 | 1109 | }
|
1094 | 1110 |
|
1095 | 1111 | define <vscale x 8 x i16> @splice_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
|
1096 |
| -; CHECK-LABEL: splice_i16: |
1097 |
| -; CHECK: // %bb.0: |
1098 |
| -; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h |
1099 |
| -; CHECK-NEXT: ret |
| 1112 | +; SVE-LABEL: splice_i16: |
| 1113 | +; SVE: // %bb.0: |
| 1114 | +; SVE-NEXT: splice z0.h, p0, z0.h, z1.h |
| 1115 | +; SVE-NEXT: ret |
| 1116 | +; |
| 1117 | +; SVE2-LABEL: splice_i16: |
| 1118 | +; SVE2: // %bb.0: |
| 1119 | +; SVE2-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1 |
| 1120 | +; SVE2-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1 |
| 1121 | +; SVE2-NEXT: splice z0.h, p0, { z0.h, z1.h } |
| 1122 | +; SVE2-NEXT: ret |
1100 | 1123 | %out = call <vscale x 8 x i16> @llvm.aarch64.sve.splice.nxv8i16(<vscale x 8 x i1> %pg,
|
1101 | 1124 | <vscale x 8 x i16> %a,
|
1102 | 1125 | <vscale x 8 x i16> %b)
|
1103 | 1126 | ret <vscale x 8 x i16> %out
|
1104 | 1127 | }
|
1105 | 1128 |
|
1106 | 1129 | define <vscale x 4 x i32> @splice_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
|
1107 |
| -; CHECK-LABEL: splice_i32: |
1108 |
| -; CHECK: // %bb.0: |
1109 |
| -; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s |
1110 |
| -; CHECK-NEXT: ret |
| 1130 | +; SVE-LABEL: splice_i32: |
| 1131 | +; SVE: // %bb.0: |
| 1132 | +; SVE-NEXT: splice z0.s, p0, z0.s, z1.s |
| 1133 | +; SVE-NEXT: ret |
| 1134 | +; |
| 1135 | +; SVE2-LABEL: splice_i32: |
| 1136 | +; SVE2: // %bb.0: |
| 1137 | +; SVE2-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1 |
| 1138 | +; SVE2-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1 |
| 1139 | +; SVE2-NEXT: splice z0.s, p0, { z0.s, z1.s } |
| 1140 | +; SVE2-NEXT: ret |
1111 | 1141 | %out = call <vscale x 4 x i32> @llvm.aarch64.sve.splice.nxv4i32(<vscale x 4 x i1> %pg,
|
1112 | 1142 | <vscale x 4 x i32> %a,
|
1113 | 1143 | <vscale x 4 x i32> %b)
|
1114 | 1144 | ret <vscale x 4 x i32> %out
|
1115 | 1145 | }
|
1116 | 1146 |
|
1117 | 1147 | define <vscale x 2 x i64> @splice_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
|
1118 |
| -; CHECK-LABEL: splice_i64: |
1119 |
| -; CHECK: // %bb.0: |
1120 |
| -; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d |
1121 |
| -; CHECK-NEXT: ret |
| 1148 | +; SVE-LABEL: splice_i64: |
| 1149 | +; SVE: // %bb.0: |
| 1150 | +; SVE-NEXT: splice z0.d, p0, z0.d, z1.d |
| 1151 | +; SVE-NEXT: ret |
| 1152 | +; |
| 1153 | +; SVE2-LABEL: splice_i64: |
| 1154 | +; SVE2: // %bb.0: |
| 1155 | +; SVE2-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1 |
| 1156 | +; SVE2-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1 |
| 1157 | +; SVE2-NEXT: splice z0.d, p0, { z0.d, z1.d } |
| 1158 | +; SVE2-NEXT: ret |
1122 | 1159 | %out = call <vscale x 2 x i64> @llvm.aarch64.sve.splice.nxv2i64(<vscale x 2 x i1> %pg,
|
1123 | 1160 | <vscale x 2 x i64> %a,
|
1124 | 1161 | <vscale x 2 x i64> %b)
|
1125 | 1162 | ret <vscale x 2 x i64> %out
|
1126 | 1163 | }
|
1127 | 1164 |
|
1128 | 1165 | define <vscale x 8 x bfloat> @splice_bf16(<vscale x 8 x i1> %pg, <vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) #0 {
|
1129 |
| -; CHECK-LABEL: splice_bf16: |
1130 |
| -; CHECK: // %bb.0: |
1131 |
| -; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h |
1132 |
| -; CHECK-NEXT: ret |
| 1166 | +; SVE-LABEL: splice_bf16: |
| 1167 | +; SVE: // %bb.0: |
| 1168 | +; SVE-NEXT: splice z0.h, p0, z0.h, z1.h |
| 1169 | +; SVE-NEXT: ret |
| 1170 | +; |
| 1171 | +; SVE2-LABEL: splice_bf16: |
| 1172 | +; SVE2: // %bb.0: |
| 1173 | +; SVE2-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1 |
| 1174 | +; SVE2-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1 |
| 1175 | +; SVE2-NEXT: splice z0.h, p0, { z0.h, z1.h } |
| 1176 | +; SVE2-NEXT: ret |
1133 | 1177 | %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.splice.nxv8bf16(<vscale x 8 x i1> %pg,
|
1134 | 1178 | <vscale x 8 x bfloat> %a,
|
1135 | 1179 | <vscale x 8 x bfloat> %b)
|
1136 | 1180 | ret <vscale x 8 x bfloat> %out
|
1137 | 1181 | }
|
1138 | 1182 |
|
1139 | 1183 | define <vscale x 8 x half> @splice_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a, <vscale x 8 x half> %b) {
|
1140 |
| -; CHECK-LABEL: splice_f16: |
1141 |
| -; CHECK: // %bb.0: |
1142 |
| -; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h |
1143 |
| -; CHECK-NEXT: ret |
| 1184 | +; SVE-LABEL: splice_f16: |
| 1185 | +; SVE: // %bb.0: |
| 1186 | +; SVE-NEXT: splice z0.h, p0, z0.h, z1.h |
| 1187 | +; SVE-NEXT: ret |
| 1188 | +; |
| 1189 | +; SVE2-LABEL: splice_f16: |
| 1190 | +; SVE2: // %bb.0: |
| 1191 | +; SVE2-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1 |
| 1192 | +; SVE2-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1 |
| 1193 | +; SVE2-NEXT: splice z0.h, p0, { z0.h, z1.h } |
| 1194 | +; SVE2-NEXT: ret |
1144 | 1195 | %out = call <vscale x 8 x half> @llvm.aarch64.sve.splice.nxv8f16(<vscale x 8 x i1> %pg,
|
1145 | 1196 | <vscale x 8 x half> %a,
|
1146 | 1197 | <vscale x 8 x half> %b)
|
1147 | 1198 | ret <vscale x 8 x half> %out
|
1148 | 1199 | }
|
1149 | 1200 |
|
1150 | 1201 | define <vscale x 4 x float> @splice_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a, <vscale x 4 x float> %b) {
|
1151 |
| -; CHECK-LABEL: splice_f32: |
1152 |
| -; CHECK: // %bb.0: |
1153 |
| -; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s |
1154 |
| -; CHECK-NEXT: ret |
| 1202 | +; SVE-LABEL: splice_f32: |
| 1203 | +; SVE: // %bb.0: |
| 1204 | +; SVE-NEXT: splice z0.s, p0, z0.s, z1.s |
| 1205 | +; SVE-NEXT: ret |
| 1206 | +; |
| 1207 | +; SVE2-LABEL: splice_f32: |
| 1208 | +; SVE2: // %bb.0: |
| 1209 | +; SVE2-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1 |
| 1210 | +; SVE2-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1 |
| 1211 | +; SVE2-NEXT: splice z0.s, p0, { z0.s, z1.s } |
| 1212 | +; SVE2-NEXT: ret |
1155 | 1213 | %out = call <vscale x 4 x float> @llvm.aarch64.sve.splice.nxv4f32(<vscale x 4 x i1> %pg,
|
1156 | 1214 | <vscale x 4 x float> %a,
|
1157 | 1215 | <vscale x 4 x float> %b)
|
1158 | 1216 | ret <vscale x 4 x float> %out
|
1159 | 1217 | }
|
1160 | 1218 |
|
1161 | 1219 | define <vscale x 2 x double> @splice_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a, <vscale x 2 x double> %b) {
|
1162 |
| -; CHECK-LABEL: splice_f64: |
1163 |
| -; CHECK: // %bb.0: |
1164 |
| -; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d |
1165 |
| -; CHECK-NEXT: ret |
| 1220 | +; SVE-LABEL: splice_f64: |
| 1221 | +; SVE: // %bb.0: |
| 1222 | +; SVE-NEXT: splice z0.d, p0, z0.d, z1.d |
| 1223 | +; SVE-NEXT: ret |
| 1224 | +; |
| 1225 | +; SVE2-LABEL: splice_f64: |
| 1226 | +; SVE2: // %bb.0: |
| 1227 | +; SVE2-NEXT: // kill: def $z1 killed $z1 killed $z0_z1 def $z0_z1 |
| 1228 | +; SVE2-NEXT: // kill: def $z0 killed $z0 killed $z0_z1 def $z0_z1 |
| 1229 | +; SVE2-NEXT: splice z0.d, p0, { z0.d, z1.d } |
| 1230 | +; SVE2-NEXT: ret |
1166 | 1231 | %out = call <vscale x 2 x double> @llvm.aarch64.sve.splice.nxv2f64(<vscale x 2 x i1> %pg,
|
1167 | 1232 | <vscale x 2 x double> %a,
|
1168 | 1233 | <vscale x 2 x double> %b)
|
|
0 commit comments