1 /* { dg-skip-if "requires default endianness" { *-*-* } "-fsso-struct=*" "" } */
5 #if !defined(NO_LABEL_VALUES) && (!defined(STACK_SIZE) || STACK_SIZE >= 4000) && __INT_MAX__ >= 2147483647
6 typedef unsigned int uint32
;
7 typedef signed int sint32
;
11 typedef unsigned long int host_addr_t
;
12 typedef uint32 target_addr_t
;
13 typedef sint32 target_saddr_t
;
19 unsigned int offset
:18;
20 unsigned int ignore
:4;
34 target_addr_t vaddr_tag
;
35 unsigned long int rigged_paddr
;
43 tlb_entry_t tlb_tab
[0x100];
59 simulator_kernel (int what
, environment_t
*env
)
61 register insn_t
*pc
= env
->pc
;
62 register reg_t
*regs
= env
->registers
;
66 register void *base_addr
= &&sim_base_addr
;
67 register tlb_entry_t
*tlb
= env
->tlb_tab
;
72 static void *op_map
[] =
77 insn_t
*program
= env
->program
;
78 for (i
= 0; i
< what
; i
++)
79 program
[i
].f1
.offset
= op_map
[program
[i
].f1
.offset
] - base_addr
;
85 r2
= (*(reg_t
*) (((char *) regs
) + (insn
.f1
.s2
<< 2)));
86 s1
= (insn
.f1
.s1
<< 2);
87 goto *(base_addr
+ insn
.f1
.offset
);
91 target_addr_t vaddr_page
= r2
/ 4096;
92 unsigned int x
= vaddr_page
% 0x100;
97 target_addr_t tag
= tlb
[x
].vaddr_tag
;
98 host_addr_t rigged_paddr
= tlb
[x
].rigged_paddr
;
100 if (tag
== vaddr_page
)
102 *(reg_t
*) (((char *) regs
) + s1
) = *(uint32
*) (rigged_paddr
+ r2
);
103 r2
= *(reg_t
*) (((char *) regs
) + (insn
.f1
.s2
<< 2));
104 s1
= insn
.f1
.s1
<< 2;
105 goto *(base_addr
+ insn
.f1
.offset
);
108 if (((target_saddr_t
) tag
< 0))
110 *(reg_t
*) (((char *) regs
) + s1
) = *(uint32
*) f ();
111 r2
= *(reg_t
*) (((char *) regs
) + (insn
.f1
.s2
<< 2));
112 s1
= insn
.f1
.s1
<< 2;
113 goto *(base_addr
+ insn
.f1
.offset
);
120 return (*(reg_t
*) (((char *) regs
) + s1
));
124 insn_t program
[2 + 1];
134 host_addr_t a_page
= (host_addr_t
) malloc (2 * 4096);
135 target_addr_t a_vaddr
= 0x123450;
136 target_addr_t vaddr_page
= a_vaddr
/ 4096;
137 a_page
= (a_page
+ 4096 - 1) & -4096;
139 env
.tlb_tab
[((vaddr_page
) % 0x100)].vaddr_tag
= vaddr_page
;
140 env
.tlb_tab
[((vaddr_page
) % 0x100)].rigged_paddr
= a_page
- vaddr_page
* 4096;
141 insn
.f1
.offset
= LOAD32_RR
;
142 env
.registers
[0] = 0;
143 env
.registers
[2] = a_vaddr
;
144 *(sint32
*) (a_page
+ a_vaddr
% 4096) = 88;
148 for (i
= 0; i
< 2; i
++)
151 insn
.f1
.offset
= METAOP_DONE
;
156 env
.program
= program
;
158 res
= simulator_kernel (2 + 1, &env
);