@@ -86,21 +86,24 @@ SDValue RISCVSelectionDAGInfo::EmitTargetCodeForMemset(
8686 return SDValue ();
8787
8888 SmallVector<SDValue, 8 > OutChains;
89- SDValue SizeWords, OffsetSetwmi;
9089 SDValue SrcValueReplicated = DAG.getNode (ISD::ZERO_EXTEND, dl, MVT::i32 , Src);
9190 int NumberOfWords = NumberOfBytesToWrite / 4 ;
91+ MachineFunction &MF = DAG.getMachineFunction ();
9292
9393 // Helper for constructing the QC_SETWMI instruction
94- auto getSetwmiNode = [&](SDValue SizeWords, SDValue OffsetSetwmi) -> SDValue {
95- SDValue Ops[] = {Chain, SrcValueReplicated, Dst, SizeWords, OffsetSetwmi};
96- return DAG.getNode (RISCVISD::QC_SETWMI, dl, MVT::Other, Ops);
94+ auto getSetwmiNode = [&](uint8_t SizeWords, uint8_t OffsetSetwmi) -> SDValue {
95+ SDValue Ops[] = {Chain, SrcValueReplicated, Dst,
96+ DAG.getTargetConstant (SizeWords, dl, MVT::i32 ),
97+ DAG.getTargetConstant (OffsetSetwmi, dl, MVT::i32 )};
98+ MachineMemOperand *BaseMemOperand = MF.getMachineMemOperand (
99+ DstPtrInfo, MachineMemOperand::MOStore, SizeWords * 4 , Align (4 ));
100+ return DAG.getMemIntrinsicNode (RISCVISD::QC_SETWMI, dl,
101+ DAG.getVTList (MVT::Other), Ops, MVT::i32 ,
102+ BaseMemOperand);
97103 };
98104
99- bool IsZeroVal =
100- isa<ConstantSDNode>(Src) && cast<ConstantSDNode>(Src)->isZero ();
101-
102105 // If i8 type and constant non-zero value.
103- if ((Src.getValueType () == MVT::i8 ) && !IsZeroVal )
106+ if ((Src.getValueType () == MVT::i8 ) && !isNullConstant (Src) )
104107 // Replicate byte to word by multiplication with 0x01010101.
105108 SrcValueReplicated =
106109 DAG.getNode (ISD::MUL, dl, MVT::i32 , SrcValueReplicated,
@@ -133,33 +136,19 @@ SDValue RISCVSelectionDAGInfo::EmitTargetCodeForMemset(
133136
134137 if (NumberOfWords <= 16 ) {
135138 // 1 - 16 words
136- SizeWords = DAG.getTargetConstant (NumberOfWords, dl, MVT::i32 );
137- SDValue OffsetSetwmi = DAG.getTargetConstant (0 , dl, MVT::i32 );
138- return getSetwmiNode (SizeWords, OffsetSetwmi);
139+ return getSetwmiNode (NumberOfWords, 0 );
139140 }
140141
141142 if (NumberOfWords <= 32 ) {
142143 // 17 - 32 words
143- SizeWords = DAG.getTargetConstant (NumberOfWords - 16 , dl, MVT::i32 );
144- OffsetSetwmi = DAG.getTargetConstant (64 , dl, MVT::i32 );
145- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
146-
147- SizeWords = DAG.getTargetConstant (16 , dl, MVT::i32 );
148- OffsetSetwmi = DAG.getTargetConstant (0 , dl, MVT::i32 );
149- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
144+ OutChains.push_back (getSetwmiNode (NumberOfWords - 16 , 64 ));
145+ OutChains.push_back (getSetwmiNode (16 , 0 ));
150146 } else {
151147 // 33 - 47 words
152- SizeWords = DAG.getTargetConstant (NumberOfWords - 31 , dl, MVT::i32 );
153- OffsetSetwmi = DAG.getTargetConstant (124 , dl, MVT::i32 );
154- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
155-
156- SizeWords = DAG.getTargetConstant (15 , dl, MVT::i32 );
157- OffsetSetwmi = DAG.getTargetConstant (64 , dl, MVT::i32 );
158- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
159-
160- SizeWords = DAG.getTargetConstant (16 , dl, MVT::i32 );
161- OffsetSetwmi = DAG.getTargetConstant (0 , dl, MVT::i32 );
162- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
148+ OutChains.push_back (getSetwmiNode (NumberOfWords - 31 , 124 ));
149+ OutChains.push_back (getSetwmiNode (15 , 64 ));
150+ OutChains.push_back (getSetwmiNode (16 , 0 ));
163151 }
152+
164153 return DAG.getNode (ISD::TokenFactor, dl, MVT::Other, OutChains);
165154}
0 commit comments