llvm-project/llvm/test/CodeGen/AVR/llround-conv.ll
Ayke van Laethem 0408b131eb
[SelectionDAG][AVR] Add support for lrint and lround intrinsics
Integer legalization already supported splitting the output integer of
llround and llrint, but did not support this for lround and lrint yet.
This is not a problem for 32-bit architectures, but for 8/16-bit
architectures like AVR it results in a crash like this:

    ExpandIntegerResult #0: t7: i32 = lround t6

    LLVM ERROR: Do not know how to expand the result of this operator!

This patch simply add lrint/lround to the list of ISD opcodes to expand.

Fixes https://github.com/llvm/llvm-project/issues/59573.

Differential Revision: https://reviews.llvm.org/D140822
2023-01-08 18:56:07 +01:00

52 lines
1.3 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=avr -mcpu=atmega328p | FileCheck %s
define signext i32 @testmsws(float %x) {
; CHECK-LABEL: testmsws:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: call llroundf
; CHECK-NEXT: movw r22, r18
; CHECK-NEXT: movw r24, r20
; CHECK-NEXT: ret
entry:
%0 = tail call i64 @llvm.llround.i64.f32(float %x)
%conv = trunc i64 %0 to i32
ret i32 %conv
}
define i64 @testmsxs(float %x) {
; CHECK-LABEL: testmsxs:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: call llroundf
; CHECK-NEXT: ret
entry:
%0 = tail call i64 @llvm.llround.i64.f32(float %x)
ret i64 %0
}
define signext i32 @testmswd(double %x) {
; CHECK-LABEL: testmswd:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: call llround
; CHECK-NEXT: movw r22, r18
; CHECK-NEXT: movw r24, r20
; CHECK-NEXT: ret
entry:
%0 = tail call i64 @llvm.llround.i64.f64(double %x)
%conv = trunc i64 %0 to i32
ret i32 %conv
}
define i64 @testmsxd(double %x) {
; CHECK-LABEL: testmsxd:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: call llround
; CHECK-NEXT: ret
entry:
%0 = tail call i64 @llvm.llround.i64.f64(double %x)
ret i64 %0
}
declare i64 @llvm.llround.i64.f32(float) nounwind readnone
declare i64 @llvm.llround.i64.f64(double) nounwind readnone