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;
|