| ; RUN: llc -march=mips < %s | FileCheck %s -check-prefixes=ALL,MIPS |
| ; RUN: llc -march=mips < %s -mattr=+micromips | FileCheck %s -check-prefixes=ALL,MM |
| |
| ; Test the patterns used for constant materialization. |
| |
| ; Constants generated using li16 |
| define i32 @Li16LowBoundary() { |
| entry: |
| ; ALL-LABEL: Li16LowBoundary: |
| ; MIPS: addiu $2, $zero, -1 |
| ; MM: li16 $2, -1 |
| ; ALL-NOT: lui |
| ; ALL-NOT: ori |
| ; MIPS-NOT: li16 |
| ; MM-NOT: addiu |
| |
| ret i32 -1 |
| } |
| |
| define i32 @Li16HighBoundary() { |
| entry: |
| ; ALL-LABEL: Li16HighBoundary: |
| ; MIPS: addiu $2, $zero, 126 |
| ; MM: li16 $2, 126 |
| ; ALL-NOT: lui |
| ; ALL-NOT: ori |
| ; MM-NOT: addiu |
| ; MIPS-NOT: li16 |
| |
| ret i32 126 |
| } |
| |
| ; Constants generated using addiu |
| define i32 @AddiuLowBoundary() { |
| entry: |
| ; ALL-LABEL: AddiuLowBoundary: |
| ; ALL: addiu $2, $zero, -32768 |
| ; ALL-NOT: lui |
| ; ALL-NOT: ori |
| ; ALL-NOT: li16 |
| |
| ret i32 -32768 |
| } |
| |
| define i32 @AddiuZero() { |
| entry: |
| ; ALL-LABEL: AddiuZero: |
| ; MIPS: addiu $2, $zero, 0 |
| ; MM: li16 $2, 0 |
| ; ALL-NOT: lui |
| ; ALL-NOT: ori |
| ; MIPS-NOT: li16 |
| ; MM-NOT: addiu |
| |
| ret i32 0 |
| } |
| |
| define i32 @AddiuHighBoundary() { |
| entry: |
| ; ALL-LABEL: AddiuHighBoundary: |
| ; ALL: addiu $2, $zero, 32767 |
| ; ALL-NOT: lui |
| ; ALL-NOT: ori |
| ; ALL-NOT: li16 |
| |
| ret i32 32767 |
| } |
| |
| ; Constants generated using ori |
| define i32 @OriLowBoundary() { |
| entry: |
| ; ALL-LABEL: OriLowBoundary: |
| ; ALL: ori $2, $zero, 32768 |
| ; ALL-NOT: addiu |
| ; ALL-NOT: lui |
| ; ALL-NOT: li16 |
| |
| ret i32 32768 |
| } |
| |
| define i32 @OriHighBoundary() { |
| entry: |
| ; ALL-LABEL: OriHighBoundary: |
| ; ALL: ori $2, $zero, 65535 |
| ; ALL-NOT: addiu |
| ; ALL-NOT: lui |
| ; ALL-NOT: li16 |
| |
| ret i32 65535 |
| } |
| |
| ; Constants generated using lui |
| define i32 @LuiPositive() { |
| entry: |
| ; ALL-LABEL: LuiPositive: |
| ; ALL: lui $2, 1 |
| ; ALL-NOT: addiu |
| ; ALL-NOT: ori |
| ; ALL-NOT: li16 |
| |
| ret i32 65536 |
| } |
| |
| define i32 @LuiNegative() { |
| entry: |
| ; ALL-LABEL: LuiNegative: |
| ; ALL: lui $2, 65535 |
| ; ALL-NOT: addiu |
| ; ALL-NOT: ori |
| ; ALL-NOT: li16 |
| |
| ret i32 -65536 |
| } |
| |
| ; Constants generated using a combination of lui and ori |
| define i32 @LuiWithLowBitsSet() { |
| entry: |
| ; ALL-LABEL: LuiWithLowBitsSet: |
| ; ALL: lui $1, 1 |
| ; ALL: ori $2, $1, 1 |
| ; ALL-NOT: addiu |
| ; ALL-NOT: li16 |
| |
| ret i32 65537 |
| } |
| |
| define i32 @BelowAddiuLowBoundary() { |
| entry: |
| ; ALL-LABEL: BelowAddiuLowBoundary: |
| ; ALL: lui $1, 65535 |
| ; ALL: ori $2, $1, 32767 |
| ; ALL-NOT: addiu |
| ; ALL-NOT: li16 |
| |
| ret i32 -32769 |
| } |