1 /* { dg-require-effective-target label_values } */
2 /* { dg-require-stack-size "4000" } */
6 #if __INT_MAX__ >= 2147483647
7 typedef unsigned int uint32
;
8 typedef signed int sint32
;
12 typedef unsigned long int host_addr_t
;
13 typedef uint32 target_addr_t
;
14 typedef sint32 target_saddr_t
;
21 unsigned int ignore
:4;
35 target_addr_t vaddr_tag
;
36 unsigned long int rigged_paddr
;
44 tlb_entry_t tlb_tab
[0x100];
60 simulator_kernel (int what
, environment_t
*env
)
62 register insn_t
*pc
= env
->pc
;
63 register reg_t
*regs
= env
->registers
;
67 register void *base_addr
= &&sim_base_addr
;
68 register tlb_entry_t
*tlb
= env
->tlb_tab
;
73 static void *op_map
[] =
78 insn_t
*program
= env
->program
;
79 for (i
= 0; i
< what
; i
++)
80 program
[i
].f1
.offset
= op_map
[program
[i
].f1
.offset
] - base_addr
;
86 r2
= (*(reg_t
*) (((char *) regs
) + (insn
.f1
.s2
<< 2)));
87 s1
= (insn
.f1
.s1
<< 2);
88 goto *(base_addr
+ insn
.f1
.offset
);
92 target_addr_t vaddr_page
= r2
/ 4096;
93 unsigned int x
= vaddr_page
% 0x100;
98 target_addr_t tag
= tlb
[x
].vaddr_tag
;
99 host_addr_t rigged_paddr
= tlb
[x
].rigged_paddr
;
101 if (tag
== vaddr_page
)
103 *(reg_t
*) (((char *) regs
) + s1
) = *(uint32
*) (rigged_paddr
+ r2
);
104 r2
= *(reg_t
*) (((char *) regs
) + (insn
.f1
.s2
<< 2));
105 s1
= insn
.f1
.s1
<< 2;
106 goto *(base_addr
+ insn
.f1
.offset
);
109 if (((target_saddr_t
) tag
< 0))
111 *(reg_t
*) (((char *) regs
) + s1
) = *(uint32
*) f ();
112 r2
= *(reg_t
*) (((char *) regs
) + (insn
.f1
.s2
<< 2));
113 s1
= insn
.f1
.s1
<< 2;
114 goto *(base_addr
+ insn
.f1
.offset
);
121 return (*(reg_t
*) (((char *) regs
) + s1
));
125 insn_t program
[2 + 1];
135 host_addr_t a_page
= (host_addr_t
) malloc (2 * 4096);
136 target_addr_t a_vaddr
= 0x123450;
137 target_addr_t vaddr_page
= a_vaddr
/ 4096;
138 a_page
= (a_page
+ 4096 - 1) & -4096;
140 env
.tlb_tab
[((vaddr_page
) % 0x100)].vaddr_tag
= vaddr_page
;
141 env
.tlb_tab
[((vaddr_page
) % 0x100)].rigged_paddr
= a_page
- vaddr_page
* 4096;
142 insn
.f1
.offset
= LOAD32_RR
;
143 env
.registers
[0] = 0;
144 env
.registers
[2] = a_vaddr
;
145 *(sint32
*) (a_page
+ a_vaddr
% 4096) = 88;
149 for (i
= 0; i
< 2; i
++)
152 insn
.f1
.offset
= METAOP_DONE
;
157 env
.program
= program
;
159 res
= simulator_kernel (2 + 1, &env
);