diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index 144a1f51f8fef6dae32eb2f2c6d2fbb9884ae9d5..a2c7d5d8d8561ed07d1a6f12145b461151f25854 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -762,12 +762,20 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { sc := v.AuxValAndOff() off := sc.Off() val := sc.Val() - if val == 1 { + if val == 1 || val == -1 { var asm obj.As if v.Op == ssa.OpAMD64ADDQconstmodify { - asm = x86.AINCQ + if val == 1 { + asm = x86.AINCQ + } else { + asm = x86.ADECQ + } } else { - asm = x86.AINCL + if val == 1 { + asm = x86.AINCL + } else { + asm = x86.ADECL + } } p := s.Prog(asm) p.To.Type = obj.TYPE_MEM diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index c65fb0144ac16607d00fd723318cf0febe77a4cc..ae80e31df46d7ab8d7a60f83f2f94936f25b4a6d 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -34,6 +34,8 @@ func SubMem(arr []int, b, c, d int) int { arr[d] -= 15 // 386:`DECL\s\([A-Z]+\)\([A-Z]+\*4\)` arr[b]-- + // amd64:`DECQ\s64\([A-Z]+\)` + arr[8]-- // 386:"SUBL\t4" // amd64:"SUBQ\t8" return arr[0] - arr[1]