Home | History | Annotate | Download | only in mips
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ART_RUNTIME_ARCH_MIPS_ASM_SUPPORT_MIPS_S_
     18 #define ART_RUNTIME_ARCH_MIPS_ASM_SUPPORT_MIPS_S_
     19 
     20 #include "asm_support_mips.h"
     21 
     22 // Define special registers.
     23 
     24 // Register holding suspend check count down.
     25 #define rSUSPEND $s0
     26 // Register holding Thread::Current().
     27 #define rSELF $s1
     28 
     29      // Declare a function called name, sets up $gp.
     30 .macro ENTRY name
     31     .type \name, %function
     32     .global \name
     33     // Cache alignment for function entry.
     34     .balign 16
     35 \name:
     36     .cfi_startproc
     37      // Ensure we get a sane starting CFA.
     38     .cfi_def_cfa $sp,0
     39     // Load $gp. We expect that ".set noreorder" is in effect.
     40     .cpload $t9
     41     // Declare a local convenience label to be branched to when $gp is already set up.
     42 .L\name\()_gp_set:
     43 .endm
     44 
     45      // Declare a function called name, doesn't set up $gp.
     46 .macro ENTRY_NO_GP name
     47     .type \name, %function
     48     .global \name
     49     // Cache alignment for function entry.
     50     .balign 16
     51 \name:
     52     .cfi_startproc
     53      // Ensure we get a sane starting CFA.
     54     .cfi_def_cfa $sp,0
     55 .endm
     56 
     57 .macro END name
     58     .cfi_endproc
     59     .size \name, .-\name
     60 .endm
     61 
     62 .macro UNIMPLEMENTED name
     63     ENTRY \name
     64     break
     65     break
     66     END \name
     67 .endm
     68 
     69 #if defined(__mips_isa_rev) && __mips_isa_rev > 2
     70   /* mips32r5 & mips32r6 have mthc1 op, and have 64-bit fp regs,
     71      and in FPXX abi we avoid referring to odd-numbered fp regs */
     72 
     73 /* LDu: Load 64-bit floating-point value to float reg feven,
     74    from unaligned (mod-4-aligned) mem location disp(base) */
     75 .macro LDu feven,fodd,disp,base,temp
     76   l.s   \feven, \disp(\base)
     77   lw    \temp, \disp+4(\base)
     78   mthc1 \temp, \feven
     79 .endm
     80 
     81 /* SDu: Store 64-bit floating-point value from float reg feven,
     82    to unaligned (mod-4-aligned) mem location disp(base) */
     83 .macro SDu feven,fodd,disp,base,temp
     84   mfhc1 \temp, \feven
     85   s.s   \feven, \disp(\base)
     86   sw    \temp, \disp+4(\base)
     87 .endm
     88 
     89 /* MTD: Move double, from general regpair (reven,rodd)
     90         to float regpair (feven,fodd) */
     91 .macro MTD reven,rodd,feven,fodd
     92   mtc1  \reven, \feven
     93   mthc1 \rodd, \feven
     94 .endm
     95 
     96 #else
     97   /* mips32r1 has no mthc1 op;
     98      mips32r1 and mips32r2 use 32-bit floating point register mode (FR=0),
     99      and always hold doubles as (feven, fodd) fp reg pair */
    100 
    101 .macro LDu feven,fodd,disp,base,temp
    102   l.s   \feven, \disp(\base)
    103   l.s   \fodd,  \disp+4(\base)
    104 .endm
    105 
    106 .macro SDu feven,fodd,disp,base,temp
    107   s.s   \feven, \disp(\base)
    108   s.s   \fodd,  \disp+4(\base)
    109 .endm
    110 
    111 .macro MTD reven,rodd,feven,fodd
    112   mtc1  \reven, \feven
    113   mtc1  \rodd, \fodd
    114 .endm
    115 
    116 #endif  /* mips_isa_rev */
    117 
    118 // Macros to poison (negate) the reference for heap poisoning.
    119 .macro POISON_HEAP_REF rRef
    120 #ifdef USE_HEAP_POISONING
    121     subu \rRef, $zero, \rRef
    122 #endif  // USE_HEAP_POISONING
    123 .endm
    124 
    125 // Macros to unpoison (negate) the reference for heap poisoning.
    126 .macro UNPOISON_HEAP_REF rRef
    127 #ifdef USE_HEAP_POISONING
    128     subu \rRef, $zero, \rRef
    129 #endif  // USE_HEAP_POISONING
    130 .endm
    131 
    132 // Based on contents of creg select the minimum integer
    133 // At the end of the macro the original value of creg is lost
    134 .macro MINint dreg,rreg,sreg,creg
    135   .set push
    136   .set noat
    137 #if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
    138   .ifc \dreg, \rreg
    139   selnez \dreg, \rreg, \creg
    140   seleqz \creg, \sreg, \creg
    141   .else
    142   seleqz \dreg, \sreg, \creg
    143   selnez \creg, \rreg, \creg
    144   .endif
    145   or     \dreg, \dreg, \creg
    146 #else
    147   movn   \dreg, \rreg, \creg
    148   movz   \dreg, \sreg, \creg
    149 #endif
    150   .set pop
    151 .endm
    152 
    153 // Find minimum of two signed registers
    154 .macro MINs dreg,rreg,sreg
    155   .set push
    156   .set noat
    157   slt    $at, \rreg, \sreg
    158   MINint \dreg, \rreg, \sreg, $at
    159   .set pop
    160 .endm
    161 
    162 // Find minimum of two unsigned registers
    163 .macro MINu dreg,rreg,sreg
    164   .set push
    165   .set noat
    166   sltu   $at, \rreg, \sreg
    167   MINint \dreg, \rreg, \sreg, $at
    168   .set pop
    169 .endm
    170 
    171 #endif  // ART_RUNTIME_ARCH_MIPS_ASM_SUPPORT_MIPS_S_
    172