mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 16:50:58 +00:00 
			
		
		
		
	cmd/compile: slightly optimize adding 128
'SUBQ $-0x80, r' is shorter to encode than 'ADDQ $0x80, r', and functionally equivalent. Use it instead. Shaves off a few bytes here and there: file before after Δ % compile 25935856 25927664 -8192 -0.032% nm 4251840 4247744 -4096 -0.096% Change-Id: Ia9e02ea38cbded6a52a613b92e3a914f878d931e Reviewed-on: https://go-review.googlesource.com/c/go/+/168344 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
		
							parent
							
								
									fc1e6915dc
								
							
						
					
					
						commit
						250b96a7bf
					
				
					 2 changed files with 27 additions and 3 deletions
				
			
		|  | @ -414,7 +414,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { | ||||||
| 		r := v.Reg() | 		r := v.Reg() | ||||||
| 		a := v.Args[0].Reg() | 		a := v.Args[0].Reg() | ||||||
| 		if r == a { | 		if r == a { | ||||||
| 			if v.AuxInt == 1 { | 			switch v.AuxInt { | ||||||
|  | 			case 1: | ||||||
| 				var asm obj.As | 				var asm obj.As | ||||||
| 				// Software optimization manual recommends add $1,reg. | 				// Software optimization manual recommends add $1,reg. | ||||||
| 				// But inc/dec is 1 byte smaller. ICC always uses inc | 				// But inc/dec is 1 byte smaller. ICC always uses inc | ||||||
|  | @ -430,8 +431,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { | ||||||
| 				p.To.Type = obj.TYPE_REG | 				p.To.Type = obj.TYPE_REG | ||||||
| 				p.To.Reg = r | 				p.To.Reg = r | ||||||
| 				return | 				return | ||||||
| 			} | 			case -1: | ||||||
| 			if v.AuxInt == -1 { |  | ||||||
| 				var asm obj.As | 				var asm obj.As | ||||||
| 				if v.Op == ssa.OpAMD64ADDQconst { | 				if v.Op == ssa.OpAMD64ADDQconst { | ||||||
| 					asm = x86.ADECQ | 					asm = x86.ADECQ | ||||||
|  | @ -442,6 +442,20 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { | ||||||
| 				p.To.Type = obj.TYPE_REG | 				p.To.Type = obj.TYPE_REG | ||||||
| 				p.To.Reg = r | 				p.To.Reg = r | ||||||
| 				return | 				return | ||||||
|  | 			case 0x80: | ||||||
|  | 				// 'SUBQ $-0x80, r' is shorter to encode than | ||||||
|  | 				// and functionally equivalent to 'ADDQ $0x80, r'. | ||||||
|  | 				asm := x86.ASUBL | ||||||
|  | 				if v.Op == ssa.OpAMD64ADDQconst { | ||||||
|  | 					asm = x86.ASUBQ | ||||||
|  | 				} | ||||||
|  | 				p := s.Prog(asm) | ||||||
|  | 				p.From.Type = obj.TYPE_CONST | ||||||
|  | 				p.From.Offset = -0x80 | ||||||
|  | 				p.To.Type = obj.TYPE_REG | ||||||
|  | 				p.To.Reg = r | ||||||
|  | 				return | ||||||
|  | 
 | ||||||
| 			} | 			} | ||||||
| 			p := s.Prog(v.Op.Asm()) | 			p := s.Prog(v.Op.Asm()) | ||||||
| 			p.From.Type = obj.TYPE_CONST | 			p.From.Type = obj.TYPE_CONST | ||||||
|  |  | ||||||
|  | @ -381,3 +381,13 @@ func MULS(a, b, c uint32) (uint32, uint32, uint32) { | ||||||
| 	r2 := c - b*64 | 	r2 := c - b*64 | ||||||
| 	return r0, r1, r2 | 	return r0, r1, r2 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func addSpecial(a, b, c uint32) (uint32, uint32, uint32) { | ||||||
|  | 	// amd64:`INCL` | ||||||
|  | 	a++ | ||||||
|  | 	// amd64:`DECL` | ||||||
|  | 	b-- | ||||||
|  | 	// amd64:`SUBL.*-128` | ||||||
|  | 	c += 128 | ||||||
|  | 	return a, b, c | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Josh Bleecher Snyder
						Josh Bleecher Snyder