| /* |
| * tests for branch instruction relaxation |
| * |
| * Author: libin |
| */ |
| |
| .include "relaxation_macro.h" |
| |
| .macro _b_op_pattern insn insn1 |
| .balign 2 |
| |
| /* |
| * for local label 1, assembler should NOT alter instructions before .skip; |
| * but it SHOULD alter instructions afte it. |
| */ |
| 1: |
| insn_16 "\insn! 1b" |
| tran_16_32 "\insn! 1b", "\insn 1b" |
| insn_16 "\insn1 1b" |
| .skip 512 |
| insn_16 "\insn! 1b" |
| tran_16_32 "\insn! 1b", "\insn 1b" |
| insn_16 "\insn1 1b" |
| |
| /* |
| * for local label 2, assembler SHOULD alter instructions before .skip; |
| * but it should NOT alter instructions after it. |
| */ |
| insn_16 "\insn! 2f" |
| tran_16_32 "\insn! 2f", "\insn 2f" |
| insn_16 "\insn1 2f" |
| .skip 511 |
| insn_16 "\insn! 2f" |
| tran_16_32 "\insn! 2f", "\insn 2f" |
| insn_16 "\insn1 2f" |
| 2: |
| nop! |
| |
| /* tests for boundary */ |
| 3: |
| .skip 512 |
| insn_16 "\insn! 3b" |
| insn_16 "\insn! 3b" |
| |
| insn_16 "\insn! 4f" |
| insn_16 "\insn! 4f" |
| .skip 511 |
| 4: |
| nop! |
| .endm |
| |
| .macro _br_op_pattern insn |
| .balign 2 |
| insn_32 "\insn r0" |
| insn_32 "\insn r15" |
| |
| tran_16_32 "\insn! r0", "\insn r0" |
| |
| /* shouldn't alter */ |
| insn_32 "\insn r16" |
| insn_32 "\insn r31" |
| .endm |
| |
| .macro _bcmp_op_pattern1 insn |
| .balign 2 |
| |
| /* as will give "Using temp register(r1)" warning if you using r1 */ |
| |
| /* |
| * for local label 1, assembler should NOT alter instructions before .skip; |
| * but it SHOULD alter instructions afte it. |
| */ |
| 1: |
| insn_32 "\insn r0, r15, 1b" |
| insn_32 "\insn r15, r16, 1b" |
| insn_32 "\insn r15, r31, 1b" |
| insn_32 "\insn r16, r31, 1b" |
| .skip 512 |
| insn_32 "\insn r0, r15, 1b" |
| insn_32 "\insn r15, r16, 1b" |
| insn_32 "\insn r15, r31, 1b" |
| insn_32 "\insn r16, r31, 1b" |
| |
| /* |
| * for local label 2, assembler SHOULD alter instructions before .skip; |
| * but it should NOT alter instructions after it. |
| */ |
| insn_32 "\insn r0, r15, 2f" |
| insn_32 "\insn r15, r16, 2f" |
| insn_32 "\insn r15, r31, 2f" |
| insn_32 "\insn r16, r31, 2f" |
| .skip 511 |
| insn_32 "\insn r0, r15, 2f" |
| insn_32 "\insn r15, r16, 2f" |
| insn_32 "\insn r15, r31, 2f" |
| insn_32 "\insn r16, r31, 2f" |
| 2: |
| nop! |
| |
| /* tests for boundary */ |
| 3: |
| .skip 512 |
| insn_32 "\insn r0, r15, 3b" |
| insn_32 "\insn r16, r15, 3b" |
| |
| insn_32 "\insn r0, r15, 4f" |
| insn_32 "\insn r16, r15, 4f" |
| .skip 511 |
| 4: |
| .endm |
| |
| .macro _bcmp_op_pattern2 insn |
| .balign 2 |
| |
| /* as will give "Using temp register(r1)" warning if you using r1 */ |
| |
| /* |
| * for local label 1, assembler should NOT alter instructions before .skip; |
| * but it SHOULD alter instructions afte it. |
| */ |
| 1: |
| insn_32 "\insn r0, 1b" |
| insn_32 "\insn r15, 1b" |
| insn_32 "\insn r16, 1b" |
| insn_32 "\insn r31, 1b" |
| .skip 512 |
| insn_32 "\insn r0, 1b" |
| insn_32 "\insn r15, 1b" |
| insn_32 "\insn r16, 1b" |
| insn_32 "\insn r31, 1b" |
| |
| /* |
| * for local label 2, assembler SHOULD alter instructions before .skip; |
| * but it should NOT alter instructions after it. |
| */ |
| insn_32 "\insn r0, 2f" |
| insn_32 "\insn r15, 2f" |
| insn_32 "\insn r16, 2f" |
| insn_32 "\insn r31, 2f" |
| .skip 511 |
| insn_32 "\insn r0, 2f" |
| insn_32 "\insn r15, 2f" |
| insn_32 "\insn r16, 2f" |
| insn_32 "\insn r31, 2f" |
| 2: |
| nop! |
| |
| /* tests for boundary */ |
| 3: |
| .skip 512 |
| insn_32 "\insn r0, 3b" |
| insn_32 "\insn r16, 3b" |
| |
| insn_32 "\insn r0, 4f" |
| insn_32 "\insn r16, 4f" |
| .skip 511 |
| 4: |
| .endm |
| |
| .text |
| /* b Disp19 <-> b! Disp9 */ |
| _b_op_pattern "bgtu", "bgtul" |
| _b_op_pattern "bleu", "bleul" |
| _b_op_pattern "beq", "beql" |
| _b_op_pattern "bne", "bnel" |
| _b_op_pattern "bgt", "bgtl" |
| _b_op_pattern "ble", "blel" |
| _b_op_pattern "bcnz", "bcnzl" |
| _b_op_pattern "b", "bl" |
| |
| /* br rD <-> br! rD */ |
| _br_op_pattern "br" |
| _br_op_pattern "brl" |
| |
| /* bcmpeq/bcmpne rA,rB,Disp9 -> cmp/cmp! rA, rB; beq/bne Disp19 */ |
| _bcmp_op_pattern1 "bcmpeq" |
| _bcmp_op_pattern1 "bcmpne" |
| |
| /* bcmpeqz/bcmpnez rA,Disp9 -> cmpi! rA, 0; beq/bne Disp19 */ |
| _bcmp_op_pattern2 "bcmpeqz" |
| _bcmp_op_pattern2 "bcmpnez" |