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