some opts

This commit is contained in:
Luxferre
2026-06-18 15:36:24 +03:00
parent 62cda02cdb
commit 59bb371645
+8 -25
View File
@@ -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))
} }