Author: hager <[email protected]>
Branch: ppc-jit-backend
Changeset: r46366:1f75e4056e04
Date: 2011-08-05 16:03 +0200
http://bitbucket.org/pypy/pypy/changeset/1f75e4056e04/
Log: Added further 64 bit operations to backend. Need more tests, and
maybe a 64 bit machine :)
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -21,6 +21,7 @@
SC = Form("AA") # fudge
DD = Form("rD", "rA", "SIMM")
+DDO = Form("rD", "rA", "SIMM14", "XO4")
DS = Form("rA", "rS", "UIMM")
X = Form("XO1")
@@ -42,7 +43,8 @@
MI = Form("rA", "rS", "SH", "MB", "ME", "Rc")
MB = Form("rA", "rS", "rB", "MB", "ME", "Rc")
-
+MDI = Form("rA", "rS", "SH", "mbe", "XO5", "sh", "Rc")
+MDS = Form("rA", "rS", "rB", "mbe", "XO5", "Rc")
class BasicPPCAssembler(Assembler):
@@ -99,6 +101,8 @@
lbz = DD(34)
lbzu = DD(35)
+ ld = DDO(58, XO4=0)
+ ldu = DDO(58, XO4=1)
lfd = DD(50)
lfdu = DD(51)
lfs = DD(48)
@@ -108,6 +112,7 @@
lhz = DD(40)
lhzu = DD(41)
lmw = DD(46)
+ lwa = DDO(58, XO4=2)
lwz = DD(32)
lwzu = DD(33)
@@ -117,6 +122,8 @@
stb = DD(38)
stbu = DD(39)
+ std = DDO(62, XO4=0)
+ stdu = DDO(62, XO4=1)
stfd = DD(54)
stfdu = DD(55)
stfs = DD(52)
@@ -128,6 +135,7 @@
stwu = DD(37)
subfic = DD(8)
+ tdi = Form("TO", "rA", "SIMM")(2)
twi = Form("TO", "rA", "SIMM")(3)
xori = DS(26)
xoris = DS(27)
@@ -146,6 +154,8 @@
cmpl = Form("crfD", "L", "rA", "rB", "XO1")(31, XO1=32)
cmpl.default(L=0).default(crfD=0)
+ cntlzd = XS0(31, XO1=58, Rc=0)
+ cntlzdx = XS0(31, XO1=58, Rc=1)
cntlzw = XS0(31, XO1=26, Rc=0)
cntlzwx = XS0(31, XO1=26, Rc=1)
@@ -171,17 +181,29 @@
extsh = XS0(31, XO1=922, Rc=0)
extshx = XS0(31, XO1=922, Rc=1)
+ extsw = XS0(31, XO1=986, Rc=0)
+ extswx = XS0(31, XO1=986, Rc=1)
+
fabs = XDB(63, XO1=264, Rc=0)
fabsx = XDB(63, XO1=264, Rc=1)
fcmpo = XcAB(63, XO1=32)
fcmpu = XcAB(63, XO1=0)
+ fcfid = XDB(63, XO1=846, Rc=0)
+ fcfidx = XDB(63, XO1=846, Rc=1)
+
+ fctid = XDB(63, XO1=814, Rc=0)
+ fctidx = XDB(63, XO1=814, Rc=1)
+
+ fctidz = XDB(63, XO1=815, Rc=0)
+ fctidzx = XDB(63, XO1=815, Rc=1)
+
fctiw = XDB(63, XO1=14, Rc=0)
fctiwx = XDB(63, XO1=14, Rc=1)
- fctiwz = XDB(63, XO1=14, Rc=0)
- fctiwzx = XDB(63, XO1=14, Rc=1)
+ fctiwz = XDB(63, XO1=15, Rc=0)
+ fctiwzx = XDB(63, XO1=15, Rc=1)
fmr = XDB(63, XO1=72, Rc=0)
fmrx = XDB(63, XO1=72, Rc=1)
@@ -201,6 +223,9 @@
lbzux = XD(31, XO1=119)
lbzx = XD(31, XO1=87)
+ ldarx = XD(31, XO1=84)
+ ldux = XD(31, XO1=53)
+ ldx = XD(31, XO1=21)
lfdux = XD(31, XO1=631)
lfdx = XD(31, XO1=599)
lfsux = XD(31, XO1=567)
@@ -213,6 +238,8 @@
lswi = XD(31, XO1=597)
lswx = XD(31, XO1=533)
lwarx = XD(31, XO1=20)
+ lwaux = XD(31, XO1=373)
+ lwax = XD(31, XO1=341)
lwbrx = XD(31, XO1=534)
lwzux = XD(31, XO1=55)
lwzx = XD(31, XO1=23)
@@ -266,6 +293,16 @@
crorc = XL(19, XO1=417)
crxor = XL(19, XO1=193)
+ divd = XO(31, XO2=489, OE=0, Rc=0)
+ divdx = XO(31, XO2=489, OE=0, Rc=1)
+ divdo = XO(31, XO2=489, OE=1, Rc=0)
+ divdox = XO(31, XO2=489, OE=1, Rc=1)
+
+ divdu = XO(31, XO2=457, OE=0, Rc=0)
+ divdux = XO(31, XO2=457, OE=0, Rc=1)
+ divduo = XO(31, XO2=457, OE=1, Rc=0)
+ divduox = XO(31, XO2=457, OE=1, Rc=1)
+
divw = XO(31, XO2=491, OE=0, Rc=0)
divwx = XO(31, XO2=491, OE=0, Rc=1)
divwo = XO(31, XO2=491, OE=1, Rc=0)
@@ -360,6 +397,17 @@
mtsr = Form("rS", "SR", "XO1")(31, XO1=210)
mtsrin = Form("rS", "rB", "XO1")(31, XO1=242)
+ mulhd = XO(31, OE=0, XO2=73, Rc=0)
+ mulhdx = XO(31, OE=0, XO2=73, Rc=1)
+
+ mulhdu = XO(31, OE=0, XO2=9, Rc=0)
+ mulhdux = XO(31, OE=0, XO2=9, Rc=1)
+
+ mulld = XO(31, OE=0, XO2=233, Rc=0)
+ mulldx = XO(31, OE=0, XO2=233, Rc=1)
+ mulldo = XO(31, OE=1, XO2=233, Rc=0)
+ mulldox = XO(31, OE=1, XO2=233, Rc=1)
+
mulhw = XO(31, OE=0, XO2=75, Rc=0)
mulhwx = XO(31, OE=0, XO2=75, Rc=1)
@@ -390,6 +438,22 @@
rfi = X(19, XO1=50)
+ rfid = X(19, XO1=18)
+
+ rldcl = MDS(30, XO5=8, Rc=0)
+ rldclx = MDS(30, XO5=8, Rc=1)
+ rldcr = MDS(30, XO5=9, Rc=0)
+ rldcrx = MDS(30, XO5=9, Rc=1)
+
+ rldic = MDI(30, XO5=2, Rc=0)
+ rldicx = MDI(30, XO5=2, Rc=1)
+ rldicl = MDI(30, XO5=0, Rc=0)
+ rldiclx = MDI(30, XO5=0, Rc=1)
+ rldicr = MDI(30, XO5=1, Rc=0)
+ rldicrx = MDI(30, XO5=1, Rc=1)
+ rldimi = MDI(30, XO5=3, Rc=0)
+ rldimix = MDI(30, XO5=3, Rc=1)
+
rlwimi = MI(20, Rc=0)
rlwimix = MI(20, Rc=1)
@@ -399,9 +463,18 @@
rlwnm = MB(23, Rc=0)
rlwnmx = MB(23, Rc=1)
+ sld = XS(31, XO1=27, Rc=0)
+ sldx = XS(31, XO1=27, Rc=1)
+
slw = XS(31, XO1=24, Rc=0)
slwx = XS(31, XO1=24, Rc=1)
+ srad = XS(31, XO1=794, Rc=0)
+ sradx = XS(31, XO1=794, Rc=1)
+
+ sradi = Form("rA", "rS", "SH", "XO6", "sh", "Rc")(31, XO6=413, Rc=0)
+ sradix = Form("rA", "rS", "SH", "XO6", "sh", "Rc")(31, XO6=413, Rc=1)
+
sraw = XS(31, XO1=792, Rc=0)
srawx = XS(31, XO1=792, Rc=1)
@@ -413,6 +486,9 @@
stbux = XSO(31, XO1=247)
stbx = XSO(31, XO1=215)
+ stdcxx = Form("rS", "rA", "rB", "XO1", "Rc")(31, XO1=214, Rc=1)
+ stdux = XSO(31, XO1=181)
+ stdx = XSO(31, XO1=149)
stfdux = XSO(31, XO1=759)
stfdx = XSO(31, XO1=727)
stfiwx = XSO(31, XO1=983)
@@ -459,6 +535,7 @@
tlbie = Form("rB", "XO1")(31, XO1=306)
tlbsync = X(31, XO1=566)
+ td = Form("TO", "rA", "rB", "XO1")(31, XO1=68)
tw = Form("TO", "rA", "rB", "XO1")(31, XO1=4)
xor = XS(31, XO1=316, Rc=0)
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_field.py
b/pypy/jit/backend/ppc/ppcgen/ppc_field.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_field.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_field.py
@@ -27,6 +27,7 @@
"LK": (31, 31),
"MB": (21, 25),
"ME": (26, 30),
+ "mbe": (21, 26),
"NB": (16, 20),
"OE": (21, 21),
"rA": (11, 15, 'unsigned', regname._R),
@@ -35,7 +36,9 @@
"rD": ( 6, 10, 'unsigned', regname._R),
"rS": ( 6, 10, 'unsigned', regname._R),
"SH": (16, 20),
+ "sh": (30, 30),
"SIMM": (16, 31, 'signed'),
+ "SIMM14": (16, 29, 'signed'),
"SR": (12, 15),
"spr": (11, 20),
"TO": ( 6, 10),
@@ -43,6 +46,9 @@
"XO1": (21, 30),
"XO2": (22, 30),
"XO3": (26, 30),
+ "XO4": (30, 31),
+ "XO5": (27, 29),
+ "XO6": (21, 29),
}
diff --git a/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py
b/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py
--- a/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py
+++ b/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py
@@ -267,6 +267,38 @@
f = a.assemble()
assert f() == word1 + word2
+ def test_load_from(self):
+ a = PPCBuilder()
+
+ p = lltype.malloc(rffi.CArray(rffi.INT), 1, flavor="raw")
+ addr = rffi.cast(lltype.Signed, p)
+ p[0] = rffi.cast(rffi.INT, 200)
+
+ a.load_from(3, addr)
+ a.blr()
+ f = a.assemble()
+ assert f() == 200
+ p[0] = rffi.cast(rffi.INT, 300)
+ assert f() == 300
+ lltype.free(p, flavor="raw")
+
+ def test_ld(self):
+ py.test.skip("maybe works on 64 bit?")
+ a = PPCBuilder()
+
+ p = lltype.malloc(rffi.CArray(rffi.INT), 1, flavor="raw")
+ addr = rffi.cast(lltype.Signed, p)
+ p[0] = rffi.cast(rffi.INT, 200)
+
+ a.load_word(3, addr)
+ a.ld(3, 3, 0)
+ a.blr()
+
+ f = a.assemble()
+ assert f() == 200
+ lltype.free(p, flavor="raw")
+
+
class AsmCode(object):
def __init__(self, size):
self.code = MachineCodeBlockWrapper()
@@ -282,7 +314,6 @@
return rffi.cast(lltype.Ptr(t), i)
-
def func(arg):
return arg + 15
"""
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit