[pypy-svn] r53164 - pypy/branch/jit-hotpath/pypy/jit/codegen/ia32

fijal at codespeak.net fijal at codespeak.net
Sun Mar 30 22:01:02 CEST 2008


Author: fijal
Date: Sun Mar 30 22:00:57 2008
New Revision: 53164

Modified:
   pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
Log:
Introduce a boolvar. This does not change anything actually, besides the
fact that exists. This will allow in the future to keep track of bools
in flags.


Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py	Sun Mar 30 22:00:57 2008
@@ -343,7 +343,7 @@
         #self.mc.BREAKPOINT()
         # self.stackdepth-1 is the return address; the arguments
         # come just before
-        return [Var(self.stackdepth-2-n) for n in range(numargs)]
+        return [IntVar(self.stackdepth-2-n) for n in range(numargs)]
 
     def _close(self):
         self.closed = True
@@ -383,7 +383,7 @@
                 op = mem(edx, offset)
             self.mc.MOVZX(eax, op)
             op = eax
-        return self.returnvar(op)
+        return self.returnintvar(op)
 
     def genop_setfield(self, (offset, fieldsize), gv_ptr, gv_value):
         self.mc.MOV(eax, gv_value.operand(self))
@@ -400,7 +400,7 @@
     def genop_getsubstruct(self, (offset, fieldsize), gv_ptr):
         self.mc.MOV(edx, gv_ptr.operand(self))
         self.mc.LEA(eax, mem(edx, offset))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def itemaddr(self, base, arraytoken, gv_index):
         # uses ecx
@@ -428,18 +428,18 @@
             assert itemsize == 1 or itemsize == 2
             self.mc.MOVZX(eax, op)
             op = eax
-        return self.returnvar(op)
+        return self.returnintvar(op)
 
     def genop_getarraysubstruct(self, arraytoken, gv_ptr, gv_index):
         self.mc.MOV(edx, gv_ptr.operand(self))
         op = self.itemaddr(edx, arraytoken, gv_index)
         self.mc.LEA(eax, op)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def genop_getarraysize(self, arraytoken, gv_ptr):
         lengthoffset, startoffset, itemoffset = arraytoken
         self.mc.MOV(edx, gv_ptr.operand(self))
-        return self.returnvar(mem(edx, lengthoffset))
+        return self.returnintvar(mem(edx, lengthoffset))
 
     def genop_setarrayitem(self, arraytoken, gv_ptr, gv_index, gv_value):
         self.mc.MOV(eax, gv_value.operand(self))
@@ -460,7 +460,7 @@
         # XXX boehm only, no atomic/non atomic distinction for now
         self.push(imm(size))
         self.mc.CALL(rel32(gc_malloc_fnaddr()))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def genop_malloc_varsize(self, varsizealloctoken, gv_size):
         # XXX boehm only, no atomic/non atomic distinction for now
@@ -472,7 +472,7 @@
         lengthoffset, _, _ = varsizealloctoken
         self.mc.MOV(ecx, gv_size.operand(self))
         self.mc.MOV(mem(eax, lengthoffset), ecx)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
         
     def genop_call(self, sigtoken, gv_fnptr, args_gv):
         numargs = len(sigtoken[0])
@@ -497,11 +497,11 @@
         else:
             self.mc.CALL(gv_fnptr.operand(self))
         # XXX only for int return_kind, check calling conventions
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def genop_same_as(self, gv_x):
         if gv_x.is_const:    # must always return a var
-            return self.returnvar(gv_x.operand(self))
+            return self.returnintvar(gv_x.operand(self))
         else:
             return gv_x
 
@@ -517,7 +517,7 @@
             # turn constants into variables; also make copies of vars that
             # are duplicate in args_gv
             if not isinstance(gv, Var) or gv.stackpos in seen:
-                gv = args_gv[i] = self.returnvar(gv.operand(self))
+                gv = args_gv[i] = self.returnintvar(gv.operand(self))
             # remember the var's position in the stack
             arg_positions.append(gv.stackpos)
             seen[gv.stackpos] = None
@@ -570,11 +570,17 @@
         self.mc.PUSH(op)
         self.stackdepth += 1
 
-    def returnvar(self, op):
-        res = Var(self.stackdepth)
+    def returnintvar(self, op):
+        res = IntVar(self.stackdepth)
         self.push(op)
         return res
 
+    def returnboolvar(self, op):
+        self.mc.MOVZX(eax, op)
+        res = BoolVar(self.stackdepth)
+        self.push(eax)
+        return res
+
     @staticmethod
     def identity(gv_x):
         return gv_x
@@ -584,91 +590,85 @@
     def op_int_add(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.ADD(eax, gv_y.operand(self))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_sub(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.SUB(eax, gv_y.operand(self))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_mul(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.IMUL(eax, gv_y.operand(self))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_floordiv(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CDQ()
         self.mc.IDIV(gv_y.nonimmoperand(self, ecx))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_mod(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CDQ()
         self.mc.IDIV(gv_y.nonimmoperand(self, ecx))
-        return self.returnvar(edx)
+        return self.returnintvar(edx)
 
     def op_int_and(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.AND(eax, gv_y.operand(self))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_or(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.OR(eax, gv_y.operand(self))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_xor(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.XOR(eax, gv_y.operand(self))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_lt(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETL(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     def op_int_le(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETLE(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     def op_int_eq(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETE(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     def op_int_ne(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETNE(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     def op_int_gt(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETG(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     def op_int_ge(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETGE(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     def op_int_neg(self, gv_x):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.NEG(eax)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_abs(self, gv_x):
         self.mc.MOV(eax, gv_x.operand(self))
@@ -678,24 +678,24 @@
         self.mc.SBB(eax, gv_x.operand(self))
         self.mc.SBB(edx, edx)
         self.mc.XOR(eax, edx)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_invert(self, gv_x):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.NOT(eax)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_lshift(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.MOV(ecx, gv_y.operand(self))   # XXX check if ecx >= 32
         self.mc.SHL(eax, cl)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_int_rshift(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.MOV(ecx, gv_y.operand(self))   # XXX check if ecx >= 32
         self.mc.SAR(eax, cl)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     op_uint_is_true = op_int_is_true
     op_uint_invert  = op_int_invert
@@ -705,33 +705,31 @@
     def op_uint_mul(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.MUL(gv_y.nonimmoperand(self, edx))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_uint_floordiv(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.XOR(edx, edx)
         self.mc.DIV(gv_y.nonimmoperand(self, ecx))
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_uint_mod(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.XOR(edx, edx)
         self.mc.DIV(gv_y.nonimmoperand(self, ecx))
-        return self.returnvar(edx)
+        return self.returnintvar(edx)
 
     def op_uint_lt(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETB(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     def op_uint_le(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETBE(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     op_uint_eq = op_int_eq
     op_uint_ne = op_int_ne
@@ -740,15 +738,13 @@
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETA(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     def op_uint_ge(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CMP(eax, gv_y.operand(self))
         self.mc.SETAE(al)
-        self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnboolvar(al)
 
     op_uint_and    = op_int_and
     op_uint_or     = op_int_or
@@ -759,19 +755,19 @@
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.MOV(ecx, gv_y.operand(self))   # XXX check if ecx >= 32
         self.mc.SHR(eax, cl)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_bool_not(self, gv_x):
         self.mc.CMP(gv_x.operand(self), imm8(0))
         self.mc.SETE(al)
         self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     def op_cast_bool_to_int(self, gv_x):
         self.mc.CMP(gv_x.operand(self), imm8(0))
         self.mc.SETNE(al)
         self.mc.MOVZX(eax, al)
-        return self.returnvar(eax)
+        return self.returnintvar(eax)
 
     op_cast_bool_to_uint   = op_cast_bool_to_int
 



More information about the Pypy-commit mailing list