0

I have this function:

#include <cstdint> using ::std::intptr_t; struct syscall_param { syscall_param(intptr_t v) : value(v) { } syscall_param(void *v) : value(reinterpret_cast<::std::intptr_t>(v)) { } intptr_t value; }; inline intptr_t do_syscall(syscall_param const &callnum, syscall_param const &p1, syscall_param const &p2, syscall_param const &p3, syscall_param const &p4, syscall_param const &p5, syscall_param const &p6) { intptr_t retval; asm volatile ( "movq %5, %%r10\n\t" "movq %6, %%r8\n\t" "movq %7, %%r9\n\t" "syscall\n\t" :"=a"(retval) :"a"(callnum.value), "D"(p1.value), "S"(p2.value), "d"(p3.value), "g"(p4.value), "g"(p5.value), "g"(p6.value) :"%rcx", "%r11", "%r10", "%r8", "%r9" ); return retval; } 

I would really like to get rid of the movq instructions by using contraints. While I can use constraints to get things into the rax, edi, esi, and rdx registers, there don't seem to be any constraints that let me get things into the r10, r8, and r9 registers. It seems like there ought to be a constrain that would allow me to get things into an arbitrary r# register. Am I missing something? Is there a better way to do what I want?

6

0

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.