The old place (tccasm.c) didn't have access to the variables anymore and was ifdefed out. Move it to i386-asm.c.
Unified · Split
| @@ -504,6 +504,45 @@ static inline int asm_modrm(int reg, Operand *op) · 503 unmodified lines | |||
| 504 | return 0; | 504 | return 0; |
| 505 | } | 505 | } |
| 506 | 506 | ||
| 507 | static void maybe_print_stats (void) | ||
| 508 | { | ||
| 509 | static int already = 1; | ||
| 510 | if (!already) | ||
| 511 | /* print stats about opcodes */ | ||
| 512 | { | ||
| 513 | const struct ASMInstr *pa; | ||
| 514 | int freq[4]; | ||
| 515 | int op_vals[500]; | ||
| 516 | int nb_op_vals, i, j; | ||
| 517 | |||
| 518 | already = 1; | ||
| 519 | nb_op_vals = 0; | ||
| 520 | memset(freq, 0, sizeof(freq)); | ||
| 521 | for(pa = asm_instrs; pa->sym != 0; pa++) { | ||
| 522 | freq[pa->nb_ops]++; | ||
| 523 | //for(i=0;i<pa->nb_ops;i++) { | ||
| 524 | for(j=0;j<nb_op_vals;j++) { | ||
| 525 | //if (pa->op_type[i] == op_vals[j]) | ||
| 526 | if (pa->instr_type == op_vals[j]) | ||
| 527 | goto found; | ||
| 528 | } | ||
| 529 | //op_vals[nb_op_vals++] = pa->op_type[i]; | ||
| 530 | op_vals[nb_op_vals++] = pa->instr_type; | ||
| 531 | found: ; | ||
| 532 | //} | ||
| 533 | } | ||
| 534 | for(i=0;i<nb_op_vals;i++) { | ||
| 535 | int v = op_vals[i]; | ||
| 536 | //if ((v & (v - 1)) != 0) | ||
| 537 | printf("%3d: %08x\n", i, v); | ||
| 538 | } | ||
| 539 | printf("size=%d nb=%d f0=%d f1=%d f2=%d f3=%d\n", | ||
| 540 | (int)sizeof(asm_instrs), | ||
| 541 | (int)sizeof(asm_instrs) / (int)sizeof(ASMInstr), | ||
| 542 | freq[0], freq[1], freq[2], freq[3]); | ||
| 543 | } | ||
| 544 | } | ||
| 545 | |||
| 507 | ST_FUNC void asm_opcode(TCCState *s1, int opcode) | 546 | ST_FUNC void asm_opcode(TCCState *s1, int opcode) |
| 508 | { | 547 | { |
| 509 | const ASMInstr *pa; | 548 | const ASMInstr *pa; |
| @@ -515,6 +554,7 @@ ST_FUNC void asm_opcode(TCCState *s1, int opcode) · 5 unmodified lines | |||
| 515 | int autosize; | 554 | int autosize; |
| 516 | int p66; | 555 | int p66; |
| 517 | 556 | ||
| 557 | maybe_print_stats(); | ||
| 518 | /* force synthetic ';' after prefix instruction, so we can handle */ | 558 | /* force synthetic ';' after prefix instruction, so we can handle */ |
| 519 | /* one-line things like "rep stosb" instead of only "rep\nstosb" */ | 559 | /* one-line things like "rep stosb" instead of only "rep\nstosb" */ |
| 520 | if (opcode >= TOK_ASM_wait && opcode <= TOK_ASM_repnz) | 560 | if (opcode >= TOK_ASM_wait && opcode <= TOK_ASM_repnz) |
| @@ -757,38 +757,6 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess) · 756 unmodified lines | |||
| 757 | { | 757 | { |
| 758 | int opcode; | 758 | int opcode; |
| 759 | 759 | ||
| 760 | #if 0 | ||
| 761 | /* print stats about opcodes */ | ||
| 762 | { | ||
| 763 | const ASMInstr *pa; | ||
| 764 | int freq[4]; | ||
| 765 | int op_vals[500]; | ||
| 766 | int nb_op_vals, i, j; | ||
| 767 | |||
| 768 | nb_op_vals = 0; | ||
| 769 | memset(freq, 0, sizeof(freq)); | ||
| 770 | for(pa = asm_instrs; pa->sym != 0; pa++) { | ||
| 771 | freq[pa->nb_ops]++; | ||
| 772 | for(i=0;i<pa->nb_ops;i++) { | ||
| 773 | for(j=0;j<nb_op_vals;j++) { | ||
| 774 | if (pa->op_type[i] == op_vals[j]) | ||
| 775 | goto found; | ||
| 776 | } | ||
| 777 | op_vals[nb_op_vals++] = pa->op_type[i]; | ||
| 778 | found: ; | ||
| 779 | } | ||
| 780 | } | ||
| 781 | for(i=0;i<nb_op_vals;i++) { | ||
| 782 | int v = op_vals[i]; | ||
| 783 | if ((v & (v - 1)) != 0) | ||
| 784 | printf("%3d: %08x\n", i, v); | ||
| 785 | } | ||
| 786 | printf("size=%d nb=%d f0=%d f1=%d f2=%d f3=%d\n", | ||
| 787 | sizeof(asm_instrs), sizeof(asm_instrs) / sizeof(ASMInstr), | ||
| 788 | freq[0], freq[1], freq[2], freq[3]); | ||
| 789 | } | ||
| 790 | #endif | ||
| 791 | |||
| 792 | /* XXX: undefine C labels */ | 760 | /* XXX: undefine C labels */ |
| 793 | 761 | ||
| 794 | ch = file->buf_ptr[0]; | 762 | ch = file->buf_ptr[0]; |