Author: Richard Plangger <planri...@gmail.com> Branch: s390x-backend Changeset: r82123:eda46a48b3de Date: 2016-02-09 11:52 +0100 http://bitbucket.org/pypy/pypy/changeset/eda46a48b3de/
Log: LE set OF flag, GE set OF flag, replace guard jump from a 12bit jump to 20bit jump (relative) 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 @@ -144,7 +144,6 @@ self.mc.LG(r.r14, l.pool(offset)) self.mc.load_imm(r.SCRATCH, fail_descr) - #self.mc.LGFI(r.SCRATCH, l.imm(fail_descr)) self.mc.BCR(l.imm(0xf), r.r14) return startpos 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 @@ -123,14 +123,14 @@ def b_cond_offset(self, offset, condition): assert condition != c.cond_none - self.BRC(condition, l.imm(offset)) + self.BRCL(condition, l.imm(offset)) def b_offset(self, reladdr): offset = reladdr - self.get_relative_pos() self.BRC(c.ANY, l.imm(offset)) def reserve_guard_branch(self): - self.BRC(l.imm(0x0), l.imm(0)) + self.BRCL(l.imm(0x0), l.imm(0)) def trap(self): self.TRAP2() @@ -168,7 +168,7 @@ def load_imm(self, dest_reg, word): - if -32768 <= word <= 32767: + if -2**15 <= word <= 2**15-1: self.LGHI(dest_reg, l.imm(word)) elif -2**31 <= word <= 2**31-1: self.LGFI(dest_reg, l.imm(word)) 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 @@ -23,39 +23,41 @@ LT = ConditionLocation(0x4) GT = ConditionLocation(0x2) OF = ConditionLocation(0x1) # overflow -LE = ConditionLocation(EQ.value | LT.value) -GE = ConditionLocation(EQ.value | GT.value) + +LE = ConditionLocation(EQ.value | LT.value | OF.value) +GE = ConditionLocation(EQ.value | GT.value | OF.value) NE = ConditionLocation(LT.value | GT.value | OF.value) NO = ConditionLocation(0xe) # NO overflow + ANY = ConditionLocation(0xf) FP_ROUND_DEFAULT = loc.imm(0x0) FP_TOWARDS_ZERO = loc.imm(0x5) -cond_none = loc.imm(0x0) +cond_none = loc.imm(-1) def negate(cond): - isfloat = (cond.value & 0x10) != 0 + val = cond.value + isfloat = (val & 0x10) != 0 + cc = (~val) & 0xf if isfloat: # inverting is handeled differently for floats - # overflow is never inverted - value = (~cond.value) & 0xf - return ConditionLocation(value | FLOAT.value) - value = (~cond.value) & 0xf - return ConditionLocation(value) + return ConditionLocation(cc | FLOAT.value) + return ConditionLocation(cc) def prepare_float_condition(cond): newcond = ConditionLocation(cond.value | FLOAT.value) return newcond -def _assert_invert(v1, v2): - assert (v1.value & 0xe) == (v2.value & 0xe) -_assert_invert(negate(EQ), NE) -_assert_invert(negate(NE), EQ) -_assert_invert(negate(LT), GE) -_assert_invert(negate(LE), GT) -_assert_invert(negate(GT), LE) -_assert_invert(negate(GE), LT) -assert negate(NO).value == OF.value -assert negate(OF).value == NO.value -del _assert_invert +def _assert_value(v1, v2): + assert v1.value == v2.value + +_assert_value(negate(EQ), NE) +_assert_value(negate(NE), EQ) +_assert_value(negate(LT), GE) +_assert_value(negate(LE), GT) +_assert_value(negate(GT), LE) +_assert_value(negate(GE), LT) +_assert_value(negate(NO), OF) +_assert_value(negate(OF), NO) +del _assert_value diff --git a/rpython/jit/backend/zarch/opassembler.py b/rpython/jit/backend/zarch/opassembler.py --- a/rpython/jit/backend/zarch/opassembler.py +++ b/rpython/jit/backend/zarch/opassembler.py @@ -365,7 +365,7 @@ def emit_cond_call(self, op, arglocs, regalloc): fcond = self.guard_success_cc self.guard_success_cc = c.cond_none - assert fcond != c.cond_none + assert fcond.value != c.cond_none.value fcond = c.negate(fcond) jmp_adr = self.mc.get_relative_pos() @@ -631,7 +631,7 @@ else: fcond = self.guard_success_cc self.guard_success_cc = c.cond_none - assert fcond != c.cond_none + assert fcond.value != c.cond_none.value fcond = c.negate(fcond) token = self.build_guard_token(op, arglocs[0].value, arglocs[1:], fcond) token.pos_jump_offset = self.mc.currpos() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit