Initial revision
This commit is contained in:
		
							parent
							
								
									4e0c9a780a
								
							
						
					
					
						commit
						ccf7ef96b5
					
				
					 6 changed files with 538 additions and 0 deletions
				
			
		
							
								
								
									
										42
									
								
								mach/arm/as/mach0.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								mach/arm/as/mach0.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | |||
| #define LISTING | ||||
| #define ASLD | ||||
| #define THREE_PASS | ||||
| 
 | ||||
| #undef valu_t | ||||
| #define valu_t 	long | ||||
| 
 | ||||
| #undef addr_t | ||||
| #define addr_t long | ||||
| 
 | ||||
| #undef word_t | ||||
| #define word_t	long | ||||
| 
 | ||||
| #undef ALIGNWORD | ||||
| #define ALIGNWORD	4 | ||||
| 
 | ||||
| #undef ALIGNSECT | ||||
| #define ALIGNSECT	4 | ||||
| 
 | ||||
| #undef VALWIDTH | ||||
| #define VALWIDTH	8 | ||||
| 
 | ||||
| #define S_REG		0xF | ||||
| #define S_NUM		0x8 | ||||
| 
 | ||||
| #define	ADC	0x00A00000 | ||||
| #define	ADD	0x00800000 | ||||
| #define	AND	0x00000000 | ||||
| #define	BIC	0x01C00000 | ||||
| #define	EOR	0x00200000 | ||||
| #define	ORR	0x01800000 | ||||
| #define	RSB	0x00600000 | ||||
| #define	RSC	0x00E00000 | ||||
| #define	SBC	0x00C00000 | ||||
| #define	SUB	0x00400000 | ||||
| #define	MOV	0x01A00000 | ||||
| #define	MVN	0x01E00000 | ||||
| #define	CMN	0x01700000 | ||||
| #define	CMP	0x01500000 | ||||
| #define	TEQ	0x01300000 | ||||
| #define	TST	0x01100000 | ||||
| 
 | ||||
							
								
								
									
										1
									
								
								mach/arm/as/mach1.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								mach/arm/as/mach1.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| extern word_t opcode; | ||||
							
								
								
									
										21
									
								
								mach/arm/as/mach2.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								mach/arm/as/mach2.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| %token <y_word> COND | ||||
| %token <y_word> LINK | ||||
| %token <y_word> BRANCH | ||||
| %token <y_word> DATA1 | ||||
| %token <y_word> DATA2 | ||||
| %token <y_word> DATA3 | ||||
| %token <y_word> SET | ||||
| %token <y_word> PEE | ||||
| %token <y_word> REG | ||||
| %token <y_word> SHIFT | ||||
| %token <y_word> RXX | ||||
| %token <y_word> SDT | ||||
| %token <y_word> BYTE | ||||
| %token <y_word> TRANS | ||||
| %token <y_word> BDT | ||||
| %token <y_word> SWI | ||||
| %token <y_word> ADR | ||||
| 
 | ||||
| %type <y_word> optlink optcond opts optt optp optb optexc reglist rlist | ||||
| %type <y_word> optsign optpsr optshift shftcnt address offset | ||||
| %type <y_expr> operand | ||||
							
								
								
									
										115
									
								
								mach/arm/as/mach3.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								mach/arm/as/mach3.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,115 @@ | |||
| 0,		COND,		0x00000000,	".EQ", | ||||
| 0,		COND,		0x10000000,	".NE", | ||||
| 0,		COND,		0x20000000,	".CS", | ||||
| 0,		COND,		0x20000000,	".HS", | ||||
| 0,		COND,		0x30000000,	".CC", | ||||
| 0,		COND,		0x30000000,	".LO", | ||||
| 0,		COND,		0x40000000,	".MI", | ||||
| 0,		COND,		0x50000000,	".PL", | ||||
| 0,		COND,		0x60000000,	".VS", | ||||
| 0,		COND,		0x70000000,	".VC", | ||||
| 0,		COND,		0x80000000,	".HI", | ||||
| 0,		COND,		0x90000000,	".LS", | ||||
| 0,		COND,		0xA0000000,	".GE", | ||||
| 0,		COND,		0xB0000000,	".LT", | ||||
| 0,		COND,		0xC0000000,	".GT", | ||||
| 0,		COND,		0xD0000000,	".LE", | ||||
| 0,		COND,		0xE0000000,	".AL", | ||||
| 0,		COND,		0xF0000000,	".NV", | ||||
| 
 | ||||
| 0,		LINK,		0x01000000,	".L", | ||||
| 
 | ||||
| 0,		BRANCH,		0x0A000000,	"BEQ", | ||||
| 0,		BRANCH,		0x1A000000,	"BNE", | ||||
| 0,		BRANCH,		0x2A000000,	"BCS", | ||||
| 0,		BRANCH,		0x2A000000,	"BHS", | ||||
| 0,		BRANCH,		0x3A000000,	"BCC", | ||||
| 0,		BRANCH,		0x3A000000,	"BLO", | ||||
| 0,		BRANCH,		0x4A000000,	"BMI", | ||||
| 0,		BRANCH,		0x5A000000,	"BPL", | ||||
| 0,		BRANCH,		0x6A000000,	"BVS", | ||||
| 0,		BRANCH,		0x7A000000,	"BVC", | ||||
| 0,		BRANCH,		0x8A000000,	"BHI", | ||||
| 0,		BRANCH,		0x9A000000,	"BLS", | ||||
| 0,		BRANCH,		0xAA000000,	"BGE", | ||||
| 0,		BRANCH,		0xBA000000,	"BLT", | ||||
| 0,		BRANCH,		0xCA000000,	"BGT", | ||||
| 0,		BRANCH,		0xDA000000,	"BLE", | ||||
| 0,		BRANCH,		0xEA000000,	"BAL", | ||||
| 0,		BRANCH,		0xFA000000,	"BNV", | ||||
| 
 | ||||
| 0,		DATA1,		ADC,	"ADC", | ||||
| 0,		DATA1,		ADD,	"ADD", | ||||
| 0,		DATA1,		AND,	"AND", | ||||
| 0,		DATA1,		BIC,	"BIC", | ||||
| 0,		DATA1,		EOR,	"EOR", | ||||
| 0,		DATA1,		ORR,	"ORR", | ||||
| 0,		DATA1,		RSB,	"RSB", | ||||
| 0,		DATA1,		RSC,	"RSC", | ||||
| 0,		DATA1,		SBC,	"SBC", | ||||
| 0,		DATA1,		SUB,	"SUB", | ||||
| 0,		DATA2,		MOV,	"MOV", | ||||
| 0,		DATA2,		MVN,	"MVN", | ||||
| 0,		DATA3,		CMN,	"CMN", | ||||
| 0,		DATA3,		CMP,	"CMP", | ||||
| 0,		DATA3,		TEQ,	"TEQ", | ||||
| 0,		DATA3,		TST,	"TST", | ||||
| 
 | ||||
| 0,		SET,		0x00100000,	".S", | ||||
| 
 | ||||
| 0,		PEE,		0x0010F000,	".P", | ||||
| 
 | ||||
| 0,		REG,		0,		"R0", | ||||
| 0,		REG,		1,		"R1", | ||||
| 0,		REG,		2,		"R2", | ||||
| 0,		REG,		3,		"R3", | ||||
| 0,		REG,		4,		"R4", | ||||
| 0,		REG,		5,		"R5", | ||||
| 0,		REG,		6,		"R6", | ||||
| 0,		REG,		7,		"R7", | ||||
| 0,		REG,		8,		"R8", | ||||
| 0,		REG,		9,		"R9", | ||||
| 0,		REG,		10,		"R10", | ||||
| 0,		REG,		11,		"R11", | ||||
| 0,		REG,		12,		"R12", | ||||
| 0,		REG,		13,		"R13", | ||||
| 0,		REG,		14,		"R14", | ||||
| 0,		REG,		15,		"R15", | ||||
| 
 | ||||
| 0,		SHIFT,		0x00000000,	"LSL", | ||||
| 0,		SHIFT,		0x00000000,	"ASL", | ||||
| 0,		SHIFT,		0x00000020,	"LSR", | ||||
| 0,		SHIFT,		0x00000040,	"ASR", | ||||
| 0,		SHIFT,		0x00000060,	"ROR", | ||||
| 
 | ||||
| 0,		RXX,		0x00000060,	"RXX", | ||||
| 
 | ||||
| 0,		SDT,		0x04100000,	"LDR", | ||||
| 0,		SDT,		0x04000000,	"STR", | ||||
| 
 | ||||
| 0,		BYTE,		0x00400000,	".B", | ||||
| 
 | ||||
| 0,		TRANS,		0x00200000,	".T", | ||||
| 
 | ||||
| 0,		BDT,		0x09100000,	"LDMDB", | ||||
| 0,		BDT,		0x08100000,	"LDMDA", | ||||
| 0,		BDT,		0x09900000,	"LDMIB", | ||||
| 0,		BDT,		0x08900000,	"LDMIA", | ||||
| 0,		BDT,		0x08100000,	"LDMFD", | ||||
| 0,		BDT,		0x08900000,	"LDMFA", | ||||
| 0,		BDT,		0x09100000,	"LDMED", | ||||
| 0,		BDT,		0x09900000,	"LDMEA", | ||||
| 0,		BDT,		0x09000000,	"STMDB", | ||||
| 0,		BDT,		0x08000000,	"STMDA", | ||||
| 0,		BDT,		0x09800000,	"STMIB", | ||||
| 0,		BDT,		0x08800000,	"STMIA", | ||||
| 0,		BDT,		0x09000000,	"STMFD", | ||||
| 0,		BDT,		0x09800000,	"STMFA", | ||||
| 0,		BDT,		0x08000000,	"STMED", | ||||
| 0,		BDT,		0x08800000,	"STMEA", | ||||
| 
 | ||||
| 0,		SWI,		0,		"SWI", | ||||
| 
 | ||||
| 0,		ADR,		0,		"ADR", | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										110
									
								
								mach/arm/as/mach4.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								mach/arm/as/mach4.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,110 @@ | |||
| operation	: BRANCH optlink expr | ||||
| 			{branch($1, $2, $3.val);} | ||||
| 		| DATA1 optcond opts optp REG ',' REG ',' operand | ||||
| 			{data($1,$2|$3|$4|$5<<12|$7<<16,$9.val,$9.typ);} | ||||
| 		| DATA2 optcond opts optp REG ',' operand | ||||
| 			{data($1,$2|$3|$4|$5<<12,$7.val,$7.typ);} | ||||
| 		| DATA3 optcond opts optp REG ',' operand | ||||
| 			{data($1,$2|$3|$4|$5<<16,$7.val,$7.typ);} | ||||
| 		| SDT optcond optb optt REG ',' address | ||||
| 			{emit4($1|$2|$3|$4|$5<<12|$7);} | ||||
| 		| BDT optcond REG optexc ',' reglist optpsr | ||||
| 			{emit4($1|$2|$3<<16|$4|$6|$7);} | ||||
| 		| SWI optcond expr | ||||
| 			{emit4($1|$2);} | ||||
| 		| ADR REG ',' expr | ||||
| 			{calcadr($2, $4.val, $4.typ);} | ||||
| 		; | ||||
| 
 | ||||
| optlink		: 	{$$=0;} | ||||
| 		| LINK | ||||
| 			{$$=$1;} | ||||
| 		; | ||||
| 
 | ||||
| optcond		: 	{$$=0xE0000000;} | ||||
| 		| COND | ||||
| 			{$$=$1;} | ||||
| 		; | ||||
| 
 | ||||
| opts		: 	{$$=0;} | ||||
| 		| SET | ||||
| 			{$$=$1;} | ||||
| 		; | ||||
| 
 | ||||
| optt		: 	{$$=0;} | ||||
| 		| TRANS | ||||
| 			{$$=$1;} | ||||
| 		; | ||||
| 
 | ||||
| optp		: 	{$$=0;} | ||||
| 		| PEE | ||||
| 			{$$=$1;} | ||||
| 		; | ||||
| 
 | ||||
| optb		: 	{$$=0;} | ||||
| 		| BYTE | ||||
| 			{$$=$1;} | ||||
| 		; | ||||
| 
 | ||||
| optexc		: 	{$$=0;} | ||||
| 		| '<' | ||||
| 			{$$=0x00200000;} | ||||
| 		; | ||||
| 
 | ||||
| optpsr		: 	{$$=0;} | ||||
| 		| '^' | ||||
| 			{$$=0x00400000;} | ||||
| 		; | ||||
| 
 | ||||
| operand		: REG optshift | ||||
| 			{$$.val = $1|$2; $$.typ = S_REG;} | ||||
| 		| '#'expr | ||||
| 			{$$ = $2;} | ||||
| 		; | ||||
| 
 | ||||
| optshift	: ',' SHIFT shftcnt | ||||
| 			{$$ = $2|$3;} | ||||
| 		| ',' RXX | ||||
| 			{$$ = $2;} | ||||
| 		| | ||||
| 			{$$ = 0;} | ||||
| 		; | ||||
| 
 | ||||
| shftcnt		: '#' expr | ||||
| 			{$$ = calcshft($2.val, $2.typ, $<y_word>0);} | ||||
| 		| REG | ||||
| 			{$$ = $1<<8|0x10;} | ||||
| 		; | ||||
| 
 | ||||
| address		: expr | ||||
| 			{$$ = 0x01000000|calcaddress($1.val,$1.typ,$<y_word>-1);} | ||||
| 		| '[' REG ']' | ||||
| 			{$$ = 0x01000000|$2<<16;} | ||||
| 		| '[' REG ',' offset ']' optexc | ||||
| 			{$$ = $2<<16|$4|$6|0x01000000;} | ||||
| 		| '[' REG ']' ',' offset | ||||
| 			{$$ = $2<<16|$5;} | ||||
| 		; | ||||
| 
 | ||||
| offset		: '#' expr | ||||
| 			{$$ = calcoffset($2.val);} | ||||
| 		| optsign REG optshift | ||||
| 			{$$ = 0x02000000|$1|$2|$3;} | ||||
| 		; | ||||
| 	 | ||||
| optsign		:	{$$ = 0x00800000;} | ||||
| 		| '+' | ||||
| 			{$$ = 0x00800000;} | ||||
| 		| '-'	 | ||||
| 			{$$ = 0x0;} | ||||
| 		; | ||||
| 
 | ||||
| reglist		: '{' rlist '}' | ||||
| 			{$$ = $2;} | ||||
| 		; | ||||
| 
 | ||||
| rlist		: REG | ||||
| 			{$$ = 1<<$1;} | ||||
| 		| rlist ',' REG | ||||
| 			{$$ = $1|1<<$3;} | ||||
| 		; | ||||
							
								
								
									
										249
									
								
								mach/arm/as/mach5.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								mach/arm/as/mach5.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,249 @@ | |||
| branch(brtyp, link, val) | ||||
| word_t brtyp; | ||||
| word_t link; | ||||
| valu_t val; | ||||
| { | ||||
| 	valu_t offset; | ||||
| 
 | ||||
| 	offset = val - DOTVAL - 8; | ||||
| 	if ((offset & 0xFC000000) != 0 && (offset & 0xFC000000) != 0xFC000000){ | ||||
| 		serror("offset out of range"); | ||||
| 	} | ||||
| 	offset = offset>>2 & 0xFFFFFF;  | ||||
| 	emit4(brtyp|link|offset); | ||||
| 	return; | ||||
| } | ||||
| 
 | ||||
| data(opc, ins, val, typ) | ||||
| word_t opc, ins; | ||||
| valu_t val; | ||||
| short typ; | ||||
| { | ||||
| 	valu_t tmpval; | ||||
| 
 | ||||
| 	if (typ == S_REG){ | ||||
| 		emit4(opc|ins|val); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	ins |= 0x02000000; | ||||
| 
 | ||||
| 	tmpval = val; | ||||
| 	if (typ == S_ABS){ | ||||
| 		if (calcimm(&opc, &tmpval, typ)){ | ||||
| 			emit4(opc|ins|tmpval); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	tmpval = val; | ||||
| 	if (small(calcimm(&opc, &tmpval, typ),12)){ | ||||
| 		emit4(opc|ins|tmpval); | ||||
| 		return; | ||||
| 	}	 | ||||
| 
 | ||||
| 	switch (opc){ | ||||
| 	case MOV: | ||||
| 		if (small((val & 0xF0000000) == 0xF0000000, 8)){ | ||||
| 			emit4(0xE51F0004 | (ins & 0xF000)); | ||||
| 			emit4(val); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (small(1,4)){ | ||||
| 			emit4(0xE51F0000 | (ins & 0xF000)); | ||||
| 			emit4(0xEA000000); | ||||
| 			emit4(val); | ||||
| 			return; | ||||
| 		} | ||||
| 		DOTVAL += 16; | ||||
| 		return; | ||||
| 	case ADD: | ||||
| 		if (small((val & 0xF0000000) == 0xF0000000, 4)){ | ||||
| 			emit4(0xE51F0004 | (ins & 0xF000)); | ||||
| 			emit4(val); | ||||
| 			emit4(0xE2800000 | (ins&0xFF000) | (ins&0xF000)>>12); | ||||
| 			return; | ||||
| 		} | ||||
| 		emit4(0xE51F0000 | (ins & 0xF000)); | ||||
| 		emit4(0xEA000000); | ||||
| 		emit4(val); | ||||
| 		emit4(0xE2800000 | (ins&0xFF000) | (ins&0xF000)>>12); | ||||
| 		return; | ||||
| 	default: | ||||
| 		if (pass == PASS_1) | ||||
| 			DOTVAL += 16; | ||||
| 		else | ||||
| 			serror("immediate value out of range"); | ||||
| 		return; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| calcimm(opc,val,typ) | ||||
| word_t *opc; | ||||
| valu_t *val; | ||||
| short typ; | ||||
| { | ||||
| 	int i = 0; | ||||
| 
 | ||||
| 	if (typ == S_UND) return 0; | ||||
| 
 | ||||
| 	if ((*val & ~0xFF) == 0) return 1; | ||||
| 
 | ||||
| 	if ((~*val & ~0xFF) == 0){ | ||||
| 		switch (*opc){ | ||||
| 		case AND: | ||||
| 			*val = ~*val; | ||||
| 			*opc = BIC; | ||||
| 			return 1; | ||||
| 		case MOV: | ||||
| 			*val = ~*val; | ||||
| 			*opc = MVN; | ||||
| 			return 1; | ||||
| 		case ADC: | ||||
| 			*val = ~*val; | ||||
| 			*opc = SBC; | ||||
| 			return 1; | ||||
| 		default :  | ||||
| 			break; | ||||
| 		} | ||||
| 	}	 | ||||
| 	if ((-1**val & ~0xFF) == 0 ){ | ||||
| 		switch (*opc){ | ||||
| 		case ADD: | ||||
| 			*val *= -1; | ||||
| 			*opc = SUB; | ||||
| 			return 1; | ||||
| 		case CMP: | ||||
| 			*val *= -1; | ||||
| 			*opc = CMN; | ||||
| 			return 1; | ||||
| 		default: | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	do{ | ||||
| 		rotateleft2(&*val); | ||||
| 		i++; | ||||
| 		if((*val & ~0xFF) == 0){ | ||||
| 			*val = *val|i<<8; | ||||
| 			return 1; | ||||
| 		} | ||||
| 		if ((~*val & ~0xFF) == 0){ | ||||
| 			switch (*opc){ | ||||
| 			case AND: | ||||
| 				*val = ~*val|i<<8; | ||||
| 				*opc = BIC; | ||||
| 				return 1; | ||||
| 			case MOV: | ||||
| 				*val = ~*val|i<<8; | ||||
| 				*opc = MVN; | ||||
| 				return 1; | ||||
| 			case ADC: | ||||
| 				*val = ~*val|i<<8; | ||||
| 				*opc = SBC; | ||||
| 				return 1; | ||||
| 			default :  | ||||
| 				break; | ||||
| 			} | ||||
| 		}	 | ||||
| 	}while(i<15); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| word_t | ||||
| calcoffset(val) | ||||
| valu_t val; | ||||
| { | ||||
| 	if((val & ~0xFFF) == 0) | ||||
| 		return(val|0x00800000); | ||||
| 	val *= -1; | ||||
| 	if((val & ~0xFFF) == 0) | ||||
| 		return(val); | ||||
| 	serror("offset out of range"); | ||||
| 	return(0); | ||||
| } | ||||
| 
 | ||||
| word_t | ||||
| calcaddress(val,typ,reg) | ||||
| valu_t val; | ||||
| short typ; | ||||
| word_t reg; | ||||
| { | ||||
| 	int tmpval; | ||||
| 
 | ||||
| 	if (typ == S_UND){ | ||||
| 		DOTVAL += 8; | ||||
| 		return 0; | ||||
| 	} | ||||
| 	tmpval = val - DOTVAL - 8; | ||||
| 	if(small((tmpval & ~0xFFF) == 0, 8)) | ||||
| 		return(val|0x008F0000); | ||||
| 	tmpval *= -1; | ||||
| 	if(small((tmpval & ~0xFFF) == 0, 8)) | ||||
| 		return(val|0x000F0000); | ||||
| 	emit4(0xE51F0004 | reg << 12); | ||||
| 	emit4(val | 0xF0000000); | ||||
| 	return(reg << 16); | ||||
| } | ||||
| 
 | ||||
| word_t | ||||
| calcadr(reg, val, typ) | ||||
| word_t reg; | ||||
| valu_t val; | ||||
| short typ; | ||||
| { | ||||
| 	valu_t tmpval = val; | ||||
| 	int i = 0; | ||||
| 
 | ||||
| 	if ((val & 0xFC000000) && (typ != S_UND)){ | ||||
| 		serror("address out of range"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if (typ != S_ABS){ | ||||
| 		tmpval = val-DOTVAL-8; | ||||
| 		if (small((tmpval & ~0xFF) == 0),12){ | ||||
| 			emit4(0xE2000000|ADD|0xF<<16|reg<<12|tmpval); | ||||
| 			return 0; | ||||
| 		} | ||||
| 	 | ||||
| 		tmpval *= -1; | ||||
| 		if (small((tmpval & ~0xFF) == 0), 12){ | ||||
| 			emit4(0xE2000000|SUB|0xF<<16|reg<<12|tmpval); | ||||
| 			return 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	data(MOV, 0xE2000000||reg<<12, val, typ); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| word_t | ||||
| calcshft(val, typ, styp) | ||||
| valu_t val; | ||||
| short typ; | ||||
| word_t styp; | ||||
| { | ||||
| 	if (typ=S_UND) return 0; | ||||
| 	if (val & ~0x1F) serror("shiftcount out of range"); | ||||
| 	if (styp && !val) warning("shiftcount 0"); | ||||
| 	return((val & 0x1F)<<7); | ||||
| } | ||||
| 
 | ||||
| rotateleft2(x) | ||||
| long *x; | ||||
| { | ||||
| 	unsigned long bits; | ||||
| 
 | ||||
| 	bits = *x & 0xC0000000; | ||||
| 	*x <<= 2 ; | ||||
| 	if (bits){ | ||||
| 		bits >>= 30; | ||||
| 		*x |= bits; | ||||
| 	} | ||||
| 	return; | ||||
| } | ||||
		Loading…
	
	Add table
		
		Reference in a new issue