Add (largely untested) float/int conversion.
--HG-- branch : dtrg-videocore
This commit is contained in:
parent
29af6f1adb
commit
e36d739fa4
|
@ -25,3 +25,4 @@ extern void branch_addcmp_reg_lit_instr(int cc, int rd, int ra, long vs, struct
|
|||
extern void branch_addcmp_lit_lit_instr(int cc, int rd, long va, long vs, struct expr_t* expr);
|
||||
extern void lea_stack_instr(int rd, long va, int rs);
|
||||
extern void lea_address_instr(int rd, struct expr_t* expr);
|
||||
extern void fltcnv_instr(quad opcode, int cc, int rd, int ra, quad shift);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
%token <y_word> OP_MEM
|
||||
%token <y_word> OP_MISC
|
||||
%token <y_word> OP_MISCL
|
||||
%token <y_word> OP_FLTCNV
|
||||
%token <y_word> OP_STACK
|
||||
%token <y_word> OP_LEA
|
||||
|
||||
|
|
|
@ -130,6 +130,11 @@
|
|||
0, OP_MISC, B16(11001001,11100000), "exp2",
|
||||
0, OP_MISC, B16(11000101,11100000), "adds256",
|
||||
|
||||
0, OP_FLTCNV, B16(11001010,00000000), "ftrunc",
|
||||
0, OP_FLTCNV, B16(11001010,00100000), "floor",
|
||||
0, OP_FLTCNV, B16(11001010,01000000), "flts",
|
||||
0, OP_FLTCNV, B16(11001010,01100000), "fltu",
|
||||
|
||||
0, OP_MISCL, B16(11000100,10000000), "divs",
|
||||
0, OP_MISCL, B16(11000100,11100000), "divu",
|
||||
|
||||
|
|
|
@ -74,5 +74,14 @@ operation
|
|||
|
||||
| OP_LEA GPR ',' absexp '(' GPR ')' { lea_stack_instr($2, $4, $6); }
|
||||
| OP_LEA GPR ',' expr { lea_address_instr($2, &$4); }
|
||||
|
||||
| OP_FLTCNV GPR ',' GPR { fltcnv_instr($1, ALWAYS, $2, $4, 0); }
|
||||
| OP_FLTCNV CC GPR ',' GPR { fltcnv_instr($1, $2, $3, $5, 0); }
|
||||
| OP_FLTCNV GPR ',' GPR ',' shift '#' absexp { fltcnv_instr($1, ALWAYS, $2, $4, $8); }
|
||||
| OP_FLTCNV CC GPR ',' GPR ',' shift '#' absexp { fltcnv_instr($1, $2, $3, $5, $9); }
|
||||
;
|
||||
|
||||
shift
|
||||
: 'l' 's' 'r'
|
||||
| 'l' 's' 'l';
|
||||
|
||||
|
|
|
@ -487,3 +487,13 @@ void lea_address_instr(int rd, struct expr_t* expr)
|
|||
emit4(expr->val - pc);
|
||||
}
|
||||
|
||||
/* Floating point conversion opcodes (ftrunc, floor, flts, fltu). */
|
||||
|
||||
void fltcnv_instr(quad opcode, int cc, int rd, int ra, quad shift)
|
||||
{
|
||||
fitx(shift, 6);
|
||||
|
||||
emit2(opcode | (rd<<0));
|
||||
emit2(B16(00000000,01000000) | (ra<<11) | (cc<<7) | shift);
|
||||
}
|
||||
|
||||
|
|
|
@ -131,8 +131,11 @@ INSTRUCTIONS
|
|||
fadd GPR:wo, GPR:ro, GPR:ro.
|
||||
fcmp GPR:wo, GPR:ro, GPR:ro.
|
||||
fdiv GPR:wo, GPR:ro, GPR:ro.
|
||||
flts GPR:wo, GPR:ro.
|
||||
fltu GPR:wo, GPR:ro.
|
||||
fmul GPR:wo, GPR:ro, GPR:ro.
|
||||
fsub GPR:wo, GPR:ro, GPR:ro.
|
||||
ftrunc GPR:wo, GPR:ro.
|
||||
ld GPR:wo, GPRINC:rw.
|
||||
ld GPR:wo, GPROFFSET+GPRGPR+LABEL:ro.
|
||||
ldb GPR:wo, GPROFFSET+GPRGPR+LABEL:ro.
|
||||
|
@ -1511,36 +1514,32 @@ PATTERNS
|
|||
nop
|
||||
|
||||
pat loc loc cfi $1==$2 && $1==QUAD /* Convert float -> integer */
|
||||
leaving
|
||||
loc 0
|
||||
#if 0
|
||||
cal ".cfi"
|
||||
lfr QUAD
|
||||
#endif
|
||||
with GPR
|
||||
uses reusing %1, REG
|
||||
gen
|
||||
ftrunc %a, %1
|
||||
yields %a
|
||||
|
||||
pat loc loc cfu $1==$2 && $1==QUAD /* Convert float -> unsigned */
|
||||
leaving
|
||||
loc 0
|
||||
#if 0
|
||||
cal ".cfu"
|
||||
lfr QUAD
|
||||
#endif
|
||||
with GPR
|
||||
uses reusing %1, REG
|
||||
gen
|
||||
ftrunc %a, %1
|
||||
yields %a
|
||||
|
||||
pat loc loc cif $1==$2 && $1==QUAD /* Convert integer -> float */
|
||||
leaving
|
||||
loc 0
|
||||
#if 0
|
||||
cal ".cif"
|
||||
lfr QUAD
|
||||
#endif
|
||||
with GPR
|
||||
uses reusing %1, REG
|
||||
gen
|
||||
flts %a, %1
|
||||
yields %a
|
||||
|
||||
pat loc loc cuf $1==$2 && $1==QUAD /* Convert unsigned -> float */
|
||||
leaving
|
||||
loc 0
|
||||
#if 0
|
||||
cal ".cuf"
|
||||
lfr QUAD
|
||||
#endif
|
||||
with GPR
|
||||
uses reusing %1, REG
|
||||
gen
|
||||
fltu %a, %1
|
||||
yields %a
|
||||
|
||||
pat fef /* Split float */
|
||||
leaving
|
||||
|
|
Loading…
Reference in a new issue