2
This program is free software; you can redistribute it and/or modify
3
it under the terms of the GNU General Public License as published by
4
the Free Software Foundation; either version 2, or (at your option)
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License along
13
with this program; if not, write to the Free Software Foundation, Inc.,
14
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
17
* author teawater <c7code-uc@yahoo.com.cn> <teawater@gmail.com>
19
//koodailar add for mingw 2005.12.18 ----------------------------------------
21
#include "arch/arm/common/armdefs.h"
25
// end ----------------------------------------------------------------------
26
//teawater 2005-09-12 for gcc-3.3.x compiling, comment below line
27
//#include "arm2x86_self.h"
29
extern mem_bank_t *bank_ptr (ARMword addr);
31
/*ywc 2005-04-22, in armmem.c*/
32
extern mem_bank_t *insn_bank_ptr (ARMword addr);
34
extern ARMul_State *state;
36
//teawater add for new tb manage function 2005.07.10----------------------------
37
//static uint32_t tb_tbt_size = 0;
38
//static uint32_t tb_tbp_size = (1024 * 1024 * 32);
39
#define TB_TBT_SIZE skyeye_config.tb_tbt_size
40
#define TB_TBP_SIZE skyeye_config.tb_tbp_size
42
static tb_t *tbt_table = NULL;
43
static int tbt_table_size = 0;
45
static uint8_t *tbp_begin = NULL;
46
static uint8_t *tbp_now = NULL;
47
static uint32_t tbp_now_size = 0;
48
static int tbp_dynamic = 0;
49
static LIST_HEAD (tbp_dynamic_list);
50
//AJ2D--------------------------------------------------------------------------
52
#define MAP_ANONYMOUS MAP_ANON
56
translate_word (ARMul_State * state, ARMword insn, uint8_t * tbp)
58
int toplen = 0, len = 0;
59
//teawater add for xscale(arm v5) 2005.09.26------------------------------------
60
ARMword cond, val, op1, shift, rm, rs, rn, rd, sh, y, x;
61
//AJ2D--------------------------------------------------------------------------
68
//teawater change for debug function 2005.07.09---------------------------------
70
if (insn == 0xe7ffdefe) {
71
GEN_OP (tbp, len, op_begin);
72
gen_op_movl_trap_im_use_T2 (state, &tbp, &len,
74
GEN_OP (tbp, len, op_return);
77
//AJ2D--------------------------------------------------------------------------
79
//teawater add for xscale(arm v5) 2005.09.01------------------------------------
80
if ((insn & 0xfff000f0) == 0xe1200070) {
82
//GEN_OP(tbp, len, op_begin);
83
gen_op_movl_trap_im_use_T2 (state, &tbp, &len,
85
GEN_OP (tbp, len, op_return);
88
//AJ2D--------------------------------------------------------------------------
90
//return if debug || irq || fiq || condition
91
cond = (insn >> 28) & 0xff;
92
if (cond == AL || cond == NV) {
93
GEN_OP (tbp, len, op_begin);
96
// goto translate_word_out;
99
gen_op_movl_Tx_im (state, &tbp, &len, 0, cond);
100
GEN_OP (tbp, len, op_begin_test_T0);
104
if (((insn & 0x0e000000) == 0 && (insn & 0x00000090) != 0x90)
105
|| ((insn & 0x0e000000) == (1 << 25))) {
106
ARMword set_cc, logic_cc, shiftop;
109
goto translate_word_out;
111
op1 = (insn >> 21) & 0xf;
112
set_cc = (insn >> 20) & 1;
114
//teawater add for xscale(arm v5) 2005.09.01------------------------------------
115
if (!set_cc & (op1 >= 0x8 && op1 <= 0xb)) {
117
sh = ((insn >> 4) & 0xf);
119
rm = (insn >> 0) & 0xf;
120
rd = (insn >> 12) & 0xf;
121
rn = (insn >> 16) & 0xf;
125
gen_op_movl_Tx_reg (state,
129
gen_op_movl_Tx_reg (state,
138
gen_op_movl_Tx_reg (state,
142
gen_op_movl_Tx_reg (state,
151
gen_op_movl_Tx_reg (state,
155
gen_op_movl_Tx_reg (state,
161
gen_op_movl_Tx_reg (state,
170
gen_op_movl_Tx_reg (state,
174
gen_op_movl_Tx_reg (state,
182
gen_op_movl_Tx_reg (state,
190
gen_op_movl_reg_Tx (state, &tbp, &len,
192
GEN_OP (tbp, len, op_set_q);
193
goto translate_word_end;
195
else if ((sh & 0x9) == 0x8) {
196
rm = (insn >> 0) & 0xf;
197
rs = (insn >> 8) & 0xf;
198
rn = (insn >> 12) & 0xf; //rdlo
199
rd = (insn >> 16) & 0xf; //rdhi
200
y = (insn >> 6) & 0x1;
201
x = (insn >> 5) & 0x1;
202
gen_op_movl_Tx_reg (state, &tbp, &len,
204
gen_op_movl_Tx_reg (state, &tbp, &len,
218
op_signextend_halfword_T0);
222
GEN_OP (tbp, len, op_hi_T1);
226
GEN_OP (tbp, len, op_lo_T1);
229
op_signextend_halfword_T1);
235
gen_op_movl_Tx_reg (state,
241
gen_op_movl_reg_Tx (state,
245
GEN_OP (tbp, len, op_set_q);
258
//gen_op_movl_Tx_reg(state, &tbp, &len, 2, rn);
259
//GEN_OP(tbp, len, op_smlawy_T2_T1_T0);
278
gen_op_movl_Tx_reg (state, &tbp, &len, 1, rn); //rdlo
279
gen_op_movl_Tx_reg (state, &tbp, &len, 2, rd); //rdhi
281
op_smlalxy_T2_T1_T0);
282
gen_op_movl_reg_Tx (state,
286
gen_op_movl_reg_Tx (state,
295
gen_op_movl_reg_Tx (state,
301
goto translate_word_end;
303
else if (sh == 0x1 && op1 == 0xb) {
306
gen_op_movl_Tx_reg (state, &tbp, &len,
308
GEN_OP (tbp, len, op_clzl_T0_T1);
309
rd = (insn >> 12) & 0xf;
310
gen_op_movl_reg_Tx (state, &tbp, &len,
312
goto translate_word_end;
316
if (op1 == 0x8 || op1 == 0xa) {
318
gen_op_mrs (state, &tbp, &len, insn);
319
goto translate_word_end;
322
//AJ2D--------------------------------------------------------------------------
324
logic_cc = table_logic_cc[op1] & set_cc;
326
if (insn & (1 << 25)) {
327
//immediate operand arm_arm A 5.1.3
329
shift = (uint8_t) ((insn >> 8) & 0xf) * 2;
332
val = (val >> shift) | (val << (32 - shift));
334
gen_op_movl_Tx_im (state, &tbp, &len, 1, val);
336
if (logic_cc && shift) {
337
//val = ((insn & 0xff) >> (shift - 1)) & 1;
338
//op=set val[31] to C
340
GEN_OP (tbp, len, op_logic_1_sc);
343
GEN_OP (tbp, len, op_logic_0_sc);
350
//op=set rm(0-15) to t1
351
gen_op_movl_Tx_reg (state, &tbp, &len, 1, rm);
353
//teawater add check thumb 2005.07.21-------------------------------------------
354
if (op1 == 0x9 && !set_cc
355
&& ((insn >> 8) & 0xf) == 0xf) {
357
uint32_t tmp = (insn >> 4) & 0xf;
361
GEN_OP (tbp, len, op_bx_T1);
363
else if (tmp == 0x2) {
365
GEN_OP (tbp, len, op_blx_T1);
367
if (tmp == 0x1 || tmp == 0x2) {
369
goto translate_word_end;
372
//AJ2D--------------------------------------------------------------------------
374
shiftop = (insn >> 5) & 3;
375
if (!(insn & (1 << 4))) {
377
shift = (uint8_t) (insn >> 7) & 0x1f;
379
//op=shift, & set CF if logic_cc
381
gen_op_shift_T1_im_sc (state,
387
gen_op_shift_T1_im (state, &tbp, &len,
391
GEN_OP (tbp, len, op_movl_T2_T1);
393
op_shift_T1_0[shiftop]);
398
GEN_OP (tbp, len, op_set_cf);
404
rs = (insn >> 8) & 0xf;
405
//op=set rs(0-15) to t0
406
gen_op_movl_Tx_reg (state, &tbp, &len, 0, rs);
407
//op=shift, & set CF if logic_cc
410
gen_op_shift_T1_T0_sc (state, &tbp,
415
gen_op_shift_T1_T0 (state, &tbp, &len,
421
if ((op1 == 0x9 || op1 == 0xb) && !set_cc) {
423
gen_op_msr (state, &tbp, &len, insn);
424
goto translate_word_end;
427
//data processing instruction
428
if (op1 != 0x0f && op1 != 0x0d) { //!mov && !mvn
429
rn = (insn >> 16) & 0xf;
430
//op=set rn(0-15) to t0
431
gen_op_movl_Tx_reg (state, &tbp, &len, 0, rn);
433
rd = (insn >> 12) & 0xf;
434
arm2x86_get_dp_op[op1] (state, &tbp, &len, set_cc, rd);
435
arm2x86_get_dp_op_setcpsr[op1] (state, &tbp, &len, set_cc,
440
op1 = (insn >> 24) & 0xf;
441
sh = (insn >> 5) & 3;
444
//teawater add for xscale(arm v5) 2005.09.15------------------------------------
449
if (((insn >> 12) & 0xf) == 0xf) {
453
goto translate_word_out;
455
//teawater add check thumb 2005.07.21-------------------------------------------
459
gen_op_movl_trap_im_use_T2 (state,
463
GEN_OP (tbp, len, op_return);
466
//AJ2D--------------------------------------------------------------------------
471
&& ((insn >> 8) & 0xf) == 0) {
473
goto translate_word_out;
480
&& (!(insn & (1 << 20)))
481
&& ((insn >> 8) & 0xf) == 0) {
482
//mia miaph miabb miabt miatb miatt
483
goto translate_word_out;
487
goto translate_word_out;
491
//AJ2D--------------------------------------------------------------------------
493
goto translate_word_out;
497
if (sh != 0 && (op1 == 0 || op1 == 1)) {
498
//ldrh strh ldrsh ldrsb
499
gen_op_ldrhstrh (state, &tbp, &len, insn, sh);
502
arm2x86_get_other_op[op1] (state, insn, &tbp, &len);
508
GEN_OP (tbp, len, op_return);
510
if (toplen && begin) {
511
//set jmp length of condition code
512
//begin[toplen-1] = (uint8_t)(len - toplen);
513
int *p_tmp = (int *) (begin + (toplen - sizeof (int)));
514
*p_tmp = len - toplen;
519
if (!state->trap || toplen) {
520
GEN_OP (tbp, len, op_addpc);
523
//TEA_OUT(GEN_OP(tbp, len, op_return));
526
if (len > TB_INSN_LEN_MAX) {
528
"SKYEYE: TB_INSN_LEN_MAX: insn %x len %d > TB_INSN_LEN_MAX %d.\n",
529
insn, len, TB_INSN_LEN_MAX);
534
static int insn_max = 0;
535
if (len > insn_max) {
537
fprintf(stderr, "\nSKYEYE: insn_max = %d.\n", insn_max);
545
//teawater add tb_insn_addr 2005.10.08------------------------------------------
548
tb_translate(ARMul_State * state, ARMword *addr, ARMword *tb_begin_addr, uint8_t *tbp, ARMword *tran_addr, uint8_t **tbp_now)
551
tb_translate(ARMul_State * state, ARMword *addr, ARMword *tb_begin_addr, tb_t *tbt)
555
// ARMword *tb_end_addr = tb_begin_addr + (TB_LEN - (*tran_addr - TB_ALIGN(*tran_addr))) / sizeof(ARMword);
556
ARMword *tb_end_addr = tb_begin_addr + (TB_LEN - (tbt->tran_addr - TB_ALIGN(tbt->tran_addr))) / sizeof(ARMword);
557
//teawater change for local tb branch directly jump 2005.10.10------------------
559
struct list_head *list,*n;
560
//AJ2D--------------------------------------------------------------------------
562
//teawater change for local tb branch directly jump 2005.10.10------------------
563
INIT_LIST_HEAD(&tb_branch_save_list);
566
//AJ2D--------------------------------------------------------------------------
567
for( ; tb_begin_addr < tb_end_addr; tb_begin_addr++) {
569
if (addr == tb_begin_addr) {
573
tbt->insn_addr[(tbt->tran_addr - tbt->addr) / sizeof(uint8_t *)] = tbt->tbp_now;
576
len = translate_word(state, *tb_begin_addr, tbt->tbp_now);
578
//teawater change for if trap translate stop 2005.07.23-------------------------
581
if (state->trap && ret && (tbt->tran_addr > tbt->ret_addr)) {
584
//AJ2D--------------------------------------------------------------------------
586
//teawater change for if trap translate stop 2005.07.23-------------------------
589
GEN_OP(tbt->tbp_now, len, op_return);
591
//AJ2D--------------------------------------------------------------------------
592
//teawater change for local tb branch directly jump 2005.10.10------------------
593
list_for_each_safe(list, n, &tb_branch_save_list) {
594
e = list_entry(list, tb_branch_save_t, list);
595
//memcpy((e->tbp - sizeof(ARMword)), &((uint32_t)tbt->insn_addr[(e->dst_addr - tbt->addr) / sizeof(uint8_t *)] - (uint32_t)e->tbp), sizeof(ARMword));
596
*((uint32_t *)(e->tbp - sizeof(ARMword))) = (uint32_t)tbt->insn_addr[(e->dst_addr - tbt->addr) / sizeof(uint8_t *)] - (uint32_t)e->tbp;
598
//AJ2D--------------------------------------------------------------------------
602
//AJ2D--------------------------------------------------------------------------
604
//teawater remove tb_translate_find 2005.10.21----------------------------------
606
tb_translate_find (ARMul_State * state, ARMword * addr,
607
ARMword * tb_begin_addr, uint8_t * tbp)
611
ARMword *tb_end_addr = tb_begin_addr + TB_LEN / sizeof (ARMword);
613
for (; tb_begin_addr < tb_end_addr; tb_begin_addr++) {
614
if (addr == tb_begin_addr) {
618
len = translate_word (state, *tb_begin_addr, NULL);
624
//AJ2D--------------------------------------------------------------------------
626
//teawater add tb_insn_addr 2005.10.06------------------------------------------
629
tb_insert_cache (tb_t * tbt, ARMword addr, uint8_t * ret)
631
tb_cache_t *e = malloc (sizeof (tb_cache_t));
634
uint32_t cache_num = addr & (TB_TBT_CACHE_MAX - 1);
636
if (!tbt->cache[cache_num].next)
637
INIT_LIST_HEAD (&tbt->cache[cache_num]);
640
list_add_tail (&e->list, &tbt->cache[cache_num]);
645
"SKYEYE: tb_find: Error allocating mem for cache.\n"));
649
static inline uint8_t *
650
tb_find_cache (tb_t * tbt, ARMword addr)
653
struct list_head *list, *n;
654
uint32_t cache_num = addr & (TB_TBT_CACHE_MAX - 1);
656
if (tbt->cache[cache_num].next) {
657
list_for_each_safe (list, n, &tbt->cache[cache_num]) {
658
e = list_entry (list, tb_cache_t, list);
659
if (e->addr == addr) {
669
tb_clear_cache (tb_t * tbt)
672
struct list_head *list, *n;
675
for (cache_num = 0; cache_num < TB_TBT_CACHE_MAX; cache_num++) {
676
if (tbt->cache[cache_num].next) {
677
list_for_each_safe (list, n, &tbt->cache[cache_num]) {
678
e = list_entry (list, tb_cache_t, list);
679
list_del_init (&e->list);
686
//AJ2D--------------------------------------------------------------------------
689
tb_get_tbp (tb_t * tbt)
692
struct list_head *list;
696
tbp_now += TB_TBP_MAX;
697
tbp_now_size -= TB_TBP_MAX;
700
//get the oldest tbt from tbp_dynamic_list's head
701
if (list_empty (&tbp_dynamic_list)) {
702
fprintf (stderr, "SKYEYE: mem_reset: some bug.\n");
705
e = list_entry (tbp_dynamic_list.next, tb_t, list);
708
//teawater add tb_insn_addr 2005.10.06------------------------------------------
714
//AJ2D--------------------------------------------------------------------------
715
list_del_init (&e->list);
719
static inline mem_bank_t *
720
tb_get_mbp (ARMword addr, int *bank_num)
724
ret = insn_bank_ptr (addr);
726
*bank_num = ret - state->mem_bank->mem_banks;
733
tb_find (ARMul_State * state, ARMword ADDR)
736
ARMword addr, align_addr;
737
ARMword *real_begin_addr, *real_addr;
738
static ARMword save_align_addr = 0x1;
741
static mem_bank_t *mbp;
742
static int bank_num = -1;
744
//get addr & align_addr
745
if (mmu_v2p_dbct (state, ADDR, &addr)) {
748
align_addr = TB_ALIGN (addr);
749
if (align_addr == save_align_addr) {
755
save_align_addr = 0x1;
758
if (tbt_table_size) {
761
[align_addr & (uint32_t) (tbt_table_size - 1)]);
762
if (tbt->addr != align_addr) {
764
//teawater add tb_insn_addr 2005.10.06------------------------------------------
765
//tb_clear_cache(tbt);
766
//AJ2D--------------------------------------------------------------------------
769
tbt->addr = align_addr;
778
list_del_init (&tbt->list);
784
mbp = tb_get_mbp (align_addr, &bank_num);
788
if (!state->mem.tbt[bank_num]) {
790
//koodailar add it for mignw 2005.12.18-----------------------------------------
792
state->mem.tbp[bank_num] =
793
malloc (state->mem.rom_size[bank_num] /
796
state->mem.rom_size[bank_num] /
797
TB_LEN * op_return.len);
798
if (state->mem.tbp[bank_num] == NULL) {
800
"SKYEYE: mem_reset: Error allocating mem for bank number %d.\n",
805
state->mem.tbp[bank_num] =
807
state->mem.rom_size[bank_num] /
810
state->mem.rom_size[bank_num] /
811
TB_LEN * op_return.len,
812
PROT_READ | PROT_WRITE |
814
MAP_PRIVATE | MAP_ANONYMOUS, -1,
816
if (state->mem.tbp[bank_num] == MAP_FAILED) {
818
"SKYEYE: mem_reset: Error allocating mem for bank number %d.\n",
823
//end koodailar ----------------------------------------------------------------
825
state->mem.tbt[bank_num] =
826
malloc (state->mem.rom_size[bank_num] /
827
TB_LEN * sizeof (tb_t));
828
if (!state->mem.tbt[bank_num]) {
830
"SKYEYE: mem_reset: Error allocating mem for bank number %d.\n",
834
memset (state->mem.tbt[bank_num], 0,
835
state->mem.rom_size[bank_num] / TB_LEN *
839
tbt[bank_num][(align_addr - mbp->addr) / TB_LEN]);
840
//teawater add tb_insn_addr 2005.10.08------------------------------------------
841
tbt->addr = align_addr;
842
//AJ2D--------------------------------------------------------------------------
853
tbp[bank_num][(align_addr -
858
mbp->addr) / TB_LEN *
864
list_del_init (&tbt->list);
872
//set tb_now to check the current running block is written.
873
state->tb_now = (void *) tbt;
875
//set save_align_addr
876
save_align_addr = align_addr;
878
//add tbt to tbp_dynamic_list's tail to be the newest one
880
list_add_tail (&tbt->list, &tbp_dynamic_list);
886
//tbt has been translated
887
//teawater add last use addr 2005.10.10-----------------------------------------
888
if (tbt->last_addr == addr) {
889
return(tbt->last_tbp);
893
/*if (addr == align_addr) {
897
//AJ2D--------------------------------------------------------------------------
899
if (addr >= tbt->tran_addr) {
900
//block need continue translate
901
if (bank_num == -1) {
902
mbp = tb_get_mbp (align_addr, &bank_num);
909
rom[bank_num][(align_addr -
913
align_addr) / sizeof (ARMword);
915
real_begin_addr + (addr -
918
//teawater add tb_insn_addr 2005.10.08------------------------------------------
919
//ret = tb_translate(state, real_addr, real_begin_addr, tbt->tbp_now, &tbt->tran_addr, &tbt->tbp_now);
920
ret = tb_translate(state, real_addr, real_begin_addr, tbt);
921
//AJ2D--------------------------------------------------------------------------
924
//teawater add tb_insn_addr 2005.10.08------------------------------------------
926
ret = tb_find_cache(tbt, addr);
931
if (bank_num == -1) {
932
mbp = tb_get_mbp(align_addr, &bank_num);
937
real_begin_addr = &(state->mem.rom[bank_num][(align_addr - mbp->addr) / sizeof(ARMword)]);
938
real_addr = real_begin_addr + (addr - align_addr) / sizeof(ARMword);
939
ret = tb_translate_find(state, real_addr, real_begin_addr, tbp);*/
942
ret = tbt->insn_addr[(addr - align_addr) / sizeof(uint8_t *)];
943
//AJ2D--------------------------------------------------------------------------
947
//tbt has not been translated
948
if (bank_num == -1) {
949
mbp = tb_get_mbp (align_addr, &bank_num);
956
rom[bank_num][(align_addr -
957
mbp->addr) / sizeof (ARMword)]);
959
real_begin_addr + (addr -
960
align_addr) / sizeof (ARMword);
961
tbt->tran_addr = align_addr;
962
//teawater add tb_insn_addr 2005.10.08------------------------------------------
963
//ret = tb_translate(state, real_addr, real_begin_addr, tbp, &tbt->tran_addr, &tbt->tbp_now);
965
ret = tb_translate(state, real_addr, real_begin_addr, tbt);
970
//AJ2D--------------------------------------------------------------------------
973
//teawater add tb_insn_addr 2005.10.08------------------------------------------
975
tb_insert_cache(tbt, addr, ret);
977
//AJ2D--------------------------------------------------------------------------
979
//teawater add last use addr 2005.10.10-----------------------------------------
981
tbt->last_addr = addr;
984
//AJ2D--------------------------------------------------------------------------
989
tb_setdirty (ARMul_State * state, ARMword addr, mem_bank_t * mbp)
991
ARMword align_addr = TB_ALIGN (addr);
992
static ARMword save_align_addr = 0x1;
993
static tb_t *tbt = NULL;
995
if (save_align_addr == align_addr) {
999
save_align_addr = 0x1;
1001
if (tbt_table_size) {
1003
[align_addr & (uint32_t) (tbt_table_size - 1)]);
1004
if (tbt->addr != align_addr) {
1012
mbp = tb_get_mbp (align_addr, &bank_num);
1018
bank_num = mbp - state->mem_bank->mem_banks;
1020
if (!state->mem.tbt[bank_num]) {
1024
tbt[bank_num][(align_addr - mbp->addr) / TB_LEN]);
1026
save_align_addr = align_addr;
1030
//teawater add tb_insn_addr 2005.10.09------------------------------------------
1031
//tb_clear_cache(tbt);
1032
//AJ2D--------------------------------------------------------------------------
1034
switch (state->cpu->cpu_val & state->cpu->cpu_mask) {
1037
mmu_wb_drain_all (state, (&state->mmu.u.sa_mmu.wb_t));
1040
mmu_wb_drain_all (state,
1041
(&state->mmu.u.arm920t_mmu.wb_t));
1049
int tb_insn_len_max = 0;
1052
tb_insn_len_max_init (ARMul_State * state)
1054
int dp_len = 0, other_len = 0;
1056
//return if debug || irq || fiq || condition
1058
op_movl_Tx_im[0].len + sizeof (ARMword) + op_begin_test_T0.len) {
1059
tb_insn_len_max += op_begin.len;
1063
op_movl_Tx_im[0].len + sizeof (ARMword) +
1064
op_begin_test_T0.len;
1068
tb_insn_len_max += op_return.len;
1069
tb_insn_len_max += op_addpc.len;
1070
//TEA_OUT(tb_insn_len_max += op_return.len);
1074
int dp_head_len = 0;
1076
int op_setcpsr_nzc_len = 0, op_setcpsr_nzc_setr15_len =
1077
0, op_setcpsr_nzc_notsetr15_len =
1078
0, op_setcpsr_nzc_setreg_len = 0;
1079
int op_setcpsr_nzcv_len = 0, op_setcpsr_nzcv_setr15_len =
1080
0, op_setcpsr_nzcv_notsetr15_len =
1081
0, op_setcpsr_nzcv_setreg_len = 0;
1086
int dp_head_imm_len = 0, dp_head_reg_len = 0;
1089
dp_head_imm_len += op_movl_Tx_im[1].len;
1090
dp_head_imm_len += sizeof (ARMword);
1091
if (op_logic_1_sc.len > op_logic_0_sc.len) {
1092
dp_head_imm_len += op_logic_1_sc.len;
1095
dp_head_imm_len += op_logic_0_sc.len;
1100
int dp_head_reg_imm_len =
1101
0, dp_head_reg_reg_len = 0;
1104
op_movl_Tx_reg_array_maxlen[1];
1106
//dp_head_reg_imm_len
1108
dp_head_reg_imm_len +=
1109
op_shift_T1_im_sc_maxlen;
1110
dp_head_reg_imm_len += op_set_cf.len;
1111
dp_head_reg_imm_len += op_shift_T1_im_maxlen;
1112
dp_head_reg_imm_len += sizeof (uint8_t);
1114
dp_tmp1 = op_movl_T2_T1.len;
1115
dp_tmp1 += op_shift_T1_0_maxlen;
1116
dp_tmp1 += op_shift_T2_0_sc_maxlen;
1117
dp_tmp1 += op_set_cf.len;
1119
if (dp_tmp1 > dp_head_reg_imm_len)
1120
dp_head_reg_imm_len = dp_tmp1;
1122
//dp_head_reg_reg_len
1123
if (op_shift_T1_T0_sc_maxlen + op_set_cf.len >
1124
op_shift_T1_T0_maxlen) {
1125
dp_head_reg_reg_len +=
1126
op_shift_T1_T0_sc_maxlen +
1130
dp_head_reg_reg_len +=
1131
op_shift_T1_T0_maxlen;
1133
dp_head_reg_reg_len +=
1134
op_movl_Tx_reg_array_maxlen[0];
1136
if (dp_head_reg_imm_len > dp_head_reg_reg_len) {
1138
dp_head_reg_imm_len;
1142
dp_head_reg_reg_len;
1146
if (dp_head_imm_len > dp_head_reg_len) {
1147
dp_head_len = dp_head_imm_len;
1150
dp_head_len = dp_head_reg_len;
1154
//op_setcpsr_nzc_len
1155
op_setcpsr_nzc_len += op_logic_T0_sn.len;
1156
//op_setcpsr_nzc_len += op_set_nf.len;
1157
op_setcpsr_nzc_len += op_logic_T0_sz.len;
1158
//op_setcpsr_nzc_len += op_set_zf.len;
1159
//op_setcpsr_nzc_len += op_set_cf.len;
1160
op_setcpsr_nzc_len += op_set_nzcf.len;
1162
//op_setcpsr_nzcv_len
1163
op_setcpsr_nzcv_len += op_logic_T0_sn.len;
1164
//op_setcpsr_nzcv_len += op_set_nf.len;
1165
op_setcpsr_nzcv_len += op_logic_T0_sz.len;
1166
//op_setcpsr_nzcv_len += op_set_zf.len;
1167
//op_setcpsr_nzcv_len += op_set_cf.len;
1168
//op_setcpsr_nzcv_len += op_set_vf.len;
1169
op_setcpsr_nzcv_len += op_set_nzcvf.len;
1171
//op_setcpsr_nzc_setreg
1172
op_setcpsr_nzc_notsetr15_len += op_setcpsr_nzc_len;
1173
op_setcpsr_nzc_notsetr15_len +=
1174
op_movl_reg_Tx_array_maxlen[0];
1175
op_setcpsr_nzc_setr15_len += op_movl_reg_Tx_array_maxlen[0];
1176
op_setcpsr_nzc_setr15_len +=
1177
op_movl_Tx_im[2].len + sizeof (ARMword) +
1178
op_movl_trap_T2.len;
1179
if (op_setcpsr_nzc_notsetr15_len > op_setcpsr_nzc_setr15_len) {
1180
op_setcpsr_nzc_setreg_len +=
1181
op_setcpsr_nzc_notsetr15_len;
1184
op_setcpsr_nzc_setreg_len +=
1185
op_setcpsr_nzc_setr15_len;
1188
//op_setcpsr_nzcv_setreg
1189
op_setcpsr_nzcv_notsetr15_len += op_setcpsr_nzcv_len;
1190
op_setcpsr_nzcv_notsetr15_len +=
1191
op_movl_reg_Tx_array_maxlen[0];
1192
op_setcpsr_nzcv_setr15_len += op_movl_reg_Tx_array_maxlen[0];
1193
op_setcpsr_nzcv_setr15_len +=
1194
op_movl_Tx_im[2].len + sizeof (ARMword) +
1195
op_movl_trap_T2.len;
1196
if (op_setcpsr_nzcv_notsetr15_len >
1197
op_setcpsr_nzcv_setr15_len) {
1198
op_setcpsr_nzcv_setreg_len +=
1199
op_setcpsr_nzcv_notsetr15_len;
1202
op_setcpsr_nzcv_setreg_len +=
1203
op_setcpsr_nzcv_setr15_len;
1207
if (op_mrs_T0_spsr.len > op_mrs_T0_cpsr.len) {
1208
dp_len += op_mrs_T0_spsr.len;
1211
dp_len += op_mrs_T0_cpsr.len;
1213
dp_len += op_movl_reg_Tx_array_maxlen[0];
1215
("mrs insn's max len is %d\n",
1216
dp_len + tb_insn_len_max));
1218
//teawater add for xscale(arm v5) 2005.09.14------------------------------------]
1221
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1222
dp_tmp1 += op_clzl_T0_T1.len;
1223
dp_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1224
if (dp_tmp1 > dp_len) {
1228
("clz insn's max len is %d\n",
1229
dp_tmp1 + tb_insn_len_max));
1230
//AJ2D--------------------------------------------------------------------------
1232
//teawater add for xscale(arm v5) 2005.09.26------------------------------------
1235
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1236
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1237
dp_tmp1 += op_qaddl_T0_T1_sq.len;
1238
dp_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1239
dp_tmp1 += op_set_q.len;
1240
if (dp_tmp1 > dp_len) {
1244
("qadd insn's max len is %d\n",
1245
dp_tmp1 + tb_insn_len_max));
1249
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1250
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1251
dp_tmp1 += op_qsubl_T0_T1_sq.len;
1252
dp_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1253
dp_tmp1 += op_set_q.len;
1254
if (dp_tmp1 > dp_len) {
1258
("qsub insn's max len is %d\n",
1259
dp_tmp1 + tb_insn_len_max));
1263
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1264
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1265
dp_tmp1 += op_qaddl_T0_T1_sq.len;
1266
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1267
dp_tmp1 += op_qaddl_T0_T1_sq.len;
1268
dp_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1269
dp_tmp1 += op_set_q.len;
1270
if (dp_tmp1 > dp_len) {
1274
("qdadd insn's max len is %d\n",
1275
dp_tmp1 + tb_insn_len_max));
1279
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1280
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1281
dp_tmp1 += op_qaddl_T0_T1_sq.len;
1282
dp_tmp1 += op_movl_T1_T0.len;
1283
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1284
dp_tmp1 += op_qsubl_T0_T1_sq.len;
1285
dp_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1286
dp_tmp1 += op_set_q.len;
1287
if (dp_tmp1 > dp_len) {
1291
("qdsub insn's max len is %d\n",
1292
dp_tmp1 + tb_insn_len_max));
1296
sm_head += op_movl_Tx_reg_array_maxlen[0];
1297
sm_head += op_movl_Tx_reg_array_maxlen[1];
1298
if (op_hi_T0.len > op_lo_T0.len) {
1299
sm_head += op_hi_T0.len;
1302
sm_head += op_lo_T0.len;
1304
sm_head += op_signextend_halfword_T0.len;
1305
if (op_hi_T1.len > op_lo_T1.len) {
1306
sm_head += op_hi_T1.len;
1309
sm_head += op_lo_T1.len;
1311
sm_head += op_signextend_halfword_T1.len;
1315
dp_tmp1 += op_mul_T0_T1.len;
1316
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1317
dp_tmp1 += op_addl_T0_T1_sq.len;
1318
dp_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1319
dp_tmp1 += op_set_q.len;
1320
if (dp_tmp1 > dp_len) {
1324
("smlaxy insn's max len is %d\n",
1325
dp_tmp1 + tb_insn_len_max));
1329
dp_tmp1 += op_smulwy_T0_T1.len;
1330
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1331
if (dp_tmp1 > dp_len) {
1335
("smulwy insn's max len is %d\n",
1336
dp_tmp1 + tb_insn_len_max));
1340
dp_tmp1 += op_smulwy_T0_T1.len;
1341
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1342
dp_tmp1 += op_addl_T0_T1_sq.len;
1343
dp_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1344
dp_tmp1 += op_set_q.len;
1345
if (dp_tmp1 > dp_len) {
1349
("smlawy insn's max len is %d\n",
1350
dp_tmp1 + tb_insn_len_max));
1354
dp_tmp1 += op_mul_T0_T1.len;
1355
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1356
dp_tmp1 += op_movl_Tx_reg_array_maxlen[2];
1357
dp_tmp1 += op_smlalxy_T2_T1_T0.len;
1358
dp_tmp1 += op_movl_reg_Tx_array_maxlen[1];
1359
dp_tmp1 += op_movl_reg_Tx_array_maxlen[2];
1360
if (dp_tmp1 > dp_len) {
1364
("smlalxy insn's max len is %d\n",
1365
dp_tmp1 + tb_insn_len_max));
1369
dp_tmp1 += op_mul_T0_T1.len;
1370
dp_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1371
if (dp_tmp1 > dp_len) {
1375
("smulxy insn's max len is %d\n",
1376
dp_tmp1 + tb_insn_len_max));
1377
//AJ2D--------------------------------------------------------------------------
1379
//teawater add check thumb 2005.07.21-------------------------------------------
1381
dp_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1382
if (op_bx_T1.len > op_blx_T1.len) {
1383
dp_tmp1 += op_bx_T1.len;
1386
dp_tmp1 += op_blx_T1.len;
1388
if (dp_tmp1 > dp_len) {
1392
("bx or blx(2) insn's max len is %d\n",
1393
dp_tmp1 + tb_insn_len_max));
1394
//AJ2D--------------------------------------------------------------------------
1398
dp_tmp1 += dp_head_len;
1399
dp_tmp1 += op_movl_Tx_im[0].len + sizeof (ARMword);
1400
if (op_msr_spsr_T0_T1.len > op_msr_cpsr_T0_T1.len) {
1401
dp_tmp1 += op_msr_spsr_T0_T1.len;
1404
dp_tmp1 += op_msr_spsr_T0_T1.len;
1406
if (dp_tmp1 > dp_len) {
1410
("msr insn's max len is %d\n",
1411
dp_tmp1 + tb_insn_len_max));
1415
dp_tmp1 += dp_head_len;
1416
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1417
dp_tmp1 += op_andl_T0_T1.len;
1418
dp_tmp1 += op_setcpsr_nzc_setreg_len;
1419
if (dp_tmp1 > dp_len) {
1423
("and insn's max len is %d\n",
1424
dp_tmp1 + tb_insn_len_max));
1428
dp_tmp1 += dp_head_len;
1429
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1430
dp_tmp1 += op_eorl_T0_T1.len;
1431
dp_tmp1 += op_setcpsr_nzc_setreg_len;
1432
if (dp_tmp1 > dp_len) {
1436
("eor insn's max len is %d\n",
1437
dp_tmp1 + tb_insn_len_max));
1441
dp_tmp1 += dp_head_len;
1442
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1443
if (op_subl_T0_T1_scv.len + op_setcpsr_nzcv_notsetr15_len >
1444
op_subl_T0_T1.len + op_setcpsr_nzcv_setr15_len) {
1446
op_subl_T0_T1_scv.len +
1447
op_setcpsr_nzcv_notsetr15_len;
1452
op_setcpsr_nzcv_setr15_len;
1454
if (dp_tmp1 > dp_len) {
1458
("sub insn's max len is %d\n",
1459
dp_tmp1 + tb_insn_len_max));
1463
dp_tmp1 += dp_head_len;
1464
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1465
if (op_rsbl_T0_T1_scv.len + op_setcpsr_nzcv_notsetr15_len >
1466
op_rsbl_T0_T1.len + op_setcpsr_nzcv_setr15_len) {
1468
op_rsbl_T0_T1_scv.len +
1469
op_setcpsr_nzcv_notsetr15_len;
1474
op_setcpsr_nzcv_setr15_len;
1476
if (dp_tmp1 > dp_len) {
1480
("rsb insn's max len is %d\n",
1481
dp_tmp1 + tb_insn_len_max));
1485
dp_tmp1 += dp_head_len;
1486
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1487
if (op_addl_T0_T1_scv.len + op_setcpsr_nzcv_notsetr15_len >
1488
op_addl_T0_T1.len + op_setcpsr_nzcv_setr15_len) {
1490
op_addl_T0_T1_scv.len +
1491
op_setcpsr_nzcv_notsetr15_len;
1496
op_setcpsr_nzcv_setr15_len;
1498
if (dp_tmp1 > dp_len) {
1502
("add insn's max len is %d\n",
1503
dp_tmp1 + tb_insn_len_max));
1507
dp_tmp1 += dp_head_len;
1508
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1509
if (op_adcl_T0_T1_scv.len + op_setcpsr_nzcv_notsetr15_len >
1510
op_adcl_T0_T1.len + op_setcpsr_nzcv_setr15_len) {
1512
op_adcl_T0_T1_scv.len +
1513
op_setcpsr_nzcv_notsetr15_len;
1518
op_setcpsr_nzcv_setr15_len;
1520
if (dp_tmp1 > dp_len) {
1524
("adc insn's max len is %d\n",
1525
dp_tmp1 + tb_insn_len_max));
1529
dp_tmp1 += dp_head_len;
1530
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1531
if (op_sbcl_T0_T1_scv.len + op_setcpsr_nzcv_notsetr15_len >
1532
op_sbcl_T0_T1.len + op_setcpsr_nzcv_setr15_len) {
1534
op_sbcl_T0_T1_scv.len +
1535
op_setcpsr_nzcv_notsetr15_len;
1540
op_setcpsr_nzcv_setr15_len;
1542
if (dp_tmp1 > dp_len) {
1546
("sbc insn's max len is %d\n",
1547
dp_tmp1 + tb_insn_len_max));
1551
dp_tmp1 += dp_head_len;
1552
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1553
if (op_rscl_T0_T1_scv.len + op_setcpsr_nzcv_notsetr15_len >
1554
op_rscl_T0_T1.len + op_setcpsr_nzcv_setr15_len) {
1556
op_rscl_T0_T1_scv.len +
1557
op_setcpsr_nzcv_notsetr15_len;
1562
op_setcpsr_nzcv_setr15_len;
1564
if (dp_tmp1 > dp_len) {
1568
("rsc insn's max len is %d\n",
1569
dp_tmp1 + tb_insn_len_max));
1573
dp_tmp1 += dp_head_len;
1574
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1575
dp_tmp1 += op_andl_T0_T1.len;
1576
dp_tmp1 += op_setcpsr_nzc_len;
1577
if (dp_tmp1 > dp_len) {
1581
("tst insn's max len is %d\n",
1582
dp_tmp1 + tb_insn_len_max));
1586
dp_tmp1 += dp_head_len;
1587
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1588
dp_tmp1 += op_eorl_T0_T1.len;
1589
dp_tmp1 += op_setcpsr_nzc_len;
1590
if (dp_tmp1 > dp_len) {
1594
("teq insn's max len is %d\n",
1595
dp_tmp1 + tb_insn_len_max));
1599
dp_tmp1 += dp_head_len;
1600
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1601
dp_tmp1 += op_subl_T0_T1_scv.len;
1602
dp_tmp1 += op_setcpsr_nzcv_len;
1603
if (dp_tmp1 > dp_len) {
1607
("cmp insn's max len is %d\n",
1608
dp_tmp1 + tb_insn_len_max));
1612
dp_tmp1 += dp_head_len;
1613
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1614
dp_tmp1 += op_addl_T0_T1_scv.len;
1615
dp_tmp1 += op_setcpsr_nzcv_len;
1616
if (dp_tmp1 > dp_len) {
1620
("cmn insn's max len is %d\n",
1621
dp_tmp1 + tb_insn_len_max));
1625
dp_tmp1 += dp_head_len;
1626
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1627
dp_tmp1 += op_orrl_T0_T1.len;
1628
dp_tmp1 += op_setcpsr_nzc_setreg_len;
1629
if (dp_tmp1 > dp_len) {
1633
("orr insn's max len is %d\n",
1634
dp_tmp1 + tb_insn_len_max));
1638
dp_tmp1 += dp_head_len;
1639
dp_tmp1 += op_movl_T0_T1.len;
1640
dp_tmp1 += op_setcpsr_nzc_setreg_len;
1641
if (dp_tmp1 > dp_len) {
1645
("mov insn's max len is %d\n",
1646
dp_tmp1 + tb_insn_len_max));
1650
dp_tmp1 += dp_head_len;
1651
dp_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1652
dp_tmp1 += op_bicl_T0_T1.len;
1653
dp_tmp1 += op_setcpsr_nzc_setreg_len;
1654
if (dp_tmp1 > dp_len) {
1658
("bic insn's max len is %d\n",
1659
dp_tmp1 + tb_insn_len_max));
1663
dp_tmp1 += dp_head_len;
1664
dp_tmp1 += op_notl_T0_T1.len;
1665
dp_tmp1 += op_setcpsr_nzc_setreg_len;
1666
if (dp_tmp1 > dp_len) {
1670
("mvn insn's max len is %d\n",
1671
dp_tmp1 + tb_insn_len_max));
1676
int op_add_data_offset_len = 0, ldr_head_len =
1677
0, str_head_len = 0;
1678
int other_tmp1, other_tmp2;
1680
//op_add_data_offset_len
1681
op_add_data_offset_len += op_movl_Tx_reg_array_maxlen[2];
1682
op_add_data_offset_len += op_shift_T2_im_maxlen;
1683
op_add_data_offset_len += sizeof (uint8_t);
1684
if (op_subl_T1_T2.len > op_addl_T1_T2.len) {
1685
op_add_data_offset_len += op_subl_T1_T2.len;
1688
op_add_data_offset_len += op_addl_T1_T2.len;
1690
if (op_addl_T1_im.len + sizeof (ARMword) >
1691
op_add_data_offset_len) {
1692
op_add_data_offset_len =
1693
op_addl_T1_im.len + sizeof (ARMword);
1696
//ldr_head_len str_head_len
1697
ldr_head_len += op_movl_Tx_reg_array_maxlen[1];
1698
ldr_head_len += op_add_data_offset_len;
1699
ldr_head_len += op_movl_reg_Tx_array_maxlen[1];
1700
//if (!state->is_XScale) {
1701
if (state->abort_model > 1) {
1702
ldr_head_len += op_test_dataabort_ret.len;
1704
str_head_len = ldr_head_len;
1705
ldr_head_len += op_movl_reg_Tx_array_maxlen[0];
1706
//if (!state->is_XScale) {
1707
if (state->abort_model > 1) {
1708
ldr_head_len += op_test_dataabort.len;
1710
str_head_len += op_movl_Tx_reg_array_maxlen[0];
1713
other_tmp1 = ldr_head_len;
1714
other_tmp1 += op_ldrh_T0_T1.len;
1715
if (other_tmp1 > other_len) {
1716
other_len = other_tmp1;
1719
("ldrh insn's max len is %d\n",
1720
other_tmp1 + tb_insn_len_max));
1723
other_tmp1 = ldr_head_len;
1724
other_tmp1 += op_ldrb_T0_T1.len;
1725
other_tmp1 += op_signextend_byte_T0.len;
1726
if (other_tmp1 > other_len) {
1727
other_len = other_tmp1;
1730
("ldrsb insn's max len is %d\n",
1731
other_tmp1 + tb_insn_len_max));
1734
other_tmp1 = ldr_head_len;
1735
other_tmp1 += op_ldrh_T0_T1.len;
1736
other_tmp1 += op_signextend_halfword_T0.len;
1737
if (other_tmp1 > other_len) {
1738
other_len = other_tmp1;
1741
("ldrsh insn's max len is %d\n",
1742
other_tmp1 + tb_insn_len_max));
1745
other_tmp1 = ldr_head_len;
1746
other_tmp1 += op_ldrb_T0_T1.len;
1747
if (other_tmp1 > other_len) {
1748
other_len = other_tmp1;
1751
("ldrb insn's max len is %d\n",
1752
other_tmp1 + tb_insn_len_max));
1755
other_tmp1 = ldr_head_len;
1756
other_tmp1 += op_ldr_T0_T1.len;
1757
if (other_tmp1 > other_len) {
1758
other_len = other_tmp1;
1761
("ldr insn's max len is %d\n",
1762
other_tmp1 + tb_insn_len_max));
1765
other_tmp1 = str_head_len;
1766
other_tmp1 += op_strh_T0_T1.len;
1767
if (other_tmp1 > other_len) {
1768
other_len = other_tmp1;
1771
("strh insn's max len is %d\n",
1772
other_tmp1 + tb_insn_len_max));
1774
//teawater add for xscale(arm v5) 2005.09.26------------------------------------
1776
other_tmp1 = ldr_head_len;
1777
other_tmp1 += op_ldrd_T0_T2_T1.len;
1778
if (state->abort_model > 1) {
1779
other_tmp1 += op_test_dataabort_ret.len;
1781
other_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1782
other_tmp1 += op_movl_reg_Tx_array_maxlen[2];
1783
if (other_tmp1 > other_len) {
1784
other_len = other_tmp1;
1787
("ldrd insn's max len is %d\n",
1788
other_tmp1 + tb_insn_len_max));
1791
other_tmp1 = ldr_head_len;
1792
other_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1793
other_tmp1 += op_movl_reg_Tx_array_maxlen[2];
1794
other_tmp1 += op_strd_T0_T2_T1.len;
1795
if (other_tmp1 > other_len) {
1796
other_len = other_tmp1;
1799
("strd insn's max len is %d\n",
1800
other_tmp1 + tb_insn_len_max));
1801
//AJ2D--------------------------------------------------------------------------
1804
other_tmp1 = str_head_len;
1805
other_tmp1 += op_strb_T0_T1.len;
1806
if (other_tmp1 > other_len) {
1807
other_len = other_tmp1;
1810
("strb insn's max len is %d\n",
1811
other_tmp1 + tb_insn_len_max));
1814
other_tmp1 = str_head_len;
1815
other_tmp1 += op_str_T0_T1.len;
1816
if (other_tmp1 > other_len) {
1817
other_len = other_tmp1;
1820
("str insn's max len is %d\n",
1821
other_tmp1 + tb_insn_len_max));
1825
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1826
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1827
other_tmp1 += op_mul_T0_T1.len;
1828
other_tmp1 += op_logic_T0_sn.len;
1829
other_tmp1 += op_set_nf.len;
1830
other_tmp1 += op_logic_T0_sz.len;
1831
other_tmp1 += op_set_zf.len;
1832
other_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1834
("mul insn's max len is %d\n",
1835
other_tmp1 + tb_insn_len_max));
1838
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1839
other_tmp1 += op_addl_T0_T1.len;
1840
if (other_tmp1 > other_len) {
1841
other_len = other_tmp1;
1844
("mla insn's max len is %d\n",
1845
other_tmp1 + tb_insn_len_max));
1849
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1850
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1851
if (op_smull_T0_T1.len > op_umull_T0_T1.len) {
1852
other_tmp1 += op_smull_T0_T1.len;
1855
other_tmp1 += op_umull_T0_T1.len;
1857
other_tmp1 += op_movl_Tx_reg_array_maxlen[2];
1858
other_tmp1 += op_movl_eax_T2.len;
1859
other_tmp1 += op_movl_Tx_reg_array_maxlen[2];
1860
other_tmp1 += op_addq_T0_T1_eax_T2.len;
1861
other_tmp1 += op_logic_T0_sn.len;
1862
other_tmp1 += op_set_nf.len;
1863
other_tmp1 += op_logic_T0_sz.len;
1864
other_tmp1 += op_set_zf.len;
1865
other_tmp1 += op_movl_reg_Tx_array_maxlen[0];
1866
other_tmp1 += op_movl_reg_Tx_array_maxlen[1];
1867
if (other_tmp1 > other_len) {
1868
other_len = other_tmp1;
1871
("mull insn's max len is %d\n",
1872
other_tmp1 + tb_insn_len_max));
1876
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1877
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1878
if (op_ldrb_T2_T1.len + op_strb_T0_T1.len >
1879
op_ldr_T2_T1.len + op_str_T0_T1.len) {
1880
other_tmp1 += op_ldrb_T2_T1.len + op_strb_T0_T1.len;
1883
other_tmp1 += op_ldr_T2_T1.len + op_str_T0_T1.len;
1885
other_tmp1 += op_movl_reg_Tx_array_maxlen[2];
1886
if (other_tmp1 > other_len) {
1887
other_len = other_tmp1;
1890
("swp insn's max len is %d\n",
1891
other_tmp1 + tb_insn_len_max));
1896
op_movl_Tx_im[2].len + sizeof (ARMword) +
1897
op_movl_trap_T2.len;
1898
if (other_tmp1 > other_len) {
1899
other_len = other_tmp1;
1902
("insn_undef insn's max len is %d\n",
1903
other_tmp1 + tb_insn_len_max));
1907
other_tmp1 += op_test_cpsr_ret_UNP.len;
1908
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1910
op_movl_Tx_im[2].len + sizeof (ARMword) +
1911
op_movl_trap_T2.len;
1912
other_tmp1 += op_addl_T1_im.len + sizeof (ARMword);
1913
other_tmp1 += op_movl_Tx_im[0].len + sizeof (ARMword);
1914
other_tmp2 = op_ldm_user_T1_T0.len;
1915
if (op_ldm_T1_T0.len > other_tmp2) {
1916
other_tmp2 = op_ldm_T1_T0.len;
1918
if (op_stm_user_T1_T0.len > other_tmp2) {
1919
other_tmp2 = op_stm_user_T1_T0.len;
1921
if (op_stm_T1_T0.len > other_tmp2) {
1922
other_tmp2 = op_stm_T1_T0.len;
1924
other_tmp1 += other_tmp2;
1925
//if (!state->is_XScale) {
1926
if (state->abort_model > 1) {
1927
ldr_head_len += op_test_dataabort.len;
1929
other_tmp1 += op_addl_T1_im.len + sizeof (ARMword);
1930
other_tmp1 += op_movl_reg_Tx_array_maxlen[1];
1931
//if (!state->is_XScale) {
1932
if (state->abort_model > 1) {
1933
ldr_head_len += op_test_dataabort_ret.len;
1935
if (other_tmp1 > other_len) {
1936
other_len = other_tmp1;
1939
("ldm stm insn's max len is %d\n",
1940
other_tmp1 + tb_insn_len_max));
1944
other_tmp1 += op_b_offset.len + sizeof (ARMword);
1945
//teawater change for local tb branch directly jump 2005.10.21------------------
1946
other_tmp1 += op_local_b_offset.len;
1947
//AJ2D--------------------------------------------------------------------------
1948
if (other_tmp1 > other_len) {
1949
other_len = other_tmp1;
1952
("b insn's max len is %d\n",
1953
other_tmp1 + tb_insn_len_max));
1957
other_tmp1 += op_bl_offset.len + sizeof (ARMword);
1958
//teawater change for local tb branch directly jump 2005.10.21------------------
1959
other_tmp1 += op_local_b_offset.len;
1960
//AJ2D--------------------------------------------------------------------------
1961
if (other_tmp1 > other_len) {
1962
other_len = other_tmp1;
1965
("bl insn's max len is %d\n",
1966
other_tmp1 + tb_insn_len_max));
1968
//teawater add for xscale(arm v5) 2005.09.14------------------------------------
1971
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1972
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1973
other_tmp1 += op_mar_T0_T1.len;
1974
if (other_tmp1 > other_len) {
1975
other_len = other_tmp1;
1978
("mar insn's max len is %d\n",
1979
other_tmp1 + tb_insn_len_max));
1982
other_tmp1 += op_mra_T0_T1.len;
1984
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
1985
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1986
if (other_tmp1 > other_len) {
1987
other_len = other_tmp1;
1990
("mra insn's max len is %d\n",
1991
other_tmp1 + tb_insn_len_max));
1992
//AJ2D--------------------------------------------------------------------------
1996
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
1997
other_tmp1 += op_addl_T1_im.len + sizeof (ARMword);
1998
other_tmp1 += op_movl_Tx_im[0].len + sizeof (ARMword);
1999
if (op_ldc_T0_T1.len > op_stc_T0_T1.len) {
2000
other_tmp1 += op_ldc_T0_T1.len;
2003
other_tmp1 += op_stc_T0_T1.len;
2005
other_tmp1 += op_movl_reg_Tx_array_maxlen[1];
2006
if (other_tmp1 > other_len) {
2007
other_len = other_tmp1;
2010
("ldc stc insn's max len is %d\n",
2011
other_tmp1 + tb_insn_len_max));
2013
//teawater add for xscale(arm v5) 2005.09.14------------------------------------
2016
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
2017
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
2018
other_tmp1 += op_smull_T0_T1.len;
2019
other_tmp1 += op_mia_T0_T1.len;
2020
if (other_tmp1 > other_len) {
2021
other_len = other_tmp1;
2024
("mia insn's max len is %d\n",
2025
other_tmp1 + tb_insn_len_max));
2029
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
2030
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
2031
other_tmp1 += op_miaph_T0_T1.len;
2032
if (other_tmp1 > other_len) {
2033
other_len = other_tmp1;
2036
("miaph insn's max len is %d\n",
2037
other_tmp1 + tb_insn_len_max));
2041
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
2042
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
2043
other_tmp1 += op_lo_T0.len;
2044
other_tmp1 += op_lo_T1.len;
2045
other_tmp1 += op_miaxy_T0_T1.len;
2046
if (other_tmp1 > other_len) {
2047
other_len = other_tmp1;
2050
("miabb insn's max len is %d\n",
2051
other_tmp1 + tb_insn_len_max));
2055
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
2056
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
2057
other_tmp1 += op_lo_T0.len;
2058
other_tmp1 += op_hi_T1.len;
2059
other_tmp1 += op_miaxy_T0_T1.len;
2060
if (other_tmp1 > other_len) {
2061
other_len = other_tmp1;
2064
("miabt insn's max len is %d\n",
2065
other_tmp1 + tb_insn_len_max));
2069
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
2070
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
2071
other_tmp1 += op_hi_T0.len;
2072
other_tmp1 += op_lo_T1.len;
2073
other_tmp1 += op_miaxy_T0_T1.len;
2074
if (other_tmp1 > other_len) {
2075
other_len = other_tmp1;
2078
("miatb insn's max len is %d\n",
2079
other_tmp1 + tb_insn_len_max));
2083
other_tmp1 += op_movl_Tx_reg_array_maxlen[0];
2084
other_tmp1 += op_movl_Tx_reg_array_maxlen[1];
2085
other_tmp1 += op_hi_T0.len;
2086
other_tmp1 += op_hi_T1.len;
2087
other_tmp1 += op_miaxy_T0_T1.len;
2088
if (other_tmp1 > other_len) {
2089
other_len = other_tmp1;
2092
("miatt insn's max len is %d\n",
2093
other_tmp1 + tb_insn_len_max));
2094
//AJ2D--------------------------------------------------------------------------
2098
other_tmp1 += op_movl_Tx_im[0].len + sizeof (ARMword);
2099
other_tmp1 += op_movl_Tx_im[1].len + sizeof (ARMword);
2100
other_tmp1 += op_mrc_T0_T1.len;
2101
if (other_tmp1 > other_len) {
2102
other_len = other_tmp1;
2105
("mrc insn's max len is %d\n",
2106
other_tmp1 + tb_insn_len_max));
2110
other_tmp1 += op_movl_Tx_im[0].len + sizeof (ARMword);
2111
other_tmp1 += op_movl_Tx_im[1].len + sizeof (ARMword);
2112
other_tmp1 += op_mcr_T0_T1.len;
2113
if (other_tmp1 > other_len) {
2114
other_len = other_tmp1;
2117
("mcr insn's max len is %d\n",
2118
other_tmp1 + tb_insn_len_max));
2122
other_tmp1 += op_movl_Tx_im[0].len + sizeof (ARMword);
2123
other_tmp1 += op_movl_Tx_im[1].len + sizeof (ARMword);
2124
other_tmp1 += op_cdp_T0_T1.len;
2125
if (other_tmp1 > other_len) {
2126
other_len = other_tmp1;
2129
("cdp insn's max len is %d\n",
2130
other_tmp1 + tb_insn_len_max));
2135
op_movl_Tx_im[2].len + sizeof (ARMword) +
2136
op_movl_trap_T2.len;
2137
if (other_tmp1 > other_len) {
2138
other_len = other_tmp1;
2141
("swi insn's max len is %d\n",
2142
other_tmp1 + tb_insn_len_max));
2145
if (dp_len > other_len) {
2146
tb_insn_len_max += dp_len;
2149
tb_insn_len_max += other_len;
2152
TEA_OUT (printf ("tb_insn_len_max is %d\n", tb_insn_len_max));
2156
//teawater add for new tb manage function 2005.07.10----------------------------
2158
tb_memory_init (ARMul_State * state)
2166
//get align tbt size
2167
TB_TBT_SIZE = ALIGN (TB_TBT_SIZE, sizeof (tb_cache_t));
2168
if (TB_TBT_SIZE < sizeof (tb_cache_t)) {
2170
"SKYEYE: tb_memory_init: TB_TBT_SIZE %u is too little.\n",
2171
(unsigned int) TB_TBT_SIZE);
2177
for (i = 0; i < state->mem_bank->current_num; i++) {
2178
tmp_u64 += state->mem_bank->mem_banks[i].len;
2180
tmp_u64 = tmp_u64 / TB_LEN * sizeof (tb_cache_t);
2182
if (TB_TBT_SIZE >= tmp_u64) {
2183
//if set size >= max size, use the simple function
2187
//get mem by TB_TBT_SIZE
2188
tbt_table = (tb_t *) malloc (TB_TBT_SIZE);
2191
"SKYEYE: tb_memory_init: Error allocating mem.\n");
2194
memset (tbt_table, 0, TB_TBT_SIZE);
2195
tbt_table_size = TB_TBT_SIZE / sizeof (tb_cache_t);
2201
//get align tbp size
2202
TB_TBP_SIZE = ALIGN (TB_TBP_SIZE, TB_TBP_MAX);
2203
if (TB_TBP_SIZE < TB_TBP_MAX) {
2205
"SKYEYE: tb_memory_init: TB_TBP_SIZE %u is too little.\n",
2206
(unsigned int) TB_TBP_SIZE);
2213
tbt_table_size * TB_LEN / sizeof (ARMword) *
2214
TB_INSN_LEN_MAX + tbt_table_size * op_return.len;
2216
if (TB_TBP_SIZE == 0 || TB_TBP_SIZE > tmp_u64) {
2217
TB_TBP_SIZE = tmp_u64;
2227
for (i = 0; i < state->mem_bank->current_num; i++) {
2228
tmp_u64 += state->mem_bank->mem_banks[i].len;
2231
tmp_u64 / sizeof (ARMword) * TB_INSN_LEN_MAX +
2232
tmp_u64 / TB_LEN * op_return.len;
2234
if (TB_TBP_SIZE >= tmp_u64) {
2235
//if set size >= max size, use the simple function
2244
//get mem by TB_TBP_SIZE
2245
//koodailar add it for mingw 2005.12.18-----------------------------------------
2248
malloc(TB_TBP_SIZE);
2249
if (tbp_begin == NULL) {
2251
"SKYEYE: tb_memory_init: Error allocating mem.\n");
2255
//get mem by TB_TBP_SIZE
2257
mmap (NULL, TB_TBP_SIZE,
2258
PROT_READ | PROT_WRITE | PROT_EXEC,
2259
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
2260
if (tbp_begin == MAP_FAILED) {
2262
"SKYEYE: tb_memory_init: Error allocating mem.\n");
2266
//end koodailar ----------------------------------------------------------------
2267
tbp_now_size = TB_TBP_SIZE;
2268
tbp_now = tbp_begin;
2272
printf ("dbct translate block entry use memory 0x%08x bytes.\n", TB_TBT_SIZE);
2275
printf ("dbct translate block use memory 0x%08x bytes.\n",
2282
//AJ2D--------------------------------------------------------------------------