Fix handling of DO; support unary + for floating-point numbers
authorH. Peter Anvin <hpa@zytor.com>
Wed, 19 Sep 2007 00:49:09 +0000 (17:49 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 19 Sep 2007 00:49:09 +0000 (17:49 -0700)
Floating-point users generally expect to be able to use a unary plus.
Fix support for the DO instruction in several places.

assemble.c
parser.c

index e538454..efb0220 100644 (file)
@@ -250,6 +250,9 @@ int32_t assemble(int32_t segment, int32_t offset, int bits, uint32_t cp,
     case I_DT:
         wsize = 10;
         break;
+    case I_DO:
+       wsize = 16;
+       break;
     default:
        break;
     }
@@ -564,10 +567,9 @@ int32_t insn_size(int32_t segment, int32_t offset, int bits, uint32_t cp,
     if (instruction->opcode == -1)
         return 0;
 
-    if (instruction->opcode == I_DB ||
-        instruction->opcode == I_DW ||
-        instruction->opcode == I_DD ||
-        instruction->opcode == I_DQ || instruction->opcode == I_DT) {
+    if (instruction->opcode == I_DB || instruction->opcode == I_DW ||
+        instruction->opcode == I_DD || instruction->opcode == I_DQ ||
+       instruction->opcode == I_DT || instruction->opcode == I_DO) {
         extop *e;
         int32_t isize, osize, wsize = 0;   /* placate gcc */
 
@@ -588,6 +590,9 @@ int32_t insn_size(int32_t segment, int32_t offset, int bits, uint32_t cp,
         case I_DT:
             wsize = 10;
             break;
+       case I_DO:
+           wsize = 16;
+           break;
        default:
            break;
         }
index 69ae379..31c3612 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -214,16 +214,18 @@ insn *parse_line(int pass, char *buffer, insn * result,
                 continue;
             }
 
-            if ((i == TOKEN_FLOAT && is_comma_next()) || i == '-') {
-                int32_t sign = +1L;
+            if ((i == TOKEN_FLOAT && is_comma_next())
+               || i == '-' || i == '+') {
+                int32_t sign = +1;
 
-                if (i == '-') {
+                if (i == '+' || i == '-') {
                     char *save = stdscan_bufptr;
+                   int token = i;
+                   sign = (i == '-') ? -1 : 1;
                     i = stdscan(NULL, &tokval);
-                    sign = -1L;
                     if (i != TOKEN_FLOAT || !is_comma_next()) {
                         stdscan_bufptr = save;
-                        i = tokval.t_type = '-';
+                        i = tokval.t_type = token;
                     }
                 }
 
@@ -243,10 +245,12 @@ insn *parse_line(int pass, char *buffer, insn * result,
                    case I_DT:
                         eop->stringlen = 10;
                        break;
+                   case I_DO:
+                        eop->stringlen = 16;
+                       break;
                    default:
                         error(ERR_NONFATAL, "floating-point constant"
-                              " encountered in `d%c' instruction"
-                             ? (result->opcode == I_DO) ? 'o' : 'b');
+                              " encountered in `db' instruction");
                         /*
                          * fix suggested by Pedro Gimeno... original line
                          * was: