Author: Richard Plangger <planri...@gmail.com>
Branch: s390x-backend
Changeset: r80336:cff394b2f479
Date: 2015-10-19 16:42 +0200
http://bitbucket.org/pypy/pypy/changeset/cff394b2f479/

Log:    first loop (that includes a branching instruction on condition),
        substract and register move added to instructions

diff --git a/rpython/jit/backend/zarch/assembler.py 
b/rpython/jit/backend/zarch/assembler.py
--- a/rpython/jit/backend/zarch/assembler.py
+++ b/rpython/jit/backend/zarch/assembler.py
@@ -50,12 +50,11 @@
         return clt.asmmemmgr_blocks
 
     def gen_func_prolog(self):
-        self.mc.STMG(reg.r11, reg.r15, loc.addr(reg.sp, -96))
+        self.mc.STMG(reg.r11, reg.r15, loc.addr(-96, reg.sp))
         self.mc.AHI(reg.sp, loc.imm(-96))
-        #self.mc.LAY(reg.r15, loc.addr(reg.sp, -))
 
     def gen_func_epilog(self):
-        self.mc.LMG(reg.r11, reg.r15, loc.addr(reg.sp, 0))
+        self.mc.LMG(reg.r11, reg.r15, loc.addr(0, reg.sp))
         self.jmpto(reg.r14)
 
     def jmpto(self, register):
diff --git a/rpython/jit/backend/zarch/codebuilder.py 
b/rpython/jit/backend/zarch/codebuilder.py
--- a/rpython/jit/backend/zarch/codebuilder.py
+++ b/rpython/jit/backend/zarch/codebuilder.py
@@ -96,8 +96,7 @@
         self.writechar(chr(operands))
     return encode_rr
 
-def build_rre(mnemonic, (opcode,)):
-    opcode1,opcode2 = opcode
+def build_rre(mnemonic, (opcode1,opcode2)):
     @builder.arguments('r,r')
     def encode_rr(self, reg1, reg2):
         self.writechar(opcode1)
@@ -269,8 +268,8 @@
 
 _mnemonic_codes = {
     'AR':      (build_rr,    ['\x1A']),
-    'AGR':     (build_rre,   ['\xB9\x08']),
-    'AGFR':    (build_rre,   ['\xB9\x18']),
+    'AGR':     (build_rre,   ['\xB9','\x08']),
+    'AGFR':    (build_rre,   ['\xB9','\x18']),
     'A':       (build_rx,    ['\x5A']),
     'AY':      (build_rxy,   ['\xE3','\x5A']),
     'AG':      (build_rxy,   ['\xE3','\x08']),
@@ -283,6 +282,9 @@
     'BRXH':    (build_rsi,   ['\x84']),
     'BRXLG':   (build_rie,   ['\xEC','\x45']),
     'BCR':     (build_rr,    ['\x07']),
+    'BC':      (build_rx,    ['\x47']),
+    'BRC':     (build_ri,    ['\xA7','\x04']),
+    'BRCL':    (build_ril,   ['\xC0','\x04']),
     #
     'NI':      (build_si,    ['\x94']),
     'NIY':     (build_siy,   ['\xEB','\x54']),
@@ -295,9 +297,13 @@
     'LMD':     (build_sse,   ['\xEF']),
     'LMG':     (build_rsy,   ['\xEB','\x04']),
     'LGHI':    (build_ri,    ['\xA7','\x09']),
+    'LR':      (build_rr,    ['\x18']),
+    'LGR':     (build_rre,   ['\xB9','\x04']),
 
     'PKA':     (build_ssf,   ['\xE9']),
     'STMG':    (build_rsy,   ['\xEB','\x24']),
+    'SR':      (build_rr,    ['\x1B']),
+    'SGR':     (build_rre,   ['\xB9','\x09']),
 }
 
 def build_unpack_func(mnemonic, func):
diff --git a/rpython/jit/backend/zarch/conditions.py 
b/rpython/jit/backend/zarch/conditions.py
--- a/rpython/jit/backend/zarch/conditions.py
+++ b/rpython/jit/backend/zarch/conditions.py
@@ -0,0 +1,9 @@
+
+from rpython.jit.backend.zarch import locations as loc
+
+EQ = loc.imm(0x8)
+LT = loc.imm(0x4)
+GT = loc.imm(0x2)
+LE = loc.imm(EQ.value | LT.value)
+GE = loc.imm(EQ.value | GT.value)
+OVERFLOW = loc.imm(0x1)
diff --git a/rpython/jit/backend/zarch/locations.py 
b/rpython/jit/backend/zarch/locations.py
--- a/rpython/jit/backend/zarch/locations.py
+++ b/rpython/jit/backend/zarch/locations.py
@@ -171,13 +171,16 @@
     _immutable_ = True
 
     def __init__(self, basereg, indexreg, displace):
-        self.base = basereg.value
         self.displace = displace
-        self.index = 0 # designates the absense of an index register!
+        # designates the absense of an index/base register!
+        self.base = 0
+        self.index = 0
+        if basereg:
+            self.base = basereg.value
         if indexreg:
             self.index = indexreg.value
 
-def addr(basereg, displace, indexreg=None):
+def addr(displace, basereg=None, indexreg=None):
     return AddressLocation(basereg, indexreg, displace)
 
 def imm(i):
diff --git a/rpython/jit/backend/zarch/test/test_assembler.py 
b/rpython/jit/backend/zarch/test/test_assembler.py
--- a/rpython/jit/backend/zarch/test/test_assembler.py
+++ b/rpython/jit/backend/zarch/test/test_assembler.py
@@ -48,10 +48,11 @@
 
     def test_simple_func(self):
         # enter
-        self.a.mc.STMG(reg.r11, reg.r15, loc.addr(reg.sp, -96))
+        self.a.mc.STMG(reg.r11, reg.r15, loc.addr(-96, reg.sp))
         self.a.mc.AHI(reg.sp, loc.imm(-96))
+        # from the start of BRASL to end of jmpto there are 8+6 bytes
         self.a.mc.BRASL(reg.r14, loc.imm(8+6))
-        self.a.mc.LMG(reg.r11, reg.r15, loc.addr(reg.sp, 0))
+        self.a.mc.LMG(reg.r11, reg.r15, loc.addr(0, reg.sp))
         self.a.jmpto(reg.r14)
 
         addr = self.a.mc.get_relative_pos()
@@ -61,3 +62,14 @@
         self.a.gen_func_epilog()
         assert run_asm(self.a) == 321
 
+    def test_simple_loop(self):
+        self.a.mc.LGHI(reg.r3, loc.imm(2**15-1))
+        self.a.mc.LGHI(reg.r4, loc.imm(1))
+        L1 = self.a.mc.get_relative_pos()
+        self.a.mc.SGR(reg.r3, reg.r4)
+        LJ = self.a.mc.get_relative_pos()
+        self.a.mc.BRCL(loc.imm(0x2), loc.imm(L1-LJ))
+        self.a.mc.LGR(reg.r2, reg.r3)
+        self.a.jmpto(reg.r14)
+        assert run_asm(self.a) == 0
+
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to