]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/udis86/lib/contrib/libudis86/syn-att.c
Update
[l4.git] / l4 / pkg / udis86 / lib / contrib / libudis86 / syn-att.c
index 7a7fc7cfc80677fdcb69dca6d8c97a320acc6368..dc9d73929c66237e1026dbe9c51c1eebc9e87cb2 100644 (file)
@@ -28,6 +28,7 @@
 #include "decode.h"
 #include "itab.h"
 #include "syn.h"
+#include "udint.h"
 
 /* -----------------------------------------------------------------------------
  * opr_cast() - Prints an operand cast.
@@ -37,9 +38,9 @@ static void
 opr_cast(struct ud* u, struct ud_operand* op)
 {
   switch(op->size) {
-       case 16 : case 32 :
-               mkasm(u, "*");   break;
-       default: break;
+  case 16 : case 32 :
+    ud_asmprintf(u, "*");   break;
+  default: break;
   }
 }
 
@@ -51,93 +52,66 @@ static void
 gen_operand(struct ud* u, struct ud_operand* op)
 {
   switch(op->type) {
-       case UD_OP_REG:
-               mkasm(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]);
-               break;
-
-       case UD_OP_MEM:
-               if (u->br_far) opr_cast(u, op);
-               if (u->pfx_seg)
-                       mkasm(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
-               if (op->offset == 8) {
-                       if (op->lval.sbyte < 0)
-                               mkasm(u, "-0x%x", (-op->lval.sbyte) & 0xff);
-                       else    mkasm(u, "0x%x", op->lval.sbyte);
-               } 
-               else if (op->offset == 16) 
-                       mkasm(u, "0x%x", op->lval.uword);
-               else if (op->offset == 32) 
-                       mkasm(u, "0x%lx", op->lval.udword);
-               else if (op->offset == 64) 
-                       mkasm(u, "0x" FMT64 "x", op->lval.uqword);
-
-               if (op->base)
-                       mkasm(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]);
-               if (op->index) {
-                       if (op->base)
-                               mkasm(u, ",");
-                       else mkasm(u, "(");
-                       mkasm(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]);
-               }
-               if (op->scale)
-                       mkasm(u, ",%d", op->scale);
-               if (op->base || op->index)
-                       mkasm(u, ")");
-               break;
-
-       case UD_OP_IMM: {
-        int64_t  imm = 0;
-        uint64_t sext_mask = 0xffffffffffffffffull;
-        unsigned sext_size = op->size;
-
-        switch (op->size) {
-            case  8: imm = op->lval.sbyte; break;
-            case 16: imm = op->lval.sword; break;
-            case 32: imm = op->lval.sdword; break;
-            case 64: imm = op->lval.sqword; break;
-        }
-        if ( P_SEXT( u->itab_entry->prefix ) ) {
-            sext_size = u->operand[ 0 ].size; 
-            if ( u->mnemonic == UD_Ipush )
-                /* push sign-extends to operand size */
-                sext_size = u->opr_mode; 
-        }
-        if ( sext_size < 64 )
-            sext_mask = ( 1ull << sext_size ) - 1;
-        mkasm( u, "0x" FMT64 "x", imm & sext_mask ); 
+  case UD_OP_CONST:
+    ud_asmprintf(u, "$0x%x", op->lval.udword);
+    break;
 
-               break;
-    }
+  case UD_OP_REG:
+    ud_asmprintf(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]);
+    break;
 
-       case UD_OP_JIMM:
-               switch (op->size) {
-                       case  8:
-                               mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sbyte); 
-                               break;
-                       case 16:
-                               mkasm(u, "0x" FMT64 "x", ( u->pc + op->lval.sword ) & 0xffff );
-                               break;
-                       case 32:
-                               mkasm(u, "0x" FMT64 "x", ( u->pc + op->lval.sdword ) & 0xfffffffful );
-                               break;
-                       default:break;
-               }
-               break;
-
-       case UD_OP_PTR:
-               switch (op->size) {
-                       case 32:
-                               mkasm(u, "$0x%x, $0x%x", op->lval.ptr.seg, 
-                                       op->lval.ptr.off & 0xFFFF);
-                               break;
-                       case 48:
-                               mkasm(u, "$0x%x, $0x%lx", op->lval.ptr.seg, 
-                                       op->lval.ptr.off);
-                               break;
-               }
-               break;
-                       
-       default: return;
+  case UD_OP_MEM:
+    if (u->br_far) {
+        opr_cast(u, op);
+    }
+    if (u->pfx_seg) {
+      ud_asmprintf(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
+    }
+    if (op->offset != 0) { 
+      ud_syn_print_mem_disp(u, op, 0);
+    }
+    if (op->base) {
+      ud_asmprintf(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]);
+    }
+    if (op->index) {
+      if (op->base) {
+        ud_asmprintf(u, ",");
+      } else {
+        ud_asmprintf(u, "(");
+      }
+      ud_asmprintf(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]);
+    }
+    if (op->scale) {
+      ud_asmprintf(u, ",%d", op->scale);
+    }
+    if (op->base || op->index) {
+      ud_asmprintf(u, ")");
+    }
+    break;
+
+  case UD_OP_IMM:
+    ud_asmprintf(u, "$");
+    ud_syn_print_imm(u, op);
+    break;
+
+  case UD_OP_JIMM:
+    ud_syn_print_addr(u, ud_syn_rel_target(u, op));
+    break;
+
+  case UD_OP_PTR:
+    switch (op->size) {
+      case 32:
+        ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, 
+          op->lval.ptr.off & 0xFFFF);
+        break;
+      case 48:
+        ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, 
+          op->lval.ptr.off);
+        break;
+    }
+    break;
+      
+  default: return;
   }
 }
 
@@ -149,94 +123,102 @@ extern void
 ud_translate_att(struct ud *u)
 {
   int size = 0;
+  int star = 0;
 
   /* check if P_OSO prefix is used */
   if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) {
-       switch (u->dis_mode) {
-               case 16: 
-                       mkasm(u, "o32 ");
-                       break;
-               case 32:
-               case 64:
-                       mkasm(u, "o16 ");
-                       break;
-       }
+  switch (u->dis_mode) {
+    case 16: 
+      ud_asmprintf(u, "o32 ");
+      break;
+    case 32:
+    case 64:
+      ud_asmprintf(u, "o16 ");
+      break;
+  }
   }
 
   /* check if P_ASO prefix was used */
   if (! P_ASO(u->itab_entry->prefix) && u->pfx_adr) {
-       switch (u->dis_mode) {
-               case 16: 
-                       mkasm(u, "a32 ");
-                       break;
-               case 32:
-                       mkasm(u, "a16 ");
-                       break;
-               case 64:
-                       mkasm(u, "a32 ");
-                       break;
-       }
+  switch (u->dis_mode) {
+    case 16: 
+      ud_asmprintf(u, "a32 ");
+      break;
+    case 32:
+      ud_asmprintf(u, "a16 ");
+      break;
+    case 64:
+      ud_asmprintf(u, "a32 ");
+      break;
+  }
   }
 
   if (u->pfx_lock)
-       mkasm(u,  "lock ");
-  if (u->pfx_rep)
-       mkasm(u,  "rep ");
-  if (u->pfx_repne)
-               mkasm(u,  "repne ");
+    ud_asmprintf(u,  "lock ");
+  if (u->pfx_rep) {
+    ud_asmprintf(u, "rep ");
+  } else if (u->pfx_rep) {
+    ud_asmprintf(u, "repe ");
+  } else if (u->pfx_repne) {
+    ud_asmprintf(u, "repne ");
+  }
 
   /* special instructions */
   switch (u->mnemonic) {
-       case UD_Iretf: 
-               mkasm(u, "lret "); 
-               break;
-       case UD_Idb:
-               mkasm(u, ".byte 0x%x", u->operand[0].lval.ubyte);
-               return;
-       case UD_Ijmp:
-       case UD_Icall:
-               if (u->br_far) mkasm(u,  "l");
-               mkasm(u, "%s", ud_lookup_mnemonic(u->mnemonic));
-               break;
-       case UD_Ibound:
-       case UD_Ienter:
-               if (u->operand[0].type != UD_NONE)
-                       gen_operand(u, &u->operand[0]);
-               if (u->operand[1].type != UD_NONE) {
-                       mkasm(u, ",");
-                       gen_operand(u, &u->operand[1]);
-               }
-               return;
-       default:
-               mkasm(u, "%s", ud_lookup_mnemonic(u->mnemonic));
+  case UD_Iretf: 
+    ud_asmprintf(u, "lret "); 
+    break;
+  case UD_Idb:
+    ud_asmprintf(u, ".byte 0x%x", u->operand[0].lval.ubyte);
+    return;
+  case UD_Ijmp:
+  case UD_Icall:
+    if (u->br_far) ud_asmprintf(u,  "l");
+        if (u->operand[0].type == UD_OP_REG) {
+          star = 1;
+        }
+    ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
+    break;
+  case UD_Ibound:
+  case UD_Ienter:
+    if (u->operand[0].type != UD_NONE)
+      gen_operand(u, &u->operand[0]);
+    if (u->operand[1].type != UD_NONE) {
+      ud_asmprintf(u, ",");
+      gen_operand(u, &u->operand[1]);
+    }
+    return;
+  default:
+    ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
   }
 
-  if (u->c1)
-       size = u->operand[0].size;
-  else if (u->c2)
-       size = u->operand[1].size;
-  else if (u->c3)
-       size = u->operand[2].size;
-
   if (size == 8)
-       mkasm(u, "b");
+  ud_asmprintf(u, "b");
   else if (size == 16)
-       mkasm(u, "w");
+  ud_asmprintf(u, "w");
   else if (size == 64)
-       mkasm(u, "q");
+  ud_asmprintf(u, "q");
 
-  mkasm(u, " ");
+  if (star) {
+    ud_asmprintf(u, " *");
+  } else {
+    ud_asmprintf(u, " ");
+  }
 
   if (u->operand[2].type != UD_NONE) {
-       gen_operand(u, &u->operand[2]);
-       mkasm(u, ", ");
+  gen_operand(u, &u->operand[2]);
+  ud_asmprintf(u, ", ");
   }
 
   if (u->operand[1].type != UD_NONE) {
-       gen_operand(u, &u->operand[1]);
-       mkasm(u, ", ");
+  gen_operand(u, &u->operand[1]);
+  ud_asmprintf(u, ", ");
   }
 
   if (u->operand[0].type != UD_NONE)
-       gen_operand(u, &u->operand[0]);
+  gen_operand(u, &u->operand[0]);
 }
+
+/*
+vim: set ts=2 sw=2 expandtab
+*/