brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · be075e5 Raw
161 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -avr-shift-expand -S %s -o - | FileCheck %s3 4; The avr-shift-expand pass expands large shifts with a non-constant shift5; amount to a loop. These loops avoid generating a (non-existing) builtin such6; as __ashlsi3.7 8target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"9target triple = "avr"10 11define i16 @shl16(i16 %value, i16 %amount) addrspace(1) {12; CHECK-LABEL: @shl16(13; CHECK-NEXT:    [[RESULT:%.*]] = shl i16 [[VALUE:%.*]], [[AMOUNT:%.*]]14; CHECK-NEXT:    ret i16 [[RESULT]]15;16  %result = shl i16 %value, %amount17  ret i16 %result18}19 20define i32 @shl32(i32 %value, i32 %amount) addrspace(1) {21; CHECK-LABEL: @shl32(22; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i823; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 024; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]25; CHECK:       shift.loop:26; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]27; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]28; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 129; CHECK-NEXT:    [[TMP6]] = shl i32 [[TMP4]], 130; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 031; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]32; CHECK:       shift.done:33; CHECK-NEXT:    [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]34; CHECK-NEXT:    ret i32 [[TMP8]]35;36  %result = shl i32 %value, %amount37  ret i32 %result38}39 40define i40 @shl40(i40 %value, i40 %amount) addrspace(1) {41; CHECK-LABEL: @shl40(42; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i843; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 044; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]45; CHECK:       shift.loop:46; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]47; CHECK-NEXT:    [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]48; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 149; CHECK-NEXT:    [[TMP6]] = shl i40 [[TMP4]], 150; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 051; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]52; CHECK:       shift.done:53; CHECK-NEXT:    [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]54; CHECK-NEXT:    ret i40 [[TMP8]]55;56  %result = shl i40 %value, %amount57  ret i40 %result58}59 60; ------------------------------------------------------------------------------61 62define i16 @lshr16(i16 %value, i16 %amount) addrspace(1) {63; CHECK-LABEL: @lshr16(64; CHECK-NEXT:    [[RESULT:%.*]] = lshr i16 [[VALUE:%.*]], [[AMOUNT:%.*]]65; CHECK-NEXT:    ret i16 [[RESULT]]66;67  %result = lshr i16 %value, %amount68  ret i16 %result69}70 71define i32 @lshr32(i32 %value, i32 %amount) addrspace(1) {72; CHECK-LABEL: @lshr32(73; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i874; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 075; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]76; CHECK:       shift.loop:77; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]78; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]79; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 180; CHECK-NEXT:    [[TMP6]] = lshr i32 [[TMP4]], 181; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 082; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]83; CHECK:       shift.done:84; CHECK-NEXT:    [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]85; CHECK-NEXT:    ret i32 [[TMP8]]86;87  %result = lshr i32 %value, %amount88  ret i32 %result89}90 91define i40 @lshr40(i40 %value, i40 %amount) addrspace(1) {92; CHECK-LABEL: @lshr40(93; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i894; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 095; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]96; CHECK:       shift.loop:97; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]98; CHECK-NEXT:    [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]99; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1100; CHECK-NEXT:    [[TMP6]] = lshr i40 [[TMP4]], 1101; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0102; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]103; CHECK:       shift.done:104; CHECK-NEXT:    [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]105; CHECK-NEXT:    ret i40 [[TMP8]]106;107  %result = lshr i40 %value, %amount108  ret i40 %result109}110 111; ------------------------------------------------------------------------------112 113define i16 @ashr16(i16 %value, i16 %amount) addrspace(1) {114; CHECK-LABEL: @ashr16(115; CHECK-NEXT:    [[RESULT:%.*]] = ashr i16 [[VALUE:%.*]], [[AMOUNT:%.*]]116; CHECK-NEXT:    ret i16 [[RESULT]]117;118  %result = ashr i16 %value, %amount119  ret i16 %result120}121 122define i32 @ashr32(i32 %value, i32 %amount) addrspace(1) {123; CHECK-LABEL: @ashr32(124; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8125; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0126; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]127; CHECK:       shift.loop:128; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]129; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]130; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1131; CHECK-NEXT:    [[TMP6]] = ashr i32 [[TMP4]], 1132; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0133; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]134; CHECK:       shift.done:135; CHECK-NEXT:    [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]136; CHECK-NEXT:    ret i32 [[TMP8]]137;138  %result = ashr i32 %value, %amount139  ret i32 %result140}141 142define i40 @ashr40(i40 %value, i40 %amount) addrspace(1) {143; CHECK-LABEL: @ashr40(144; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i8145; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0146; CHECK-NEXT:    br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]147; CHECK:       shift.loop:148; CHECK-NEXT:    [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]149; CHECK-NEXT:    [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]150; CHECK-NEXT:    [[TMP5]] = sub i8 [[TMP3]], 1151; CHECK-NEXT:    [[TMP6]] = ashr i40 [[TMP4]], 1152; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0153; CHECK-NEXT:    br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]154; CHECK:       shift.done:155; CHECK-NEXT:    [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]156; CHECK-NEXT:    ret i40 [[TMP8]]157;158  %result = ashr i40 %value, %amount159  ret i40 %result160}161