aboutsummaryrefslogtreecommitdiff
path: root/x86_64-asm.h
Commit message (Collapse)AuthorAgeFilesLines
* x86-64-asm: Fix mov im64,rax encodingMichael Matz2017-02-231-9/+9
| | | | | | | the avoidance of mov im32->reg64 wasn't working when reg64 was rax. While fixing this also fix instructions which had the REX prefix hardcoded in opcode and so didn't support extended registers which would have added another REX prefix.
* x86-64-asm: Implement cmpxchg16bMichael Matz2016-12-151-0/+3
|
* x86-64-asm: Fix ltr/str and push/pop operandsMichael Matz2016-12-151-2/+4
| | | | | str accepts rm16/r32/r64, and push/pop defaults to 64 when given memory operands (to 32 on i386).
* x86-asm: Implement prefetchw opcodeMichael Matz2016-12-151-0/+1
|
* x86-asm: Fix lar opcode operandsMichael Matz2016-12-151-1/+1
| | | | | | | lar can accept multiple sizes as well (wlx), like lsl. When using autosize it's important to look at the destination operand first; when it's a register that one determines the size, not the input operand.
* x86-asm: More opcodesMichael Matz2016-12-151-0/+12
| | | | | Some new opcodes and some aliases: ljmp[wl], prefetch{nta,t0,t1,t2}, bswap[lq], sysretq, swapgs.
* x86-asm: Add [sl][ig]dtq opcodesMichael Matz2016-12-151-0/+4
| | | | | GAS has alias lgdtq for lgdt (similar for saves and GDT). It doesn't have the same for LDT.
* x86-asm: Implement fxrstorq and fxsaveqMichael Matz2016-12-151-0/+6
|
* x86-asm: Implement clflush opcodeMichael Matz2016-12-151-0/+1
|
* x86-64-asm: More opcodesMichael Matz2016-12-151-0/+6
| | | | Implement some more opcodes, syscall, sysret, lfence, mfence, sfence.
* x86-asm: Get rid of OPC_JMP and OPC_SHORTJMPMichael Matz2016-12-151-9/+9
| | | | | Those two insn types are nicer to handle as operand types, because the pressure for bits on instr_type is higher than for operands.
* x86-64-asm: TidyMichael Matz2016-12-151-5/+2
|
* x86-asm: Correct mem64->xmm movqMichael Matz2016-12-151-6/+3
| | | | | | Now we can express prefixes with 0x0fxx opcodes we can correct the movq mem64->xmm opcode, and restrict the movq xmm->mem64 movq to not invalidly accept mmx.
* x86-asm: Remove OPC_D16Michael Matz2016-12-151-6/+3
| | | | | Now that we can store prefixes even for 0x0fXX opcodes we can remove the OPC_D16 bit.
* x86-asm: Reorganize instr_typeMichael Matz2016-12-151-1/+1
| | | | | | | | | Disjoint instruction types don't need to be a bit field, so introduce an enumeration (3 bits). Also the 0x0f prefix can be expressed by a bit, doesn't need a byte in the opcode field. That enables to encode further prefixes still in 16 bit. To not have to touch all insns do some macro fiddling filtering out a 0x0f byte in the second position.
* x86-asm: Add more SSE2 instructionsMichael Matz2016-12-151-59/+73
| | | | | | | | In particular those that are extensions of existing mmx (or sse1) instructions by a simple 0x66 prefix. There's one caveat for x86-64: as we don't yet correctly handle the 0xf3 prefix the movq mem64->xmm is wrong (tested in asmtest.S). Needs some refactoring of the instr_type member.
* x86-asm: Reject some invalid arith imm8 instructionMichael Matz2016-05-161-1/+1
| | | | | | | There were two errors in the arithmetic imm8 instruction. They accept only REGW, and in case the user write a xxxb opcode that variant needs to be rejected as well (it's not automatically rejected by REGW in case the destination is memory).
* x86-asm: Fix signed constants and opcode orderMichael Matz2016-05-141-1/+1
| | | | | | | | Two things: negative constants were rejected (e.g. "add $-15,%eax"). Second the insn order was such that the arithmetic IM8S forms weren't used (always the IM32 ones). Switching them prefers those but requires a fix for size calculation in case the opcodes were OPC_ARITH and OPC_WLX (whose size starts with 1, not zero).
* x86-asm: Consolidate insn descriptionsMichael Matz2016-05-141-84/+84
| | | | | Use OPC_BWLX and OPC_WLX in i386-asm.h and x86_64-asm.h to reduce number of differences between both.
* x86-64-asm: Add mov[sz]xq opcodesMichael Matz2016-05-121-1/+4
| | | | This adds the zero/sign-extending opcodes with 64bit destinations.
* x86-64-asm: Clean up 64bit immediate supportMichael Matz2016-05-111-4/+10
| | | | | | | | | Fix it to actually be able to parse 64bit immediates (enlarge operand value type). Then, generally there's no need for accepting IM64 anywhere, except in the 0xba+r mov opcodes, so OP_IM is unnecessary, as is OPT_IMNO64. Improve the generated code a bit by preferring the 0xc7 opcode for im32->reg64, instead of the im64->reg64 form (which we therefore hardcode).
* x86-64 asm: Remove useless jmp opcodeMichael Matz2016-05-111-1/+0
| | | | | Also remove the hacky mod/rm byte emission during disp/imm writing.
* x86: Improve cmov handlingMichael Matz2016-05-111-8/+1
| | | | | cmov can accept multi sizes, but is also a OPC_TEST opcode, deal with this.
* [x86] Fix some asm problemsMichael Matz2016-05-091-15/+26
| | | | | | | | | | | A bag of assembler fixes, to be either compatible with GAS (e.g. order of 'test' operands), accept more instructions, count correct foo{bwlq} variants on x86_64, fix modrm/sib bytes on x86_64 to not use %rip relative addressing mode, to not use invalid insns in tests/asmtest.S for x86_64. Result is that now output of GAS and of tcc on tests/asmtest.S is mostly the same.
* x86-asm: Fix lcall/ljmp, xchg and inc/decMichael Matz2016-05-031-6/+4
| | | | | | | Various x86 asm fixes: 64bit lcall/ljmp like 32bit a commit before, xchgw accepted wrong operands on 32 and 64bit, and 64bit used 0x40/0x48+reg for incw/decw, but those are REX prefixes, not instructions.
* SSE opcodes to TCC assembler (i386, x86_64)seyko2015-09-231-1/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | patch from Anaƫl Seghezzi a test program: ============================ #include <stdio.h> struct fl4{ float x, y, z, w; }; void asm_test(void) { struct fl4 v1, v2, v3; v1.x = 0.1; v1.y = 0.2; v1.z = 0.4; v1.w = 0.3; v2.x = 0.11; v2.y = 0.0; v2.z = 0.01; v2.w = 0.04; asm volatile ( "movups %0, %%xmm0;" "movups %1, %%xmm1;" "addps %%xmm1, %%xmm0;" "movups %%xmm0, %2" :: "g" (v1), "g" (v2), "g" (v3) : "memory"); printf("sse fl4 add : %f %f %f %f\n", v3.x, v3.y, v3.z, v3.w); printf("expected : %f %f %f %f\n", v1.x+v2.x, v1.y+v2.y, v1.z+v2.z, v1.w+v2.w); } int main() { asm_test(); } /* sse fl4 add : 0.210000 0.200000 0.410000 0.340000 expected : 0.210000 0.200000 0.410000 0.340000 */ ============================
* Revert all of my changes to directories & codingstyle.gus knight2015-07-291-0/+449
|
* Reorganize the source tree.gus knight2015-07-271-449/+0
| | | | | | | | | | * Documentation is now in "docs". * Source code is now in "src". * Misc. fixes here and there so that everything still works. I think I got everything in this commit, but I only tested this on Linux (Make) and Windows (CMake), so I might've messed something up on other platforms...
* Allow tcc to understand a setob,... opcodes as alias to seto,...seyko2015-01-061-0/+1
| | | | | | PS: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20101122/112576.html This is fix PR8686 for llvm: accepting a 'b' suffix at the end of all the setcc instructions.
* Detect correct instruction with incorrect operandsThomas Preud'homme2013-09-241-1/+1
| | | | | | Display a different warning when an instruction is recognized by tcc but the operands found do not correspond to the constraints of the instruction.
* x86-64: fix udiv, add cqto instructiongrischka2009-12-191-0/+1
|
* x86_64: fix asmgrischka2009-11-141-0/+1
|
* first support of x86_64 assemblyFrederic Feret2009-11-131-0/+446