1 ; RUN: llc -march=mips < %s | FileCheck %s -check-prefixes=ALL,MIPS 2 ; RUN: llc -march=mips < %s -mattr=+micromips | FileCheck %s -check-prefixes=ALL,MM 3 4 ; Test the patterns used for constant materialization. 5 6 ; Constants generated using li16 7 define i32 @Li16LowBoundary() { 8 entry: 9 ; ALL-LABEL: Li16LowBoundary: 10 ; MIPS: addiu $2, $zero, -1 11 ; MM: li16 $2, -1 12 ; ALL-NOT: lui 13 ; ALL-NOT: ori 14 ; MIPS-NOT: li16 15 ; MM-NOT: addiu 16 17 ret i32 -1 18 } 19 20 define i32 @Li16HighBoundary() { 21 entry: 22 ; ALL-LABEL: Li16HighBoundary: 23 ; MIPS: addiu $2, $zero, 126 24 ; MM: li16 $2, 126 25 ; ALL-NOT: lui 26 ; ALL-NOT: ori 27 ; MM-NOT: addiu 28 ; MIPS-NOT: li16 29 30 ret i32 126 31 } 32 33 ; Constants generated using addiu 34 define i32 @AddiuLowBoundary() { 35 entry: 36 ; ALL-LABEL: AddiuLowBoundary: 37 ; ALL: addiu $2, $zero, -32768 38 ; ALL-NOT: lui 39 ; ALL-NOT: ori 40 ; ALL-NOT: li16 41 42 ret i32 -32768 43 } 44 45 define i32 @AddiuZero() { 46 entry: 47 ; ALL-LABEL: AddiuZero: 48 ; MIPS: addiu $2, $zero, 0 49 ; MM: li16 $2, 0 50 ; ALL-NOT: lui 51 ; ALL-NOT: ori 52 ; MIPS-NOT: li16 53 ; MM-NOT: addiu 54 55 ret i32 0 56 } 57 58 define i32 @AddiuHighBoundary() { 59 entry: 60 ; ALL-LABEL: AddiuHighBoundary: 61 ; ALL: addiu $2, $zero, 32767 62 ; ALL-NOT: lui 63 ; ALL-NOT: ori 64 ; ALL-NOT: li16 65 66 ret i32 32767 67 } 68 69 ; Constants generated using ori 70 define i32 @OriLowBoundary() { 71 entry: 72 ; ALL-LABEL: OriLowBoundary: 73 ; ALL: ori $2, $zero, 32768 74 ; ALL-NOT: addiu 75 ; ALL-NOT: lui 76 ; ALL-NOT: li16 77 78 ret i32 32768 79 } 80 81 define i32 @OriHighBoundary() { 82 entry: 83 ; ALL-LABEL: OriHighBoundary: 84 ; ALL: ori $2, $zero, 65535 85 ; ALL-NOT: addiu 86 ; ALL-NOT: lui 87 ; ALL-NOT: li16 88 89 ret i32 65535 90 } 91 92 ; Constants generated using lui 93 define i32 @LuiPositive() { 94 entry: 95 ; ALL-LABEL: LuiPositive: 96 ; ALL: lui $2, 1 97 ; ALL-NOT: addiu 98 ; ALL-NOT: ori 99 ; ALL-NOT: li16 100 101 ret i32 65536 102 } 103 104 define i32 @LuiNegative() { 105 entry: 106 ; ALL-LABEL: LuiNegative: 107 ; ALL: lui $2, 65535 108 ; ALL-NOT: addiu 109 ; ALL-NOT: ori 110 ; ALL-NOT: li16 111 112 ret i32 -65536 113 } 114 115 ; Constants generated using a combination of lui and ori 116 define i32 @LuiWithLowBitsSet() { 117 entry: 118 ; ALL-LABEL: LuiWithLowBitsSet: 119 ; ALL: lui $1, 1 120 ; ALL: ori $2, $1, 1 121 ; ALL-NOT: addiu 122 ; ALL-NOT: li16 123 124 ret i32 65537 125 } 126 127 define i32 @BelowAddiuLowBoundary() { 128 entry: 129 ; ALL-LABEL: BelowAddiuLowBoundary: 130 ; ALL: lui $1, 65535 131 ; ALL: ori $2, $1, 32767 132 ; ALL-NOT: addiu 133 ; ALL-NOT: li16 134 135 ret i32 -32769 136 } 137