URL
https://opencores.org/ocsvn/zipcpu/zipcpu/trunk
Subversion Repositories zipcpu
Compare Revisions
- This comparison shows the changes necessary to convert path
/zipcpu/trunk/sw
- from Rev 125 to Rev 126
- ↔ Reverse comparison
Rev 125 → Rev 126
/zasm/asmdata.cpp
461,6 → 461,33
in = zp.op_lod(m_cond, imm, m_opb, m_opa); |
in = zp.op_lod(m_cond, -1, zp.ZIP_SP, zp.ZIP_PC); |
break; |
case OP_MPY: |
if ((m_opb == zp.ZIP_PC)||(m_opb == zp.ZIP_CC) |
||(m_opa == zp.ZIP_PC)||(m_opa == zp.ZIP_CC)) |
yyerror("MPY does not support PC or CC register operands or results"); |
else if (m_opb == zp.ZIP_Rnone) |
in = zp.op_mpy(m_cond, imm, m_opa); |
else |
in = zp.op_mpy(m_cond, imm, m_opb, m_opa); |
break; |
case OP_MPYUHI: |
if ((m_opb == zp.ZIP_PC)||(m_opb == zp.ZIP_CC) |
||(m_opa == zp.ZIP_PC)||(m_opa == zp.ZIP_CC)) |
yyerror("MPY does not support PC or CC register operands or results"); |
else if (m_opb == zp.ZIP_Rnone) |
in = zp.op_mpyuhi(m_cond, imm, m_opa); |
else |
in = zp.op_mpyuhi(m_cond, imm, m_opb, m_opa); |
break; |
case OP_MPYSHI: |
if ((m_opb == zp.ZIP_PC)||(m_opb == zp.ZIP_CC) |
||(m_opa == zp.ZIP_PC)||(m_opa == zp.ZIP_CC)) |
yyerror("MPY does not support PC or CC register operands or results"); |
else if (m_opb == zp.ZIP_Rnone) |
in = zp.op_mpyshi(m_cond, imm, m_opa); |
else |
in = zp.op_mpyshi(m_cond, imm, m_opb, m_opa); |
break; |
case OP_HALT: in = zp.op_halt(m_cond); break; |
case OP_RTU: in = zp.op_rtu(m_cond); break; |
case OP_BUSY: in = zp.op_busy(m_cond); break; |
/zasm/asmdata.h
57,6 → 57,8
OP_CMP, OP_TST, OP_MOV, OP_LDIHI, OP_LDILO, OP_MPYU, OP_MPYS, OP_ROL, |
OP_SUB, OP_AND, OP_ADD, OP_OR, OP_XOR, |
OP_LSL, OP_ASR, OP_LSR, |
// New multiplies |
OP_MPY, OP_MPYSHI, OP_MPYUHI, |
// New bit-wise operations |
OP_BREV, OP_POPC, |
// New divide instruction |
/zasm/zasm.l
151,6 → 151,9
(?i:fpdiv) { yylval.u_op = OP_FPDIV; return DUALOP; } |
(?i:fpcvt) { yylval.u_op = OP_FPCVT; return DUALOP; } |
(?i:fpint) { yylval.u_op = OP_FPINT; return DUALOP; } |
(?i:mpyshi) { yylval.u_op = OP_MPYSHI; return DUALOP; } |
(?i:mpyuhu) { yylval.u_op = OP_MPYUHI; return DUALOP; } |
(?i:mpy) { yylval.u_op = OP_MPY; return DUALOP; } |
(?i:equ) { return EQU; } |
(?i:fill) { return FILL; } |
(?i:word) { return WORD; } |
/zasm/zparser.cpp
60,6 → 60,17
|((CND&0x07)<<19)|(1<<18)|((B&0x0f)<<14) \ |
| (IMM & 0x03fff)) |
|
#define LONG_MPY |
|
ZPARSER::ZIPIMM ZPARSER::brev(ZIPIMM v) const { |
unsigned r=0, b; |
|
for(b=0; b<32; b++, v>>=1) |
r = (r<<1)|(v&1); |
|
return r; |
} |
|
ZIPI ZPARSER::op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { |
return DBLREGOP(ZIPO_CMP, cnd, imm, b, a); |
} |
118,10 → 129,22
return 0x76800000; |
} |
|
#ifdef LONG_MPY |
ZIPI ZPARSER::op_mpy(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { |
return DBLREGOP(ZIPO_MPY, cnd, imm, b, a); |
} ZIPI ZPARSER::op_mpy(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { |
return IMMOP(ZIPO_MPY, cnd, imm, a); |
} ZIPI ZPARSER::op_ldihi(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { |
ZIPI in = IMMOP(ZIPO_BREV, cnd, brev(imm)&0x0ffff, a); |
return in; |
} |
#else |
ZIPI ZPARSER::op_ldihi(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { |
ZIPI in = IMMOP(ZIPO_LDIHI, cnd, (imm & 0x0ffff), a); |
return in; |
} ZIPI ZPARSER::op_ldilo(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { |
} |
#endif |
ZIPI ZPARSER::op_ldilo(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { |
ZIPI in = IMMOP(ZIPO_LDILO, cnd, (imm & 0x0ffff), a); |
return in; |
} |
/zasm/zparser.h
79,7 → 79,12
ZIPO_FPCVT, ZIPO_FPINT, // 5'h1110x |
} ZIPOP; |
|
#define ZIPO_MPY ZIPO_LDIHI |
#define ZIPO_MPYSHI ZIPO_MPYS |
#define ZIPO_MPYUHI ZIPO_MPYU |
|
ZIPIMM brev(ZIPIMM) const; |
|
ZIPI op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; |
ZIPI op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; |
ZIPI op_cmp(ZIPIMM imm, ZIPREG b, ZIPREG a) const |
110,10 → 115,13
ZIPI op_break(void) const; |
ZIPI op_lock(void) const; |
|
ZIPI op_mpy(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; |
ZIPI op_mpy(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; |
// |
ZIPI op_ldihi(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; |
ZIPI op_ldilo(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; |
ZIPI op_ldihi(ZIPIMM imm, ZIPREG a) const |
{ return op_ldihi(ZIPC_ALWAYS, imm, a); } |
ZIPI op_ldilo(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; |
ZIPI op_ldilo(ZIPIMM imm, ZIPREG a) const |
{ return op_ldilo(ZIPC_ALWAYS, imm, a); } |
|
123,6 → 131,11
{ return op_mpyu(ZIPC_ALWAYS, imm, b, a); } |
ZIPI op_mpyu(ZIPIMM imm, ZIPREG a) const |
{ return op_mpyu(ZIPC_ALWAYS, imm, a); } |
// |
ZIPI op_mpyuhi(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const |
{ return op_mpyu(cnd,imm,b,a); } |
ZIPI op_mpyuhi(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const |
{ return op_mpyu(cnd,imm,a); } |
|
ZIPI op_mpys(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; |
ZIPI op_mpys(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; |
130,6 → 143,11
{ return op_mpys(ZIPC_ALWAYS, imm, b, a); } |
ZIPI op_mpys(ZIPIMM imm, ZIPREG a) const |
{ return op_mpys(ZIPC_ALWAYS, imm, a); } |
// |
ZIPI op_mpyshi(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const |
{ return op_mpys(cnd,imm,b,a); } |
ZIPI op_mpyshi(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const |
{ return op_mpys(cnd,imm,a); } |
|
ZIPI op_rol(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; |
ZIPI op_rol(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; |