[pypy-svn] r78989 - pypy/branch/arm-backend/pypy/jit/backend/arm
david at codespeak.net
david at codespeak.net
Thu Nov 11 10:42:27 CET 2010
Author: david
Date: Thu Nov 11 10:42:25 2010
New Revision: 78989
Modified:
pypy/branch/arm-backend/pypy/jit/backend/arm/instruction_builder.py
Log:
Refactor the generation of the functions to write machine instructions
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/instruction_builder.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/instruction_builder.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/instruction_builder.py Thu Nov 11 10:42:25 2010
@@ -101,7 +101,7 @@
| (imm & 0xF))
return f
-def define_data_proc_imm(name, table):
+def define_data_proc_imm_func(name, table):
n = (0x1 << 25
| (table['op'] & 0x1F) << 20)
if table['result'] and table['base']:
@@ -129,7 +129,7 @@
| imm_operation(0, rn, imm))
return imm_func
-def define_data_proc(name, table):
+def define_data_proc_func(name, table):
n = ((table['op1'] & 0x1F) << 20
| (table['op2'] & 0x1F) << 7
| (table['op3'] & 0x3) << 5)
@@ -165,7 +165,7 @@
| reg_operation(rd, rn, rm, imm, s, shifttype))
return f
-def define_data_proc_register_shifted(name, table):
+def define_data_proc_reg_shift_reg_func(name, table):
n = ((0x1 << 4) | (table['op1'] & 0x1F) << 20 | (table['op2'] & 0x3) << 5)
if 'result' in table and not table['result']:
result = False
@@ -201,7 +201,7 @@
| (rn & 0xF))
return f
-def define_supervisor_and_coproc(name, table):
+def define_supervisor_and_coproc_func(name, table):
n = (0x3 << 26 | (table['op1'] & 0x3F) << 20 | (table['op'] & 0x1) << 4)
def f(self, coproc, opc1, rt, crn, crm, opc2=0, cond=cond.AL):
self.write32(n
@@ -214,7 +214,7 @@
| (crm & 0xF))
return f
-def define_multiply_instructions(name, table):
+def define_multiply_func(name, table):
n = (table['op'] & 0xF) << 20 | 0x9 << 4
if 'acc' in table and table['acc']:
if 'update_flags' in table and table['update_flags']:
@@ -288,15 +288,14 @@
setattr(target, key, f)
def define_instructions(target):
- i_g_map = [(instructions.load_store, define_load_store_func),
- (instructions.extra_load_store, define_extra_load_store_func),
- (instructions.data_proc, define_data_proc),
- (instructions.data_proc_imm, define_data_proc_imm),
- (instructions.supervisor_and_coproc, define_supervisor_and_coproc),
- (instructions.multiply, define_multiply_instructions),
- (instructions.data_proc_reg_shift_reg, define_data_proc_register_shifted),
- (instructions.block_data, define_block_data_func)]
-
- for inss, gen in i_g_map:
- for key, val in inss.iteritems():
- define_instruction(gen, key, val, target)
+ inss = [k for k in instructions.__dict__.keys() if not k.startswith('__')]
+ for name in inss:
+ if name == 'branch':
+ continue
+ try:
+ func = globals()['define_%s_func' % name]
+ except KeyError:
+ print 'No instr generator for %s instructions' % name
+ continue
+ for key, value in getattr(instructions, name).iteritems():
+ define_instruction(func, key, value, target)
More information about the Pypy-commit
mailing list