some opts
This commit is contained in:
@@ -42,46 +42,34 @@ function ord(c, b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function bw_and(a, b, v, r) {
|
function bw_and(a, b, v, r) {
|
||||||
v = 1; r = 0
|
v = 1; r = 0; a = int(a); b = int(b)
|
||||||
a = int(a)
|
|
||||||
b = int(b)
|
|
||||||
if(a < 0) a += 4294967296
|
if(a < 0) a += 4294967296
|
||||||
if(b < 0) b += 4294967296
|
if(b < 0) b += 4294967296
|
||||||
while(a > 0 || b > 0) {
|
while(a > 0 || b > 0) {
|
||||||
if((a%2) == 1 && (b%2) == 1) r += v
|
if((a%2) == 1 && (b%2) == 1) r += v
|
||||||
a = int(a/2)
|
a = int(a/2); b = int(b/2); v *= 2
|
||||||
b = int(b/2)
|
|
||||||
v *= 2
|
|
||||||
}
|
}
|
||||||
return int(r)
|
return int(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
function bw_or(a, b, v, r) {
|
function bw_or(a, b, v, r) {
|
||||||
v = 1; r = 0
|
v = 1; r = 0; a = int(a); b = int(b)
|
||||||
a = int(a)
|
|
||||||
b = int(b)
|
|
||||||
if(a < 0) a += 4294967296
|
if(a < 0) a += 4294967296
|
||||||
if(b < 0) b += 4294967296
|
if(b < 0) b += 4294967296
|
||||||
while(a > 0 || b > 0) {
|
while(a > 0 || b > 0) {
|
||||||
if((a%2) == 1 || (b%2) == 1) r += v
|
if((a%2) == 1 || (b%2) == 1) r += v
|
||||||
a = int(a/2)
|
a = int(a/2); b = int(b/2); v *= 2
|
||||||
b = int(b/2)
|
|
||||||
v *= 2
|
|
||||||
}
|
}
|
||||||
return int(r)
|
return int(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
function bw_xor(a, b, v, r) {
|
function bw_xor(a, b, v, r) {
|
||||||
v = 1; r = 0
|
v = 1; r = 0; a = int(a); b = int(b)
|
||||||
a = int(a)
|
|
||||||
b = int(b)
|
|
||||||
if(a < 0) a += 4294967296
|
if(a < 0) a += 4294967296
|
||||||
if(b < 0) b += 4294967296
|
if(b < 0) b += 4294967296
|
||||||
while(a > 0 || b > 0) {
|
while(a > 0 || b > 0) {
|
||||||
if((a%2) != (b%2)) r += v
|
if((a%2) != (b%2)) r += v
|
||||||
a = int(a/2)
|
a = int(a/2); b = int(b/2); v *= 2
|
||||||
b = int(b/2)
|
|
||||||
v *= 2
|
|
||||||
}
|
}
|
||||||
return int(r)
|
return int(r)
|
||||||
}
|
}
|
||||||
@@ -194,9 +182,7 @@ function amach_branch(f3, rs1, rs2, immval, r1, r2, ur1, ur2, taken) {
|
|||||||
else if(f3 == 6) taken = (ur1 < ur2)
|
else if(f3 == 6) taken = (ur1 < ur2)
|
||||||
else if(f3 == 7) taken = (ur1 >= ur2)
|
else if(f3 == 7) taken = (ur1 >= ur2)
|
||||||
else trapout(sprintf("Illegal instruction at 0x%X", pc-4))
|
else trapout(sprintf("Illegal instruction at 0x%X", pc-4))
|
||||||
|
pc += (taken ? immval : 4)
|
||||||
if(taken) pc += immval
|
|
||||||
else pc += 4
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function amach_imm(opcode, f3, rd, rs1, immval, r1, ur1, base, shamt, val) {
|
function amach_imm(opcode, f3, rd, rs1, immval, r1, ur1, base, shamt, val) {
|
||||||
@@ -263,9 +249,7 @@ function amach_atomic(f3, f5, aq, rl, rd, rs1, rs2, r1, r2, val, uval, ur2) {
|
|||||||
write_word(r1, r2)
|
write_word(r1, r2)
|
||||||
setreg(rd, 0)
|
setreg(rd, 0)
|
||||||
RES_ADDR = -1
|
RES_ADDR = -1
|
||||||
} else {
|
} else setreg(rd, 1)
|
||||||
setreg(rd, 1)
|
|
||||||
}
|
|
||||||
} else if(f5 == 4) { # amoxor.w
|
} else if(f5 == 4) { # amoxor.w
|
||||||
setreg(rd, val)
|
setreg(rd, val)
|
||||||
write_word(r1, bw_xor(val, r2))
|
write_word(r1, bw_xor(val, r2))
|
||||||
@@ -326,7 +310,6 @@ function amach_exec(instr, opcode, rd, rs1, rs2, imm, funct3, funct7) {
|
|||||||
} else if(opcode == 23) { # 0x17, AUIPC, type U
|
} else if(opcode == 23) { # 0x17, AUIPC, type U
|
||||||
setreg(rd, imm * 4096 + pc - 4)
|
setreg(rd, imm * 4096 + pc - 4)
|
||||||
} else if(opcode == 15) { # 0x0F, FENCE, type I / no-op
|
} else if(opcode == 15) { # 0x0F, FENCE, type I / no-op
|
||||||
# no-op
|
|
||||||
} else trapout(sprintf("Illegal instruction at 0x%X", pc-4))
|
} else trapout(sprintf("Illegal instruction at 0x%X", pc-4))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user