@@ -109,8 +109,9 @@ Addendum: it's "only" 33% speedup.
109109#define TMR_TARGi (_nsv , i , do_taint ) \
110110STMT_START { \
111111 IV TARGi_iv = i; \
112- if (GIMME_V == G_LIST || !(PL_op->op_private & OPpENTERSUB_HASTARG)) \
113- _nsv = sv_2mortal(newSViv(TARGi_iv)); \
112+ if (GIMME_V == G_LIST || !(PL_op->op_private & OPpENTERSUB_HASTARG)) { \
113+ TMR_newSViv_mortal(_nsv, TARGi_iv); \
114+ } \
114115 else { \
115116 _nsv = PAD_SV(PL_op->op_targ); \
116117 if (LIKELY( \
@@ -136,8 +137,9 @@ STMT_START { \
136137#define TMR_TARGu (_nsv , u , do_taint ) \
137138STMT_START { \
138139 UV TARGu_uv = u ; \
139- if (GIMME_V == G_LIST || !(PL_op -> op_private & OPpENTERSUB_HASTARG )) \
140- _nsv = sv_2mortal (newSVuv (TARGu_uv )); \
140+ if (GIMME_V == G_LIST || !(PL_op -> op_private & OPpENTERSUB_HASTARG )) { \
141+ TMR_newSVuv_mortal (_nsv , TARGu_uv ); \
142+ } \
141143 else { \
142144 _nsv = PAD_SV (PL_op -> op_targ ); \
143145 if (LIKELY ( \
@@ -164,8 +166,9 @@ STMT_START { \
164166#define TMR_TARGn (_nsv , n , do_taint ) \
165167STMT_START { \
166168 NV TARGn_nv = n ; \
167- if (GIMME_V == G_LIST || !(PL_op -> op_private & OPpENTERSUB_HASTARG )) \
168- _nsv = sv_2mortal (newSVnv (TARGn_nv )); \
169+ if (GIMME_V == G_LIST || !(PL_op -> op_private & OPpENTERSUB_HASTARG )) { \
170+ TMR_newSVnv_mortal (_nsv , TARGn_nv ); \
171+ } \
169172 else { \
170173 _nsv = PAD_SV (PL_op -> op_targ ); \
171174 if (LIKELY ( \
@@ -185,6 +188,52 @@ STMT_START { \
185188 } \
186189} STMT_END
187190
191+
192+ /* newSV_type_mortal() is faster than sv_2mortal() */
193+
194+ #ifdef newSV_type_mortal
195+
196+ # define TMR_newSViv_mortal (_nsv , _iv ) STMT_START { \
197+ _nsv = newSV_type_mortal(SVt_IV); \
198+ SvIOK_on(_nsv); \
199+ SvIV_set(_nsv, _iv); \
200+ } STMT_END
201+
202+ # define TMR_newSVuv_mortal (_nsv , _uv ) STMT_START { \
203+ _nsv = newSV_type_mortal(SVt_IV); \
204+ SvIOK_on(_nsv); \
205+ if (_uv <= (UV)IV_MAX) { \
206+ SvIV_set(_nsv, (IV)_uv); \
207+ } \
208+ else { \
209+ SvIsUV_on(_nsv);\
210+ SvUV_set(_nsv, _uv); \
211+ } \
212+ } STMT_END
213+
214+ # define TMR_newSVnv_mortal (_nsv , _nv ) STMT_START { \
215+ _nsv = newSV_type_mortal(SVt_NV); \
216+ SvNV_set(_nsv, _nv); \
217+ SvNOK_on(_nsv); \
218+ } STMT_END
219+
220+ #else
221+
222+ # define TMR_newSViv_mortal (_nsv , _iv ) STMT_START { \
223+ _nsv = sv_2mortal(newSViv(_iv)); \
224+ } STMT_END
225+
226+ # define TMR_newSVuv_mortal (_nsv , _uv ) STMT_START { \
227+ _nsv = sv_2mortal(newSVuv(_uv)); \
228+ } STMT_END
229+
230+ # define TMR_newSVnv_mortal (_nsv , _nv ) STMT_START { \
231+ _nsv = sv_2mortal(newSVnv(_nv)); \
232+ } STMT_END
233+
234+ #endif
235+
236+
188237#define IV_1E6 1000000
189238#define IV_1E7 10000000
190239#define IV_1E9 1000000000
@@ -1724,8 +1773,11 @@ gettimeofday()
17241773 /* copy to registers to prove sv_2mortal/newSViv */
17251774 IV sec = Tp .tv_sec ; /* can't modify the values */
17261775 IV usec = Tp .tv_usec ;
1727- PUSHs (sv_2mortal (newSViv (sec )));
1728- PUSHs (sv_2mortal (newSViv (usec )));
1776+ SV * rsv ;
1777+ TMR_newSViv_mortal (rsv , sec );
1778+ PUSHs (rsv );
1779+ TMR_newSViv_mortal (rsv , usec );
1780+ PUSHs (rsv );
17291781 } else {
17301782 /* no Perl_leave_adjust_stacks() hazard here,
17311783 only a PP vs call_sv() hazard */
@@ -1752,8 +1804,9 @@ gettimeofday()
17521804 else
17531805 sv_setnv_mg (rsv , TARGn_nv );
17541806 }
1755- else
1756- rsv = sv_2mortal (newSVnv (TARGn_nv ));
1807+ else {
1808+ TMR_newSVnv_mortal (rsv , TARGn_nv );
1809+ }
17571810 PUSHs (rsv );
17581811 }
17591812 }
0 commit comments