Changeset 24bd23a in mainline


Ignore:
Timestamp:
2005-09-07T08:34:16Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
909c6e3
Parents:
7248e31
Message:

Optimize assembler code according to the knoweledge of IA-32 ABI.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/src/asm.S

    r7248e31 r24bd23a  
    5555#
    5656paging_on:
    57         pushl %eax
    58         movl %cr0,%eax
    59         orl $(1<<31),%eax               # paging on
    60         andl $~((1<<30)|(1<<29)),%eax   # clear Cache Disable and not Write Though
    61         movl %eax,%cr0
     57        movl %cr0,%edx
     58        orl $(1<<31),%edx               # paging on
     59        andl $~((1<<30)|(1<<29)),%edx   # clear Cache Disable and not Write Though
     60        movl %edx,%cr0
    6261        jmp 0f
    63620:
    64         popl %eax
    6563        ret
    6664
     
    7169#
    7270enable_l_apic_in_msr:
    73         pusha
    74        
     71        push %eax
     72
    7573        movl $0x1b, %ecx
    7674        rdmsr
     
    7876        orl $(0xfee00000),%eax
    7977        wrmsr
    80        
    81         popa
     78
     79        pop %eax
    8280        ret
    8381
     
    116114
    117115# CLNT
    118   pushfl;
    119         pop %eax;
    120         and $0xFFFFBFFF,%eax;
    121         push %eax;
    122         popfl;
     116        pushfl
     117        pop %eax
     118        and $0xFFFFBFFF,%eax
     119        push %eax
     120        popfl
    123121       
    124122
    125123
    126124# Test if this is interrupt with error word or not
    127         mov $\i,%cl;
    128         movl $1,%eax;
    129         test $0xe0,%cl;
    130         jnz 0f;
    131         and $0x1f,%cl;
    132         shl %cl,%eax;
    133         and $ERROR_WORD_INTERRUPT_LIST,%eax;
    134         jz 0f;
     125        mov $\i,%cl
     126        movl $1,%eax
     127        test $0xe0,%cl
     128        jnz 0f
     129        and $0x1f,%cl
     130        shl %cl,%eax
     131        and $ERROR_WORD_INTERRUPT_LIST,%eax
     132        jz 0f
    135133
    136134
    137135# Return with error word
    138         popa;
    139         pop %ebp;
    140         add $4,%esp;    # Skip error word
    141         iret;
     136        popa
     137        pop %ebp
     138        add $4,%esp     # Skip error word
     139        iret
    142140
    1431410:
     
    168166#
    169167inb:
    170         push %edx
    171168        xorl %eax,%eax
     169        movl 4(%esp),%edx
     170        inb %dx,%al
     171        ret
     172
     173
     174## I/O input (word)
     175#
     176# Get a word from I/O port and store it AX.
     177#
     178inw:
     179        xorl %eax,%eax
     180        movl 4(%esp),%edx
     181        inw %dx,%ax
     182        ret
     183
     184
     185## I/O input (dword)
     186#
     187# Get a dword from I/O port and store it EAX.
     188#
     189inl:
     190        xorl %eax,%eax
     191        movl 4(%esp),%edx
     192        inl %dx,%eax
     193        ret
     194
     195
     196## I/O output (byte)
     197#
     198# Send a byte to I/O port.
     199#
     200outb:
     201        push %eax
     202
    172203        movl 8(%esp),%edx
    173         inb %dx,%al
    174         pop %edx
    175         ret
    176 
    177 
    178 ## I/O input (word)
    179 #
    180 # Get a word from I/O port and store it AX.
    181 #
    182 inw:
    183         push %edx
    184         xorl %eax,%eax
     204        movl 12(%esp),%eax
     205        outb %al,%dx
     206
     207        pop %eax
     208        ret
     209
     210
     211## I/O output (word)
     212#
     213# Send a word to I/O port.
     214#
     215outw:
     216        push %eax
     217
    185218        movl 8(%esp),%edx
    186         inw %dx,%ax
    187         pop %edx
    188         ret
    189 
    190 
    191 ## I/O input (dword)
    192 #
    193 # Get a dword from I/O port and store it EAX.
    194 #
    195 inl:
    196         push %edx
    197         xorl %eax,%eax
     219        movl 12(%esp),%eax
     220        outw %ax,%dx
     221
     222        pop %eax
     223        ret
     224
     225
     226## I/O output (dword)
     227#
     228# Send a dword to I/O port.
     229#
     230outl:
     231        push %eax
     232
    198233        movl 8(%esp),%edx
    199         inl %dx,%eax
    200         pop %edx
    201         ret
    202 
    203 
    204 ## I/O output (byte)
    205 #
    206 # Send a byte to I/O port.
    207 #
    208 outb:
    209         push %ebp
    210         movl %esp,%ebp
    211         pusha
    212 
    213         movl 8(%ebp),%edx
    214         movl 12(%ebp),%eax
    215         outb %al,%dx
    216 
    217         popa
    218         pop %ebp
    219         ret
    220 
    221 
    222 ## I/O output (word)
    223 #
    224 # Send a word to I/O port.
    225 #
    226 outw:
    227         push %ebp
    228         movl %esp,%ebp
    229         pusha
    230 
    231         movl 8(%ebp),%edx
    232         movl 12(%ebp),%eax
    233         outw %ax,%dx
    234 
    235         popa
    236         pop %ebp
    237         ret
    238 
    239 
    240 ## I/O output (dword)
    241 #
    242 # Send a dword to I/O port.
    243 #
    244 outl:
    245         push %ebp
    246         movl %esp,%ebp
    247         pusha
    248 
    249         movl 8(%ebp),%edx
    250         movl 12(%ebp),%eax
     234        movl 12(%esp),%eax
    251235        outl %eax,%dx
    252236
    253         popa
    254         pop %ebp
     237        pop %eax
    255238        ret
    256239
     
    263246# The memory areas cannot overlap.
    264247#
    265 SRC=12
    266 DST=8
    267 CNT=16
     248SRC=16
     249DST=12
     250CNT=20
    268251memcpy:
    269         push %ebp
    270         movl %esp,%ebp
    271         pusha
    272 
    273         cld
    274         movl CNT(%ebp),%ecx
    275         movl DST(%ebp),%edi
    276         movl SRC(%ebp),%esi
     252        push %esi
     253        push %edi
     254
     255        movl CNT(%esp),%ecx
     256        movl DST(%esp),%edi
     257        movl SRC(%esp),%esi
    277258
    278259        rep movsb %ds:(%esi),%es:(%edi)
    279260
    280         popa
    281         pop %ebp
     261        pop %edi
     262        pop %esi
    282263        ret
    283264
     
    289270# byte value defined by 3rd argument.
    290271#
    291 DST=8
    292 CNT=12
    293 X=16
     272DST=12
     273CNT=16
     274X=20
    294275memsetb:
    295         push %ebp
    296         movl %esp,%ebp
    297         pusha
    298 
    299         cld
    300         movl CNT(%ebp),%ecx
    301         movl DST(%ebp),%edi
    302         movl X(%ebp),%eax
     276        push %eax
     277        push %edi
     278
     279        movl CNT(%esp),%ecx
     280        movl DST(%esp),%edi
     281        movl X(%esp),%eax
    303282
    304283        rep stosb %al,%es:(%edi)
    305284
    306         popa
    307         pop %ebp
     285        pop %edi
     286        pop %eax
    308287        ret
    309288
     
    315294# word value defined by 3rd argument.
    316295#
    317 DST=8
    318 CNT=12
    319 X=16
     296DST=12
     297CNT=16
     298X=20
    320299memsetw:
    321         push %ebp
    322         movl %esp,%ebp
    323         pusha
    324 
    325         cld
    326         movl CNT(%ebp),%ecx
    327         movl DST(%ebp),%edi
    328         movl X(%ebp),%eax
     300        push %eax
     301        push %edi
     302
     303        movl CNT(%esp),%ecx
     304        movl DST(%esp),%edi
     305        movl X(%esp),%eax
    329306
    330307        rep stosw %ax,%es:(%edi)
    331308
    332         popa
    333         pop %ebp
     309        pop %edi
     310        pop %eax
     311
    334312        ret
    335313
     
    346324CNT=20
    347325memcmp:
    348         push %ebp
    349         subl $4,%esp   
    350         movl %esp,%ebp
    351 
    352         pusha
    353 
    354         cld
    355         movl CNT(%ebp),%ecx
    356         movl DST(%ebp),%edi
    357         movl SRC(%ebp),%esi
     326        push %esi
     327        push %edi
     328
     329        movl CNT(%esp),%ecx
     330        movl DST(%esp),%edi
     331        movl SRC(%esp),%esi
    358332
    359333        repe cmpsb %es:(%edi),%ds:(%esi)
    360         movl %ecx,(%ebp)
    361 
    362         popa
    363        
    364         movl (%ebp),%eax        # return value => %eax (zero on success)
    365         addl $4,%esp
    366         pop %ebp
     334        movl %ecx,%eax          # %ecx contains the return value (zero on success)
     335
     336        pop %edi
     337        pop %esi
    367338       
    368339        ret
     
    372343.global utext
    373344utext:
    374         xor %ax,%ax;
    375         mov %ax,%ds;
    376         mov %ax,%es;
    377         mov %ax,%fs;
    378         mov %ax,%gs;
     345        xor %ax,%ax
     346        mov %ax,%ds
     347        mov %ax,%es
     348        mov %ax,%fs
     349        mov %ax,%gs
    3793500:
    380351        int $48
Note: See TracChangeset for help on using the changeset viewer.