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