New special instruction building...

This commit is contained in:
xolatile 2024-07-04 10:18:04 -04:00
parent 6c1e05c926
commit 48e2061aaa
3 changed files with 45 additions and 127 deletions

View File

@ -9,10 +9,12 @@ int main (void) {
output_array = malloc (144UL * sizeof (* output_array));
assemble (ADC, D64, REG, R1, REG, R2);
assemble (ADC, D32, REG, R1, MEM, 12);
assemble (ADC, D16, MEM, 12, REG, R10);
assemble (ADC, D8, REG, R3, IMM, 0X77);
build_regular (ADC, D64, REG, R1, REG, R2);
build_regular (ADC, D32, REG, R1, MEM, 12);
build_regular (ADC, D16, MEM, 12, REG, R10);
build_regular (ADC, D8, REG, R3, IMM, 0X77);
build_special_1 (LOCK);
build_special_2 (PAUSE);
for (index = 0; index < output_count; ++index) {
printf ("%02X \n", output_array [index]);

View File

@ -19,6 +19,15 @@ splint assembler.h:
-- no warnings at all.
*/
#define REGULAR_START (ADD)
#define REGULAR_COUNT (UMUL - REGULAR_START)
#define IRREGULAR_START (UMUL)
#define IRREGULAR_COUNT (NOP - IRREGULAR_START)
#define SPECIAL_1_START (NOP)
#define SPECIAL_1_COUNT (SYSENTER - SPECIAL_1_START)
#define SPECIAL_2_START (SYSENTER)
#define SPECIAL_2_COUNT (ENTER - SPECIAL_2_START)
typedef signed int form;
typedef unsigned int next;
typedef unsigned char byte;
@ -56,7 +65,7 @@ static void build_long_prefix (form when,
static void build_register_direction (form when,
form destination,
form source) {
form source) { /* LENGTH */
place (when, (byte) (0XC0 + 0X01 * (destination % 8) + 0X08 * (source % 8)));
}
@ -84,124 +93,12 @@ static void build_regular_instruction (form when,
+ 0XC0 * ((from == IMM) && (to == REG))));
}
/* EXPERIMENTAL CODE */
//~static void add (void) { place (0XFF); } /* REGULAR */
//~static void or (void) { place (0XFF); }
//~static void adc (void) { place (0XFF); }
//~static void sbb (void) { place (0XFF); }
//~static void and (void) { place (0XFF); }
//~static void sub (void) { place (0XFF); }
//~static void xor (void) { place (0XFF); }
//~static void cmp (void) { place (0XFF); }
//~static void umul (void) { place (0XFF); } /* IRREGULAR */
//~static void udiv (void) { place (0XFF); } /* STDLIB CANCER FIX */
//~static void imul (void) { place (0XFF); }
//~static void idiv (void) { place (0XFF); }
//~static void inc (void) { place (0XFF); }
//~static void dec (void) { place (0XFF); }
//~static void not (void) { place (0XFF); }
//~static void neg (void) { place (0XFF); }
//~static void enter (form dynamic_storage,
//~form nesting_level) {
//~place (0XC8);
//~place ((byte) (dynamic_storage / 1) % 256); /* FIX LATER */
//~place ((byte) (dynamic_storage / 256) % 256);
//~place ((byte) (nesting_level / 1) % 256);
//~}
//~static void leave (void) {
//~place (0XC9);
//~}
//~static void call (void) { place (0XFF); }
//~static void ret (void) { place (0XC3); } /* NEAR, NOT FAR (INTERSEGMENT) */
//~static void sysenter (void) { place (0X0F); place (0X34); }
//~static void sysexit (void) { place (0X0F); place (0X35); }
//~static void syscall (void) { place (0X0F); place (0X05); }
//~static void sysret (void) { place (0X0F); place (0X07); }
//~static void jmp (void) { place (0XFF); }
//~static void jpe (void) { place (0XFF); }
//~static void js (void) { place (0XFF); }
//~static void jpo (void) { place (0XFF); }
//~static void je (void) { place (0XFF); }
//~static void jne (void) { place (0XFF); }
//~static void jz (void) { place (0XFF); }
//~static void jnz (void) { place (0XFF); }
//~static void ja (void) { place (0XFF); }
//~static void jna (void) { place (0XFF); }
//~static void jb (void) { place (0XFF); }
//~static void jnb (void) { place (0XFF); }
//~static void mov (void) { place (0XFF); } /* EXTEND */
//~static void cmovpe (void) { place (0XFF); }
//~static void cmovs (void) { place (0XFF); }
//~static void cmovpo (void) { place (0XFF); }
//~static void cmove (void) { place (0XFF); }
//~static void cmovne (void) { place (0XFF); }
//~static void cmovz (void) { place (0XFF); }
//~static void cmovnz (void) { place (0XFF); }
//~static void cmova (void) { place (0XFF); }
//~static void cmovna (void) { place (0XFF); }
//~static void cmovb (void) { place (0XFF); }
//~static void cmovnb (void) { place (0XFF); }
//~static void lock (void) { place (0XF0); }
//~static void hlt (void) { place (0XF4); }
//~static void in (void) { place (0XFF); }
//~static void out (void) { place (0XFF); }
//~static void push (void) { place (0XFF); }
//~static void pop (void) { place (0XFF); }
//~static void bswap (void) { place (0XFF); }
//~static void test (void) { place (0XFF); }
//~static void rcl (void) { place (0XFF); }
//~static void rcr (void) { place (0XFF); }
//~static void rol (void) { place (0XFF); }
//~static void ror (void) { place (0XFF); }
//~static void shl (void) { place (0XFF); }
//~static void shr (void) { place (0XFF); }
//~static void sal (void) { place (0XFF); }
//~static void sar (void) { place (0XFF); }
//~static void rep (void) { place (0XFF); }
//~static void repe (void) { place (0XFF); }
//~static void repne (void) { place (0XFF); }
//~static void repz (void) { place (0XFF); }
//~static void loop (void) { place (0XFF); }
//~static void loope (void) { place (0XFF); }
//~static void loopne (void) { place (0XFF); }
//~static void pause (void) { place (0XF3); place (0X90); }
//~static void xadd (void) { place (0XFF); }
//~static void xchg (void) { place (0XFF); }
//~static void lea (void) { place (0XFF); }
//~static void popcnt (void) { place (0XFF); }
//~static void inti (void) { place (0XFF); }
//~static void bsf (void) { place (0XFF); }
//~static void bsr (void) { place (0XFF); }
//~static void bound (void) { place (0XFF); }
//~static void fadd (void) { place (0XFF); }
//~static void fsub (void) { place (0XFF); }
//~static void fmul (void) { place (0XFF); }
//~static void fdiv (void) { place (0XFF); }
//~static void fnop (void) { place (0XFF); }
//~static void fxam (void) { place (0XFF); }
//~static void fabs (void) { place (0XFF); }
//~static void fscale (void) { place (0XFF); }
//~static void fsin (void) { place (0XFF); }
//~static void fcos (void) { place (0XFF); }
//~static void fsqrt (void) { place (0XFF); }
//~static void fchs (void) { place (0XFF); }
//~static void fxch (void) { place (0XFF); }
//~static void frem (void) { place (0XFF); }
//~static void fldpi (void) { place (0XFF); }
//~static void fldz (void) { place (0XFF); }
//~static void cpuid (void) { place (0X0F); place (0XA2); }
//~static void movbe (void) { place (0XFF); } /* [48]0F38[F0-RM/F1-MR][05+8R] */
static void assemble (operation_index operation,
size_index size,
type_index to,
form destination,
type_index from,
form source) {
static void build_regular (operation_index operation,
size_index size,
type_index to,
form destination,
type_index from,
form source) {
build_short_prefix (size == D16);
build_long_prefix ((size == D64)
@ -220,3 +117,21 @@ static void assemble (operation_index operation,
build_register_redirection ((to == REG) && (from == MEM), destination);
build_register_redirection ((to == MEM) && (from == REG), source);
}
static void build_special_1 (operation_index operation) {
const byte data [1 * SPECIAL_1_COUNT] = {
0X90, 0XC3, 0XCB, 0XC9, 0XF0, 0XF4
};
place (1, data [operation - SPECIAL_1_START]);
}
static void build_special_2 (operation_index operation) {
const byte data [2 * SPECIAL_2_COUNT] = {
0X0F, 0X0F, 0X0F, 0X0F, 0XF3, 0X0F,
0X34, 0X35, 0X05, 0X07, 0X90, 0XA2
};
place (1, data [operation - SPECIAL_2_START]);
place (1, data [operation - SPECIAL_2_START + SPECIAL_2_COUNT]);
}

View File

@ -14,27 +14,28 @@ typedef enum {
AND, SUB, XOR, CMP,
UMUL, UDIV, IMUL, IDIV,
INC, DEC, NOT, NEG,
ENTER, LEAVE, CALL, RET,
NOP, RETN, RETF, LEAVE,
LOCK, HLT,
SYSENTER, SYSEXIT, SYSCALL, SYSRET,
PAUSE, CPUID,
ENTER, CALL, IN, OUT,
JMP, JPE, JS, JPO,
JE, JNE, JZ, JNZ,
JA, JNA, JB, JNB,
MOV, CMOVPE, CMOVS, CMOVPO,
CMOVE, CMOVNE, CMOVZ, CMOVNZ,
CMOVA, CMOVNA, CMOVB, CMOVNB,
LOCK, HLT, IN, OUT,
PUSH, POP, BSWAP, TEST,
RCL, RCR, ROL, ROR,
SHL, SHR, SAL, SAR,
REP, REPE, REPNE, REPZ,
LOOP, LOOPE, LOOPNE, PAUSE,
LOOP, LOOPE, LOOPNE, MOVBE,
XADD, XCHG, LEA, POPCNT,
INTI, BSF, BSR, BOUND,
FADD, FSUB, FMUL, FDIV,
FNOP, FXAM, FABS, FSCALE,
FSIN, FCOS, FSQRT, FCHS,
FXCH, FREM, FLDPI, FLDZ,
CPUID, MOVBE,
} operation_index;
typedef enum {