blob: 09188f73f4dafe0155b4d3f65908b2e24f8ec45b [file] [log] [blame]
; This tests various strength reduction operations.
; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
; RUN: --target x8632 -i %s --args -O2 \
; RUN: | %if --need=target_X8632 --command FileCheck %s
define internal i32 @mul_i32_arg_5(i32 %arg) {
%result = mul i32 %arg, 5
ret i32 %result
}
; CHECK-LABEL: mul_i32_arg_5
; CHECK: lea [[REG:e..]],{{\[}}[[REG]]+[[REG]]*4]
define internal i32 @mul_i32_5_arg(i32 %arg) {
%result = mul i32 5, %arg
ret i32 %result
}
; CHECK-LABEL: mul_i32_5_arg
; CHECK: lea [[REG:e..]],{{\[}}[[REG]]+[[REG]]*4]
define internal i32 @mul_i32_arg_18(i32 %arg) {
%result = mul i32 %arg, 18
ret i32 %result
}
; CHECK-LABEL: mul_i32_arg_18
; CHECK-DAG: lea [[REG:e..]],{{\[}}[[REG]]+[[REG]]*8]
; CHECK-DAG: shl [[REG]],1
define internal i32 @mul_i32_arg_27(i32 %arg) {
%result = mul i32 %arg, 27
ret i32 %result
}
; CHECK-LABEL: mul_i32_arg_27
; CHECK-DAG: lea [[REG:e..]],{{\[}}[[REG]]+[[REG]]*2]
; CHECK-DAG: lea [[REG]],{{\[}}[[REG]]+[[REG]]*8]
define internal i32 @mul_i32_arg_m45(i32 %arg) {
%result = mul i32 %arg, -45
ret i32 %result
}
; CHECK-LABEL: mul_i32_arg_m45
; CHECK-DAG: lea [[REG:e..]],{{\[}}[[REG]]+[[REG]]*8]
; CHECK-DAG: lea [[REG]],{{\[}}[[REG]]+[[REG]]*4]
; CHECK: neg [[REG]]
define internal i32 @mul_i16_arg_18(i32 %arg) {
%arg.16 = trunc i32 %arg to i16
%result = mul i16 %arg.16, 18
%result.i32 = zext i16 %result to i32
ret i32 %result.i32
}
; CHECK-LABEL: mul_i16_arg_18
; CHECK: imul
define internal i32 @mul_i8_arg_16(i32 %arg) {
%arg.8 = trunc i32 %arg to i8
%result = mul i8 %arg.8, 16
%result.i32 = zext i8 %result to i32
ret i32 %result.i32
}
; CHECK-LABEL: mul_i8_arg_16
; CHECK: shl {{.*}},0x4
define internal i32 @mul_i8_arg_18(i32 %arg) {
%arg.8 = trunc i32 %arg to i8
%result = mul i8 %arg.8, 18
%result.i32 = zext i8 %result to i32
ret i32 %result.i32
}
; CHECK-LABEL: mul_i8_arg_18
; CHECK: imul