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