diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-06-27 23:27:38 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-06-27 23:27:38 (GMT) |
commit | f38beea1951f9c323af3d05a3c4d2cf35f407245 (patch) | |
tree | 763a3ffc38b22135a7dccdbc521c8b21c5f37df7 /src/arch/immediate.c | |
parent | a3b128d4f448fa1eee12074a9bf0256b06e222e8 (diff) |
Defined the minimal instruction size for a given architecture.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@171 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/immediate.c')
-rw-r--r-- | src/arch/immediate.c | 238 |
1 files changed, 216 insertions, 22 deletions
diff --git a/src/arch/immediate.c b/src/arch/immediate.c index 1a32748..3018b6b 100644 --- a/src/arch/immediate.c +++ b/src/arch/immediate.c @@ -67,6 +67,8 @@ struct _GImmOperand } signed_imm; + bool zpad; /* Ajoute des 0 à l'impression */ + }; @@ -139,6 +141,8 @@ static void g_imm_operand_init(GImmOperand *operand) parent->add_text = (add_text_fc)g_imm_operand_add_text; parent->export_buffer = (export_buffer_fc)g_imm_operand_to_buffer; + operand->zpad = false; + } @@ -275,6 +279,7 @@ GArchOperand *g_imm_operand_new_from_value(MemoryDataSize size, ...) /* Pour GCC... */ case MDS_UNDEFINED: break; + case MDS_4_BITS_UNSIGNED: case MDS_8_BITS_UNSIGNED: uval8 = (uint8_t)va_arg(ap, unsigned int); result->unsigned_imm.val8 = uval8; @@ -291,6 +296,7 @@ GArchOperand *g_imm_operand_new_from_value(MemoryDataSize size, ...) uval64 = (uint64_t)va_arg(ap, unsigned int); result->unsigned_imm.val64 = uval64; break; + case MDS_4_BITS_SIGNED: case MDS_8_BITS_SIGNED: sval8 = (int8_t)va_arg(ap, int); result->signed_imm.val8 = sval8; @@ -318,6 +324,44 @@ GArchOperand *g_imm_operand_new_from_value(MemoryDataSize size, ...) /****************************************************************************** * * +* Paramètres : state = true si des zéro sont à ajouter, false sinon. * +* * +* Description : Précise si des zéro doivent compléter l'affichage ou non. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_imm_operand_pad(GImmOperand *operand, bool state) +{ + operand->zpad = state; + +} + + +/****************************************************************************** +* * +* Paramètres : operand = structure dont le contenu est à définir. * +* * +* Description : Indique le signe d'une valeur immédiate. * +* * +* Retour : true si des zéro sont ajoutés à l'affichage, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_imm_operand_does_padding(const GImmOperand *operand) +{ + return operand->zpad; + +} + + +/****************************************************************************** +* * * Paramètres : operand = structure dont le contenu est à définir. * * * * Description : Indique le signe d'une valeur immédiate. * @@ -385,42 +429,111 @@ static size_t g_imm_operand_to_string(const GImmOperand *operand, AsmSyntax synt case MDS_UNDEFINED: result = snprintf(value, VMPA_MAX_SIZE, "0x???"); break; + case MDS_4_BITS_UNSIGNED: - case MDS_8_BITS_UNSIGNED: result = snprintf(value, VMPA_MAX_SIZE, "0x%hhx", operand->unsigned_imm.val8); + + case MDS_8_BITS_UNSIGNED: + if (operand->zpad) + result = snprintf(value, VMPA_MAX_SIZE, "0x%02hhx", operand->unsigned_imm.val8); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%hhx", operand->unsigned_imm.val8); break; + case MDS_16_BITS_UNSIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "0x%hx", operand->unsigned_imm.val16); + if (operand->zpad) + result = snprintf(value, VMPA_MAX_SIZE, "0x%04hx", operand->unsigned_imm.val16); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%hx", operand->unsigned_imm.val16); break; + case MDS_32_BITS_UNSIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "0x%x", operand->unsigned_imm.val32); + if (operand->zpad) + result = snprintf(value, VMPA_MAX_SIZE, "0x%08x", operand->unsigned_imm.val32); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%x", operand->unsigned_imm.val32); break; + case MDS_64_BITS_UNSIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "0x%llx", operand->unsigned_imm.val64); + if (operand->zpad) + result = snprintf(value, VMPA_MAX_SIZE, "0x%016llx", operand->unsigned_imm.val64); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%llx", operand->unsigned_imm.val64); break; - case MDS_8_BITS_SIGNED: + + case MDS_4_BITS_SIGNED: if (g_imm_operand_is_negative(operand)) result = snprintf(value, VMPA_MAX_SIZE, "0x%hhx", ~operand->signed_imm.val8 + 1); else result = snprintf(value, VMPA_MAX_SIZE, "0x%hhx", operand->signed_imm.val8); break; + + case MDS_8_BITS_SIGNED: + if (operand->zpad) + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "0x%02hhx", ~operand->signed_imm.val8 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%02hhx", operand->signed_imm.val8); + } + else + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "0x%hhx", ~operand->signed_imm.val8 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%hhx", operand->signed_imm.val8); + } + break; + case MDS_16_BITS_SIGNED: - if (g_imm_operand_is_negative(operand)) - result = snprintf(value, VMPA_MAX_SIZE, "0x%hx", ~operand->signed_imm.val16 + 1); + if (operand->zpad) + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "0x%04hx", ~operand->signed_imm.val16 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%04hx", operand->signed_imm.val16); + } else - result = snprintf(value, VMPA_MAX_SIZE, "0x%hx", operand->signed_imm.val16); + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "0x%hx", ~operand->signed_imm.val16 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%hx", operand->signed_imm.val16); + } break; + case MDS_32_BITS_SIGNED: - if (g_imm_operand_is_negative(operand)) - result = snprintf(value, VMPA_MAX_SIZE, "0x%x", ~operand->signed_imm.val32 + 1); + if (operand->zpad) + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "0x%08x", ~operand->signed_imm.val32 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%08x", operand->signed_imm.val32); + } else - result = snprintf(value, VMPA_MAX_SIZE, "0x%x", operand->signed_imm.val32); + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "0x%x", ~operand->signed_imm.val32 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%x", operand->signed_imm.val32); + } break; + case MDS_64_BITS_SIGNED: - if (g_imm_operand_is_negative(operand)) - result = snprintf(value, VMPA_MAX_SIZE, "0x%llx", ~operand->signed_imm.val64 + 1); + if (operand->zpad) + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "0x%016llx", ~operand->signed_imm.val64 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%016llx", operand->signed_imm.val64); + } else - result = snprintf(value, VMPA_MAX_SIZE, "0x%llx", operand->signed_imm.val64); + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "0x%llx", ~operand->signed_imm.val64 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "0x%llx", operand->signed_imm.val64); + } break; } break; @@ -431,30 +544,111 @@ static size_t g_imm_operand_to_string(const GImmOperand *operand, AsmSyntax synt case MDS_UNDEFINED: result = snprintf(value, VMPA_MAX_SIZE, "$0x???"); break; + case MDS_4_BITS_UNSIGNED: - case MDS_8_BITS_UNSIGNED: result = snprintf(value, VMPA_MAX_SIZE, "$0x%hhx", operand->unsigned_imm.val8); + + case MDS_8_BITS_UNSIGNED: + if (operand->zpad) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%02hhx", operand->unsigned_imm.val8); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%hhx", operand->unsigned_imm.val8); break; + case MDS_16_BITS_UNSIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "$0x%hx", operand->unsigned_imm.val16); + if (operand->zpad) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%04hx", operand->unsigned_imm.val16); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%hx", operand->unsigned_imm.val16); break; + case MDS_32_BITS_UNSIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "$0x%x", operand->unsigned_imm.val32); + if (operand->zpad) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%08x", operand->unsigned_imm.val32); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%x", operand->unsigned_imm.val32); break; + case MDS_64_BITS_UNSIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "$0x%llx", operand->unsigned_imm.val64); + if (operand->zpad) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%016llx", operand->unsigned_imm.val64); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%llx", operand->unsigned_imm.val64); + break; + + case MDS_4_BITS_SIGNED: + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%hhx", ~operand->signed_imm.val8 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%hhx", operand->signed_imm.val8); break; + case MDS_8_BITS_SIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "$0x%hhx", ~operand->signed_imm.val8 + 1); + if (operand->zpad) + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%02hhx", ~operand->signed_imm.val8 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%02hhx", operand->signed_imm.val8); + } + else + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%hhx", ~operand->signed_imm.val8 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%hhx", operand->signed_imm.val8); + } break; + case MDS_16_BITS_SIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "$0x%hx", ~operand->signed_imm.val16 + 1); + if (operand->zpad) + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%04hx", ~operand->signed_imm.val16 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%04hx", operand->signed_imm.val16); + } + else + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%hx", ~operand->signed_imm.val16 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%hx", operand->signed_imm.val16); + } break; + case MDS_32_BITS_SIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "$0x%x", ~operand->signed_imm.val32 + 1); + if (operand->zpad) + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%08x", ~operand->signed_imm.val32 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%08x", operand->signed_imm.val32); + } + else + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%x", ~operand->signed_imm.val32 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%x", operand->signed_imm.val32); + } break; + case MDS_64_BITS_SIGNED: - result = snprintf(value, VMPA_MAX_SIZE, "$0x%llx", ~operand->signed_imm.val64 + 1); + if (operand->zpad) + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%016llx", ~operand->signed_imm.val64 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%016llx", operand->signed_imm.val64); + } + else + { + if (g_imm_operand_is_negative(operand)) + result = snprintf(value, VMPA_MAX_SIZE, "$0x%llx", ~operand->signed_imm.val64 + 1); + else + result = snprintf(value, VMPA_MAX_SIZE, "$0x%llx", operand->signed_imm.val64); + } break; } break; |