root/arch/powerpc/lib/feature-fixups-test.S
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright 2008 Michael Ellerman, IBM Corporation.
 */

#include <asm/feature-fixups.h>
#include <asm/ppc_asm.h>
#include <asm/synch.h>
#include <asm/asm-compat.h>
#include <asm/ppc-opcode.h>

        .text

#define globl(x)                \
        .globl x;       \
x:

globl(ftr_fixup_test1)
        or      1,1,1
        or      2,2,2   /* fixup will nop out this instruction */
        or      3,3,3

globl(end_ftr_fixup_test1)

globl(ftr_fixup_test1_orig)
        or      1,1,1
        or      2,2,2
        or      3,3,3

globl(ftr_fixup_test1_expected)
        or      1,1,1
        nop
        or      3,3,3

globl(ftr_fixup_test2)
        or      1,1,1
        or      2,2,2   /* fixup will replace this with ftr_fixup_test2_alt */
        or      3,3,3

globl(end_ftr_fixup_test2)

globl(ftr_fixup_test2_orig)
        or      1,1,1
        or      2,2,2
        or      3,3,3

globl(ftr_fixup_test2_alt)
        or      31,31,31

globl(ftr_fixup_test2_expected)
        or      1,1,1
        or      31,31,31
        or      3,3,3

globl(ftr_fixup_test3)
        or      1,1,1
        or      2,2,2   /* fixup will fail to replace this */
        or      3,3,3

globl(end_ftr_fixup_test3)

globl(ftr_fixup_test3_orig)
        or      1,1,1
        or      2,2,2
        or      3,3,3

globl(ftr_fixup_test3_alt)
        or      31,31,31
        or      31,31,31

globl(ftr_fixup_test4)
        or      1,1,1
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      3,3,3

globl(end_ftr_fixup_test4)

globl(ftr_fixup_test4_expected)
        or      1,1,1
        or      31,31,31
        or      31,31,31
        nop
        nop
        or      3,3,3

globl(ftr_fixup_test4_orig)
        or      1,1,1
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      3,3,3

globl(ftr_fixup_test4_alt)
        or      31,31,31
        or      31,31,31


globl(ftr_fixup_test5)
        or      1,1,1
BEGIN_FTR_SECTION
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
FTR_SECTION_ELSE
2:      b       3f
3:      or      5,5,5
        beq     3b
        b       1f
        or      6,6,6
        b       2b
1:      bdnz    3b
ALT_FTR_SECTION_END(0, 1)
        or      1,1,1

globl(end_ftr_fixup_test5)

globl(ftr_fixup_test5_expected)
        or      1,1,1
2:      b       3f
3:      or      5,5,5
        beq     3b
        b       1f
        or      6,6,6
        b       2b
1:      bdnz    3b
        or      1,1,1

globl(ftr_fixup_test6)
1:      or      1,1,1
BEGIN_FTR_SECTION
        or      5,5,5
2:      PPC_LCMPI       r3,0
        beq     4f
        blt     2b
        b       1b
        b       4f
FTR_SECTION_ELSE
2:      or      2,2,2
        PPC_LCMPI       r3,1
        beq     3f
        blt     2b
        b       3f
        b       1b
ALT_FTR_SECTION_END(0, 1)
3:      or      1,1,1
        or      2,2,2
4:      or      3,3,3

globl(end_ftr_fixup_test6)

globl(ftr_fixup_test6_expected)
1:      or      1,1,1
2:      or      2,2,2
        PPC_LCMPI       r3,1
        beq     3f
        blt     2b
        b       3f
        b       1b
3:      or      1,1,1
        or      2,2,2
        or      3,3,3

globl(ftr_fixup_test7)
        or      1,1,1
BEGIN_FTR_SECTION
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
        or      2,2,2
FTR_SECTION_ELSE
2:      b       3f
3:      or      5,5,5
        beq     3b
        b       1f
        or      6,6,6
        b       2b
        bdnz    3b
1:
ALT_FTR_SECTION_END(0, 1)
        or      1,1,1
        or      1,1,1

globl(end_ftr_fixup_test7)
        nop

globl(ftr_fixup_test7_expected)
        or      1,1,1
2:      b       3f
3:      or      5,5,5
        beq     3b
        b       1f
        or      6,6,6
        b       2b
        bdnz    3b
1:      or      1,1,1

#if 0
/* Test that if we have a larger else case the assembler spots it and
 * reports an error. #if 0'ed so as not to break the build normally.
 */
ftr_fixup_test_too_big:
        or      1,1,1
BEGIN_FTR_SECTION
        or      2,2,2
        or      2,2,2
        or      2,2,2
FTR_SECTION_ELSE
        or      3,3,3
        or      3,3,3
        or      3,3,3
        or      3,3,3
ALT_FTR_SECTION_END(0, 1)
        or      1,1,1
#endif

#define MAKE_MACRO_TEST(TYPE)                                           \
globl(ftr_fixup_test_ ##TYPE##_macros)                                  \
        or      1,1,1;                                                  \
        /* Basic test, this section should all be nop'ed */             \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
END_##TYPE##_SECTION(0, 1)                                              \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Basic test, this section should NOT be nop'ed */             \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
END_##TYPE##_SECTION(0, 0)                                              \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nesting test, inner section should be nop'ed */              \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(80)                                       \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
END_##TYPE##_SECTION_NESTED(0, 1, 80)                                   \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
END_##TYPE##_SECTION(0, 0)                                              \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nesting test, whole section should be nop'ed */              \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(80)                                       \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
END_##TYPE##_SECTION_NESTED(0, 0, 80)                                   \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
END_##TYPE##_SECTION(0, 1)                                              \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nesting test, none should be nop'ed */                       \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(80)                                       \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
END_##TYPE##_SECTION_NESTED(0, 0, 80)                                   \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
END_##TYPE##_SECTION(0, 0)                                              \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Basic alt section test, default case should be taken */      \
BEGIN_##TYPE##_SECTION                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      5,5,5;                                                  \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END(0, 0)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Basic alt section test, else case should be taken */         \
BEGIN_##TYPE##_SECTION                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      31,31,31;                                               \
        or      31,31,31;                                               \
        or      31,31,31;                                               \
ALT_##TYPE##_SECTION_END(0, 1)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Alt with smaller else case, should be padded with nops */    \
BEGIN_##TYPE##_SECTION                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      31,31,31;                                               \
ALT_##TYPE##_SECTION_END(0, 1)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Alt section with nested section in default case */           \
        /* Default case should be taken, with nop'ed inner section */   \
BEGIN_##TYPE##_SECTION                                                  \
        or      3,3,3;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
END_##TYPE##_SECTION_NESTED(0, 1, 95)                                   \
        or      3,3,3;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
ALT_##TYPE##_SECTION_END(0, 0)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Alt section with nested section in else, default taken */    \
BEGIN_##TYPE##_SECTION                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      5,5,5;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      3,3,3;                                                  \
END_##TYPE##_SECTION_NESTED(0, 1, 95)                                   \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END(0, 0)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Alt section with nested section in else, else taken & nop */ \
BEGIN_##TYPE##_SECTION                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      5,5,5;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      3,3,3;                                                  \
END_##TYPE##_SECTION_NESTED(0, 1, 95)                                   \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END(0, 1)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Feature section with nested alt section, default taken */    \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      1,1,1;                                                  \
##TYPE##_SECTION_ELSE_NESTED(95)                                        \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95)                               \
        or      2,2,2;                                                  \
END_##TYPE##_SECTION(0, 0)                                              \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Feature section with nested alt section, else taken */       \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      1,1,1;                                                  \
##TYPE##_SECTION_ELSE_NESTED(95)                                        \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95)                               \
        or      2,2,2;                                                  \
END_##TYPE##_SECTION(0, 0)                                              \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Feature section with nested alt section, all nop'ed */       \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      1,1,1;                                                  \
##TYPE##_SECTION_ELSE_NESTED(95)                                        \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95)                               \
        or      2,2,2;                                                  \
END_##TYPE##_SECTION(0, 1)                                              \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, default with inner default taken */     \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      1,1,1;                                                  \
##TYPE##_SECTION_ELSE_NESTED(95)                                        \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95)                               \
        or      2,2,2;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      31,31,31;                                               \
BEGIN_##TYPE##_SECTION_NESTED(94)                                       \
        or      5,5,5;                                                  \
##TYPE##_SECTION_ELSE_NESTED(94)                                        \
        or      1,1,1;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94)                               \
        or      31,31,31;                                               \
ALT_##TYPE##_SECTION_END(0, 0)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, default with inner else taken */        \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      1,1,1;                                                  \
##TYPE##_SECTION_ELSE_NESTED(95)                                        \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95)                               \
        or      2,2,2;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      31,31,31;                                               \
BEGIN_##TYPE##_SECTION_NESTED(94)                                       \
        or      5,5,5;                                                  \
##TYPE##_SECTION_ELSE_NESTED(94)                                        \
        or      1,1,1;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94)                               \
        or      31,31,31;                                               \
ALT_##TYPE##_SECTION_END(0, 0)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, else with inner default taken */        \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      1,1,1;                                                  \
##TYPE##_SECTION_ELSE_NESTED(95)                                        \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95)                               \
        or      2,2,2;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      31,31,31;                                               \
BEGIN_##TYPE##_SECTION_NESTED(94)                                       \
        or      5,5,5;                                                  \
##TYPE##_SECTION_ELSE_NESTED(94)                                        \
        or      1,1,1;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94)                               \
        or      31,31,31;                                               \
ALT_##TYPE##_SECTION_END(0, 1)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, else with inner else taken */           \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
BEGIN_##TYPE##_SECTION_NESTED(95)                                       \
        or      1,1,1;                                                  \
##TYPE##_SECTION_ELSE_NESTED(95)                                        \
        or      5,5,5;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95)                               \
        or      2,2,2;                                                  \
##TYPE##_SECTION_ELSE                                                   \
        or      31,31,31;                                               \
BEGIN_##TYPE##_SECTION_NESTED(94)                                       \
        or      5,5,5;                                                  \
##TYPE##_SECTION_ELSE_NESTED(94)                                        \
        or      1,1,1;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94)                               \
        or      31,31,31;                                               \
ALT_##TYPE##_SECTION_END(0, 1)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, else can have large else case */        \
BEGIN_##TYPE##_SECTION                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
##TYPE##_SECTION_ELSE                                                   \
BEGIN_##TYPE##_SECTION_NESTED(94)                                       \
        or      5,5,5;                                                  \
        or      5,5,5;                                                  \
        or      5,5,5;                                                  \
        or      5,5,5;                                                  \
##TYPE##_SECTION_ELSE_NESTED(94)                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94)                               \
ALT_##TYPE##_SECTION_END(0, 1)                                          \
        or      1,1,1;                                                  \
        or      1,1,1;

#define MAKE_MACRO_TEST_EXPECTED(TYPE)                                  \
globl(ftr_fixup_test_ ##TYPE##_macros_expected)                         \
        or      1,1,1;                                                  \
        /* Basic test, this section should all be nop'ed */             \
/* BEGIN_##TYPE##_SECTION */                                            \
        nop;                                                            \
        nop;                                                            \
        nop;                                                            \
/* END_##TYPE##_SECTION(0, 1) */                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Basic test, this section should NOT be nop'ed */             \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
/* END_##TYPE##_SECTION(0, 0) */                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nesting test, inner section should be nop'ed */              \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
/* BEGIN_##TYPE##_SECTION_NESTED(80) */                                 \
        nop;                                                            \
        nop;                                                            \
/* END_##TYPE##_SECTION_NESTED(0, 1, 80) */                             \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
/* END_##TYPE##_SECTION(0, 0) */                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nesting test, whole section should be nop'ed */              \
        /* NB. inner section is not nop'ed, but then entire outer is */ \
/* BEGIN_##TYPE##_SECTION */                                            \
        nop;                                                            \
        nop;                                                            \
/* BEGIN_##TYPE##_SECTION_NESTED(80) */                                 \
        nop;                                                            \
        nop;                                                            \
/* END_##TYPE##_SECTION_NESTED(0, 0, 80) */                             \
        nop;                                                            \
        nop;                                                            \
/* END_##TYPE##_SECTION(0, 1) */                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nesting test, none should be nop'ed */                       \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
/* BEGIN_##TYPE##_SECTION_NESTED(80) */                                 \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
/* END_##TYPE##_SECTION_NESTED(0, 0, 80) */                             \
        or      2,2,2;                                                  \
        or      2,2,2;                                                  \
/* END_##TYPE##_SECTION(0, 0) */                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Basic alt section test, default case should be taken */      \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
/* ##TYPE##_SECTION_ELSE */                                             \
        /* or   5,5,5; */                                               \
        /* or   5,5,5; */                                               \
/* ALT_##TYPE##_SECTION_END(0, 0) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Basic alt section test, else case should be taken */         \
/* BEGIN_##TYPE##_SECTION */                                            \
        /* or   3,3,3; */                                               \
        /* or   3,3,3; */                                               \
        /* or   3,3,3; */                                               \
/* ##TYPE##_SECTION_ELSE */                                             \
        or      31,31,31;                                               \
        or      31,31,31;                                               \
        or      31,31,31;                                               \
/* ALT_##TYPE##_SECTION_END(0, 1) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Alt with smaller else case, should be padded with nops */    \
/* BEGIN_##TYPE##_SECTION */                                            \
        /* or   3,3,3; */                                               \
        /* or   3,3,3; */                                               \
        /* or   3,3,3; */                                               \
/* ##TYPE##_SECTION_ELSE */                                             \
        or      31,31,31;                                               \
        nop;                                                            \
        nop;                                                            \
/* ALT_##TYPE##_SECTION_END(0, 1) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Alt section with nested section in default case */           \
        /* Default case should be taken, with nop'ed inner section */   \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      3,3,3;                                                  \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        nop;                                                            \
        nop;                                                            \
/* END_##TYPE##_SECTION_NESTED(0, 1, 95) */                             \
        or      3,3,3;                                                  \
/* ##TYPE##_SECTION_ELSE */                                             \
        /* or   2,2,2; */                                               \
        /* or   2,2,2; */                                               \
/* ALT_##TYPE##_SECTION_END(0, 0) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Alt section with nested section in else, default taken */    \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
        or      3,3,3;                                                  \
/* ##TYPE##_SECTION_ELSE */                                             \
        /* or   5,5,5; */                                               \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        /* or   3,3,3; */                                               \
/* END_##TYPE##_SECTION_NESTED(0, 1, 95) */                             \
        /* or   5,5,5; */                                               \
/* ALT_##TYPE##_SECTION_END(0, 0) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Alt section with nested section in else, else taken & nop */ \
/* BEGIN_##TYPE##_SECTION */                                            \
        /* or   3,3,3; */                                               \
        /* or   3,3,3; */                                               \
        /* or   3,3,3; */                                               \
/* ##TYPE##_SECTION_ELSE */                                             \
        or      5,5,5;                                                  \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        nop;                                                            \
/* END_##TYPE##_SECTION_NESTED(0, 1, 95) */                             \
        or      5,5,5;                                                  \
/* ALT_##TYPE##_SECTION_END(0, 1) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Feature section with nested alt section, default taken */    \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      2,2,2;                                                  \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        or      1,1,1;                                                  \
/* ##TYPE##_SECTION_ELSE_NESTED(95) */                                  \
        /* or   5,5,5; */                                               \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */                         \
        or      2,2,2;                                                  \
/* END_##TYPE##_SECTION(0, 0) */                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Feature section with nested alt section, else taken */       \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      2,2,2;                                                  \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        /* or   1,1,1; */                                               \
/* ##TYPE##_SECTION_ELSE_NESTED(95) */                                  \
        or      5,5,5;                                                  \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */                         \
        or      2,2,2;                                                  \
/* END_##TYPE##_SECTION(0, 0) */                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Feature section with nested alt section, all nop'ed */       \
/* BEGIN_##TYPE##_SECTION */                                            \
        nop;                                                            \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        nop;                                                            \
/* ##TYPE##_SECTION_ELSE_NESTED(95) */                                  \
        /* or   5,5,5; */                                               \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */                         \
        nop;                                                            \
/* END_##TYPE##_SECTION(0, 1) */                                        \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, default with inner default taken */     \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      2,2,2;                                                  \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        or      1,1,1;                                                  \
/* ##TYPE##_SECTION_ELSE_NESTED(95) */                                  \
        /* or   5,5,5; */                                               \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */                         \
        or      2,2,2;                                                  \
/* ##TYPE##_SECTION_ELSE */                                             \
        /* or   31,31,31; */                                            \
/* BEGIN_##TYPE##_SECTION_NESTED(94) */                                 \
        /* or   5,5,5; */                                               \
/* ##TYPE##_SECTION_ELSE_NESTED(94) */                                  \
        /* or   1,1,1; */                                               \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */                         \
        /* or   31,31,31; */                                            \
/* ALT_##TYPE##_SECTION_END(0, 0) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, default with inner else taken */        \
/* BEGIN_##TYPE##_SECTION */                                            \
        or      2,2,2;                                                  \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        /* or   1,1,1; */                                               \
/* ##TYPE##_SECTION_ELSE_NESTED(95) */                                  \
        or      5,5,5;                                                  \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */                         \
        or      2,2,2;                                                  \
/* ##TYPE##_SECTION_ELSE */                                             \
        /* or   31,31,31; */                                            \
/* BEGIN_##TYPE##_SECTION_NESTED(94) */                                 \
        /* or   5,5,5; */                                               \
/* ##TYPE##_SECTION_ELSE_NESTED(94) */                                  \
        /* or   1,1,1; */                                               \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */                         \
        /* or   31,31,31; */                                            \
/* ALT_##TYPE##_SECTION_END(0, 0) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, else with inner default taken */        \
/* BEGIN_##TYPE##_SECTION */                                            \
        /* or   2,2,2; */                                               \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        /* or   1,1,1; */                                               \
/* ##TYPE##_SECTION_ELSE_NESTED(95) */                                  \
        /* or   5,5,5; */                                               \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */                         \
        /* or   2,2,2; */                                               \
/* ##TYPE##_SECTION_ELSE */                                             \
        or      31,31,31;                                               \
/* BEGIN_##TYPE##_SECTION_NESTED(94) */                                 \
        or      5,5,5;                                                  \
/* ##TYPE##_SECTION_ELSE_NESTED(94) */                                  \
        /* or   1,1,1; */                                               \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */                         \
        or      31,31,31;                                               \
/* ALT_##TYPE##_SECTION_END(0, 1) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, else with inner else taken */           \
/* BEGIN_##TYPE##_SECTION */                                            \
        /* or   2,2,2; */                                               \
/* BEGIN_##TYPE##_SECTION_NESTED(95) */                                 \
        /* or   1,1,1; */                                               \
/* ##TYPE##_SECTION_ELSE_NESTED(95) */                                  \
        /* or   5,5,5; */                                               \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */                         \
        /* or   2,2,2; */                                               \
/* ##TYPE##_SECTION_ELSE */                                             \
        or      31,31,31;                                               \
/* BEGIN_##TYPE##_SECTION_NESTED(94) */                                 \
        /* or   5,5,5; */                                               \
/* ##TYPE##_SECTION_ELSE_NESTED(94) */                                  \
        or      1,1,1;                                                  \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) */                         \
        or      31,31,31;                                               \
/* ALT_##TYPE##_SECTION_END(0, 1) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        /* Nested alt sections, else can have large else case */        \
/* BEGIN_##TYPE##_SECTION */                                            \
        /* or   2,2,2; */                                               \
        /* or   2,2,2; */                                               \
        /* or   2,2,2; */                                               \
        /* or   2,2,2; */                                               \
/* ##TYPE##_SECTION_ELSE */                                             \
/* BEGIN_##TYPE##_SECTION_NESTED(94) */                                 \
        /* or   5,5,5; */                                               \
        /* or   5,5,5; */                                               \
        /* or   5,5,5; */                                               \
        /* or   5,5,5; */                                               \
/* ##TYPE##_SECTION_ELSE_NESTED(94) */                                  \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
        or      1,1,1;                                                  \
/* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) */                         \
/* ALT_##TYPE##_SECTION_END(0, 1) */                                    \
        or      1,1,1;                                                  \
        or      1,1,1;

MAKE_MACRO_TEST(FTR);
MAKE_MACRO_TEST_EXPECTED(FTR);

#ifdef CONFIG_PPC64
MAKE_MACRO_TEST(FW_FTR);
MAKE_MACRO_TEST_EXPECTED(FW_FTR);
#endif

globl(lwsync_fixup_test)
1:      or      1,1,1
        LWSYNC
globl(end_lwsync_fixup_test)

globl(lwsync_fixup_test_expected_LWSYNC)
1:      or      1,1,1
        lwsync

globl(lwsync_fixup_test_expected_SYNC)
1:      or      1,1,1
        sync

globl(ftr_fixup_prefix1)
        or      1,1,1
        .long OP_PREFIX << 26
        .long 0x0000000
        or      2,2,2
globl(end_ftr_fixup_prefix1)

globl(ftr_fixup_prefix1_orig)
        or      1,1,1
        .long OP_PREFIX << 26
        .long 0x0000000
        or      2,2,2

globl(ftr_fixup_prefix1_expected)
        or      1,1,1
        nop
        nop
        or      2,2,2

globl(ftr_fixup_prefix2)
        or      1,1,1
        .long OP_PREFIX << 26
        .long 0x0000000
        or      2,2,2
globl(end_ftr_fixup_prefix2)

globl(ftr_fixup_prefix2_orig)
        or      1,1,1
        .long OP_PREFIX << 26
        .long 0x0000000
        or      2,2,2

globl(ftr_fixup_prefix2_alt)
        .long OP_PREFIX << 26
        .long 0x0000001

globl(ftr_fixup_prefix2_expected)
        or      1,1,1
        .long OP_PREFIX << 26
        .long 0x0000001
        or      2,2,2

globl(ftr_fixup_prefix3)
        or      1,1,1
        .long OP_PREFIX << 26
        .long 0x0000000
        or      2,2,2
        or      3,3,3
globl(end_ftr_fixup_prefix3)

globl(ftr_fixup_prefix3_orig)
        or      1,1,1
        .long OP_PREFIX << 26
        .long 0x0000000
        or      2,2,2
        or      3,3,3

globl(ftr_fixup_prefix3_alt)
        .long OP_PREFIX << 26
        .long 0x0000001
        nop

globl(ftr_fixup_prefix3_expected)
        or      1,1,1
        .long OP_PREFIX << 26
        .long 0x0000001
        nop
        or      3,3,3