[pypy-svn] r78997 - pypy/branch/arm-backend/pypy/jit/backend/arm
david at codespeak.net
david at codespeak.net
Thu Nov 11 14:21:54 CET 2010
Author: david
Date: Thu Nov 11 14:21:53 2010
New Revision: 78997
Modified:
pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
Log:
Implement unicode operations unicodelen, unicodegetitem and unicodesetitem
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py Thu Nov 11 14:21:53 2010
@@ -393,7 +393,7 @@
_mixin_ = True
def emit_op_strlen(self, op, regalloc, fcond):
- l0 = regalloc.make_sure_var_in_reg(op.getarg(0))
+ l0 = regalloc.make_sure_var_in_reg(op.getarg(0), imm_fine=False)
regalloc.possibly_free_vars_for_op(op)
res = regalloc.force_allocate_reg(op.result)
basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
@@ -406,7 +406,7 @@
return fcond
def emit_op_strgetitem(self, op, regalloc, fcond):
- base_loc = regalloc.make_sure_var_in_reg(op.getarg(0), imm_fine=True)
+ base_loc = regalloc.make_sure_var_in_reg(op.getarg(0), imm_fine=False)
ofs_loc = regalloc.make_sure_var_in_reg(op.getarg(1))
t = TempBox()
temp = regalloc.force_allocate_reg(t)
@@ -426,7 +426,7 @@
return fcond
def emit_op_strsetitem(self, op, regalloc, fcond):
- base_loc = regalloc.make_sure_var_in_reg(op.getarg(0), imm_fine=True)
+ base_loc = regalloc.make_sure_var_in_reg(op.getarg(0), imm_fine=False)
ofs_loc = regalloc.make_sure_var_in_reg(op.getarg(1))
value_loc = regalloc.make_sure_var_in_reg(op.getarg(2))
t = TempBox()
@@ -445,9 +445,72 @@
self.mc.STRB_ri(value_loc.value, temp.value, basesize, cond=fcond)
return fcond
+class UnicodeOpAssembler(object):
+ _mixin_ = True
+
+ def emit_op_unicodelen(self, op, regalloc, fcond):
+ l0 = regalloc.make_sure_var_in_reg(op.getarg(0), imm_fine=False)
+ regalloc.possibly_free_vars_for_op(op)
+ res = regalloc.force_allocate_reg(op.result)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+ self.cpu.translate_support_code)
+ l1 = regalloc.make_sure_var_in_reg(ConstInt(ofs_length))
+ if l1.is_imm():
+ self.mc.LDR_ri(res.value, l0.value, l1.getint(), cond=fcond)
+ else:
+ self.mc.LDR_rr(res.value, l0.value, l1.value, cond=fcond)
+ return fcond
+
+ def emit_op_unicodegetitem(self, op, regalloc, fcond):
+ base_loc = regalloc.make_sure_var_in_reg(op.getarg(0), imm_fine=False)
+ ofs_loc = regalloc.make_sure_var_in_reg(op.getarg(1), imm_fine=False)
+ t = TempBox()
+ temp = regalloc.force_allocate_reg(t)
+ res = regalloc.force_allocate_reg(op.result)
+ regalloc.possibly_free_vars_for_op(op)
+ regalloc.possibly_free_var(t)
+
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+ self.cpu.translate_support_code)
+ scale = itemsize/2
+ if scale == 2:
+ f = self.mc.LDR_ri
+ elif scale == 1:
+ f = self.mc.LDRH_ri
+ else:
+ assert 0, itemsize
+ self.mc.ADD_rr(temp.value, base_loc.value, ofs_loc.value, cond=fcond,
+ imm=scale, shifttype=shift.LSL)
+ f(res.value, temp.value, basesize, cond=fcond)
+ return fcond
+
+ def emit_op_unicodesetitem(self, op, regalloc, fcond):
+ base_loc = regalloc.make_sure_var_in_reg(op.getarg(0), imm_fine=False)
+ ofs_loc = regalloc.make_sure_var_in_reg(op.getarg(1))
+ value_loc = regalloc.make_sure_var_in_reg(op.getarg(2))
+ t = TempBox()
+ temp = regalloc.force_allocate_reg(t)
+ regalloc.possibly_free_vars_for_op(op)
+ regalloc.possibly_free_var(t)
+
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+ self.cpu.translate_support_code)
+ scale = itemsize/2
+ if scale == 2:
+ f = self.mc.STR_ri
+ elif scale == 1:
+ f = self.mc.STRH_ri
+ else:
+ assert 0, itemsize
+
+ self.mc.ADD_rr(temp.value, base_loc.value, ofs_loc.value, cond=fcond,
+ imm=scale, shifttype=shift.LSL)
+ f(value_loc.value, temp.value, basesize, cond=fcond)
+ return fcond
+
class ResOpAssembler(GuardOpAssembler, IntOpAsslember,
OpAssembler, UnaryIntOpAssembler,
FieldOpAssembler, ArrayOpAssember,
- StrOpAssembler):
+ StrOpAssembler, UnicodeOpAssembler):
pass
More information about the Pypy-commit
mailing list