LINUX.ORG.RU

История изменений

Исправление I-Love-Microsoft, (текущая версия) :

-bash-4.2$ cat test002.s
        .file   "test002.c"

.section ".text"
.global $array_max_f
$array_max_f:
.ignore ld_st_style
.ignore strict_delay
 {
   disp %ctpr1, $#__local_label_in_array_max_f__88
   setwd wsz = 0x7, nfx = 0x1
   setbn rsz = 0x1, rbs = 0x5, rcur = 0x0 
   setbp psz = 0x0
   subs,1 %r1, 0x1, %g16
   addd,2,sm 0x0, %dr0, %dr4
   adds,3 0x0, _f32s,_lts2 0x800000, %r8
 }
 {
   return %ctpr3
   cmplesb,0 %r1, 0x0, %pred0
   cmplesb,1,sm %g16, _f16s,_lts0lo 0xffff, %pred1
   sxt,2,sm 0x2, %r1, %dg16
   addd,3,sm 0x0, _f64,_lts1 0xff2000000000, %dr7
 }
   shld,1,sm %dg16, 0x2, %dr6
 {
   merges,0,sm 0x1, %r1, %g16,  ~ %pred1
   scrs,1 0x1, 0x9, %r0 ? %pred0
 }
   sxt,0,sm 0x6, %g16, %dr5
 {
   ct %ctpr1 ? ~ %pred0
   ipd 3
 }
   nop
 {
   ct %ctpr3 ? %pred0
   ipd 3
 }
$#__local_label_in_array_max_f__88:
 {
   disp %ctpr1, $#__local_label_in_array_max_f__d0
   setwd wsz = 0x7, nfx = 0x1
   setbn rsz = 0x1, rbs = 0x5, rcur = 0x0 
   setbp psz = 0x0
   insfd,0 %dr7, _f32s,_lts1 0x800, %dr5, %dg16
   subd,1,sm %dr6, 0x4, %dg17
   adds,2,sm 0x0, %r8, %r0
 }
 {
   nop 2
   return %ctpr3
   rwd,0 %dg16, %lsr
   subd,1,sm %dg17, 0x4, %db[2]
   ldw,2,sm %dr4, %dg17, %b[3]
 }
   nop
$#__local_label_in_array_max_f__d0:
 {
   loop_mode
   fcmpltsb,1,sm %r0, %b[3], %pred0
 }
   loop_mode
 {
   loop_mode
   nop 1
   ldw,2,sm %dr4, %db[2], %b[1]
   subd,5,sm %db[2], 0x4, %db[0]
 }
 {
   loop_mode
   ct %ctpr1 ? #NOT_LOOP_END
   ipd 3
   abn abnf=1, abnt=1
   abp abpf=1, abpt=1 
   alc alcf=1, alct=1 
   merges,2,sm %r0, %b[3], %r0, %pred0
 }
 {
   setwd wsz = 0x7, nfx = 0x1
   setbn rsz = 0x1, rbs = 0x5, rcur = 0x0 
   setbp psz = 0x0
   adds,0,sm 0x0, %r0, %g16
 }
 {
   ct %ctpr3
   ipd 3
   adds,0 0x0, %g16, %r0
 }
.size $array_max_f, . - $array_max_f
.type $array_max_f, @function

        .weak   $elbrus_optimizing_compiler_v1.19.10_Oct_15_2014
        .set    $elbrus_optimizing_compiler_v1.19.10_Oct_15_2014, 0

-bash-4.2$

Выхлоп оказался во много раз длинее чем на интеле:

cat test002.s 
        .file   "test002.c"
        .text
        .p2align 4,,15
        .globl  array_max_f
        .type   array_max_f, @function
array_max_f:
.LFB0:
        .cfi_startproc
        movslq  %esi, %rax
        movss   .LC0(%rip), %xmm0
        leaq    -4(%rdi,%rax,4), %rax
        jmp     .L2
        .p2align 4,,10
        .p2align 3
.L4:
        movss   (%rax), %xmm1
        subl    $1, %esi
        maxss   %xmm0, %xmm1
        subq    $4, %rax
        movaps  %xmm1, %xmm0
.L2:
        testl   %esi, %esi
        jg      .L4
        rep ret
        .cfi_endproc
.LFE0:
        .size   array_max_f, .-array_max_f
        .section        .rodata.cst4,"aM",@progbits,4
        .align 4
.LC0:
        .long   8388608
        .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
        .section        .note.GNU-stack,"",@progbits

Исходная версия I-Love-Microsoft, :

-bash-4.2$ cat test002.s
        .file   "test002.c"

.section ".text"
.global $array_max_f
$array_max_f:
.ignore ld_st_style
.ignore strict_delay
 {
   disp %ctpr1, $#__local_label_in_array_max_f__88
   setwd wsz = 0x7, nfx = 0x1
   setbn rsz = 0x1, rbs = 0x5, rcur = 0x0 
   setbp psz = 0x0
   subs,1 %r1, 0x1, %g16
   addd,2,sm 0x0, %dr0, %dr4
   adds,3 0x0, _f32s,_lts2 0x800000, %r8
 }
 {
   return %ctpr3
   cmplesb,0 %r1, 0x0, %pred0
   cmplesb,1,sm %g16, _f16s,_lts0lo 0xffff, %pred1
   sxt,2,sm 0x2, %r1, %dg16
   addd,3,sm 0x0, _f64,_lts1 0xff2000000000, %dr7
 }
   shld,1,sm %dg16, 0x2, %dr6
 {
   merges,0,sm 0x1, %r1, %g16,  ~ %pred1
   scrs,1 0x1, 0x9, %r0 ? %pred0
 }
   sxt,0,sm 0x6, %g16, %dr5
 {
   ct %ctpr1 ? ~ %pred0
   ipd 3
 }
   nop
 {
   ct %ctpr3 ? %pred0
   ipd 3
 }
$#__local_label_in_array_max_f__88:
 {
   disp %ctpr1, $#__local_label_in_array_max_f__d0
   setwd wsz = 0x7, nfx = 0x1
   setbn rsz = 0x1, rbs = 0x5, rcur = 0x0 
   setbp psz = 0x0
   insfd,0 %dr7, _f32s,_lts1 0x800, %dr5, %dg16
   subd,1,sm %dr6, 0x4, %dg17
   adds,2,sm 0x0, %r8, %r0
 }
 {
   nop 2
   return %ctpr3
   rwd,0 %dg16, %lsr
   subd,1,sm %dg17, 0x4, %db[2]
   ldw,2,sm %dr4, %dg17, %b[3]
 }
   nop
$#__local_label_in_array_max_f__d0:
 {
   loop_mode
   fcmpltsb,1,sm %r0, %b[3], %pred0
 }
   loop_mode
 {
   loop_mode
   nop 1
   ldw,2,sm %dr4, %db[2], %b[1]
   subd,5,sm %db[2], 0x4, %db[0]
 }
 {
   loop_mode
   ct %ctpr1 ? #NOT_LOOP_END
   ipd 3
   abn abnf=1, abnt=1
   abp abpf=1, abpt=1 
   alc alcf=1, alct=1 
   merges,2,sm %r0, %b[3], %r0, %pred0
 }
 {
   setwd wsz = 0x7, nfx = 0x1
   setbn rsz = 0x1, rbs = 0x5, rcur = 0x0 
   setbp psz = 0x0
   adds,0,sm 0x0, %r0, %g16
 }
 {
   ct %ctpr3
   ipd 3
   adds,0 0x0, %g16, %r0
 }
.size $array_max_f, . - $array_max_f
.type $array_max_f, @function

        .weak   $elbrus_optimizing_compiler_v1.19.10_Oct_15_2014
        .set    $elbrus_optimizing_compiler_v1.19.10_Oct_15_2014, 0

-bash-4.2$