--- /opt/cvs/dotgnu/pnet/engine/unroll_arith.c 2004-06-18 11:16:41.000000000 +0530 +++ unroll_arith.c 2004-09-24 15:57:52.000000000 +0530 @@ -415,6 +415,52 @@ } break; +case 0x100 + COP_PREFIX_SIN: +case 0x100 + COP_PREFIX_COS: +{ + unsigned char * patch1; + UNROLL_START(); + CheckFPFull(&unroll); + reg = GetTopFPRegister(&unroll); + reg2 = GetFPRegister(&unroll); + if((unroll.regsUsed & (1 << X86_EAX)) != 0) + { + x86_push_reg(unroll.out, X86_EAX); + } + if(opcode == (0x100 + COP_PREFIX_SIN)) + { + x86_fsin(unroll.out); + } + else + { + x86_fcos(unroll.out); + } + x86_fnstsw(unroll.out); + x86_alu_reg_imm(unroll.out, X86_AND, X86_EAX, 0x0400); + patch1 = unroll.out; + x86_branch8(unroll.out, X86_CC_Z, 0, 1); + /* rem by 2*PI */ + x86_fldpi(unroll.out); + x86_fp_op(unroll.out, X86_FADD, 0); + x86_fxch(unroll.out, 1); + md_rem_reg_reg_float(unroll.out, reg, reg2, unroll.regsUsed); + if(opcode == (0x100 + COP_PREFIX_SIN)) + { + x86_fsin(unroll.out); + } + else + { + x86_fcos(unroll.out); + } + x86_patch(patch1, unroll.out); + if((unroll.regsUsed & (1 << X86_EAX)) != 0) + { + x86_pop_reg(unroll.out, X86_EAX); + } + MODIFY_UNROLL_PC(CVMP_LEN_NONE); +} +break; + #endif /* MD_HAS_FP */ case COP_IAND: --- /opt/cvs/dotgnu/pnet/engine/x86_codegen.h 2002-05-31 09:27:50.000000000 +0530 +++ x86_codegen.h 2004-09-24 13:50:18.000000000 +0530 @@ -1182,6 +1182,12 @@ *(inst)++ = (unsigned char)0xe8; \ } while (0) +#define x86_fldpi(inst) \ + do { \ + *(inst)++ = (unsigned char)0xd9; \ + *(inst)++ = (unsigned char)0xeb; \ + } while (0) + #define x86_fst(inst,mem,is_double,pop_stack) \ do { \ *(inst)++ = (is_double) ? (unsigned char)0xdd: (unsigned char)0xd9; \