mescc: Lshift support non-fixed shift value.
[mes.git] / module / mes / as-i386.mes
index f9c483fa74c95f0f41f70d2d429b9b22f4084384..a2762740682dba39c738c4ccfc771fd492d869f1 100644 (file)
   '(#x50))                              ; push %eax
 
 (define (i386:pop-base)
   '(#x50))                              ; push %eax
 
 (define (i386:pop-base)
-  '(#x5a))                              ; pop %eax
+  '(#x5a))                              ; pop %edx
 
 (define (i386:push-base)
 
 (define (i386:push-base)
-  '(#x52))                              ; push %eax
+  '(#x52))                              ; push %edx
 
 (define (i386:ret)
   '(#xc9                                ; leave
 
 (define (i386:ret)
   '(#xc9                                ; leave
   (or n accu:shl n)
   `(#xc1 #xe0 ,n))                      ; shl    $0x8,%eax
 
   (or n accu:shl n)
   `(#xc1 #xe0 ,n))                      ; shl    $0x8,%eax
 
+(define (i386:accu<<base)
+  '(#x31 #xc9                           ; xor    %ecx,%ecx
+    #x89 #xd1                           ; mov    %edx,%ecx
+    #xd3 #xe0))                         ; shl    %cl,%eax
+
 (define (i386:accu+accu)
   '(#x01 #xc0))                         ; add    %eax,%eax
 
 (define (i386:accu+accu)
   '(#x01 #xc0))                         ; add    %eax,%eax
 
 (define (i386:accu-base)
   `(#x29 #xd0))                         ; sub    %edx,%eax
 
 (define (i386:accu-base)
   `(#x29 #xd0))                         ; sub    %edx,%eax
 
+(define (i386:accu*base)
+  `(#xf7 #xe2))                         ; mul    %edx
+
 (define (i386:accu/base)
   '(#x86 #xd3                           ; mov    %edx,%ebx
     #x31 #xd2                           ; xor    %edx,%edx
 (define (i386:accu/base)
   '(#x86 #xd3                           ; mov    %edx,%ebx
     #x31 #xd2                           ; xor    %edx,%edx
     barf)
   `(#x72 ,(if (>= n 0) n (- n 2))))     ; jc <n>
 
     barf)
   `(#x72 ,(if (>= n 0) n (- n 2))))     ; jc <n>
 
-(define (i386:Xjump-c n)
-  (or n urg:Xjump-c)
-  `(#x0f #x82 ,@(int->bv32 n)))     ; jc <n>
-
 (define (i386:jump-cz n)
   (when (or (> n #x80) (< n #x-80))
     (format (current-error-port) "JUMP n=~a\n" n)
     barf)
 (define (i386:jump-cz n)
   (when (or (> n #x80) (< n #x-80))
     (format (current-error-port) "JUMP n=~a\n" n)
     barf)
-  `(#x76 ,(if (>= n 0) n (- n 2))))     ; jna <n>
+  `(#x76 ,(if (>= n 0) n (- n 2))))     ; jbe <n>
 
 (define (i386:jump-ncz n)
   (when (or (> n #x80) (< n #x-80))
 
 (define (i386:jump-ncz n)
   (when (or (> n #x80) (< n #x-80))
     barf)
   `(#x73 ,(if (>= n 0) n (- n 2))))     ; jnc <n>
 
     barf)
   `(#x73 ,(if (>= n 0) n (- n 2))))     ; jnc <n>
 
+;; unsigned
 (define (i386:Xjump-nc n)
   (or n urg:Xjump-nc)
   `(#x0f #x83 ,@(int->bv32 n)))         ; jnc <n>
 
 (define (i386:Xjump-nc n)
   (or n urg:Xjump-nc)
   `(#x0f #x83 ,@(int->bv32 n)))         ; jnc <n>
 
+;; unsigned
+(define (i386:Xjump-ncz n)
+  (or n urg:Xjump-ncz)
+  `(#x0f #x87 ,@(int->bv32 n)))         ; ja <n>
+
+;; unsigned
+;; (define (i386:Xjump-c n)
+;;   (or n urg:Xjump-c)
+;;   `(#x0f #x82 ,@(int->bv32 n)))     ; jc <n>
+
+;; unsigned
+;; (define (i386:Xjump-cz n)
+;;   (or n urg:Xjump-cz)
+;;   `(#x0f #x86 ,@(int->bv32 n)))         ; jbe <n>
+
+;; signed
+(define (i386:Xjump-g n)
+  (or n urg:Xjump-g)
+  `(#x0f #x8f ,@(int->bv32 n)))         ; jg/jnle <n>
+
+;; signed
+(define (i386:Xjump-ge n)
+  (or n urg:Xjump-ge)
+  `(#x0f #x8d ,@(int->bv32 n)))         ; jge/jnl <n>
+
+;; ;; signed
+;; (define (i386:Xjump-l n)
+;;   (or n urg:Xjump-l)
+;;   `(#x0f #x8c ,@(int->bv32 n)))         ; jl/jnge <n>
+
+;; ;; signed
+;; (define (i386:Xjump-le n)
+;;   (or n urg:Xjump-le)
+;;   `(#x0f #x8e ,@(int->bv32 n)))         ; jle/jgn <n>
+
 (define (i386:jump-z n)
   (when (or (> n #x80) (< n #x-80))
     (format (current-error-port) "JUMP-z n=~a\n" n)
     barf)
 (define (i386:jump-z n)
   (when (or (> n #x80) (< n #x-80))
     (format (current-error-port) "JUMP-z n=~a\n" n)
     barf)
-  `(#x74 ,(if (>= n 0) n (- n 2)))) ; jz <n>
+  `(#x74 ,(if (>= n 0) n (- n 2))))     ; jz <n>
 
 (define (i386:jump-nz n)
   (when (or (> n #x80) (< n #x-80))
     (format (current-error-port) "JUMP-nz n=~a\n" n)
     barf)
 
 (define (i386:jump-nz n)
   (when (or (> n #x80) (< n #x-80))
     (format (current-error-port) "JUMP-nz n=~a\n" n)
     barf)
-  `(#x75 ,(if (>= n 0) n (- n 2)))) ; jnz <n>
+  `(#x75 ,(if (>= n 0) n (- n 2))))     ; jnz <n>
 
 (define (i386:test-jump-z n)
   (when (or (> n #x80) (< n #x-80))
 
 (define (i386:test-jump-z n)
   (when (or (> n #x80) (< n #x-80))