Skip to content

Commit ca962be

Browse files
modulovaluedart-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
[vm] arm64: use ins for one-lane 32x4 shuffles
Lowers the 12 shuffle masks that change a single lane to a MOV and an INS. Also lowers shuffleMix mask 0xE4, which takes the lower half of left and the upper half of right, to a MOV and an INS. Issue: #64170 Issue: #64345 Issue: #64511 TEST=lib/typed_data/simd_shuffle_all_masks_test Change-Id: I8c0d1353eec11abe93919b17eaac5395625d92bc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/563881 Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com> Auto-Submit: Modestas Valauskas <valauskasmodestas@gmail.com>
1 parent 4825c59 commit ca962be

1 file changed

Lines changed: 52 additions & 0 deletions

File tree

‎runtime/vm/compiler/backend/il_arm64.cc‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4013,6 +4013,54 @@ DEFINE_EMIT(Simd32x4Shuffle, (VRegister result, VRegister value)) {
40134013
case 0x93: // wxyz
40144014
__ vext(result, value, value, 12);
40154015
break;
4016+
case 0xE5: // yyzw
4017+
__ vmov(result, value);
4018+
__ vinss(result, 0, value, 1);
4019+
break;
4020+
case 0xE6: // zyzw
4021+
__ vmov(result, value);
4022+
__ vinss(result, 0, value, 2);
4023+
break;
4024+
case 0xE7: // wyzw
4025+
__ vmov(result, value);
4026+
__ vinss(result, 0, value, 3);
4027+
break;
4028+
case 0xE0: // xxzw
4029+
__ vmov(result, value);
4030+
__ vinss(result, 1, value, 0);
4031+
break;
4032+
case 0xE8: // xzzw
4033+
__ vmov(result, value);
4034+
__ vinss(result, 1, value, 2);
4035+
break;
4036+
case 0xEC: // xwzw
4037+
__ vmov(result, value);
4038+
__ vinss(result, 1, value, 3);
4039+
break;
4040+
case 0xC4: // xyxw
4041+
__ vmov(result, value);
4042+
__ vinss(result, 2, value, 0);
4043+
break;
4044+
case 0xD4: // xyyw
4045+
__ vmov(result, value);
4046+
__ vinss(result, 2, value, 1);
4047+
break;
4048+
case 0xF4: // xyww
4049+
__ vmov(result, value);
4050+
__ vinss(result, 2, value, 3);
4051+
break;
4052+
case 0x24: // xyzx
4053+
__ vmov(result, value);
4054+
__ vinss(result, 3, value, 0);
4055+
break;
4056+
case 0x64: // xyzy
4057+
__ vmov(result, value);
4058+
__ vinss(result, 3, value, 1);
4059+
break;
4060+
case 0xA4: // xyzz
4061+
__ vmov(result, value);
4062+
__ vinss(result, 3, value, 2);
4063+
break;
40164064
default:
40174065
__ LoadQImmediate(VTMP, ShuffleTableIndices(mask));
40184066
__ vtbl1(result, value, VTMP);
@@ -4029,6 +4077,10 @@ DEFINE_EMIT(Simd32x4ShuffleMix,
40294077
case 0x4E: // zwxy
40304078
__ vext(result, left, right, 8);
40314079
break;
4080+
case 0xE4: // xyzw
4081+
__ vmov(result, left);
4082+
__ vinsd(result, 1, right, 1);
4083+
break;
40324084
default:
40334085
__ LoadQImmediate(VTMP, ShuffleTableIndices(mask));
40344086
__ vtbl1(result, left, VTMP);

0 commit comments

Comments
 (0)