Remove la; turns out that the assembler gets upset if you ask it to
generate more than one fixup per instruction (I think).
This commit is contained in:
		
							parent
							
								
									ac33bdd031
								
							
						
					
					
						commit
						ba0849c87c
					
				
					 5 changed files with 9 additions and 18 deletions
				
			
		| 
						 | 
					@ -3,7 +3,6 @@
 | 
				
			||||||
%token <y_word> FCOND
 | 
					%token <y_word> FCOND
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%token <y_word> OP_LI
 | 
					%token <y_word> OP_LI
 | 
				
			||||||
%token <y_word> OP_LA
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
%token <y_word> HI16
 | 
					%token <y_word> HI16
 | 
				
			||||||
%token <y_word> HA16
 | 
					%token <y_word> HA16
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,7 +75,6 @@
 | 
				
			||||||
0,     FPR,        31,         "f31",
 | 
					0,     FPR,        31,         "f31",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
0,     OP_LI,      0,          "li",
 | 
					0,     OP_LI,      0,          "li",
 | 
				
			||||||
0,     OP_LA,      0,          "la",
 | 
					 | 
				
			||||||
0,     HI16,       0,         "hi16",
 | 
					0,     HI16,       0,         "hi16",
 | 
				
			||||||
0,     HA16,       0,         "ha16",
 | 
					0,     HA16,       0,         "ha16",
 | 
				
			||||||
0,     LO16,       0,         "lo16",
 | 
					0,     LO16,       0,         "lo16",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,19 +14,6 @@
 | 
				
			||||||
			emit4(0x34000000 | (reg<<16) | (reg<<21) | (val & 0xffff)); /* ori reg, reg, value */
 | 
								emit4(0x34000000 | (reg<<16) | (reg<<21) | (val & 0xffff)); /* ori reg, reg, value */
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	| OP_LA GPR ',' expr
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		word_t reg = $2;
 | 
					 | 
				
			||||||
		word_t type = $4.typ & S_TYP;
 | 
					 | 
				
			||||||
		uint32_t val = $4.val;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (type != S_ABS)
 | 
					 | 
				
			||||||
			newrelo($4.typ, RELO2HI | FIXUPFLAGS);
 | 
					 | 
				
			||||||
		emit4(0x3c000000 | (reg<<16) | (val>>16)); /* lui reg, value */
 | 
					 | 
				
			||||||
		if (type != S_ABS)
 | 
					 | 
				
			||||||
			newrelo($4.typ, RELO2 | FIXUPFLAGS);
 | 
					 | 
				
			||||||
		emit4(0x34000000 | (reg<<16) | (reg<<21) | (val & 0xffff)); /* ori reg, reg, value */
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extabsexp
 | 
					extabsexp
 | 
				
			||||||
	: absexp
 | 
						: absexp
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -635,11 +635,13 @@ PATTERNS
 | 
				
			||||||
    ALUCC(EOR.I, "xori")
 | 
					    ALUCC(EOR.I, "xori")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	out:(int)reg = value:LABEL.I
 | 
						out:(int)reg = value:LABEL.I
 | 
				
			||||||
		emit "la %out, $value"
 | 
							emit "lui %out, hi16[$value]"
 | 
				
			||||||
 | 
					        emit "ori %out, %out, lo16[$value]"
 | 
				
			||||||
		cost 4;
 | 
							cost 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	out:(int)reg = value:BLOCK.I
 | 
						out:(int)reg = value:BLOCK.I
 | 
				
			||||||
		emit "la %out, $value"
 | 
							emit "lui %out, hi16[$value]"
 | 
				
			||||||
 | 
					        emit "ori %out, %out, lo16[$value]"
 | 
				
			||||||
		cost 4;
 | 
							cost 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	out:(int)reg = value:CONST.I
 | 
						out:(int)reg = value:CONST.I
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -556,11 +556,14 @@ long off;
 | 
				
			||||||
	long valu;
 | 
						long valu;
 | 
				
			||||||
	int sectindex = relo->or_sect - S_MIN;
 | 
						int sectindex = relo->or_sect - S_MIN;
 | 
				
			||||||
	extern struct outhead outhead;
 | 
						extern struct outhead outhead;
 | 
				
			||||||
 | 
						uint32_t realaddress = outsect[sectindex].os_base + relo->or_addr
 | 
				
			||||||
 | 
							+ relorig[sectindex].org_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Pick up previous value at location to be relocated.
 | 
						 * Pick up previous value at location to be relocated.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	valu = getvalu(emit + (relo->or_addr - off), relo->or_type);
 | 
						valu = getvalu(emit + (relo->or_addr - off), relo->or_type);
 | 
				
			||||||
 | 
						debug("read relocation from 0x%08x type 0x%x value 0x%08x symbol %d\n", realaddress, relo->or_type, valu, relo->or_nami);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Or_nami is an index in the name table of the considered module.
 | 
						 * Or_nami is an index in the name table of the considered module.
 | 
				
			||||||
| 
						 | 
					@ -595,6 +598,7 @@ long off;
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Now put the value back.
 | 
						 * Now put the value back.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
						debug("written fixed up relocation to 0x%08x type 0x%x value 0x%08x\n", realaddress, relo->or_type, valu, 0);
 | 
				
			||||||
	putvalu(valu, emit + (relo->or_addr - off), relo->or_type);
 | 
						putvalu(valu, emit + (relo->or_addr - off), relo->or_type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue