github.com/megatontech/mynoteforgo@v0.0.0-20200507084910-5d0c6ea6e890/源码/cmd/compile/internal/ssa/gen/decArgs.rules (about)

     1  // Copyright 2018 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Decompose compound argument values
     6  // Do this early to simplify tracking names for debugging.
     7  
     8  (Arg {n} [off]) && v.Type.IsString() ->
     9    (StringMake
    10      (Arg <typ.BytePtr> {n} [off])
    11      (Arg <typ.Int> {n} [off+config.PtrSize]))
    12  
    13  (Arg {n} [off]) && v.Type.IsSlice() ->
    14    (SliceMake
    15      (Arg <v.Type.Elem().PtrTo()> {n} [off])
    16      (Arg <typ.Int> {n} [off+config.PtrSize])
    17      (Arg <typ.Int> {n} [off+2*config.PtrSize]))
    18  
    19  (Arg {n} [off]) && v.Type.IsInterface() ->
    20    (IMake
    21      (Arg <typ.Uintptr> {n} [off])
    22      (Arg <typ.BytePtr> {n} [off+config.PtrSize]))
    23  
    24  (Arg {n} [off]) && v.Type.IsComplex() && v.Type.Size() == 16 ->
    25    (ComplexMake
    26      (Arg <typ.Float64> {n} [off])
    27      (Arg <typ.Float64> {n} [off+8]))
    28  
    29  (Arg {n} [off]) && v.Type.IsComplex() && v.Type.Size() == 8 ->
    30    (ComplexMake
    31      (Arg <typ.Float32> {n} [off])
    32      (Arg <typ.Float32> {n} [off+4]))
    33  
    34  (Arg <t>) && t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) ->
    35    (StructMake0)
    36  (Arg <t> {n} [off]) && t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) ->
    37    (StructMake1
    38      (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]))
    39  (Arg <t> {n} [off]) && t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) ->
    40    (StructMake2
    41      (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])
    42      (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]))
    43  (Arg <t> {n} [off]) && t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) ->
    44    (StructMake3
    45      (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])
    46      (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])
    47      (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)]))
    48  (Arg <t> {n} [off]) && t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) ->
    49    (StructMake4
    50      (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])
    51      (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])
    52      (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)])
    53      (Arg <t.FieldType(3)> {n} [off+t.FieldOff(3)]))
    54  
    55  (Arg <t>) && t.IsArray() && t.NumElem() == 0 ->
    56    (ArrayMake0)
    57  (Arg <t> {n} [off]) && t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) ->
    58    (ArrayMake1 (Arg <t.Elem()> {n} [off]))