| 1183 | } |
| 1184 | |
| 1185 | vector<SimNode *> SimulateVisitor::simulateExprMakeTuple(const ExprMakeTuple *mkt) { |
| 1186 | vector<SimNode *> simlist; |
| 1187 | // init with 0 |
| 1188 | int total = int(mkt->values.size()); |
| 1189 | if ( !mkt->doesNotNeedInit && !mkt->initAllFields ) { |
| 1190 | uint32_t sizeOf = mkt->makeType->getSizeOf(); |
| 1191 | SimNode * init0; |
| 1192 | if ( mkt->useCMRES ) { |
| 1193 | if ( sizeOf==0 ) { |
| 1194 | init0 = nullptr; |
| 1195 | } else if ( sizeOf <= 32 ) { |
| 1196 | init0 = context.code->makeNodeUnrollNZ<SimNode_InitLocalCMResN>(sizeOf, mkt->at, mkt->extraOffset); |
| 1197 | } else { |
| 1198 | init0 = context.code->makeNode<SimNode_InitLocalCMRes>(mkt->at, mkt->extraOffset, sizeOf); |
| 1199 | } |
| 1200 | } else if ( mkt->useStackRef ) { |
| 1201 | init0 = context.code->makeNode<SimNode_InitLocalRef>(mkt->at, mkt->stackTop, mkt->extraOffset, sizeOf); |
| 1202 | } else { |
| 1203 | init0 = context.code->makeNode<SimNode_InitLocal>(mkt->at, mkt->stackTop + mkt->extraOffset, sizeOf); |
| 1204 | } |
| 1205 | if (init0) simlist.push_back(init0); |
| 1206 | } |
| 1207 | for ( int index=0; index != total; ++index ) { |
| 1208 | auto & val = mkt->values[index]; |
| 1209 | uint32_t offset = mkt->extraOffset + mkt->makeType->getTupleFieldOffset(index); |
| 1210 | SimNode * cpy; |
| 1211 | if ( val->rtti_isMakeLocal() ) { |
| 1212 | // so what happens here, is we ask it for the generated commands and append it to this list only |
| 1213 | auto mkl = static_cast<ExprMakeLocal*>(val); |
| 1214 | auto lsim = sv_simulateLocal(mkl); |
| 1215 | simlist.insert(simlist.end(), lsim.begin(), lsim.end()); |
| 1216 | continue; |
| 1217 | } else if ( mkt->useCMRES ) { |
| 1218 | if (val->type->canCopy()) { |
| 1219 | cpy = sv_makeLocalCMResCopy(mkt->at, offset, val); |
| 1220 | } else { |
| 1221 | cpy = sv_makeLocalCMResMove(mkt->at, offset, val); |
| 1222 | } |
| 1223 | } else if ( mkt->useStackRef ) { |
| 1224 | if (val->type->canCopy()) { |
| 1225 | cpy = sv_makeLocalRefCopy(mkt->at, mkt->stackTop, offset, val); |
| 1226 | } else { |
| 1227 | cpy = sv_makeLocalRefMove(mkt->at, mkt->stackTop, offset, val); |
| 1228 | } |
| 1229 | } else { |
| 1230 | if (val->type->canCopy()) { |
| 1231 | cpy = sv_makeLocalCopy(mkt->at, mkt->stackTop + offset, val); |
| 1232 | } else { |
| 1233 | cpy = sv_makeLocalMove(mkt->at, mkt->stackTop + offset, val); |
| 1234 | } |
| 1235 | } |
| 1236 | if ( !cpy ) { |
| 1237 | context.thisProgram->error("internal compilation error, can't generate array initialization", "", "", mkt->at, CompilationError::internal_tuple); |
| 1238 | } |
| 1239 | simlist.push_back(cpy); |
| 1240 | } |
| 1241 | return simlist; |
| 1242 | } |