1 .macro call_stub, name 2 .set push 3 .set nomips16 4 .section .mips16.call.\name, "ax", @progbits 5 .ent __call_stub_\name 6 .type __call_stub_\name, @function 7__call_stub_\name: 8 la $25, \name 9 jr $25 10 .set pop 11 .endm 12 13 # Flags to specify how a particular function is referenced 14 15 .equ DC, 1 # Direct call from "compressed" code 16 .equ BC, 2 # Branch from "compressed" code 17 .equ IC, 4 # Indirect call from "compressed" code 18 .equ DU, 8 # Direct call from "uncompressed" code 19 .equ BU, 16 # Branch from "uncompressed" code 20 .equ IU, 32 # Indirect call from "uncompressed" code 21 .equ LO, 64 # Direct address reference (%lo) 22 23 # A wrapper around a macro called test_one, which is defined by 24 # the file that includes this one. NAME is the name of a function 25 # that is referenced in the way described by FLAGS, an inclusive OR 26 # of the flags above. The wrapper filters out any functions whose 27 # FLAGS are not a subset of FILTER. 28 29 .macro test_filter, name, flags 30 .if (\flags & filter) == \flags 31 test_one \name, \flags 32 .endif 33 .endm 34 35 .macro test_all_dc, name, flags 36 test_filter \name, \flags 37 test_filter \name\()_dc, (\flags | DC) 38 .endm 39 40 .macro test_all_bc, name, flags 41 test_all_dc \name, \flags 42 test_all_dc \name\()_bc, (\flags | BC) 43 .endm 44 45 .macro test_all_ic, name, flags 46 test_all_bc \name, \flags 47 test_all_bc \name\()_ic, (\flags | IC) 48 .endm 49 50 .macro test_all_du, name, flags 51 test_all_ic \name, \flags 52 test_all_ic \name\()_du, (\flags | DU) 53 .endm 54 55 .macro test_all_bu, name, flags 56 test_all_du \name, \flags 57 test_all_du \name\()_bu, (\flags | BU) 58 .endm 59 60 .macro test_all_iu, name, flags 61 test_all_bu \name, \flags 62 test_all_bu \name\()_iu, (\flags | IU) 63 .endm 64 65 .macro test_all_lo, name, flags 66 test_all_iu \name, \flags 67 test_all_iu \name\()_lo, (\flags | LO) 68 .endm 69 70 # Test all the combinations of interest. 71 72 .macro test_all 73 test_all_lo f, 0 74 .endm 75