@@ -69,8 +69,7 @@ SDValue RISCVSelectionDAGInfo::EmitTargetCodeForMemset(
6969 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
7070 SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
7171 MachinePointerInfo DstPtrInfo) const {
72- const RISCVSubtarget &Subtarget =
73- DAG.getMachineFunction ().getSubtarget <RISCVSubtarget>();
72+ const auto &Subtarget = DAG.getSubtarget <RISCVSubtarget>();
7473 // We currently do this only for Xqcilsm
7574 if (!Subtarget.hasVendorXqcilsm ())
7675 return SDValue ();
@@ -83,7 +82,7 @@ SDValue RISCVSelectionDAGInfo::EmitTargetCodeForMemset(
8382 uint64_t NumberOfBytesToWrite = ConstantSize->getZExtValue ();
8483
8584 // Do this only if it is word aligned and we write multiple of 4 bytes.
86- if (!(( Alignment.value () & 3 ) == 0 && (NumberOfBytesToWrite & 3 ) == 0 ))
85+ if (!(Alignment.value () >= 4 ) || !( (NumberOfBytesToWrite & 3 ) == 0 ))
8786 return SDValue ();
8887
8988 SmallVector<SDValue, 8 > OutChains;
@@ -104,7 +103,7 @@ SDValue RISCVSelectionDAGInfo::EmitTargetCodeForMemset(
104103 if ((Src.getValueType () == MVT::i8 ) && !IsZeroVal)
105104 // Replicate byte to word by multiplication with 0x01010101.
106105 SrcValueReplicated = DAG.getNode (ISD::MUL, dl, MVT::i32 , SrcValueReplicated,
107- DAG.getConstant (16843009 , dl, MVT::i32 ));
106+ DAG.getConstant (0x01010101ul , dl, MVT::i32 ));
108107
109108 // We limit a QC_SETWMI to 16 words or less to improve interruptibility.
110109 // So for 1-16 words we use a single QC_SETWMI:
@@ -128,38 +127,38 @@ SDValue RISCVSelectionDAGInfo::EmitTargetCodeForMemset(
128127 // QC_SETWMI R2, R0, N, 124
129128 //
130129 // For 48 words or more, call the target independent memset
130+ if ( NumberOfWords >= 48 )
131+ return SDValue ();
132+
131133 if (NumberOfWords <= 16 ) {
132134 // 1 - 16 words
133135 SizeWords = DAG.getTargetConstant (NumberOfWords, dl, MVT::i32 );
134136 SDValue OffsetSetwmi = DAG.getTargetConstant (0 , dl, MVT::i32 );
135137 return getSetwmiNode (SizeWords, OffsetSetwmi);
136- } else if (NumberOfWords <= 47 ) {
137- if (NumberOfWords <= 32 ) {
138- // 17 - 32 words
139- SizeWords = DAG.getTargetConstant (NumberOfWords - 16 , dl, MVT::i32 );
140- OffsetSetwmi = DAG.getTargetConstant (64 , dl, MVT::i32 );
141- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
142-
143- SizeWords = DAG.getTargetConstant (16 , dl, MVT::i32 );
144- OffsetSetwmi = DAG.getTargetConstant (0 , dl, MVT::i32 );
145- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
146- } else {
147- // 33 - 47 words
148- SizeWords = DAG.getTargetConstant (NumberOfWords - 31 , dl, MVT::i32 );
149- OffsetSetwmi = DAG.getTargetConstant (124 , dl, MVT::i32 );
150- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
151-
152- SizeWords = DAG.getTargetConstant (15 , dl, MVT::i32 );
153- OffsetSetwmi = DAG.getTargetConstant (64 , dl, MVT::i32 );
154- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
155-
156- SizeWords = DAG.getTargetConstant (16 , dl, MVT::i32 );
157- OffsetSetwmi = DAG.getTargetConstant (0 , dl, MVT::i32 );
158- OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
159- }
160- return DAG.getNode (ISD::TokenFactor, dl, MVT::Other, OutChains);
161138 }
162139
163- // >= 48 words. Call target independent memset.
164- return SDValue ();
140+ if (NumberOfWords <= 32 ) {
141+ // 17 - 32 words
142+ SizeWords = DAG.getTargetConstant (NumberOfWords - 16 , dl, MVT::i32 );
143+ OffsetSetwmi = DAG.getTargetConstant (64 , dl, MVT::i32 );
144+ OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
145+
146+ SizeWords = DAG.getTargetConstant (16 , dl, MVT::i32 );
147+ OffsetSetwmi = DAG.getTargetConstant (0 , dl, MVT::i32 );
148+ OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
149+ } else {
150+ // 33 - 47 words
151+ SizeWords = DAG.getTargetConstant (NumberOfWords - 31 , dl, MVT::i32 );
152+ OffsetSetwmi = DAG.getTargetConstant (124 , dl, MVT::i32 );
153+ OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
154+
155+ SizeWords = DAG.getTargetConstant (15 , dl, MVT::i32 );
156+ OffsetSetwmi = DAG.getTargetConstant (64 , dl, MVT::i32 );
157+ OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
158+
159+ SizeWords = DAG.getTargetConstant (16 , dl, MVT::i32 );
160+ OffsetSetwmi = DAG.getTargetConstant (0 , dl, MVT::i32 );
161+ OutChains.push_back (getSetwmiNode (SizeWords, OffsetSetwmi));
162+ }
163+ return DAG.getNode (ISD::TokenFactor, dl, MVT::Other, OutChains);
165164}
0 commit comments