@@ -1163,41 +1163,50 @@ my class MASTCompilerInstance {
1163
1163
?? $ block . lexical_param($ var . name )
1164
1164
!! $ block . local($ var . name );
1165
1165
my $ valreg ;
1166
+ my $ valreg_kind ;
1166
1167
my $ truncop ;
1168
+
1167
1169
if $ param_kind == $ MVM_reg_obj || $ param_kind == $ MVM_reg_int64 ||
1168
1170
$ param_kind == $ MVM_reg_num64 || $ param_kind == $ MVM_reg_str ||
1169
1171
$ param_kind == $ MVM_reg_uint64 {
1172
+ $ valreg_kind := $ param_kind ;
1170
1173
$ valreg := $ targetreg ;
1171
1174
}
1172
1175
elsif $ param_kind == $ MVM_reg_num32 {
1173
- $ valreg := $ * REGALLOC . fresh_register( $ MVM_reg_num64 ) ;
1176
+ $ valreg_kind := $ MVM_reg_num64 ;
1174
1177
$ truncop := ' trunc_n32' ;
1175
1178
}
1176
1179
elsif $ param_kind == $ MVM_reg_int32 {
1177
- $ valreg := $ * REGALLOC . fresh_register( $ MVM_reg_int64 ) ;
1180
+ $ valreg_kind := $ MVM_reg_int64 ;
1178
1181
$ truncop := ' trunc_i32' ;
1179
1182
}
1180
1183
elsif $ param_kind == $ MVM_reg_int16 {
1181
- $ valreg := $ * REGALLOC . fresh_register( $ MVM_reg_int64 ) ;
1184
+ $ valreg_kind := $ MVM_reg_int64 ;
1182
1185
$ truncop := ' trunc_i16' ;
1183
1186
}
1184
1187
elsif $ param_kind == $ MVM_reg_int8 {
1185
- $ valreg := $ * REGALLOC . fresh_register( $ MVM_reg_int64 ) ;
1188
+ $ valreg_kind := $ MVM_reg_int64 ;
1186
1189
$ truncop := ' trunc_i8' ;
1187
1190
}
1188
1191
elsif $ param_kind == $ MVM_reg_uint32 {
1189
- $ valreg := $ * REGALLOC . fresh_register( $ MVM_reg_uint64 ) ;
1192
+ $ valreg_kind := $ MVM_reg_uint64 ;
1190
1193
$ truncop := ' trunc_u32' ;
1191
1194
}
1192
1195
elsif $ param_kind == $ MVM_reg_uint16 {
1193
- $ valreg := $ * REGALLOC . fresh_register( $ MVM_reg_uint64 ) ;
1196
+ $ valreg_kind := $ MVM_reg_uint64 ;
1194
1197
$ truncop := ' trunc_u16' ;
1195
1198
}
1196
1199
elsif $ param_kind == $ MVM_reg_uint8 {
1197
- $ valreg := $ * REGALLOC . fresh_register( $ MVM_reg_uint64 ) ;
1200
+ $ valreg_kind := $ MVM_reg_uint64 ;
1198
1201
$ truncop := ' trunc_u8' ;
1199
1202
}
1200
1203
1204
+ # Get a fresh register to store the result of the
1205
+ # truncation, but only if needed
1206
+ if $ valreg_kind != $ param_kind {
1207
+ $ valreg := $ * REGALLOC . fresh_register($ valreg_kind );
1208
+ }
1209
+
1201
1210
# NQP->QAST always provides a default value for optional NQP params
1202
1211
# even if no default initializer expression is provided.
1203
1212
if $ var . default {
@@ -1206,7 +1215,7 @@ my class MASTCompilerInstance {
1206
1215
1207
1216
# generate default initialization code. Could also be
1208
1217
# wrapped in another QAST::Block.
1209
- my $ default_mast := self . as_mast($ var . default, : want($ param_kind ));
1218
+ my $ default_mast := self . as_mast($ var . default, : want($ valreg_kind ));
1210
1219
1211
1220
# emit param grabbing op
1212
1221
$ val2
0 commit comments