@@ -4632,20 +4632,31 @@ bool AArch64DAGToDAGISel::trySelectXAR(SDNode *N) {
4632
4632
SDValue Imm = CurDAG->getTargetConstant (
4633
4633
ShAmt, DL, N0.getOperand (1 ).getValueType (), false );
4634
4634
4635
- if (ShAmt + HsAmt != 64 )
4635
+ if (ShAmt + HsAmt != VT. getScalarSizeInBits () )
4636
4636
return false ;
4637
4637
4638
4638
if (!IsXOROperand) {
4639
4639
SDValue Zero = CurDAG->getTargetConstant (0 , DL, MVT::i64 );
4640
4640
SDNode *MOV =
4641
- CurDAG->getMachineNode (AArch64::MOVIv2d_ns, DL, MVT::v2i64 , Zero);
4641
+ CurDAG->getMachineNode (AArch64::MOVIv2d_ns, DL, MVT::nxv4i32 , Zero);
4642
4642
SDValue MOVIV = SDValue (MOV, 0 );
4643
- R1 = N1->getOperand (0 );
4644
- R2 = MOVIV;
4643
+
4644
+ SDValue Undef = SDValue (
4645
+ CurDAG->getMachineNode (TargetOpcode::IMPLICIT_DEF, DL, MVT::nxv4i32),
4646
+ 0 );
4647
+ SDValue ZSub = CurDAG->getTargetConstant (AArch64::zsub, DL, MVT::i32 );
4648
+
4649
+ R1 =
4650
+ SDValue (CurDAG->getMachineNode (AArch64::INSERT_SUBREG, DL, MVT::nxv4i32,
4651
+ Undef, N1->getOperand (0 ), ZSub),
4652
+ 0 );
4653
+ R2 = SDValue (CurDAG->getMachineNode (AArch64::INSERT_SUBREG, DL,
4654
+ MVT::nxv4i32, Undef, MOVIV, ZSub),
4655
+ 0 );
4645
4656
}
4646
4657
4647
4658
// If the input is a v1i64, widen to a v2i64 to use XAR.
4648
- assert ((VT == MVT::v1i64 || VT == MVT::v2i64) && " Unexpected XAR type!" );
4659
+ // assert((VT == MVT::v1i64 || VT == MVT::v2i64) && "Unexpected XAR type!");
4649
4660
if (VT == MVT::v1i64) {
4650
4661
EVT SVT = MVT::v2i64;
4651
4662
SDValue Undef =
@@ -4661,12 +4672,16 @@ bool AArch64DAGToDAGISel::trySelectXAR(SDNode *N) {
4661
4672
}
4662
4673
4663
4674
SDValue Ops[] = {R1, R2, Imm};
4664
- SDNode *XAR = CurDAG->getMachineNode (AArch64::XAR , DL, MVT::v2i64 , Ops);
4675
+ SDNode *XAR = CurDAG->getMachineNode (AArch64::XAR_ZZZI_S , DL, VT , Ops);
4665
4676
4666
4677
if (VT == MVT::v1i64) {
4667
4678
SDValue DSub = CurDAG->getTargetConstant (AArch64::dsub, DL, MVT::i32 );
4668
4679
XAR = CurDAG->getMachineNode (AArch64::EXTRACT_SUBREG, DL, VT,
4669
4680
SDValue (XAR, 0 ), DSub);
4681
+ } else {
4682
+ SDValue ZSub = CurDAG->getTargetConstant (AArch64::zsub, DL, MVT::i32 );
4683
+ XAR = CurDAG->getMachineNode (AArch64::EXTRACT_SUBREG, DL, VT,
4684
+ SDValue (XAR, 0 ), ZSub);
4670
4685
}
4671
4686
ReplaceNode (N, XAR);
4672
4687
return true ;
0 commit comments