Wiki Roadmap Timeline Tickets New Ticket Source Search Help / Guide About Trac Login

Changeset 756:a58784e0f035

Show
Ignore:
Timestamp:
11/08/08 16:29:19 (2 months ago)
Author:
Christian Kamm <kamm incasoftware de>
branch:
default
Message:

Merge wilsonk's x86-64 inline assembly.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • dmd/statement.h

    r664 r756  
    891891    unsigned refparam;      // !=0 if function parameter is referenced 
    892892    unsigned naked;     // !=0 if function is to be naked 
    893     unsigned regs;      // mask of registers modified 
    894893 
    895894    AsmStatement(Loc loc, Token *tokens); 
  • gen/asm-x86-32.h

    r751 r756  
    33 
    44#include "id.h" 
     5 
     6namespace AsmParserx8632 { 
    57 
    68typedef enum { 
     
    1820    Reg_MM0, Reg_MM1, Reg_MM2, Reg_MM3, Reg_MM4, Reg_MM5, Reg_MM6, Reg_MM7, 
    1921    Reg_XMM0, Reg_XMM1, Reg_XMM2, Reg_XMM3, Reg_XMM4, Reg_XMM5, Reg_XMM6, Reg_XMM7, 
    20     // will need 64-bit rax,etc. eventually 
    2122    // xmm8-15? 
    2223    Reg_EFLAGS, 
     
    13491350 
    13501351    if ( matchOperands(operand_i) ) { 
    1351         AsmCode * asmcode = new AsmCode
     1352        AsmCode * asmcode = new AsmCode(N_Regs)
    13521353 
    13531354        if (formatInstruction(operand_i, asmcode)) 
     
    13571358 
    13581359    void setAsmCode() { 
    1359     AsmCode * asmcode = new AsmCode
     1360    AsmCode * asmcode = new AsmCode(N_Regs)
    13601361    asmcode->insnTemplateLen = insnTemplate->offset; 
    13611362    asmcode->insnTemplate = (char*) insnTemplate->extractData(); 
     
    16941695    case Clb_SizeAX: 
    16951696    case Clb_EAX: 
    1696         stmt->regs |= (1<<Reg_EAX)
     1697        asmcode->regs[Reg_EAX] = true
    16971698        break; 
    16981699    case Clb_SizeDXAX: 
    1699         stmt->regs |= (1<<Reg_EAX)
     1700        asmcode->regs[Reg_EAX] = true
    17001701        if (type_char != 'b') 
    1701         stmt->regs |= (1<<Reg_EDX)
     1702        asmcode->regs[Reg_EDX] = true
    17021703        break; 
    17031704    default: 
     
    17071708 
    17081709    if (opInfo->implicitClobbers & Clb_DI) 
    1709         stmt->regs |= (1 << Reg_EDI)
     1710        asmcode->regs[Reg_EDI] = true
    17101711    if (opInfo->implicitClobbers & Clb_SI) 
    1711         stmt->regs |= (1 << Reg_ESI)
     1712        asmcode->regs[Reg_ESI] = true
    17121713    if (opInfo->implicitClobbers & Clb_CX) 
    1713         stmt->regs |= (1 << Reg_ECX)
     1714        asmcode->regs[Reg_ECX] = true
    17141715    if (opInfo->implicitClobbers & Clb_SP) 
    1715         stmt->regs |= (1 << Reg_ESP)
     1716        asmcode->regs[Reg_ESP] = true
    17161717    if (opInfo->implicitClobbers & Clb_ST) 
    17171718    { 
     
    17211722           operand it would work...  In any case, clobbering 
    17221723           all FP prevents incorrect code generation. */ 
    1723         stmt->regs |= (1 << Reg_ST)
    1724         stmt->regs |= (1 << Reg_ST1)
    1725         stmt->regs |= (1 << Reg_ST2)
    1726         stmt->regs |= (1 << Reg_ST3)
    1727         stmt->regs |= (1 << Reg_ST4)
    1728         stmt->regs |= (1 << Reg_ST5)
    1729         stmt->regs |= (1 << Reg_ST6)
    1730         stmt->regs |= (1 << Reg_ST7)
     1724        asmcode->regs[Reg_ST] = true
     1725        asmcode->regs[Reg_ST1] = true
     1726        asmcode->regs[Reg_ST2] = true
     1727        asmcode->regs[Reg_ST3] = true
     1728        asmcode->regs[Reg_ST4] = true
     1729        asmcode->regs[Reg_ST5] = true
     1730        asmcode->regs[Reg_ST6] = true
     1731        asmcode->regs[Reg_ST7] = true
    17311732    } 
    17321733    if (opInfo->implicitClobbers & Clb_Flags) 
    1733         asmcode->moreRegs |= (1 << (Reg_EFLAGS - 32)); 
    1734     if (op == Op_cpuid) 
    1735         stmt->regs |= (1 << Reg_EAX)| 
    1736         (1 << Reg_ECX)|(1 << Reg_EDX); 
     1734        asmcode->regs[Reg_EFLAGS] = true; 
     1735    if (op == Op_cpuid) { 
     1736        asmcode->regs[Reg_EAX] = true; 
     1737        asmcode->regs[Reg_ECX] = true; 
     1738        asmcode->regs[Reg_EDX] = true; 
     1739    } 
    17371740 
    17381741    insnTemplate->writebyte(' '); 
     
    18071810            Reg clbr_reg = (Reg) regInfo[operand->reg].baseReg; 
    18081811            if (clbr_reg != Reg_Invalid) { 
    1809             if (clbr_reg < 32) 
    1810                 stmt->regs |= (1 << clbr_reg); 
    1811             else 
    1812                 asmcode->moreRegs |= (1 << (clbr_reg - 32)); 
     1812            asmcode->regs[clbr_reg] = true; 
    18131813            } 
    18141814        } 
     
    26372637bool getFrameRelativeValue(LLValue* decl, HOST_WIDE_INT * result) 
    26382638{ 
     2639assert(0); 
    26392640// FIXME 
    26402641//     // Using this instead of DECL_RTL for struct args seems like a 
     
    26692670    return false; 
    26702671} 
     2672 
     2673 
     2674struct AsmParser : public AsmParserCommon 
     2675{ 
     2676    virtual void run(Scope* sc, AsmStatement* asmst) { 
     2677        AsmProcessor ap(sc, asmst); 
     2678        ap.run(); 
     2679    } 
     2680 
     2681    virtual std::string getRegName(int i) { 
     2682        return regInfo[i].gccName; 
     2683    } 
     2684}; 
     2685 
     2686} 
  • gen/asm-x86-64.h

    r751 r756  
    33 
    44#include "id.h" 
     5 
     6namespace AsmParserx8664 { 
    57 
    68typedef enum { 
     
    1820    Reg_MM0, Reg_MM1, Reg_MM2, Reg_MM3, Reg_MM4, Reg_MM5, Reg_MM6, Reg_MM7, 
    1921    Reg_XMM0, Reg_XMM1, Reg_XMM2, Reg_XMM3, Reg_XMM4, Reg_XMM5, Reg_XMM6, Reg_XMM7, 
    20     // will need 64-bit rax,etc. eventually 
    21     // xmm8-15? 
     22 
     23    Reg_RAX, Reg_RBX, Reg_RCX, Reg_RDX, Reg_RSI, Reg_RDI, Reg_RBP, Reg_RSP,  
     24    Reg_R8, Reg_R9, Reg_R10, Reg_R11, Reg_R12, Reg_R13, Reg_R14, Reg_R15, 
     25    Reg_R8B, Reg_R9B, Reg_R10B, Reg_R11B, Reg_R12B, Reg_R13B, Reg_R14B, Reg_R15B, 
     26    Reg_R8W, Reg_R9W, Reg_R10W, Reg_R11W, Reg_R12W, Reg_R13W, Reg_R14W, Reg_R15W, 
     27    Reg_R8D, Reg_R9D, Reg_R10D, Reg_R11D, Reg_R12D, Reg_R13D, Reg_R14D, Reg_R15D, 
     28    Reg_XMM8, Reg_XMM9, Reg_XMM10, Reg_XMM11, Reg_XMM12, Reg_XMM13, Reg_XMM14, Reg_XMM15, 
     29    Reg_RIP, 
     30    Reg_SIL, Reg_DIL, Reg_BPL, Reg_SPL,  
     31 
    2232    Reg_EFLAGS, 
    2333    Reg_CS, 
     
    3545 
    3646static const int N_Regs = /*gp*/ 8 + /*fp*/ 8 + /*mmx*/ 8 + /*sse*/ 8 + 
    37 /*seg*/ 6 + /*16bit*/ 8 + /*8bit*/ 8 + /*sys*/ 4+6+5 + /*flags*/ + 1; 
     47/*seg*/ 6 + /*16bit*/ 8 + /*8bit*/ 8 + /*sys*/ 4+6+5 + /*flags*/ + 1 
     48+ 8 /*RAX, etc*/  
     49+ 8 /*R8-15*/  
     50+ 4 /*SIL, etc. 8-bit*/  
     51+ 8 /*R8-15B*/  
     52+ 8 /*R8-15W*/  
     53+ 8 /*R8-15D*/  
     54+ 8 /*XMM8-15*/ 
     55+ 1 /*RIP*/  
     56 
     57
    3858 
    3959#define NULL_TREE "" 
     
    7898    { "XMM6", NULL_TREE, NULL, 16, Reg_XMM6 }, 
    7999    { "XMM7", NULL_TREE, NULL, 16, Reg_XMM7 }, 
     100 
     101    { "RAX", NULL_TREE, NULL, 8,  Reg_RAX }, 
     102    { "RBX", NULL_TREE, NULL, 8,  Reg_RBX }, 
     103    { "RCX", NULL_TREE, NULL, 8,  Reg_RCX }, 
     104    { "RDX", NULL_TREE, NULL, 8,  Reg_RDX }, 
     105    { "RSI", NULL_TREE, NULL, 8,  Reg_RSI }, 
     106    { "RDI", NULL_TREE, NULL, 8,  Reg_RDI }, 
     107    { "RBP", NULL_TREE, NULL, 8,  Reg_RBP }, 
     108    { "RSP", NULL_TREE, NULL, 8,  Reg_RSP }, 
     109    { "R8", NULL_TREE, NULL, 8,  Reg_R8 }, 
     110    { "R9", NULL_TREE, NULL, 8,  Reg_R9 }, 
     111    { "R10", NULL_TREE, NULL, 8,  Reg_R10 }, 
     112    { "R11", NULL_TREE, NULL, 8,  Reg_R11 }, 
     113    { "R12", NULL_TREE, NULL, 8,  Reg_R12 }, 
     114    { "R13", NULL_TREE, NULL, 8,  Reg_R13 }, 
     115    { "R14", NULL_TREE, NULL, 8,  Reg_R14 }, 
     116    { "R15", NULL_TREE, NULL, 8,  Reg_R15 }, 
     117    { "R8B", NULL_TREE, NULL, 1,  Reg_R8 }, 
     118    { "R9B", NULL_TREE, NULL, 1,  Reg_R9 }, 
     119    { "R10B", NULL_TREE, NULL, 1,  Reg_R10 }, 
     120    { "R11B", NULL_TREE, NULL, 1,  Reg_R11 }, 
     121    { "R12B", NULL_TREE, NULL, 1,  Reg_R12 }, 
     122    { "R13B", NULL_TREE, NULL, 1,  Reg_R13 }, 
     123    { "R14B", NULL_TREE, NULL, 1,  Reg_R14 }, 
     124    { "R15B", NULL_TREE, NULL, 1,  Reg_R15 }, 
     125    { "R8W", NULL_TREE, NULL, 2,  Reg_R8 }, 
     126    { "R9W", NULL_TREE, NULL, 2,  Reg_R9 }, 
     127    { "R10W", NULL_TREE, NULL, 2,  Reg_R10 }, 
     128    { "R11W", NULL_TREE, NULL, 2,  Reg_R11 }, 
     129    { "R12W", NULL_TREE, NULL, 2,  Reg_R12 }, 
     130    { "R13W", NULL_TREE, NULL, 2,  Reg_R13 }, 
     131    { "R14W", NULL_TREE, NULL, 2,  Reg_R14 }, 
     132    { "R15W", NULL_TREE, NULL, 2,  Reg_R15 }, 
     133    { "R8D", NULL_TREE, NULL, 4,  Reg_R8 }, 
     134    { "R9D", NULL_TREE, NULL, 4,  Reg_R9 }, 
     135    { "R10D", NULL_TREE, NULL, 4,  Reg_R10 }, 
     136    { "R11D", NULL_TREE, NULL, 4,  Reg_R11 }, 
     137    { "R12D", NULL_TREE, NULL, 4,  Reg_R12 }, 
     138    { "R13D", NULL_TREE, NULL, 4,  Reg_R13 }, 
     139    { "R14D", NULL_TREE, NULL, 4,  Reg_R14 }, 
     140    { "R15D", NULL_TREE, NULL, 4,  Reg_R15 }, 
     141    { "XMM8", NULL_TREE, NULL, 16, Reg_XMM8 }, 
     142    { "XMM9", NULL_TREE, NULL, 16, Reg_XMM9 }, 
     143    { "XMM10", NULL_TREE, NULL, 16, Reg_XMM10 }, 
     144    { "XMM11", NULL_TREE, NULL, 16, Reg_XMM11 }, 
     145    { "XMM12", NULL_TREE, NULL, 16, Reg_XMM12 }, 
     146    { "XMM13", NULL_TREE, NULL, 16, Reg_XMM13 }, 
     147    { "XMM14", NULL_TREE, NULL, 16, Reg_XMM14 }, 
     148    { "XMM15", NULL_TREE, NULL, 16, Reg_XMM15 }, 
     149    { "RIP", NULL_TREE, NULL, 8,  Reg_RIP }, 
     150    { "SIL", NULL_TREE, NULL, 1,  Reg_SIL }, 
     151    { "DIL", NULL_TREE, NULL, 1,  Reg_DIL }, 
     152    { "BPL", NULL_TREE, NULL, 1,  Reg_BPL }, 
     153    { "SPL", NULL_TREE, NULL, 1,  Reg_SPL }, 
     154 
    80155    { "FLAGS", NULL_TREE, NULL, 0, Reg_EFLAGS }, // the gcc name is "flags"; not used in assembler input 
    81156    { "CS",  NULL_TREE, NULL, 2, -1 }, 
     
    486561    /* Op_outs      */  { N|dx,  mem, 0,     1, Clb_SI }, 
    487562    /* Op_outsX     */  {   0,   0,   0,     0, Clb_SI }, 
    488     /* Op_push      */  {   mri, 0,    0,    Word_Types, Clb_SP }, // would be Op_SrcW, but DMD defaults to 32-bit for immediate form 
     563    /* Op_push      */  {   mri, 0,    0,    0, Clb_SP }, // would be Op_SrcW, but DMD defaults to 32-bit for immediate form 
    489564    /* Op_ret       */  {   imm, 0,   0,     0, 0, Next_Form, Op_0  },  
    490565    /* Op_retf      */  {   0,   0,   0,     0, 0, Out_Mnemonic, Mn_lret  }, 
     
    537612 
    538613static AsmOpEnt opData[] = { 
    539     { "aaa",    Op_Adjust }, 
    540     { "aad",    Op_Adjust }, 
    541     { "aam",    Op_Adjust }, 
    542     { "aas",    Op_Adjust }, 
    543614    { "adc",    Op_UpdSrcF }, 
    544     { "add",    Op_UpdSrcF }, 
     615 
     616    { "add",    Op_DstSrcNT }, //Op_UpdSrcF }, 
    545617    { "addpd",  Op_DstSrcSSE }, 
    546618    { "addps",  Op_DstSrcSSE }, 
     
    549621    { "addsubpd", Op_DstSrcSSE }, 
    550622    { "addsubps", Op_DstSrcSSE },     
    551     { "align",  Op_Align }, 
    552623    { "and",    Op_UpdSrcF }, 
    553624    { "andnpd", Op_DstSrcSSE }, 
     
    555626    { "andpd",  Op_DstSrcSSE }, 
    556627    { "andps",  Op_DstSrcSSE }, 
    557     { "arpl",   Op_UpdSrcNT }, 
    558     { "bound",  Op_bound }, 
    559628    { "bsf",    Op_SrcSrcFW }, 
    560629    { "bsr",    Op_SrcSrcFW }, 
     
    565634    { "bts",    Op_UpdSrcFW }, 
    566635    { "call",   Op_Branch }, 
     636    { "callf",   Op_Branch }, 
    567637    { "cbw",    Op_0_AX }, 
    568     { "cdq",    Op_0_DXAX }, 
     638    { "cdqe",    Op_0_DXAX }, 
    569639    { "clc",    Op_Flags }, 
    570640    { "cld",    Op_Flags }, 
     
    611681    { "cmpss",  Op_DstSrcImmS }, 
    612682    { "cmpsw",  Op_cmpsX }, 
     683    { "cmpsq",  Op_cmpsX }, 
     684    /* 
     685    { "cdqe",  Op_0_DXAX }, 
     686    { "cmpsq",  Op_cmpsX }, 
     687    { "cmpxch16b", Op_cmpxchg16b },  
     688    { "cqo",    Op_0_DXAX }, 
     689    { "lodsq", Op_lodsX }, 
     690    { "movsq", Op_movsX }, 
     691    { "popfq", Op_SizedStack }, 
     692    { "pushfq", Op_SizedStack }, 
     693    { "scasq",  Op_scasX }, 
     694    { "stosq",  Op_stosX }, 
     695    { "iretq", Op_iretd },   
     696    { "swapgs", Op_0 },   
     697    { "extrq",  Op_Extrq }, 
     698    { "movsxq", Op_movsxq }, 
     699     
     700    { "clgi",    Op_Flags }, 
     701    { "invlpga", Op_SrcMemNT }, 
     702    { "rdtscp",  Op_0_DXAX }, 
     703    { "stgi",    Op_Flags }, 
     704    { "sysret", Op_0 }, 
     705    */ 
     706 
     707    { "cmpxch16b", Op_cmpxchg8b }, 
    613708    { "cmpxch8b", Op_cmpxchg8b }, // %% DMD opcode typo? 
    614709    { "cmpxchg",  Op_cmpxchg }, 
     
    639734    { "cvttss2si", Op_DstSrcSSE }, 
    640735    { "cwd",  Op_0_DXAX }, 
    641     { "cwde", Op_0_AX }, 
     736    { "cwde", Op_0_DXAX }, 
    642737    //{ "da", Op_ },// dunno what this is -- takes labels? 
    643     { "daa",   Op_Adjust }, 
    644     { "das",   Op_Adjust },     
    645738    { "db",    Op_db }, 
    646739    { "dd",    Op_dd }, 
     
    661754    { "emms",  Op_0 }, // clobber all mmx/fp? 
    662755    { "enter", Op_enter }, 
    663     { "even",  Op_Even }, 
    664756    { "f2xm1",  Op_F0_ST }, // %% most of these are update... 
    665757    { "fabs",   Op_F0_ST }, 
     
    768860    { "hsubps", Op_DstSrcSSE }, 
    769861    { "idiv", Op_Src_DXAXF }, 
    770     { "imul", Op_imul }, 
     862    { "imul",   Op_DstSrcNT }, 
    771863    { "in",   Op_in }, 
    772864    { "inc",  Op_UpdF }, 
     
    781873    { "iret",  Op_iret }, 
    782874    { "iretd", Op_iretd },     
     875    { "iretq", Op_iretd },     
    783876    { "ja",    Op_CBranch }, 
    784877    { "jae",   Op_CBranch }, 
     
    794887    { "jle",   Op_CBranch }, 
    795888    { "jmp",   Op_Branch }, 
     889    { "jmpe",   Op_Branch }, 
     890    { "jmpf",   Op_Branch }, 
    796891    { "jna",   Op_CBranch }, 
    797892    { "jnae",  Op_CBranch }, 
     
    812907    { "jpe",   Op_CBranch }, 
    813908    { "jpo",   Op_CBranch }, 
     909    { "jrcxz", Op_CBranch }, 
    814910    { "js",    Op_CBranch }, 
    815911    { "jz",    Op_CBranch }, 
     
    820916    { "lds",   Op_DstSrc },  // reg dest only 
    821917    { "lea",   Op_DstSrc },  // " 
     918    { "leaq",   Op_DstSrcSSE },  // " 
    822919    { "leave", Op_0 },       // EBP,ESP clobbers 
    823     { "les",   Op_DstSrc }, 
    824920    { "lfence",Op_0 }, 
    825921    { "lfs",   Op_DstSrc }, 
     
    834930    { "lodsd", Op_lodsX }, 
    835931    { "lodsw", Op_lodsX }, 
     932    { "lodsq", Op_lodsX }, 
    836933    { "loop",  Op_Loop }, 
    837934    { "loope", Op_Loop }, 
     
    855952    { "monitor", Op_0 }, 
    856953    { "mov",   Op_DstSrc }, 
     954    { "movb",   Op_DstSrcNT  }, 
    857955    { "movapd",  Op_DstSrcSSE }, 
    858956    { "movaps",  Op_DstSrcSSE }, 
     
    880978    { "movsb", Op_movsX }, 
    881979    { "movsd", Op_movsd }, 
     980    { "movsq", Op_movsd }, 
    882981    { "movshdup", Op_DstSrcSSE }, 
    883982    { "movsldup", Op_DstSrcSSE }, 
     
    885984    { "movsw", Op_movsX }, 
    886985    { "movsx", Op_movsx }, // word-only, reg dest 
     986    { "movsxd", Op_movsx },  
    887987    { "movupd",Op_DstSrcSSE }, 
    888988    { "movups",Op_DstSrcSSE }, 
     989    { "movzbl",   Op_DstSrcNT  }, 
    889990    { "movzx", Op_movzx }, 
    890     { "mul",   Op_mul }, 
     991    { "mul",   Op_DstSrcNT }, 
    891992    { "mulpd", Op_DstSrcSSE }, 
    892993    { "mulps", Op_DstSrcSSE }, 
     
    894995    { "mulss", Op_DstSrcSSE }, 
    895996    { "mwait", Op_0 }, 
    896     { "naked", Op_Naked }, 
    897997    { "neg",   Op_UpdF }, 
    898998    { "nop",   Op_0 }, 
     
    9061006    { "outsd", Op_outsX }, 
    9071007    { "outsw", Op_outsX }, 
     1008    { "pabsb",    Op_DstSrcSSE }, 
     1009    { "pabsw",    Op_DstSrcSSE }, 
     1010    { "pabsq",    Op_DstSrcSSE }, 
    9081011    { "packssdw", Op_DstSrcMMX }, // %% also SSE 
    9091012    { "packsswb", Op_DstSrcMMX }, 
     
    9171020    { "paddusw",  Op_DstSrcMMX }, 
    9181021    { "paddw",    Op_DstSrcMMX }, 
     1022    { "palignr",     Op_DstSrcSSE }, 
    9191023    { "pand",     Op_DstSrcMMX }, 
    9201024    { "pandn",    Op_DstSrcMMX }, 
     1025    { "pause",    Op_DstSrcMMX }, 
    9211026    { "pavgb",    Op_DstSrcMMX }, 
    9221027    { "pavgw",    Op_DstSrcMMX }, 
     
    9281033    { "pcmpgtw",  Op_DstSrcMMX }, 
    9291034    { "pextrw",   Op_DstSrcImmM }, // gpr32 dest 
     1035    { "phaddd",     Op_DstSrcSSE }, 
     1036    { "phaddsw",     Op_DstSrcSSE }, 
     1037    { "phaddw",     Op_DstSrcSSE }, 
     1038    { "phsubd",     Op_DstSrcSSE }, 
     1039    { "phsubsw",     Op_DstSrcSSE }, 
     1040    { "phsubw",     Op_DstSrcSSE }, 
    9301041    { "pinsrw",   Op_DstSrcImmM }, // gpr32(16), mem16 src, sse too 
     1042    { "pmaddubsw",  Op_DstSrcSSE }, 
    9311043    { "pmaddwd",  Op_DstSrcMMX }, 
    9321044    { "pmaxsw",   Op_DstSrcMMX }, 
     
    9351047    { "pminub",   Op_DstSrcMMX }, 
    9361048    { "pmovmskb", Op_DstSrcMMX }, 
     1049    { "pmulhrsw",  Op_DstSrcMMX }, 
    9371050    { "pmulhuw",  Op_DstSrcMMX }, 
    9381051    { "pmulhw",   Op_DstSrcMMX }, 
     
    9401053    { "pmuludq",  Op_DstSrcMMX }, // also sse 
    9411054    { "pop",      Op_DstW }, 
    942     { "popa",     Op_SizedStack },  // For intel this is always 16-bit 
    943     { "popad",    Op_SizedStack },  // GAS doesn't accept 'popad' -- these clobber everything, but supposedly it would be used to preserve clobbered regs 
    9441055    { "popf",     Op_SizedStack },  // rewrite the insn with a special case 
    945     { "popfd",    Op_SizedStack },  
     1056    { "popfq",    Op_SizedStack },  
     1057    { "popq",    Op_push },  
    9461058    { "por",      Op_DstSrcMMX }, 
    9471059    { "prefetchnta", Op_SrcMemNT }, 
     
    9501062    { "prefetcht2",  Op_SrcMemNT }, 
    9511063    { "psadbw",   Op_DstSrcMMX }, 
     1064    { "pshufb",   Op_DstSrcImmM }, 
    9521065    { "pshufd",   Op_DstSrcImmM }, 
    9531066    { "pshufhw",  Op_DstSrcImmM }, 
    9541067    { "pshuflw",  Op_DstSrcImmM }, 
    9551068    { "pshufw",   Op_DstSrcImmM }, 
     1069    { "psignb",   Op_DstSrcSSE }, 
     1070    { "psignd",   Op_DstSrcSSE }, 
     1071    { "psignw",   Op_DstSrcSSE }, 
    9561072    { "pslld",    Op_DstSrcMMX }, // immediate operands... 
    9571073    { "pslldq",   Op_DstSrcMMX }, 
     
    9811097    { "punpcklwd", Op_DstSrcMMX }, 
    9821098    { "push",   Op_push }, 
    983     { "pusha",  Op_SizedStack }, 
    984     { "pushad", Op_SizedStack }, 
    9851099    { "pushf",  Op_SizedStack }, 
    986     { "pushfd", Op_SizedStack }, 
     1100    { "pushfq", Op_SizedStack }, 
     1101    { "pushq", Op_push }, 
    9871102    { "pxor",   Op_DstSrcMMX }, 
    9881103    { "rcl",    Op_Shift }, // limited src operands -- change to shift 
     
    10001115    { "ret",    Op_ret }, 
    10011116    { "retf",   Op_retf }, 
     1117    { "retn",   Op_retf }, 
    10021118    { "rol",    Op_Shift }, 
    10031119    { "ror",    Op_Shift }, 
     
    10071123    { "sahf",   Op_Flags }, 
    10081124    { "sal",    Op_Shift }, 
     1125    { "salq",   Op_DstSrcNT  }, 
    10091126    { "sar",    Op_Shift }, 
    10101127    { "sbb",    Op_UpdSrcF }, 
     
    10131130    { "scasd",  Op_scasX }, 
    10141131    { "scasw",  Op_scasX }, 
     1132    { "scasq",  Op_scasX }, 
    10151133    { "seta",   Op_DstRMBNT }, // also gpr8 
    10161134    { "setae",  Op_DstRMBNT }, 
     
    10661184    { "stosd",  Op_stosX }, 
    10671185    { "stosw",  Op_stosX }, 
     1186    { "stosq",  Op_stosX }, 
    10681187    { "str",    Op_DstMemNT }, // also r16 
    10691188    { "sub",    Op_UpdSrcF }, 
     
    10721191    { "subsd",  Op_DstSrcSSE }, 
    10731192    { "subss",  Op_DstSrcSSE }, 
     1193    { "swapgs",  Op_DstSrcSSE }, 
    10741194    { "sysenter",Op_0 }, 
    10751195    { "sysexit", Op_0 }, 
    1076     { "test",    Op_SrcSrcF }, 
     1196    { "sysret", Op_0 }, 
     1197    { "testl",   Op_DstSrcNT  }, 
    10771198    { "ucomisd", Op_SrcSrcSSEF }, 
    10781199    { "ucomiss", Op_SrcSrcSSEF }, 
     
    10841205    { "verr",   Op_SrcMemNTF }, 
    10851206    { "verw",   Op_SrcMemNTF }, 
    1086     { "wait",   Op_0 }, 
    10871207    { "wbinvd", Op_0 }, 
    10881208    { "wrmsr",  Op_0 }, 
     
    10941214    { "xorpd",  Op_DstSrcSSE }, 
    10951215    { "xorps",  Op_DstSrcSSE }, 
     1216    { "xorq",   Op_DstSrcNT  }, 
    10961217}; 
    10971218 
     
    13491470 
    13501471    if ( matchOperands(operand_i) ) { 
    1351         AsmCode * asmcode = new AsmCode
     1472        AsmCode * asmcode = new AsmCode(N_Regs)
    13521473 
    13531474        if (formatInstruction(operand_i, asmcode)) 
     
    13571478 
    13581479    void setAsmCode() { 
    1359     AsmCode * asmcode = new AsmCode
     1480    AsmCode * asmcode = new AsmCode(N_Regs)
    13601481    asmcode->insnTemplateLen = insnTemplate->offset; 
    13611482    asmcode->insnTemplate = (char*) insnTemplate->extractData(); 
     
    16941815    case Clb_SizeAX: 
    16951816    case Clb_EAX: 
    1696         stmt->regs |= (1<<Reg_EAX)
     1817        asmcode->regs[Reg_EAX] = true
    16971818        break; 
    16981819    case Clb_SizeDXAX: 
    1699         stmt->regs |= (1<<Reg_EAX)
     1820        asmcode->regs[Reg_EAX] = true
    17001821        if (type_char != 'b') 
    1701         stmt->regs |= (1<<Reg_EDX)
     1822        asmcode->regs[Reg_EDX] = true
    17021823        break; 
    17031824    default: 
     
    17071828 
    17081829    if (opInfo->implicitClobbers & Clb_DI) 
    1709         stmt->regs |= (1 << Reg_EDI)
     1830        asmcode->regs[Reg_EDI] = true
    17101831    if (opInfo->implicitClobbers & Clb_SI) 
    1711         stmt->regs |= (1 << Reg_ESI)
     1832        asmcode->regs[Reg_ESI] = true
    17121833    if (opInfo->implicitClobbers & Clb_CX) 
    1713         stmt->regs |= (1 << Reg_ECX)
     1834        asmcode->regs[Reg_ECX] = true
    17141835    if (opInfo->implicitClobbers & Clb_SP) 
    1715         stmt->regs |= (1 << Reg_ESP)
     1836        asmcode->regs[Reg_ESP] = true
    17161837    if (opInfo->implicitClobbers & Clb_ST) 
    17171838    { 
     
    17211842           operand it would work...  In any case, clobbering 
    17221843           all FP prevents incorrect code generation. */ 
    1723         stmt->regs |= (1 << Reg_ST)
    1724         stmt->regs |= (1 << Reg_ST1)
    1725         stmt->regs |= (1 << Reg_ST2)
    1726         stmt->regs |= (1 << Reg_ST3)
    1727         stmt->regs |= (1 << Reg_ST4)
    1728         stmt->regs |= (1 << Reg_ST5)
    1729         stmt->regs |= (1 << Reg_ST6)
    1730         stmt->regs |= (1 << Reg_ST7)
     1844        asmcode->regs[Reg_ST] = true
     1845        asmcode->regs[Reg_ST1] = true
     1846        asmcode->regs[Reg_ST2] = true
     1847        asmcode->regs[Reg_ST3] = true
     1848        asmcode->regs[Reg_ST4] = true
     1849        asmcode->regs[Reg_ST5] = true
     1850        asmcode->regs[Reg_ST6] = true
     1851        asmcode->regs[Reg_ST7] = true
    17311852    } 
    17321853    if (opInfo->implicitClobbers & Clb_Flags) 
    1733         asmcode->moreRegs |= (1 << (Reg_EFLAGS - 32)); 
    1734     if (op == Op_cpuid) 
    1735         stmt->regs |= (1 << Reg_EAX)| 
    1736         (1 << Reg_ECX)|(1 << Reg_EDX); 
     1854        asmcode->regs[Reg_EFLAGS] = true; 
     1855    if (op == Op_cpuid) { 
     1856        asmcode->regs[Reg_EAX] = true; 
     1857        asmcode->regs[Reg_ECX] = true; 
     1858        asmcode->regs[Reg_EDX] = true; 
     1859    } 
    17371860 
    17381861    insnTemplate->writebyte(' '); 
     
    18071930            Reg clbr_reg = (Reg) regInfo[operand->reg].baseReg; 
    18081931            if (clbr_reg != Reg_Invalid) { 
    1809             if (clbr_reg < 32) 
    1810                 stmt->regs |= (1 << clbr_reg); 
    1811             else 
    1812                 asmcode->moreRegs |= (1 << (clbr_reg - 32)); 
     1932            asmcode->regs[clbr_reg] = true; 
    18131933            } 
    18141934        } 
     
    18581978            if (operand->indexReg == Reg_Invalid && 
    18591979                decl->isVarDeclaration() && 
    1860                 ((operand->baseReg == Reg_EBP && ! sc->func->naked ) || 
    1861                 (operand->baseReg == Reg_ESP && sc->func->naked)) ) { 
     1980                ( ((operand->baseReg == Reg_EBP || (operand->baseReg == Reg_RBP)) && ! sc->func->naked ) || 
     1981                  ((operand->baseReg == Reg_ESP || (operand->baseReg == Reg_RSP)) && sc->func->naked)) )  
     1982              { 
    18621983 
    18631984                if (mode == Mode_Output) 
     
    26372758bool getFrameRelativeValue(LLValue* decl, HOST_WIDE_INT * result) 
    26382759{ 
     2760    assert(0); 
    26392761// FIXME 
    26402762//     // Using this instead of DECL_RTL for struct args seems like a 
     
    26692791    return false; 
    26702792} 
     2793 
     2794 
     2795struct AsmParser : public AsmParserCommon 
     2796{ 
     2797    virtual void run(Scope* sc, AsmStatement* asmst) { 
     2798        AsmProcessor ap(sc, asmst); 
     2799        ap.run(); 
     2800    } 
     2801 
     2802    virtual std::string getRegName(int i) { 
     2803        return regInfo[i].gccName; 
     2804    } 
     2805}; 
     2806 
     2807} 
  • gen/asmstmt.cpp

    r622 r756  
    5858    unsigned insnTemplateLen; 
    5959    Array    args; // of AsmArg 
    60     unsigned moreRegs; 
     60    std::vector<bool> regs; 
    6161    unsigned dollarLabel; 
    6262    int      clobbersMemory; 
    63     AsmCode() { 
     63    AsmCode(int n_regs) { 
    6464    insnTemplate = NULL; 
    6565    insnTemplateLen = 0; 
    66     moreRegs = 0
     66    regs.resize(n_regs, false)
    6767    dollarLabel = 0; 
    6868    clobbersMemory = 0; 
     
    7878    refparam = 0; 
    7979    naked = 0; 
    80     regs = 0; 
    8180 
    8281    isBranchToLabel = NULL; 
     
    9089    a_s->refparam = refparam; 
    9190    a_s->naked = naked; 
    92     a_s->regs = a_s->regs; 
    9391    return a_s; 
    9492} 
     
    131129} 
    132130 
    133  
    134 #include "d-asm-i386.h" 
     131struct AsmParserCommon 
     132
     133    virtual void run(Scope* sc, AsmStatement* asmst) = 0; 
     134    virtual std::string getRegName(int i) = 0; 
     135}; 
     136AsmParserCommon* asmparser = NULL; 
     137 
     138#include "asm-x86-32.h" 
     139#include "asm-x86-64.h" 
    135140 
    136141bool d_have_inline_asm() { return true; } 
     
    139144{ 
    140145    bool err = false; 
    141     if (global.params.cpu != ARCHx86
     146    if ((global.params.cpu != ARCHx86) && (global.params.cpu != ARCHx86_64)
    142147    { 
    143148        error("inline asm is not supported for the \"%s\" architecture", global.params.llvmArch); 
     
    161166    return this; 
    162167     
    163     AsmProcessor ap(sc, this); 
    164     ap.run(); 
     168    if (!asmparser) 
     169        if (global.params.cpu == ARCHx86) 
     170            asmparser = new AsmParserx8632::AsmParser; 
     171        else if (global.params.cpu == ARCHx86_64) 
     172            asmparser = new AsmParserx8664::AsmParser; 
     173 
     174    asmparser->run(sc, this); 
     175 
    165176    return this; 
    166177} 
     
    252263        arg_val = ((VarExp *) arg->expr)->var->toSymbol()->Stree; 
    253264        else 
    254         assert(0);*/ 
     265        assert(0); 
    255266        if ( getFrameRelativeValue(arg_val, & var_frame_offset) ) { 
    256267//      arg_val = irs->integerConstant(var_frame_offset); 
     
    262273        if (arg->mode != Mode_Input) 
    263274        clobbers_mem = true; 
    264         break; 
     275        break;*/ 
    265276    case Arg_LocalSize: 
    266277// FIXME 
     
    295306// FIXME 
    296307//    if (! irs->func->naked) { 
    297     for (int i = 0; i < 32; i++) { 
    298         if (regs & (1 << i)) { 
     308        assert(asmparser); 
     309    for (int i = 0; i < code->regs.size(); i++) { 
     310        if (code->regs[i]) { 
    299311        //clobbers.cons(NULL_TREE, regInfo[i].gccName); 
    300         clobbers.push_back(regInfo[i].gccName); 
    301         } 
    302     } 
    303     for (int i = 0; i < 32; i++) { 
    304         if (code->moreRegs & (1 << (i-32))) { 
    305         //clobbers.cons(NULL_TREE, regInfo[i].gccName); 
    306         clobbers.push_back(regInfo[i].gccName); 
     312        clobbers.push_back(asmparser->getRegName(i)); 
    307313        } 
    308314    } 
  • tests/mini/asm1.d

    r741 r756  
    55void main() 
    66{ 
    7     version(D_InlineAsm_X86) 
     7    version(LLVM_InlineAsm_X86) 
    88    { 
    99    int x; 
Copyright © 2008, LDC Development Team.