////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_CALL:: PUSH RBP MOV RBP,RSP MOV RAX,U8 SF_PARAM1[RBP] OR RAX,RAX JZ @@100 CALL RAX @@100: POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP OR_U4_BIT_FIELD:: PUSH RBP MOV RBP,RSP MOV RBX,U8 SF_PARAM2[RBP] SHR RBX,3 ADD RBX,U8 SF_PARAM1[RBP] MOV RAX,U8 SF_PARAM3[RBP] MOV RCX,U8 SF_PARAM2[RBP] AND RCX,7 SHL RAX,CL OR U8 [RBX],RAX POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP SYS_EBF_MASKTABLE: DU8 0,1,3,7,15,31,63,127,255; DU8 0x1FF,0x3FF,0x7FF,0x0FFF; DU8 0x1FFF,0x3FFF,0x7FFF,0x0FFFF; DU8 0x1FFFF,0x3FFFF,0x7FFFF,0xFFFFF; DU8 0x1FFFFF,0x3FFFFF,0x7FFFFF,0xFFFFFF; DU8 0x1FFFFFF,0x3FFFFFF,0x7FFFFFF,0xFFFFFFF; DU8 0x1FFFFFFF,0x3FFFFFFF,0x7FFFFFFF,0xFFFFFFFF; EXTRACT_U4_BIT_FIELD:: PUSH RBP MOV RBP,RSP MOV RBX,U8 SF_PARAM2[RBP] MOV CL,3 SHR RBX,3 ADD RBX,U8 SF_PARAM1[RBP] MOV RAX,U8 [RBX] MOV RCX,U8 SF_PARAM2[RBP] AND RCX,7 SHR RAX,CL MOV RBX,U8 SF_PARAM3[RBP] AND RAX,U8 SYS_EBF_MASKTABLE[RBX*8] POP RBP RET ////**************************PROCEDURE************************* // IN: RSI=STRUCT TO INSERT // RDI=PREDECESSOR ALIGN 8,OC_NOP INSQUE:: PUSH RBX MOV RBX,U8 [RDI] MOV U8 [RDI],RSI MOV U8 [RSI],RBX MOV U8 8[RSI],RDI MOV U8 8[RBX],RSI POP RBX RET ////**************************PROCEDURE************************* // IN: RSI=STRUCT TO INSERT // RDI=SUCCESSOR ALIGN 8,OC_NOP INSQUE_REV:: PUSH RBX MOV RBX,U8 8[RDI] MOV U8 [RBX],RSI MOV U8 [RSI],RDI MOV U8 8[RSI],RBX MOV U8 8[RDI],RSI POP RBX RET ////**************************PROCEDURE************************* // IN: RSI=STRUCT TO REMOVE ALIGN 8,OC_NOP REMQUE:: PUSH RBX PUSH RDI MOV RBX,U8 [RSI] MOV RDI,U8 8[RSI] MOV U8 [RDI],RBX MOV U8 8[RBX],RDI POP RDI POP RBX RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_REP_INSW:: PUSH RBP MOV RBP,RSP PUSH RDI MOV RDI,U8 SF_PARAM1[RBP] MOV RDX,U8 SF_PARAM3[RBP] MOV RCX,U8 SF_PARAM2[RBP] REP_INSW POP RDI POP RBP RET ALIGN 8,OC_NOP CP_REP_INSB:: PUSH RBP MOV RBP,RSP PUSH RDI MOV RDI,U8 SF_PARAM1[RBP] MOV RDX,U8 SF_PARAM3[RBP] MOV RCX,U8 SF_PARAM2[RBP] REP_INSB POP RDI POP RBP RET ALIGN 8,OC_NOP CP_REP_OUTSW:: PUSH RBP MOV RBP,RSP PUSH RSI MOV RSI,U8 SF_PARAM1[RBP] MOV RDX,U8 SF_PARAM3[RBP] MOV RCX,U8 SF_PARAM2[RBP] REP_OUTSW POP RSI POP RBP RET ALIGN 8,OC_NOP CP_REP_OUTSB:: PUSH RBP MOV RBP,RSP PUSH RSI MOV RSI,U8 SF_PARAM1[RBP] MOV RDX,U8 SF_PARAM3[RBP] MOV RCX,U8 SF_PARAM2[RBP] REP_OUTSB POP RSI POP RBP RET ALIGN 8,OC_NOP CP_HLT:: HLT ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_FSQRT:: PUSH RBP MOV RBP,RSP FLD U8 SF_PARAM1[RBP] FSQRT FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_FSIN:: PUSH RBP MOV RBP,RSP FLD U8 SF_PARAM1[RBP] FSIN FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_FCOS:: PUSH RBP MOV RBP,RSP FLD U8 SF_PARAM1[RBP] FCOS FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_FTAN:: PUSH RBP MOV RBP,RSP FLD U8 SF_PARAM1[RBP] @@1: FPTAN FSTSW FWAIT TEST AX,0x400 JNZ @@1 FFREE FINCSTP FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_FATAN:: PUSH RBP MOV RBP,RSP FLD U8 SF_PARAM1[RBP] FLD1 @@1: FPATAN FSTSW FWAIT TEST AX,0x400 JNZ @@1 FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_ARG:: PUSH RBP MOV RBP,RSP FLD U8 SF_PARAM2[RBP] FLD U8 SF_PARAM1[RBP] @@1: FPATAN FSTSW FWAIT TEST AX,0x400 JNZ @@1 FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_ROUND:: PUSH RBP MOV RBP,RSP SUB RSP,8 FSTCW U4 -8[RBP] FWAIT MOV AX,U2 -8[RBP] MOV U2 -6[RBP],AX AND AX,~0x0C00 MOV U2 -8[RBP],AX FLDCW U4 -8[RBP] FLD U8 SF_PARAM1[RBP] FRNDINT FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] FLDCW U4 -6[RBP] FWAIT ADD RSP,8 POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_TRUNC:: PUSH RBP MOV RBP,RSP SUB RSP,8 FSTCW U4 -8[RBP] FWAIT MOV AX,U2 -8[RBP] MOV U2 -6[RBP],AX OR AX,0x0C00 MOV U2 -8[RBP],AX FLDCW U4 -8[RBP] FLD U8 SF_PARAM1[RBP] FRNDINT FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] FLDCW U4 -6[RBP] FWAIT ADD RSP,8 POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_FLOOR:: PUSH RBP MOV RBP,RSP SUB RSP,8 FSTCW U4 -8[RBP] FWAIT MOV AX,U2 -8[RBP] MOV U2 -6[RBP],AX AND AX,~0x0C00 OR AX,0x0400 MOV U2 -8[RBP],AX FLDCW U4 -8[RBP] FLD U8 SF_PARAM1[RBP] FRNDINT FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,U8 SF_PARAM1[RBP] FLDCW U4 -6[RBP] FWAIT ADD RSP,8 POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_CEILING:: PUSH RBP MOV RBP,RSP SUB RSP,8 FSTCW U4 -8[RBP] FWAIT MOV AX,U2 -8[RBP] MOV U2 -6[RBP],AX AND AX,~0x0C00 OR AX,0x0800 MOV U2 -8[RBP],AX FLDCW U4 -8[RBP] FLD U8 SF_PARAM1[RBP] FRNDINT FSTP U8 SF_PARAM1[RBP] FWAIT MOV RAX,SF_PARAM1[RBP] FLDCW U4 -6[RBP] FWAIT ADD RSP,8 POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_POW10:: PUSH RBP MOV RBP,RSP SUB RSP,16 FSTCW U4 -8[RBP] FWAIT MOV AX,U2 -8[RBP] MOV U2 -6[RBP],AX OR AX,0x0C00 MOV U2 -8[RBP],AX FLDCW U4 -8[RBP] FLDL2T FLD U8 SF_PARAM1[RBP] FMULP FST U8 SF_PARAM1[RBP] FRNDINT FLD U8 SF_PARAM1[RBP] FSUBRP F2XM1 FLD1 FADDP FSTP U8 -16[RBP] FFREE FINCSTP FLD U8 SF_PARAM1[RBP] FLD U8 -16[RBP] FSCALE // ST0<>2; for (i=0;ientry_used) { i=c->free_index; c->entry_used=FALSE; c->cur_entry=c->next_entry; c->cur_bits_in_use=c->next_bits_in_use; if (c->next_bits_in_usenext_entry = &c->compress[i++]; if (i==c->free_limit) { c->next_bits_in_use++; c->free_limit=1<next_bits_in_use; } } else { do if (++i==c->free_limit) i=c->min_table_entry; while (c->hash[i]); temp=&c->compress[i]; c->next_entry=temp; temp1=&c->hash[temp->basecode]; while (temp1) { if (temp1->next==temp) { temp1->next=temp->next; break; } else temp1=temp1->next; } } c->free_index=i; } } */ ALIGN 8,OC_NOP CP_ARC_GET_TABLE_ENTRY:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM1[RBP] BTR U8 ACS_ENTRY_USED[RSI],0 JNC U4 @@100 MOV RDX,U8 ACS_FREE_INDEX[RSI] XOR EAX,EAX MOV RAX,U8 ACS_NEXT_ENTRY[RSI] MOV U8 ACS_CUR_ENTRY[RSI],RAX MOV RCX,U8 ACS_NEXT_BITS_IN_USE[RSI] MOV U8 ACS_CUR_BITS_IN_USE[RSI],RCX CMP RCX,ARC_MAX_BITS JAE @@20 MOV RAX,RDX SHL RAX,4 LEA RAX,U8 ACS_COMPRESS[RSI+RAX] MOV U8 ACS_NEXT_ENTRY[RSI],RAX INC RDX CMP U8 ACS_FREE_LIMIT[RSI],RDX JNE @@90 INC RCX MOV U8 ACS_NEXT_BITS_IN_USE[RSI],RCX MOV RAX,1 SHL RAX,CL MOV U8 ACS_FREE_LIMIT[RSI],RAX JMP @@90 @@20: INC RDX CMP U8 ACS_FREE_LIMIT[RSI],RDX JNE @@25 MOV RDX,U8 ACS_MIN_TABLE_ENTRY[RSI] @@25: MOV RAX,U8 ACS_HASH[RSI+RDX*8] OR RAX,RAX JNZ @@20 MOV RDI,RDX SHL RDI,4 LEA RDI,U8 ACS_COMPRESS[RSI+RDI] MOV U4 ACS_NEXT_ENTRY[RSI],EDI MOVZX RBX,U2 ATE_BASECODE[RDI] LEA RCX,U8 ACS_HASH[RSI+RBX*8] @@50: OR RCX,RCX JZ @@90 MOV RAX,U8 ATE_NEXT[RCX] CMP RDI,RAX JNE @@55 MOV RAX,U8 ATE_NEXT[RDI] MOV U8 ATE_NEXT[RCX],RAX JMP @@90 @@55: MOV RCX,RAX JMP @@50 @@90: MOV U8 ACS_FREE_INDEX[RSI],RDX @@100: POP RDI POP RSI POP RBP RET CP_PUT_GS_BASE:: PUSH RBP MOV RBP,RSP MOV RAX,SF_PARAM1[RBP] PUSH RAX PUSH RCX PUSH RDX MOV RDX,RAX SHR RDX,32 MOV ECX,IA32_GS_BASE WRMSR POP RDX POP RCX POP RAX POP RBP RET PUT_FS_BASE:: PUSH RAX PUSH RCX PUSH RDX MOV RDX,RAX SHR RDX,32 MOV ECX,IA32_FS_BASE WRMSR POP RDX POP RCX POP RAX RET