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