| // asmcheck | |
| // Copyright 2024 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package codegen | |
| // This file contains codegen tests related to strength | |
| // reduction of integer multiply. | |
| func m0(x int64) int64 { | |
| // amd64: "XORL" | |
| // arm64: "MOVD ZR" | |
| // loong64: "MOVV R0" | |
| // riscv64: "MOV [$]0," | |
| return x * 0 | |
| } | |
| func m2(x int64) int64 { | |
| // amd64: "ADDQ" | |
| // arm64: "ADD" | |
| // loong64: "ADDVU" | |
| // riscv64: "SLLI [$]1," | |
| return x * 2 | |
| } | |
| func m3(x int64) int64 { | |
| // amd64: "LEAQ .*[*]2" | |
| // arm64: "ADD R[0-9]+<<1," | |
| // loong64: "ALSLV [$]1," | |
| // riscv64/rva20u64: "MOV [$]3," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH1ADD" | |
| return x * 3 | |
| } | |
| func m4(x int64) int64 { | |
| // amd64: "SHLQ [$]2," | |
| // arm64: "LSL [$]2," | |
| // loong64: "SLLV [$]2," | |
| // riscv64: "SLLI [$]2," | |
| return x * 4 | |
| } | |
| func m5(x int64) int64 { | |
| // amd64: "LEAQ .*[*]4" | |
| // arm64: "ADD R[0-9]+<<2," | |
| // loong64: "ALSLV [$]2," | |
| // riscv64/rva20u64: "MOV [$]5," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH2ADD" | |
| return x * 5 | |
| } | |
| func m6(x int64) int64 { | |
| // amd64: "LEAQ .*[*]1" "LEAQ .*[*]2" | |
| // arm64: "ADD R[0-9]+," "ADD R[0-9]+<<1," | |
| // loong64: "ADDVU" "ADDVU" "ADDVU" | |
| // riscv64/rva20u64: "MOV [$]6," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH1ADD" "SLLI [$]1," | |
| return x * 6 | |
| } | |
| func m7(x int64) int64 { | |
| // amd64: "LEAQ .*[*]2" | |
| // arm64: "LSL [$]3," "SUB R[0-9]+," | |
| // loong64: "ALSLV [$]1," "ALSLV [$]1," | |
| return x * 7 | |
| } | |
| func m8(x int64) int64 { | |
| // amd64: "SHLQ [$]3," | |
| // arm64: "LSL [$]3," | |
| // loong64: "SLLV [$]3," | |
| // riscv64: "SLLI [$]3," | |
| return x * 8 | |
| } | |
| func m9(x int64) int64 { | |
| // amd64: "LEAQ .*[*]8" | |
| // arm64: "ADD R[0-9]+<<3," | |
| // loong64: "ALSLV [$]3," | |
| // riscv64/rva20u64: "MOV [$]9," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH3ADD" | |
| return x * 9 | |
| } | |
| func m10(x int64) int64 { | |
| // amd64: "LEAQ .*[*]1" "LEAQ .*[*]4" | |
| // arm64: "ADD R[0-9]+," "ADD R[0-9]+<<2," | |
| // loong64: "ADDVU" "ALSLV [$]2," | |
| // riscv64/rva20u64: "MOV [$]10," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH2ADD" "SLLI [$]1," | |
| return x * 10 | |
| } | |
| func m11(x int64) int64 { | |
| // amd64: "LEAQ .*[*]4" "LEAQ .*[*]2" | |
| // arm64: "MOVD [$]11," "MUL" | |
| // loong64: "ALSLV [$]2," "ALSLV [$]1," | |
| return x * 11 | |
| } | |
| func m12(x int64) int64 { | |
| // amd64: "LEAQ .*[*]2" "SHLQ [$]2," | |
| // arm64: "LSL [$]2," "ADD R[0-9]+<<1," | |
| // loong64: "SLLV" "ALSLV [$]1," | |
| // riscv64/rva20u64: "MOV [$]12," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH1ADD" "SLLI [$]2," | |
| return x * 12 | |
| } | |
| func m13(x int64) int64 { | |
| // amd64: "LEAQ .*[*]2" "LEAQ .*[*]4" | |
| // arm64: "MOVD [$]13," "MUL" | |
| // loong64: "ALSLV [$]1," "ALSLV [$]2," | |
| return x * 13 | |
| } | |
| func m14(x int64) int64 { | |
| // amd64: "IMUL3Q [$]14," | |
| // arm64: "LSL [$]4," "SUB R[0-9]+<<1," | |
| // loong64: "ADDVU" "ALSLV [$]1" "ALSLV [$]2" | |
| return x * 14 | |
| } | |
| func m15(x int64) int64 { | |
| // amd64: "LEAQ .*[*]2" "LEAQ .*[*]4" | |
| // arm64: "LSL [$]4," "SUB R[0-9]+," | |
| // loong64: "ALSLV [$]1," "ALSLV [$]2," | |
| return x * 15 | |
| } | |
| func m16(x int64) int64 { | |
| // amd64: "SHLQ [$]4," | |
| // arm64: "LSL [$]4," | |
| // loong64: "SLLV [$]4," | |
| // riscv64: "SLLI [$]4," | |
| return x * 16 | |
| } | |
| func m17(x int64) int64 { | |
| // amd64: "LEAQ .*[*]1" "LEAQ .*[*]8" | |
| // arm64: "ADD R[0-9]+<<4," | |
| // loong64: "ALSLV [$]" | |
| return x * 17 | |
| } | |
| func m18(x int64) int64 { | |
| // amd64: "LEAQ .*[*]1" "LEAQ .*[*]8" | |
| // arm64: "ADD R[0-9]+," "ADD R[0-9]+<<3," | |
| // loong64: "ADDVU" "ALSLV [$]3," | |
| // riscv64/rva20u64: "MOV [$]18," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH3ADD" "SLLI [$]1," | |
| return x * 18 | |
| } | |
| func m19(x int64) int64 { | |
| // amd64: "LEAQ .*[*]8" "LEAQ .*[*]2" | |
| // arm64: "MOVD [$]19," "MUL" | |
| // loong64: "ALSLV [$]3," "ALSLV [$]1," | |
| return x * 19 | |
| } | |
| func m20(x int64) int64 { | |
| // amd64: "LEAQ .*[*]4" "SHLQ [$]2," | |
| // arm64: "LSL [$]2," "ADD R[0-9]+<<2," | |
| // loong64: "SLLV [$]2," "ALSLV [$]2," | |
| // riscv64/rva20u64: "MOV [$]20," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH2ADD" "SLLI [$]2," | |
| return x * 20 | |
| } | |
| func m21(x int64) int64 { | |
| // amd64: "LEAQ .*[*]4" "LEAQ .*[*]4" | |
| // arm64: "MOVD [$]21," "MUL" | |
| // loong64: "ALSLV [$]2," "ALSLV [$]2," | |
| return x * 21 | |
| } | |
| func m22(x int64) int64 { | |
| // amd64: "IMUL3Q [$]22," | |
| // arm64: "MOVD [$]22," "MUL" | |
| // loong64: "ADDVU" "ALSLV [$]2," "ALSLV [$]2," | |
| return x * 22 | |
| } | |
| func m23(x int64) int64 { | |
| // amd64: "IMUL3Q [$]23," | |
| // arm64: "MOVD [$]23," "MUL" | |
| // loong64: "ALSLV [$]1," "SUBVU" "ALSLV [$]3," | |
| return x * 23 | |
| } | |
| func m24(x int64) int64 { | |
| // amd64: "LEAQ .*[*]2" "SHLQ [$]3," | |
| // arm64: "LSL [$]3," "ADD R[0-9]+<<1," | |
| // loong64: "SLLV [$]3" "ALSLV [$]1," | |
| // riscv64/rva20u64: "MOV [$]24," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH1ADD" "SLLI [$]3," | |
| return x * 24 | |
| } | |
| func m25(x int64) int64 { | |
| // amd64: "LEAQ .*[*]4" "LEAQ .*[*]4" | |
| // arm64: "MOVD [$]25," "MUL" | |
| // loong64: "ALSLV [$]2," "ALSLV [$]2," | |
| return x * 25 | |
| } | |
| func m26(x int64) int64 { | |
| // amd64: "IMUL3Q [$]26," | |
| // arm64: "MOVD [$]26," "MUL" | |
| // loong64: "ADDVU" "ALSLV [$]1," "ALSLV [$]3," | |
| return x * 26 | |
| } | |
| func m27(x int64) int64 { | |
| // amd64: "LEAQ .*[*]2" "LEAQ .*[*]8" | |
| // arm64: "MOVD [$]27," "MUL" | |
| // loong64: "ALSLV [$]1," "ALSLV [$]3," | |
| return x * 27 | |
| } | |
| func m28(x int64) int64 { | |
| // amd64: "IMUL3Q [$]28," | |
| // arm64: "LSL [$]5," "SUB R[0-9]+<<2," | |
| // loong64: "ALSLV [$]1," "SLLV [$]2," "ALSLV [$]3," | |
| return x * 28 | |
| } | |
| func m29(x int64) int64 { | |
| // amd64: "IMUL3Q [$]29," | |
| // arm64: "MOVD [$]29," "MUL" | |
| // loong64: "ALSLV [$]1," "ALSLV [$]2," "ALSLV [$]3," | |
| return x * 29 | |
| } | |
| func m30(x int64) int64 { | |
| // amd64: "IMUL3Q [$]30," | |
| // arm64: "LSL [$]5," "SUB R[0-9]+<<1," | |
| // loong64: "ADDVU" "SLLV [$]5," "SUBVU" | |
| return x * 30 | |
| } | |
| func m31(x int64) int64 { | |
| // amd64: "SHLQ [$]5," "SUBQ" | |
| // arm64: "LSL [$]5," "SUB R[0-9]+," | |
| // loong64: "SLLV [$]5," "SUBVU" | |
| return x * 31 | |
| } | |
| func m32(x int64) int64 { | |
| // amd64: "SHLQ [$]5," | |
| // arm64: "LSL [$]5," | |
| // loong64: "SLLV [$]5," | |
| // riscv64: "SLLI [$]5," | |
| return x * 32 | |
| } | |
| func m33(x int64) int64 { | |
| // amd64: "SHLQ [$]2," "LEAQ .*[*]8" | |
| // arm64: "ADD R[0-9]+<<5," | |
| // loong64: "ADDVU" "ALSLV [$]4," | |
| return x * 33 | |
| } | |
| func m34(x int64) int64 { | |
| // amd64: "SHLQ [$]5," "LEAQ .*[*]2" | |
| // arm64: "ADD R[0-9]+," "ADD R[0-9]+<<4," | |
| // loong64: "ADDVU" "ALSLV [$]4," | |
| return x * 34 | |
| } | |
| func m35(x int64) int64 { | |
| // amd64: "IMUL3Q [$]35," | |
| // arm64: "MOVD [$]35," "MUL" | |
| // loong64: "ALSLV [$]4," "ALSLV [$]1," | |
| return x * 35 | |
| } | |
| func m36(x int64) int64 { | |
| // amd64: "LEAQ .*[*]8" "SHLQ [$]2," | |
| // arm64: "LSL [$]2," "ADD R[0-9]+<<3," | |
| // loong64: "SLLV [$]2," "ALSLV [$]3," | |
| // riscv64/rva20u64: "MOV [$]36," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH3ADD" "SLLI [$]2," | |
| return x * 36 | |
| } | |
| func m37(x int64) int64 { | |
| // amd64: "LEAQ .*[*]8" "LEAQ .*[*]4" | |
| // arm64: "MOVD [$]37," "MUL" | |
| // loong64: "ALSLV [$]3," "ALSLV [$]2," | |
| return x * 37 | |
| } | |
| func m38(x int64) int64 { | |
| // amd64: "IMUL3Q [$]38," | |
| // arm64: "MOVD [$]38," "MUL" | |
| // loong64: "ALSLV [$]3," "ALSLV [$]2," | |
| return x * 38 | |
| } | |
| func m39(x int64) int64 { | |
| // amd64: "IMUL3Q [$]39," | |
| // arm64: "MOVD [$]39," "MUL" | |
| // loong64: "ALSLV [$]2," "SUBVU" "ALSLV [$]3," | |
| return x * 39 | |
| } | |
| func m40(x int64) int64 { | |
| // amd64: "LEAQ .*[*]4" "SHLQ [$]3," | |
| // arm64: "LSL [$]3," "ADD R[0-9]+<<2," | |
| // loong64: "SLLV [$]3," "ALSLV [$]2," | |
| // riscv64/rva20u64: "MOV [$]40," "MUL" | |
| // riscv64/rva22u64,riscv64/rva23u64: "SH2ADD" "SLLI [$]3," | |
| return x * 40 | |
| } | |
| func mn1(x int64) int64 { | |
| // amd64: "NEGQ " | |
| // arm64: "NEG R[0-9]+," | |
| // loong64: "SUBVU R[0-9], R0," | |
| // riscv64: "NEG" | |
| return x * -1 | |
| } | |
| func mn2(x int64) int64 { | |
| // amd64: "NEGQ" "ADDQ" | |
| // arm64: "NEG R[0-9]+<<1," | |
| // loong64: "ADDVU" "SUBVU R[0-9], R0," | |
| // riscv64: "SLLI [$]1," "NEG" | |
| return x * -2 | |
| } | |
| func mn3(x int64) int64 { | |
| // amd64: "NEGQ" "LEAQ .*[*]2" | |
| // arm64: "SUB R[0-9]+<<2," | |
| // loong64: "SUBVU" "ALSLV [$]1," | |
| return x * -3 | |
| } | |
| func mn4(x int64) int64 { | |
| // amd64: "NEGQ" "SHLQ [$]2," | |
| // arm64: "NEG R[0-9]+<<2," | |
| // loong64: "SLLV [$]2," "SUBVU R[0-9], R0," | |
| // riscv64: "SLLI [$]2," "NEG" | |
| return x * -4 | |
| } | |
| func mn5(x int64) int64 { | |
| // amd64: "NEGQ" "LEAQ .*[*]4" | |
| // arm64: "NEG R[0-9]+," "ADD R[0-9]+<<2," | |
| // loong64: "SUBVU" "ALSLV [$]2," | |
| return x * -5 | |
| } | |
| func mn6(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-6," | |
| // arm64: "ADD R[0-9]+," "SUB R[0-9]+<<2," | |
| // loong64: "ADDVU" "SUBVU" "ALSLV [$]3," | |
| return x * -6 | |
| } | |
| func mn7(x int64) int64 { | |
| // amd64: "NEGQ" "LEAQ .*[*]8" | |
| // arm64: "SUB R[0-9]+<<3," | |
| // loong64: "SUBVU" "ALSLV [$]3," | |
| return x * -7 | |
| } | |
| func mn8(x int64) int64 { | |
| // amd64: "NEGQ" "SHLQ [$]3," | |
| // arm64: "NEG R[0-9]+<<3," | |
| // loong64: "SLLV [$]3" "SUBVU R[0-9], R0," | |
| // riscv64: "SLLI [$]3," "NEG" | |
| return x * -8 | |
| } | |
| func mn9(x int64) int64 { | |
| // amd64: "NEGQ" "LEAQ .*[*]8" | |
| // arm64: "NEG R[0-9]+," "ADD R[0-9]+<<3," | |
| // loong64: "SUBVU" "ALSLV [$]3," | |
| return x * -9 | |
| } | |
| func mn10(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-10," | |
| // arm64: "MOVD [$]-10," "MUL" | |
| // loong64: "ALSLV [$]2," "SUBVU" "ADDVU" | |
| return x * -10 | |
| } | |
| func mn11(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-11," | |
| // arm64: "MOVD [$]-11," "MUL" | |
| // loong64: "ALSLV [$]2," "SUBVU" "ALSLV [$]4," | |
| return x * -11 | |
| } | |
| func mn12(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-12," | |
| // arm64: "LSL [$]2," "SUB R[0-9]+<<2," | |
| // loong64: "ALSLV [$]2," "ALSLV [$]4," "SUBVU" | |
| return x * -12 | |
| } | |
| func mn13(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-13," | |
| // arm64: "MOVD [$]-13," "MUL" | |
| // loong64: "ALSLV [$]1," "SUBVU" "ALSLV [$]4," | |
| return x * -13 | |
| } | |
| func mn14(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-14," | |
| // arm64: "ADD R[0-9]+," "SUB R[0-9]+<<3," | |
| // loong64: "ADDVU" "SUBVU" "ALSLV [$]4," | |
| return x * -14 | |
| } | |
| func mn15(x int64) int64 { | |
| // amd64: "SHLQ [$]4," "SUBQ" | |
| // arm64: "SUB R[0-9]+<<4," | |
| // loong64: "SUBVU" "ALSLV [$]4," | |
| return x * -15 | |
| } | |
| func mn16(x int64) int64 { | |
| // amd64: "NEGQ" "SHLQ [$]4," | |
| // arm64: "NEG R[0-9]+<<4," | |
| // loong64: "SLLV [$]4," "SUBVU R[0-9], R0," | |
| // riscv64: "SLLI [$]4," "NEG" | |
| return x * -16 | |
| } | |
| func mn17(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-17," | |
| // arm64: "NEG R[0-9]+," "ADD R[0-9]+<<4," | |
| // loong64: "SUBVU" "ALSLV [$]4," | |
| return x * -17 | |
| } | |
| func mn18(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-18," | |
| // arm64: "MOVD [$]-18," "MUL" | |
| // loong64: "ALSLV [$]3," "SUBVU" "ADDVU" | |
| return x * -18 | |
| } | |
| func mn19(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-19," | |
| // arm64: "MOVD [$]-19," "MUL" | |
| // loong64: "ALSLV [$]1," "ALSLV [$]4," "SUBVU" | |
| return x * -19 | |
| } | |
| func mn20(x int64) int64 { | |
| // amd64: "IMUL3Q [$]-20," | |
| // arm64: "MOVD [$]-20," "MUL" | |
| // loong64: "ALSLV [$]2," "SUBVU" "SLLV [$]2," | |
| return x * -20 | |
| } |