mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-16 18:35:53 +00:00

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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351523 91177308-0d34-0410-b5e6-96231b3b80d8
23 lines
671 B
LLVM
23 lines
671 B
LLVM
; RUN: llc -mattr=avr6 < %s -march=avr | FileCheck %s
|
|
|
|
define i1 @unsigned_multiplication_did_overflow(i8, i8) unnamed_addr {
|
|
; CHECK-LABEL: unsigned_multiplication_did_overflow:
|
|
entry-block:
|
|
%2 = tail call { i8, i1 } @llvm.umul.with.overflow.i8(i8 %0, i8 %1)
|
|
%3 = extractvalue { i8, i1 } %2, 1
|
|
ret i1 %3
|
|
|
|
; Multiply, return if the high byte is zero
|
|
;
|
|
; CHECK: mul r{{[0-9]+}}, r{{[0-9]+}}
|
|
; CHECK: mov [[HIGH:r[0-9]+]], r1
|
|
; CHECK: ldi [[RET:r[0-9]+]], 1
|
|
; CHECK: cpi {{.*}}[[HIGH]], 0
|
|
; CHECK: brne [[LABEL:LBB[_0-9]+]]
|
|
; CHECK: ldi {{.*}}[[RET]], 0
|
|
; CHECK: {{.*}}[[LABEL]]
|
|
; CHECK: ret
|
|
}
|
|
|
|
declare { i8, i1 } @llvm.umul.with.overflow.i8(i8, i8)
|