xref: /llvm-project/llvm/test/CodeGen/Lanai/constant_multiply.ll (revision 3dce0326fe7c06561e74dc6c995cd329d376fd9f)
168908c90SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2fcef3e46SJacques Pienaar; RUN: llc < %s | FileCheck %s
3fcef3e46SJacques Pienaar
4fcef3e46SJacques Pienaar; Test custom lowering for 32-bit integer multiplication.
5fcef3e46SJacques Pienaar
6fcef3e46SJacques Pienaartarget datalayout = "E-m:e-p:32:32-i64:64-a:0:32-n32-S64"
7fcef3e46SJacques Pienaartarget triple = "lanai"
8fcef3e46SJacques Pienaar
9fcef3e46SJacques Pienaardefine i32 @f6(i32 inreg %a) #0 {
1068908c90SRoman Lebedev; CHECK-LABEL: f6:
1168908c90SRoman Lebedev; CHECK:       ! %bb.0:
1268908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
1368908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
1468908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
1568908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x1, %r3
1668908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r9
1768908c90SRoman Lebedev; CHECK-NEXT:    sub %r9, %r3, %rv
1868908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
1968908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
2068908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
21fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, 6
22fcef3e46SJacques Pienaar  ret i32 %1
23fcef3e46SJacques Pienaar}
24fcef3e46SJacques Pienaar
25fcef3e46SJacques Pienaardefine i32 @f7(i32 inreg %a) #0 {
2668908c90SRoman Lebedev; CHECK-LABEL: f7:
2768908c90SRoman Lebedev; CHECK:       ! %bb.0:
2868908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
2968908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
3068908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
3168908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r3
3268908c90SRoman Lebedev; CHECK-NEXT:    sub %r3, %r6, %rv
3368908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
3468908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
3568908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
36fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, 7
37fcef3e46SJacques Pienaar  ret i32 %1
38fcef3e46SJacques Pienaar}
39fcef3e46SJacques Pienaar
40fcef3e46SJacques Pienaardefine i32 @f8(i32 inreg %a) #0 {
4168908c90SRoman Lebedev; CHECK-LABEL: f8:
4268908c90SRoman Lebedev; CHECK:       ! %bb.0:
4368908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
4468908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
4568908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
4668908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %rv
4768908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
4868908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
4968908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
50fcef3e46SJacques Pienaar  %1 = shl nsw i32 %a, 3
51fcef3e46SJacques Pienaar  ret i32 %1
52fcef3e46SJacques Pienaar}
53fcef3e46SJacques Pienaar
54fcef3e46SJacques Pienaardefine i32 @f9(i32 inreg %a) #0 {
5568908c90SRoman Lebedev; CHECK-LABEL: f9:
5668908c90SRoman Lebedev; CHECK:       ! %bb.0:
5768908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
5868908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
5968908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
6068908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r3
6168908c90SRoman Lebedev; CHECK-NEXT:    add %r3, %r6, %rv
6268908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
6368908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
6468908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
65fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, 9
66fcef3e46SJacques Pienaar  ret i32 %1
67fcef3e46SJacques Pienaar}
68fcef3e46SJacques Pienaar
69fcef3e46SJacques Pienaardefine i32 @f10(i32 inreg %a) #0 {
7068908c90SRoman Lebedev; CHECK-LABEL: f10:
7168908c90SRoman Lebedev; CHECK:       ! %bb.0:
7268908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
7368908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
7468908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
7568908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x1, %r3
7668908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r9
7768908c90SRoman Lebedev; CHECK-NEXT:    add %r9, %r3, %rv
7868908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
7968908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
8068908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
81fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, 10
82fcef3e46SJacques Pienaar  ret i32 %1
83fcef3e46SJacques Pienaar}
84fcef3e46SJacques Pienaar
85fcef3e46SJacques Pienaardefine i32 @f1280(i32 inreg %a) #0 {
8668908c90SRoman Lebedev; CHECK-LABEL: f1280:
8768908c90SRoman Lebedev; CHECK:       ! %bb.0:
8868908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
8968908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
9068908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
9168908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x8, %r3
9268908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0xa, %r9
9368908c90SRoman Lebedev; CHECK-NEXT:    add %r9, %r3, %rv
9468908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
9568908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
9668908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
97fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, 1280
98fcef3e46SJacques Pienaar  ret i32 %1
99fcef3e46SJacques Pienaar}
100fcef3e46SJacques Pienaar
101fcef3e46SJacques Pienaardefine i32 @fm6(i32 inreg %a) #0 {
10268908c90SRoman Lebedev; CHECK-LABEL: fm6:
10368908c90SRoman Lebedev; CHECK:       ! %bb.0:
10468908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
10568908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
10668908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
10768908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r3
10868908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x1, %r9
10968908c90SRoman Lebedev; CHECK-NEXT:    sub %r9, %r3, %rv
11068908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
11168908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
11268908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
113fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, -6
114fcef3e46SJacques Pienaar  ret i32 %1
115fcef3e46SJacques Pienaar}
116fcef3e46SJacques Pienaar
117fcef3e46SJacques Pienaardefine i32 @fm7(i32 inreg %a) #0 {
11868908c90SRoman Lebedev; CHECK-LABEL: fm7:
11968908c90SRoman Lebedev; CHECK:       ! %bb.0:
12068908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
12168908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
12268908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
12368908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r3
12468908c90SRoman Lebedev; CHECK-NEXT:    sub %r6, %r3, %rv
12568908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
12668908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
12768908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
128fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, -7
129fcef3e46SJacques Pienaar  ret i32 %1
130fcef3e46SJacques Pienaar}
131fcef3e46SJacques Pienaar
132fcef3e46SJacques Pienaardefine i32 @fm8(i32 inreg %a) #0 {
13368908c90SRoman Lebedev; CHECK-LABEL: fm8:
13468908c90SRoman Lebedev; CHECK:       ! %bb.0:
13568908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
13668908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
13768908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
13868908c90SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r3
13968908c90SRoman Lebedev; CHECK-NEXT:    sub %r0, %r3, %rv
14068908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
14168908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
14268908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
143fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, -8
144fcef3e46SJacques Pienaar  ret i32 %1
145fcef3e46SJacques Pienaar}
146fcef3e46SJacques Pienaar
147fcef3e46SJacques Pienaardefine i32 @fm9(i32 inreg %a) #0 {
14868908c90SRoman Lebedev; CHECK-LABEL: fm9:
14968908c90SRoman Lebedev; CHECK:       ! %bb.0:
15068908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
15168908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
15268908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
153*3dce0326SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r3
154*3dce0326SRoman Lebedev; CHECK-NEXT:    add %r6, %r3, %r3
155*3dce0326SRoman Lebedev; CHECK-NEXT:    sub %r0, %r3, %rv
15668908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
15768908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
15868908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
159fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, -9
160fcef3e46SJacques Pienaar  ret i32 %1
161fcef3e46SJacques Pienaar}
162fcef3e46SJacques Pienaar
163fcef3e46SJacques Pienaardefine i32 @fm10(i32 inreg %a) #0 {
16468908c90SRoman Lebedev; CHECK-LABEL: fm10:
16568908c90SRoman Lebedev; CHECK:       ! %bb.0:
16668908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
16768908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
16868908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
169*3dce0326SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x3, %r3
170*3dce0326SRoman Lebedev; CHECK-NEXT:    sh %r6, 0x1, %r9
171*3dce0326SRoman Lebedev; CHECK-NEXT:    add %r9, %r3, %r3
172*3dce0326SRoman Lebedev; CHECK-NEXT:    sub %r0, %r3, %rv
17368908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
17468908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
17568908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
176fcef3e46SJacques Pienaar  %1 = mul nsw i32 %a, -10
177fcef3e46SJacques Pienaar  ret i32 %1
178fcef3e46SJacques Pienaar}
179fcef3e46SJacques Pienaar
180fcef3e46SJacques Pienaardefine i32 @h1(i32 inreg %a) #0 {
18168908c90SRoman Lebedev; CHECK-LABEL: h1:
18268908c90SRoman Lebedev; CHECK:       ! %bb.0:
18368908c90SRoman Lebedev; CHECK-NEXT:    st %fp, [--%sp]
18468908c90SRoman Lebedev; CHECK-NEXT:    add %sp, 0x8, %fp
18568908c90SRoman Lebedev; CHECK-NEXT:    sub %sp, 0x8, %sp
18668908c90SRoman Lebedev; CHECK-NEXT:    mov 0xaaaa0000, %r3
18768908c90SRoman Lebedev; CHECK-NEXT:    add %pc, 0x10, %rca
18868908c90SRoman Lebedev; CHECK-NEXT:    st %rca, [--%sp]
18968908c90SRoman Lebedev; CHECK-NEXT:    bt __mulsi3
19068908c90SRoman Lebedev; CHECK-NEXT:    or %r3, 0xaaab, %r7
19168908c90SRoman Lebedev; CHECK-NEXT:    ld -4[%fp], %pc ! return
19268908c90SRoman Lebedev; CHECK-NEXT:    add %fp, 0x0, %sp
19368908c90SRoman Lebedev; CHECK-NEXT:    ld -8[%fp], %fp
194fcef3e46SJacques Pienaar  %1 = mul i32 %a, -1431655765
195fcef3e46SJacques Pienaar  ret i32 %1
196fcef3e46SJacques Pienaar}
197