Home | History | Annotate | Download | only in score
      1 /*
      2  * tests for branch instruction relaxation
      3  *
      4  * Author: libin
      5  */
      6 
      7 .include "relaxation_macro.h"
      8 
      9 .macro _b_op_pattern insn insn1
     10 .balign 2
     11 
     12 /*
     13  * for local label 1, assembler should NOT alter instructions before .skip;
     14  * but it SHOULD alter instructions afte it.
     15  */
     16 1:
     17   insn_16    "\insn! 1b"
     18   tran_16_32 "\insn! 1b", "\insn 1b"
     19   insn_16    "\insn1 1b"
     20 .skip 512
     21   insn_16    "\insn! 1b"
     22   tran_16_32 "\insn! 1b", "\insn 1b"
     23   insn_16    "\insn1 1b"
     24 
     25 /*
     26  * for local label 2, assembler SHOULD alter instructions before .skip;
     27  * but it should NOT alter instructions after it.
     28  */
     29   insn_16    "\insn! 2f"
     30   tran_16_32 "\insn! 2f", "\insn 2f"
     31   insn_16    "\insn1 2f"
     32 .skip 511
     33   insn_16    "\insn! 2f"
     34   tran_16_32 "\insn! 2f", "\insn 2f"
     35   insn_16    "\insn1 2f"
     36 2:
     37   nop!
     38 
     39 /* tests for boundary */
     40 3:
     41 .skip 512
     42   insn_16 "\insn! 3b"
     43   insn_16 "\insn! 3b"
     44 
     45   insn_16 "\insn! 4f"
     46   insn_16 "\insn! 4f"
     47 .skip 511
     48 4:
     49   nop!
     50 .endm
     51 
     52 .macro _br_op_pattern insn
     53 .balign 2
     54   insn_32 "\insn r0"
     55   insn_32 "\insn r15"
     56 
     57   tran_16_32 "\insn! r0", "\insn r0"
     58 
     59   /* shouldn't alter */
     60   insn_32 "\insn r16"
     61   insn_32 "\insn r31"
     62 .endm
     63 
     64 .macro _bcmp_op_pattern1 insn
     65 .balign 2
     66 
     67 /* as will give "Using temp register(r1)" warning if you using r1 */
     68 
     69 /*
     70  * for local label 1, assembler should NOT alter instructions before .skip;
     71  * but it SHOULD alter instructions afte it.
     72  */
     73 1:
     74   insn_32 "\insn r0,  r15, 1b"
     75   insn_32 "\insn r15, r16, 1b"
     76   insn_32 "\insn r15, r31, 1b"
     77   insn_32 "\insn r16, r31, 1b"
     78 .skip 512
     79   insn_32 "\insn r0,  r15, 1b"
     80   insn_32 "\insn r15, r16, 1b"
     81   insn_32 "\insn r15, r31, 1b"
     82   insn_32 "\insn r16, r31, 1b"
     83 
     84 /*
     85  * for local label 2, assembler SHOULD alter instructions before .skip;
     86  * but it should NOT alter instructions after it.
     87  */
     88   insn_32 "\insn r0,  r15, 2f"
     89   insn_32 "\insn r15, r16, 2f"
     90   insn_32 "\insn r15, r31, 2f"
     91   insn_32 "\insn r16, r31, 2f"
     92 .skip 511
     93   insn_32 "\insn r0,  r15, 2f"
     94   insn_32 "\insn r15, r16, 2f"
     95   insn_32 "\insn r15, r31, 2f"
     96   insn_32 "\insn r16, r31, 2f"
     97 2:
     98   nop!
     99 
    100 /* tests for boundary */
    101 3:
    102 .skip 512
    103   insn_32 "\insn r0,  r15, 3b"
    104   insn_32 "\insn r16, r15, 3b"
    105 
    106   insn_32 "\insn r0,  r15, 4f"
    107   insn_32 "\insn r16, r15, 4f"
    108 .skip 511
    109 4:
    110 .endm
    111 
    112 .macro _bcmp_op_pattern2 insn
    113 .balign 2
    114 
    115 /* as will give "Using temp register(r1)" warning if you using r1 */
    116 
    117 /*
    118  * for local label 1, assembler should NOT alter instructions before .skip;
    119  * but it SHOULD alter instructions afte it.
    120  */
    121 1:
    122   insn_32 "\insn r0,  1b"
    123   insn_32 "\insn r15, 1b"
    124   insn_32 "\insn r16, 1b"
    125   insn_32 "\insn r31, 1b"
    126 .skip 512
    127   insn_32 "\insn r0,  1b"
    128   insn_32 "\insn r15, 1b"
    129   insn_32 "\insn r16, 1b"
    130   insn_32 "\insn r31, 1b"
    131 
    132 /*
    133  * for local label 2, assembler SHOULD alter instructions before .skip;
    134  * but it should NOT alter instructions after it.
    135  */
    136   insn_32 "\insn r0,  2f"
    137   insn_32 "\insn r15, 2f"
    138   insn_32 "\insn r16, 2f"
    139   insn_32 "\insn r31, 2f"
    140 .skip 511
    141   insn_32 "\insn r0,  2f"
    142   insn_32 "\insn r15, 2f"
    143   insn_32 "\insn r16, 2f"
    144   insn_32 "\insn r31, 2f"
    145 2:
    146   nop!
    147 
    148 /* tests for boundary */
    149 3:
    150 .skip 512
    151   insn_32 "\insn r0,  3b"
    152   insn_32 "\insn r16, 3b"
    153 
    154   insn_32 "\insn r0,  4f"
    155   insn_32 "\insn r16, 4f"
    156 .skip 511
    157 4:
    158 .endm
    159 
    160 .text
    161 /* b Disp19 <-> b! Disp9 */
    162 _b_op_pattern "bgtu", "bgtul"
    163 _b_op_pattern "bleu", "bleul"
    164 _b_op_pattern "beq",  "beql"
    165 _b_op_pattern "bne",  "bnel"
    166 _b_op_pattern "bgt",  "bgtl"
    167 _b_op_pattern "ble",  "blel"
    168 _b_op_pattern "bcnz", "bcnzl"
    169 _b_op_pattern "b",    "bl"
    170 
    171 /* br rD <-> br! rD */
    172 _br_op_pattern "br"
    173 _br_op_pattern "brl"
    174 
    175 /* bcmpeq/bcmpne rA,rB,Disp9 -> cmp/cmp! rA, rB; beq/bne Disp19 */
    176 _bcmp_op_pattern1 "bcmpeq"
    177 _bcmp_op_pattern1 "bcmpne"
    178 
    179 /* bcmpeqz/bcmpnez rA,Disp9 -> cmpi! rA, 0; beq/bne Disp19 */
    180 _bcmp_op_pattern2 "bcmpeqz"
    181 _bcmp_op_pattern2 "bcmpnez"
    182