def start(self, align=True, branch=True): if self.r_count is None: self.r_count = self.code.acquire_register() if self.mode == CTR and branch: if self.step_size() != 1: raise Exception( 'CTR loops must have step_size of 1, you used ' + str(self.step_size())) if self.external_stop: self.code.add(ppc.mtctr(self.r_stop)) else: util.load_word(self.code, self.r_count, self.n_steps()) self.code.add(ppc.mtctr(self.r_count)) self.code.release_register(self.r_count) self.r_count = None elif self.mode == DEC: util.load_word(self.code, self.r_count, self.get_count()) elif self.mode == INC: if self.r_stop is None and branch: self.r_stop = self.code.acquire_register() util.load_word(self.code, self.r_count, self.get_start()) if branch and not self.external_stop: util.load_word(self.code, self.r_stop, self.get_count()) # /end mode if if self.r_count is not None: # self.current_count = metavar.int_var(self.code, reg = self.r_count) self.current_count = vars.UnsignedWord(reg=self.r_count) if align and branch: # Align the start of the loop on a 16 byte boundary while (self.code.size()) % 4 != 0: self.code.add(ppc.noop()) # Label self.start_label = self.code.size() + 1 return
def start(self, align = True, branch = True): if self.r_count is None: self.r_count = self.code.prgm.acquire_register() if self.mode == CTR and branch: if self.step_size() != 1: raise Exception('CTR loops must have step_size of 1, you used ' + str(self.step_size())) if self.external_stop: self.code.add(ppc.mtctr(self.r_stop)) else: util.load_word(self.code, self.r_count, self.n_steps()) self.code.add(ppc.mtctr(self.r_count)) self.code.prgm.release_register(self.r_count) self.r_count = None elif self.mode == DEC: util.load_word(self.code, self.r_count, self.get_count()) elif self.mode == INC: if self.r_stop is None and branch: self.r_stop = self.code.prgm.acquire_register() util.load_word(self.code, self.r_count, self.get_start()) if branch and not self.external_stop: util.load_word(self.code, self.r_stop, self.get_count()) # /end mode if if self.r_count is not None: self.current_count = vars.UnsignedWord(code = self.code, reg = self.r_count) if align and branch: # Align the start of the loop on a 16 byte boundary while (self.code.size()) % 4 != 0: self.code.add(ppc.noop()) # Label self.start_label = self.code.prgm.get_unique_label("SYN_ITER_START") self.code.add(self.start_label) return
print 'float result:', r code.reset() load_word(code, prgm.gp_return, 0xFFFFFFFF) r = proc.execute(prgm, mode='int', debug=True) print "int result:",r assert(r == -1) code.reset() ppc.addi(prgm.gp_return, 0, 16) ppc.mtctr(prgm.gp_return) ppc.addi(prgm.gp_return, 0, 0) lbl_loop = prgm.get_label("LOOP") code.add(lbl_loop) ppc.addi(prgm.gp_return, prgm.gp_return, 2) ppc.bdnz(lbl_loop) #prgm.print_code(hex = True) r = proc.execute(prgm, mode='int', debug=True) print "int result:",r assert(r == 32) #sys.exit(0) # ------------------------------------------------------------
r = proc.execute(code, mode='fp', debug=True) assert (r == 3.14) print 'float result:', r code.reset() load_word(code, code.gp_return, 0xFFFFFFFF) r = proc.execute(code, mode='int', debug=True) print "int result:", r assert (r == -1) code.reset() ppc.addi(code.gp_return, 0, 16) ppc.mtctr(code.gp_return) ppc.addi(code.gp_return, 0, 0) lbl_loop = code.get_label("LOOP") code.add(lbl_loop) ppc.addi(code.gp_return, code.gp_return, 2) ppc.bdnz(lbl_loop) code.print_code(hex=True) r = proc.execute(code, mode='int', debug=True) print "int result:", r assert (r == 32) sys.exit(0) # ------------------------------------------------------------
r = proc.execute(prgm, mode='fp', debug=True) assert (r == 3.14) print 'float result:', r code.reset() load_word(code, prgm.gp_return, 0xFFFFFFFF) r = proc.execute(prgm, mode='int', debug=True) print "int result:", r assert (r == -1) code.reset() ppc.addi(prgm.gp_return, 0, 16) ppc.mtctr(prgm.gp_return) ppc.addi(prgm.gp_return, 0, 0) lbl_loop = prgm.get_label("LOOP") code.add(lbl_loop) ppc.addi(prgm.gp_return, prgm.gp_return, 2) ppc.bdnz(lbl_loop) #prgm.print_code(hex = True) r = proc.execute(prgm, mode='int', debug=True) print "int result:", r assert (r == 32) #sys.exit(0) # ------------------------------------------------------------