@@ -524,6 +524,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
524
524
case ssa .OpAMD64LEAQ1 , ssa .OpAMD64LEAQ2 , ssa .OpAMD64LEAQ4 , ssa .OpAMD64LEAQ8 ,
525
525
ssa .OpAMD64LEAL1 , ssa .OpAMD64LEAL2 , ssa .OpAMD64LEAL4 , ssa .OpAMD64LEAL8 ,
526
526
ssa .OpAMD64LEAW1 , ssa .OpAMD64LEAW2 , ssa .OpAMD64LEAW4 , ssa .OpAMD64LEAW8 :
527
+ o := v .Reg ()
527
528
r := v .Args [0 ].Reg ()
528
529
i := v .Args [1 ].Reg ()
529
530
p := s .Prog (v .Op .Asm ())
@@ -543,9 +544,24 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
543
544
p .From .Type = obj .TYPE_MEM
544
545
p .From .Reg = r
545
546
p .From .Index = i
546
- gc .AddAux (& p .From , v )
547
547
p .To .Type = obj .TYPE_REG
548
- p .To .Reg = v .Reg ()
548
+ p .To .Reg = o
549
+ if v .AuxInt != 0 && v .Aux == nil {
550
+ // Emit an additional LEA to add the displacement instead of creating a slow 3 operand LEA.
551
+ switch v .Op {
552
+ case ssa .OpAMD64LEAQ1 , ssa .OpAMD64LEAQ2 , ssa .OpAMD64LEAQ4 , ssa .OpAMD64LEAQ8 :
553
+ p = s .Prog (x86 .ALEAQ )
554
+ case ssa .OpAMD64LEAL1 , ssa .OpAMD64LEAL2 , ssa .OpAMD64LEAL4 , ssa .OpAMD64LEAL8 :
555
+ p = s .Prog (x86 .ALEAL )
556
+ case ssa .OpAMD64LEAW1 , ssa .OpAMD64LEAW2 , ssa .OpAMD64LEAW4 , ssa .OpAMD64LEAW8 :
557
+ p = s .Prog (x86 .ALEAW )
558
+ }
559
+ p .From .Type = obj .TYPE_MEM
560
+ p .From .Reg = o
561
+ p .To .Type = obj .TYPE_REG
562
+ p .To .Reg = o
563
+ }
564
+ gc .AddAux (& p .From , v )
549
565
case ssa .OpAMD64LEAQ , ssa .OpAMD64LEAL , ssa .OpAMD64LEAW :
550
566
p := s .Prog (v .Op .Asm ())
551
567
p .From .Type = obj .TYPE_MEM
0 commit comments