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(P->R[n] + off, 8, &seg);
60 switch((instr>>20)&0x3){
63 *(double*)ea = P->F[d];
65 *(float*)ea = P->F[d];
69 P->F[d] = *(double*)ea;
71 P->F[d] = *(float*)ea;
74 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
80 vfparithop(int opc, u32int instr)
83 long double *Fd, *Fn, *Fm;
84 Fd = P->F + ((instr>>12)&0xF);
85 Fn = P->F + ((instr>>16)&0xF);
86 Fm = P->F + (instr&0xF);
87 o = ((opc&0x3)<<1) | (opc&0x8) | ((instr>>6)&0x1);
91 *Fd = *Fn * *Fm; break;
93 *Fd = *Fn + *Fm; break;
95 *Fd = *Fn - *Fm; break;
97 *Fd = *Fn / *Fm; break;
99 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
104 vfpotherop(u32int instr)
107 long double *Fd, *Fm, F0;
108 Fd = P->F + ((instr>>12)&0xF);
109 Fm = P->F + (instr&0xF);
111 o2 = (instr>>16) & 0xF;
112 o3 = (instr>>6) & 0x3;
115 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
121 P->FPSR = (P->FPSR & ~FLAGS) | flN;
122 else if(*Fd >= *Fm) {
123 P->FPSR = (P->FPSR & ~FLAGS) | flC;
127 P->FPSR = (P->FPSR & ~FLAGS) | flV | flC;
130 *Fd = *((int*)Fm); break;
132 *((int*)Fd) = (int)*Fm; break;
134 switch((o2<<1)|(o3>>1)){
139 *Fd = fabs(*Fm); break;
143 *Fd = sqrt(*Fm); break;
145 sysfatal("unimplemented VFP instruction %8ux @ %8ux", instr, P->R[15] - 4);
151 vfpoperation(u32int instr)
154 o1 = (instr>>20) & 0xF;
158 vfparithop(o1, instr);