]>
git.proxmox.com Git - qemu.git/blob - target-sparc/op_helper.c
7 void raise_exception(int tt
)
9 env
->exception_index
= tt
;
13 #ifdef USE_INT_TO_FLOAT_HELPERS
16 FT0
= (float) *((int32_t *)&FT1
);
21 DT0
= (double) *((int32_t *)&FT1
);
42 if (isnan(FT0
) || isnan(FT1
)) {
43 T0
= FSR_FCC1
| FSR_FCC0
;
44 env
->fsr
&= ~(FSR_FCC1
| FSR_FCC0
);
46 if (env
->fsr
& FSR_NVM
) {
47 raise_exception(TT_FP_EXCP
);
51 } else if (FT0
< FT1
) {
53 } else if (FT0
> FT1
) {
63 if (isnan(DT0
) || isnan(DT1
)) {
64 T0
= FSR_FCC1
| FSR_FCC0
;
65 env
->fsr
&= ~(FSR_FCC1
| FSR_FCC0
);
67 if (env
->fsr
& FSR_NVM
) {
68 raise_exception(TT_FP_EXCP
);
72 } else if (DT0
< DT1
) {
74 } else if (DT0
> DT1
) {
82 void helper_ld_asi(int asi
, int size
, int sign
)
87 case 3: /* MMU probe */
91 mmulev
= (T0
>> 8) & 15;
95 ret
= mmu_probe(T0
, mmulev
);
99 printf("mmu_probe: 0x%08x (lev %d) -> 0x%08x\n", T0
, mmulev
, ret
);
103 case 4: /* read MMU regs */
105 int reg
= (T0
>> 8) & 0xf;
107 ret
= env
->mmuregs
[reg
];
108 if (reg
== 3 || reg
== 4) /* Fault status, addr cleared on read*/
112 case 0x20 ... 0x2f: /* MMU passthrough */
113 cpu_physical_memory_read(T0
, (void *) &ret
, size
);
117 tswap16s((uint16_t *)&ret
);
126 void helper_st_asi(int asi
, int size
, int sign
)
129 case 3: /* MMU flush */
133 mmulev
= (T0
>> 8) & 15;
135 case 0: // flush page
136 tlb_flush_page(cpu_single_env
, T0
& 0xfffff000);
138 case 1: // flush segment (256k)
139 case 2: // flush region (16M)
140 case 3: // flush context (4G)
141 case 4: // flush entire
142 tlb_flush(cpu_single_env
, 1);
150 case 4: /* write MMU regs */
152 int reg
= (T0
>> 8) & 0xf, oldreg
;
154 oldreg
= env
->mmuregs
[reg
];
156 env
->mmuregs
[reg
] &= ~(MMU_E
| MMU_NF
);
157 env
->mmuregs
[reg
] |= T1
& (MMU_E
| MMU_NF
);
159 env
->mmuregs
[reg
] = T1
;
160 if (oldreg
!= env
->mmuregs
[reg
]) {
162 // XXX: Only if MMU mapping change, we may need to flush?
163 tlb_flush(cpu_single_env
, 1);
171 case 0x17: /* Block copy, sta access */
174 // address (T0) = dst
176 int src
= T1
, dst
= T0
;
181 cpu_physical_memory_read(src
, (void *) &temp
, 32);
182 cpu_physical_memory_write(dst
, (void *) &temp
, 32);
185 case 0x1f: /* Block fill, stda access */
188 // address (T0) = dst
193 val
= (((uint64_t)T1
) << 32) | T2
;
196 for (i
= 0; i
< 32; i
+= 8, dst
+= 8) {
197 cpu_physical_memory_write(dst
, (void *) &val
, 8);
201 case 0x20 ... 0x2f: /* MMU passthrough */
207 tswap16s((uint16_t *)&temp
);
208 cpu_physical_memory_write(T0
, (void *) &temp
, size
);
221 cwp
= (env
->cwp
+ 1) & (NWINDOWS
- 1);
222 if (env
->wim
& (1 << cwp
)) {
223 raise_exception(TT_WIN_UNF
);
226 env
->psrs
= env
->psrps
;
229 void helper_ldfsr(void)
231 switch (env
->fsr
& FSR_RD_MASK
) {
233 fesetround(FE_TONEAREST
);
236 fesetround(FE_TOWARDZERO
);
239 fesetround(FE_UPWARD
);
242 fesetround(FE_DOWNWARD
);
247 void cpu_get_fp64(uint64_t *pmant
, uint16_t *pexp
, double f
)
251 *pmant
= ldexp(frexp(f
, &exptemp
), 53);
255 double cpu_put_fp64(uint64_t mant
, uint16_t exp
)
257 return ldexp((double) mant
, exp
- 53);
262 env
->exception_index
= EXCP_DEBUG
;