diff --git a/amach.awk b/amach.awk index 9ab84e1..00c66a2 100644 --- a/amach.awk +++ b/amach.awk @@ -41,47 +41,35 @@ function ord(c, b) { return int(TGL_ORD[c]) } -function bw_and(a, b, v, r) { - v = 1; r = 0 - a = int(a) - b = int(b) +function bw_and(a, b, v, r) { + v = 1; r = 0; a = int(a); b = int(b) if(a < 0) a += 4294967296 if(b < 0) b += 4294967296 while(a > 0 || b > 0) { if((a%2) == 1 && (b%2) == 1) r += v - a = int(a/2) - b = int(b/2) - v *= 2 + a = int(a/2); b = int(b/2); v *= 2 } return int(r) } -function bw_or(a, b, v, r) { - v = 1; r = 0 - a = int(a) - b = int(b) +function bw_or(a, b, v, r) { + v = 1; r = 0; a = int(a); b = int(b) if(a < 0) a += 4294967296 if(b < 0) b += 4294967296 while(a > 0 || b > 0) { if((a%2) == 1 || (b%2) == 1) r += v - a = int(a/2) - b = int(b/2) - v *= 2 + a = int(a/2); b = int(b/2); v *= 2 } return int(r) } -function bw_xor(a, b, v, r) { - v = 1; r = 0 - a = int(a) - b = int(b) +function bw_xor(a, b, v, r) { + v = 1; r = 0; a = int(a); b = int(b) if(a < 0) a += 4294967296 if(b < 0) b += 4294967296 while(a > 0 || b > 0) { if((a%2) != (b%2)) r += v - a = int(a/2) - b = int(b/2) - v *= 2 + a = int(a/2); b = int(b/2); v *= 2 } 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 == 7) taken = (ur1 >= ur2) else trapout(sprintf("Illegal instruction at 0x%X", pc-4)) - - if(taken) pc += immval - else pc += 4 + pc += (taken ? immval : 4) } 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) setreg(rd, 0) RES_ADDR = -1 - } else { - setreg(rd, 1) - } + } else setreg(rd, 1) } else if(f5 == 4) { # amoxor.w setreg(rd, val) 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 setreg(rd, imm * 4096 + pc - 4) } else if(opcode == 15) { # 0x0F, FENCE, type I / no-op - # no-op } else trapout(sprintf("Illegal instruction at 0x%X", pc-4)) }