brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.7 KiB · f1a8883 Raw
250 lines · plain
1; RUN: llc < %s -mtriple=sparc -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s --check-prefix=CHECK --check-prefix=HARD --check-prefix=CHECK-BE2; RUN: llc < %s -mtriple=sparcel -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s --check-prefix=CHECK --check-prefix=HARD --check-prefix=CHECK-LE3; RUN: llc < %s -mtriple=sparc -disable-sparc-delay-filler -disable-sparc-leaf-proc -mattr=soft-float | FileCheck %s --check-prefix=CHECK --check-prefix=SOFT --check-prefix=CHECK-BE4 5; CHECK-LABEL: intarg:6; The save/restore frame is not strictly necessary here, but we would need to7; refer to %o registers instead.8; CHECK: save %sp, -96, %sp9; CHECK: ld [%fp+96], [[R2:%[gilo][0-7]]]10; CHECK: ld [%fp+92], [[R1:%[gilo][0-7]]]11; CHECK: stb %i0, [%i4]12; CHECK: stb %i1, [%i4]13; CHECK: sth %i2, [%i4]14; CHECK: st  %i3, [%i4]15; CHECK: st  %i4, [%i4]16; CHECK: st  %i5, [%i4]17; CHECK: st  [[R1]], [%i4]18; CHECK: st  [[R2]], [%i4]19; CHECK: restore20define void @intarg(i8  %a0,   ; %i021                    i8  %a1,   ; %i122                    i16 %a2,   ; %i223                    i32 %a3,   ; %i324                    ptr %a4,   ; %i425                    i32 %a5,   ; %i526                    i32 signext %a6,   ; [%fp+92]27                    ptr %a7) { ; [%fp+96]28  store volatile i8 %a0, ptr %a429  store volatile i8 %a1, ptr %a430  %p16 = bitcast ptr %a4 to ptr31  store volatile i16 %a2, ptr %p1632  %p32 = bitcast ptr %a4 to ptr33  store volatile i32 %a3, ptr %p3234  %pp = bitcast ptr %a4 to ptr35  store volatile ptr %a4, ptr %pp36  store volatile i32 %a5, ptr %p3237  store volatile i32 %a6, ptr %p3238  store volatile ptr %a7, ptr %pp39  ret void40}41 42; CHECK-LABEL: call_intarg:43; CHECK: save %sp, -104, %sp44; Use %o0-%o5 for outgoing arguments45; CHECK: mov 5, %o546; CHECK: st %i0, [%sp+92]47; CHECK: call intarg48; CHECK-NOT: add %sp49; CHECK: restore50define void @call_intarg(i32 %i0, ptr %i1) {51  call void @intarg(i8 0, i8 1, i16 2, i32 3, ptr undef, i32 5, i32 %i0, ptr %i1)52  ret void53}54 55;; Verify doubles starting with an even reg, starting with an odd reg,56;; straddling the boundary of regs and mem, and floats in regs and mem.57;58; CHECK-LABEL: floatarg:59; HARD: save %sp, -120, %sp60; HARD: mov %i5, %g261; HARD-NEXT: ld [%fp+92], %g362; HARD-NEXT: mov %i4, %i563; HARD-NEXT: ! kill64; HARD-NEXT: std %g2, [%fp+-24]65; HARD-NEXT: mov %i3, %i466; HARD-NEXT: std %i4, [%fp+-16]67; HARD-NEXT: ! kill68; HARD-NEXT: std %i0, [%fp+-8]69; HARD-NEXT: st %i2, [%fp+-28]70; HARD-NEXT: ld [%fp+104], %f071; HARD-NEXT: ldd [%fp+96], %f272; HARD-NEXT: ld [%fp+-28], %f173; HARD-NEXT: ldd [%fp+-8], %f474; HARD-NEXT: ldd [%fp+-16], %f675; HARD-NEXT: ldd [%fp+-24], %f876; HARD-NEXT: fstod %f1, %f1077; HARD-NEXT: faddd %f4, %f10, %f478; HARD-NEXT: faddd %f6, %f4, %f479; HARD-NEXT: faddd %f8, %f4, %f480; HARD-NEXT: faddd %f2, %f4, %f281; HARD-NEXT: fstod %f0, %f082; HARD-NEXT: faddd %f0, %f2, %f083; SOFT: save %sp, -96, %sp84; SOFT: ld [%fp+104], %l085; SOFT-NEXT: ld [%fp+96], %l186; SOFT-NEXT: ld [%fp+100], %l287; SOFT-NEXT: ld [%fp+92], %l388; SOFT-NEXT:  mov  %i2, %o089; SOFT-NEXT: call __extendsfdf290; SOFT-NEXT: nop91; SOFT-NEXT:  mov  %o0, %o292; SOFT-NEXT:  mov  %o1, %o393; SOFT-NEXT:  mov  %i0, %o094; SOFT-NEXT:  mov  %i1, %o195; SOFT-NEXT:  call __adddf396; SOFT-NEXT:  nop97; SOFT-NEXT:  mov  %o0, %o298; SOFT-NEXT:  mov  %o1, %o399; SOFT-NEXT:  mov  %i3, %o0100; SOFT-NEXT:  mov  %i4, %o1101; SOFT-NEXT:  call __adddf3102; SOFT-NEXT:  nop103; SOFT-NEXT:  mov  %o0, %o2104; SOFT-NEXT:  mov  %o1, %o3105; SOFT-NEXT:  mov  %i5, %o0106; SOFT-NEXT:  mov  %l3, %o1107; SOFT-NEXT:  call __adddf3108; SOFT-NEXT:  nop109; SOFT-NEXT:  mov  %o0, %o2110; SOFT-NEXT:  mov  %o1, %o3111; SOFT-NEXT:  mov  %l1, %o0112; SOFT-NEXT:  mov  %l2, %o1113; SOFT-NEXT:  call __adddf3114; SOFT-NEXT:  nop115; SOFT-NEXT:  mov  %o0, %i0116; SOFT-NEXT:  mov  %o1, %i1117; SOFT-NEXT:  mov  %l0, %o0118; SOFT-NEXT:  call __extendsfdf2119; SOFT-NEXT:  nop120; SOFT-NEXT:  mov  %i0, %o2121; SOFT-NEXT:  mov  %i1, %o3122; SOFT-NEXT:  call __adddf3123; SOFT-NEXT:  nop124; SOFT-NEXT:  mov  %o0, %i0125; SOFT-NEXT:  mov  %o1, %i1126; CHECK: restore127define double @floatarg(double %a0,   ; %i0,%i1128                        float %a1,    ; %i2129                        double %a2,   ; %i3, %i4130                        double %a3,   ; %i5, [%fp+92] (using 4 bytes)131                        double %a4,   ; [%fp+96] (using 8 bytes)132                        float %a5) {  ; [%fp+104] (using 4 bytes)133  %d1 = fpext float %a1 to double134  %s1 = fadd double %a0, %d1135  %s2 = fadd double %a2, %s1136  %s3 = fadd double %a3, %s2137  %s4 = fadd double %a4, %s3138  %d5 = fpext float %a5 to double139  %s5 = fadd double %d5, %s4140  ret double %s5141}142 143; CHECK-LABEL: call_floatarg:144; HARD: save %sp, -112, %sp145; HARD: mov %i2, %o1146; HARD-NEXT: mov %i0, %o2147; HARD-NEXT: mov %i1, %o0148; HARD-NEXT: st %i0, [%sp+104]149; HARD-NEXT: std %o0, [%sp+96]150; HARD-NEXT: st %o1, [%sp+92]151; HARD-NEXT: mov %i1, %o3152; HARD-NEXT: mov %o1, %o4153; HARD-NEXT: mov %i1, %o5154; HARD-NEXT: call floatarg155; HARD: std %f0, [%i4]156; SOFT: mov %i2, %o1157; SOFT-NEXT: mov %i1, %o0158; SOFT-NEXT: mov %i0, %o2159; SOFT-NEXT: st %i0, [%sp+104]160; SOFT-NEXT: st %i2, [%sp+100]161; SOFT-NEXT: st %i1, [%sp+96]162; SOFT-NEXT: st %i2, [%sp+92]163; SOFT-NEXT: mov %i1, %o3164; SOFT-NEXT: mov %i2, %o4165; SOFT-NEXT: mov %i1, %o5166; SOFT-NEXT: call floatarg167; SOFT: std %o0, [%i4]168; CHECK: restore169define void @call_floatarg(float %f1, double %d2, float %f5, ptr %p) {170  %r = call double @floatarg(double %d2, float %f1, double %d2, double %d2,171                             double %d2, float %f1)172  store double %r, ptr %p173  ret void174}175 176;; i64 arguments should effectively work the same as double: split177;; into two locations.  This is different for little-endian vs big178;; endian, since the 64-bit math needs to be split179; CHECK-LABEL: i64arg:180; CHECK:  save %sp, -96, %sp181; CHECK-BE: ld [%fp+104], %g2182; CHECK-BE-NEXT: ld [%fp+100], %g3183; CHECK-BE-NEXT: ld [%fp+96], %g4184; CHECK-BE-NEXT: ld [%fp+92], %l0185; CHECK-BE-NEXT: addcc %i1, %i2, %i1186; CHECK-BE-NEXT: addxcc %i0, 0, %i0187; CHECK-BE-NEXT: addcc %i4, %i1, %i1188; CHECK-BE-NEXT: addxcc %i3, %i0, %i0189; CHECK-BE-NEXT: addcc %l0, %i1, %i1190; CHECK-BE-NEXT: addxcc %i5, %i0, %i0191; CHECK-BE-NEXT: addcc %g3, %i1, %i1192; CHECK-BE-NEXT: addxcc %g4, %i0, %i0193; CHECK-BE-NEXT: addcc %g2, %i1, %i1194; CHECK-BE-NEXT: addxcc %i0, 0, %i0195;196; CHECK-LE: ld [%fp+104], %g2197; CHECK-LE-NEXT: ld [%fp+96], %g3198; CHECK-LE-NEXT: ld [%fp+100], %g4199; CHECK-LE-NEXT: ld [%fp+92], %l0200; CHECK-LE-NEXT: addcc %i0, %i2, %i0201; CHECK-LE-NEXT: addxcc %i1, 0, %i1202; CHECK-LE-NEXT: addcc %i3, %i0, %i0203; CHECK-LE-NEXT: addxcc %i4, %i1, %i1204; CHECK-LE-NEXT: addcc %i5, %i0, %i0205; CHECK-LE-NEXT: addxcc %l0, %i1, %i1206; CHECK-LE-NEXT: addcc %g3, %i0, %i0207; CHECK-LE-NEXT: addxcc %g4, %i1, %i1208; CHECK-LE-NEXT: addcc %g2, %i0, %i0209; CHECK-LE-NEXT: addxcc %i1, 0, %i1210; CHECK-NEXT: restore211 212 213define i64 @i64arg(i64 %a0,    ; %i0,%i1214		   i32 %a1,    ; %i2215		   i64 %a2,    ; %i3, %i4216		   i64 %a3,    ; %i5, [%fp+92] (using 4 bytes)217		   i64 %a4,    ; [%fp+96] (using 8 bytes)218                   i32 %a5) {  ; [%fp+104] (using 4 bytes)219  %a1L = zext i32 %a1 to i64220  %s1 = add i64 %a0, %a1L221  %s2 = add i64 %a2, %s1222  %s3 = add i64 %a3, %s2223  %s4 = add i64 %a4, %s3224  %a5L = zext i32 %a5 to i64225  %s5 = add i64 %a5L, %s4226  ret i64 %s5227}228 229; CHECK-LABEL: call_i64arg:230; CHECK: save %sp, -112, %sp231; CHECK: mov %i2, %o1232; CHECK-NEXT: mov %i1, %o0233; CHECK-NEXT: mov %i0, %o2234; CHECK-NEXT: st %i0, [%sp+104]235; CHECK-NEXT: st %i2, [%sp+100]236; CHECK-NEXT: st %i1, [%sp+96]237; CHECK-NEXT: st %i2, [%sp+92]238; CHECK-NEXT: mov %i1, %o3239; CHECK-NEXT: mov %i2, %o4240; CHECK-NEXT: mov %i1, %o5241; CHECK-NEXT: call i64arg242; CHECK: std %o0, [%i3]243; CHECK-NEXT: restore244 245define void @call_i64arg(i32 %a0, i64 %a1, ptr %p) {246  %r = call i64 @i64arg(i64 %a1, i32 %a0, i64 %a1, i64 %a1, i64 %a1, i32 %a0)247  store i64 %r, ptr %p248  ret void249}250