228 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2#3# Check that we can recognize a shuffle mask for a zip instruction, and produce4# G_ZIP1 or G_ZIP2 where appropriate.5#6# RUN: llc -mtriple aarch64 -run-pass=aarch64-postlegalizer-lowering -verify-machineinstrs %s -o - | FileCheck %s7 8...9---10name: zip1_v2s3211alignment: 412legalized: true13tracksRegLiveness: true14body: |15 bb.1.entry:16 liveins: $d0, $d117 18 ; CHECK-LABEL: name: zip1_v2s3219 ; CHECK: liveins: $d0, $d120 ; CHECK-NEXT: {{ $}}21 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d022 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d123 ; CHECK-NEXT: [[ZIP1_:%[0-9]+]]:_(<2 x s32>) = G_ZIP1 [[COPY]], [[COPY1]]24 ; CHECK-NEXT: $d0 = COPY [[ZIP1_]](<2 x s32>)25 ; CHECK-NEXT: RET_ReallyLR implicit $d026 %0:_(<2 x s32>) = COPY $d027 %1:_(<2 x s32>) = COPY $d128 %2:_(<2 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1, shufflemask(0, 2)29 $d0 = COPY %2(<2 x s32>)30 RET_ReallyLR implicit $d031 32...33---34name: zip1_v2s6435alignment: 436legalized: true37tracksRegLiveness: true38body: |39 bb.1.entry:40 liveins: $q0, $q141 42 ; CHECK-LABEL: name: zip1_v2s6443 ; CHECK: liveins: $q0, $q144 ; CHECK-NEXT: {{ $}}45 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s64>) = COPY $q046 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s64>) = COPY $q147 ; CHECK-NEXT: [[ZIP1_:%[0-9]+]]:_(<2 x s64>) = G_ZIP1 [[COPY]], [[COPY1]]48 ; CHECK-NEXT: $q0 = COPY [[ZIP1_]](<2 x s64>)49 ; CHECK-NEXT: RET_ReallyLR implicit $q050 %0:_(<2 x s64>) = COPY $q051 %1:_(<2 x s64>) = COPY $q152 %2:_(<2 x s64>) = G_SHUFFLE_VECTOR %0(<2 x s64>), %1, shufflemask(0, 2)53 $q0 = COPY %2(<2 x s64>)54 RET_ReallyLR implicit $q055 56...57---58name: zip1_v4s3259alignment: 460legalized: true61tracksRegLiveness: true62body: |63 bb.1.entry:64 liveins: $q0, $q165 66 ; CHECK-LABEL: name: zip1_v4s3267 ; CHECK: liveins: $q0, $q168 ; CHECK-NEXT: {{ $}}69 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q070 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q171 ; CHECK-NEXT: [[ZIP1_:%[0-9]+]]:_(<4 x s32>) = G_ZIP1 [[COPY]], [[COPY1]]72 ; CHECK-NEXT: $q0 = COPY [[ZIP1_]](<4 x s32>)73 ; CHECK-NEXT: RET_ReallyLR implicit $q074 %0:_(<4 x s32>) = COPY $q075 %1:_(<4 x s32>) = COPY $q176 %2:_(<4 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1, shufflemask(0, 4, 1, 5)77 $q0 = COPY %2(<4 x s32>)78 RET_ReallyLR implicit $q079 80...81---82name: zip2_v2s3283alignment: 484legalized: true85tracksRegLiveness: true86body: |87 bb.1.entry:88 liveins: $d0, $d189 90 ; CHECK-LABEL: name: zip2_v2s3291 ; CHECK: liveins: $d0, $d192 ; CHECK-NEXT: {{ $}}93 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d094 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d195 ; CHECK-NEXT: [[ZIP2_:%[0-9]+]]:_(<2 x s32>) = G_ZIP2 [[COPY]], [[COPY1]]96 ; CHECK-NEXT: $d0 = COPY [[ZIP2_]](<2 x s32>)97 ; CHECK-NEXT: RET_ReallyLR implicit $d098 %0:_(<2 x s32>) = COPY $d099 %1:_(<2 x s32>) = COPY $d1100 %2:_(<2 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1, shufflemask(1, 3)101 $d0 = COPY %2(<2 x s32>)102 RET_ReallyLR implicit $d0103 104...105---106name: zip2_v2s64107alignment: 4108legalized: true109tracksRegLiveness: true110body: |111 bb.1.entry:112 liveins: $q0, $q1113 114 ; CHECK-LABEL: name: zip2_v2s64115 ; CHECK: liveins: $q0, $q1116 ; CHECK-NEXT: {{ $}}117 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s64>) = COPY $q0118 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s64>) = COPY $q1119 ; CHECK-NEXT: [[ZIP2_:%[0-9]+]]:_(<2 x s64>) = G_ZIP2 [[COPY]], [[COPY1]]120 ; CHECK-NEXT: $q0 = COPY [[ZIP2_]](<2 x s64>)121 ; CHECK-NEXT: RET_ReallyLR implicit $q0122 %0:_(<2 x s64>) = COPY $q0123 %1:_(<2 x s64>) = COPY $q1124 %2:_(<2 x s64>) = G_SHUFFLE_VECTOR %0(<2 x s64>), %1, shufflemask(1, 3)125 $q0 = COPY %2(<2 x s64>)126 RET_ReallyLR implicit $q0127 128...129---130name: zip2_v4s32131alignment: 4132legalized: true133tracksRegLiveness: true134body: |135 bb.1.entry:136 liveins: $q0, $q1137 138 ; CHECK-LABEL: name: zip2_v4s32139 ; CHECK: liveins: $q0, $q1140 ; CHECK-NEXT: {{ $}}141 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0142 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1143 ; CHECK-NEXT: [[ZIP2_:%[0-9]+]]:_(<4 x s32>) = G_ZIP2 [[COPY]], [[COPY1]]144 ; CHECK-NEXT: $q0 = COPY [[ZIP2_]](<4 x s32>)145 ; CHECK-NEXT: RET_ReallyLR implicit $q0146 %0:_(<4 x s32>) = COPY $q0147 %1:_(<4 x s32>) = COPY $q1148 %2:_(<4 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1, shufflemask(2, 6, 3, 7)149 $q0 = COPY %2(<4 x s32>)150 RET_ReallyLR implicit $q0151 152...153---154name: zip2_no_combine_idx_mismatch155alignment: 4156legalized: true157tracksRegLiveness: true158body: |159 bb.1.entry:160 liveins: $q0, $q1161 162 ; This will fail because it expects 3 to be the second element of the163 ; shuffle vector mask.164 ; CHECK-LABEL: name: zip2_no_combine_idx_mismatch165 ; CHECK: liveins: $q0, $q1166 ; CHECK-NEXT: {{ $}}167 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s64>) = COPY $q0168 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s64>) = COPY $q1169 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8170 ; CHECK-NEXT: [[EXT:%[0-9]+]]:_(<2 x s64>) = G_EXT [[COPY]], [[COPY1]], [[C]](s32)171 ; CHECK-NEXT: $q0 = COPY [[EXT]](<2 x s64>)172 ; CHECK-NEXT: RET_ReallyLR implicit $q0173 %0:_(<2 x s64>) = COPY $q0174 %1:_(<2 x s64>) = COPY $q1175 %2:_(<2 x s64>) = G_SHUFFLE_VECTOR %0(<2 x s64>), %1, shufflemask(1, 2)176 $q0 = COPY %2(<2 x s64>)177 RET_ReallyLR implicit $q0178 179...180---181name: zip1_no_combine_idx_mismatch182alignment: 4183legalized: true184tracksRegLiveness: true185body: |186 bb.1.entry:187 liveins: $q0, $q1188 189 ; This will fail because it expects 2 to be the second element of the190 ; shuffle vector mask.191 ; CHECK-LABEL: name: zip1_no_combine_idx_mismatch192 ; CHECK: liveins: $q0, $q1193 ; CHECK-NEXT: {{ $}}194 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s64>) = COPY $q0195 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s64>) = COPY [[COPY]](<2 x s64>)196 ; CHECK-NEXT: $q0 = COPY [[COPY1]](<2 x s64>)197 ; CHECK-NEXT: RET_ReallyLR implicit $q0198 %0:_(<2 x s64>) = COPY $q0199 %1:_(<2 x s64>) = COPY $q1200 %2:_(<2 x s64>) = G_SHUFFLE_VECTOR %0(<2 x s64>), %1, shufflemask(0, 1)201 $q0 = COPY %2(<2 x s64>)202 RET_ReallyLR implicit $q0203 204...205---206name: no_combine_first_elt_of_mask_must_be_zero_or_one207alignment: 4208legalized: true209tracksRegLiveness: true210body: |211 bb.1.entry:212 liveins: $q0, $q1213 214 ; zip1/zip2 must have 0 or 1 as the first element in the shuffle mask.215 ; CHECK-LABEL: name: no_combine_first_elt_of_mask_must_be_zero_or_one216 ; CHECK: liveins: $q0, $q1217 ; CHECK-NEXT: {{ $}}218 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0219 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1220 ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<4 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<4 x s32>), [[COPY1]], shufflemask(3, 4, 1, 5)221 ; CHECK-NEXT: $q0 = COPY [[SHUF]](<4 x s32>)222 ; CHECK-NEXT: RET_ReallyLR implicit $q0223 %0:_(<4 x s32>) = COPY $q0224 %1:_(<4 x s32>) = COPY $q1225 %2:_(<4 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1, shufflemask(3, 4, 1, 5)226 $q0 = COPY %2(<4 x s32>)227 RET_ReallyLR implicit $q0228