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