• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; Test the a=b*b lowering sequence which can use a single temporary register
2; instead of two registers.
3
4; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
5; RUN:   --target x8632 -i %s --args -O2 -mattr=sse4.1 \
6; RUN:   | %if --need=target_X8632 --command FileCheck %s
7
8; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
9; RUN:   --target x8632 -i %s --args -Om1 -mattr=sse4.1 \
10; RUN:   | %if --need=target_X8632 --command FileCheck %s
11
12; RUN: %if --need=target_MIPS32 --need=allow_dump \
13; RUN:   --command %p2i --filetype=asm --assemble --disassemble --target \
14; RUN:   mips32 -i %s --args -O2 -allow-externally-defined-symbols \
15; RUN:   | %if --need=target_MIPS32 --need=allow_dump \
16; RUN:   --command FileCheck --check-prefix MIPS32 %s
17
18define internal float @Square_float(float %a) {
19entry:
20  %result = fmul float %a, %a
21  ret float %result
22}
23; CHECK-LABEL: Square_float
24; CHECK: mulss [[REG:xmm.]],[[REG]]
25; MIPS32-LABEL: Square_float
26; MIPS32: 	mov.s
27; MIPS32: 	mul.s
28
29define internal double @Square_double(double %a) {
30entry:
31  %result = fmul double %a, %a
32  ret double %result
33}
34; CHECK-LABEL: Square_double
35; CHECK: mulsd [[REG:xmm.]],[[REG]]
36; MIPS32-LABEL: Square_double
37; MIPS32: 	mov.d
38; MIPS32: 	mul.d
39
40define internal i32 @Square_i32(i32 %a) {
41entry:
42  %result = mul i32 %a, %a
43  ret i32 %result
44}
45; CHECK-LABEL: Square_i32
46; CHECK: imul [[REG:e..]],[[REG]]
47; MIPS32-LABEL: Square_i32
48; MIPS32: 	move
49; MIPS32: 	mul
50
51define internal i32 @Square_i16(i32 %a) {
52entry:
53  %a.16 = trunc i32 %a to i16
54  %result = mul i16 %a.16, %a.16
55  %result.i32 = sext i16 %result to i32
56  ret i32 %result.i32
57}
58; CHECK-LABEL: Square_i16
59; CHECK: imul [[REG:..]],[[REG]]
60; MIPS32-LABEL: Square_i16
61; MIPS32: 	move
62; MIPS32: 	mul
63; MIPS32: 	sll
64; MIPS32: 	sra
65
66define internal i32 @Square_i8(i32 %a) {
67entry:
68  %a.8 = trunc i32 %a to i8
69  %result = mul i8 %a.8, %a.8
70  %result.i32 = sext i8 %result to i32
71  ret i32 %result.i32
72}
73; CHECK-LABEL: Square_i8
74; CHECK: imul al
75; MIPS32-LABEL: Square_i8
76; MIPS32: 	move
77; MIPS32: 	mul
78; MIPS32: 	sll
79; MIPS32: 	sra
80
81define internal <4 x float> @Square_v4f32(<4 x float> %a) {
82entry:
83  %result = fmul <4 x float> %a, %a
84  ret <4 x float> %result
85}
86; CHECK-LABEL: Square_v4f32
87; CHECK: mulps [[REG:xmm.]],[[REG]]
88
89define internal <4 x i32> @Square_v4i32(<4 x i32> %a) {
90entry:
91  %result = mul <4 x i32> %a, %a
92  ret <4 x i32> %result
93}
94; CHECK-LABEL: Square_v4i32
95; CHECK: pmulld [[REG:xmm.]],[[REG]]
96
97define internal <8 x i16> @Square_v8i16(<8 x i16> %a) {
98entry:
99  %result = mul <8 x i16> %a, %a
100  ret <8 x i16> %result
101}
102; CHECK-LABEL: Square_v8i16
103; CHECK: pmullw [[REG:xmm.]],[[REG]]
104
105define internal <16 x i8> @Square_v16i8(<16 x i8> %a) {
106entry:
107  %result = mul <16 x i8> %a, %a
108  ret <16 x i8> %result
109}
110; CHECK-LABEL: Square_v16i8
111; CHECK-NOT: pmul
112