From 0e0a90420e2e0b3a86b2fcaad08938b2feba6274 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sun, 14 Oct 2018 00:29:48 -0700 Subject: 4697 --- subx/017jump_disp8.cc | 12 ++++++------ subx/018jump_disp16.cc | 12 ++++++------ subx/031check_operands.cc | 22 ++++++++++++++++------ subx/apps/crenshaw2-1 | Bin 2529 -> 2529 bytes subx/apps/factorial | Bin 2533 -> 2533 bytes 5 files changed, 28 insertions(+), 18 deletions(-) (limited to 'subx') diff --git a/subx/017jump_disp8.cc b/subx/017jump_disp8.cc index 7c7f928b..b7bb9300 100644 --- a/subx/017jump_disp8.cc +++ b/subx/017jump_disp8.cc @@ -27,7 +27,7 @@ case 0xeb: { // jump rel8 //:: jump if equal/zero :(before "End Initialize Op Names") -put_new(Name, "74", "jump disp8 bytes away if equal, if ZF is set. (jcc/jz/je)"); +put_new(Name, "74", "jump disp8 bytes away if equal, if ZF is set (jcc/jz/je)"); :(scenario je_rel8_success) % ZF = true; @@ -66,7 +66,7 @@ case 0x74: { // jump rel8 if ZF //:: jump if not equal/not zero :(before "End Initialize Op Names") -put_new(Name, "75", "jump disp8 bytes away if not equal, if ZF is not set. (jcc/jnz/jne)"); +put_new(Name, "75", "jump disp8 bytes away if not equal, if ZF is not set (jcc/jnz/jne)"); :(scenario jne_rel8_success) % ZF = false; @@ -105,7 +105,7 @@ case 0x75: { // jump rel8 unless ZF //:: jump if greater :(before "End Initialize Op Names") -put_new(Name, "7f", "jump disp8 bytes away if greater, if ZF is unset and SF == OF. (jcc/jg/jnle)"); +put_new(Name, "7f", "jump disp8 bytes away if greater, if ZF is unset and SF == OF (jcc/jg/jnle)"); :(scenario jg_rel8_success) % ZF = false; @@ -148,7 +148,7 @@ case 0x7f: { // jump rel8 if !SF and !ZF //:: jump if greater or equal :(before "End Initialize Op Names") -put_new(Name, "7d", "jump disp8 bytes away if greater or equal, if SF == OF. (jcc/jge/jnl)"); +put_new(Name, "7d", "jump disp8 bytes away if greater or equal, if SF == OF (jcc/jge/jnl)"); :(scenario jge_rel8_success) % SF = false; @@ -189,7 +189,7 @@ case 0x7d: { // jump rel8 if !SF //:: jump if lesser :(before "End Initialize Op Names") -put_new(Name, "7c", "jump disp8 bytes away if lesser, if SF != OF. (jcc/jl/jnge)"); +put_new(Name, "7c", "jump disp8 bytes away if lesser, if SF != OF (jcc/jl/jnge)"); :(scenario jl_rel8_success) % ZF = false; @@ -232,7 +232,7 @@ case 0x7c: { // jump rel8 if SF and !ZF //:: jump if lesser or equal :(before "End Initialize Op Names") -put_new(Name, "7e", "jump disp8 bytes away if lesser or equal, if ZF is set or SF != OF. (jcc/jle/jng)"); +put_new(Name, "7e", "jump disp8 bytes away if lesser or equal, if ZF is set or SF != OF (jcc/jle/jng)"); :(scenario jle_rel8_equal) % ZF = true; diff --git a/subx/018jump_disp16.cc b/subx/018jump_disp16.cc index b40bb034..c22fbce4 100644 --- a/subx/018jump_disp16.cc +++ b/subx/018jump_disp16.cc @@ -33,7 +33,7 @@ int16_t imm16() { //:: jump if equal/zero :(before "End Initialize Op Names") -put_new(Name_0f, "84", "jump disp16 bytes away if equal, if ZF is set. (jcc/jz/je)"); +put_new(Name_0f, "84", "jump disp16 bytes away if equal, if ZF is set (jcc/jz/je)"); :(scenario je_rel16_success) % ZF = true; @@ -72,7 +72,7 @@ case 0x84: { // jump rel16 if ZF //:: jump if not equal/not zero :(before "End Initialize Op Names") -put_new(Name_0f, "85", "jump disp16 bytes away if not equal, if ZF is not set. (jcc/jnz/jne)"); +put_new(Name_0f, "85", "jump disp16 bytes away if not equal, if ZF is not set (jcc/jnz/jne)"); :(scenario jne_rel16_success) % ZF = false; @@ -111,7 +111,7 @@ case 0x85: { // jump rel16 unless ZF //:: jump if greater :(before "End Initialize Op Names") -put_new(Name_0f, "8f", "jump disp16 bytes away if greater, if ZF is unset and SF == OF. (jcc/jg/jnle)"); +put_new(Name_0f, "8f", "jump disp16 bytes away if greater, if ZF is unset and SF == OF (jcc/jg/jnle)"); :(scenario jg_rel16_success) % ZF = false; @@ -154,7 +154,7 @@ case 0x8f: { // jump rel16 if !SF and !ZF //:: jump if greater or equal :(before "End Initialize Op Names") -put_new(Name_0f, "8d", "jump disp16 bytes away if greater or equal, if SF == OF. (jcc/jge/jnl)"); +put_new(Name_0f, "8d", "jump disp16 bytes away if greater or equal, if SF == OF (jcc/jge/jnl)"); :(scenario jge_rel16_success) % SF = false; @@ -195,7 +195,7 @@ case 0x8d: { // jump rel16 if !SF //:: jump if lesser :(before "End Initialize Op Names") -put_new(Name_0f, "8c", "jump disp16 bytes away if lesser, if SF != OF. (jcc/jl/jnge)"); +put_new(Name_0f, "8c", "jump disp16 bytes away if lesser, if SF != OF (jcc/jl/jnge)"); :(scenario jl_rel16_success) % ZF = false; @@ -238,7 +238,7 @@ case 0x8c: { // jump rel16 if SF and !ZF //:: jump if lesser or equal :(before "End Initialize Op Names") -put_new(Name_0f, "8e", "jump disp16 bytes away if lesser or equal, if ZF is set or SF != OF. (jcc/jle/jng)"); +put_new(Name_0f, "8e", "jump disp16 bytes away if lesser or equal, if ZF is set or SF != OF (jcc/jle/jng)"); :(scenario jle_rel16_equal) % ZF = true; diff --git a/subx/031check_operands.cc b/subx/031check_operands.cc index be50d57f..5eaeeaf5 100644 --- a/subx/031check_operands.cc +++ b/subx/031check_operands.cc @@ -275,7 +275,9 @@ void compare_bitvector(const line& inst, uint8_t expected, const word& op) { string maybe_name(const word& op) { if (!is_hex_byte(op)) return ""; if (!contains_key(Name, op.data)) return ""; - return " ("+get(Name, op.data)+')'; + // strip stuff in parens from the name + const string& s = get(Name, op.data); + return " ("+s.substr(0, s.find(" ("))+')'; } uint32_t compute_operand_bitvector(const line& inst) { @@ -385,12 +387,12 @@ void compare_bitvector_modrm(const line& inst, uint8_t expected, const word& op) void check_operand_metadata_present(const line& inst, const string& type, const word& op) { if (!has_operand_metadata(inst, type)) - raise << "'" << to_string(inst) << "' (" << get(Name, op.data) << "): missing " << type << " operand\n" << end(); + raise << "'" << to_string(inst) << "'" << maybe_name(op) << ": missing " << type << " operand\n" << end(); } void check_operand_metadata_absent(const line& inst, const string& type, const word& op, const string& msg) { if (has_operand_metadata(inst, type)) - raise << "'" << to_string(inst) << "' (" << get(Name, op.data) << "): unexpected " << type << " operand (" << msg << ")\n" << end(); + raise << "'" << to_string(inst) << "'" << maybe_name(op) << ": unexpected " << type << " operand (" << msg << ")\n" << end(); } :(scenarios transform) @@ -477,7 +479,7 @@ void check_operands_f3(const line& /*unused*/) { # op subop mod rm32 base index scale r32 # 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes 0f 84 # jmp if ZF to ?? -+error: '0f 84' (jump disp16 bytes away if ZF is set): missing disp16 operand ++error: '0f 84' (jump disp16 bytes away if equal, if ZF is set): missing disp16 operand :(before "End Globals") map Permitted_operands_0f; @@ -515,14 +517,22 @@ void compare_bitvector_0f(const line& inst, uint8_t expected, const word& op) { if ((bitvector & 0x1) == (expected & 0x1)) continue; // all good with this operand const string& optype = Operand_type_name.at(i); if ((bitvector & 0x1) > (expected & 0x1)) - raise << "'" << to_string(inst) << "' (" << get(Name_0f, op.data) << "): unexpected " << optype << " operand\n" << end(); + raise << "'" << to_string(inst) << "'" << maybe_name_0f(op) << ": unexpected " << optype << " operand\n" << end(); else - raise << "'" << to_string(inst) << "' (" << get(Name_0f, op.data) << "): missing " << optype << " operand\n" << end(); + raise << "'" << to_string(inst) << "'" << maybe_name_0f(op) << ": missing " << optype << " operand\n" << end(); // continue giving all errors for a single instruction } // ignore settings in any unused bits } +string maybe_name_0f(const word& op) { + if (!is_hex_byte(op)) return ""; + if (!contains_key(Name_0f, op.data)) return ""; + // strip stuff in parens from the name + const string& s = get(Name_0f, op.data); + return " ("+s.substr(0, s.find(" ("))+')'; +} + string tolower(const char* s) { ostringstream out; for (/*nada*/; *s; ++s) diff --git a/subx/apps/crenshaw2-1 b/subx/apps/crenshaw2-1 index ae685e90..13182906 100755 Binary files a/subx/apps/crenshaw2-1 and b/subx/apps/crenshaw2-1 differ diff --git a/subx/apps/factorial b/subx/apps/factorial index 9a4329a8..63196a79 100755 Binary files a/subx/apps/factorial and b/subx/apps/factorial differ -- cgit 1.4.1-2-gfad0