Source file test/codegen/comparisons.go

     1  // asmcheck
     2  
     3  // Copyright 2018 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  package codegen
     8  
     9  import "unsafe"
    10  
    11  // This file contains code generation tests related to the comparison
    12  // operators.
    13  
    14  // -------------- //
    15  //    Equality    //
    16  // -------------- //
    17  
    18  // Check that compare to constant string use 2/4/8 byte compares
    19  
    20  func CompareString1(s string) bool {
    21  	// amd64:`CMPW\t\(.*\), [$]`
    22  	// arm64:`MOVHU\t\(.*\), [R]`,`MOVD\t[$]`,`CMPW\tR`
    23  	// ppc64le:`MOVHZ\t\(.*\), [R]`,`CMPW\t.*, [$]`
    24  	// s390x:`MOVHBR\t\(.*\), [R]`,`CMPW\t.*, [$]`
    25  	return s == "xx"
    26  }
    27  
    28  func CompareString2(s string) bool {
    29  	// amd64:`CMPL\t\(.*\), [$]`
    30  	// arm64:`MOVWU\t\(.*\), [R]`,`CMPW\t.*, [R]`
    31  	// ppc64le:`MOVWZ\t\(.*\), [R]`,`CMPW\t.*, [R]`
    32  	// s390x:`MOVWBR\t\(.*\), [R]`,`CMPW\t.*, [$]`
    33  	return s == "xxxx"
    34  }
    35  
    36  func CompareString3(s string) bool {
    37  	// amd64:`CMPQ\t\(.*\), [A-Z]`
    38  	// arm64:-`CMPW\t`
    39  	// ppc64:-`CMPW\t`
    40  	// ppc64le:-`CMPW\t`
    41  	// s390x:-`CMPW\t`
    42  	return s == "xxxxxxxx"
    43  }
    44  
    45  // Check that arrays compare use 2/4/8 byte compares
    46  
    47  func CompareArray1(a, b [2]byte) bool {
    48  	// amd64:`CMPW\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    49  	// arm64:-`MOVBU\t`
    50  	// ppc64le:-`MOVBZ\t`
    51  	// s390x:-`MOVBZ\t`
    52  	return a == b
    53  }
    54  
    55  func CompareArray2(a, b [3]uint16) bool {
    56  	// amd64:`CMPL\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    57  	// amd64:`CMPW\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    58  	return a == b
    59  }
    60  
    61  func CompareArray3(a, b [3]int16) bool {
    62  	// amd64:`CMPL\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    63  	// amd64:`CMPW\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    64  	return a == b
    65  }
    66  
    67  func CompareArray4(a, b [12]int8) bool {
    68  	// amd64:`CMPQ\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    69  	// amd64:`CMPL\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    70  	return a == b
    71  }
    72  
    73  func CompareArray5(a, b [15]byte) bool {
    74  	// amd64:`CMPQ\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    75  	return a == b
    76  }
    77  
    78  // This was a TODO in mapaccess1_faststr
    79  func CompareArray6(a, b unsafe.Pointer) bool {
    80  	// amd64:`CMPL\t\(.*\), [A-Z]`
    81  	// arm64:`MOVWU\t\(.*\), [R]`,`CMPW\t.*, [R]`
    82  	// ppc64le:`MOVWZ\t\(.*\), [R]`,`CMPW\t.*, [R]`
    83  	// s390x:`MOVWBR\t\(.*\), [R]`,`CMPW\t.*, [R]`
    84  	return *((*[4]byte)(a)) != *((*[4]byte)(b))
    85  }
    86  
    87  // Check that some structs generate 2/4/8 byte compares.
    88  
    89  type T1 struct {
    90  	a [8]byte
    91  }
    92  
    93  func CompareStruct1(s1, s2 T1) bool {
    94  	// amd64:`CMPQ\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
    95  	// amd64:-`CALL`
    96  	return s1 == s2
    97  }
    98  
    99  type T2 struct {
   100  	a [16]byte
   101  }
   102  
   103  func CompareStruct2(s1, s2 T2) bool {
   104  	// amd64:`CMPQ\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
   105  	// amd64:-`CALL`
   106  	return s1 == s2
   107  }
   108  
   109  // Assert that a memequal call is still generated when
   110  // inlining would increase binary size too much.
   111  
   112  type T3 struct {
   113  	a [24]byte
   114  }
   115  
   116  func CompareStruct3(s1, s2 T3) bool {
   117  	// amd64:-`CMPQ\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
   118  	// amd64:`CALL`
   119  	return s1 == s2
   120  }
   121  
   122  type T4 struct {
   123  	a [32]byte
   124  }
   125  
   126  func CompareStruct4(s1, s2 T4) bool {
   127  	// amd64:-`CMPQ\tcommand-line-arguments[.+_a-z0-9]+\(SP\), [A-Z]`
   128  	// amd64:`CALL`
   129  	return s1 == s2
   130  }
   131  
   132  // -------------- //
   133  //    Ordering    //
   134  // -------------- //
   135  
   136  // Test that LEAQ/ADDQconst are folded into SETx ops
   137  
   138  var r bool
   139  
   140  func CmpFold(x uint32) {
   141  	// amd64:`SETHI\t.*\(SB\)`
   142  	r = x > 4
   143  }
   144  
   145  // Test that direct comparisons with memory are generated when
   146  // possible
   147  
   148  func CmpMem1(p int, q *int) bool {
   149  	// amd64:`CMPQ\t\(.*\), [A-Z]`
   150  	return p < *q
   151  }
   152  
   153  func CmpMem2(p *int, q int) bool {
   154  	// amd64:`CMPQ\t\(.*\), [A-Z]`
   155  	return *p < q
   156  }
   157  
   158  func CmpMem3(p *int) bool {
   159  	// amd64:`CMPQ\t\(.*\), [$]7`
   160  	return *p < 7
   161  }
   162  
   163  func CmpMem4(p *int) bool {
   164  	// amd64:`CMPQ\t\(.*\), [$]7`
   165  	return 7 < *p
   166  }
   167  
   168  func CmpMem5(p **int) {
   169  	// amd64:`CMPL\truntime.writeBarrier\(SB\), [$]0`
   170  	*p = nil
   171  }
   172  
   173  func CmpMem6(a []int) int {
   174  	// 386:`CMPL\s8\([A-Z]+\),`
   175  	// amd64:`CMPQ\s16\([A-Z]+\),`
   176  	if a[1] > a[2] {
   177  		return 1
   178  	} else {
   179  		return 2
   180  	}
   181  }
   182  
   183  // Check tbz/tbnz are generated when comparing against zero on arm64
   184  
   185  func CmpZero1(a int32, ptr *int) {
   186  	if a < 0 { // arm64:"TBZ"
   187  		*ptr = 0
   188  	}
   189  }
   190  
   191  func CmpZero2(a int64, ptr *int) {
   192  	if a < 0 { // arm64:"TBZ"
   193  		*ptr = 0
   194  	}
   195  }
   196  
   197  func CmpZero3(a int32, ptr *int) {
   198  	if a >= 0 { // arm64:"TBNZ"
   199  		*ptr = 0
   200  	}
   201  }
   202  
   203  func CmpZero4(a int64, ptr *int) {
   204  	if a >= 0 { // arm64:"TBNZ"
   205  		*ptr = 0
   206  	}
   207  }
   208  
   209  func CmpToZero(a, b, d int32, e, f int64, deOptC0, deOptC1 bool) int32 {
   210  	// arm:`TST`,-`AND`
   211  	// arm64:`TSTW`,-`AND`
   212  	// 386:`TESTL`,-`ANDL`
   213  	// amd64:`TESTL`,-`ANDL`
   214  	c0 := a&b < 0
   215  	// arm:`CMN`,-`ADD`
   216  	// arm64:`CMNW`,-`ADD`
   217  	c1 := a+b < 0
   218  	// arm:`TEQ`,-`XOR`
   219  	c2 := a^b < 0
   220  	// arm64:`TST`,-`AND`
   221  	// amd64:`TESTQ`,-`ANDQ`
   222  	c3 := e&f < 0
   223  	// arm64:`CMN`,-`ADD`
   224  	c4 := e+f < 0
   225  	// not optimized to single CMNW/CMN due to further use of b+d
   226  	// arm64:`ADD`,-`CMNW`
   227  	// arm:`ADD`,-`CMN`
   228  	c5 := b+d == 0
   229  	// not optimized to single TSTW/TST due to further use of a&d
   230  	// arm64:`AND`,-`TSTW`
   231  	// arm:`AND`,-`TST`
   232  	// 386:`ANDL`
   233  	c6 := a&d >= 0
   234  	// arm64:`TST\sR[0-9]+<<3,\sR[0-9]+`
   235  	c7 := e&(f<<3) < 0
   236  	// arm64:`CMN\sR[0-9]+<<3,\sR[0-9]+`
   237  	c8 := e+(f<<3) < 0
   238  	if c0 {
   239  		return 1
   240  	} else if c1 {
   241  		return 2
   242  	} else if c2 {
   243  		return 3
   244  	} else if c3 {
   245  		return 4
   246  	} else if c4 {
   247  		return 5
   248  	} else if c5 {
   249  		return 6
   250  	} else if c6 {
   251  		return 7
   252  	} else if c7 {
   253  		return 9
   254  	} else if c8 {
   255  		return 10
   256  	} else if deOptC0 {
   257  		return b + d
   258  	} else if deOptC1 {
   259  		return a & d
   260  	} else {
   261  		return 0
   262  	}
   263  }
   264  
   265  func CmpLogicalToZero(a, b, c uint32, d, e uint64) uint64 {
   266  
   267  	// ppc64:"ANDCC",-"CMPW"
   268  	// ppc64le:"ANDCC",-"CMPW"
   269  	// wasm:"I64Eqz",-"I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
   270  	if a&63 == 0 {
   271  		return 1
   272  	}
   273  
   274  	// ppc64:"ANDCC",-"CMP"
   275  	// ppc64le:"ANDCC",-"CMP"
   276  	// wasm:"I64Eqz",-"I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
   277  	if d&255 == 0 {
   278  		return 1
   279  	}
   280  
   281  	// ppc64:"ANDCC",-"CMP"
   282  	// ppc64le:"ANDCC",-"CMP"
   283  	// wasm:"I64Eqz",-"I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
   284  	if d&e == 0 {
   285  		return 1
   286  	}
   287  	// ppc64:"ORCC",-"CMP"
   288  	// ppc64le:"ORCC",-"CMP"
   289  	// wasm:"I64Eqz",-"I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
   290  	if d|e == 0 {
   291  		return 1
   292  	}
   293  
   294  	// ppc64:"XORCC",-"CMP"
   295  	// ppc64le:"XORCC",-"CMP"
   296  	// wasm:"I64Eqz","I32Eqz",-"I64ExtendI32U",-"I32WrapI64"
   297  	if e^d == 0 {
   298  		return 1
   299  	}
   300  	return 0
   301  }
   302  
   303  // The following CmpToZero_ex* check that cmp|cmn with bmi|bpl are generated for
   304  // 'comparing to zero' expressions
   305  
   306  // var + const
   307  // 'x-const' might be canonicalized to 'x+(-const)', so we check both
   308  // CMN and CMP for subtraction expressions to make the pattern robust.
   309  func CmpToZero_ex1(a int64, e int32) int {
   310  	// arm64:`CMN`,-`ADD`,`(BMI|BPL)`
   311  	if a+3 < 0 {
   312  		return 1
   313  	}
   314  
   315  	// arm64:`CMN`,-`ADD`,`BEQ`,`(BMI|BPL)`
   316  	if a+5 <= 0 {
   317  		return 1
   318  	}
   319  
   320  	// arm64:`CMN`,-`ADD`,`(BMI|BPL)`
   321  	if a+13 >= 0 {
   322  		return 2
   323  	}
   324  
   325  	// arm64:`CMP|CMN`,-`(ADD|SUB)`,`(BMI|BPL)`
   326  	if a-7 < 0 {
   327  		return 3
   328  	}
   329  
   330  	// arm64:`SUB`,`TBZ`
   331  	if a-11 >= 0 {
   332  		return 4
   333  	}
   334  
   335  	// arm64:`SUB`,`CMP`,`BGT`
   336  	if a-19 > 0 {
   337  		return 4
   338  	}
   339  
   340  	// arm64:`CMNW`,-`ADDW`,`(BMI|BPL)`
   341  	// arm:`CMN`,-`ADD`,`(BMI|BPL)`
   342  	if e+3 < 0 {
   343  		return 5
   344  	}
   345  
   346  	// arm64:`CMNW`,-`ADDW`,`(BMI|BPL)`
   347  	// arm:`CMN`,-`ADD`,`(BMI|BPL)`
   348  	if e+13 >= 0 {
   349  		return 6
   350  	}
   351  
   352  	// arm64:`CMPW|CMNW`,`(BMI|BPL)`
   353  	// arm:`CMP|CMN`, -`(ADD|SUB)`, `(BMI|BPL)`
   354  	if e-7 < 0 {
   355  		return 7
   356  	}
   357  
   358  	// arm64:`SUB`,`TBNZ`
   359  	// arm:`CMP|CMN`, -`(ADD|SUB)`, `(BMI|BPL)`
   360  	if e-11 >= 0 {
   361  		return 8
   362  	}
   363  
   364  	return 0
   365  }
   366  
   367  // var + var
   368  // TODO: optimize 'var - var'
   369  func CmpToZero_ex2(a, b, c int64, e, f, g int32) int {
   370  	// arm64:`CMN`,-`ADD`,`(BMI|BPL)`
   371  	if a+b < 0 {
   372  		return 1
   373  	}
   374  
   375  	// arm64:`CMN`,-`ADD`,`BEQ`,`(BMI|BPL)`
   376  	if a+c <= 0 {
   377  		return 1
   378  	}
   379  
   380  	// arm64:`CMN`,-`ADD`,`(BMI|BPL)`
   381  	if b+c >= 0 {
   382  		return 2
   383  	}
   384  
   385  	// arm64:`CMNW`,-`ADDW`,`(BMI|BPL)`
   386  	// arm:`CMN`,-`ADD`,`(BMI|BPL)`
   387  	if e+f < 0 {
   388  		return 5
   389  	}
   390  
   391  	// arm64:`CMNW`,-`ADDW`,`(BMI|BPL)`
   392  	// arm:`CMN`,-`ADD`,`(BMI|BPL)`
   393  	if f+g >= 0 {
   394  		return 6
   395  	}
   396  	return 0
   397  }
   398  
   399  // var + var*var
   400  func CmpToZero_ex3(a, b, c, d int64, e, f, g, h int32) int {
   401  	// arm64:`CMN`,-`MADD`,`MUL`,`(BMI|BPL)`
   402  	if a+b*c < 0 {
   403  		return 1
   404  	}
   405  
   406  	// arm64:`CMN`,-`MADD`,`MUL`,`(BMI|BPL)`
   407  	if b+c*d >= 0 {
   408  		return 2
   409  	}
   410  
   411  	// arm64:`CMNW`,-`MADDW`,`MULW`,`BEQ`,`(BMI|BPL)`
   412  	// arm:`CMN`,-`MULA`,`MUL`,`BEQ`,`(BMI|BPL)`
   413  	if e+f*g > 0 {
   414  		return 5
   415  	}
   416  
   417  	// arm64:`CMNW`,-`MADDW`,`MULW`,`BEQ`,`(BMI|BPL)`
   418  	// arm:`CMN`,-`MULA`,`MUL`,`BEQ`,`(BMI|BPL)`
   419  	if f+g*h <= 0 {
   420  		return 6
   421  	}
   422  	return 0
   423  }
   424  
   425  // var - var*var
   426  func CmpToZero_ex4(a, b, c, d int64, e, f, g, h int32) int {
   427  	// arm64:`CMP`,-`MSUB`,`MUL`,`BEQ`,`(BMI|BPL)`
   428  	if a-b*c > 0 {
   429  		return 1
   430  	}
   431  
   432  	// arm64:`CMP`,-`MSUB`,`MUL`,`(BMI|BPL)`
   433  	if b-c*d >= 0 {
   434  		return 2
   435  	}
   436  
   437  	// arm64:`CMPW`,-`MSUBW`,`MULW`,`(BMI|BPL)`
   438  	if e-f*g < 0 {
   439  		return 5
   440  	}
   441  
   442  	// arm64:`CMPW`,-`MSUBW`,`MULW`,`(BMI|BPL)`
   443  	if f-g*h >= 0 {
   444  		return 6
   445  	}
   446  	return 0
   447  }
   448  
   449  func CmpToZero_ex5(e, f int32, u uint32) int {
   450  	// arm:`CMN`,-`ADD`,`BEQ`,`(BMI|BPL)`
   451  	if e+f<<1 > 0 {
   452  		return 1
   453  	}
   454  
   455  	// arm:`CMP`,-`SUB`,`(BMI|BPL)`
   456  	if f-int32(u>>2) >= 0 {
   457  		return 2
   458  	}
   459  	return 0
   460  }
   461  func UintLtZero(a uint8, b uint16, c uint32, d uint64) int {
   462  	// amd64: -`(TESTB|TESTW|TESTL|TESTQ|JCC|JCS)`
   463  	// arm64: -`(CMPW|CMP|BHS|BLO)`
   464  	if a < 0 || b < 0 || c < 0 || d < 0 {
   465  		return 1
   466  	}
   467  	return 0
   468  }
   469  
   470  func UintGeqZero(a uint8, b uint16, c uint32, d uint64) int {
   471  	// amd64: -`(TESTB|TESTW|TESTL|TESTQ|JCS|JCC)`
   472  	// arm64: -`(CMPW|CMP|BLO|BHS)`
   473  	if a >= 0 || b >= 0 || c >= 0 || d >= 0 {
   474  		return 1
   475  	}
   476  	return 0
   477  }
   478  
   479  func UintGtZero(a uint8, b uint16, c uint32, d uint64) int {
   480  	// arm64: `(CBN?ZW)`, `(CBN?Z[^W])`, -`(CMPW|CMP|BLS|BHI)`
   481  	if a > 0 || b > 0 || c > 0 || d > 0 {
   482  		return 1
   483  	}
   484  	return 0
   485  }
   486  
   487  func UintLeqZero(a uint8, b uint16, c uint32, d uint64) int {
   488  	// arm64: `(CBN?ZW)`, `(CBN?Z[^W])`, -`(CMPW|CMP|BHI|BLS)`
   489  	if a <= 0 || b <= 0 || c <= 0 || d <= 0 {
   490  		return 1
   491  	}
   492  	return 0
   493  }
   494  
   495  func UintLtOne(a uint8, b uint16, c uint32, d uint64) int {
   496  	// arm64: `(CBN?ZW)`, `(CBN?Z[^W])`, -`(CMPW|CMP|BHS|BLO)`
   497  	if a < 1 || b < 1 || c < 1 || d < 1 {
   498  		return 1
   499  	}
   500  	return 0
   501  }
   502  
   503  func UintGeqOne(a uint8, b uint16, c uint32, d uint64) int {
   504  	// arm64: `(CBN?ZW)`, `(CBN?Z[^W])`, -`(CMPW|CMP|BLO|BHS)`
   505  	if a >= 1 || b >= 1 || c >= 1 || d >= 1 {
   506  		return 1
   507  	}
   508  	return 0
   509  }
   510  
   511  func CmpToZeroU_ex1(a uint8, b uint16, c uint32, d uint64) int {
   512  	// wasm:"I64Eqz"-"I64LtU"
   513  	if 0 < a {
   514  		return 1
   515  	}
   516  	// wasm:"I64Eqz"-"I64LtU"
   517  	if 0 < b {
   518  		return 1
   519  	}
   520  	// wasm:"I64Eqz"-"I64LtU"
   521  	if 0 < c {
   522  		return 1
   523  	}
   524  	// wasm:"I64Eqz"-"I64LtU"
   525  	if 0 < d {
   526  		return 1
   527  	}
   528  	return 0
   529  }
   530  
   531  func CmpToZeroU_ex2(a uint8, b uint16, c uint32, d uint64) int {
   532  	// wasm:"I64Eqz"-"I64LeU"
   533  	if a <= 0 {
   534  		return 1
   535  	}
   536  	// wasm:"I64Eqz"-"I64LeU"
   537  	if b <= 0 {
   538  		return 1
   539  	}
   540  	// wasm:"I64Eqz"-"I64LeU"
   541  	if c <= 0 {
   542  		return 1
   543  	}
   544  	// wasm:"I64Eqz"-"I64LeU"
   545  	if d <= 0 {
   546  		return 1
   547  	}
   548  	return 0
   549  }
   550  
   551  func CmpToOneU_ex1(a uint8, b uint16, c uint32, d uint64) int {
   552  	// wasm:"I64Eqz"-"I64LtU"
   553  	if a < 1 {
   554  		return 1
   555  	}
   556  	// wasm:"I64Eqz"-"I64LtU"
   557  	if b < 1 {
   558  		return 1
   559  	}
   560  	// wasm:"I64Eqz"-"I64LtU"
   561  	if c < 1 {
   562  		return 1
   563  	}
   564  	// wasm:"I64Eqz"-"I64LtU"
   565  	if d < 1 {
   566  		return 1
   567  	}
   568  	return 0
   569  }
   570  
   571  func CmpToOneU_ex2(a uint8, b uint16, c uint32, d uint64) int {
   572  	// wasm:"I64Eqz"-"I64LeU"
   573  	if 1 <= a {
   574  		return 1
   575  	}
   576  	// wasm:"I64Eqz"-"I64LeU"
   577  	if 1 <= b {
   578  		return 1
   579  	}
   580  	// wasm:"I64Eqz"-"I64LeU"
   581  	if 1 <= c {
   582  		return 1
   583  	}
   584  	// wasm:"I64Eqz"-"I64LeU"
   585  	if 1 <= d {
   586  		return 1
   587  	}
   588  	return 0
   589  }
   590  
   591  // Check that small memequals are replaced with eq instructions
   592  
   593  func equalConstString1() bool {
   594  	a := string("A")
   595  	b := string("Z")
   596  	// amd64:-".*memequal"
   597  	// arm64:-".*memequal"
   598  	// ppc64:-".*memequal"
   599  	// ppc64le:-".*memequal"
   600  	return a == b
   601  }
   602  
   603  func equalVarString1(a string) bool {
   604  	b := string("Z")
   605  	// amd64:-".*memequal"
   606  	// arm64:-".*memequal"
   607  	// ppc64:-".*memequal"
   608  	// ppc64le:-".*memequal"
   609  	return a[:1] == b
   610  }
   611  
   612  func equalConstString2() bool {
   613  	a := string("AA")
   614  	b := string("ZZ")
   615  	// amd64:-".*memequal"
   616  	// arm64:-".*memequal"
   617  	// ppc64:-".*memequal"
   618  	// ppc64le:-".*memequal"
   619  	return a == b
   620  }
   621  
   622  func equalVarString2(a string) bool {
   623  	b := string("ZZ")
   624  	// amd64:-".*memequal"
   625  	// arm64:-".*memequal"
   626  	// ppc64:-".*memequal"
   627  	// ppc64le:-".*memequal"
   628  	return a[:2] == b
   629  }
   630  
   631  func equalConstString4() bool {
   632  	a := string("AAAA")
   633  	b := string("ZZZZ")
   634  	// amd64:-".*memequal"
   635  	// arm64:-".*memequal"
   636  	// ppc64:-".*memequal"
   637  	// ppc64le:-".*memequal"
   638  	return a == b
   639  }
   640  
   641  func equalVarString4(a string) bool {
   642  	b := string("ZZZZ")
   643  	// amd64:-".*memequal"
   644  	// arm64:-".*memequal"
   645  	// ppc64:-".*memequal"
   646  	// ppc64le:-".*memequal"
   647  	return a[:4] == b
   648  }
   649  
   650  func equalConstString8() bool {
   651  	a := string("AAAAAAAA")
   652  	b := string("ZZZZZZZZ")
   653  	// amd64:-".*memequal"
   654  	// arm64:-".*memequal"
   655  	// ppc64:-".*memequal"
   656  	// ppc64le:-".*memequal"
   657  	return a == b
   658  }
   659  
   660  func equalVarString8(a string) bool {
   661  	b := string("ZZZZZZZZ")
   662  	// amd64:-".*memequal"
   663  	// arm64:-".*memequal"
   664  	// ppc64:-".*memequal"
   665  	// ppc64le:-".*memequal"
   666  	return a[:8] == b
   667  }
   668  
   669  func cmpToCmn(a, b, c, d int) int {
   670  	var c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11 int
   671  	// arm64:`CMN`,-`CMP`
   672  	if a < -8 {
   673  		c1 = 1
   674  	}
   675  	// arm64:`CMN`,-`CMP`
   676  	if a+1 == 0 {
   677  		c2 = 1
   678  	}
   679  	// arm64:`CMN`,-`CMP`
   680  	if a+3 != 0 {
   681  		c3 = 1
   682  	}
   683  	// arm64:`CMN`,-`CMP`
   684  	if a+b == 0 {
   685  		c4 = 1
   686  	}
   687  	// arm64:`CMN`,-`CMP`
   688  	if b+c != 0 {
   689  		c5 = 1
   690  	}
   691  	// arm64:`CMN`,-`CMP`
   692  	if a == -c {
   693  		c6 = 1
   694  	}
   695  	// arm64:`CMN`,-`CMP`
   696  	if b != -d {
   697  		c7 = 1
   698  	}
   699  	// arm64:`CMN`,-`CMP`
   700  	if a*b+c == 0 {
   701  		c8 = 1
   702  	}
   703  	// arm64:`CMN`,-`CMP`
   704  	if a*c+b != 0 {
   705  		c9 = 1
   706  	}
   707  	// arm64:`CMP`,-`CMN`
   708  	if b*c-a == 0 {
   709  		c10 = 1
   710  	}
   711  	// arm64:`CMP`,-`CMN`
   712  	if a*d-b != 0 {
   713  		c11 = 1
   714  	}
   715  	return c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 + c9 + c10 + c11
   716  }
   717  

View as plain text