Source file test/codegen/multiply.go

     1  // asmcheck
     2  
     3  // Copyright 2024 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  // This file contains codegen tests related to strength
    10  // reduction of integer multiply.
    11  
    12  func m0(x int64) int64 {
    13  	// amd64: "XORL"
    14  	// arm64: "MOVD\tZR"
    15  	return x * 0
    16  }
    17  func m2(x int64) int64 {
    18  	// amd64: "ADDQ"
    19  	// arm64: "ADD"
    20  	return x * 2
    21  }
    22  func m3(x int64) int64 {
    23  	// amd64: "LEAQ\t.*[*]2"
    24  	// arm64: "ADD\tR[0-9]+<<1,"
    25  	return x * 3
    26  }
    27  func m4(x int64) int64 {
    28  	// amd64: "SHLQ\t[$]2,"
    29  	// arm64: "LSL\t[$]2,"
    30  	return x * 4
    31  }
    32  func m5(x int64) int64 {
    33  	// amd64: "LEAQ\t.*[*]4"
    34  	// arm64: "ADD\tR[0-9]+<<2,"
    35  	return x * 5
    36  }
    37  func m6(x int64) int64 {
    38  	// amd64: "LEAQ\t.*[*]1", "LEAQ\t.*[*]2"
    39  	// arm64: "ADD\tR[0-9]+,", "ADD\tR[0-9]+<<1,"
    40  	return x * 6
    41  }
    42  func m7(x int64) int64 {
    43  	// amd64: "LEAQ\t.*[*]2"
    44  	// arm64: "LSL\t[$]3,", "SUB\tR[0-9]+,"
    45  	return x * 7
    46  }
    47  func m8(x int64) int64 {
    48  	// amd64: "SHLQ\t[$]3,"
    49  	// arm64: "LSL\t[$]3,"
    50  	return x * 8
    51  }
    52  func m9(x int64) int64 {
    53  	// amd64: "LEAQ\t.*[*]8"
    54  	// arm64: "ADD\tR[0-9]+<<3,"
    55  	return x * 9
    56  }
    57  func m10(x int64) int64 {
    58  	// amd64: "LEAQ\t.*[*]1", "LEAQ\t.*[*]4"
    59  	// arm64: "ADD\tR[0-9]+,", "ADD\tR[0-9]+<<2,"
    60  	return x * 10
    61  }
    62  func m11(x int64) int64 {
    63  	// amd64: "LEAQ\t.*[*]4", "LEAQ\t.*[*]2"
    64  	// arm64: "MOVD\t[$]11,", "MUL"
    65  	return x * 11
    66  }
    67  func m12(x int64) int64 {
    68  	// amd64: "LEAQ\t.*[*]2", "SHLQ\t[$]2,"
    69  	// arm64: "LSL\t[$]2,", "ADD\tR[0-9]+<<1,"
    70  	return x * 12
    71  }
    72  func m13(x int64) int64 {
    73  	// amd64: "LEAQ\t.*[*]2", "LEAQ\t.*[*]4"
    74  	// arm64: "MOVD\t[$]13,", "MUL"
    75  	return x * 13
    76  }
    77  func m14(x int64) int64 {
    78  	// amd64: "IMUL3Q\t[$]14,"
    79  	// arm64: "LSL\t[$]4,", "SUB\tR[0-9]+<<1,"
    80  	return x * 14
    81  }
    82  func m15(x int64) int64 {
    83  	// amd64: "LEAQ\t.*[*]2", "LEAQ\t.*[*]4"
    84  	// arm64: "LSL\t[$]4,", "SUB\tR[0-9]+,"
    85  	return x * 15
    86  }
    87  func m16(x int64) int64 {
    88  	// amd64: "SHLQ\t[$]4,"
    89  	// arm64: "LSL\t[$]4,"
    90  	return x * 16
    91  }
    92  func m17(x int64) int64 {
    93  	// amd64: "LEAQ\t.*[*]1", "LEAQ\t.*[*]8"
    94  	// arm64: "ADD\tR[0-9]+<<4,"
    95  	return x * 17
    96  }
    97  func m18(x int64) int64 {
    98  	// amd64: "LEAQ\t.*[*]1", "LEAQ\t.*[*]8"
    99  	// arm64: "ADD\tR[0-9]+,", "ADD\tR[0-9]+<<3,"
   100  	return x * 18
   101  }
   102  func m19(x int64) int64 {
   103  	// amd64: "LEAQ\t.*[*]8", "LEAQ\t.*[*]2"
   104  	// arm64: "MOVD\t[$]19,", "MUL"
   105  	return x * 19
   106  }
   107  func m20(x int64) int64 {
   108  	// amd64: "LEAQ\t.*[*]4", "SHLQ\t[$]2,"
   109  	// arm64: "LSL\t[$]2,", "ADD\tR[0-9]+<<2,"
   110  	return x * 20
   111  }
   112  func m21(x int64) int64 {
   113  	// amd64: "LEAQ\t.*[*]4", "LEAQ\t.*[*]4"
   114  	// arm64: "MOVD\t[$]21,", "MUL"
   115  	return x * 21
   116  }
   117  func m22(x int64) int64 {
   118  	// amd64: "IMUL3Q\t[$]22,"
   119  	// arm64: "MOVD\t[$]22,", "MUL"
   120  	return x * 22
   121  }
   122  func m23(x int64) int64 {
   123  	// amd64: "IMUL3Q\t[$]23,"
   124  	// arm64: "MOVD\t[$]23,", "MUL"
   125  	return x * 23
   126  }
   127  func m24(x int64) int64 {
   128  	// amd64: "LEAQ\t.*[*]2", "SHLQ\t[$]3,"
   129  	// arm64: "LSL\t[$]3,", "ADD\tR[0-9]+<<1,"
   130  	return x * 24
   131  }
   132  func m25(x int64) int64 {
   133  	// amd64: "LEAQ\t.*[*]4", "LEAQ\t.*[*]4"
   134  	// arm64: "MOVD\t[$]25,", "MUL"
   135  	return x * 25
   136  }
   137  func m26(x int64) int64 {
   138  	// amd64: "IMUL3Q\t[$]26,"
   139  	// arm64: "MOVD\t[$]26,", "MUL"
   140  	return x * 26
   141  }
   142  func m27(x int64) int64 {
   143  	// amd64: "LEAQ\t.*[*]2", "LEAQ\t.*[*]8"
   144  	// arm64: "MOVD\t[$]27,", "MUL"
   145  	return x * 27
   146  }
   147  func m28(x int64) int64 {
   148  	// amd64: "IMUL3Q\t[$]28,"
   149  	// arm64: "LSL\t[$]5, "SUB\tR[0-9]+<<2,"
   150  	return x * 28
   151  }
   152  func m29(x int64) int64 {
   153  	// amd64: "IMUL3Q\t[$]29,"
   154  	// arm64: "MOVD\t[$]29,", "MUL"
   155  	return x * 29
   156  }
   157  func m30(x int64) int64 {
   158  	// amd64: "IMUL3Q\t[$]30,"
   159  	// arm64: "LSL\t[$]5,", "SUB\tR[0-9]+<<1,"
   160  	return x * 30
   161  }
   162  func m31(x int64) int64 {
   163  	// amd64: "SHLQ\t[$]5,", "SUBQ"
   164  	// arm64: "LSL\t[$]5,", "SUB\tR[0-9]+,"
   165  	return x * 31
   166  }
   167  func m32(x int64) int64 {
   168  	// amd64: "SHLQ\t[$]5,"
   169  	// arm64: "LSL\t[$]5,"
   170  	return x * 32
   171  }
   172  func m33(x int64) int64 {
   173  	// amd64: "SHLQ\t[$]2,", "LEAQ\t.*[*]8"
   174  	// arm64: "ADD\tR[0-9]+<<5,"
   175  	return x * 33
   176  }
   177  func m34(x int64) int64 {
   178  	// amd64: "SHLQ\t[$]5,", "LEAQ\t.*[*]2"
   179  	// arm64: "ADD\tR[0-9]+,", "ADD\tR[0-9]+<<4,"
   180  	return x * 34
   181  }
   182  func m35(x int64) int64 {
   183  	// amd64: "IMUL3Q\t[$]35,"
   184  	// arm64: "MOVD\t[$]35,", "MUL"
   185  	return x * 35
   186  }
   187  func m36(x int64) int64 {
   188  	// amd64: "LEAQ\t.*[*]8", "SHLQ\t[$]2,"
   189  	// arm64: "LSL\t[$]2,", "ADD\tR[0-9]+<<3,"
   190  	return x * 36
   191  }
   192  func m37(x int64) int64 {
   193  	// amd64: "LEAQ\t.*[*]8", "LEAQ\t.*[*]4"
   194  	// arm64: "MOVD\t[$]37,", "MUL"
   195  	return x * 37
   196  }
   197  func m38(x int64) int64 {
   198  	// amd64: "IMUL3Q\t[$]38,"
   199  	// arm64: "MOVD\t[$]38,", "MUL"
   200  	return x * 38
   201  }
   202  func m39(x int64) int64 {
   203  	// amd64: "IMUL3Q\t[$]39,"
   204  	// arm64: "MOVD\t[$]39,", "MUL"
   205  	return x * 39
   206  }
   207  func m40(x int64) int64 {
   208  	// amd64: "LEAQ\t.*[*]4", "SHLQ\t[$]3,"
   209  	// arm64: "LSL\t[$]3,", "ADD\tR[0-9]+<<2,"
   210  	return x * 40
   211  }
   212  
   213  func mn1(x int64) int64 {
   214  	// amd64: "NEGQ\t"
   215  	// arm64: "NEG\tR[0-9]+,"
   216  	return x * -1
   217  }
   218  func mn2(x int64) int64 {
   219  	// amd64: "NEGQ", "ADDQ"
   220  	// arm64: "NEG\tR[0-9]+<<1,"
   221  	return x * -2
   222  }
   223  func mn3(x int64) int64 {
   224  	// amd64: "NEGQ", "LEAQ\t.*[*]2"
   225  	// arm64: "SUB\tR[0-9]+<<2,"
   226  	return x * -3
   227  }
   228  func mn4(x int64) int64 {
   229  	// amd64: "NEGQ", "SHLQ\t[$]2,"
   230  	// arm64: "NEG\tR[0-9]+<<2,"
   231  	return x * -4
   232  }
   233  func mn5(x int64) int64 {
   234  	// amd64: "NEGQ", "LEAQ\t.*[*]4"
   235  	// arm64: "NEG\tR[0-9]+,", "ADD\tR[0-9]+<<2,"
   236  	return x * -5
   237  }
   238  func mn6(x int64) int64 {
   239  	// amd64: "IMUL3Q\t[$]-6,"
   240  	// arm64: "ADD\tR[0-9]+,", "SUB\tR[0-9]+<<2,"
   241  	return x * -6
   242  }
   243  func mn7(x int64) int64 {
   244  	// amd64: "NEGQ", "LEAQ\t.*[*]8"
   245  	// arm64: "SUB\tR[0-9]+<<3,"
   246  	return x * -7
   247  }
   248  func mn8(x int64) int64 {
   249  	// amd64: "NEGQ", "SHLQ\t[$]3,"
   250  	// arm64: "NEG\tR[0-9]+<<3,"
   251  	return x * -8
   252  }
   253  func mn9(x int64) int64 {
   254  	// amd64: "NEGQ", "LEAQ\t.*[*]8"
   255  	// arm64: "NEG\tR[0-9]+,", "ADD\tR[0-9]+<<3,"
   256  	return x * -9
   257  }
   258  func mn10(x int64) int64 {
   259  	// amd64: "IMUL3Q\t[$]-10,"
   260  	// arm64: "MOVD\t[$]-10,", "MUL"
   261  	return x * -10
   262  }
   263  func mn11(x int64) int64 {
   264  	// amd64: "IMUL3Q\t[$]-11,"
   265  	// arm64: "MOVD\t[$]-11,", "MUL"
   266  	return x * -11
   267  }
   268  func mn12(x int64) int64 {
   269  	// amd64: "IMUL3Q\t[$]-12,"
   270  	// arm64: "LSL\t[$]2,", "SUB\tR[0-9]+<<2,"
   271  	return x * -12
   272  }
   273  func mn13(x int64) int64 {
   274  	// amd64: "IMUL3Q\t[$]-13,"
   275  	// arm64: "MOVD\t[$]-13,", "MUL"
   276  	return x * -13
   277  }
   278  func mn14(x int64) int64 {
   279  	// amd64: "IMUL3Q\t[$]-14,"
   280  	// arm64: "ADD\tR[0-9]+,", "SUB\tR[0-9]+<<3,"
   281  	return x * -14
   282  }
   283  func mn15(x int64) int64 {
   284  	// amd64: "SHLQ\t[$]4,", "SUBQ"
   285  	// arm64: "SUB\tR[0-9]+<<4,"
   286  	return x * -15
   287  }
   288  func mn16(x int64) int64 {
   289  	// amd64: "NEGQ", "SHLQ\t[$]4,"
   290  	// arm64: "NEG\tR[0-9]+<<4,"
   291  	return x * -16
   292  }
   293  func mn17(x int64) int64 {
   294  	// amd64: "IMUL3Q\t[$]-17,"
   295  	// arm64: "NEG\tR[0-9]+,", "ADD\tR[0-9]+<<4,"
   296  	return x * -17
   297  }
   298  func mn18(x int64) int64 {
   299  	// amd64: "IMUL3Q\t[$]-18,"
   300  	// arm64: "MOVD\t[$]-18,", "MUL"
   301  	return x * -18
   302  }
   303  func mn19(x int64) int64 {
   304  	// amd64: "IMUL3Q\t[$]-19,"
   305  	// arm64: "MOVD\t[$]-19,", "MUL"
   306  	return x * -19
   307  }
   308  func mn20(x int64) int64 {
   309  	// amd64: "IMUL3Q\t[$]-20,"
   310  	// arm64: "MOVD\t[$]-20,", "MUL"
   311  	return x * -20
   312  }
   313  

View as plain text