Added recompiled register versions of FADDP, FDIVP, FDIVRP, FMULP, FSUBP and FSUBRP.
This commit is contained in:
parent
78996b3e5c
commit
305b6cc4fd
10 changed files with 190 additions and 65 deletions
|
|
@ -5,10 +5,16 @@
|
|||
#include "386_common.h"
|
||||
#include "x87.h"
|
||||
#include "codegen.h"
|
||||
#include "codegen_accumulate.h"
|
||||
#include "codegen_ir.h"
|
||||
#include "codegen_ops.h"
|
||||
#include "codegen_ops_fpu_arith.h"
|
||||
|
||||
static void fpu_POP(ir_data_t *ir)
|
||||
{
|
||||
uop_ADD_IMM(ir, IREG_FPU_TOP, IREG_FPU_TOP, 1);
|
||||
}
|
||||
|
||||
uint32_t ropFADD(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int src_reg = fetchdat & 7;
|
||||
|
|
@ -29,6 +35,17 @@ uint32_t ropFADDr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fe
|
|||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFADDP(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FADD(ir, IREG_ST(dest_reg), IREG_ST(dest_reg), IREG_ST(0));
|
||||
uop_MOV_IMM(ir, IREG_tag(dest_reg), TAG_VALID);
|
||||
fpu_POP(ir);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
|
||||
uint32_t ropFDIV(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
|
|
@ -40,6 +57,16 @@ uint32_t ropFDIV(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fet
|
|||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFDIVR(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int src_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FDIV(ir, IREG_ST(0), IREG_ST(src_reg), IREG_ST(0));
|
||||
uop_MOV_IMM(ir, IREG_tag(0), TAG_VALID);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFDIVr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
|
@ -50,16 +77,6 @@ uint32_t ropFDIVr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fe
|
|||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFDIVR(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int src_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FDIV(ir, IREG_ST(0), IREG_ST(src_reg), IREG_ST(0));
|
||||
uop_MOV_IMM(ir, IREG_tag(0), TAG_VALID);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFDIVRr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
|
@ -70,6 +87,28 @@ uint32_t ropFDIVRr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t f
|
|||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFDIVP(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FDIV(ir, IREG_ST(dest_reg), IREG_ST(dest_reg), IREG_ST(0));
|
||||
uop_MOV_IMM(ir, IREG_tag(dest_reg), TAG_VALID);
|
||||
fpu_POP(ir);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFDIVRP(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FDIV(ir, IREG_ST(dest_reg), IREG_ST(0), IREG_ST(dest_reg));
|
||||
uop_MOV_IMM(ir, IREG_tag(dest_reg), TAG_VALID);
|
||||
fpu_POP(ir);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
|
||||
uint32_t ropFMUL(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
|
|
@ -91,6 +130,17 @@ uint32_t ropFMULr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fe
|
|||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFMULP(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FMUL(ir, IREG_ST(dest_reg), IREG_ST(dest_reg), IREG_ST(0));
|
||||
uop_MOV_IMM(ir, IREG_tag(dest_reg), TAG_VALID);
|
||||
fpu_POP(ir);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
|
||||
uint32_t ropFSUB(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
|
|
@ -102,6 +152,16 @@ uint32_t ropFSUB(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fet
|
|||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFSUBR(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int src_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FSUB(ir, IREG_ST(0), IREG_ST(src_reg), IREG_ST(0));
|
||||
uop_MOV_IMM(ir, IREG_tag(0), TAG_VALID);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFSUBr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
|
@ -112,16 +172,6 @@ uint32_t ropFSUBr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fe
|
|||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFSUBR(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int src_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FSUB(ir, IREG_ST(0), IREG_ST(src_reg), IREG_ST(0));
|
||||
uop_MOV_IMM(ir, IREG_tag(0), TAG_VALID);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFSUBRr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
|
@ -132,3 +182,25 @@ uint32_t ropFSUBRr(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t f
|
|||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFSUBP(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FSUB(ir, IREG_ST(dest_reg), IREG_ST(dest_reg), IREG_ST(0));
|
||||
uop_MOV_IMM(ir, IREG_tag(dest_reg), TAG_VALID);
|
||||
fpu_POP(ir);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
uint32_t ropFSUBRP(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc)
|
||||
{
|
||||
int dest_reg = fetchdat & 7;
|
||||
|
||||
uop_FP_ENTER(ir);
|
||||
uop_FSUB(ir, IREG_ST(dest_reg), IREG_ST(0), IREG_ST(dest_reg));
|
||||
uop_MOV_IMM(ir, IREG_tag(dest_reg), TAG_VALID);
|
||||
fpu_POP(ir);
|
||||
|
||||
return op_pc;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue