dmd.backend.cg87

x87 FPU code generation

Compiler implementation of the D programming language.

Members

Functions

cdconvt87
void cdconvt87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Operators OPc_r and OPc_i

cdd_u32
void cdd_u32(CodeBuilder cdb, elem* e, regm_t* pretregs)

Do the following opcodes: OPd_u32

cdd_u64
void cdd_u64(CodeBuilder cdb, elem* e, regm_t* pretregs)

Do the following opcodes: OPd_u64 OPld_u64

cdind87
void cdind87(CodeBuilder cdb, elem* e, regm_t* pretregs)
cdnegass87
void cdnegass87(CodeBuilder cdb, elem* e, regm_t* pretregs)

OPnegass

cdrndtol
void cdrndtol(CodeBuilder cdb, elem* e, regm_t* pretregs)

Do OPrndtol.

cdscale
void cdscale(CodeBuilder cdb, elem* e, regm_t* pretregs)

Do OPscale, OPyl2x, OPyl2xp1.

cdtoprec
void cdtoprec(CodeBuilder cdb, elem* e, regm_t* pretregs)

Round 80 bit precision to 32 or 64 bits. OPtoprec

cg87_reset
void cg87_reset()

Reset statics for another .obj file.

cload87
void cload87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Load complex operand into ST01 or flags or both.

cmporder87
int cmporder87(elem* e)

Determine if a compare is to be done forwards (return 0) or backwards (return 1). Must follow same logic as load87().

cnvt87
void cnvt87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Do the following opcodes: OPd_s16 OPd_s32 OPd_u16 OPd_s64

complex_eq87
void complex_eq87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Perform an assignment to a long double/double/float.

comsub87
void comsub87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Reload common subexpression.

eq87
void eq87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Perform an assignment to a long double/double/float.

fixresult87
void fixresult87(CodeBuilder cdb, elem* e, regm_t retregs, regm_t* pretregs, bool isReturnValue)

Given the result of an expression is in retregs, generate necessary code to return result in *pretregs.

fixresult_complex87
void fixresult_complex87(CodeBuilder cdb, elem* e, regm_t retregs, regm_t* pretregs, bool isReturnValue)

Given the result of an expression is in retregs, generate necessary code to return result in *pretregs.

genfwait
void genfwait(CodeBuilder cdb)

Decide if we need to gen an FWAIT.

gensaverestore87
void gensaverestore87(regm_t regm, CodeBuilder cdbsave, CodeBuilder cdbrestore)

Save/restore ST0 or ST01

load87
void load87(CodeBuilder cdb, elem* e, uint eoffset, regm_t* pretregs, elem* eleft, OPER op)

If op == -1, load expression e into ST0. else compute (eleft op e), eleft is in ST0. Must follow same logic as cmporder87();

loadPair87
void loadPair87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Load OPpair or OPrpair into mST01

loadconst
ubyte loadconst(elem* e, int im)

Determine if there is a special 8087 instruction to load constant e. Input: im 0 load real part 1 load imaginary part

neg87
void neg87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Unary -, absolute value, square root, sine, cosine

neg_complex87
void neg_complex87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Unary - for complex operands

note87
void note87(elem* e, uint offset, int i)

Note elem e as being in ST(i) as being a value we want to keep.

opass87
void opass87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Perform +=, -=, *= and /= for doubles.

pop87
void pop87()

Pop 8087 stack.

post87
void post87(CodeBuilder cdb, elem* e, regm_t* pretregs)

Take care of OPpostinc and OPpostdec.

push87
void push87(CodeBuilder cdb)

Push 8087 stack. Generate and return any code necessary to preserve anything that might run off the end of the stack.

save87
void save87(CodeBuilder cdb)

Save in memory any values in the 8087 that we want to keep.

save87regs
void save87regs(CodeBuilder cdb, uint n)

Save any noted values that would be destroyed by n pushes

xchg87
void xchg87(int i, int j)

Exchange two entries in 8087 stack.

Static variables

oprev
ubyte[9] oprev;

Generate in-line 8087 code for the following operators: add min mul div cmp

Structs

Dconst
struct Dconst

Meta