OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /thor/trunk/FT64v5/software/AS64/source
    from Rev 48 to Rev 50
    Reverse comparison

Rev 48 → Rev 50

/FT64.cpp
1345,7 → 1345,7
need(',');
NextToken();
val = expr();
if (opcode6==0x05LL) { // subi
if (opcode6==-4LL) { // subi
val = -val;
opcode6 = 0x04LL; // change to addi
}
1629,7 → 1629,7
// add r1,r2,r3
// ---------------------------------------------------------------------------
 
static void process_rrop(int64_t funct6)
static void process_rrop(int64_t funct6, int64_t iop)
{
int Ra,Rb,Rt,Rbp,Rtp;
char *p;
1644,8 → 1644,10
need(',');
NextToken();
if (token=='#') {
if (iop < 0 && iop!=-4)
printf("Immediate mode not supported (%d).", lineno);
inptr = p;
process_riop(funct6);
process_riop(iop);
return;
}
prevToken();
2706,7 → 2708,7
emit_insn(
(2 << 12) |
(((val >> 4) & 0x0F) << 8) |
(2 << 7) |
(2 << 6) |
(((val >> 3) & 1) << 5),
0, 2
);
3452,7 → 3454,7
// lw r1,[r2+r3]
// ----------------------------------------------------------------------------
 
static void ProcessLoadVolatile(int opcode3)
static void ProcessLoadVolatile(int64_t opcode, int sz)
{
int Ra,Rb;
int Rt;
3474,37 → 3476,63
expect(',');
mem_operand(&disp, &Ra, &Rb, &Sc);
if (Ra > 0 && Rb > 0) {
switch (sz) {
case -1: opcode = 0x01; // LVBUX
case 1: opcode = 0x00; // LVBX
case -2: opcode = 0x03; // LVCUX
case 2: opcode = 0x02; // LVCX
case -4: opcode = 0x05; // LVHUX
case 4: opcode = 0x04; // LVHX
case 8: opcode = 0x06; // LVWX
}
emit_insn(
(0x3B << 26) |
(opcode3 << 23) |
(Sc << 21) |
(Rt << 16) |
(Rb << 11) |
(Ra << 6) |
0x02,!expand_flag,4);
(opcode << 26) |
(Sc << 23) |
(Rt << 18) |
(Rb << 13) |
(Ra << 8) |
0x16,!expand_flag,4);
return;
}
if (Ra < 0) Ra = 0;
val = disp;
if (val < -2048 || val > 2047) {
LoadConstant12(val,23);
if (!IsNBit(val, 30)) {
LoadConstant(val, 23);
// Change to indexed addressing
switch (sz) {
case -1: opcode = 0x01; // LVBUX
case 1: opcode = 0x00; // LVBX
case -2: opcode = 0x03; // LVCUX
case 2: opcode = 0x02; // LVCX
case -4: opcode = 0x05; // LVHUX
case 4: opcode = 0x04; // LVHX
case 8: opcode = 0x06; // LVWX
}
emit_insn(
(0x3B << 26) |
(opcode3 << 23) |
(Rt << 16) |
(23 << 11) |
(Ra << 6) |
0x02,!expand_flag,4);
(opcode << 26LL) |
(0 << 23) | // Sc = 0
(Rt << 18) |
(23 << 13) |
(Ra << 8) |
0x02, !expand_flag, 4);
ScanToEOL();
return;
}
if (!IsNBit(val, 14)) {
emit_insn(
((val | abs(sz)) << 18LL) |
(Rt << 13) |
(Ra << 8) |
(1 << 6) |
opcode, !expand_flag, 6);
ScanToEOL();
return;
}
emit_insn(
(opcode3 << 28) |
((val & 0xFFF) << 16) |
(Rt << 11) |
(Ra << 6) |
0x3B,!expand_flag,4);
((val | abs(sz)) << 18LL) |
(Rt << 13) |
(Ra << 8) |
opcode, !expand_flag, 4);
ScanToEOL();
}
 
3795,7 → 3823,8
return;
}
emit_insn(
(fn << 26LL) |
(fn << 26LL) | // fn should be even
(((rgs >> 5) & 1) << 26) |
(d3 << 23LL) |
(rgs << 18) |
(Rt << 13) |
4409,10 → 4438,10
// case tk_add: process_add(); break;
// case tk_abs: process_rop(0x04); break;
case tk_abs: process_rop(0x01); break;
case tk_add: process_rrop(0x04); break;
case tk_add: process_rrop(0x04,0x04); break;
case tk_addi: process_riop(0x04); break;
case tk_align: process_align(); continue; break;
case tk_and: process_rrop(0x08); break;
case tk_and: process_rrop(0x08,0x08); break;
case tk_andi: process_riop(0x08); break;
case tk_asl: process_shift(0x2); break;
case tk_asr: process_shift(0x3); break;
4456,10 → 4485,10
case tk_cli: emit_insn(0xC0000002,0,4); break;
case tk_chk: process_chk(0x34); break;
case tk_cmovenz: process_cmove(0x29); break;
case tk_cmp: process_rrop(0x06); break;
case tk_cmpi: process_riop(0x06); break;
case tk_cmpu: process_rrop(0x07); break;
case tk_cmpui: process_riop(0x07); break;
//case tk_cmp: process_rrop(0x06); break;
//case tk_cmpi: process_riop(0x06); break;
//case tk_cmpu: process_rrop(0x07); break;
//case tk_cmpui: process_riop(0x07); break;
case tk_code: process_code(); break;
case tk_com: process_com(); break;
case tk_csrrc: process_csrrw(0x3); break;
4483,12 → 4512,14
case tk_dec: process_inc(0x25); break;
case tk_dh: process_dh(); break;
case tk_dh_htbl: process_dh_htbl(); break;
case tk_div: process_riop(0x3E); break;
case tk_dw: process_dw(); break;
case tk_div: process_rrop(0x3E,0x3E); break;
//case tk_divsu: process_rrop(0x3D, -1); break;
case tk_divu: process_rrop(0x3C,0x3C); break;
case tk_dw: process_dw(); break;
case tk_end: goto j1;
case tk_end_expand: expandedBlock = 0; break;
case tk_endpublic: break;
case tk_eor: process_rrrop(0x0A); break;
case tk_eor: process_rrop(0x0A,0x0A); break;
case tk_eori: process_riop(0x0A); break;
case tk_extern: process_extern(); break;
case tk_ftoi: process_ftoi(0x12); break;
4525,25 → 4556,30
case tk_lhu: process_load(0x20,-2); break;
//case tk_lui: process_lui(0x27); break;
case tk_lv: process_lv(0x36); break;
case tk_lvb: ProcessLoadVolatile(0); break;
case tk_lvc: ProcessLoadVolatile(2); break;
case tk_lvh: ProcessLoadVolatile(4); break;
case tk_lvw: ProcessLoadVolatile(6); break;
case tk_lvb: ProcessLoadVolatile(0x3B,1); break;
case tk_lvbu: ProcessLoadVolatile(0x3B,-1); break;
case tk_lvc: ProcessLoadVolatile(0x3B,2); break;
case tk_lvcu: ProcessLoadVolatile(0x3B,-2); break;
case tk_lvh: ProcessLoadVolatile(0x3B,4); break;
case tk_lvhu: ProcessLoadVolatile(0x3B,-4); break;
case tk_lvw: ProcessLoadVolatile(0x3B,8); break;
case tk_lw: process_load(0x20,4); break;
case tk_lwr: process_load(0x1D,0); break;
case tk_memdb: emit_insn(0x40100002,0,4); break;
case tk_memsb: emit_insn(0x40110002,0,4); break;
case tk_memdb: emit_insn(0x04400002,0,4); break;
case tk_memsb: emit_insn(0x04440002,0,4); break;
case tk_message: process_message(); break;
case tk_mod: process_riop(0x2E); break;
case tk_modu: process_riop(0x2C); break;
case tk_mod: process_rrop(0x16,0x2E); break;
case tk_modu: process_rrop(0x14,-1); break;
case tk_mov: process_mov(0x02, 0x22); break;
case tk_mul: process_riop(0x3A); break;
case tk_mulu: process_riop(0x38); break;
case tk_neg: process_neg(); break;
case tk_mul: process_rrop(0x3A,0x3A); break;
//case tk_mulh: process_rrop(0x26, 0x3A); break;
case tk_mulu: process_rrop(0x38,0x38); break;
//case tk_muluh: process_rrop(0x24, 0x38); break;
case tk_neg: process_neg(); break;
case tk_nop: emit_insn(0x1C,0,4); break;
case tk_not: process_rop(0x05); break;
// case tk_not: process_rop(0x07); break;
case tk_or: process_rrop(0x09); break;
case tk_or: process_rrop(0x09,0x09); break;
case tk_ori: process_riop(0x09); break;
case tk_org: process_org(); break;
case tk_plus: expand_flag = 1; break;
4595,7 → 4631,7
case tk_slli: process_shifti(0x8); break;
case tk_srai: process_shifti(0xB); break;
case tk_srli: process_shifti(0x9); break;
case tk_sub: process_rrop(0x05); break;
case tk_sub: process_rrop(0x05,-0x04); break;
case tk_subi: process_riop(0x05); break;
case tk_sv: process_sv(0x37); break;
case tk_sw: process_store(0x24,4); break;
4605,7 → 4641,7
case tk_sxb: process_rop(0x1A); break;
case tk_sxc: process_rop(0x19); break;
case tk_sxh: process_rop(0x18); break;
case tk_sync: emit_insn(0x04120002,0,4); break;
case tk_sync: emit_insn(0x04480002,0,4); break;
//case tk_unlink: emit_insn((0x1B << 26) | (0x1F << 16) | (30 << 11) | (0x1F << 6) | 0x02,0,4); break;
case tk_vadd: process_vrrop(0x04); break;
case tk_vadds: process_vsrrop(0x14); break;
4622,8 → 4658,8
case tk_vsubs: process_vsrrop(0x15); break;
case tk_vxor: process_vrrop(0x0A); break;
case tk_vxors: process_vsrrop(0x1A); break;
case tk_xnor: process_rrop(0x0E); break;
case tk_xor: process_rrop(0x0A); break;
case tk_xnor: process_rrop(0x0E,0x0E); break;
case tk_xor: process_rrop(0x0A,0x0A); break;
case tk_xori: process_riop(0x0A); break;
case tk_zxb: process_rop(0x0A); break;
case tk_zxc: process_rop(0x09); break;
/token.cpp
1796,20 → 1796,41
return (token = tk_lwr);
}
}
if (gCpu==4) {
if (gCpu==4 || gCpu=='F') {
if ((inptr[1]=='v' || inptr[1]=='V') && (inptr[2]=='b' || inptr[2]=='B') && isspace(inptr[3])) {
inptr += 3;
return token = tk_lvb;
}
if ((inptr[1]=='v' || inptr[1]=='V') && (inptr[2]=='c' || inptr[2]=='C') && isspace(inptr[3])) {
if ((inptr[1] == 'v' || inptr[1] == 'V')
&& (inptr[2] == 'b' || inptr[2] == 'B')
&& (inptr[3] == 'u' || inptr[3] == 'U')
&& isspace(inptr[4])) {
inptr += 4;
return token = tk_lvbu;
}
if ((inptr[1]=='v' || inptr[1]=='V') && (inptr[2]=='c' || inptr[2]=='C') && isspace(inptr[3])) {
inptr += 3;
return token = tk_lvc;
}
if ((inptr[1]=='v' || inptr[1]=='V') && (inptr[2]=='h' || inptr[2]=='H') && isspace(inptr[3])) {
if ((inptr[1] == 'v' || inptr[1] == 'V')
&& (inptr[2] == 'c' || inptr[2] == 'C')
&& (inptr[3] == 'u' || inptr[3] == 'U')
&& isspace(inptr[4])) {
inptr += 4;
return token = tk_lvcu;
}
if ((inptr[1]=='v' || inptr[1]=='V') && (inptr[2]=='h' || inptr[2]=='H') && isspace(inptr[3])) {
inptr += 3;
return token = tk_lvh;
}
if ((inptr[1]=='v' || inptr[1]=='V') && (inptr[2]=='w' || inptr[2]=='W') && isspace(inptr[3])) {
if ((inptr[1] == 'v' || inptr[1] == 'V')
&& (inptr[2] == 'h' || inptr[2] == 'H')
&& (inptr[3] == 'u' || inptr[3] == 'U')
&& isspace(inptr[4])) {
inptr += 4;
return token = tk_lvhu;
}
if ((inptr[1]=='v' || inptr[1]=='V') && (inptr[2]=='w' || inptr[2]=='W') && isspace(inptr[3])) {
inptr += 3;
return token = tk_lvw;
}
1978,7 → 1999,7
inptr += 6;
return token = tk_mv2fix;
}
if (gCpu==4) {
if (gCpu==4 || gCpu=='F') {
if ((inptr[1]=='e' || inptr[1]=='E') &&
(inptr[2]=='m' || inptr[2]=='M') &&
(inptr[3]=='d' || inptr[3]=='D') &&
/token.h
256,8 → 256,11
tk_lui,
tk_lv,
tk_lvb,
tk_lvbu,
tk_lvc,
tk_lvcu,
tk_lvh,
tk_lvhu,
tk_lvw,
tk_lvwar,
tk_lw,
277,6 → 280,7
tk_mfspr,
tk_mod,
tk_modi,
tk_modsu,
tk_modu,
tk_modui,
tk_mov,
283,8 → 287,12
tk_mtfp,
tk_mtspr,
tk_mul,
tk_mulh,
tk_muli, //290
tk_mulsu,
tk_mulsuh,
tk_mulu,
tk_muluh,
tk_mului,
tk_mv2fix,
tk_mv2flt,

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.