def execute(self, processor): if processor.condition_passed(): try: processor.null_check_if_thumbee(self.n) except EndOfInstruction: pass else: offset_addr = bits_add(processor.registers.get( self.n), self.imm32, 32) if self.add else bits_sub( processor.registers.get(self.n), self.imm32, 32) address = offset_addr if self.index else processor.registers.get( self.n) if have_lpae() and substring(address, 2, 0) == 0b000: data = processor.mem_a_get(address, 8) if processor.big_endian(): processor.registers.set(self.t, substring(data, 63, 32)) processor.registers.set(self.t2, substring(data, 31, 0)) else: processor.registers.set(self.t, substring(data, 31, 0)) processor.registers.set(self.t2, substring(data, 63, 32)) else: processor.registers.set(self.t, processor.mem_a_get(address, 4)) processor.registers.set( self.t2, processor.mem_a_get(bits_add(address, 4, 32), 4)) if self.wback: processor.registers.set(self.n, offset_addr)
def execute(self, processor): if processor.condition_passed(): try: processor.null_check_if_thumbee(15) except EndOfInstruction: pass else: address = bits_add(align(processor.registers.get_pc(), 4), self.imm32, 32) if self.add else bits_sub( align(processor.registers.get_pc(), 4), self.imm32, 32) if have_lpae() and address[29:32] == "0b000": data = processor.mem_a_get(address, 8) if processor.big_endian(): processor.registers.set(self.t, data[0:32]) processor.registers.set(self.t2, data[32:64]) else: processor.registers.set(self.t, data[32:64]) processor.registers.set(self.t2, data[0:32]) else: processor.registers.set(self.t, processor.mem_a_get(address, 4)) processor.registers.set( self.t2, processor.mem_a_get( bits_add(address, BitArray(bin="0b100"), 32), 4))
def execute(self, processor): if processor.condition_passed(): try: processor.null_check_if_thumbee(self.n) except EndOfInstruction: pass else: offset_addr = bits_add(processor.registers.get( self.n), self.imm32, 32) if self.add else bits_sub( processor.registers.get(self.n), self.imm32, 32) address = offset_addr if self.index else processor.registers.get( self.n) if have_lpae() and lower_chunk(address, 3) == 0b000: if processor.big_endian(): data = chain(processor.registers.get(self.t), processor.registers.get(self.t2), 32) else: data = chain(processor.registers.get(self.t2), processor.registers.get(self.t), 32) processor.mem_a_set(address, 8, data) else: processor.mem_a_set(address, 4, processor.registers.get(self.t)) processor.mem_a_set(bits_add(address, 4, 32), 4, processor.registers.get(self.t2)) if self.wback: processor.registers.set(self.n, offset_addr)
def execute(self, processor): if processor.condition_passed(): offset_addr = bits_add(processor.registers.get(self.n), processor.registers.get(self.m), 32) if self.add else bits_sub( processor.registers.get(self.n), processor.registers.get(self.m), 32) address = offset_addr if self.index else processor.registers.get( self.n) if have_lpae() and substring(address, 2, 0) == 0b000: if processor.big_endian(): data = chain(processor.registers.get(self.t), processor.registers.get(self.t2), 32) else: data = chain(processor.registers.get(self.t2), processor.registers.get(self.t), 32) processor.mem_a_set(address, 8, data) else: processor.mem_a_set(address, 4, processor.registers.get(self.t)) processor.mem_a_set(bits_add(address, 4, 32), 4, processor.registers.get(self.t2)) if self.wback: processor.registers.set(self.n, offset_addr)