mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
e48d05bbd3
This change modifies the LLVM ISel lowering settings so that 8-bit/16-bit multiplication is expanded to calls into the compiler runtime library if the MCU being targeted does not support multiplication in hardware. Before this, MUL instructions would be generated on CPUs like the ATtiny85, triggering a CPU reset due to an illegal instruction at runtime. First raised in https://github.com/avr-rust/rust/issues/124. llvm-svn: 351523
31 lines
668 B
LLVM
31 lines
668 B
LLVM
; RUN: llc -mattr=mul,movw < %s -march=avr | FileCheck %s
|
|
|
|
; Tests lowering of multiplication to hardware instructions.
|
|
|
|
define i8 @mult8(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: mult8:
|
|
; CHECK: muls r22, r24
|
|
; CHECK: clr r1
|
|
; CHECK: mov r24, r0
|
|
%mul = mul i8 %b, %a
|
|
ret i8 %mul
|
|
}
|
|
|
|
define i16 @mult16(i16 %a, i16 %b) {
|
|
; CHECK-LABEL: mult16:
|
|
; CHECK: muls r22, r25
|
|
; CHECK: mov r18, r0
|
|
; CHECK: mul r22, r24
|
|
; CHECK: mov r19, r0
|
|
; CHECK: mov r20, r1
|
|
; CHECK: clr r1
|
|
; CHECK: add r20, r18
|
|
; CHECK: muls r23, r24
|
|
; CHECK: clr r1
|
|
; CHECK: mov r22, r0
|
|
; CHECK: add r22, r20
|
|
; :TODO: finish after reworking shift instructions
|
|
%mul = mul nsw i16 %b, %a
|
|
ret i16 %mul
|
|
}
|