Initial revision
This commit is contained in:
		
							parent
							
								
									fb88f5dbdd
								
							
						
					
					
						commit
						f682c264a8
					
				
					 10 changed files with 2007 additions and 0 deletions
				
			
		
							
								
								
									
										7
									
								
								mach/i386/ce/.distr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								mach/i386/ce/.distr
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | |||
| EM_table | ||||
| Makefile | ||||
| as.c | ||||
| as.h | ||||
| as_table | ||||
| mach.c | ||||
| mach.h | ||||
							
								
								
									
										1104
									
								
								mach/i386/ce/EM_table
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1104
									
								
								mach/i386/ce/EM_table
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										26
									
								
								mach/i386/ce/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								mach/i386/ce/Makefile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| EMHOME = ../../.. | ||||
| CEG = $(EMHOME)/lib/ceg/util | ||||
| VERSION = make_obj | ||||
| 
 | ||||
| all: | ||||
| 	make -f $(CEG)/$(VERSION) | ||||
| 
 | ||||
| install: | ||||
| 	make -f $(CEG)/$(VERSION) install | ||||
| 
 | ||||
| cmp: | ||||
| 	-make -f $(CEG)/$(VERSION) cmp | ||||
| 
 | ||||
| pr: | ||||
| 	@pr Makefile EM_table mach.h mach.c as_table as.h as.c | ||||
| 
 | ||||
| opr: | ||||
| 	make pr | opr | ||||
| 
 | ||||
| # total cleanup
 | ||||
| clean: | ||||
| 	make -f $(CEG)/$(VERSION) clean | ||||
| 
 | ||||
| # only remove ce, ceg, and back directories
 | ||||
| dclean: | ||||
| 	make -f $(CEG)/$(VERSION) dclean | ||||
							
								
								
									
										362
									
								
								mach/i386/ce/as.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										362
									
								
								mach/i386/ce/as.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,362 @@ | |||
| #include "arg_type.h" | ||||
| #include "as.h" | ||||
| 
 | ||||
| #define last( s)	( s + strlen( s) - 1) | ||||
| #define LEFT	'(' | ||||
| #define RIGHT	')' | ||||
| #define DOLLAR	'$' | ||||
| 
 | ||||
| block_assemble( instr, nr, first, Last) | ||||
| char **instr; | ||||
| int nr, first, Last; | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| /*
 | ||||
| 	if ( first) { | ||||
| 		if( strncmp( instr[0], "pop", 3) == 0) { | ||||
| 			*instr[0] = 'P'; | ||||
| 			*( instr[0]+1) = 'O'; | ||||
| 			*( instr[0]+2) = 'P'; | ||||
| 		} | ||||
| 		else | ||||
| 			@clean_push_buf(); | ||||
| 	} | ||||
| 	if ( Last && strncmp( instr[nr-1], "push", 4) == 0) { | ||||
| 			*instr[nr-1] = 'P'; | ||||
| 			*( instr[nr-1]+1) = 'U'; | ||||
| 			*( instr[nr-1]+2) = 'S'; | ||||
| 			*( instr[nr-1]+3) = 'H'; | ||||
| 	} | ||||
| */ | ||||
| 	for( i=0; i<nr; i++) | ||||
| 		assemble( instr[i]); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| process_label( l) | ||||
| char *l; | ||||
| { | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| process_mnemonic( m) | ||||
| char *m; | ||||
| { | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| process_operand( str, op) | ||||
| char *str; | ||||
| struct t_operand *op; | ||||
| 
 | ||||
| /*	expr		->	IS_DATA en IS_LABEL
 | ||||
|  *	reg		->	IS_REG en IS_ACCU | ||||
|  *	(expr)		->	IS_ADDR | ||||
|  *	expr(reg)	->	IS_MEM | ||||
|  */ | ||||
| { | ||||
| 	char *ptr, *index(); | ||||
| 
 | ||||
| 	op->type = UNKNOWN; | ||||
| 	if ( *last( str) == RIGHT) { | ||||
| 		ptr = index( str, LEFT); | ||||
| 		*last( str) = '\0'; | ||||
| 		*ptr = '\0'; | ||||
| 		if ( is_reg( ptr+1, op)) { | ||||
| 			op->type = IS_MEM; | ||||
| 			op->expr = ( *str == '\0' ? "0" : str); | ||||
| 		} | ||||
| 		else { | ||||
| 			set_label( ptr+1, op); | ||||
| 			op->type = IS_ADDR; | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 		if ( is_reg( str, op)) | ||||
| 			op->type = IS_REG; | ||||
| 		else { | ||||
| 			if ( contains_label( str)) | ||||
| 				set_label( str, op); | ||||
| 			else { | ||||
| 				op->type = IS_DATA; | ||||
| 				op->expr = str; | ||||
| 			} | ||||
| 		} | ||||
| } | ||||
| 
 | ||||
| static struct regnam { | ||||
| 	char *regstr; | ||||
| 	int regval; | ||||
| } regnam[] = { | ||||
| 	{ "eax", 0 }, | ||||
| 	{ "ebx", 3 }, | ||||
| 	{ "ecx", 1 }, | ||||
| 	{ "edx", 2 }, | ||||
| 	{ "esp", 4 }, | ||||
| 	{ "ebp", 5 }, | ||||
| 	{ "esi", 6 }, | ||||
| 	{ "edi", 7 }, | ||||
| 	{ "al", 0 }, | ||||
| 	{ "bl", 3 }, | ||||
| 	{ "cl", 1 }, | ||||
| 	{ "dl", 2 }, | ||||
| 	{ "ah", 4 }, | ||||
| 	{ "bh", 7 }, | ||||
| 	{ "ch", 5 }, | ||||
| 	{ "dh", 6 }, | ||||
| 	{ 0, 0} | ||||
| } | ||||
| ; | ||||
| 
 | ||||
| int is_reg( str, op) | ||||
| char *str; | ||||
| struct t_operand *op; | ||||
| { | ||||
| 	register struct regnam *p = regnam; | ||||
| 
 | ||||
| 	while (p->regstr) { | ||||
| 		if (! strcmp(p->regstr, str)) { | ||||
| 			op->reg = p->regval; | ||||
| 			return TRUE; | ||||
| 		} | ||||
| 		p++; | ||||
| 	} | ||||
| 	return FALSE; | ||||
| } | ||||
| 
 | ||||
| #include <ctype.h> | ||||
| #define	 isletter( c)	( isalpha( c) || c == '_') | ||||
| 
 | ||||
| int contains_label( str) | ||||
| char *str; | ||||
| { | ||||
| 	while( !isletter( *str) && *str != '\0') | ||||
| 		if ( *str == '$') | ||||
| 			if ( arg_type( str) == STRING) | ||||
| 				return( TRUE); | ||||
| 			else | ||||
| 				str += 2; | ||||
| 		else | ||||
| 			str++; | ||||
| 
 | ||||
| 	return( isletter( *str)); | ||||
| } | ||||
| 
 | ||||
| set_label( str, op) | ||||
| char *str; | ||||
| struct t_operand *op; | ||||
| { | ||||
| 	char *ptr, *index(), *sprint(); | ||||
| 	static char buf[256]; | ||||
| 
 | ||||
| 	ptr = index( str, '+'); | ||||
| 
 | ||||
| 	if ( ptr == 0) | ||||
| 		op->off = "0"; | ||||
| 	else { | ||||
| 		*ptr = '\0'; | ||||
| 		op->off = ptr + 1; | ||||
| 	} | ||||
| 
 | ||||
| 	if ( isdigit( *str) && ( *(str+1) == 'b' || *(str+1) == 'f') && | ||||
| 	     *(str+2) == '\0') { | ||||
| 		*(str+1) = '\0';	/* remove b or f! */ | ||||
| 		op->lab = str; | ||||
| 		op->type = IS_ILB; | ||||
| 	} | ||||
| 	else { | ||||
| 		op->type = IS_LABEL; | ||||
| 		if ( index( str, DOLLAR) != 0) | ||||
| 			op->lab = str; | ||||
| 		else  | ||||
| 			op->lab = sprint( buf, "\"%s\"", str); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /******************************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| mod_RM( reg, op) | ||||
| int reg; | ||||
| struct t_operand *op; | ||||
| { | ||||
| 	if ( REG( op)) | ||||
| 		R233( 0x3, reg, op->reg); | ||||
| 	else if ( ADDR( op)) { | ||||
| 		R233( 0x0, reg, 0x5); | ||||
| 		@reloc4( %$(op->lab), %$(op->off), ABSOLUTE); | ||||
| 	} | ||||
| 	else if ( strcmp( op->expr, "0") == 0) | ||||
| 		switch( op->reg) { | ||||
| 		  case AX: | ||||
| 		  case BX: | ||||
| 		  case CX: | ||||
| 		  case DX: | ||||
| 		  case DI: | ||||
| 		  case SI:  R233( 0x0, reg, op->reg); | ||||
| 			    break; | ||||
| 
 | ||||
| 		  case BP : R233( 0x1, reg, 0x6);	/* Exception! */ | ||||
| 			    @text1( 0); | ||||
| 			    break; | ||||
| 
 | ||||
| 		  default : fprint( STDERR, "Wrong index register %d\n", | ||||
| 				    op->reg); | ||||
| 		} | ||||
| 	else { | ||||
| 	    if (isdigit(op->expr[0])) { | ||||
| 		long l, atol(); | ||||
| 
 | ||||
| 		l = atol(op->expr); | ||||
| 		if ( l <= 127 && l >= -128) { | ||||
| 			switch( op->reg) { | ||||
| 			  case AX: | ||||
| 			  case BX: | ||||
| 			  case CX: | ||||
| 			  case DX: | ||||
| 			  case DI: | ||||
| 			  case BP: | ||||
| 		  	  case SI : R233( 0x1, reg, op->reg); | ||||
| 				    break; | ||||
| 	 | ||||
| 			  default : fprint( STDERR, "Wrong index register %d\n", | ||||
| 					    op->reg); | ||||
| 			} | ||||
| 			@text1( %$(op->expr)); | ||||
| 		} else { | ||||
| 			switch( op->reg) { | ||||
| 			  case AX: | ||||
| 			  case BX: | ||||
| 			  case CX: | ||||
| 			  case DX: | ||||
| 			  case DI: | ||||
| 			  case BP: | ||||
| 		  	  case SI : R233( 0x2, reg, op->reg); | ||||
| 				    break; | ||||
| 	 | ||||
| 			  default : fprint( STDERR, "Wrong index register %d\n", | ||||
| 					    op->reg); | ||||
| 			} | ||||
| 			@text4( %$(op->expr)); | ||||
| 		} | ||||
| 	    } else { | ||||
| 		@if ( fit_byte( %$(op->expr))) | ||||
| 			switch( op->reg) { | ||||
| 			  case AX: | ||||
| 			  case BX: | ||||
| 			  case CX: | ||||
| 			  case DX: | ||||
| 			  case DI: | ||||
| 			  case BP: | ||||
| 		  	  case SI : R233( 0x1, reg, op->reg); | ||||
| 				    break; | ||||
| 	 | ||||
| 			  default : fprint( STDERR, "Wrong index register %d\n", | ||||
| 					    op->reg); | ||||
| 			} | ||||
| 			@text1( %$(op->expr)); | ||||
| 		@else | ||||
| 			switch( op->reg) { | ||||
| 			  case AX: | ||||
| 			  case BX: | ||||
| 			  case CX: | ||||
| 			  case DX: | ||||
| 			  case DI: | ||||
| 			  case BP: | ||||
| 		  	  case SI : R233( 0x2, reg, op->reg); | ||||
| 				    break; | ||||
| 	 | ||||
| 			  default : fprint( STDERR, "Wrong index register %d\n", | ||||
| 					    op->reg); | ||||
| 			} | ||||
| 			@text4( %$(op->expr)); | ||||
| 		@fi | ||||
| 	    } | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| mv_RG_EADDR( dst, src) | ||||
| struct t_operand *dst, *src; | ||||
| { | ||||
| 	if ( REG(src) && dst->reg == src->reg) | ||||
| 		; /* Nothing!! result of push/pop optimization */ | ||||
| 	else { | ||||
| 		@text1( 0x8b); | ||||
| 		mod_RM( dst->reg, src); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| R233( a, b, c) | ||||
| int a,b,c; | ||||
| { | ||||
| 	@text1( %d( (a << 6) | ( b << 3) | c)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| R53( a, b) | ||||
| int a,b; | ||||
| { | ||||
| 	@text1( %d( (a << 3) | b)); | ||||
| } | ||||
| 
 | ||||
| small_const(opc, src) | ||||
| 	struct t_operand *src; | ||||
| { | ||||
| 	if (isdigit(src->expr[0])) { | ||||
| 		long l, atol(); | ||||
| 
 | ||||
| 		l = atol(src->expr); | ||||
| 		if (l >= -128 && l <= 127) { | ||||
| 			@text1(%d(opc|02)); | ||||
| 			@text1(%$(src->expr)); | ||||
| 		} | ||||
| 		else { | ||||
| 			@text1(%d(opc)); | ||||
| 			@text4(%$(src->expr)); | ||||
| 		} | ||||
| 	} | ||||
| 	else { | ||||
| 		@if (fit_byte(%$(src->expr))) | ||||
| 			@text1(%d(opc|02)); | ||||
| 			@text1(%$(src->expr)); | ||||
| 		@else | ||||
| 			@text1(%d(opc)); | ||||
| 			@text1(%$(src->expr)); | ||||
| 		@fi | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| small_RMconst(opc, reg, dst, src) | ||||
| 	struct t_operand *dst, *src; | ||||
| { | ||||
| 	if (isdigit(src->expr[0])) { | ||||
| 		long l, atol(); | ||||
| 
 | ||||
| 		l = atol(src->expr); | ||||
| 		if (l >= -128 && l <= 127) { | ||||
| 			@text1(%d(opc|02)); | ||||
| 			mod_RM(reg, dst); | ||||
| 			@text1(%$(src->expr)); | ||||
| 		} | ||||
| 		else { | ||||
| 			@text1(%d(opc)); | ||||
| 			mod_RM(reg, dst); | ||||
| 			@text4(%$(src->expr)); | ||||
| 		} | ||||
| 	} | ||||
| 	else { | ||||
| 		@if (fit_byte(%$(src->expr))) | ||||
| 			@text1(%d(opc|02)); | ||||
| 			mod_RM(reg, dst); | ||||
| 			@text1(%$(src->expr)); | ||||
| 		@else | ||||
| 			@text1(%d(opc)); | ||||
| 			mod_RM(reg, dst); | ||||
| 			@text1(%$(src->expr)); | ||||
| 		@fi | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										37
									
								
								mach/i386/ce/as.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								mach/i386/ce/as.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | |||
| #define	UNKNOWN		0 | ||||
| #define	IS_REG		0x1 | ||||
| #define	IS_ACCU		0x2 | ||||
| #define	IS_DATA		0x4 | ||||
| #define	IS_LABEL	0x8 | ||||
| #define	IS_MEM		0x10 | ||||
| #define	IS_ADDR		0x20 | ||||
| #define	IS_ILB		0x40 | ||||
| 
 | ||||
| #define AX		0 | ||||
| #define BX		3 | ||||
| #define CX		1 | ||||
| #define DX		2 | ||||
| #define CL		1 | ||||
| #define SP		4 | ||||
| #define BP		5 | ||||
| #define SI		6 | ||||
| #define DI		7 | ||||
| 
 | ||||
| #define REG( op)	( op->type & IS_REG) | ||||
| #define ACCU( op)	( op->type & IS_REG  &&  op->reg == AX) | ||||
| #define REG_CL( op)	( op->type & IS_REG  &&  op->reg == CL) | ||||
| #define DATA( op)	( op->type & IS_DATA) | ||||
| #define lABEL( op)	( op->type & IS_LABEL) | ||||
| #define ILB( op)	( op->type & IS_ILB) | ||||
| /*#define MEM( op)	( op->type & IS_MEM)*/ | ||||
| #define ADDR( op)	( op->type & IS_ADDR) | ||||
| #define EADDR( op)	( op->type & ( IS_ADDR | IS_MEM | IS_REG)) | ||||
| 
 | ||||
| #define TRUE		1 | ||||
| #define FALSE		0 | ||||
| 
 | ||||
| struct t_operand { | ||||
| 	unsigned type; | ||||
| 	int reg; | ||||
| 	char *expr, *lab, *off; | ||||
|        }; | ||||
							
								
								
									
										218
									
								
								mach/i386/ce/as_table
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								mach/i386/ce/as_table
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,218 @@ | |||
| add dst:REG, src:EADDR	==>	@text1( 0x3); | ||||
| 				mod_RM( dst->reg, src). | ||||
| 
 | ||||
| ... dst:ACCU, src:DATA	==>	@text1( 0x5); | ||||
| 				@text4( %$(src->expr)). | ||||
| 
 | ||||
| ... dst:EADDR, src:DATA	==>	small_RMconst(0x81, 0, dst, src). | ||||
| 
 | ||||
| and dst:REG, src:EADDR	==>	@text1( 0x23); | ||||
| 				mod_RM( dst->reg, src). | ||||
| 
 | ||||
| ... dst:ACCU, src:DATA	==>	@text1( 0x25); | ||||
| 				@text4( %$(src->expr)). | ||||
| 
 | ||||
| call dst:lABEL		==>	@text1( 0xe8); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| ... dst:EADDR		==>	@text1( 0xff); | ||||
| 				mod_RM( 2, dst). | ||||
| 
 | ||||
| cdq			==>	@text1(0x99). | ||||
| 
 | ||||
| cmp dst:REG, src:EADDR	==>	@text1( 0x3b); | ||||
| 				mod_RM( dst->reg, src). | ||||
| 
 | ||||
| ... dst:ACCU, src:DATA	==>	@text1( 0x3d); | ||||
| 				@text4( %$(src->expr)). | ||||
| 
 | ||||
| ... dst:EADDR, src:DATA	==>	small_RMconst(0x81, 7, dst, src). | ||||
| 
 | ||||
| dec dst:REG		==>	R53( 9, dst->reg). | ||||
| 
 | ||||
| ... dst:EADDR		==>	@text1( 0xff); | ||||
| 				mod_RM( 1, dst). | ||||
| 
 | ||||
| div divisor:EADDR	==>	@text1( 0xf7); | ||||
| 				mod_RM( 6, divisor). | ||||
| 
 | ||||
| enter nm:DATA, nm1:DATA	==>	@text1( 0xc8); | ||||
| 				@text2( %$(nm->expr)); | ||||
| 				@text1( %$(nm1->expr)). | ||||
| 
 | ||||
| idiv divisor:EADDR	==>	@text1( 0xf7); | ||||
| 				mod_RM( 7, divisor). | ||||
| 
 | ||||
| imul mplier:EADDR	==>	@text1( 0xf7); | ||||
| 				mod_RM( 5, mplier). | ||||
| 
 | ||||
| inc dst:REG		==>	R53( 8, dst->reg). | ||||
| 
 | ||||
| ... dst:EADDR		==>	@text1( 0xff); | ||||
| 				mod_RM( 0, dst). | ||||
| 
 | ||||
| jb dst:ILB		==>	@text1( 0x72); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| ... dst:lABEL		==>	@text1(0x0f); | ||||
| 				@text1(0x12); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| je dst:ILB		==>	@text1( 0x74); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| ... dst:lABEL		==>	@text1(0x0f); | ||||
| 				@text1(0x14); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| jg dst:ILB		==>	@text1( 0x7f); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| ... dst:lABEL		==>	@text1(0x0f); | ||||
| 				@text1(0x1f); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| jge dst:ILB		==>	@text1( 0x7d); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| ... dst:lABEL		==>	@text1(0x0f); | ||||
| 				@text1(0x1d); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| jl dst:ILB		==>	@text1( 0x7c); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| ... dst:lABEL		==>	@text1(0x0f); | ||||
| 				@text1(0x1c); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| jle dst:ILB		==>	@text1( 0x7e); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| ... dst:lABEL		==>	@text1(0x0f); | ||||
| 				@text1(0x1e); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| jmp dst:ILB		==>	@text1( 0xeb); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| ... dst:lABEL		==>	@text1( 0xe9); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| jne dst:ILB		==>	@text1( 0x75); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| ... dst:lABEL		==>	@text1(0x0f); | ||||
| 				@text1(0x85); | ||||
| 				@reloc4( %$(dst->lab), %$(dst->off), PC_REL). | ||||
| 
 | ||||
| lea dst:REG, src:EADDR	==>	@text1( 0x8d); | ||||
| 				mod_RM( dst->reg, src). | ||||
| 
 | ||||
| loop dst:ILB		==>	@text1( 0xe2); | ||||
| 				@text1( %dist( dst->lab)). | ||||
| 
 | ||||
| mov dst:REG, src:EADDR	==>	mv_RG_EADDR( dst, src). | ||||
| 
 | ||||
| ... dst:REG, src:DATA	==>	R53( 0x17, dst->reg); | ||||
| 				@text4(%$(src->expr)). | ||||
| 
 | ||||
| ... dst:EADDR, src:REG	==>	@text1( 0x89); | ||||
| 				mod_RM( src->reg, dst). | ||||
| 
 | ||||
| ... dst:EADDR, src:DATA	==>	@text1( 0xc7); | ||||
| 				mod_RM( 0, dst); | ||||
| 				@text4( %$(src->expr)). | ||||
| 
 | ||||
| ... dst:EADDR, src:lABEL ==>	@text1( 0xc7); | ||||
| 				mod_RM( 0, dst); | ||||
| 				@reloc4( %$(src->lab), %$(src->off), ABSOLUTE). | ||||
| 
 | ||||
| movb dst:EADDR, src:REG	==>	@text1( 0x88); | ||||
| 				mod_RM( src->reg, dst). | ||||
| 
 | ||||
| movzx dst:REG, src:EADDR ==>	@text1(0x0f); | ||||
| 				@text1(0xb7); | ||||
| 				mod_RM(dst->reg, src). | ||||
| 
 | ||||
| mul mplier:EADDR	==>	@text1( 0xf7); | ||||
| 				mod_RM( 4, mplier). | ||||
| 
 | ||||
| neg dst:EADDR		==>	@text1( 0xf7); | ||||
| 				mod_RM( 3, dst). | ||||
| 
 | ||||
| not dst:EADDR		==>	@text1( 0xf7); | ||||
| 				mod_RM( 2, dst). | ||||
| 
 | ||||
| o16			==>	@text1(0x66). | ||||
| 
 | ||||
| or dst:REG, src:EADDR	==>	@text1( 0x0b); | ||||
| 				mod_RM( dst->reg, src). | ||||
| 
 | ||||
| pop dst:REG		==>	R53( 0xb, dst->reg). | ||||
| 
 | ||||
| ... dst:EADDR		==>	@text1( 0x8f); | ||||
| 				mod_RM( 0, dst). | ||||
| 
 | ||||
| /* | ||||
| POP dst			==>	@if ( push_waiting) | ||||
| 					mov_instr( dst, AX_oper); | ||||
| 					@assign( push_waiting, FALSE). | ||||
| 				@else | ||||
| 					pop_instr( dst). | ||||
| 				@fi. | ||||
| */ | ||||
| 
 | ||||
| push src:REG		==>	R53( 0xa, src->reg). | ||||
| 
 | ||||
| ... src:DATA		==>	small_const(0x68, src). | ||||
| 
 | ||||
| ... src:lABEL		==>	@emit1(0x68); | ||||
| 				@reloc4(%$(src->lab), %$(src->off), ABSOLUTE). | ||||
| 
 | ||||
| ... src:EADDR		==>	@text1( 0xff); | ||||
| 				mod_RM( 6, src). | ||||
| 
 | ||||
| /* | ||||
| PUSH src		==>	mov_instr( AX_oper, src); | ||||
| 				@assign( push_waiting, TRUE). | ||||
| */ | ||||
| ret			==>	@text1( 0xc3).	/* Always NEAR! */ | ||||
| 
 | ||||
| leave			==>	@text1( 0xc9).	/* Always NEAR! */ | ||||
| 
 | ||||
| rol dst:EADDR, src:REG_CL ==>	@text1( 0xd3); | ||||
| 				mod_RM( 0, dst). | ||||
| 
 | ||||
| ror dst:EADDR, src:REG_CL ==>	@text1( 0xd3); | ||||
| 				mod_RM( 1, dst). | ||||
| 
 | ||||
| sal dst:EADDR, src:REG_CL ==>	@text1( 0xd3); | ||||
| 				mod_RM( 4, dst). | ||||
| 
 | ||||
| sar dst:EADDR, src:REG_CL ==>	@text1( 0xd3); | ||||
| 				mod_RM( 7, dst). | ||||
| 
 | ||||
| ... dst:EADDR, src:DATA ==>	@text1( 0xc1); | ||||
| 				mod_RM( 7, dst); | ||||
| 				@text1(%$(src->expr)). | ||||
| 
 | ||||
| shl dst:EADDR, src:REG_CL ==>	@text1(0xd3); | ||||
| 				mod_RM(4, dst). | ||||
| 
 | ||||
| shr dst:EADDR, src:REG_CL ==>	@text1( 0xd3); | ||||
| 				mod_RM( 5, dst). | ||||
| 
 | ||||
| sub dst:REG, src:EADDR	==>	@text1( 0x2b); | ||||
| 				mod_RM( dst->reg, src). | ||||
| 
 | ||||
| ... dst:EADDR, src:DATA	==>	small_RMconst(0x81, 5, dst, src). | ||||
| 
 | ||||
| test dst:REG, src:EADDR	==>	@text1( 0x85); | ||||
| 				mod_RM( dst->reg, src). | ||||
| 
 | ||||
| xchg dst:EADDR, src:REG	==>	@text1( 0x87); | ||||
| 				mod_RM( src->reg, dst). | ||||
| 
 | ||||
| xor dst:REG, src:EADDR	==>	@text1( 0x33); | ||||
| 				mod_RM( dst->reg, src). | ||||
							
								
								
									
										176
									
								
								mach/i386/ce/mach.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								mach/i386/ce/mach.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,176 @@ | |||
| #define CODE_EXPANDER | ||||
| #include <system.h> | ||||
| #include "back.h" | ||||
| #include "mach.h" | ||||
| 
 | ||||
| #ifdef DEBUG | ||||
| arg_error( s, arg) | ||||
| char *s; | ||||
| int arg; | ||||
| { | ||||
| 	fprint( STDERR, "arg_error %s %d\n", s, arg); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| int push_waiting = FALSE; | ||||
| 
 | ||||
| int fit_byte( val) | ||||
| int val; | ||||
| { | ||||
| 	return( val >= -128 && val <= 127); | ||||
| } | ||||
| 
 | ||||
| con_float(str, argval) | ||||
| 	char *str; | ||||
| 	int argval; | ||||
| { | ||||
| #ifdef NOFLOAT | ||||
| 
 | ||||
| static int been_here; | ||||
| 	if (argval != 4 && argval != 8) | ||||
| 		arg_error("fcon", argval); | ||||
| 	if (argval == 8) | ||||
| 		gen4((FOUR_BYTES) 0); | ||||
| 	gen4((FOUR_BYTES) 0); | ||||
| 	if ( !been_here++) | ||||
| 	{ | ||||
| 	fprint(STDERR, "Warning : dummy float-constant(s)\n"); | ||||
| 	} | ||||
| #else | ||||
| #define IEEEFLOAT | ||||
| 	double f; | ||||
| 	double atof(); | ||||
| 	int i; | ||||
| 	int j; | ||||
| 	double frexp(); | ||||
| #ifndef OWNFLOAT | ||||
| 	int sign = 0; | ||||
| 	int fraction[4] ; | ||||
| #else OWNFLOAT | ||||
| 	float fl; | ||||
| 	char *p; | ||||
| #endif OWNFLOAT | ||||
| 
 | ||||
| 	if (argval!= 4 && argval!= 8)	{ | ||||
| 		arg_error("fcon", argval); | ||||
| 		argval = 8; | ||||
| 	} | ||||
| 	f = atof(str); | ||||
| 	if (f == 0) { | ||||
| 		if (argval == 8) gen4((FOUR_BYTES) 0); | ||||
| 		gen4((FOUR_BYTES) 0); | ||||
| 		return; | ||||
| 	} | ||||
| #ifdef OWNFLOAT | ||||
| 	if (argval == 4) { | ||||
| 		/* careful: avoid overflow */ | ||||
| 		double ldexp(); | ||||
| 		f = frexp(f, &i); | ||||
| 		fl = f; | ||||
| 		fl = frexp(fl,&j); | ||||
| 		if (i+j > 127) { | ||||
| 			/* overflow situation */ | ||||
| 			gen1(f<0?0377:0177); | ||||
| 			gen1(0377); | ||||
| 			gen1(0377); | ||||
| 			gen1(0377); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (i+j < -127) { | ||||
| 			/* underflow situation */ | ||||
| 			gen1(f<0?0200:0); | ||||
| 			gen1(0200); | ||||
| 			gen1(0); | ||||
| 			gen1(0); | ||||
| 			return; | ||||
| 		} | ||||
| 		fl = ldexp(fl, i+j); | ||||
| 		p = (char *) &fl; | ||||
| 	} | ||||
| 	else { | ||||
| 		p = (char *) &f; | ||||
| 	} | ||||
| 	gen1(*p++&0377); | ||||
| 	for (i = argval-1; i; i--) { | ||||
| 		gen1(*p++&0377); | ||||
| 	} | ||||
| #else OWNFLOAT | ||||
| 	f = frexp(f, &i); | ||||
| 	if (f < 0) { | ||||
| 		f = -f; | ||||
| 		sign = 1; | ||||
| 	} | ||||
| 	while (f < 0.5) { | ||||
| 		f += f; | ||||
| 		i --; | ||||
| 	} | ||||
| 	f = 2*f - 1.0;		/* hidden bit */ | ||||
| #ifdef IEEEFLOAT | ||||
| 	if (argval == 4) { | ||||
| #endif IEEEFLOAT | ||||
| 		i = (i + 128) & 0377; | ||||
| 		fraction[0] = (sign << 15) | (i << 7); | ||||
| 		for (j = 6; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				f -= 1.0; | ||||
| 				fraction[0] |= (1 << j); | ||||
| 			} | ||||
| 		} | ||||
| #ifdef IEEEFLOAT | ||||
| 	} | ||||
| 	else { | ||||
| 		i = (i + 1024) & 03777; | ||||
| 		fraction[0] = (sign << 15) | (i << 4); | ||||
| 		for (j = 3; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[0] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif IEEEFLOAT | ||||
| 	for (i = 1; i < argval / 2; i++) { | ||||
| 		fraction[i] = 0; | ||||
| 		for (j = 15; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[i] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if (f >= 0.5) { | ||||
| 		for (i = argval/2 - 1; i >= 0; i--) { | ||||
| 			for (j = 0; j < 16; j++) { | ||||
| 				if (fraction[i] & (1 << j)) { | ||||
| 					fraction[i] &= ~(1 << j); | ||||
| 				} | ||||
| 				else { | ||||
| 					fraction[i] |= (1 << j); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			if (j != 16) break; | ||||
| 		} | ||||
| 	} | ||||
| 	for (i = 0; i < argval/2; i++) { | ||||
| 		gen1((fraction[i]>>8)&0377); | ||||
| 		gen1(fraction[i]&0377); | ||||
| 	} | ||||
| #endif OWNFLOAT | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /* as long as we generate assembler ...
 | ||||
| 
 | ||||
| do_open(filename) | ||||
| 	char *filename; | ||||
| { | ||||
| 	if (filename == 0 || ! sys_open(filename, OP_WRITE, &codefile)) | ||||
| 		return FALSE; | ||||
| 
 | ||||
| 	fprint( codefile, ".sect .text; .sect .rom; .sect .data; .sect .bss\n");	return TRUE; | ||||
| } | ||||
| */ | ||||
							
								
								
									
										50
									
								
								mach/i386/ce/mach.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								mach/i386/ce/mach.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | |||
| #define	BSS_INIT	0 | ||||
| 
 | ||||
| #define ONE_BYTE	int | ||||
| #define TWO_BYTES	int | ||||
| #define FOUR_BYTES	long | ||||
| 
 | ||||
| 
 | ||||
| #define EM_WSIZE	4 | ||||
| #define EM_PSIZE	4 | ||||
| #define EM_BSIZE	8 | ||||
| 
 | ||||
| 
 | ||||
| #define NAME_FMT	"_%s" | ||||
| #define DNAM_FMT	"_%s" | ||||
| #define DLB_FMT		"I_%ld" | ||||
| #define	ILB_FMT		"I%03d%ld" | ||||
| #define HOL_FMT		"hol%d" | ||||
| 
 | ||||
| #define ALIGN_FMT               ".align\n" | ||||
| 
 | ||||
| #define BYTE_FMT                ".data1 %ld\n" | ||||
| #define WORD_FMT                ".data2 %ld\n" | ||||
| #define LONG_FMT                ".data4 %ld\n" | ||||
| #define BSS_FMT                 ".space %ld\n" | ||||
| 
 | ||||
| #define SEGTXT_FMT              ".sect .text\n" | ||||
| #define SEGDAT_FMT              ".sect .data\n" | ||||
| #define SEGBSS_FMT              ".sect .bss\n" | ||||
| 
 | ||||
| #define SYMBOL_DEF_FMT          "%s :\n" | ||||
| #define GLOBAL_FMT              ".extern %s\n" | ||||
| #define LOCAL_FMT               "" | ||||
| 
 | ||||
| #define RELOC1_FMT              ".data1 %s + %ld\n" | ||||
| #define RELOC2_FMT              ".data2 %s + %ld\n" | ||||
| #define RELOC4_FMT              ".data4 %s + %ld\n" | ||||
| 
 | ||||
| #define COMM_FMT		".comm %s,%ld\n" | ||||
| #define	GENLAB		'I' | ||||
| 
 | ||||
| #define TRUE	1 | ||||
| #define FALSE	0 | ||||
| 
 | ||||
| #define clean_push_buf()       if(push_waiting){text1(0x50);push_waiting=FALSE;} | ||||
| #define assign( l, r)          l = r | ||||
| extern int push_waiting; | ||||
| 
 | ||||
| #ifndef DEBUG | ||||
| #define arg_error(s,i) | ||||
| #endif | ||||
							
								
								
									
										21
									
								
								mach/i386/libbc/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								mach/i386/libbc/Makefile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| SUF=o | ||||
| MAKEFILE=../../proto/libg/Makefile | ||||
| MACHDEF="MACH=i386" "SUF=$(SUF)" "ASAR=aal" | ||||
| BCDEF="PREF=bc" "SUB=" "SRC=lang/basic/lib" | ||||
| 
 | ||||
| install: | ||||
| 	make -f $(MAKEFILE) $(BCDEF) $(MACHDEF) tailcp | ||||
| 
 | ||||
| cmp: | ||||
| 	make -f $(MAKEFILE) $(BCDEF) $(MACHDEF) tail | ||||
| 	-../../compare head_bc | ||||
| 	-../../compare tail_bc | ||||
| 
 | ||||
| clean: | ||||
| 	-rm -f *.old *.[ce$(SUF)] tail* head* | ||||
| 
 | ||||
| opr: | ||||
| 	make pr | opr | ||||
| 
 | ||||
| pr: | ||||
| 	@pr Makefile | ||||
							
								
								
									
										6
									
								
								mach/i386/libbc/compmodule
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								mach/i386/libbc/compmodule
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| if ${MACH?} -I../../../h ${MACHFL?} $1 1>&2 | ||||
| then | ||||
| 	echo `basename $1 $2`.o | ||||
| else | ||||
| 	exit 1 | ||||
| fi | ||||
		Loading…
	
	Add table
		
		Reference in a new issue