Add a whole bunch of VC4 opcodes.
--HG-- branch : dtrg-videocore
This commit is contained in:
parent
5378e3fe53
commit
26877d3c4f
6 changed files with 524 additions and 38 deletions
|
@ -4,3 +4,24 @@
|
|||
* This file is redistributable under the terms of the 3-clause BSD license.
|
||||
* See the file 'Copying' in the root of the distribution for the full text.
|
||||
*/
|
||||
|
||||
#include "binary.h"
|
||||
|
||||
#define ALWAYS 14
|
||||
|
||||
extern void alu_instr_reg(unsigned opcode, unsigned cc, unsigned rd,
|
||||
unsigned ra, unsigned rb);
|
||||
|
||||
extern void alu_instr_lit(unsigned opcode, unsigned cc, unsigned rd,
|
||||
unsigned ra, unsigned value);
|
||||
|
||||
extern void misc_instr_reg(unsigned opcode, unsigned cc, unsigned rd,
|
||||
unsigned ra, unsigned rb);
|
||||
|
||||
extern void misc_instr_lit(unsigned opcode, unsigned cc, unsigned rd,
|
||||
unsigned ra, unsigned value);
|
||||
|
||||
extern void branch_instr(unsigned bl, unsigned cc, struct expr_t* expr);
|
||||
|
||||
extern void stack_instr(unsigned opcode, unsigned loreg, unsigned hireg,
|
||||
unsigned extrareg);
|
|
@ -6,13 +6,17 @@
|
|||
*/
|
||||
|
||||
%token <y_word> GPR
|
||||
%token <y_word> CC
|
||||
|
||||
%token <y_word> OP
|
||||
%token <y_word> OP_BRANCH
|
||||
%token <y_word> OP_ONEREG
|
||||
%token <y_word> OP_ONELREG
|
||||
%token <y_word> OP_ALU
|
||||
%token <y_word> OP_FPU
|
||||
%token <y_word> OP_MEM
|
||||
%token <y_word> OP_BREG
|
||||
%token <y_word> OP_MISC
|
||||
%token <y_word> OP_MISCL
|
||||
%token <y_word> OP_STACK
|
||||
|
||||
/* Other token types */
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
* See the file 'Copying' in the root of the distribution for the full text.
|
||||
*/
|
||||
|
||||
#include "binary.h"
|
||||
|
||||
/* Integer registers */
|
||||
|
||||
0, GPR, 0, "r0",
|
||||
|
@ -17,7 +15,6 @@
|
|||
0, GPR, 5, "r5",
|
||||
|
||||
0, GPR, 6, "r6",
|
||||
0, GPR, 6, "fp",
|
||||
0, GPR, 7, "r7",
|
||||
0, GPR, 8, "r8",
|
||||
0, GPR, 9, "r9",
|
||||
|
@ -42,6 +39,7 @@
|
|||
0, GPR, 26, "r26",
|
||||
0, GPR, 26, "lr",
|
||||
0, GPR, 27, "r27",
|
||||
0, GPR, 27, "fp",
|
||||
0, GPR, 28, "r28",
|
||||
0, GPR, 29, "r29",
|
||||
0, GPR, 30, "r30",
|
||||
|
@ -49,13 +47,34 @@
|
|||
0, GPR, 31, "r31",
|
||||
0, GPR, 31, "pc",
|
||||
|
||||
/* Condition codes */
|
||||
|
||||
0, CC, 0, ".eq",
|
||||
0, CC, 1, ".ne",
|
||||
0, CC, 2, ".cs",
|
||||
0, CC, 2, ".lo",
|
||||
0, CC, 3, ".cc",
|
||||
0, CC, 3, ".hg",
|
||||
0, CC, 4, ".mi",
|
||||
0, CC, 5, ".pl",
|
||||
0, CC, 6, ".vs",
|
||||
0, CC, 7, ".vc",
|
||||
0, CC, 8, ".hi",
|
||||
0, CC, 9, ".ls",
|
||||
0, CC, 10, ".ge",
|
||||
0, CC, 11, ".lt",
|
||||
0, CC, 12, ".gt",
|
||||
0, CC, 13, ".le",
|
||||
0, CC, 15, ".f",
|
||||
|
||||
/* Special instructions */
|
||||
|
||||
0, OP, B16(00000000,00000001), "nop",
|
||||
0, OP, B16(00000000,00001010), "rti",
|
||||
|
||||
0, OP_ONEREG, B16(00000000,01000000), "b",
|
||||
0, OP_ONEREG, B16(00000000,01100000), "bl",
|
||||
0, OP_BRANCH, 0, "b",
|
||||
0, OP_BRANCH, 1, "bl",
|
||||
|
||||
0, OP_ONELREG, B16(00000000,10000000), "tbb",
|
||||
0, OP_ONELREG, B16(00000000,10100000), "tbs",
|
||||
|
||||
|
@ -92,4 +111,26 @@
|
|||
0, OP_ALU, B8(00011110), "asr",
|
||||
0, OP_ALU, B8(00011111), "abs",
|
||||
|
||||
0, OP_MISC, B16(11001000,00000000), "fadd",
|
||||
0, OP_MISC, B16(11001000,00100000), "fsub",
|
||||
0, OP_MISC, B16(11001000,01000000), "fmul",
|
||||
0, OP_MISC, B16(11001000,01100000), "fdiv",
|
||||
0, OP_MISC, B16(11001000,10000000), "fcmp",
|
||||
0, OP_MISC, B16(11001000,10100000), "fabs",
|
||||
0, OP_MISC, B16(11001000,11000000), "frsb",
|
||||
0, OP_MISC, B16(11001000,11100000), "fmax",
|
||||
0, OP_MISC, B16(11001001,00000000), "frcp",
|
||||
0, OP_MISC, B16(11001001,00100000), "frsqrt",
|
||||
0, OP_MISC, B16(11001001,01000000), "fnmul",
|
||||
0, OP_MISC, B16(11001001,01100000), "fmin",
|
||||
0, OP_MISC, B16(11001001,10000000), "fld1",
|
||||
0, OP_MISC, B16(11001001,10100000), "fld0",
|
||||
0, OP_MISC, B16(11001001,11000000), "log2",
|
||||
0, OP_MISC, B16(11001001,11100000), "exp2",
|
||||
0, OP_MISC, B16(11000101,11100000), "adds256",
|
||||
|
||||
0, OP_MISCL, B16(11000100,10000000), "divs",
|
||||
0, OP_MISCL, B16(11000100,11100000), "divu",
|
||||
|
||||
0, OP_STACK, B16(00000010,00000000), "push",
|
||||
0, OP_STACK, B16(00000010,10000000), "pop",
|
||||
|
|
|
@ -5,15 +5,12 @@
|
|||
* See the file 'Copying' in the root of the distribution for the full text.
|
||||
*/
|
||||
|
||||
#include "binary.h"
|
||||
|
||||
operation
|
||||
: OP { emit2($1); }
|
||||
|
||||
| OP_ONEREG GPR
|
||||
{
|
||||
emit2($1 | ($2<<0));
|
||||
}
|
||||
| OP_BRANCH GPR { emit2($1 | ($2<<0)); }
|
||||
| OP_BRANCH expr { branch_instr($1, ALWAYS, &$2); }
|
||||
| OP_BRANCH CC expr { branch_instr($1, $2, &$3); }
|
||||
|
||||
| OP_ONELREG GPR
|
||||
{
|
||||
|
@ -22,17 +19,28 @@ operation
|
|||
emit2($1 | ($2<<0));
|
||||
}
|
||||
|
||||
| OP_ALU GPR ',' GPR
|
||||
{
|
||||
emit2(B16(01000000, 00000000) | ($1<<8) | ($2<<0) | ($4<<4));
|
||||
}
|
||||
| OP_ALU GPR ',' GPR { alu_instr_reg($1, ALWAYS, $2, $2, $4); }
|
||||
| OP_ALU GPR ',' GPR ',' GPR { alu_instr_reg($1, ALWAYS, $2, $4, $6); }
|
||||
| OP_ALU CC GPR ',' GPR { alu_instr_reg($1, $2, $3, $3, $5); }
|
||||
| OP_ALU CC GPR ',' GPR ',' GPR { alu_instr_reg($1, $2, $3, $5, $7); }
|
||||
|
||||
| OP_ALU GPR ',' '#' u5
|
||||
{
|
||||
if ($1 >= 0x10)
|
||||
serror("cannot use this ALU operation in 2op form");
|
||||
emit2(B16(01100000, 00000000) | ($1<<9) | ($2<<0) | ($5<<4));
|
||||
}
|
||||
| OP_ALU GPR ',' '#' absexp { alu_instr_lit($1, ALWAYS, $2, $2, $5); }
|
||||
| OP_ALU GPR ',' GPR ',' '#' absexp { alu_instr_lit($1, ALWAYS, $2, $4, $7); }
|
||||
| OP_ALU CC GPR ',' '#' absexp { alu_instr_lit($1, $2, $3, $3, $6); }
|
||||
| OP_ALU CC GPR ',' GPR ',' '#' absexp { alu_instr_lit($1, $2, $3, $5, $8); }
|
||||
|
||||
| OP_MISC GPR ',' GPR ',' GPR { misc_instr_reg($1, ALWAYS, $2, $4, $6); }
|
||||
| OP_MISC CC GPR ',' GPR ',' GPR { misc_instr_reg($1, $2, $3, $5, $7); }
|
||||
|
||||
| OP_MISCL GPR ',' GPR ',' GPR { misc_instr_reg($1, ALWAYS, $2, $4, $6); }
|
||||
| OP_MISCL CC GPR ',' GPR ',' GPR { misc_instr_reg($1, $2, $3, $5, $7); }
|
||||
| OP_MISCL GPR ',' GPR ',' '#' absexp { misc_instr_lit($1, ALWAYS, $2, $4, $7); }
|
||||
| OP_MISCL CC GPR ',' GPR ',' '#' absexp { misc_instr_lit($1, $2, $3, $5, $8); }
|
||||
|
||||
| OP_STACK GPR { stack_instr($1, $2, $2, -1); }
|
||||
| OP_STACK GPR ',' GPR { stack_instr($1, $2, $2, $4); }
|
||||
| OP_STACK GPR '-' GPR { stack_instr($1, $2, $4, -1); }
|
||||
| OP_STACK GPR '-' GPR ',' GPR { stack_instr($1, $2, $4, $6); }
|
||||
;
|
||||
|
||||
e16
|
||||
|
|
|
@ -5,3 +5,208 @@
|
|||
* See the file 'Copying' in the root of the distribution for the full text.
|
||||
*/
|
||||
|
||||
/* Assemble an ALU instruction where rb is a register. */
|
||||
|
||||
void alu_instr_reg(unsigned op, unsigned cc,
|
||||
unsigned rd, unsigned ra, unsigned rb)
|
||||
{
|
||||
/* Can we use short form? */
|
||||
|
||||
if ((cc == ALWAYS) && (ra == rd))
|
||||
{
|
||||
emit2(B16(01000000,00000000) | (op<<8) | (rb<<4) | (rd<<0));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Long form, then. */
|
||||
|
||||
emit2(B16(11000000,00000000) | (op<<5) | (rd<<0));
|
||||
emit2(B16(00000000,00000000) | (ra<<11) | (cc<<7) | (rb<<0));
|
||||
}
|
||||
|
||||
/* Assemble an ALU instruction where rb is a literal. */
|
||||
|
||||
void alu_instr_lit(unsigned op, unsigned cc,
|
||||
unsigned rd, unsigned ra, unsigned value)
|
||||
{
|
||||
/* 16 bit short form? */
|
||||
|
||||
if ((cc == ALWAYS) && !(op & 1) && (value <= 0x1f) && (ra == rd) &&
|
||||
!(ra & 0x10))
|
||||
{
|
||||
emit2(B16(01100000,00000000) | (op<<8) | (value<<4) | (rd<<0));
|
||||
return;
|
||||
}
|
||||
|
||||
/* 32 bit medium form? */
|
||||
|
||||
if (value >= 0x1f)
|
||||
{
|
||||
emit2(B16(11000000,00000000) | (op<<5) | (rd<<0));
|
||||
emit2(B16(00000000,01000000) | (ra<<11) | (cc<<7) | (value<<0));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Long form, then. */
|
||||
|
||||
if (cc != ALWAYS)
|
||||
serror("cannot use condition codes with ALU literals this big");
|
||||
|
||||
/* add is special. */
|
||||
|
||||
if (op == B8(00000010))
|
||||
emit2(B16(11101100,00000000) | (ra<<5) | (rd<<0));
|
||||
else
|
||||
{
|
||||
if (ra != rd)
|
||||
serror("can only use 2op form of ALU instructions with literals this big");
|
||||
emit2(B16(11101000,00000000) | (op<<5) | (rd<<0));
|
||||
}
|
||||
|
||||
emit4(value);
|
||||
}
|
||||
|
||||
/* Miscellaneous instructions with three registers and a cc. */
|
||||
|
||||
void misc_instr_reg(unsigned op, unsigned cc,
|
||||
unsigned rd, unsigned ra, unsigned rb)
|
||||
{
|
||||
emit2(op | (rd<<0));
|
||||
emit2(B16(00000000,00000000) | (ra<<11) | (cc<<7) | (rb<<0));
|
||||
}
|
||||
|
||||
/* Miscellaneous instructions with two registers, a literal, and a cc. */
|
||||
|
||||
void misc_instr_lit(unsigned op, unsigned cc,
|
||||
unsigned rd, unsigned ra, unsigned value)
|
||||
{
|
||||
if (value < 0x1f)
|
||||
serror("only constants from 0..31 can be used here");
|
||||
|
||||
emit2(op | (rd<<0));
|
||||
emit2(B16(00000000,01000000) | (ra<<11) | (cc<<7) | (value<<0));
|
||||
}
|
||||
|
||||
/* Assemble a branch instruction. This may be a near branch into this
|
||||
* object file, or a far branch which requires a fixup. */
|
||||
|
||||
void branch_instr(unsigned bl, unsigned cc, struct expr_t* expr)
|
||||
{
|
||||
unsigned type = expr->typ & S_TYP;
|
||||
|
||||
/* Sanity checking. */
|
||||
|
||||
if (bl && (cc != ALWAYS))
|
||||
serror("can't use condition codes with bl");
|
||||
if (type == S_ABS)
|
||||
serror("can't use absolute addresses here");
|
||||
|
||||
switch (pass)
|
||||
{
|
||||
case 0:
|
||||
/* Calculate size of instructions only. For now we just assume
|
||||
* that they're going to be the maximum size, 32 bits. */
|
||||
|
||||
emit4(0);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 2:
|
||||
{
|
||||
/* The VC4 branch instructions express distance in 2-byte
|
||||
* words. */
|
||||
|
||||
int d = (expr->val - DOTVAL) / 2;
|
||||
|
||||
/* We now know the worst case for the instruction layout. At
|
||||
* this point we can emit the instructions, which may shrink
|
||||
* the code. */
|
||||
|
||||
if (!bl && (type == DOTTYP))
|
||||
{
|
||||
/* This is a reference to code within this section. If it's
|
||||
* close enough to the program counter, we can use a short-
|
||||
* form instruction. */
|
||||
|
||||
if ((d >= -128) && (d < 127))
|
||||
{
|
||||
emit2(B16(00011000,00000000) | (cc<<7) | (d&0x7f));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Absolute addresses and references to other sections
|
||||
* need the full 32 bits. */
|
||||
|
||||
newrelo(expr->typ, RELOVC4 | RELPC);
|
||||
|
||||
if (bl)
|
||||
{
|
||||
unsigned v = d & 0x07ffffff;
|
||||
unsigned hiv = v >> 23;
|
||||
unsigned lov = v & 0x007fffff;
|
||||
emit2(B16(10010000,10000000) | (lov>>16) | (hiv<<8));
|
||||
emit2(B16(00000000,00000000) | (lov&0xffff));
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned v = d & 0x007fffff;
|
||||
emit2(B16(10010000,00000000) | (cc<<8) | (v>>16));
|
||||
emit2(B16(00000000,00000000) | (v&0xffff));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void stack_instr(unsigned opcode, unsigned loreg, unsigned hireg,
|
||||
unsigned extrareg)
|
||||
{
|
||||
unsigned b;
|
||||
|
||||
switch (loreg)
|
||||
{
|
||||
case 0: b = 0; break;
|
||||
case 6: b = 1; break;
|
||||
case 16: b = 2; break;
|
||||
case 24: b = 3; break;
|
||||
|
||||
case 26: /* lr */
|
||||
extrareg = 26;
|
||||
hireg = 31;
|
||||
loreg = 0;
|
||||
b = 0;
|
||||
break;
|
||||
|
||||
case 31: /* pc */
|
||||
extrareg = 31;
|
||||
hireg = 31;
|
||||
loreg = 0;
|
||||
b = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
serror("base register for push or pop may be only r0, r6, r16, r24, lr or pc");
|
||||
}
|
||||
|
||||
if (opcode & 0x0080)
|
||||
{
|
||||
/* Pop */
|
||||
if (extrareg == 26)
|
||||
serror("cannot pop lr");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Push */
|
||||
if (extrareg == 31)
|
||||
serror("cannot push pc");
|
||||
}
|
||||
|
||||
if (hireg < loreg)
|
||||
serror("invalid register range");
|
||||
|
||||
emit2(opcode | (b<<5) | (hireg<<0) |
|
||||
((extrareg != -1) ? 0x0100 : 0));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -25,6 +25,8 @@ main:
|
|||
tbs r0
|
||||
tbs r15
|
||||
|
||||
nop
|
||||
|
||||
mov r0, r1
|
||||
cmn r0, r1
|
||||
add r0, r1
|
||||
|
@ -58,20 +60,225 @@ main:
|
|||
asr r0, r1
|
||||
abs r0, r1
|
||||
|
||||
mov r0, #31
|
||||
cmn r0, #31
|
||||
add r0, #31
|
||||
bic r0, #31
|
||||
mul r0, #31
|
||||
eor r0, #31
|
||||
sub r0, #31
|
||||
and r0, #31
|
||||
mvn r0, #31
|
||||
ror r0, #31
|
||||
cmp r0, #31
|
||||
rsb r0, #31
|
||||
btst r0, #31
|
||||
or r0, #31
|
||||
extu r0, #31
|
||||
max r0, #31
|
||||
nop
|
||||
|
||||
mov.f r0, r1
|
||||
cmn.f r0, r1
|
||||
add.f r0, r1
|
||||
bic.f r0, r1
|
||||
mul.f r0, r1
|
||||
eor.f r0, r1
|
||||
sub.f r0, r1
|
||||
and.f r0, r1
|
||||
mvn.f r0, r1
|
||||
ror.f r0, r1
|
||||
cmp.f r0, r1
|
||||
rsb.f r0, r1
|
||||
btst.f r0, r1
|
||||
or.f r0, r1
|
||||
extu.f r0, r1
|
||||
max.f r0, r1
|
||||
bset.f r0, r1
|
||||
min.f r0, r1
|
||||
bclr.f r0, r1
|
||||
adds2.f r0, r1
|
||||
bchg.f r0, r1
|
||||
adds4.f r0, r1
|
||||
adds8.f r0, r1
|
||||
adds16.f r0, r1
|
||||
exts.f r0, r1
|
||||
neg.f r0, r1
|
||||
lsr.f r0, r1
|
||||
clz.f r0, r1
|
||||
lsl.f r0, r1
|
||||
brev.f r0, r1
|
||||
asr.f r0, r1
|
||||
abs.f r0, r1
|
||||
|
||||
nop
|
||||
|
||||
mov r0, r1, r2
|
||||
cmn r0, r1, r2
|
||||
add r0, r1, r2
|
||||
bic r0, r1, r2
|
||||
mul r0, r1, r2
|
||||
eor r0, r1, r2
|
||||
sub r0, r1, r2
|
||||
and r0, r1, r2
|
||||
mvn r0, r1, r2
|
||||
ror r0, r1, r2
|
||||
cmp r0, r1, r2
|
||||
rsb r0, r1, r2
|
||||
btst r0, r1, r2
|
||||
or r0, r1, r2
|
||||
extu r0, r1, r2
|
||||
max r0, r1, r2
|
||||
bset r0, r1, r2
|
||||
min r0, r1, r2
|
||||
bclr r0, r1, r2
|
||||
adds2 r0, r1, r2
|
||||
bchg r0, r1, r2
|
||||
adds4 r0, r1, r2
|
||||
adds8 r0, r1, r2
|
||||
adds16 r0, r1, r2
|
||||
exts r0, r1, r2
|
||||
neg r0, r1, r2
|
||||
lsr r0, r1, r2
|
||||
clz r0, r1, r2
|
||||
lsl r0, r1, r2
|
||||
brev r0, r1, r2
|
||||
asr r0, r1, r2
|
||||
abs r0, r1, r2
|
||||
|
||||
nop
|
||||
|
||||
mov r0, #0x1f
|
||||
cmn r0, #0x1f
|
||||
add r0, #0x1f
|
||||
bic r0, #0x1f
|
||||
mul r0, #0x1f
|
||||
eor r0, #0x1f
|
||||
sub r0, #0x1f
|
||||
and r0, #0x1f
|
||||
mvn r0, #0x1f
|
||||
ror r0, #0x1f
|
||||
cmp r0, #0x1f
|
||||
rsb r0, #0x1f
|
||||
btst r0, #0x1f
|
||||
or r0, #0x1f
|
||||
extu r0, #0x1f
|
||||
max r0, #0x1f
|
||||
bset r0, #0x1f
|
||||
min r0, #0x1f
|
||||
bclr r0, #0x1f
|
||||
adds2 r0, #0x1f
|
||||
bchg r0, #0x1f
|
||||
adds4 r0, #0x1f
|
||||
adds8 r0, #0x1f
|
||||
adds16 r0, #0x1f
|
||||
exts r0, #0x1f
|
||||
neg r0, #0x1f
|
||||
lsr r0, #0x1f
|
||||
clz r0, #0x1f
|
||||
lsl r0, #0x1f
|
||||
brev r0, #0x1f
|
||||
asr r0, #0x1f
|
||||
abs r0, #0x1f
|
||||
|
||||
nop
|
||||
|
||||
mov.f r0, #0x1f
|
||||
cmn.f r0, #0x1f
|
||||
add.f r0, #0x1f
|
||||
bic.f r0, #0x1f
|
||||
mul.f r0, #0x1f
|
||||
eor.f r0, #0x1f
|
||||
sub.f r0, #0x1f
|
||||
and.f r0, #0x1f
|
||||
mvn.f r0, #0x1f
|
||||
ror.f r0, #0x1f
|
||||
cmp.f r0, #0x1f
|
||||
rsb.f r0, #0x1f
|
||||
btst.f r0, #0x1f
|
||||
or.f r0, #0x1f
|
||||
extu.f r0, #0x1f
|
||||
max.f r0, #0x1f
|
||||
bset.f r0, #0x1f
|
||||
min.f r0, #0x1f
|
||||
bclr.f r0, #0x1f
|
||||
adds2.f r0, #0x1f
|
||||
bchg.f r0, #0x1f
|
||||
adds4.f r0, #0x1f
|
||||
adds8.f r0, #0x1f
|
||||
adds16.f r0, #0x1f
|
||||
exts.f r0, #0x1f
|
||||
neg.f r0, #0x1f
|
||||
lsr.f r0, #0x1f
|
||||
clz.f r0, #0x1f
|
||||
lsl.f r0, #0x1f
|
||||
brev.f r0, #0x1f
|
||||
asr.f r0, #0x1f
|
||||
abs.f r0, #0x1f
|
||||
|
||||
add r0, #0x12345678
|
||||
add r0, r1, #0x12345678
|
||||
sub r0, #0x12345678
|
||||
|
||||
nop
|
||||
|
||||
fadd r0, r1, r2
|
||||
fsub r0, r1, r2
|
||||
fmul r0, r1, r2
|
||||
fdiv r0, r1, r2
|
||||
fcmp r0, r1, r2
|
||||
fabs r0, r1, r2
|
||||
frsb r0, r1, r2
|
||||
fmax r0, r1, r2
|
||||
frcp r0, r1, r2
|
||||
frsqrt r0, r1, r2
|
||||
fnmul r0, r1, r2
|
||||
fmin r0, r1, r2
|
||||
fld1 r0, r1, r2
|
||||
fld0 r0, r1, r2
|
||||
log2 r0, r1, r2
|
||||
exp2 r0, r1, r2
|
||||
divs r0, r1, r2
|
||||
divu r0, r1, r2
|
||||
divs r0, r1, #31
|
||||
divu r0, r1, #31
|
||||
adds256 r0, r1, r2
|
||||
|
||||
nop
|
||||
|
||||
fadd.f r0, r1, r2
|
||||
fsub.f r0, r1, r2
|
||||
fmul.f r0, r1, r2
|
||||
fdiv.f r0, r1, r2
|
||||
fcmp.f r0, r1, r2
|
||||
fabs.f r0, r1, r2
|
||||
frsb.f r0, r1, r2
|
||||
fmax.f r0, r1, r2
|
||||
frcp.f r0, r1, r2
|
||||
frsqrt.f r0, r1, r2
|
||||
fnmul.f r0, r1, r2
|
||||
fmin.f r0, r1, r2
|
||||
fld1.f r0, r1, r2
|
||||
fld0.f r0, r1, r2
|
||||
log2.f r0, r1, r2
|
||||
exp2.f r0, r1, r2
|
||||
divs.f r0, r1, r2
|
||||
divu.f r0, r1, r2
|
||||
divs.f r0, r1, #31
|
||||
divu.f r0, r1, #31
|
||||
adds256.f r0, r1, r2
|
||||
|
||||
label:
|
||||
b label
|
||||
b forward
|
||||
b label
|
||||
b main
|
||||
b.f label
|
||||
b.f forward
|
||||
b.f main
|
||||
bl label
|
||||
bl forward
|
||||
bl main
|
||||
forward:
|
||||
|
||||
push r0
|
||||
push r0, lr
|
||||
push r0-r5
|
||||
push r0-r5, lr
|
||||
push r6
|
||||
push r16
|
||||
push r24
|
||||
push lr
|
||||
|
||||
pop r0
|
||||
pop r0, pc
|
||||
pop r0-r5
|
||||
pop r0-r5, pc
|
||||
pop r6
|
||||
pop r16
|
||||
pop r24
|
||||
pop pc
|
||||
|
|
Loading…
Reference in a new issue