github.com/ltltlt/go-source-code@v0.0.0-20190830023027-95be009773aa/cmd/compile/internal/ssa/rewritedec.go (about)

     1  // Code generated from gen/dec.rules; DO NOT EDIT.
     2  // generated with: cd gen; go run *.go
     3  
     4  package ssa
     5  
     6  import "math"
     7  import "cmd/internal/obj"
     8  import "cmd/internal/objabi"
     9  import "cmd/compile/internal/types"
    10  
    11  var _ = math.MinInt8  // in case not otherwise used
    12  var _ = obj.ANOP      // in case not otherwise used
    13  var _ = objabi.GOROOT // in case not otherwise used
    14  var _ = types.TypeMem // in case not otherwise used
    15  
    16  func rewriteValuedec(v *Value) bool {
    17  	switch v.Op {
    18  	case OpComplexImag:
    19  		return rewriteValuedec_OpComplexImag_0(v)
    20  	case OpComplexReal:
    21  		return rewriteValuedec_OpComplexReal_0(v)
    22  	case OpIData:
    23  		return rewriteValuedec_OpIData_0(v)
    24  	case OpITab:
    25  		return rewriteValuedec_OpITab_0(v)
    26  	case OpLoad:
    27  		return rewriteValuedec_OpLoad_0(v)
    28  	case OpSliceCap:
    29  		return rewriteValuedec_OpSliceCap_0(v)
    30  	case OpSliceLen:
    31  		return rewriteValuedec_OpSliceLen_0(v)
    32  	case OpSlicePtr:
    33  		return rewriteValuedec_OpSlicePtr_0(v)
    34  	case OpStore:
    35  		return rewriteValuedec_OpStore_0(v)
    36  	case OpStringLen:
    37  		return rewriteValuedec_OpStringLen_0(v)
    38  	case OpStringPtr:
    39  		return rewriteValuedec_OpStringPtr_0(v)
    40  	}
    41  	return false
    42  }
    43  func rewriteValuedec_OpComplexImag_0(v *Value) bool {
    44  	// match: (ComplexImag (ComplexMake _ imag))
    45  	// cond:
    46  	// result: imag
    47  	for {
    48  		v_0 := v.Args[0]
    49  		if v_0.Op != OpComplexMake {
    50  			break
    51  		}
    52  		_ = v_0.Args[1]
    53  		imag := v_0.Args[1]
    54  		v.reset(OpCopy)
    55  		v.Type = imag.Type
    56  		v.AddArg(imag)
    57  		return true
    58  	}
    59  	return false
    60  }
    61  func rewriteValuedec_OpComplexReal_0(v *Value) bool {
    62  	// match: (ComplexReal (ComplexMake real _))
    63  	// cond:
    64  	// result: real
    65  	for {
    66  		v_0 := v.Args[0]
    67  		if v_0.Op != OpComplexMake {
    68  			break
    69  		}
    70  		_ = v_0.Args[1]
    71  		real := v_0.Args[0]
    72  		v.reset(OpCopy)
    73  		v.Type = real.Type
    74  		v.AddArg(real)
    75  		return true
    76  	}
    77  	return false
    78  }
    79  func rewriteValuedec_OpIData_0(v *Value) bool {
    80  	// match: (IData (IMake _ data))
    81  	// cond:
    82  	// result: data
    83  	for {
    84  		v_0 := v.Args[0]
    85  		if v_0.Op != OpIMake {
    86  			break
    87  		}
    88  		_ = v_0.Args[1]
    89  		data := v_0.Args[1]
    90  		v.reset(OpCopy)
    91  		v.Type = data.Type
    92  		v.AddArg(data)
    93  		return true
    94  	}
    95  	return false
    96  }
    97  func rewriteValuedec_OpITab_0(v *Value) bool {
    98  	b := v.Block
    99  	_ = b
   100  	// match: (ITab (IMake itab _))
   101  	// cond:
   102  	// result: itab
   103  	for {
   104  		v_0 := v.Args[0]
   105  		if v_0.Op != OpIMake {
   106  			break
   107  		}
   108  		_ = v_0.Args[1]
   109  		itab := v_0.Args[0]
   110  		v.reset(OpCopy)
   111  		v.Type = itab.Type
   112  		v.AddArg(itab)
   113  		return true
   114  	}
   115  	return false
   116  }
   117  func rewriteValuedec_OpLoad_0(v *Value) bool {
   118  	b := v.Block
   119  	_ = b
   120  	config := b.Func.Config
   121  	_ = config
   122  	typ := &b.Func.Config.Types
   123  	_ = typ
   124  	// match: (Load <t> ptr mem)
   125  	// cond: t.IsComplex() && t.Size() == 8
   126  	// result: (ComplexMake     (Load <typ.Float32> ptr mem)     (Load <typ.Float32>       (OffPtr <typ.Float32Ptr> [4] ptr)       mem)     )
   127  	for {
   128  		t := v.Type
   129  		_ = v.Args[1]
   130  		ptr := v.Args[0]
   131  		mem := v.Args[1]
   132  		if !(t.IsComplex() && t.Size() == 8) {
   133  			break
   134  		}
   135  		v.reset(OpComplexMake)
   136  		v0 := b.NewValue0(v.Pos, OpLoad, typ.Float32)
   137  		v0.AddArg(ptr)
   138  		v0.AddArg(mem)
   139  		v.AddArg(v0)
   140  		v1 := b.NewValue0(v.Pos, OpLoad, typ.Float32)
   141  		v2 := b.NewValue0(v.Pos, OpOffPtr, typ.Float32Ptr)
   142  		v2.AuxInt = 4
   143  		v2.AddArg(ptr)
   144  		v1.AddArg(v2)
   145  		v1.AddArg(mem)
   146  		v.AddArg(v1)
   147  		return true
   148  	}
   149  	// match: (Load <t> ptr mem)
   150  	// cond: t.IsComplex() && t.Size() == 16
   151  	// result: (ComplexMake     (Load <typ.Float64> ptr mem)     (Load <typ.Float64>       (OffPtr <typ.Float64Ptr> [8] ptr)       mem)     )
   152  	for {
   153  		t := v.Type
   154  		_ = v.Args[1]
   155  		ptr := v.Args[0]
   156  		mem := v.Args[1]
   157  		if !(t.IsComplex() && t.Size() == 16) {
   158  			break
   159  		}
   160  		v.reset(OpComplexMake)
   161  		v0 := b.NewValue0(v.Pos, OpLoad, typ.Float64)
   162  		v0.AddArg(ptr)
   163  		v0.AddArg(mem)
   164  		v.AddArg(v0)
   165  		v1 := b.NewValue0(v.Pos, OpLoad, typ.Float64)
   166  		v2 := b.NewValue0(v.Pos, OpOffPtr, typ.Float64Ptr)
   167  		v2.AuxInt = 8
   168  		v2.AddArg(ptr)
   169  		v1.AddArg(v2)
   170  		v1.AddArg(mem)
   171  		v.AddArg(v1)
   172  		return true
   173  	}
   174  	// match: (Load <t> ptr mem)
   175  	// cond: t.IsString()
   176  	// result: (StringMake     (Load <typ.BytePtr> ptr mem)     (Load <typ.Int>       (OffPtr <typ.IntPtr> [config.PtrSize] ptr)       mem))
   177  	for {
   178  		t := v.Type
   179  		_ = v.Args[1]
   180  		ptr := v.Args[0]
   181  		mem := v.Args[1]
   182  		if !(t.IsString()) {
   183  			break
   184  		}
   185  		v.reset(OpStringMake)
   186  		v0 := b.NewValue0(v.Pos, OpLoad, typ.BytePtr)
   187  		v0.AddArg(ptr)
   188  		v0.AddArg(mem)
   189  		v.AddArg(v0)
   190  		v1 := b.NewValue0(v.Pos, OpLoad, typ.Int)
   191  		v2 := b.NewValue0(v.Pos, OpOffPtr, typ.IntPtr)
   192  		v2.AuxInt = config.PtrSize
   193  		v2.AddArg(ptr)
   194  		v1.AddArg(v2)
   195  		v1.AddArg(mem)
   196  		v.AddArg(v1)
   197  		return true
   198  	}
   199  	// match: (Load <t> ptr mem)
   200  	// cond: t.IsSlice()
   201  	// result: (SliceMake     (Load <t.ElemType().PtrTo()> ptr mem)     (Load <typ.Int>       (OffPtr <typ.IntPtr> [config.PtrSize] ptr)       mem)     (Load <typ.Int>       (OffPtr <typ.IntPtr> [2*config.PtrSize] ptr)       mem))
   202  	for {
   203  		t := v.Type
   204  		_ = v.Args[1]
   205  		ptr := v.Args[0]
   206  		mem := v.Args[1]
   207  		if !(t.IsSlice()) {
   208  			break
   209  		}
   210  		v.reset(OpSliceMake)
   211  		v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType().PtrTo())
   212  		v0.AddArg(ptr)
   213  		v0.AddArg(mem)
   214  		v.AddArg(v0)
   215  		v1 := b.NewValue0(v.Pos, OpLoad, typ.Int)
   216  		v2 := b.NewValue0(v.Pos, OpOffPtr, typ.IntPtr)
   217  		v2.AuxInt = config.PtrSize
   218  		v2.AddArg(ptr)
   219  		v1.AddArg(v2)
   220  		v1.AddArg(mem)
   221  		v.AddArg(v1)
   222  		v3 := b.NewValue0(v.Pos, OpLoad, typ.Int)
   223  		v4 := b.NewValue0(v.Pos, OpOffPtr, typ.IntPtr)
   224  		v4.AuxInt = 2 * config.PtrSize
   225  		v4.AddArg(ptr)
   226  		v3.AddArg(v4)
   227  		v3.AddArg(mem)
   228  		v.AddArg(v3)
   229  		return true
   230  	}
   231  	// match: (Load <t> ptr mem)
   232  	// cond: t.IsInterface()
   233  	// result: (IMake     (Load <typ.BytePtr> ptr mem)     (Load <typ.BytePtr>       (OffPtr <typ.BytePtrPtr> [config.PtrSize] ptr)       mem))
   234  	for {
   235  		t := v.Type
   236  		_ = v.Args[1]
   237  		ptr := v.Args[0]
   238  		mem := v.Args[1]
   239  		if !(t.IsInterface()) {
   240  			break
   241  		}
   242  		v.reset(OpIMake)
   243  		v0 := b.NewValue0(v.Pos, OpLoad, typ.BytePtr)
   244  		v0.AddArg(ptr)
   245  		v0.AddArg(mem)
   246  		v.AddArg(v0)
   247  		v1 := b.NewValue0(v.Pos, OpLoad, typ.BytePtr)
   248  		v2 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtrPtr)
   249  		v2.AuxInt = config.PtrSize
   250  		v2.AddArg(ptr)
   251  		v1.AddArg(v2)
   252  		v1.AddArg(mem)
   253  		v.AddArg(v1)
   254  		return true
   255  	}
   256  	return false
   257  }
   258  func rewriteValuedec_OpSliceCap_0(v *Value) bool {
   259  	// match: (SliceCap (SliceMake _ _ cap))
   260  	// cond:
   261  	// result: cap
   262  	for {
   263  		v_0 := v.Args[0]
   264  		if v_0.Op != OpSliceMake {
   265  			break
   266  		}
   267  		_ = v_0.Args[2]
   268  		cap := v_0.Args[2]
   269  		v.reset(OpCopy)
   270  		v.Type = cap.Type
   271  		v.AddArg(cap)
   272  		return true
   273  	}
   274  	return false
   275  }
   276  func rewriteValuedec_OpSliceLen_0(v *Value) bool {
   277  	// match: (SliceLen (SliceMake _ len _))
   278  	// cond:
   279  	// result: len
   280  	for {
   281  		v_0 := v.Args[0]
   282  		if v_0.Op != OpSliceMake {
   283  			break
   284  		}
   285  		_ = v_0.Args[2]
   286  		len := v_0.Args[1]
   287  		v.reset(OpCopy)
   288  		v.Type = len.Type
   289  		v.AddArg(len)
   290  		return true
   291  	}
   292  	return false
   293  }
   294  func rewriteValuedec_OpSlicePtr_0(v *Value) bool {
   295  	// match: (SlicePtr (SliceMake ptr _ _))
   296  	// cond:
   297  	// result: ptr
   298  	for {
   299  		v_0 := v.Args[0]
   300  		if v_0.Op != OpSliceMake {
   301  			break
   302  		}
   303  		_ = v_0.Args[2]
   304  		ptr := v_0.Args[0]
   305  		v.reset(OpCopy)
   306  		v.Type = ptr.Type
   307  		v.AddArg(ptr)
   308  		return true
   309  	}
   310  	return false
   311  }
   312  func rewriteValuedec_OpStore_0(v *Value) bool {
   313  	b := v.Block
   314  	_ = b
   315  	config := b.Func.Config
   316  	_ = config
   317  	typ := &b.Func.Config.Types
   318  	_ = typ
   319  	// match: (Store {t} dst (ComplexMake real imag) mem)
   320  	// cond: t.(*types.Type).Size() == 8
   321  	// result: (Store {typ.Float32}     (OffPtr <typ.Float32Ptr> [4] dst)     imag     (Store {typ.Float32} dst real mem))
   322  	for {
   323  		t := v.Aux
   324  		_ = v.Args[2]
   325  		dst := v.Args[0]
   326  		v_1 := v.Args[1]
   327  		if v_1.Op != OpComplexMake {
   328  			break
   329  		}
   330  		_ = v_1.Args[1]
   331  		real := v_1.Args[0]
   332  		imag := v_1.Args[1]
   333  		mem := v.Args[2]
   334  		if !(t.(*types.Type).Size() == 8) {
   335  			break
   336  		}
   337  		v.reset(OpStore)
   338  		v.Aux = typ.Float32
   339  		v0 := b.NewValue0(v.Pos, OpOffPtr, typ.Float32Ptr)
   340  		v0.AuxInt = 4
   341  		v0.AddArg(dst)
   342  		v.AddArg(v0)
   343  		v.AddArg(imag)
   344  		v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
   345  		v1.Aux = typ.Float32
   346  		v1.AddArg(dst)
   347  		v1.AddArg(real)
   348  		v1.AddArg(mem)
   349  		v.AddArg(v1)
   350  		return true
   351  	}
   352  	// match: (Store {t} dst (ComplexMake real imag) mem)
   353  	// cond: t.(*types.Type).Size() == 16
   354  	// result: (Store {typ.Float64}     (OffPtr <typ.Float64Ptr> [8] dst)     imag     (Store {typ.Float64} dst real mem))
   355  	for {
   356  		t := v.Aux
   357  		_ = v.Args[2]
   358  		dst := v.Args[0]
   359  		v_1 := v.Args[1]
   360  		if v_1.Op != OpComplexMake {
   361  			break
   362  		}
   363  		_ = v_1.Args[1]
   364  		real := v_1.Args[0]
   365  		imag := v_1.Args[1]
   366  		mem := v.Args[2]
   367  		if !(t.(*types.Type).Size() == 16) {
   368  			break
   369  		}
   370  		v.reset(OpStore)
   371  		v.Aux = typ.Float64
   372  		v0 := b.NewValue0(v.Pos, OpOffPtr, typ.Float64Ptr)
   373  		v0.AuxInt = 8
   374  		v0.AddArg(dst)
   375  		v.AddArg(v0)
   376  		v.AddArg(imag)
   377  		v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
   378  		v1.Aux = typ.Float64
   379  		v1.AddArg(dst)
   380  		v1.AddArg(real)
   381  		v1.AddArg(mem)
   382  		v.AddArg(v1)
   383  		return true
   384  	}
   385  	// match: (Store dst (StringMake ptr len) mem)
   386  	// cond:
   387  	// result: (Store {typ.Int}     (OffPtr <typ.IntPtr> [config.PtrSize] dst)     len     (Store {typ.BytePtr} dst ptr mem))
   388  	for {
   389  		_ = v.Args[2]
   390  		dst := v.Args[0]
   391  		v_1 := v.Args[1]
   392  		if v_1.Op != OpStringMake {
   393  			break
   394  		}
   395  		_ = v_1.Args[1]
   396  		ptr := v_1.Args[0]
   397  		len := v_1.Args[1]
   398  		mem := v.Args[2]
   399  		v.reset(OpStore)
   400  		v.Aux = typ.Int
   401  		v0 := b.NewValue0(v.Pos, OpOffPtr, typ.IntPtr)
   402  		v0.AuxInt = config.PtrSize
   403  		v0.AddArg(dst)
   404  		v.AddArg(v0)
   405  		v.AddArg(len)
   406  		v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
   407  		v1.Aux = typ.BytePtr
   408  		v1.AddArg(dst)
   409  		v1.AddArg(ptr)
   410  		v1.AddArg(mem)
   411  		v.AddArg(v1)
   412  		return true
   413  	}
   414  	// match: (Store dst (SliceMake ptr len cap) mem)
   415  	// cond:
   416  	// result: (Store {typ.Int}     (OffPtr <typ.IntPtr> [2*config.PtrSize] dst)     cap     (Store {typ.Int}       (OffPtr <typ.IntPtr> [config.PtrSize] dst)       len       (Store {typ.BytePtr} dst ptr mem)))
   417  	for {
   418  		_ = v.Args[2]
   419  		dst := v.Args[0]
   420  		v_1 := v.Args[1]
   421  		if v_1.Op != OpSliceMake {
   422  			break
   423  		}
   424  		_ = v_1.Args[2]
   425  		ptr := v_1.Args[0]
   426  		len := v_1.Args[1]
   427  		cap := v_1.Args[2]
   428  		mem := v.Args[2]
   429  		v.reset(OpStore)
   430  		v.Aux = typ.Int
   431  		v0 := b.NewValue0(v.Pos, OpOffPtr, typ.IntPtr)
   432  		v0.AuxInt = 2 * config.PtrSize
   433  		v0.AddArg(dst)
   434  		v.AddArg(v0)
   435  		v.AddArg(cap)
   436  		v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
   437  		v1.Aux = typ.Int
   438  		v2 := b.NewValue0(v.Pos, OpOffPtr, typ.IntPtr)
   439  		v2.AuxInt = config.PtrSize
   440  		v2.AddArg(dst)
   441  		v1.AddArg(v2)
   442  		v1.AddArg(len)
   443  		v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
   444  		v3.Aux = typ.BytePtr
   445  		v3.AddArg(dst)
   446  		v3.AddArg(ptr)
   447  		v3.AddArg(mem)
   448  		v1.AddArg(v3)
   449  		v.AddArg(v1)
   450  		return true
   451  	}
   452  	// match: (Store dst (IMake itab data) mem)
   453  	// cond:
   454  	// result: (Store {typ.BytePtr}     (OffPtr <typ.BytePtrPtr> [config.PtrSize] dst)     data     (Store {typ.Uintptr} dst itab mem))
   455  	for {
   456  		_ = v.Args[2]
   457  		dst := v.Args[0]
   458  		v_1 := v.Args[1]
   459  		if v_1.Op != OpIMake {
   460  			break
   461  		}
   462  		_ = v_1.Args[1]
   463  		itab := v_1.Args[0]
   464  		data := v_1.Args[1]
   465  		mem := v.Args[2]
   466  		v.reset(OpStore)
   467  		v.Aux = typ.BytePtr
   468  		v0 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtrPtr)
   469  		v0.AuxInt = config.PtrSize
   470  		v0.AddArg(dst)
   471  		v.AddArg(v0)
   472  		v.AddArg(data)
   473  		v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
   474  		v1.Aux = typ.Uintptr
   475  		v1.AddArg(dst)
   476  		v1.AddArg(itab)
   477  		v1.AddArg(mem)
   478  		v.AddArg(v1)
   479  		return true
   480  	}
   481  	return false
   482  }
   483  func rewriteValuedec_OpStringLen_0(v *Value) bool {
   484  	// match: (StringLen (StringMake _ len))
   485  	// cond:
   486  	// result: len
   487  	for {
   488  		v_0 := v.Args[0]
   489  		if v_0.Op != OpStringMake {
   490  			break
   491  		}
   492  		_ = v_0.Args[1]
   493  		len := v_0.Args[1]
   494  		v.reset(OpCopy)
   495  		v.Type = len.Type
   496  		v.AddArg(len)
   497  		return true
   498  	}
   499  	return false
   500  }
   501  func rewriteValuedec_OpStringPtr_0(v *Value) bool {
   502  	// match: (StringPtr (StringMake ptr _))
   503  	// cond:
   504  	// result: ptr
   505  	for {
   506  		v_0 := v.Args[0]
   507  		if v_0.Op != OpStringMake {
   508  			break
   509  		}
   510  		_ = v_0.Args[1]
   511  		ptr := v_0.Args[0]
   512  		v.reset(OpCopy)
   513  		v.Type = ptr.Type
   514  		v.AddArg(ptr)
   515  		return true
   516  	}
   517  	return false
   518  }
   519  func rewriteBlockdec(b *Block) bool {
   520  	config := b.Func.Config
   521  	_ = config
   522  	fe := b.Func.fe
   523  	_ = fe
   524  	typ := &config.Types
   525  	_ = typ
   526  	switch b.Kind {
   527  	}
   528  	return false
   529  }