15 for(i = 0; i < Nfpregs; i++)
20 vfpregtransfer(u32int instr)
24 Rt = P->R + ((instr>>12)&0xF);
25 Fn = P->F + ((instr>>16)&0xF);
27 switch((instr>>20)&0xF){
29 *((int*)Fn) = *Rt; break;
31 *Rt = *((int*)Fn); break;
41 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
46 vfprmtransfer(u32int instr)
52 n = (instr>>16) & 0xF;
53 d = (instr>>12) & 0xF;
54 off = (instr & 0xFF) << 2;
56 if((instr & (1<<23)) == 0)
58 ea = vaddr(evenaddr(P->R[n] + off, sz ? 7 : 3), 8, &seg);
59 switch((instr>>20)&0x3){
62 *(double*)ea = P->F[d];
64 *(float*)ea = P->F[d];
68 P->F[d] = *(double*)ea;
70 P->F[d] = *(float*)ea;
73 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
79 vfparithop(int opc, u32int instr)
82 long double *Fd, *Fn, *Fm;
83 Fd = P->F + ((instr>>12)&0xF);
84 Fn = P->F + ((instr>>16)&0xF);
85 Fm = P->F + (instr&0xF);
86 o = ((opc&0x3)<<1) | (opc&0x8) | ((instr>>6)&0x1);
90 *Fd = *Fn * *Fm; break;
92 *Fd = *Fn + *Fm; break;
94 *Fd = *Fn - *Fm; break;
96 *Fd = *Fn / *Fm; break;
98 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
103 vfpotherop(u32int instr)
106 long double *Fd, *Fm, F0;
107 Fd = P->F + ((instr>>12)&0xF);
108 Fm = P->F + (instr&0xF);
110 o2 = (instr>>16) & 0xF;
111 o3 = (instr>>6) & 0x3;
114 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
120 P->FPSR = (P->FPSR & ~FLAGS) | flN;
121 else if(*Fd >= *Fm) {
122 P->FPSR = (P->FPSR & ~FLAGS) | flC;
126 P->FPSR = (P->FPSR & ~FLAGS) | flV | flC;
129 *Fd = *((int*)Fm); break;
131 *((int*)Fd) = (int)*Fm; break;
133 switch((o2<<1)|(o3>>1)){
138 *Fd = fabs(*Fm); break;
142 *Fd = sqrt(*Fm); break;
144 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
150 vfpoperation(u32int instr)
153 o1 = (instr>>20) & 0xF;
157 vfparithop(o1, instr);