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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [software/] [AS64/] [source/] [FT64.cpp] - Diff between revs 48 and 50

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 48 Rev 50
Line 1343... Line 1343...
    need(',');
    need(',');
    Ra = getRegisterX();
    Ra = getRegisterX();
    need(',');
    need(',');
    NextToken();
    NextToken();
    val = expr();
    val = expr();
        if (opcode6==0x05LL)    { // subi
        if (opcode6==-4LL)      { // subi
                val = -val;
                val = -val;
                opcode6 = 0x04LL;       // change to addi
                opcode6 = 0x04LL;       // change to addi
        }
        }
        // ADDI
        // ADDI
        if (opcode6 == 0x04) {
        if (opcode6 == 0x04) {
Line 1627... Line 1627...
 
 
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// add r1,r2,r3
// 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;
    int Ra,Rb,Rt,Rbp,Rtp;
    char *p;
    char *p;
        int sz = 3;
        int sz = 3;
 
 
Line 1642... Line 1642...
    need(',');
    need(',');
    Ra = getRegisterX();
    Ra = getRegisterX();
    need(',');
    need(',');
    NextToken();
    NextToken();
    if (token=='#') {
    if (token=='#') {
 
                if (iop < 0 && iop!=-4)
 
                        printf("Immediate mode not supported (%d).", lineno);
        inptr = p;
        inptr = p;
        process_riop(funct6);
        process_riop(iop);
        return;
        return;
    }
    }
    prevToken();
    prevToken();
    Rb = getRegisterX();
    Rb = getRegisterX();
        // Compress ADD
        // Compress ADD
Line 2704... Line 2706...
        // Compress ?
        // Compress ?
        if (val >= 0 && val < 256) {
        if (val >= 0 && val < 256) {
                emit_insn(
                emit_insn(
                        (2 << 12) |
                        (2 << 12) |
                        (((val >> 4) & 0x0F) << 8) |
                        (((val >> 4) & 0x0F) << 8) |
                        (2 << 7) |
                        (2 << 6) |
                        (((val >> 3) & 1) << 5),
                        (((val >> 3) & 1) << 5),
                        0, 2
                        0, 2
                );
                );
                return;
                return;
        }
        }
Line 3450... Line 3452...
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// lw r1,disp[r2]
// lw r1,disp[r2]
// lw r1,[r2+r3]
// lw r1,[r2+r3]
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
 
 
static void ProcessLoadVolatile(int opcode3)
static void ProcessLoadVolatile(int64_t opcode, int sz)
{
{
    int Ra,Rb;
    int Ra,Rb;
    int Rt;
    int Rt;
        int Sc;
        int Sc;
    char *p;
    char *p;
Line 3472... Line 3474...
        return;
        return;
    }
    }
    expect(',');
    expect(',');
    mem_operand(&disp, &Ra, &Rb, &Sc);
    mem_operand(&disp, &Ra, &Rb, &Sc);
        if (Ra > 0 && Rb > 0) {
        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(
                emit_insn(
                        (0x3B << 26) |
                        (opcode << 26) |
                        (opcode3 << 23) |
                        (Sc << 23) |
                        (Sc << 21) |
                        (Rt << 18) |
                        (Rt << 16) |
                        (Rb << 13) |
                        (Rb << 11) |
                        (Ra << 8) |
                        (Ra << 6) |
                        0x16,!expand_flag,4);
                        0x02,!expand_flag,4);
 
                return;
                return;
        }
        }
    if (Ra < 0) Ra = 0;
    if (Ra < 0) Ra = 0;
    val = disp;
    val = disp;
        if (val < -2048 || val > 2047) {
        if (!IsNBit(val, 30)) {
                LoadConstant12(val,23);
                LoadConstant(val, 23);
                // Change to indexed addressing
                // 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(
                emit_insn(
                        (0x3B << 26) |
                        (opcode << 26LL) |
                        (opcode3 << 23) |
                        (0 << 23) |              // Sc = 0
                        (Rt << 16) |
                        (Rt << 18) |
                        (23 << 11) |
                        (23 << 13) |
                        (Ra << 6) |
                        (Ra << 8) |
                        0x02,!expand_flag,4);
                        0x02,!expand_flag,4);
                ScanToEOL();
                ScanToEOL();
                return;
                return;
        }
        }
 
        if (!IsNBit(val, 14)) {
        emit_insn(
        emit_insn(
                (opcode3 << 28) |
                        ((val | abs(sz)) << 18LL) |
                ((val & 0xFFF) << 16) |
                        (Rt << 13) |
                (Rt << 11) |
                        (Ra << 8) |
                (Ra << 6) |
                        (1 << 6) |
                0x3B,!expand_flag,4);
                        opcode, !expand_flag, 6);
 
                ScanToEOL();
 
                return;
 
        }
 
        emit_insn(
 
                ((val | abs(sz)) << 18LL) |
 
                (Rt << 13) |
 
                (Ra << 8) |
 
                opcode, !expand_flag, 4);
    ScanToEOL();
    ScanToEOL();
}
}
 
 
static void process_lv(int opcode6)
static void process_lv(int opcode6)
{
{
Line 3793... Line 3821...
                 0,2);
                 0,2);
                 prevToken();
                 prevToken();
                 return;
                 return;
         }
         }
         emit_insn(
         emit_insn(
                 (fn << 26LL) |
                 (fn << 26LL) | // fn should be even
 
                 (((rgs >> 5) & 1) << 26) |
                 (d3 << 23LL) |
                 (d3 << 23LL) |
                 (rgs << 18) |
                 (rgs << 18) |
                 (Rt << 13) |
                 (Rt << 13) |
                 (Ra << 8) |
                 (Ra << 8) |
                 oc,!expand_flag,4
                 oc,!expand_flag,4
Line 4407... Line 4436...
        switch(token) {
        switch(token) {
        case tk_eol: ProcessEOL(1); break;
        case tk_eol: ProcessEOL(1); break;
//        case tk_add:  process_add(); break;
//        case tk_add:  process_add(); break;
//              case tk_abs:  process_rop(0x04); break;
//              case tk_abs:  process_rop(0x04); break;
                case tk_abs: process_rop(0x01); 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_addi: process_riop(0x04); break;
        case tk_align: process_align(); continue; 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_andi:  process_riop(0x08); break;
        case tk_asl: process_shift(0x2); break;
        case tk_asl: process_shift(0x2); break;
        case tk_asr: process_shift(0x3); break;
        case tk_asr: process_shift(0x3); break;
        case tk_bbc: process_beqi(0x26,1); break;
        case tk_bbc: process_beqi(0x26,1); break;
        case tk_bbs: process_beqi(0x26,0); break;
        case tk_bbs: process_beqi(0x26,0); break;
Line 4454... Line 4483...
                case tk_cache: process_cache(0x1E); break;
                case tk_cache: process_cache(0x1E); break;
                case tk_call:  process_call(0x19); break;
                case tk_call:  process_call(0x19); break;
        case tk_cli: emit_insn(0xC0000002,0,4); break;
        case tk_cli: emit_insn(0xC0000002,0,4); break;
                case tk_chk:  process_chk(0x34); break;
                case tk_chk:  process_chk(0x34); break;
                case tk_cmovenz: process_cmove(0x29); break;
                case tk_cmovenz: process_cmove(0x29); break;
                case tk_cmp:  process_rrop(0x06); break;
                //case tk_cmp:  process_rrop(0x06); break;
                case tk_cmpi:  process_riop(0x06); break;
                //case tk_cmpi:  process_riop(0x06); break;
                case tk_cmpu:  process_rrop(0x07); break;
                //case tk_cmpu:  process_rrop(0x07); break;
                case tk_cmpui:  process_riop(0x07); break;
                //case tk_cmpui:  process_riop(0x07); break;
        case tk_code: process_code(); break;
        case tk_code: process_code(); break;
        case tk_com: process_com(); break;
        case tk_com: process_com(); break;
        case tk_csrrc: process_csrrw(0x3); break;
        case tk_csrrc: process_csrrw(0x3); break;
        case tk_csrrs: process_csrrw(0x2); break;
        case tk_csrrs: process_csrrw(0x2); break;
        case tk_csrrw: process_csrrw(0x1); break;
        case tk_csrrw: process_csrrw(0x1); break;
Line 4481... Line 4510...
                case tk_dbnz: process_dbnz(0x26,3); break;
                case tk_dbnz: process_dbnz(0x26,3); break;
        case tk_dc:  process_dc(); break;
        case tk_dc:  process_dc(); break;
                case tk_dec:    process_inc(0x25); break;
                case tk_dec:    process_inc(0x25); break;
                case tk_dh:  process_dh(); break;
                case tk_dh:  process_dh(); break;
        case tk_dh_htbl:  process_dh_htbl(); break;
        case tk_dh_htbl:  process_dh_htbl(); break;
                case tk_div: process_riop(0x3E); 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_dw:  process_dw(); break;
        case tk_end: goto j1;
        case tk_end: goto j1;
        case tk_end_expand: expandedBlock = 0; break;
        case tk_end_expand: expandedBlock = 0; break;
        case tk_endpublic: 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_eori: process_riop(0x0A); break;
        case tk_extern: process_extern(); break;
        case tk_extern: process_extern(); break;
                case tk_ftoi:   process_ftoi(0x12); break;
                case tk_ftoi:   process_ftoi(0x12); break;
                case tk_fadd:   process_fprrop(0x04); break;
                case tk_fadd:   process_fprrop(0x04); break;
        case tk_fbeq:   process_fbcc(0); break;
        case tk_fbeq:   process_fbcc(0); break;
Line 4523... Line 4554...
                case tk_lf:      process_lsfloat(0x1b,0x00); break;
                case tk_lf:      process_lsfloat(0x1b,0x00); break;
        case tk_lh:  process_load(0x20,2); break;
        case tk_lh:  process_load(0x20,2); break;
        case tk_lhu: process_load(0x20,-2); break;
        case tk_lhu: process_load(0x20,-2); break;
                //case tk_lui: process_lui(0x27); break;
                //case tk_lui: process_lui(0x27); break;
        case tk_lv:  process_lv(0x36); break;
        case tk_lv:  process_lv(0x36); break;
                case tk_lvb: ProcessLoadVolatile(0); break;
                case tk_lvb: ProcessLoadVolatile(0x3B,1); break;
                case tk_lvc: ProcessLoadVolatile(2); break;
                case tk_lvbu: ProcessLoadVolatile(0x3B,-1); break;
                case tk_lvh: ProcessLoadVolatile(4); break;
                case tk_lvc: ProcessLoadVolatile(0x3B,2); break;
                case tk_lvw: ProcessLoadVolatile(6); 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_lw:  process_load(0x20,4); break;
        case tk_lwr:  process_load(0x1D,0); break;
        case tk_lwr:  process_load(0x1D,0); break;
                case tk_memdb: emit_insn(0x40100002,0,4); break;
                case tk_memdb: emit_insn(0x04400002,0,4); break;
                case tk_memsb: emit_insn(0x40110002,0,4); break;
                case tk_memsb: emit_insn(0x04440002,0,4); break;
                case tk_message: process_message(); break;
                case tk_message: process_message(); break;
                case tk_mod: process_riop(0x2E); break;
                case tk_mod: process_rrop(0x16,0x2E); break;
                case tk_modu: process_riop(0x2C); break;
                case tk_modu: process_rrop(0x14,-1); break;
        case tk_mov: process_mov(0x02, 0x22); break;
        case tk_mov: process_mov(0x02, 0x22); break;
                case tk_mul: process_riop(0x3A); break;
                case tk_mul: process_rrop(0x3A,0x3A); break;
                case tk_mulu: process_riop(0x38); 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_neg: process_neg(); break;
        case tk_nop: emit_insn(0x1C,0,4); break;
        case tk_nop: emit_insn(0x1C,0,4); break;
                case tk_not: process_rop(0x05); break;
                case tk_not: process_rop(0x05); break;
//        case tk_not: process_rop(0x07); 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_ori: process_riop(0x09); break;
        case tk_org: process_org(); break;
        case tk_org: process_org(); break;
        case tk_plus: expand_flag = 1; break;
        case tk_plus: expand_flag = 1; break;
        case tk_public: process_public(); break;
        case tk_public: process_public(); break;
        case tk_rodata:
        case tk_rodata:
Line 4593... Line 4629...
                case tk_sltu:   process_setop(0x07); break;
                case tk_sltu:   process_setop(0x07); break;
                //case tk_sne:  process_setiop(0x1B,3); break;
                //case tk_sne:  process_setiop(0x1B,3); break;
        case tk_slli: process_shifti(0x8); break;
        case tk_slli: process_shifti(0x8); break;
                case tk_srai: process_shifti(0xB); break;
                case tk_srai: process_shifti(0xB); break;
        case tk_srli: process_shifti(0x9); 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_subi:  process_riop(0x05); break;
        case tk_sv:  process_sv(0x37); break;
        case tk_sv:  process_sv(0x37); break;
        case tk_sw:  process_store(0x24,4); break;
        case tk_sw:  process_store(0x24,4); break;
        case tk_swc:  process_store(0x17,0); break;
        case tk_swc:  process_store(0x17,0); break;
        case tk_swap: process_rop(0x03); break;
        case tk_swap: process_rop(0x03); break;
                //case tk_swp:  process_storepair(0x27); break;
                //case tk_swp:  process_storepair(0x27); break;
                case tk_sxb: process_rop(0x1A); break;
                case tk_sxb: process_rop(0x1A); break;
                case tk_sxc: process_rop(0x19); break;
                case tk_sxc: process_rop(0x19); break;
                case tk_sxh: process_rop(0x18); 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_unlink: emit_insn((0x1B << 26) | (0x1F << 16) | (30 << 11) | (0x1F << 6) | 0x02,0,4); break;
                case tk_vadd: process_vrrop(0x04); break;
                case tk_vadd: process_vrrop(0x04); break;
                case tk_vadds: process_vsrrop(0x14); break;
                case tk_vadds: process_vsrrop(0x14); break;
                case tk_vand: process_vrrop(0x08); break;
                case tk_vand: process_vrrop(0x08); break;
                case tk_vands: process_vsrrop(0x18); break;
                case tk_vands: process_vsrrop(0x18); break;
Line 4620... Line 4656...
                case tk_vors: process_vsrrop(0x19); break;
                case tk_vors: process_vsrrop(0x19); break;
                case tk_vsub: process_vrrop(0x05); break;
                case tk_vsub: process_vrrop(0x05); break;
                case tk_vsubs: process_vsrrop(0x15); break;
                case tk_vsubs: process_vsrrop(0x15); break;
                case tk_vxor: process_vrrop(0x0A); break;
                case tk_vxor: process_vrrop(0x0A); break;
                case tk_vxors: process_vsrrop(0x1A); break;
                case tk_vxors: process_vsrrop(0x1A); break;
                case tk_xnor: process_rrop(0x0E); break;
                case tk_xnor: process_rrop(0x0E,0x0E); break;
                case tk_xor: process_rrop(0x0A); break;
                case tk_xor: process_rrop(0x0A,0x0A); break;
        case tk_xori: process_riop(0x0A); break;
        case tk_xori: process_riop(0x0A); break;
                case tk_zxb: process_rop(0x0A); break;
                case tk_zxb: process_rop(0x0A); break;
                case tk_zxc: process_rop(0x09); break;
                case tk_zxc: process_rop(0x09); break;
                case tk_zxh: process_rop(0x08); break;
                case tk_zxh: process_rop(0x08); break;
                case tk_id:  process_label(); break;
                case tk_id:  process_label(); break;

powered by: WebSVN 2.1.0

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