00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifdef _KEEP_RCS_ID
00037 static const char source_file[] = __FILE__;
00038 #endif
00039
00040 #include <stdio.h>
00041 #include <assert.h>
00042 #include <strings.h>
00043
00044 #include "topcode.h"
00045 #include "targ_isa_operands.h"
00046 #include "targ_isa_print.h"
00047 #include "targ_isa_pack.h"
00048 #include "targ_isa_bundle.h"
00049 #include "targ_isa_decode.h"
00050 #include "targ_isa_pseudo.h"
00051 #include "targ_isa_enums.h"
00052 #include "targ_isa_operands.h"
00053 #include "targ_abi_properties.h"
00054 #include "targ_proc_properties.h"
00055
00056 #include "ti_errors.h"
00057 #include "ti_asm.h"
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 INT TI_ASM_Pack_Inst(
00068 TOP topcode,
00069 const INT64 *result,
00070 const INT64 *opnd,
00071 ISA_PACK_INST *pinst)
00072 {
00073 INT comp;
00074 INT words;
00075 INT w;
00076 const ISA_PACK_INFO *pinfo;
00077 const ISA_PACK_ADJ_INFO *ainfo;
00078 INT64 bopnd[ISA_OPERAND_max_operands];
00079 INT64 bresult[ISA_OPERAND_max_results];
00080
00081 bcopy(opnd, bopnd, sizeof(bopnd));
00082 bcopy(result, bresult, sizeof(bresult));
00083
00084 topcode = ISA_PSEUDO_Translate(topcode,
00085 bresult,
00086 bopnd,
00087 ISA_PSEUDO_to_machine);
00088
00089 pinfo = ISA_PACK_Info(topcode);
00090 if (!pinfo) {
00091 sprintf(TI_errmsg, "no ISA_PACK_INFO for %s", TOP_Name(topcode));
00092 return TI_RC_ERROR;
00093 }
00094
00095 ainfo = ISA_PACK_Adj_Info(topcode);
00096 if (ainfo) ISA_PACK_Adjust_Operands(ainfo, bopnd, FALSE);
00097
00098 words = ISA_PACK_Inst_Words(topcode);
00099 for (w = 0; w < words; ++w) {
00100 ISA_PACK_INST inst = ISA_PACK_Init_Mask(topcode, w);
00101 do {
00102 UINT64 mask = ISA_PACK_INFO_Mask(pinfo);
00103 UINT opndpos = ISA_PACK_INFO_OpndPos(pinfo);
00104 UINT instpos = ISA_PACK_INFO_InstPos(pinfo);
00105 comp = ISA_PACK_INFO_Comp(pinfo);
00106
00107 switch (comp) {
00108 case ISA_PACK_COMP_opnd:
00109 case ISA_PACK_COMP_opnd+1:
00110 case ISA_PACK_COMP_opnd+2:
00111 case ISA_PACK_COMP_opnd+3:
00112 case ISA_PACK_COMP_opnd+4:
00113 case ISA_PACK_COMP_opnd+5:
00114 {
00115 INT n = comp - ISA_PACK_COMP_opnd;
00116 inst |= ((bopnd[n] >> opndpos) & mask) << instpos;
00117 }
00118 break;
00119
00120 case ISA_PACK_COMP_result:
00121 case ISA_PACK_COMP_result+1:
00122 {
00123 INT n = comp - ISA_PACK_COMP_result;
00124 inst |= ((bresult[n] >> opndpos) & mask) << instpos;
00125 }
00126 break;
00127
00128 case ISA_PACK_COMP_end:
00129 pinst[w] = inst;
00130 break;
00131
00132 default:
00133 sprintf(TI_errmsg, "Unhandled packing component %d for %s",
00134 comp, TOP_Name(topcode));
00135 return TI_RC_ERROR;
00136 }
00137 } while (++pinfo, comp != ISA_PACK_COMP_end);
00138 }
00139
00140 return words;
00141 }
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 INT TI_ASM_Print_Inst(
00152 TOP topcode,
00153 const char **result,
00154 const char **opnd,
00155 FILE *f)
00156 {
00157 INT i;
00158 INT st;
00159 INT comp;
00160 const char *arg[ISA_PRINT_COMP_MAX];
00161 const ISA_PRINT_INFO *pinfo = ISA_PRINT_Info(topcode);
00162
00163 if (!pinfo) {
00164 sprintf(TI_errmsg, "no ISA_PRINT_INFO for %s", TOP_Name(topcode));
00165 return TI_RC_ERROR;
00166 }
00167
00168 i = 0;
00169 do {
00170 comp = ISA_PRINT_INFO_Comp(pinfo, i);
00171
00172 switch (comp) {
00173 case ISA_PRINT_COMP_name:
00174 arg[i] = ISA_PRINT_AsmName(topcode);
00175 break;
00176
00177 case ISA_PRINT_COMP_opnd:
00178 case ISA_PRINT_COMP_opnd+1:
00179 case ISA_PRINT_COMP_opnd+2:
00180 case ISA_PRINT_COMP_opnd+3:
00181 case ISA_PRINT_COMP_opnd+4:
00182 case ISA_PRINT_COMP_opnd+5:
00183 arg[i] = opnd[comp - ISA_PRINT_COMP_opnd];
00184 break;
00185
00186 case ISA_PRINT_COMP_result:
00187 case ISA_PRINT_COMP_result+1:
00188 arg[i] = result[comp - ISA_PRINT_COMP_result];
00189 break;
00190
00191 case ISA_PRINT_COMP_end:
00192 break;
00193
00194 default:
00195 sprintf(TI_errmsg, "Unhandled listing component %d for %s",
00196 comp, TOP_Name(topcode));
00197 return TI_RC_ERROR;
00198
00199 }
00200 } while (++i, comp != ISA_PRINT_COMP_end);
00201
00202 st = fprintf (f, ISA_PRINT_INFO_Format(pinfo),
00203 arg[0], arg[1], arg[2], arg[3],
00204 arg[4], arg[5], arg[6], arg[7],
00205 arg[8]);
00206 if (st == -1) {
00207 sprintf(TI_errmsg, "fprintf failed: not enough disk space");
00208 return TI_RC_ERROR;
00209 }
00210 else return st;
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 static INT Format_Operand(
00222 char *buf,
00223 INT64 pc,
00224 const ISA_OPERAND_VALTYP *vtype,
00225 ISA_OPERAND_USE use,
00226 INT64 val,
00227 INT flags)
00228 {
00229 if (ISA_OPERAND_VALTYP_Is_Register(vtype)) {
00230 const char *rname;
00231 const char *fmt = (use == OU_predicate) ? ISA_PRINT_PREDICATE : "%s";
00232 ISA_REGISTER_CLASS rc = ISA_OPERAND_VALTYP_Register_Class(vtype);
00233 if ( !(flags & TI_ASM_DISASM_TRUE_PRED)
00234 && (use == OU_predicate)
00235 && ABI_PROPERTY_Is_true_predicate(rc, val))
00236 {
00237 rname = "";
00238 fmt = "%s";
00239 } else if (flags & TI_ASM_DISASM_ABI_REGS) {
00240 rname = ABI_PROPERTY_Reg_Name(rc, val);
00241 } else {
00242 const ISA_REGISTER_CLASS_INFO *rcinfo = ISA_REGISTER_CLASS_Info(rc);
00243 rname = ISA_REGISTER_CLASS_INFO_Reg_Name(rcinfo, val);
00244 }
00245 return sprintf(buf, fmt, rname) + 1;
00246 } else if (ISA_OPERAND_VALTYP_Is_Enum(vtype)) {
00247 ISA_ENUM_CLASS_VALUE ecv = (ISA_ENUM_CLASS_VALUE)val;
00248 return sprintf(buf, "%s", ISA_ECV_Name(ecv)) + 1;
00249 }
00250
00251 assert(ISA_OPERAND_VALTYP_Is_Literal(vtype));
00252
00253 if (ISA_OPERAND_VALTYP_Is_PCRel(vtype)) {
00254 val += pc;
00255 if (PROC_has_branch_delay_slot()) val += sizeof(ISA_BUNDLE);
00256 return sprintf(buf, "0x%llx", val) + 1;
00257 } else if (ISA_OPERAND_VALTYP_Is_Signed(vtype)) {
00258 return sprintf(buf, "%lld", val) + 1;
00259 } else {
00260 return sprintf(buf, "%llu", val) + 1;
00261 }
00262 }
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 INT TI_ASM_DisAsm_Inst(
00274 TOP topcode,
00275 INT64 *result,
00276 INT64 *opnd,
00277 INT64 pc,
00278 INT flags,
00279 char *bufptr)
00280 {
00281 INT comp;
00282 const char *arg[ISA_PRINT_COMP_MAX];
00283 char buf[80];
00284 int i;
00285 INT cursor;
00286 const ISA_PRINT_INFO *pinfo = ISA_PRINT_Info(topcode);
00287 const ISA_OPERAND_INFO *oinfo = ISA_OPERAND_Info(topcode);
00288
00289 cursor = 0;
00290 i = 0;
00291 do {
00292 comp = ISA_PRINT_INFO_Comp(pinfo, i);
00293 switch (comp) {
00294 case ISA_PRINT_COMP_name:
00295 arg[i] = ISA_PRINT_AsmName(topcode);
00296 break;
00297
00298 case ISA_PRINT_COMP_opnd:
00299 case ISA_PRINT_COMP_opnd+1:
00300 case ISA_PRINT_COMP_opnd+2:
00301 case ISA_PRINT_COMP_opnd+3:
00302 case ISA_PRINT_COMP_opnd+4:
00303 case ISA_PRINT_COMP_opnd+5:
00304 {
00305 INT n = comp - ISA_PRINT_COMP_opnd;
00306 const ISA_OPERAND_VALTYP *vtype = ISA_OPERAND_INFO_Operand(oinfo, n);
00307 ISA_OPERAND_USE use = ISA_OPERAND_INFO_Use(oinfo, n);
00308 arg[i] = buf + cursor;
00309 cursor += Format_Operand(buf + cursor, pc, vtype, use, opnd[n], flags);
00310 }
00311 break;
00312
00313 case ISA_PRINT_COMP_result:
00314 case ISA_PRINT_COMP_result+1:
00315 {
00316 INT n = comp - ISA_PRINT_COMP_result;
00317 const ISA_OPERAND_VALTYP *vtype = ISA_OPERAND_INFO_Result(oinfo, n);
00318 arg[i] = buf + cursor;
00319 cursor += Format_Operand(buf + cursor, 0, vtype, OU_UNDEFINED,
00320 result[n], flags);
00321 }
00322 break;
00323
00324 case ISA_PRINT_COMP_end:
00325 break;
00326
00327 default:
00328 assert(0);
00329
00330 }
00331 } while (++i, comp != ISA_PRINT_COMP_end);
00332
00333 return sprintf(bufptr, ISA_PRINT_INFO_Format(pinfo),
00334 arg[0], arg[1], arg[2], arg[3],
00335 arg[4], arg[5], arg[6], arg[7],
00336 arg[8]);
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347 void TI_ASM_Set_Bundle_Comp(
00348 ISA_BUNDLE *bundle,
00349 ISA_BUNDLE_PACK_COMP comp,
00350 UINT64 val
00351 )
00352 {
00353 const ISA_BUNDLE_PACK_INFO *pinfo = ISA_BUNDLE_Pack_Info();
00354 INT i = ISA_BUNDLE_Pack_Info_Index(comp);
00355 for (pinfo = pinfo + i; ISA_BUNDLE_PACK_INFO_Comp(pinfo) == comp; ++pinfo) {
00356 UINT64 mask = ISA_BUNDLE_PACK_INFO_Mask(pinfo);
00357 INT comp_pos = ISA_BUNDLE_PACK_INFO_CompPos(pinfo);
00358 INT bundle_pos = ISA_BUNDLE_PACK_INFO_BundlePos(pinfo);
00359 INT index = ISA_BUNDLE_PACK_INFO_Index(pinfo);
00360 bundle->word[index] = (bundle->word[index] & ~mask)
00361 | (((val >> comp_pos) << bundle_pos) & mask);
00362 }
00363 }
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374 UINT64 TI_ASM_Get_Bundle_Comp(
00375 const ISA_BUNDLE *bundle,
00376 ISA_BUNDLE_PACK_COMP comp
00377 )
00378 {
00379 UINT64 val = 0;
00380 const ISA_BUNDLE_PACK_INFO *pinfo = ISA_BUNDLE_Pack_Info();
00381 INT i = ISA_BUNDLE_Pack_Info_Index(comp);
00382 for (pinfo = pinfo + i; ISA_BUNDLE_PACK_INFO_Comp(pinfo) == comp; ++pinfo) {
00383 UINT64 mask = ISA_BUNDLE_PACK_INFO_Mask(pinfo);
00384 INT comp_pos = ISA_BUNDLE_PACK_INFO_CompPos(pinfo);
00385 INT bundle_pos = ISA_BUNDLE_PACK_INFO_BundlePos(pinfo);
00386 INT index = ISA_BUNDLE_PACK_INFO_Index(pinfo);
00387 val |= ((bundle->word[index] & mask) >> bundle_pos) << comp_pos;
00388 }
00389 return val;
00390 }
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 void TI_ASM_Set_Bundle_Reloc_Value(
00401 ISA_BUNDLE *bundle,
00402 INT slot,
00403 UINT64 val
00404 )
00405 {
00406 INT opnd;
00407 INT words;
00408 const ISA_PACK_INFO *pinfo;
00409 INT comp;
00410 INT i;
00411 ISA_PACK_INST inst[ISA_MAX_SLOTS];
00412 TOP topcode;
00413 INT template_bits = TI_ASM_Get_Bundle_Comp(bundle,
00414 ISA_BUNDLE_PACK_COMP_template);
00415 ISA_EXEC_UNIT ex_unit = ISA_EXEC_Unit(template_bits, slot);
00416
00417 for (i = 0; i < ISA_MAX_SLOTS; ++i) {
00418 ISA_BUNDLE_PACK_COMP slot_comp =
00419 (ISA_BUNDLE_PACK_COMP)(ISA_BUNDLE_PACK_COMP_slot + i);
00420 inst[i] = TI_ASM_Get_Bundle_Comp(bundle, slot_comp);
00421 }
00422 topcode = ISA_Decode_Inst(inst + slot, ex_unit);
00423
00424
00425
00426 if (topcode == TOP_UNDEFINED) {
00427 fprintf(stderr, "TI_ASM_Set_Bundle_Reloc_Value: couldn't decode instruction\n");
00428 assert(FALSE);
00429 }
00430
00431 opnd = TOP_Relocatable_Operand(topcode, NULL);
00432 if (opnd < 0) {
00433 fprintf(stderr, "TI_ASM_Set_Bundle_Reloc_Value: %s does not have a relocatable field\n",
00434 TOP_Name(topcode));
00435 assert(FALSE);
00436 }
00437
00438 words = ISA_PACK_Inst_Words(topcode);
00439 if (words <= 0) {
00440 fprintf(stderr, "TI_ASM_Set_Bundle_Reloc_Value: bad number of inst words (%d) for %s\n",
00441 words, TOP_Name(topcode));
00442 assert(FALSE);
00443 }
00444
00445 pinfo = ISA_PACK_Info(topcode);
00446 for (;;) {
00447 ISA_BUNDLE_PACK_COMP slot_comp;
00448 do {
00449 comp = ISA_PACK_INFO_Comp(pinfo);
00450 if (comp == ISA_PACK_COMP_opnd + opnd) {
00451 UINT64 mask = ISA_PACK_INFO_Mask(pinfo);
00452 UINT32 opndpos = ISA_PACK_INFO_OpndPos(pinfo);
00453 UINT32 instpos = ISA_PACK_INFO_InstPos(pinfo);
00454 inst[slot] = (inst[slot] & ~(mask << instpos))
00455 | (((val >> opndpos) & mask) << instpos);
00456 }
00457 } while (++pinfo, comp != ISA_PACK_COMP_end);
00458
00459 slot_comp = (ISA_BUNDLE_PACK_COMP)(ISA_BUNDLE_PACK_COMP_slot + slot);
00460 TI_ASM_Set_Bundle_Comp(bundle, slot_comp, inst[slot]);
00461
00462 if (--words == 0) break;
00463
00464 ++slot;
00465 if (slot >= ISA_MAX_SLOTS) {
00466 fprintf(stderr, "TI_ASM_Set_Bundle_Reloc_Value: can't handle cross bundle reloc for %s\n",
00467 TOP_Name(topcode));
00468 assert(FALSE);
00469 }
00470 }
00471 }
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482 UINT64 TI_ASM_Get_Bundle_Reloc_Value(
00483 const ISA_BUNDLE *bundle,
00484 INT slot
00485 )
00486 {
00487 INT opnd;
00488 const ISA_PACK_INFO *pinfo;
00489 INT comp;
00490 UINT64 val;
00491 INT words;
00492 INT i;
00493 const ISA_OPERAND_INFO *oinfo;
00494 const ISA_OPERAND_VALTYP *vtype;
00495 ISA_PACK_INST inst[ISA_MAX_SLOTS];
00496 TOP topcode;
00497 INT template_bits = TI_ASM_Get_Bundle_Comp(bundle,
00498 ISA_BUNDLE_PACK_COMP_template);
00499 ISA_EXEC_UNIT ex_unit = ISA_EXEC_Unit(template_bits, slot);
00500
00501 for (i = 0; i < ISA_MAX_SLOTS; ++i) {
00502 ISA_BUNDLE_PACK_COMP slot_comp =
00503 (ISA_BUNDLE_PACK_COMP)(ISA_BUNDLE_PACK_COMP_slot + i);
00504 inst[i] = TI_ASM_Get_Bundle_Comp(bundle, slot_comp);
00505 }
00506 topcode = ISA_Decode_Inst(inst + slot, ex_unit);
00507
00508
00509
00510 if (topcode == TOP_UNDEFINED) {
00511 fprintf(stderr, "TI_ASM_Get_Bundle_Reloc_Value: couldn't decode instruction\n");
00512 assert(FALSE);
00513 }
00514
00515 opnd = TOP_Relocatable_Operand(topcode, NULL);
00516 if (opnd < 0) {
00517 fprintf(stderr, "TI_ASM_Get_Bundle_Reloc_Value: %s does not have a relocatable field\n",
00518 TOP_Name(topcode));
00519 assert(FALSE);
00520 }
00521
00522 words = ISA_PACK_Inst_Words(topcode);
00523 if (words <= 0) {
00524 fprintf(stderr, "TI_ASM_Get_Bundle_Reloc_Value: bad number of inst words (%d) for %s\n",
00525 words, TOP_Name(topcode));
00526 assert(FALSE);
00527 }
00528
00529 pinfo = ISA_PACK_Info(topcode);
00530 val = 0;
00531 for (;;) {
00532 do {
00533 comp = ISA_PACK_INFO_Comp(pinfo);
00534 if (comp == ISA_PACK_COMP_opnd + opnd) {
00535 UINT64 mask = ISA_PACK_INFO_Mask(pinfo);
00536 UINT32 opndpos = ISA_PACK_INFO_OpndPos(pinfo);
00537 UINT32 instpos = ISA_PACK_INFO_InstPos(pinfo);
00538 val |= ((inst[slot] >> instpos) & mask) << opndpos;
00539 }
00540 } while (++pinfo, comp != ISA_PACK_COMP_end);
00541
00542 if (--words == 0) break;
00543
00544 ++slot;
00545 if (slot >= ISA_MAX_SLOTS) {
00546 fprintf(stderr, "TI_ASM_Get_Bundle_Reloc_Value: can't handle cross bundle reloc for %s\n",
00547 TOP_Name(topcode));
00548 assert(FALSE);
00549 }
00550 }
00551
00552 oinfo = ISA_OPERAND_Info(topcode);
00553 vtype = ISA_OPERAND_INFO_Operand(oinfo, opnd);
00554 if (ISA_OPERAND_VALTYP_Is_Signed(vtype)) {
00555 INT size = ISA_OPERAND_VALTYP_Size(vtype);
00556 INT shift = 64 - size;
00557 val = ((INT64)val << shift) >> shift;
00558 }
00559
00560 return val;
00561 }
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571 TOP TI_ASM_Unpack_Inst(
00572 const ISA_PACK_INST *pinst,
00573 ISA_EXEC_UNIT ex_unit,
00574 INT64 *result,
00575 INT64 *opnd,
00576 BOOL xlate_pseudo)
00577 {
00578 INT comp;
00579 INT i;
00580 INT j;
00581 INT words;
00582 const ISA_PACK_INFO *pinfo;
00583 const ISA_PACK_ADJ_INFO *ainfo;
00584 const ISA_OPERAND_INFO *oinfo;
00585 TOP topcode;
00586
00587
00588
00589 topcode = ISA_Decode_Inst(pinst, ex_unit);
00590 if (topcode == TOP_UNDEFINED) return topcode;
00591
00592
00593
00594 bzero(result, sizeof(*result) * ISA_OPERAND_max_results);
00595 bzero(opnd, sizeof(*opnd) * ISA_OPERAND_max_operands);
00596 pinfo = ISA_PACK_Info(topcode);
00597 words = ISA_PACK_Inst_Words(topcode);
00598 for (j = 0; j < words; ++j) {
00599 ISA_PACK_INST inst = pinst[j];
00600 do {
00601 UINT64 mask = ISA_PACK_INFO_Mask(pinfo);
00602 UINT32 opndpos = ISA_PACK_INFO_OpndPos(pinfo);
00603 UINT32 instpos = ISA_PACK_INFO_InstPos(pinfo);
00604 INT64 val = ((inst >> instpos) & mask) << opndpos;
00605
00606 comp = ISA_PACK_INFO_Comp(pinfo);
00607 switch (comp) {
00608 case ISA_PACK_COMP_opnd:
00609 case ISA_PACK_COMP_opnd+1:
00610 case ISA_PACK_COMP_opnd+2:
00611 case ISA_PACK_COMP_opnd+3:
00612 case ISA_PACK_COMP_opnd+4:
00613 case ISA_PACK_COMP_opnd+5:
00614 {
00615 INT n = comp - ISA_PACK_COMP_opnd;
00616 opnd[n] |= val;
00617 }
00618 break;
00619
00620 case ISA_PACK_COMP_result:
00621 case ISA_PACK_COMP_result+1:
00622 {
00623 INT n = comp - ISA_PACK_COMP_result;
00624 result[n] |= val;
00625 }
00626 break;
00627
00628 case ISA_PACK_COMP_end:
00629 break;
00630
00631 default:
00632 assert(0);
00633
00634 }
00635 } while (++pinfo, comp != ISA_PACK_COMP_end);
00636 }
00637
00638
00639
00640
00641 ainfo = ISA_PACK_Adj_Info(topcode);
00642 if (ainfo) ISA_PACK_Adjust_Operands(ainfo, opnd, TRUE);
00643
00644
00645
00646 if (xlate_pseudo) {
00647 topcode = ISA_PSEUDO_Translate(topcode, result, opnd, ISA_PSEUDO_to_pseudo);
00648 }
00649
00650
00651
00652
00653 oinfo = ISA_OPERAND_Info(topcode);
00654 for (i = 0; i < ISA_OPERAND_INFO_Operands(oinfo); ++i) {
00655 const ISA_OPERAND_VALTYP *vtype = ISA_OPERAND_INFO_Operand(oinfo, i);
00656 UINT64 val = opnd[i];
00657
00658 if (ISA_OPERAND_VALTYP_Is_Enum(vtype)) {
00659 ISA_ENUM_CLASS_VALUE e;
00660 ISA_ENUM_CLASS_VALUE ecv = ECV_UNDEFINED;
00661 ISA_ENUM_CLASS ec = ISA_OPERAND_VALTYP_Enum_Class(vtype);
00662
00663 for (e = ISA_EC_First_Value(ec);
00664 e <= ISA_EC_Last_Value(ec);
00665 e = (ISA_ENUM_CLASS_VALUE)(e + 1))
00666 {
00667 if (ISA_ECV_Intval(e) == val) {
00668 ecv = e;
00669 break;
00670 }
00671 }
00672 opnd[i] = ecv;
00673 } else if (ISA_OPERAND_VALTYP_Is_Signed(vtype)) {
00674 INT size = ISA_OPERAND_VALTYP_Size(vtype);
00675 INT shift = 64 - size;
00676 opnd[i] = ((INT64)val << shift) >> shift;
00677 }
00678 }
00679
00680 return topcode;
00681 }