Migrate CI to GitHub Actions

This involves less secret and user management than azure pipelines, has
more concurrency by default for repos, and in general has a bit more
modern syntax!
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..9225963
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,204 @@
+name: CI
+on:
+  push:
+    branches:
+    - auto
+    - try
+  pull_request:
+    branches:
+    - master
+
+jobs:
+  style:
+    name: Check Style
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update nightly && rustup default nightly
+    - run: ci/style.sh
+
+  docs:
+    name: Build Documentation
+    needs: [style]
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update nightly && rustup default nightly
+    - run: ci/dox.sh
+      env:
+        CI: 1
+    - name: Publish documentation
+      run: |
+        cd target/doc
+        git init
+        git add .
+        git -c user.name='ci' -c user.email='ci' commit -m init
+        git push -f -q https://git:${{ secrets.github_token }}@github.com/${{ github.repository }} HEAD:gh-pages
+      if: github.event_name == 'push' && github.event.ref == 'refs/heads/master'
+
+  verify:
+    name: Automatic intrinsic verification
+    needs: [style]
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update nightly && rustup default nightly
+    - run: cargo test --manifest-path crates/stdarch-verify/Cargo.toml
+
+  env_override:
+    name: Env Override
+    needs: [style]
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update nightly && rustup default nightly
+    - run: RUST_STD_DETECT_UNSTABLE=avx cargo test --features=std_detect_env_override --manifest-path crates/std_detect/Cargo.toml env_override_no_avx
+
+  test:
+    needs: [style]
+    name: Test
+    runs-on: ${{ matrix.os }}
+    strategy:
+      max-parallel: 10
+      matrix:
+        target:
+        # Dockers that are run through docker on linux
+        - i686-unknown-linux-gnu
+        - x86_64-unknown-linux-gnu
+        - x86_64-unknown-linux-gnu-emulated
+        - arm-unknown-linux-gnueabihf
+        - armv7-unknown-linux-gnueabihf
+        - aarch64-unknown-linux-gnu
+        - powerpc64le-unknown-linux-gnu
+        - mips-unknown-linux-gnu
+        - mips64-unknown-linux-gnuabi64
+        - mips64el-unknown-linux-gnuabi64
+        - s390x-unknown-linux-gnu
+        - wasm32-unknown-unknown
+        - i586-unknown-linux-gnu
+        - x86_64-linux-android
+        - arm-linux-androideabi
+        - mipsel-unknown-linux-musl
+        - aarch64-linux-android
+        - nvptx64-nvidia-cuda
+        - thumbv6m-none-eabi
+        - thumbv7m-none-eabi
+        - thumbv7em-none-eabi
+        - thumbv7em-none-eabihf
+
+        # macOS targets
+        - x86_64-apple-darwin
+        # FIXME: gh-actions build environment doesn't have linker support
+        # - i686-apple-darwin
+
+        # Windows targets
+        - x86_64-pc-windows-msvc
+        # FIXME: Disassembly not implemented for the # following targets:
+        # - x86_64-pc-windows-gnu:
+        # - i686-pc-windows-gnu:
+        # - i686-pc-windows-msvc:
+
+        include:
+        - target: i686-unknown-linux-gnu
+          os: ubuntu-latest
+        - target: x86_64-unknown-linux-gnu
+          os: ubuntu-latest
+        - target: x86_64-unknown-linux-gnu-emulated
+          os: ubuntu-latest
+          test_everything: true
+          rustflags: --cfg stdarch_intel_sde
+        - target: arm-unknown-linux-gnueabihf
+          os: ubuntu-latest
+        - target: armv7-unknown-linux-gnueabihf
+          os: ubuntu-latest
+          rustflags: -C target-feature=+neon
+        - target: mips-unknown-linux-gnu
+          os: ubuntu-latest
+          norun: true
+        - target: mips64-unknown-linux-gnuabi64
+          os: ubuntu-latest
+          norun: true
+        - target: mips64el-unknown-linux-gnuabi64
+          os: ubuntu-latest
+          norun: true
+        - target: powerpc64le-unknown-linux-gnu
+          os: ubuntu-latest
+          disable_assert_instr: true
+        - target: s390x-unknown-linux-gnu
+          os: ubuntu-latest
+        - target: wasm32-unknown-unknown
+          os: ubuntu-latest
+        - target: aarch64-unknown-linux-gnu
+          os: ubuntu-latest
+        - target: x86_64-apple-darwin
+          os: macos-latest
+        - target: x86_64-pc-windows-msvc
+          os: windows-latest
+        - target: i586-unknown-linux-gnu
+          os: ubuntu-latest
+        - target: x86_64-linux-android
+          os: ubuntu-latest
+          disable_assert_instr: 1
+        - target: arm-linux-androideabi
+          os: ubuntu-latest
+          disable_assert_instr: 1
+        - target: mipsel-unknown-linux-musl
+          os: ubuntu-latest
+          norun: 1
+        - target: aarch64-linux-android
+          os: ubuntu-latest
+          disable_assert_instr: 1
+        - target: nvptx64-nvidia-cuda
+          os: ubuntu-latest
+        - target: thumbv6m-none-eabi
+          os: ubuntu-latest
+        - target: thumbv7m-none-eabi
+          os: ubuntu-latest
+        - target: thumbv7em-none-eabi
+          os: ubuntu-latest
+        - target: thumbv7em-none-eabihf
+          os: ubuntu-latest
+
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust (rustup)
+      run: rustup update nightly --no-self-update && rustup default nightly
+      if: matrix.os != 'macos-latest'
+    - name: Install Rust (macos)
+      run: |
+        curl https://sh.rustup.rs | sh -s -- -y --default-toolchain nightly
+        echo "##[add-path]$HOME/.cargo/bin"
+      if: matrix.os == 'macos-latest'
+    - run: rustup target add ${{ matrix.target }}
+      if: "!endsWith(matrix.target, 'emulated')"
+    - run: cargo generate-lockfile
+
+    # Configure some env vars based on matrix configuration
+    - run: echo "##[set-env name=NORUN]1"
+      if: matrix.norun != '' || startsWith(matrix.target, 'thumb') || matrix.target == 'nvptx64-nvidia-cuda'
+    - run: echo "##[set-env name=STDARCH_TEST_EVERYTHING]1"
+      if: matrix.test_everything != ''
+    - run: echo "##[set-env name=RUSTFLAGS]${{ matrix.rustflags }}"
+      if: matrix.rustflags != ''
+    - run: echo "##[set-env name=STDARCH_DISABLE_ASSERT_INSTR]1"
+      if: matrix.disable_assert_instr != ''
+    - run: echo "##[set-env name=NOSTD]1"
+      if: startsWith(matrix.target, 'thumb') || matrix.target == 'nvptx64-nvidia-cuda'
+
+    # Windows & OSX go straight to `run.sh` ...
+    - run: ./ci/run.sh
+      shell: bash
+      if: matrix.os != 'ubuntu-latest' || startsWith(matrix.target, 'thumb')
+      env:
+        TARGET: ${{ matrix.target }}
+
+    # ... while Linux goes to `run-docker.sh`
+    - run: ./ci/run-docker.sh ${{ matrix.target }}
+      shell: bash
+      if: "matrix.os == 'ubuntu-latest' && !startsWith(matrix.target, 'thumb')"
+      env:
+        TARGET: ${{ matrix.target }}
diff --git a/ci/azure-install-rust.yml b/ci/azure-install-rust.yml
deleted file mode 100644
index 65743d1..0000000
--- a/ci/azure-install-rust.yml
+++ /dev/null
@@ -1,76 +0,0 @@
-steps:
-  - bash: |
-      set -ex
-      toolchain=$TOOLCHAIN
-      if [ "$toolchain" = "" ]; then
-        toolchain=nightly
-      fi
-      if command -v rustup; then
-        rustup update $toolchain
-        rustup default $toolchain
-      else
-        curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $toolchain
-        echo "##vso[task.prependpath]$HOME/.cargo/bin"
-      fi
-    displayName: Install rust (unix)
-    condition: ne( variables['Agent.OS'], 'Windows_NT' )
-  - script: |
-      @echo on
-      if not defined TOOLCHAIN set TOOLCHAIN=nightly
-      rustup update --no-self-update %TOOLCHAIN%-%TARGET%
-      rustup default %TOOLCHAIN%-%TARGET%
-    displayName: Install rust (windows)
-    condition: eq( variables['Agent.OS'], 'Windows_NT' )
-  - script: |
-      set -ex
-      if [ -n "${TARGET}" ] && [ "${TARGET}" != "x86_64-unknown-linux-gnu-emulated" ]; then
-        rustup target add $TARGET
-      fi
-    condition: ne( variables['Agent.OS'], 'Windows_NT' )
-    displayName: Install target (unix)
-  - script: |
-      @echo on
-      if defined TARGET rustup target add %TARGET%
-    condition: eq( variables['Agent.OS'], 'Windows_NT' )
-    displayName: Install target (windows)
-  - script: |
-      @echo on
-      if "%ARCH%" == "i686" choco install mingw --x86 --force
-    condition: eq( variables['Agent.OS'], 'Windows_NT' )
-    displayName: Install MinGW32 (windows)
-  - bash: |
-      set -ex
-      gcc -print-search-dirs
-      find "C:\ProgramData\Chocolatey" -name "crt2*"
-      find "C:\ProgramData\Chocolatey" -name "dllcrt2*"
-      find "C:\ProgramData\Chocolatey" -name "libmsvcrt*"
-    condition: eq( variables['Agent.OS'], 'Windows_NT' )	
-    displayName: Find GCC libraries (windows)
-  - bash: |
-      set -ex
-      if [[ -n ${ARCH_BITS} ]]; then
-        for i in crt2.o dllcrt2.o libmsvcrt.a ; do
-          cp -f "/C/ProgramData/Chocolatey/lib/mingw/tools/install/mingw${ARCH_BITS}/${ARCH}-w64-mingw32/lib/$i" "`rustc --print sysroot`/lib/rustlib/${TARGET}/lib"
-        done
-      fi
-    condition: eq( variables['Agent.OS'], 'Windows_NT' )	
-    displayName: Fix MinGW (windows)
-  - bash: |
-        set -ex
-        rustc -Vv
-        cargo -V
-        rustup -Vv
-        rustup show
-        which rustc
-        which cargo
-        which rustup
-    displayName: Query rust and cargo versions
-  - script: |
-      @echo on
-      where gcc
-    condition: eq( variables['Agent.OS'], 'Windows_NT' )
-    displayName: Query gcc path
-  - bash: |
-      set -ex
-      cargo generate-lockfile
-    displayName: Generate lockfiles
diff --git a/ci/azure.yml b/ci/azure.yml
deleted file mode 100644
index 34f22a4..0000000
--- a/ci/azure.yml
+++ /dev/null
@@ -1,230 +0,0 @@
-variables:
-  - group: secrets
-resources:
-  repositories:
-    - repository: rustinfra
-      type: github
-      name: rust-lang/simpleinfra
-      endpoint: gnzlbg
-trigger: ["auto", "try"]
-pr: ["master"]
-
-jobs:
-  - job: DockerLinux0
-    dependsOn: StyleAndDocs
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: azure-install-rust.yml
-      - bash: |
-          if [ "${NO_DOCKER}" = "1" ]; then
-              ci/run.sh $TARGET
-          else
-              ci/run-docker.sh $TARGET
-          fi
-        displayName: Execute run-docker.sh
-    strategy:
-      matrix:
-        i686-unknown-linux-gnu:
-          TARGET: i686-unknown-linux-gnu
-        x86_64-unknown-linux-gnu:
-          TARGET: x86_64-unknown-linux-gnu
-        x86_64-unknown-linux-gnu-emulated:
-          TARGET: x86_64-unknown-linux-gnu-emulated
-          STDARCH_TEST_EVERYTHING: 1
-          RUSTFLAGS: --cfg stdarch_intel_sde
-        arm-unknown-linux-gnueabihf:
-          TARGET: arm-unknown-linux-gnueabihf
-        armv7-unknown-linux-gnueabihf:
-          TARGET: armv7-unknown-linux-gnueabihf
-          RUSTFLAGS: -C target-feature=+neon
-        aarch64-unknown-linux-gnu:
-          TARGET: aarch64-unknown-linux-gnu
-        mips-unknown-linux-gnu:
-          TARGET: mips-unknown-linux-gnu
-          NORUN: 1
-        mips64-unknown-linux-gnuabi64:
-          TARGET: mips64-unknown-linux-gnuabi64
-          NORUN: 1
-        mips64el-unknown-linux-gnuabi64:
-          TARGET: mips64el-unknown-linux-gnuabi64
-          NORUN: 1
-        powerpc64le-unknown-linux-gnu:
-          TARGET: powerpc64le-unknown-linux-gnu
-          STDARCH_DISABLE_ASSERT_INSTR: 1
-        s390x-unknown-linux-gnu:
-          TARGET: s390x-unknown-linux-gnu
-        wasm32-unknown-unknown:
-          TARGET: wasm32-unknown-unknown
-
-  - job: DockerLinux1
-    dependsOn: DockerLinux0
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: azure-install-rust.yml
-      - bash: |
-          if [ "${NO_DOCKER}" = "1" ]; then
-              ci/run.sh $TARGET
-          else
-              ci/run-docker.sh $TARGET
-          fi
-        displayName: Execute run-docker.sh
-    strategy:
-      matrix:
-        i586-unknown-linux-gnu:
-          TARGET: i586-unknown-linux-gnu
-        x86_64-linux-android:
-          TARGET: x86_64-linux-android
-          STDARCH_DISABLE_ASSERT_INSTR: 1
-        arm-linux-androideabi:
-          TARGET: arm-linux-androideabi
-          STDARCH_DISABLE_ASSERT_INSTR: 1
-        mipsel-unknown-linux-musl:
-          TARGET: mipsel-unknown-linux-musl
-          NORUN: 1
-        aarch64-linux-android:
-          TARGET: aarch64-linux-android
-          STDARCH_DISABLE_ASSERT_INSTR: 1
-        #powerpc-unknown-linux-gnu:
-        #  TARGET: powerpc-unknown-linux-gnu
-        #  STDARCH_DISABLE_ASSERT_INSTR: 1
-        #powerpc64-unknown-linux-gnu:
-        #  TARGET: powerpc64-unknown-linux-gnu
-        #  STDARCH_DISABLE_ASSERT_INSTR: 1
-        nvptx64-nvidia-cuda:
-          TARGET: nvptx64-nvidia-cuda
-          NORUN: 1
-          NOSTD: 1
-        thumbv6m-none-eabi:
-          TARGET: thumbv6m-none-eabi
-          NORUN: 1
-          NOSTD: 1
-          NO_DOCKER: 1
-        thumbv7m-none-eabi:
-          TARGET: thumbv7m-none-eabi
-          NORUN: 1
-          NOSTD: 1
-          NO_DOCKER: 1
-        thumbv7em-none-eabi:
-          TARGET: thumbv7em-none-eabi
-          NORUN: 1
-          NOSTD: 1
-          NO_DOCKER: 1
-        thumbv7em-none-eabihf:
-          TARGET: thumbv7em-none-eabihf
-          NORUN: 1
-          NOSTD: 1
-          NO_DOCKER: 1
-
-  - job: DockerOSX64
-    pool:
-      vmImage: macos-10.14
-    steps:
-      - template: azure-install-rust.yml
-      - bash: sh ./ci/run.sh $TARGET
-        displayName: Execute run.sh
-    strategy:
-      matrix:
-        x86_64-apple-darwin:
-          TARGET: x86_64-apple-darwin
-          NO_DOCKER: 1
-
-  - job: DockerOSX32
-    pool:
-      vmImage: macos-10.13
-    steps:
-      - template: azure-install-rust.yml
-      - bash: sh ./ci/run.sh $TARGET
-        displayName: Execute run.sh
-    strategy:
-      matrix:
-        i686-apple-darwin:
-          TARGET: i686-apple-darwin
-          NO_DOCKER: 1
-
-  - job: Windows
-    pool:
-      vmImage: vs2017-win2016
-    steps:
-      - template: azure-install-rust.yml
-      - bash: sh ./ci/run.sh $TARGET
-        displayName: Execute run.sh
-    strategy:
-      matrix:
-        x86_64-pc-windows-msvc:
-          TARGET: x86_64-pc-windows-msvc
-        # FIXME:
-        # Disassembly no implemented for the
-        # following targets:
-        # x86_64-pc-windows-gnu:
-        #  TARGET: x86_64-pc-windows-gnu
-        #i686-pc-windows-gnu:
-        #  TARGET: i686-pc-windows-gnu
-        #i686-pc-windows-msvc:
-        #  TARGET: i686-pc-windows-msvc
-
-  - job: StyleAndDocs
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: azure-install-rust.yml
-      - script: sh ci/style.sh
-        displayName: Check style
-      - script: sh ci/dox.sh
-        displayName: Generate documentation
-      - template: azure-configs/static-websites.yml@rustinfra
-        parameters:
-          deploy_dir: target/doc
-    variables:
-      CI: 1
-
-  - job: AutomaticVerification
-    dependsOn: StyleAndDocs
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: azure-install-rust.yml
-      - script: cargo test --manifest-path crates/stdarch-verify/Cargo.toml
-        displayName: Automatic verification
-
-  - job: EnvOverride
-    dependsOn: StyleAndDocs
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: azure-install-rust.yml
-      - script: RUST_STD_DETECT_UNSTABLE=avx cargo test --features=std_detect_env_override --manifest-path crates/std_detect/Cargo.toml env_override_no_avx
-        displayName: std_detect env override
-
-#  - job: GameBoyAdvance
-#    dependsOn: StyleAndDocs
-#    pool:
-#      vmImage: ubuntu-16.04
-#    steps:
-#      - template: azure-install-rust.yml
-#      - script: rustup component add rust-src
-#        displayName: Add rust-src
-#      - script: (test -x $HOME/.cargo/bin/cargo-xbuild || cargo install cargo-xbuild)
-#        displayName: Add cargo-xbuild
-      # Obtain the devkitPro tools, using `target/` as a temp directory. This
-      # is required because we need to use their linker. `lld` uses the `BLX`
-      # instruction, which was not available in thumb state code until ARMv5.
-#      - script: |
-#          mkdir -p target
-#          cd target
-#          wget https://github.com/devkitPro/pacman/releases/download/devkitpro-pacman-1.0.1/devkitpro-pacman.deb
-#          sudo dpkg -i devkitpro-pacman.deb
-#          sudo dkp-pacman -Sy
-#          sudo dkp-pacman -Syu
-#          sudo dkp-pacman -S -v --noconfirm gba-tools devkitARM
-#          export PATH="$PATH:/opt/devkitpro/devkitARM/bin"
-#          export PATH="$PATH:/opt/devkitpro/tools/bin"
-#          cd ..
-#          # Pull the target spec up into the current directory and then build
-#          mv ci/gba.json gba.json
-#          cargo xbuild -p core_arch --target gba.json
-#    variables:
-#      NORUN: 1
-#      NOSTD: 1
-#      NO_DOCKER: 1
diff --git a/ci/style.sh b/ci/style.sh
old mode 100644
new mode 100755