VirtualBox

Changeset 104182 in vbox


Ignore:
Timestamp:
Apr 5, 2024 12:54:03 PM (8 months ago)
Author:
vboxsync
Message:

VMM/IEM: move parts of 'imm8' jump table construction & handling into macros, bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r104174 r104182  
    572572
    573573;;
    574 ; Checks that the size expression %1 matches %2 adjusted according to
    575 ; RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK and for 256 entries.
    576 ; @param 1  The jump array size assembly expression.
    577 ; @param 2  The size without accounting for the IBT_ENDBRxx_WITHOUT_NOTRACK instruction.
    578 ;
    579 %macro IEMCHECK_256_JUMP_ARRAY_SIZE 2
     574; Loads register with offset of imm8 instruction -- used by all of the instruction
     575; implementations which lay out jump tables of 256x immediate byte variants.
     576; Also checks that the instruction size matches the offsets in the table.
     577;
     578; @param    1       The register to receive the jump target address (T1).
     579; @param    2       The register containing the imm8 index (A1 / A2 / A3).
     580; @param    3       Byte size of one instruction + ret (+ ?int3) in the table
     581; @note             Implicitly uses local symbols .imm0, .imm1, and .immEmd
     582;                   (implementation artifacts of each instruction jump table).
     583;
     584; Emits the equivalent (in actual code) of `lea %1, [.imm0 + %2 * %3]`.
     585;
     586%macro IEMIMPL_JUMP_TABLE_TARGET_INT 3
     587        lea     %1, [.imm0 xWrtRIP]
     588  %if   %3 == 5
     589        lea     T0, [%2 + %2*4]  ; *5
     590        lea     %1, [%1 + T0]    ; *5 + .imm0
     591  %elif %3 == 6
     592        lea     T0, [%2 + %2*2]  ; *3
     593        lea     %1, [%1 + T0*2]  ; *6 + .imm0
     594  %elif %3 == 7
     595        lea     T0, [%2 + %2*2]  ; *3
     596        lea     T0, [T0 + %2*4]  ; *7
     597        lea     %1, [%1 + T0]    ; *7 + .imm0
     598  %elif %3 == 8
     599        lea     %1, [%1 + %2*8]  ; *8 + .imm0
     600  %elif %3 == 9
     601        lea     T0, [%2 + %2*8]  ; *9
     602        lea     %1, [%1 + T0]    ; *9 + .imm0
     603  %elif %3 == 10
     604        lea     T0, [%2 + %2*4]  ; *5
     605        lea     %1, [%1 + T0*2]  ; *10 + .imm0
     606  %elif %3 == 11
     607        lea     T0, [%2 + %2*4]  ; *5
     608        lea     T0, [%2 + T0*2]  ; *11
     609        lea     %1, [%1 + T0]    ; *11 + .imm0
     610  %elif %3 == 12
     611        lea     T0, [%2 + %2*2]  ; *3
     612        lea     %1, [%1 + T0*4]  ; *12 + .imm0
     613  %else
     614   %error Unexpected instruction byte count in IEMIMPL_JUMP_TABLE_TARGET_INT
     615  %endif
     616        ; check size: 'warning: value does not fit in 8 bit field' if bad
     617        times (.imm1 - .imm0 + %3) %% %3 db 999 * \
     618              (.imm1 - .imm0 + %3)
     619        ; check alignment: 'warning: value does not fit in 8 bit field' if bad
     620        times ((.immEnd - .imm0) - 256 * %3) db 999 * \
     621              ((.immEnd - .imm0) - 256 * %3)
     622%endmacro
     623
     624%macro IEMIMPL_JUMP_TABLE_TARGET 3
    580625 %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    581         dw      (0xffff - %2 - 256*4) + %1  ; will cause warning if entries are too big.
    582         dw      (0xffff + %2 + 256*4) - %1  ; will cause warning if entries are too small.
     626        IEMIMPL_JUMP_TABLE_TARGET_INT %1, %2, (%3 + 4)
    583627 %else
    584         dw      (0xffff - %2)         + %1  ; will cause warning if entries are too big.
    585         dw      (0xffff + %2)         - %1  ; will cause warning if entries are too small.
     628        IEMIMPL_JUMP_TABLE_TARGET_INT %1, %2, %3
    586629 %endif
     630%endmacro
     631
     632
     633;;
     634; Calls the given imm8 instruction -- used by all of the instruction
     635; implementations which lay out jump tables of 256x immediate byte variants.
     636;
     637; @param    1       The register to receive the jump target address (T1).
     638; @param    2       The register containing the imm8 index (A1 / A2 / A3).
     639; @param    3       Byte size of one instruction + ret (+ ?int3) in the table
     640;
     641; Emits the equivalent (in actual code) of `lea %1, [.imm0 + %2 * %3]` +
     642; `IBT_NOTRACK, call %1`.
     643;
     644%macro IEMIMPL_CALL_JUMP_TABLE_TARGET 3
     645        IEMIMPL_JUMP_TABLE_TARGET %1, %2, %3
     646        IBT_NOTRACK
     647        call    %1
    587648%endmacro
    588649
     
    41824243        movq    mm1, [A1]
    41834244        movq    mm0, mm0                ; paranoia!
    4184         lea     T1, [.imm0 xWrtRIP]
    4185  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    4186         lea     T0, [A2 + A2*8]         ; sizeof(pshufw+ret) == 9
    4187  %else
    4188         lea     T0, [A2 + A2*4]         ; sizeof(pshufw+ret) == 5
    4189  %endif
    4190         lea     T1, [T1 + T0]
    4191         IBT_NOTRACK
    4192         call    T1
     4245        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, 5
    41934246        movq    [A0], mm0
    41944247
     
    42034256 %assign bImm bImm + 1
    42044257%endrep
    4205 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x500
     4258.immEnd:
    42064259ENDPROC iemAImpl_pshufw_u64
    42074260
     
    42154268        movdqu  xmm1, [A1]
    42164269        movdqu  xmm0, xmm1              ; paranoia!
    4217         lea     T1, [.imm0 xWrtRIP]
    4218  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    4219         lea     T0, [A2 + A2*4]         ; sizeof(pshufXX+ret) == 10: A2 * 10 = (A2 * 5) * 2
    4220  %else
    4221         lea     T0, [A2 + A2*2]         ; sizeof(pshufXX+ret) ==  6: A2 *  6 = (A2 * 3) * 2
    4222  %endif
    4223         lea     T1, [T1 + T0*2]
    4224         IBT_NOTRACK
    4225         call    T1
     4270        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, 6
    42264271        movdqu  [A0], xmm0
    42274272
     
    42374282  %assign bImm bImm + 1
    42384283 %endrep
    4239 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     4284.immEnd:
    42404285ENDPROC iemAImpl_ %+ %1 %+ _u128
    42414286%endmacro
     
    42524297
    42534298        movzx   A2, A2_8                ; must clear top bits
    4254         vmovdqu  ymm1, [A1]
    4255         vmovdqu  ymm0, ymm1             ; paranoia!
    4256         lea     T1, [.imm0 xWrtRIP]
    4257  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    4258         lea     T0, [A2 + A2*4]         ; sizeof(pshufXX+ret) == 10: A2 * 10 = (A2 * 5) * 2
    4259  %else
    4260         lea     T0, [A2 + A2*2]         ; sizeof(pshufXX+ret) ==  6: A2 *  6 = (A2 * 3) * 2
    4261  %endif
    4262         lea     T1, [T1 + T0*2]
    4263         IBT_NOTRACK
    4264         call    T1
     4299        vmovdqu ymm1, [A1]
     4300        vmovdqu ymm0, ymm1              ; paranoia!
     4301        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, 6
    42654302        vmovdqu  [A0], ymm0
    42664303
     
    42754312  %assign bImm bImm + 1
    42764313 %endrep
    4277 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     4314.immEnd:
    42784315ENDPROC iemAImpl_ %+ %1 %+ _u256
    42794316%endmacro
     
    42954332        movzx   A1, A1_8                ; must clear top bits
    42964333        movq    mm0, [A0]
    4297         lea     T1, [.imm0 xWrtRIP]
    4298  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    4299         lea     T0, [A1 + A1*8]         ; sizeof(psXX+ret) == 9
    4300  %else
    4301         lea     T0, [A1 + A1*4]         ; sizeof(psXX+ret) == 5
    4302  %endif
    4303         lea     T1, [T1 + T0]
    4304         IBT_NOTRACK
    4305         call    T1
     4334        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A1, 5
    43064335        movq    [A0], mm0
    43074336
     
    43164345 %assign bImm bImm + 1
    43174346%endrep
    4318 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x500
     4347.immEnd:
    43194348ENDPROC iemAImpl_ %+ %1 %+ _imm_u64
    43204349%endmacro
     
    43374366        movzx   A1, A1_8                ; must clear top bits
    43384367        movdqu  xmm0, [A0]
    4339         lea     T1, [.imm0 xWrtRIP]
    4340  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    4341         lea     T0, [A1 + A1*4]         ; sizeof(psXX+ret) == 10: A1 * 10 = (A1 * 5) * 2
    4342  %else
    4343         lea     T0, [A1 + A1*2]         ; sizeof(psXX+ret) ==  6: A1 *  6 = (A1 * 3) * 2
    4344  %endif
    4345         lea     T1, [T1 + T0*2]
    4346         IBT_NOTRACK
    4347         call    T1
     4368        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A1, 6
    43484369        movdqu  [A0], xmm0
    43494370
     
    43584379  %assign bImm bImm + 1
    43594380 %endrep
    4360 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     4381.immEnd:
    43614382ENDPROC iemAImpl_ %+ %1 %+ _imm_u128
    43624383%endmacro
     
    43704391IEMIMPL_MEDIA_SSE_PSHIFTXX psraw
    43714392IEMIMPL_MEDIA_SSE_PSHIFTXX psrad
    4372 IEMIMPL_MEDIA_SSE_PSHIFTXX pslldq
    4373 IEMIMPL_MEDIA_SSE_PSHIFTXX psrldq
    43744393
    43754394
     
    51775196        movdqu  xmm0, [A0]
    51785197        movdqu  xmm1, [A1]
    5179         lea     T1, [.imm0 xWrtRIP]
    5180  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5181         lea     T0, [A2 + A2*4]         ; sizeof(shufpX+ret+int3) == 10: A2 * 10 = (A2 * 5) * 2
    5182  %else
    5183         lea     T0, [A2 + A2*2]         ; sizeof(shufpX+ret+int3) ==  6: A2 *  6 = (A2 * 3) * 2
    5184  %endif
    5185         lea     T1, [T1 + T0*2]
    5186         IBT_NOTRACK
    5187         call    T1
     5198        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, 6
    51885199        movdqu  [A0], xmm0
    51895200
     
    51995210  %assign bImm bImm + 1
    52005211 %endrep
    5201 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     5212.immEnd:
    52025213ENDPROC iemAImpl_shufps_u128
    52035214
     
    52175228        movdqu  xmm0, [A0]
    52185229        movdqu  xmm1, [A1]
    5219         lea     T1, [.imm0 xWrtRIP]
    5220  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5221         lea     T0, [A2 + A2*4]         ; sizeof(shufpX+ret) == 10: A2 * 10 = (A2 * 5) * 2
    5222  %else
    5223         lea     T0, [A2 + A2*2]         ; sizeof(shufpX+ret) ==  6: A2 *  6 = (A2 * 3) * 2
    5224  %endif
    5225         lea     T1, [T1 + T0*2]
    5226         IBT_NOTRACK
    5227         call    T1
     5230        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, 6
    52285231        movdqu  [A0], xmm0
    52295232
     
    52385241  %assign bImm bImm + 1
    52395242 %endrep
    5240 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     5243.immEnd:
    52415244ENDPROC iemAImpl_shufpd_u128
    52425245
     
    52605263        movdqu  xmm0, [A1]
    52615264        movdqu  xmm1, [A2]
    5262         lea     T1, [.imm0 xWrtRIP]
    5263  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5264         lea     T0, [A3 + A3*4]         ; sizeof(vshufpX+ret) == 10: A3 * 10 = (A3 * 5) * 2
    5265  %else
    5266         lea     T0, [A3 + A3*2]         ; sizeof(vshufpX+ret) ==  6: A3 *  6 = (A3 * 3) * 2
    5267  %endif
    5268         lea     T1, [T1 + T0*2]
    5269         IBT_NOTRACK
    5270         call    T1
     5265        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 6
    52715266        movdqu  [A0], xmm0
    52725267
     
    52815276  %assign bImm bImm + 1
    52825277 %endrep
    5283 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     5278.immEnd:
    52845279ENDPROC iemAImpl_ %+ %1 %+ _u128
    52855280
     
    52915286        vmovdqu ymm0, [A1]
    52925287        vmovdqu ymm1, [A2]
    5293         lea     T1, [.imm0 xWrtRIP]
    5294  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5295         lea     T0, [A3 + A3*4]         ; sizeof(vshufpX+ret) == 10: A3 * 10 = (A3 * 5) * 2
    5296  %else
    5297         lea     T0, [A3 + A3*2]         ; sizeof(vshufpX+ret) ==  6: A3 *  6 = (A3 * 3) * 2
    5298  %endif
    5299         lea     T1, [T1 + T0*2]
    5300         IBT_NOTRACK
    5301         call    T1
     5288        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 6
    53025289        vmovdqu [A0], ymm0
    53035290
     
    53125299  %assign bImm bImm + 1
    53135300 %endrep
    5314 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     5301.immEnd:
    53155302ENDPROC iemAImpl_ %+ %1 %+ _u256
    53165303%endmacro
     
    54075394        movq    mm0, [A0]
    54085395        movq    mm1, A1
    5409         lea     T1, [.imm0 xWrtRIP]
    5410  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5411         lea     T0, [A2 + A2*4]         ; sizeof(endbrxx+palignr+ret) == 10: A2 * 10 = (A2 * 5) * 2
    5412  %else
    5413         lea     T0, [A2 + A2*2]         ; sizeof(palignr+ret)         ==  6: A2 *  6 = (A2 * 3) * 2
    5414  %endif
    5415         lea     T1, [T1 + T0*2]
    5416         IBT_NOTRACK
    5417         call    T1
     5396        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, 6
    54185397        movq    [A0], mm0
    54195398
     
    54285407  %assign bImm bImm + 1
    54295408 %endrep
    5430 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     5409.immEnd:
    54315410ENDPROC iemAImpl_palignr_u64
    54325411
     
    54515430        movdqu  xmm0, [A0]
    54525431        movdqu  xmm1, [A1]
    5453         lea     T1, [.imm0 xWrtRIP]
    5454  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5455         lea     T0, [A2 + A2*2]         ; sizeof(endbrxx+insnX+ret+int3) == 12: A2 * 12 = (A2 * 3) * 4
    5456         lea     T1, [T1 + T0*4]
    5457  %else
    5458         lea     T1, [T1 + A2*8]         ; sizeof(insnX+ret+int3)         ==  8: A2 * 8
    5459  %endif
    5460         IBT_NOTRACK
    5461         call    T1
     5432        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, 8
    54625433        movdqu  [A0], xmm0
    54635434
     
    54735444  %assign bImm bImm + 1
    54745445 %endrep
    5475 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5446.immEnd:
    54765447ENDPROC iemAImpl_ %+ %1 %+ _u128
    54775448%endmacro
     
    55095480        movdqu  xmm0, [A1]
    55105481        movdqu  xmm1, [A2]
    5511         lea     T1, [.imm0 xWrtRIP]
    5512  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5513         lea     T0, [A3 + A3*2]         ; sizeof(endbrxx+insnX+ret+int3) == 12: A3 * 12 = (A3 * 3) * 4
    5514         lea     T1, [T1 + T0*4]
    5515  %else
    5516         lea     T1, [T1 + A3*8]         ; sizeof(insnX+ret+int3)         ==  8: A3 * 8
    5517  %endif
    5518         IBT_NOTRACK
    5519         call    T1
     5482        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    55205483        movdqu  [A0], xmm0
    55215484
     
    55315494  %assign bImm bImm + 1
    55325495 %endrep
    5533 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5496.immEnd:
    55345497ENDPROC iemAImpl_ %+ %1 %+ _u128
    55355498 %endif
     
    55435506        vmovdqu ymm0, [A1]
    55445507        vmovdqu ymm1, [A2]
    5545         lea     T1, [.imm0 xWrtRIP]
    5546  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5547         lea     T0, [A3 + A3*2]         ; sizeof(endbrxx+insnX+ret+int3) == 12: A3 * 12 = (A3 * 3) * 4
    5548         lea     T1, [T1 + T0*4]
    5549  %else
    5550         lea     T1, [T1 + A3*8]         ; sizeof(insnX+ret+int3)         ==  8: A3 *  8
    5551  %endif
    5552         IBT_NOTRACK
    5553         call    T1
     5508        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    55545509        vmovdqu [A0], ymm0
    55555510
     
    55655520  %assign bImm bImm + 1
    55665521 %endrep
    5567 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5522.immEnd:
    55685523ENDPROC iemAImpl_ %+ %1 %+ _u256
    55695524 %endif
     
    55895544; @param    2       Whether the instruction has a 128-bit variant (1) or not (0).
    55905545; @param    3       Whether the instruction has a 256-bit variant (1) or not (0).
     5546; @param    4       The number of bytes taken up by a single instance of the instruction.
    55915547;
    55925548; @param    A0      Pointer to the destination media register size operand (output).
     
    55945550; @param    A2      The 8-bit immediate
    55955551;
    5596 %macro IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 3
     5552%macro IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP 4
    55975553 %if %2 == 1
    55985554BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _imm_u128, 16
     
    56025558        movzx   A2, A2_8                ; must clear top bits
    56035559        movdqu  xmm1, [A1]
    5604         lea     T1, [.imm0 xWrtRIP]
    5605  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5606         lea     T0, [A2 + A2*2]         ; sizeof(endbrxx+insnX+ret+int3) == 12: A2 * 12 = (A2 * 3) * 4
    5607         lea     T1, [T1 + T0*4]
    5608  %else
    5609         lea     T1, [T1 + A2*8]         ; sizeof(insnX+ret+int3)         ==  8: A2 * 8
    5610  %endif
    5611         IBT_NOTRACK
    5612         call    T1
     5560        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, %4
    56135561        movdqu  [A0], xmm0
    56145562
     
    56245572  %assign bImm bImm + 1
    56255573 %endrep
    5626 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5574.immEnd:
    56275575ENDPROC iemAImpl_ %+ %1 %+ _imm_u128
    56285576 %endif
     
    56355583        movzx   A2, A2_8                ; must clear top bits
    56365584        vmovdqu ymm1, [A1]
    5637         lea     T1, [.imm0 xWrtRIP]
    5638  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5639         lea     T0, [A2 + A2*2]         ; sizeof(endbrxx+insnX+ret+int3) == 12: A2 * 12 = (A2 * 3) * 4
    5640         lea     T1, [T1 + T0*4]
    5641  %else
    5642         lea     T1, [T1 + A2*8]         ; sizeof(insnX+ret+int3)         ==  8: A2 *  8
    5643  %endif
    5644         IBT_NOTRACK
    5645         call    T1
     5585        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, %4
    56465586        vmovdqu [A0], ymm0
    56475587
     
    56575597  %assign bImm bImm + 1
    56585598 %endrep
    5659 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5599.immEnd:
    56605600ENDPROC iemAImpl_ %+ %1 %+ _imm_u256
    56615601 %endif
    56625602%endmacro
    56635603
    5664 IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 vpermilps,  1, 1
    5665 IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 vpermilpd,  1, 1
     5604IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP vpermilps, 1, 1, 8
     5605IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP vpermilpd, 1, 1, 8
     5606IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP vpslldq,   1, 1, 7
     5607IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP vpsrldq,   1, 1, 7
    56665608
    56675609
     
    56975639        movdqu  xmm1, [A2 + IEMPCMPISTRXSRC.uSrc2]
    56985640        mov     T2, A0                  ; A0 can be ecx/rcx in some calling conventions which gets overwritten later (T2 only available on AMD64)
    5699         lea     T1, [.imm0 xWrtRIP]
    5700  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5701         lea     T0, [A3 + A3*2]         ; sizeof(endbrxx+insnX+ret) == 12: A3 * 12 = (A3 * 3) * 4
    5702         lea     T1, [T1 + T0*4]
    5703  %else
    5704         lea     T1, [T1 + A3*8]         ; sizeof(insnX+ret)         ==  8: A3 * 8
    5705  %endif
    5706         IBT_NOTRACK
    5707         call    T1
     5641        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    57085642
    57095643        IEM_SAVE_FLAGS A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
     
    57215655  %assign bImm bImm + 1
    57225656 %endrep
    5723 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5657.immEnd:
    57245658ENDPROC iemAImpl_pcmpistri_u128
    57255659
     
    57405674        movdqu  xmm1, [A2 + IEMPCMPESTRXSRC.uSrc2]
    57415675        mov     T2, A0                  ; A0 can be ecx/rcx in some calling conventions which gets overwritten later (T2 only available on AMD64)
    5742         lea     T1, [.imm0 xWrtRIP]
    5743  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5744         lea     T0, [A3 + A3*2]         ; sizeof(endbrxx+insnX+ret) == 12: A3 * 12 = (A3 * 3) * 4
    5745         lea     T1, [T1 + T0*4]
    5746  %else
    5747         lea     T1, [T1 + A3*8]         ; sizeof(insnX+ret)         == 8: A3 * 8
    5748  %endif
     5676        IEMIMPL_JUMP_TABLE_TARGET T1, A3, 8
    57495677        push    xDX                                 ; xDX can be A1 or A2 depending on the calling convention
    57505678        mov     xAX, [A2 + IEMPCMPESTRXSRC.u64Rax]  ; T0 is rax, so only overwrite it after we're done using it
     
    57685696  %assign bImm bImm + 1
    57695697 %endrep
    5770 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5698.immEnd:
    57715699ENDPROC iemAImpl_pcmpestri_u128
    57725700
     
    57865714        movdqu  xmm1, [A2 + IEMPCMPISTRXSRC.uSrc1]
    57875715        movdqu  xmm2, [A2 + IEMPCMPISTRXSRC.uSrc2]
    5788         lea     T1, [.imm0 xWrtRIP]
    5789  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5790         lea     T0, [A3 + A3*2]         ; sizeof(endbrxx+pcmpistrm+ret) == 12: A3 * 12 = (A3 * 3) * 4
    5791         lea     T1, [T1 + T0*4]
    5792  %else
    5793         lea     T1, [T1 + A3*8]         ; sizeof(pcmpistrm+ret)         ==  8: A3 * 8
    5794  %endif
    5795         IBT_NOTRACK
    5796         call    T1
     5716        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    57975717
    57985718        IEM_SAVE_FLAGS A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
     
    58105730  %assign bImm bImm + 1
    58115731 %endrep
    5812 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5732.immEnd:
    58135733ENDPROC iemAImpl_pcmpistrm_u128
    58145734
     
    58285748        movdqu  xmm1, [A2 + IEMPCMPESTRXSRC.uSrc1]
    58295749        movdqu  xmm2, [A2 + IEMPCMPESTRXSRC.uSrc2]
    5830         lea     T1, [.imm0 xWrtRIP]
    5831  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    5832         lea     T0, [A3 + A3*2]         ; sizeof(endbrxx+insnX+ret) == 12: A3 * 12 = (A3 * 3) * 4
    5833         lea     T1, [T1 + T0*4]
    5834  %else
    5835         lea     T1, [T1 + A3*8]         ; sizeof(insnX+ret)         ==  8: A3 * 8
    5836  %endif
     5750        IEMIMPL_JUMP_TABLE_TARGET T1, A3, 8
    58375751        push    xDX                                 ; xDX can be A1 or A2 depending on the calling convention
    58385752        mov     xAX, [A2 + IEMPCMPESTRXSRC.u64Rax]  ; T0 is rax, so only overwrite it after we're done using it
     
    58565770  %assign bImm bImm + 1
    58575771 %endrep
    5858 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5772.immEnd:
    58595773ENDPROC iemAImpl_pcmpestrm_u128
    58605774
     
    63546268        movdqu  xmm0, [A2 + IEMMEDIAF2XMMSRC.uSrc1]
    63556269        movdqu  xmm1, [A2 + IEMMEDIAF2XMMSRC.uSrc2]
    6356         lea     T1, [.imm0 xWrtRIP]
    6357  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    6358         lea     T0, [A3 + A3*8]         ; sizeof(endbrxx+cmpps+ret) == 9: A3 * 9
    6359  %else
    6360         lea     T0, [A3 + A3*4]         ; sizeof(cmpps+ret)         == 5: A3 * 5
    6361  %endif
    6362         lea     T1, [T1 + T0]
    6363         IBT_NOTRACK
    6364         call    T1
     6270        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 5
    63656271        movdqu  [A1], xmm0
    63666272
     
    63766282  %assign bImm bImm + 1
    63776283 %endrep
    6378 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x500
     6284.immEnd:
    63796285ENDPROC iemAImpl_cmpps_u128
    63806286
     
    64026308        movdqu  xmm0, [A2 + IEMMEDIAF2XMMSRC.uSrc1]
    64036309        movdqu  xmm1, [A2 + IEMMEDIAF2XMMSRC.uSrc2]
    6404         lea     T1, [.imm0 xWrtRIP]
    6405  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    6406         lea     T0, [A3 + A3*4]         ; sizeof(endbrxx+cmpXX+ret) == 10: A3 * 10 = (A3 * 5) * 2
    6407  %else
    6408         lea     T0, [A3 + A3*2]         ; sizeof(cmpXX+ret)         ==  6: A3 *  6 = (A3 * 3) * 2
    6409  %endif
    6410         lea     T1, [T1 + T0*2]
    6411         IBT_NOTRACK
    6412         call    T1
     6310        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 6
    64136311        movdqu  [A1], xmm0
    64146312
     
    64246322  %assign bImm bImm + 1
    64256323 %endrep
    6426 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     6324.immEnd:
    64276325ENDPROC iemAImpl_ %+ %1 %+ _u128
    64286326%endmacro
     
    64556353        movdqu  xmm0, [A2 + IEMMEDIAF2XMMSRC.uSrc1]
    64566354        movdqu  xmm1, [A2 + IEMMEDIAF2XMMSRC.uSrc2]
    6457         lea     T1, [.imm0 xWrtRIP]
    6458  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    6459         lea     T0, [A3 + A3*2]         ; sizeof(endbrxx+insn+ret+int3) == 12: A3 * 12 = (A3 * 3) * 4
    6460         lea     T1, [T1 + T0*4]
    6461  %else
    6462         lea     T1, [T1 + A3*8]         ; sizeof(insn+ret+int3)         ==  8: A3 * 8
    6463  %endif
    6464         IBT_NOTRACK
    6465         call    T1
     6355        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    64666356        movdqu  [A1], xmm0
    64676357
     
    64786368  %assign bImm bImm + 1
    64796369 %endrep
    6480 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     6370.immEnd:
    64816371ENDPROC iemAImpl_ %+ %1 %+ _u128
    64826372%endmacro
     
    66266516        movdqu  xmm0, [A0]
    66276517        movdqu  xmm1, [A1]
    6628         lea     T1, [.imm0 xWrtRIP]
    6629  %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
    6630         lea     T0, [A2 + A2*4]         ; sizeof(endbrxx+sha1rnds4+ret) == 10: A2 * 10 = (A2 * 5) * 2
    6631  %else
    6632         lea     T0, [A2 + A2*2]         ; sizeof(sha1rnds4+ret)         ==  6: A2 *  6 = (A2 * 3) * 2
    6633  %endif
    6634         lea     T1, [T1 + T0*2]
    6635         IBT_NOTRACK
    6636         call    T1
     6518        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A2, 6
    66376519        movdqu  [A0], xmm0
    66386520
     
    66476529  %assign bImm bImm + 1
    66486530 %endrep
    6649 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x600
     6531.immEnd:
    66506532ENDPROC iemAImpl_sha1rnds4_u128
    66516533
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette