brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · a7bfed7 Raw
260 lines · plain
1; We run the tests with both the default optimization level and O0, to make sure2; we don't have any ABI differences between them. In principle, the ABI checks3; should be the same for both optimization levels (there could be exceptions4; from this when a div and a mod with the same operands are not coallesced into5; the same divmod, but luckily this doesn't occur in practice even at O0).6; Sometimes the checks that the correct registers are used after the libcalls7; are different between optimization levels, so we have to separate them.8; RUN: llc -mtriple armv7-none-eabi %s -o - | FileCheck %s --check-prefix=EABI9; RUN: llc -mtriple armv7-none-eabi %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=EABI10; RUN: llc -mtriple armv7-none-eabihf %s -o - | FileCheck %s --check-prefix=EABI11; RUN: llc -mtriple armv7-none-eabihf %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=EABI12; All "eabi" (Bare, GNU and Android) must lower SREM/UREM to __aeabi_{u,i}divmod13; RUN: llc -mtriple armv7-linux-androideabi %s -o - | FileCheck %s --check-prefix=EABI14; RUN: llc -mtriple armv7-linux-androideabi %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=EABI15; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=EABI16; RUN: llc -mtriple armv7-linux-gnueabi %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=EABI17; RUN: llc -mtriple armv7-linux-musleabi %s -o - | FileCheck %s --check-prefix=EABI18; RUN: llc -mtriple armv7-linux-musleabi %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=EABI19; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefixes=DARWIN20; RUN: llc -mtriple armv7-apple-darwin %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefix=DARWIN-O021; RUN: llc -mtriple thumbv7-windows %s -o - | FileCheck %s --check-prefixes=WINDOWS,WINDOWS-DEFAULT22; RUN: llc -mtriple thumbv7-windows %s -o - -O0 -optimize-regalloc | FileCheck %s --check-prefixes=WINDOWS,WINDOWS-O023 24define signext i16 @f16(i16 signext %a, i16 signext %b) {25; EABI-LABEL: f16:26; DARWIN-LABEL: f16:27; DARWIN-O0-LABEL: f16:28; WINDOWS-LABEL: f16:29entry:30  %conv = sext i16 %a to i3231  %conv1 = sext i16 %b to i3232  %div = sdiv i32 %conv, %conv133  %rem = srem i32 %conv, %conv134; EABI: __aeabi_idivmod35; EABI: mov [[div:r[0-9]+]], r036; EABI: mov [[rem:r[0-9]+]], r137; DARWIN: __divmodsi438; DARWIN-O0: __divsi339; DARWIN-O0: __modsi340; WINDOWS: __rt_sdiv41; WINDOWS: __rt_sdiv42; WINDOWS-DEFAULT: add [[sum:r[0-9]+]], r143; WINDOWS-O0: mov [[rem:r[0-9]+]], r144  %rem8 = srem i32 %conv1, %conv45; EABI: __aeabi_idivmod46; DARWIN: __modsi347; DARWIN-O0: __modsi348; WINDOWS: __rt_sdiv49  %add = add nsw i32 %rem, %div50  %add13 = add nsw i32 %add, %rem851  %conv14 = trunc i32 %add13 to i1652; EABI: add r0{{.*}}r153; EABI: sxth r0, r054; WINDOWS-DEFAULT: adds [[sum1:r[0-9]+]], [[sum]], r155; WINDOWS-O0: adds [[sum:r[0-9]+]], [[rem]],56; WINDOWS-O0: add [[sum1:r[0-9]+]], r157; WINDOWS: sxth [[res:r[0-9]+]], [[sum1]]58  ret i16 %conv1459}60 61define i32 @f32(i32 %a, i32 %b) {62; EABI-LABEL: f32:63; DARWIN-LABEL: f32:64; DARWIN-O0-LABEL: f32:65; WINDOWS-LABEL: f32:66entry:67  %div = sdiv i32 %a, %b68  %rem = srem i32 %a, %b69; EABI: __aeabi_idivmod70; EABI: mov [[div:r[0-9]+]], r071; EABI: mov [[rem:r[0-9]+]], r172; DARWIN: ___divmodsi473; DARWIN-O0: __divsi374; DARWIN-O0: __modsi375; WINDOWS: __rt_sdiv76; WINDOWS: mov [[div:r[0-9]+]], r077; WINDOWS: __rt_sdiv78; WINDOWS-DEFAULT: add [[div]], r179  %rem1 = srem i32 %b, %a80; EABI: __aeabi_idivmod81; DARWIN: __modsi382; DARWIN-O0: __modsi383; WINDOWS: __rt_sdiv84  %add = add nsw i32 %rem, %div85  %add2 = add nsw i32 %add, %rem186; EABI: add r0{{.*}}r187; WINDOWS-DEFAULT: adds r0, [[div]], r188; WINDOWS-O0: adds [[sum:r[0-9]+]], [[rem]], [[div]]89; WINDOWS-O0: add [[sum]], r190  ret i32 %add291}92 93define i32 @uf(i32 %a, i32 %b) {94; EABI-LABEL: uf:95; DARWIN-LABEL: uf:96; DARWIN-O0-LABEL: uf:97; WINDOWS-LABEL: uf:98entry:99  %div = udiv i32 %a, %b100  %rem = urem i32 %a, %b101; EABI: __aeabi_uidivmod102; DARWIN: __udivmodsi4103; DARWIN-O0: __udivsi3104; DARWIN-O0: __umodsi3105; WINDOWS: __rt_udiv106; WINDOWS: mov [[div:r[0-9]+]], r0107; WINDOWS: __rt_udiv108; WINDOWS-DEFAULT: add [[div]], r1109  %rem1 = urem i32 %b, %a110; EABI: __aeabi_uidivmod111; DARWIN: __umodsi3112; DARWIN-O0: __umodsi3113; WINDOWS: __rt_udiv114  %add = add nuw i32 %rem, %div115  %add2 = add nuw i32 %add, %rem1116; EABI: add r0{{.*}}r1117; WINDOWS-DEFAULT: adds [[sum:r[0-9]+]], [[div]], r1118; WINDOWS-O0: adds [[sum:r[0-9]+]],119; WINDOWS-O0: add [[sum]], r1120  ret i32 %add2121}122 123define i64 @longf(i64 %a, i64 %b) {124; EABI-LABEL: longf:125; DARWIN-LABEL: longf:126; DARWIN-O0-LABEL: longf:127; WINDOWS-LABEL: longf:128entry:129  %div = sdiv i64 %a, %b130  %rem = srem i64 %a, %b131; EABI: __aeabi_ldivmod132; EABI-NEXT: adds r0133; EABI-NEXT: adc r1134; EABI-NOT: __aeabi_ldivmod135; DARWIN: ___divdi3136; DARWIN: mov [[div1:r[0-9]+]], r0137; DARWIN: mov [[div2:r[0-9]+]], r1138; DARWIN: __moddi3139; DARWIN-O0: __divdi3140; DARWIN-O0: __moddi3141; WINDOWS: __rt_sdiv64142  %add = add nsw i64 %rem, %div143; DARWIN: adds r0{{.*}}[[div1]]144; DARWIN: adc r1{{.*}}[[div2]]145; WINDOWS: adds r0, r0, r2146; WINDOWS: adcs r1, r3147  ret i64 %add148}149 150define i16 @shortf(i16 %a, i16 %b) {151; EABI-LABEL: shortf:152; DARWIN-LABEL: shortf:153; DARWIN-O0-LABEL: shortf:154; WINDOWS-LABEL: shortf:155entry:156  %div = sdiv i16 %a, %b157  %rem = srem i16 %a, %b158; EABI: __aeabi_idivmod159; DARWIN: ___divmodsi4160; DARWIN-O0: __divmodsi4161; WINDOWS: __rt_sdiv162; WINDOWS: mov [[div:r[0-9]+]], r0163; WINDOWS: __rt_sdiv164  %add = add nsw i16 %rem, %div165; EABI: add r0, r1166; WINDOWS: adds r0, r1, [[div]]167  ret i16 %add168}169 170define i32 @g1(i32 %a, i32 %b) {171; EABI-LABEL: g1:172; DARWIN-LABEL: g1:173; DARWIN-O0-LABEL: g1:174; WINDOWS-LABEL: g1:175entry:176  %div = sdiv i32 %a, %b177  %rem = srem i32 %a, %b178; EABI: __aeabi_idivmod179; DARWIN: ___divmodsi4180; DARWIN-O0: __divsi3181; DARWIN-O0: __modsi3182; WINDOWS: __rt_sdiv183; WINDOWS: mov [[div:r[0-9]+]], r0184; WINDOWS: __rt_sdiv185  %add = add nsw i32 %rem, %div186; EABI:	add	r0{{.*}}r1187; WINDOWS: adds r0, r1, [[div]]188  ret i32 %add189}190 191; On both Darwin and Gnu, this is just a call to __modsi3192define i32 @g2(i32 %a, i32 %b) {193; EABI-LABEL: g2:194; DARWIN-LABEL: g2:195; DARWIN-O0-LABEL: g2:196; WINDOWS-LABEL: g2:197entry:198  %rem = srem i32 %a, %b199; EABI: __aeabi_idivmod200; DARWIN: __modsi3201; DARWIN-O0: __modsi3202; WINDOWS: __rt_sdiv203  ret i32 %rem204; EABI:	mov	r0, r1205; WINDOWS: mov  r0, r1206}207 208define i32 @g3(i32 %a, i32 %b) {209; EABI-LABEL: g3:210; DARWIN-LABEL: g3:211; DARWIN-O0-LABEL: g3:212; WINDOWS-LABEL: g3:213entry:214  %rem = srem i32 %a, %b215; EABI: __aeabi_idivmod216; EABI: mov [[mod:r[0-9]+]], r1217; DARWIN: __modsi3218; DARWIN: mov [[sum:r[0-9]+]], r0219; DARWIN-O0: __modsi3220; WINDOWS: __rt_sdiv221; WINDOWS: mov [[arg:r[0-9]+]], r1222; WINDOWS: mov [[rem:r[0-9]+]], r1223  %rem1 = srem i32 %b, %rem224; EABI: __aeabi_idivmod225; DARWIN: __modsi3226; DARWIN-O0: __modsi3227; WINDOWS: __rt_sdiv228  %add = add nsw i32 %rem1, %rem229; EABI: add r0, r1, [[mod]]230; DARWIN: add r0{{.*}}[[sum]]231; WINDOWS: adds r0, r1, [[rem]]232  ret i32 %add233}234 235define i32 @g4(i32 %a, i32 %b) {236; EABI-LABEL: g4:237; DARWIN-LABEL: g4:238; DARWIN-O0-LABEL: g4:239; WINDOWS-LABEL: g4:240entry:241  %div = sdiv i32 %a, %b242; EABI: __aeabi_idiv{{$}}243; EABI: mov [[div:r[0-9]+]], r0244; DARWIN: ___divsi3245; DARWIN: mov [[sum:r[0-9]+]], r0246; DARWIN-O0: __divsi3247; WINDOWS: __rt_sdiv248; WINDOWS: mov [[div:r[0-9]+]], r0249  %rem = srem i32 %b, %div250; EABI: __aeabi_idivmod251; DARWIN: __modsi3252; DARWIN-O0: __modsi3253; WINDOWS: __rt_sdiv254  %add = add nsw i32 %rem, %div255; EABI: add r0, r1, [[div]]256; DARWIN: add r0{{.*}}[[sum]]257; WINDOWS: adds r0, r1, [[div]]258  ret i32 %add259}260