From cac02ab57252ec2a062aa1a34734f4bdfc3904c3 Mon Sep 17 00:00:00 2001 From: Shahid Date: Tue, 15 Mar 2011 15:19:15 +0000 Subject: [PATCH 1/6] Fix for issue http://d.puremagic.com/issues/show_bug.cgi?id=5740 --- src/iasm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/iasm.c b/src/iasm.c index eba2a89bfd0b..6378aa2d3bfe 100644 --- a/src/iasm.c +++ b/src/iasm.c @@ -4050,6 +4050,7 @@ STATIC OPND *asm_primary_exp() case TOKthis: strcpy(tok.TKid,cpp_name_this); #endif + case TOKthis: case TOKidentifier: case_ident: o1 = opnd_calloc(); From 7080c83b4543c248a0cb75ec7e6c47f7c69b9b1b Mon Sep 17 00:00:00 2001 From: Shahid Date: Tue, 15 Mar 2011 15:20:47 +0000 Subject: [PATCH 2/6] Enhancement request http://d.puremagic.com/issues/show_bug.cgi?id=5741 --- src/backend/ptrntab.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/backend/ptrntab.c b/src/backend/ptrntab.c index dcbe4546f78e..b9e84dd8d66e 100644 --- a/src/backend/ptrntab.c +++ b/src/backend/ptrntab.c @@ -1471,6 +1471,14 @@ PTRNTAB0 aptb0PAUSE[] = /* PAUSE */ { }; #endif +PTRNTAB0 aptb0SYSCALL[] = /* SYSCALL */ { + { 0x0f05, 0 } +}; + +PTRNTAB0 aptb0SYSRET[] = /* SYSRET */ { + { 0x0f07, 0 } +}; + PTRNTAB0 aptb0SYSENTER[] = /* SYSENTER */ { { 0x0f34, 0 } }; @@ -3122,8 +3130,10 @@ getsec X("subps", 2, (P) aptb2SUBPS ) \ X("subsd", 2, (P) aptb2SUBSD ) \ X("subss", 2, (P) aptb2SUBSS ) \ + X("syscall", 0, aptb0SYSCALL ) \ X("sysenter", 0, aptb0SYSENTER ) \ X("sysexit", 0, aptb0SYSEXIT ) \ + X("sysret", 0, aptb0SYSRET ) \ X("test", 2, (P) aptb2TEST ) \ X("ucomisd", 2, (P) aptb2UCOMISD ) \ X("ucomiss", 2, (P) aptb2UCOMISS ) \ From ab20a8f57afa643520fb265a7ed19e94084df1e0 Mon Sep 17 00:00:00 2001 From: Shahid Date: Thu, 17 Mar 2011 16:44:53 +0000 Subject: [PATCH 3/6] [64bit] Fix for opcode LEA using 64bit addresses --- src/backend/ptrntab.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/ptrntab.c b/src/backend/ptrntab.c index b9e84dd8d66e..f18226073e37 100644 --- a/src/backend/ptrntab.c +++ b/src/backend/ptrntab.c @@ -556,8 +556,10 @@ PTRNTAB2 aptb2LDS[] = /* LDS */ { PTRNTAB2 aptb2LEA[] = /* LEA */ { { 0x8d, _r|_16_bit, _r16, _m8 | _m16 | _m32 | _m48 }, { 0x8d, _r|_32_bit, _r32, _m8 | _m16 | _m32 | _m48 }, + { 0x8d, _r|_64_bit, _r64, _m8 | _m16 | _m32 | _m48 | _m64 }, { 0x8d, _r|_16_bit, _r16, _rel16 }, { 0x8d, _r|_32_bit, _r32, _rel32 }, + { 0x8d, _r|_64_bit, _r64, _rel32 }, { ASM_END, 0, 0, 0 } }; PTRNTAB2 aptb2LES[] = /* LES */ { From 257b5fd9c443de7010335fc6b70ebfce4c155964 Mon Sep 17 00:00:00 2001 From: Shahid Date: Fri, 18 Mar 2011 17:22:54 +0000 Subject: [PATCH 4/6] Fix for issue 5706 ( missing REX_R prefix ) --- src/backend/iasm.h | 1 + src/iasm.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/backend/iasm.h b/src/backend/iasm.h index 03c2c98521ba..c7350c2aae8b 100644 --- a/src/backend/iasm.h +++ b/src/backend/iasm.h @@ -21,6 +21,7 @@ // This is for when the reg field of modregrm specifies which instruction it is #define NUM_MASK 0x7 +#define NUM_MASKR 0x8 // REX extension bit #define _0 (0x0 | _modrm) // insure that some _modrm bit is set #define _1 0x1 // with _0 #define _2 0x2 diff --git a/src/iasm.c b/src/iasm.c index 6378aa2d3bfe..6456a5eb825f 100644 --- a/src/iasm.c +++ b/src/iasm.c @@ -2330,6 +2330,8 @@ STATIC void asm_make_modrm_byte( } } mrmb.modregrm.reg = usFlags & NUM_MASK; + if ( usFlags & NUM_MASKR ) + pc->Irex |= REX_R; if (s && (aopty == _m || aopty == _mnoi) && !s->isLabel()) { @@ -2578,6 +2580,8 @@ STATIC void asm_make_modrm_byte( ASM_GET_amod(popnd2->usFlags) == _rspecial)) { mrmb.modregrm.reg = popnd2->base->val; + if ( popnd2->base->val & NUM_MASKR ) + pc->Irex |= REX_R; } #ifdef DEBUG puchOpcode[ (*pusIdx)++ ] = mrmb.uchOpcode; From a82f55a96dbad1dea876f6090337ac6608e8f39c Mon Sep 17 00:00:00 2001 From: Shahid Date: Fri, 18 Mar 2011 20:40:38 +0000 Subject: [PATCH 5/6] Fix for issue 5706 again ( missing REX_B prefix ) --- src/iasm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iasm.c b/src/iasm.c index 6456a5eb825f..ec121ab7a4e8 100644 --- a/src/iasm.c +++ b/src/iasm.c @@ -2330,8 +2330,6 @@ STATIC void asm_make_modrm_byte( } } mrmb.modregrm.reg = usFlags & NUM_MASK; - if ( usFlags & NUM_MASKR ) - pc->Irex |= REX_R; if (s && (aopty == _m || aopty == _mnoi) && !s->isLabel()) { @@ -2363,6 +2361,8 @@ STATIC void asm_make_modrm_byte( if (aopty == _reg || amod == _rspecial) { mrmb.modregrm.mod = 0x3; mrmb.modregrm.rm |= popnd->base->val; + if ( popnd->base->val & NUM_MASKR ) + pc->Irex |= REX_B; } else if (amod == _addr16 || (amod == _flbl && I16)) { unsigned rm; From 3772adb48a1426994ec7d91292c22137826c8b3b Mon Sep 17 00:00:00 2001 From: Shahid Date: Wed, 23 Mar 2011 17:24:48 +0000 Subject: [PATCH 6/6] Enhancement request 5741 (again) modifies CX and R11 --- src/backend/iasm.h | 1 + src/backend/ptrntab.c | 2 +- src/iasm.c | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backend/iasm.h b/src/backend/iasm.h index c7350c2aae8b..7587070129cd 100644 --- a/src/backend/iasm.h +++ b/src/backend/iasm.h @@ -68,6 +68,7 @@ #define _modall 0xb000 // Instruction modifies all register values #define _modsiax 0xc000 // Instruction modifies AX and SI #define _modsinot1 0xd000 // Instruction modifies SI and not first param +#define _modcxr11 0xe000 // Instruction modifies CX and R11 ///////////////////////////////////////////////// // Operand flags - usOp1, usOp2, usOp3 diff --git a/src/backend/ptrntab.c b/src/backend/ptrntab.c index f18226073e37..3ac018fd656a 100644 --- a/src/backend/ptrntab.c +++ b/src/backend/ptrntab.c @@ -1474,7 +1474,7 @@ PTRNTAB0 aptb0PAUSE[] = /* PAUSE */ { #endif PTRNTAB0 aptb0SYSCALL[] = /* SYSCALL */ { - { 0x0f05, 0 } + { 0x0f05, _modcxr11 } }; PTRNTAB0 aptb0SYSRET[] = /* SYSRET */ { diff --git a/src/iasm.c b/src/iasm.c index ec121ab7a4e8..7e3e35dff3ca 100644 --- a/src/iasm.c +++ b/src/iasm.c @@ -2695,6 +2695,9 @@ STATIC regm_t asm_modify_regs(PTRNTAB ptb, OPND *popnd1, OPND *popnd2) usRet |= mSI; popnd1 = NULL; break; + case _modcxr11: + usRet |= (mCX | mR11); + break; } if (popnd1 && ASM_GET_aopty(popnd1->usFlags) == _reg) {