aboutsummaryrefslogtreecommitdiff
path: root/x86_64-asm.h
Commit message (Collapse)AuthorAgeFilesLines
* 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