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