[pypy-svn] r58039 - in pypy/branch/oo-jit/pypy/jit/codegen/x86_64: . test

witulski at codespeak.net witulski at codespeak.net
Wed Sep 10 15:31:28 CEST 2008


Author: witulski
Date: Wed Sep 10 15:31:25 2008
New Revision: 58039

Modified:
   pypy/branch/oo-jit/pypy/jit/codegen/x86_64/assembler.py
   pypy/branch/oo-jit/pypy/jit/codegen/x86_64/rgenop.py
   pypy/branch/oo-jit/pypy/jit/codegen/x86_64/test/test_rgenop.py
   pypy/branch/oo-jit/pypy/jit/codegen/x86_64/test/test_simple.py
Log:
Added a new test which is broken

some work on goto (but still dont works)


Modified: pypy/branch/oo-jit/pypy/jit/codegen/x86_64/assembler.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/x86_64/assembler.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/x86_64/assembler.py	Wed Sep 10 15:31:25 2008
@@ -66,7 +66,7 @@
             self.write_modRM_byte(3, modrm2, modrm1)
             self.write(chr(arg2.value)) 
         elif isinstance(arg2,Register64):
-            rexB, modrm2 = self.get_register_bits(arg2.reg)            
+            rexB, modrm2 = self.get_register_bits(arg2.reg)         
             # FIXME: exchange the two arguments (rexB/rexR)
             self.write_rex_byte(rexW, rexB, rexX, rexR)
             self.write(opcode)
@@ -144,16 +144,16 @@
     
     # The opcodes differs depending on the operands
     # Params:
-    # W, R, X, B, Opcode, mod, modrm1, modrm2, tttn(JUMPS), extraopcode 
+    # W (64bit Operands), R, X, B, Opcode, mod, modrm1, modrm2, tttn(JUMPS), extraopcode 
     
-    # FIXME: rexX,rexB are set
+    # FIXME: rexB is set
     _ADD_QWREG_IMM32 = make_two_operand_instr(   1,    0,    0,    0, "\x81", 3, None, 2)  
     _ADD_QWREG_QWREG = make_two_operand_instr(   1, None,    0, None, "\x00", 3, None, None)
     
     # FIXME: rexB is set
     _CMP_QWREG_IMM32 = make_two_operand_instr(   1,    0,    0,    1, "\x81", 3, None, 7)
     _CMP_QWREG_QWREG = make_two_operand_instr(   1, None,    0, None, "\x39", 3, None, None)
-    # FIXME: rex B is set
+    # FIXME: rexB is set
     _CMP_8REG_IMM8   = make_two_operand_instr(   0,    0,    0,    0, "\x82", 3, None, 7)
     
     _DEC_QWREG       = make_one_operand_instr(   1,    0,    0, None, "\xFF", 3, None, 1)
@@ -202,6 +202,12 @@
         #self.write("\xE9")
         #self.writeImm32(displ)
         
+    #  op1 is and 32bit displ
+    def JNE(self,op1):
+        self.write("\x0F")
+        self.write("\x85")
+        self.writeImm32(op1)       
+        
     def POP(self, op1):
         method = getattr(self, "_POP"+op1.to_string())
         method(op1)
@@ -240,20 +246,24 @@
     def get_register_bits_8Bit(self, register):
         return REGISTER_MAP_8BIT[register]
     
+    # TODO: sign extention?
     # Parse the integervalue to an charakter
     # and write it
     def writeImm32(self, imm32):
         x = hex(imm32)
+        if x[0]=='-':
+            x = self.cast_to_neg_hex(x)
         # parse to string and cut "0x" off
         # fill with zeros if to short
         y = "0"*(10-len(x))+x[2:len(x)]
-        assert len(y) == 8            
+        assert len(y) == 8           
         self.write(chr(int(y[6:8],16))) 
         self.write(chr(int(y[4:6],16)))
         self.write(chr(int(y[2:4],16)))
         self.write(chr(int(y[0:2],16)))
         
         
+    # TODO: sign extention?
     # Parse the integervalue to an charakter
     # and write it
     def writeImm64(self, imm64):
@@ -281,3 +291,7 @@
         byte = mod << 6 | (reg << 3) | rm
         self.write(chr(byte))
         
+    # TODO: write me
+    def cast_to_neg_hex(self,a_hex):
+        return a_hex
+        

Modified: pypy/branch/oo-jit/pypy/jit/codegen/x86_64/rgenop.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/x86_64/rgenop.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/x86_64/rgenop.py	Wed Sep 10 15:31:25 2008
@@ -103,9 +103,12 @@
     op_int_pop  = make_one_argument_method("POP")
     op_int_sub  = make_two_argument_method("SUB")
 
+    #FIXME: can only jump 32bit
     def jump_if_true(self, gv_condition, args_for_jump_gv):
         targetbuilder = Builder()
         self.mc.CMP(gv_condition, Immediate32(0))
+        displ = self.calc_32bit_displacement(self.mc.tell(),targetbuilder.mc.tell())
+        self.mc.JNE(displ)
         #targetbuilder.come_from(self.mc, 'JNE')
         return targetbuilder
     
@@ -149,12 +152,17 @@
     
     #TODO: Implementation
     def enter_next_block(self, args_gv):
-        print "WriteMe:  enter_next_block"
-        return Label(self.mc.tell(), [], 0)
+        #print "WriteMe:  enter_next_block"
+        L = Label(self.mc.tell(), [], 0)
+        #print "DEBUG2:",L.startaddr
+        return L
     
     def _close(self):
         pass
-        
+    
+    def calc_32bit_displacement(self, curr_addr, want_jump_to):
+        return want_jump_to-curr_addr
+
 
 class RX86_64GenOp(model.AbstractRGenOp):
     

Modified: pypy/branch/oo-jit/pypy/jit/codegen/x86_64/test/test_rgenop.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/x86_64/test/test_rgenop.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/x86_64/test/test_rgenop.py	Wed Sep 10 15:31:25 2008
@@ -125,6 +125,8 @@
         assert res == 1 
         res = fnptr(4,4)
         assert res == 0
+        res = fnptr(4,0)
+        assert res == 1
         
    # def test_push_and_pop(self):
    #     rgenop = self.RGenOp()

Modified: pypy/branch/oo-jit/pypy/jit/codegen/x86_64/test/test_simple.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/x86_64/test/test_simple.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/x86_64/test/test_simple.py	Wed Sep 10 15:31:25 2008
@@ -38,16 +38,32 @@
         genv1 = inputargs_gv[1] 
         genv_result = builder.genop2("int_add", genv0, genv1) #creates the addition and returns the place(register) of the result in genv_result
         builder.finish_and_return(token, genv_result)
-        ten = fp(4, 6)
+        ten = fp(4, 6) # 4+6= 10
         assert ten == 10
         print ten
         
+    def test_add_neg(self):
+        builder, fp, inputargs_gv, token = make_testbuilder(2)
+        genv0 = inputargs_gv[0] #the first argument "place"
+        genv1 = inputargs_gv[1] 
+        genv_result = builder.genop2("int_add", genv0, genv1) #creates the addition and returns the place(register) of the result in genv_result
+        builder.finish_and_return(token, genv_result)
+        ten = fp(-4, -6)
+        assert ten == -10
+        print ten
+        two = fp(-4, 6)
+        assert two == 2
+        print two
+        two = fp(4, -6)
+        assert two == -2
+        print two
+        
     def test_add_imm32(self):
         builder, fp, inputargs_gv, token = make_testbuilder(1)
         genv0 = inputargs_gv[0] #the first argument "place"
         genv_result = builder.genop2("int_add", genv0, rgenop.genconst(1000)) #creates the addition and returns the place(register) of the result in genv_result
         builder.finish_and_return(token, genv_result)
-        num = fp(1111)
+        num = fp(1111) # 1111+1000 = 2111
         assert num == 2111
         print num
         
@@ -55,7 +71,7 @@
         builder, fp, inputargs_gv, token = make_testbuilder(1)
         builder.finish_and_return(token, inputargs_gv[0])
         print repr("".join(builder.mc._all))
-        four = fp(4)
+        four = fp(4) # return 4
         assert four == 4
         print four
         
@@ -65,7 +81,7 @@
         genv1 = inputargs_gv[1] 
         genv_result = builder.genop2("int_sub", genv0, genv1) #creates the subtraction and returns the place(register) of the result in genv_result
         builder.finish_and_return(token, genv_result)
-        four = fp(10, 6)
+        four = fp(10, 6) # 10 - 6 = 4
         assert four == 4
         print four
         
@@ -74,7 +90,7 @@
         genv0 = inputargs_gv[0] #the first argument "place" 
         genv_result = builder.genop2("int_sub", genv0, rgenop.genconst(2)) #creates the subtraction and returns the place(register) of the result in genv_result
         builder.finish_and_return(token, genv_result)
-        eight = fp(10)
+        eight = fp(10) # 10-2 = 8
         assert eight == 8
         print eight
         
\ No newline at end of file



More information about the Pypy-commit mailing list