def _shri8(ins): ''' Shift 8bit signed integer to the right. The result is pushed onto the stack. Optimizations: * If 1nd or 2nd op is 0 then do nothing * If 2nd op is < 4 then unroll loop ''' op1, op2 = tuple(ins.quad[2:]) if is_int(op2): op2 = int8(op2) output = _8bit_oper(op1) if op2 == 0: output.append('push af') return output if op2 < 4: output.extend(['sra a'] * op2) output.append('push af') return output label = tmp_label() output.append('ld b, %i' % int8(op2)) output.append('%s:' % label) output.append('sra a') output.append('djnz %s' % label) output.append('push af') return output if is_int(op1) and int(op1) == 0: output = _8bit_oper(op2) output.append('xor a') output.append('push af') return output output = _8bit_oper(op1, op2, True) label = tmp_label() label2 = tmp_label() output.append('or a') output.append('ld b, a') output.append('ld a, h') output.append('jr z, %s' % label2) output.append('%s:' % label) output.append('sra a') output.append('djnz %s' % label) output.append('%s:' % label2) output.append('push af') return output
def _shl16(ins): ''' Logical/aritmetical left shift 16bit (un)signed integer. The result is pushed onto the stack. Optimizations: * If 2nd op is 0 then do nothing * If 2nd op is lower than 6 unroll lop ''' op1, op2 = tuple(ins.quad[2:]) if is_int(op2): op = int16(op2) if op == 0: return [] output = _16bit_oper(op1) if op < 6: output.extend(['add hl, hl'] * op) output.append('push hl') return output output.append('ld b, %i' % op) else: output = _8bit_oper(op2) output.append('ld b, a') output.extend(_16bit_oper(op1)) label = tmp_label() output.append('%s:' % label) output.append('add hl, hl') output.append('djnz %s' % label) output.append('push hl') return output
def _shl32(ins): ''' Logical Left shift 32bit unsigned integers. The result is pushed onto the stack. Optimizations: * If 2nd operand is 0, do nothing ''' op1, op2 = tuple(ins.quad[2:]) if is_int(op2): output = _32bit_oper(op1) if int(op2) == 0: output.append('push de') output.append('push hl') return output if int(op2) > 1: label = tmp_label() output.append('ld b, %s' % op2) output.append('%s:' % label) output.append('call __SHL32') output.append('djnz %s' % label) else: output.append('call __SHL32') output.append('push de') output.append('push hl') REQUIRES.add('shl32.asm') return output output = _8bit_oper(op2) output.append('ld b, a') output.extend(_32bit_oper(op1)) label = tmp_label() output.append('%s:' % label) output.append('call __SHL32') output.append('djnz %s' % label) output.append('push de') output.append('push hl') REQUIRES.add('shl32.asm') return output
def _shri16(ins): ''' Arithmetical right shift 16bit signed integer. The result is pushed onto the stack. Optimizations: * If 2nd op is 0 then do nothing * If 2nd op is 1 Shift Right Arithmetic ''' op1, op2 = tuple(ins.quad[2:]) if is_int(op2): op = int16(op2) if op == 0: return [] output = _16bit_oper(op1) if op == 1: output.append('srl h') output.append('rr l') output.append('push hl') return output output.append('ld b, %i' % op) else: output = _8bit_oper(op2) output.append('ld b, a') output.extend(_16bit_oper(op1)) label = tmp_label() output.append('%s:' % label) output.append('sra h') output.append('rr l') output.append('djnz %s' % label) output.append('push hl') return output