@@ -109,8 +109,9 @@ Addendum: it's "only" 33% speedup.
109
109
#define TMR_TARGi (_nsv , i , do_taint ) \
110
110
STMT_START { \
111
111
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
+ } \
114
115
else { \
115
116
_nsv = PAD_SV(PL_op->op_targ); \
116
117
if (LIKELY( \
@@ -136,8 +137,9 @@ STMT_START { \
136
137
#define TMR_TARGu (_nsv , u , do_taint ) \
137
138
STMT_START { \
138
139
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
+ } \
141
143
else { \
142
144
_nsv = PAD_SV (PL_op -> op_targ ); \
143
145
if (LIKELY ( \
@@ -164,8 +166,9 @@ STMT_START { \
164
166
#define TMR_TARGn (_nsv , n , do_taint ) \
165
167
STMT_START { \
166
168
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
+ } \
169
172
else { \
170
173
_nsv = PAD_SV (PL_op -> op_targ ); \
171
174
if (LIKELY ( \
@@ -185,6 +188,52 @@ STMT_START { \
185
188
} \
186
189
} STMT_END
187
190
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
+
188
237
#define IV_1E6 1000000
189
238
#define IV_1E7 10000000
190
239
#define IV_1E9 1000000000
@@ -1724,8 +1773,11 @@ gettimeofday()
1724
1773
/* copy to registers to prove sv_2mortal/newSViv */
1725
1774
IV sec = Tp .tv_sec ; /* can't modify the values */
1726
1775
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 );
1729
1781
} else {
1730
1782
/* no Perl_leave_adjust_stacks() hazard here,
1731
1783
only a PP vs call_sv() hazard */
@@ -1752,8 +1804,9 @@ gettimeofday()
1752
1804
else
1753
1805
sv_setnv_mg (rsv , TARGn_nv );
1754
1806
}
1755
- else
1756
- rsv = sv_2mortal (newSVnv (TARGn_nv ));
1807
+ else {
1808
+ TMR_newSVnv_mortal (rsv , TARGn_nv );
1809
+ }
1757
1810
PUSHs (rsv );
1758
1811
}
1759
1812
}
0 commit comments