X86

Registers

Type Names
int32 %eax, %ecx, %edx, %ebx, %esi, %edi, %ebp
int3232 %mm0, %mm1, %mm2, %mm3, %mm4, %mm5, %mm6, %mm7
int6464 %xmm0, %xmm1, %xmm2, %xmm3, %xmm4, %xmm5, %xmm6, %xmm7
float80 %st(0), %st(1), %st(2), %st(3), %st(4), %st(5), %st(6), %st(7)

Caller (Callee safe, non-volatile) registers

Type Names
int32 1, 4, 5, 6, 7

Supported stack types

Type Number of bytes
stack32 4
stack64 8
stack128 16
stack256 32
stack512 64

Supported integer operations

Supported integer load/store operations

Qhasm Instruction Input Evaluated flags Output Set flags Assembly Code
r = s stack32 s int32 r movl s,r
r = *(uint8 *) (s + n) int32 s, immediate n int32 r movzbl n(s),r
r = *(uint16 *) (s + n) int32 s, immediate n int32 r movzwl n(s),r
r = *(uint32 *) (s + n) int32 s, immediate n int32 r movl n(s),r
r = *(uint8 *) (&n + s) int32 s, immediate n int32 r movzbl n(s),r
r = *(uint16 *) (&n + s) int32 s, immediate n int32 r movzwl n(s),r
r = *(uint32 *) (&n + s) int32 s, immediate n int32 r movl n(s),r
r = *(uint8 *) (&n + s * 8) int32 s, immediate n int32 r movzbl n(,s,8),r
r = *(uint16 *) (&n + s * 8) int32 s, immediate n int32 r movzwl n(,s,8),r
r = *(uint32 *) (&n + s * 8) int32 s, immediate n int32 r movl n(,s,8),r
r = *(uint8 *) (s + t) int32 s, int32 t int32 r movzbl (s,t),r
r = *(uint16 *) (s + t) int32 s, int32 t int32 r movzwl (s,t),r
r = *(uint32 *) (s + t) int32 s, int32 t int32 r movl (s,t),r
r = bottom s stack64 s int32 r movl s,r
r = top s stack64 s int32 r movl !shift4s,r
r = &s stack512 s int32 r, stack512 s leal s,r
r = &s stack128 s int32 r, stack128 s leal s,r
r = s stack128 s int6464 r movdqa s,r
r = ((uint32 *)&s)[0] stack128 s int32 r movl s,r
r = ((uint32 *)&s)[1] stack128 s int32 r movl 4+s,r
r = ((uint32 *)&s)[2] stack128 s int32 r movl 8+s,r
r = ((uint32 *)&s)[3] stack128 s int32 r movl 12+s,r
int32323232 r += s int6464 r, stack128 s int6464 r paddd s,r
uint32323232 r += s int6464 r, stack128 s int6464 r paddd s,r
int32323232 r -= s int6464 r, stack128 s int6464 r psubd s,r
uint32323232 r -= s int6464 r, stack128 s int6464 r psubd s,r
r = *(int128 *) (s + n) int32 s, immediate n int6464 r movdqa n(s),r
uint32323232 r += *(int128 *) (s + n) int6464 r, int32 s, immediate n int6464 r paddd n(s),r
r += s int32 r, stack32 s int32 r =, unsigned>, unsigned<, carry addl s,r
r += s + carry int32 r, stack32 s carry int32 r =, unsigned>, unsigned<, carry adcl s,r
r -= s int32 r, stack32 s int32 r =, unsigned>, unsigned< subl s,r
r &= s int32 r, stack32 s int32 r =, unsigned>, unsigned< andl s,r
r |= s int32 r, stack32 s int32 r =, unsigned>, unsigned< orl s,r
r ^= s int32 r, stack32 s int32 r =, unsigned>, unsigned< xorl s,r
r += *(uint32 *) (s + n) int32 r, int32 s, immediate n int32 r =, unsigned>, unsigned<, carry addl n(s),r
r += *(uint32 *) (s + n) + carry int32 r, int32 s, immediate n carry int32 r =, unsigned>, unsigned<, carry adcl n(s),r
r -= *(uint32 *) (s + n) int32 r, int32 s, immediate n int32 r =, unsigned>, unsigned< subl n(s),r
r &= *(uint32 *) (s + n) int32 r, int32 s, immediate n int32 r =, unsigned>, unsigned< andl n(s),r
r |= *(uint32 *) (s + n) int32 r, int32 s, immediate n int32 r =, unsigned>, unsigned< orl n(s),r
r ^= *(uint32 *) (s + n) int32 r, int32 s, immediate n int32 r =, unsigned>, unsigned< xorl n(s),r
r ^= *(uint32 *) (&n + s) int32 r, int32 s, immediate n int32 r =, unsigned>, unsigned< xorl n(s),r
r ^= *(uint32 *) (&n + s * 8) int32 r, int32 s, immediate n int32 r =, unsigned>, unsigned< xorl n(,s,8),r
r = s int32 s stack32 r movl s,r
*(uint8 *) (s + n) = r int32 s, immediate n movb r%8,n(s)
*(uint16 *) (s + n) = r int32 s, immediate n movw r%16,n(s)
*(uint32 *) (s + n) = r int32 r, int32 s, immediate n movl r,n(s)
*(uint8 *) (&n + s) = r int32 s, immediate n movb r%8,n(s)
*(uint16 *) (&n + s) = r int32 s, immediate n movw r%16,n(s)
*(uint32 *) (&n + s) = r int32 r, int32 s, immediate n movl r,n(s)
*(uint8 *) (&n + s * 8) = r int32 s, immediate n movb r%8,n(,s,8)
*(uint16 *) (&n + s * 8) = r int32 s, immediate n movw r%16,n(,s,8)
*(uint32 *) (&n + s * 8) = r int32 r, int32 s, immediate n movl r,n(,s,8)
*(uint8 *) (s + t) = r int32 s, int32 t movb r%8,(s,t)
*(uint16 *) (s + t) = r int32 s, int32 t movw r%16,(s,t)
*(uint32 *) (s + t) = r int32 r, int32 s, int32 t movl r,(s,t)
*(uint8 *) (s + n) = m int32 s, immediate n, immediate m movb $m,n(s)
*(uint16 *) (s + n) = m int32 s, immediate n, immediate m movw $m,n(s)
*(uint32 *) (s + n) = m int32 s, immediate n, immediate m movl $m,n(s)
inplace r bottom = s int32 s, stack64 r stack64 r movl s,r
r = s int6464 s stack128 r movdqa s,r
((uint32 *)&r)[0] = 0 stack128 r movl $0,r
((uint32 *)&r)[1] = 0 stack128 r stack128 r movl $0,4+r
((uint32 *)&r)[2] = 0 stack128 r stack128 r movl $0,8+r
((uint32 *)&r)[3] = 0 stack128 r stack128 r movl $0,12+r
((uint32 *)&r)[0] = s int32 s stack128 r movl s,r
((uint32 *)&r)[1] = s int32 s, stack128 r stack128 r movl s,4+r
((uint32 *)&r)[2] = s int32 s, stack128 r stack128 r movl s,8+r
((uint32 *)&r)[3] = s int32 s, stack128 r stack128 r movl s,12+r

Supported integer arithmetic operations

Qhasm Instruction Input Evaluated flags Output Set flags Assembly Code
r = s int32 s int32 r mov s,r
r = s int3232 s int32 r movd s,r
r = s int32 s int3232 r movd s,r
r = s int6464 s int32 r movd s,r
r = s int32 s int6464 r movd s,r
r = s & 255 int32 r movzbl s%8,r
r = (s >> 8) & 255 int32 r movzbl s%next8,r
r &= s int6464 r, int6464 s int6464 r pand s,r
r &= s int32 r, int32 s int32 r =, unsigned>, unsigned< andl s,r
r &= n int32 r, immediate n int32 r =, unsigned>, unsigned< and $n,r
int32323232 r += s int6464 r, int6464 s int6464 r paddd s,r
uint32323232 r += s int6464 r, int6464 s int6464 r paddd s,r
r = s + t int32 s, int32 t int32 r lea (s,t),r
r += s int32 r, int32 s int32 r =, unsigned>, unsigned<, carry addl s,r
r += s + carry int32 r, int32 s carry int32 r =, unsigned>, unsigned<, carry adcl s,r
r = s + t + n int32 s, int32 t, immediate n int32 r lea n(s,t),r
r += t + n int32 r, int32 t, immediate n int32 r lea n(r,t),r
r += n int32 r, immediate n int32 r =, unsigned>, unsigned<, carry add $n,r
r += n + carry int32 r, immediate n carry int32 r =, unsigned>, unsigned<, carry adc $n,r
int32323232 r -= s int6464 r, int6464 s int6464 r psubd s,r
uint32323232 r -= s int6464 r, int6464 s int6464 r psubd s,r
r -= s int32 r, int32 s int32 r =, unsigned>, unsigned< subl s,r
r - s int32 r, int32 s =, unsigned>, unsigned< cmp s,r
r = -n immediate n int32 r mov $-n,r
r -= n int32 r, immediate n int32 r =, unsigned>, unsigned< sub $n,r
r - n int32 r, immediate n =, unsigned>, unsigned< cmp $n,r
r = 0 int6464 r pxor r,r
r <<= s int32 r int32 r =, unsigned>, unsigned< shl %cl,r
r <<<= 0 int6464 r int6464 r pshufd $0xe4,r,r
r = s <<< 0 int6464 s int6464 r pshufd $0xe4,s,r
r <<<= 32 int6464 r int6464 r pshufd $0x93,r,r
r = s <<< 32 int6464 s int6464 r pshufd $0x93,s,r
r <<<= 64 int6464 r int6464 r pshufd $0x4e,r,r
r = s <<< 64 int6464 s int6464 r pshufd $0x4e,s,r
r <<<= 96 int6464 r int6464 r pshufd $0x39,r,r
r = s <<< 96 int6464 s int6464 r pshufd $0x39,s,r
r <<<= n int32 r, immediate n int32 r =, unsigned>, unsigned< rol $n,r
int32323232 r <<= n int6464 r, immediate n int6464 r pslld $n,r
uint32323232 r <<= n int6464 r, immediate n int6464 r pslld $n,r
r <<= n int32 r, immediate n int32 r =, unsigned>, unsigned< shl $n,r
(uint32) r >>= s int32 r int32 r =, unsigned>, unsigned< shr %cl,r
(int32) r >>= s int32 r int32 r =, unsigned>, unsigned< sar %cl,r
int32323232 r >>= n int6464 r, immediate n int6464 r psrad $n,r
uint32323232 r >>= n int6464 r, immediate n int6464 r psrld $n,r
(uint32) r >>= n int32 r, immediate n int32 r =, unsigned>, unsigned< shr $n,r
(int32) r >>= n int32 r, immediate n int32 r =, unsigned>, unsigned< sar $n,r
r ^= s int6464 r, int6464 s int6464 r pxor s,r
r ^= s int32 r, int32 s int32 r =, unsigned>, unsigned< xorl s,r
r ^= -n int32 r, immediate n int32 r =, unsigned>, unsigned< xor $-n,r
r ^= n int32 r, immediate n int32 r =, unsigned>, unsigned< xor $n,r
assign 1 to r
assign 2 to r
assign 3 to r
assign 4 to r
assign 5 to r
assign 6 to r
assign 7 to r
r = n immediate n int32 r mov $n,r
while (n) { *y++ = x; --n } rep stosb
while (n) { *y++ = *x++; --n } rep movsb
r |= s int6464 r, int6464 s int6464 r por s,r
r |= s int32 r, int32 s int32 r =, unsigned>, unsigned< orl s,r
r |= n int32 r, immediate n int32 r =, unsigned>, unsigned< or $n,r
r ~&= s int6464 r, int6464 s int6464 r pandn s,r

Supported floating point operations

Supported floating point load/store operations

Qhasm Instruction Input Evaluated flags Output Set flags Assembly Code
r = *(float64 *) &n immediate n float80 r fldl n
r = *(float64 *) &s stack64 s float80 r fldl s
r = *(float64 *) (s + n) int32 s, immediate n float80 r fldl n(s)
r += *(float64 *) &n float80 r, immediate n float80 r faddl n
r += *(float64 *) &s float80 r, stack64 s float80 r faddl s
r += *(float64 *) (s + n) float80 r, int32 s, immediate n float80 r faddl n(s)
r -= *(float64 *) &n float80 r, immediate n float80 r fsubl n
r -= *(float64 *) &s float80 r, stack64 s float80 r fsubl s
r -= *(float64 *) (s + n) float80 r, int32 s, immediate n float80 r fsubl n(s)
r *= *(float64 *) &n float80 r, immediate n float80 r fmull n
r *= *(float64 *) &s float80 r, stack64 s float80 r fmull s
r *= *(float64 *) (s + n) float80 r, int32 s, immediate n float80 r fmull n(s)
r = *(int32 *) &n immediate n float80 r fildl n
r = *(int32 *) &s stack32 s float80 r fildl s
r = *(int32 *) (s + n) int32 s, immediate n float80 r fildl n(s)
*(float64 *) (s + n) = r float80 r, int32 s, immediate n fstpl n(s)!pop
*(float64 *) &s = r float80 r stack64 s fstpl s!pop

Supported floating point arithmetic operations

Qhasm Instruction Input Evaluated flags Output Set flags Assembly Code
r *= s float80 r, float80 s float80 r fmulp s,r!pop
r += s float80 r, float80 s float80 r faddp s,r!pop
r -= s float80 r, float80 s float80 r fsubrp s,r!pop!reverse
r -= s;negate float80 r, float80 s float80 r fsubp s,r!pop!reverse
r = 0 float80 r fldz
stackpop r float80 r fstp %st(0)
stacktop r float80 r fxch r

Supported misc operations

Supported misc misc operations

Qhasm Instruction Input Evaluated flags Output Set flags Assembly Code
caller r
emms emms
r top = n immediate n stack64 r movl $n,!shift4r
round *(uint16 *) &n immediate n fldcw n
f# immediate f ._f!:

Supported branch operations

Supported branch conditional operations

Qhasm Instruction Input Evaluated flags Output Set flags Assembly Code
goto f if = immediate f = je ._f
goto f if != immediate f = jne ._f
goto f if unsigned> immediate f unsigned> ja ._f
goto f if !unsigned> immediate f unsigned> jbe ._f
goto f if unsigned< immediate f unsigned< jb ._f
goto f if !unsigned< immediate f unsigned< jae ._f

Supported branch unconditional operations

Qhasm Instruction Input Evaluated flags Output Set flags Assembly Code
goto f immediate f jmp ._f

Supported declaration operations

Supported declaration misc operations

Qhasm Instruction Input Evaluated flags Output Set flags Assembly Code
float80 r
int3232 r
int32 r
int6464 r
stack128 r
stack256 r
stack32 r
stack512 r
stack64 r