def code(self): res = '' next_ip = self._ip + 5 res += '\xe8' + numtol(self._label_ip - next_ip) # call near <label> res += '\x48\x81\xc4' + numtol(Word_size * self._nargs) # add rsp, Word_size*<nargs> ; pop pushed parameters for i in range(self._nretvals): # take the return values and push them in the stack offset = -Word_size * (i + 1) res += '\xff\xb7' + numtol(offset) # push qword [rdi - Word_size * i] assert len(res) == self.len() return res
def code_local(self): offset = -self._var_num * Word_size boom_code = lang.jit.x86_64_builtins.boom_code_for(i18n.i18n('Uninitialized variable')) res = ''.join([ '\x48\x8b\x85' + numtol(offset, nbytes=4), # mov rax, [rbp + <offset>] '\x48\xba\xff\xff\xff\xff\xff\xff\xff\x7f', # mov rdx, <Undefined_value> '\x48\x39\xd0', # cmp rax, rdx '\x0f\x85' + numtol(len(boom_code), 4), # jne .end boom_code, '\xff\xb5' + numtol(offset, nbytes=4), # push qword [rbp + <offset>] ]) return res
def code(self): offset = self._var_num * Word_size if self._local_param == 'local': sig = -1 else: sig = 1 # pop qword [rbp +/- <offset>] res = '\x8f' if offset < 0x80: res += '\x45' + numtol(sig * offset, nbytes=1) else: res += '\x85' + numtol(sig * offset, nbytes=4) return res
def code(self): res = '' next_ip = self._ip + 5 res += '\xe8' + numtol(self._label_ip - next_ip) # call near <label> res += '\x48\x81\xc4' + numtol( Word_size * self._nargs) # add rsp, Word_size*<nargs> ; pop pushed parameters for i in range(self._nretvals): # take the return values and push them in the stack offset = -Word_size * (i + 1) res += '\xff\xb7' + numtol( offset) # push qword [rdi - Word_size * i] assert len(res) == self.len() return res
def code_local(self): offset = -self._var_num * Word_size boom_code = lang.jit.x86_64_builtins.boom_code_for( i18n.i18n('Uninitialized variable')) res = ''.join([ '\x48\x8b\x85' + numtol(offset, nbytes=4), # mov rax, [rbp + <offset>] '\x48\xba\xff\xff\xff\xff\xff\xff\xff\x7f', # mov rdx, <Undefined_value> '\x48\x39\xd0', # cmp rax, rdx '\x0f\x85' + numtol(len(boom_code), 4), # jne .end boom_code, '\xff\xb5' + numtol(offset, nbytes=4), # push qword [rbp + <offset>] ]) return res
def code(self): res = '' if self._num_locals != 0: res += '\x48\x81\xc4' + numtol(Word_size * self._num_locals) # add rsp, Word_size * <num_locals> ; pop locals res += '\x5d' # pop rbp res += '\xc3' # ret return res
def code(self): next_ip = self._ip + self.len() res = '' res += '\x58' # pop rax res += '\x48\x85\xc0' # test rax, rax res += '\x0f\x84' + numtol(self._label_ip - next_ip) # jz near <label> assert len(res) == self.len() return res
def code(self): # to return, leave the values in the stack, but return the # stack top as if popping them and save in "rdi" the place # where they start res = '' res += '\x48\x81\xc4' + numtol(Word_size * self._nretvals) # add rsp, Word_size * num_retvals res += '\x48\x89\xe7' # mov rdi, rsp return res
def code(self): res = '' res += '\x55' # push rbp res += '\x48\x89\xe5' # mov rbp, rsp for i in range(self._num_locals): res += '\x48\xb8' + numtol(Undefined_value, nbytes=8) # mov rax, <Undefined_value> res += '\x50' # push rax return res
def code(self): # to return, leave the values in the stack, but return the # stack top as if popping them and save in "rdi" the place # where they start res = '' res += '\x48\x81\xc4' + numtol( Word_size * self._nretvals) # add rsp, Word_size * num_retvals res += '\x48\x89\xe7' # mov rdi, rsp return res
def code(self): res = '' if self._num_locals != 0: res += '\x48\x81\xc4' + numtol( Word_size * self._num_locals ) # add rsp, Word_size * <num_locals> ; pop locals res += '\x5d' # pop rbp res += '\xc3' # ret return res
def code(self): # to return, leave the values in the stack, but return the # stack top as if popping them and save in "rdi" the place # where they start res = ''.join([ '\x48\x81\xc4' + numtol(Word_size * self._nretvals), # add rsp, Word_size * num_retvals '\x48\x89\xe7', # mov rdi, rsp lang.jit.x86_64_builtins.Undo_builtins['leave'], ]) return res
def code(self): res = [] res.extend([ '\x48\xb8' + numtol(self._nretvals, 8) # mov rax, <nretvals> ]) for i in range(self._nretvals): res.extend([ '\x48\xff\xc8', # dec rax '\x41\x8f\x04\xc7', # pop qword [r15 + 8 * rax] ]) return ''.join(res)
def code(self): next_ip = self._ip + self.len() res = [] res.extend([ '\x58', # pop rax ; reference value '\x4d\x31\xc9', # xor r9, r9 ; 0 iff should jump ]) for val in self._values: res.extend([ '\x48\xba' + x86_64_literal(val), # mov rdx, <value> ; compared value '\x48\x39\xd0', # cmp rax, rdx '\x0f\x94\xc2', # sete dl '\x48\x0f\xb6\xd2', # movzx rdx, dl '\x49\x01\xd1', # add r9, rdx ]) res.extend([ '\x4d\x85\xc9', # test r9, r9 '\x0f\x84' + numtol(self._label_ip - next_ip), # jz near <label> ]) res = ''.join(res) assert len(res) == self.len() return res
def code_param(self): offset = (self._var_num + 1) * Word_size return '\xff\xb5' + numtol(offset, nbytes=4) # push qword [rbp + <offset>]
def _repr(lit): if -0x8000000000000000 <= lit and lit < 0x7fffffffffffffff: return numtol(lit, nbytes=8) else: raise GbsJitPrimitiveException('integer literal too big')
def code(self): next_ip = self._ip + self.len() res = '\xe9' + numtol(self._label_ip - next_ip) # jmp near <label> assert len(res) == self.len() return res